templatemessage.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. var issent = 0;
  3. var Controller = {
  4. index: function () {
  5. // 初始化表格参数配置
  6. Table.api.init({
  7. extend: {
  8. index_url: 'templatemessage/index',
  9. add_url: 'templatemessage/add',
  10. edit_url: 'templatemessage/edit',
  11. del_url: 'templatemessage/del',
  12. multi_url: 'templatemessage/multi',
  13. table: 'templatemessage',
  14. }
  15. });
  16. var table = $("#table");
  17. // 初始化表格
  18. table.bootstrapTable({
  19. url: $.fn.bootstrapTable.defaults.extend.index_url,
  20. pk: 'id',
  21. sortName: 'id',
  22. search: false,
  23. commonSearch: false,
  24. columns: [
  25. [
  26. {checkbox: true},
  27. {field: 'id', title: __('Id')},
  28. {field: 'title', title: __('Title')},
  29. {field: 'tpname', title: __('Tpname')},
  30. //{field: 'template_id', title: __('模板ID')},
  31. {field: 'sendtime', title: __('Sendtime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
  32. {field: 'send_num', title: __('发送人数'), operate:false},
  33. //{field: 'pv', title: 'PV', operate:false},
  34. {field: 'uv', title: 'UV(总/今日)', operate:false,formatter:function(value,row,index){
  35. return (value === null ? 0 : value) + "(" + row.day_uv + ")";
  36. }},
  37. // {field: 'recharge_orders', title: '充值成功订单数', operate:false},
  38. {field: 'recharge_money', title: '充值金额(总/今日)', operate:false,formatter:function(value,row,index){
  39. return (value === null ? 0 : value) + "(" + row.day_money + ")";
  40. }},
  41. /* {field: 'success_num', title: '接收人数', operate:false},
  42. {field: 'uv', title: '阅读人数(今日阅读)', operate:false},
  43. {field: 'recharge_money', title: '充值金额(今日充值)', operate:false},
  44. {field: 'avg', title: '单个uv价值', operate:false},*/
  45. {field: 'statue', title: __('Statue'),visible:false,operate:false},
  46. {field: 'statue_text', title: __('Statue'), operate:false},
  47. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  48. ]
  49. ]
  50. });
  51. // 为表格绑定事件
  52. Table.api.bindevent(table);
  53. },
  54. add: function () {
  55. Controller.api.bindevent();
  56. $('.s_time_box span:eq(1)').click();
  57. },
  58. edit: function () {
  59. // if(Config.bnotin.length>0){
  60. // $.each(Config.bnotin,function (index,value) {
  61. // if($('#f_url').val().indexOf(value)!=-1){
  62. // $('#f_url').val('');
  63. // }
  64. // });
  65. // }
  66. Controller.api.bindevent();
  67. },
  68. api: {
  69. getStatue: function (value, row, index) {
  70. if(value == 'normal'){
  71. if (row.sendtime < Date.parse(new Date())/1000){
  72. return '<span style="color:red">发送失败</span>';
  73. }else{
  74. return '未发送';
  75. }
  76. }else{
  77. return '<span style="color:green">已发送</span>';
  78. }
  79. },formatter: {
  80. total_benefit_channel:function(value,row,index) {
  81. if(row.sendtime - Config.nowtime < 600) {
  82. return '<a href="/admin/templatemessage/edit/ids/'+row.id+'" class="btn btn-xs btn-success btn-editone" title="预览" data-table-id="table" data-field-index="9" data-row-index="0" data-button-index="1"><i class="fa fa-eye"></i></a> ' +
  83. '<a href="javascript:;" class="btn btn-xs btn-danger btn-delone" title="" data-table-id="table" data-field-index="9" data-row-index="0" data-button-index="2"><i class="fa fa-trash"></i></a>';
  84. }else{
  85. return '<a href="/admin/templatemessage/edit/ids/'+row.id+'" class="btn btn-xs btn-success btn-editone" title="编辑" data-table-id="table" data-field-index="9" data-row-index="0" data-button-index="1"><i class="fa fa-pencil"></i></a>' +
  86. '<a href="javascript:;" class="btn btn-xs btn-danger btn-delone" title="" data-table-id="table" data-field-index="9" data-row-index="0" data-button-index="2"><i class="fa fa-trash"></i></a>';
  87. }
  88. }
  89. },
  90. bindevent: function () {
  91. /**
  92. * form表单验证
  93. */
  94. $("form[role=form]").data("validator-options", {
  95. ignore: ':hidden',
  96. beforeSubmit: function (form) {
  97. var user_json = $.parseJSON($('.img_txt_hidde_input_no').val())
  98. if (user_json.all==0 && !user_json.subscribe_time) {
  99. var sub_from = (new Moment($('input[name="row[sub_from]"]').val())).valueOf() / 1000
  100. var sub_to = (new Moment($('input[name="row[sub_to]"]').val())).valueOf() / 1000
  101. if(!sub_from && !sub_to){
  102. Toastr.error("起止时间不能为空");
  103. return false;
  104. }else{
  105. user_json.subscribe_range = sub_from +'-'+ sub_to;
  106. }
  107. }
  108. $('.img_txt_hidde_input_no').val(JSON.stringify(user_json));
  109. if(issent != 1){
  110. Toastr.error("请先成功测试粉丝后再保存模板消息");
  111. return false;
  112. }
  113. var sdatatime=$('#c-sendtime').val()+'';
  114. sdatatime = sdatatime.replace(/-/g,'/');
  115. sdatatime =new Date(sdatatime).getTime();
  116. if(sdatatime <= new Date().getTime()){
  117. Toastr.error("发送时间必须大于当前时间");
  118. return false;
  119. }
  120. }
  121. });
  122. Form.api.bindevent($("form[role=form]"),
  123. function (data) {
  124. Fast.api.close(data);
  125. },
  126. function (data) {
  127. console.log('error', data);
  128. }
  129. );
  130. $(document).on('click','.s_tag_li_list span',function(){
  131. if(canedit){
  132. return false;
  133. }
  134. var $this = $(this);
  135. $this.addClass('s_s_tag').siblings('span').removeClass('s_s_tag');
  136. var tagObj ={
  137. sex:$('#sex span.s_s_tag').data('sex'),
  138. mobile_system:$('#mobile_system span.s_s_tag').data('mobile_system'),
  139. tag:$('#ctag span.s_s_tag').data('cid'),
  140. consume:$('#consume span.s_s_tag').data('fee'),
  141. kandian: $('#kandian span.s_s_tag').data('kandian'),
  142. subscribe_time:$('#subscribe_time1 span.s_s_tag').data('fee'),
  143. all:"0"
  144. }
  145. if ($(this).parent().attr('id') == 'subscribe_time1') {
  146. if ($(this).data('fee')) {
  147. $('#cdstarttime').val('');
  148. $('#cdendtime').val('');
  149. $('#subscribe_time2').hide();
  150. } else {
  151. $('#subscribe_time2').show();
  152. }
  153. }
  154. var uconditon = JSON.stringify(tagObj);
  155. $('#usercondition').val(uconditon);
  156. });
  157. var ofansopen=true;
  158. //tag切换
  159. $(document).on('click','.s_tag_fans_num',function(){
  160. var $this = $(this);
  161. //防止重复点击
  162. if(!ofansopen){
  163. return false;
  164. }
  165. ofansopen = false;
  166. $('.s_tag_footer').addClass('s_tag_fans_show');
  167. var tagObj ={
  168. sex:$('#sex span.s_s_tag').data('sex'),
  169. mobile_system:$('#mobile_system span.s_s_tag').data('mobile_system'),
  170. tag:$('#ctag span.s_s_tag').data('cid'),
  171. consume:$('#consume span.s_s_tag').data('fee'),
  172. kandian: $('#kandian span.s_s_tag').data('kandian'),
  173. subscribe_time:$('#subscribe_time1 span.s_s_tag').data('fee'),
  174. all:"0"
  175. }
  176. var uconditon = JSON.stringify(tagObj);
  177. $('#usercondition').val(uconditon);
  178. // console.log(tagObj);
  179. $.ajax({
  180. type:'post',
  181. data:tagObj,
  182. //dataType:'json',
  183. url:'/admin/custom/ajaxcustom',
  184. success:function(data){
  185. //console.log(data);
  186. $('#mustbe').html('约'+data.ids+'人');
  187. ofansopen = true;
  188. $('.s_tag_footer').removeClass('s_tag_fans_show');
  189. },
  190. error:function(err){
  191. ofansopen = true;
  192. $('.s_tag_footer').removeClass('s_tag_fans_show');
  193. }
  194. });
  195. });
  196. //获取模板json
  197. var ontmwjson = '';
  198. function fajaxtmp(str){
  199. if(!str){
  200. str = '';
  201. }
  202. var num = 0;
  203. var nowmsg = false;
  204. $.ajax({
  205. type:'get',
  206. //dataType:'json',
  207. url:'/admin/templatemessage/ajaxtmp' + str,
  208. success:function(data){
  209. //console.log(data);
  210. if(typeof data == 'string'){
  211. data = JSON.parse(data);
  212. }
  213. if(data.error == -1){
  214. $('.ntmw_head_select ul').html("");
  215. $('.ntmw_head_select strong').html("");
  216. layer.msg(data.msg);
  217. return false;
  218. }
  219. ontmwjson = data.data;
  220. //$('#select_ntmw').val(JSON.stringify(data.data));
  221. //模板列表
  222. if($('#select_msg_id').val().length>0){
  223. var sMsgId =$.trim($('#select_ntmw_id').val());
  224. for(var k=0; k<ontmwjson.length; k++){
  225. if(ontmwjson[k].id == sMsgId){
  226. num = k;
  227. break;
  228. }
  229. }
  230. var smsghtml = $('#select_ntmw').val();
  231. ontmwjson[num]['content'] = JSON.parse($.trim(smsghtml));
  232. nowmsg = true;
  233. }
  234. var $li = '';
  235. for(var i=0; i<ontmwjson.length; i++){
  236. $li += '<li>' + ontmwjson[i].title+' -- '+ ontmwjson[i].template_id + '</li>';
  237. }
  238. $('.ntmw_head_select ul').html($li);
  239. $('.ntmw_head_select ul li:eq('+ num +')').addClass('hover');
  240. //插入html数据
  241. selectTemplate(num,nowmsg);
  242. if(str == '?w=1'){
  243. Toastr.success('刷新模板列表成功');
  244. }
  245. },
  246. error:function(err){
  247. }
  248. });
  249. }
  250. fajaxtmp();
  251. //刷新模板列表
  252. $('.ntmw_but').click(function(){
  253. fajaxtmp('?w=1');
  254. });
  255. //选择模板
  256. function selectTemplate(num,bul){
  257. var oContent = ontmwjson[num]['content'];
  258. var sLi='';
  259. $('.ntmw_head_select strong,.ntmw_main_box h3').text(ontmwjson[num].title+' -- '+ontmwjson[num].template_id);
  260. $('#select_ntmw_id').val(ontmwjson[num].id);
  261. $('#select_template_id').val(ontmwjson[num].template_id);
  262. $('#select_tpname').val(ontmwjson[num].title);
  263. $('#select_ntmw').val(JSON.stringify(oContent));
  264. //console.log(ontmwjson[num].id);
  265. //console.log(oContent);
  266. for(var i=0; i<oContent.length; i++){
  267. sLi += '<li>';
  268. for(var j=0; j<oContent[i].length; j++){
  269. if(oContent[i][j].color!=''){
  270. //console.log(oContent[i][j].color);
  271. //console.log(oContent[i][j].fieldname);
  272. if(!bul){
  273. oContent[i][j].fieldname = '';
  274. }
  275. sLi += '<i class="fa fa-edit ntmw_li_edit"></i><span style="color: '+ oContent[i][j].color +';">'+ oContent[i][j].fieldname +'</span>';
  276. }else{
  277. sLi += '<span style="color: #000000;">'+ oContent[i][j].fieldname +'</span>';
  278. }
  279. }
  280. sLi += '</li>';
  281. }
  282. $('.ntmw_main_box ul').html(sLi);
  283. }
  284. //初始化 标签
  285. $.ajax({
  286. type:'get',
  287. url:'/admin/custom/ajaxcategory',
  288. cache:false,
  289. async:false,
  290. success:function(res){
  291. data = res.data;
  292. var htmlstr = '';
  293. for(var i=0;i<data.length;i++){
  294. htmlstr+='<span data-cid="'+data[i].id+'" >'+data[i].name+'</span>';
  295. }
  296. $('#ctag').append(htmlstr);
  297. $('#mustbe').html('约'+res.ids+'人');
  298. if ($('#usercondition').val().length > 0){
  299. $tagval = JSON.parse($('#usercondition').val());
  300. $("#sex span[data-sex='"+$tagval.sex+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  301. $("#mobile_system span[data-mobile_system='"+$tagval.mobile_system+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  302. $("#ctag span[data-cid='"+$tagval.tag+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  303. $("#consume span[data-fee='"+$tagval.consume+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  304. $("#kandian span[data-kandian='"+$tagval.kandian+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  305. // $("#subTime span[data-week='"+$tagval.subscribe_time+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  306. if ($tagval.subscribe_time) {
  307. $("#subscribe_time1 span[data-fee='" + $tagval.subscribe_time + "']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  308. $('#subscribe_time2').hide();
  309. } else {
  310. $("#subscribe_time1 span").last().addClass('s_s_tag').siblings().removeClass('s_s_tag');
  311. }
  312. }else{
  313. var tagObj1 ={
  314. sex:-1,
  315. mobile_system:0,
  316. tag:-1,
  317. consume:-1,
  318. kandian: -1,
  319. subscribe_time:-1,
  320. all:"0"
  321. };
  322. var ucon1 = JSON.stringify(tagObj1);
  323. $('#usercondition').val(ucon1);
  324. }
  325. },
  326. error:function(err){
  327. }
  328. });
  329. /**
  330. * 资源类型管理
  331. */
  332. $(document).on('click', "input[name='row[type]']", function () {
  333. var type = $(this).val();
  334. if (type=='all'){
  335. var tagObj = {
  336. all:"1"
  337. }
  338. }else{
  339. var tagObj ={
  340. sex:-1,
  341. mobile_system:0,
  342. tag:-1,
  343. consume:-1,
  344. kandian: -1,
  345. subscribe_time:-1,
  346. all:"0"
  347. }
  348. }
  349. var ucon = JSON.stringify(tagObj);
  350. $('#usercondition').val(ucon);
  351. $('.group-tag-type').addClass('hide');
  352. $('.group-tag-type input').attr('disabled');
  353. $('#group-tag-type-' + type).removeClass('hide');
  354. $('#group-tag-type-' + type+' input').removeAttr('disabled');
  355. });
  356. if ($('#usercondition').val().length > 0) {
  357. $tagval = JSON.parse($('#usercondition').val());
  358. if ($tagval.all == 1){ //选择所有用户
  359. $('#type-all').attr('checked',true);
  360. var type = 'all';
  361. $('.group-tag-type').addClass('hide');
  362. $('.group-tag-type input').attr('disabled');
  363. $('#group-tag-type-' + type).removeClass('hide');
  364. $('#group-tag-type-' + type+' input').removeAttr('disabled');
  365. }
  366. }
  367. //测试发送
  368. var flag = 0;
  369. $('.test_fans_but').click(function(){
  370. if(flag == 1){
  371. return false;
  372. }
  373. flag = 1;
  374. var $imgTxtMain = $('.img_txt_main');
  375. var reg = /^(http[s]?|ftp):\/\/[^\/\.]+?\..+\w/;
  376. //标题
  377. if($.trim($('#title').val()).length == 0){
  378. Toastr.error("标题不能为空");
  379. flag = 0;
  380. return false;
  381. }
  382. //微信模板内容
  383. if($.trim($('#select_ntmw').val()).length == 0){
  384. Toastr.error("未填写模板内容");
  385. flag = 0;
  386. return false;
  387. }
  388. //网址
  389. if($.trim($('#f_url').val()).length == 0){
  390. Toastr.error("跳转链接不能为空");
  391. flag = 0;
  392. return false;
  393. }
  394. if($.trim($('#userId').val()) == ''){
  395. Toastr.error("请填写测试粉丝ID");
  396. flag = 0;
  397. return false;
  398. }
  399. if($.trim($('#userId').val()) == ''){
  400. Toastr.error("请填写测试粉丝ID");
  401. flag = 0;
  402. return false;
  403. }
  404. var sentData = {
  405. title:$('#title').val(),
  406. admin_id:$('#admin_id').val(),
  407. user_id:$('#userId').val(),
  408. message_html:$('#select_ntmw').val(),
  409. url:$('#f_url').val(),
  410. template_id:$('#select_template_id').val(),
  411. tpid:$('#select_ntmw_id').val()
  412. };
  413. console.log(sentData);
  414. $.ajax({
  415. type:'post',
  416. url:'/admin/templatemessage/sent',
  417. data:sentData,
  418. dataType:'json',
  419. cache:false,
  420. async:false,
  421. success:function(data){
  422. console.log(data);
  423. flag = 0;
  424. if(data.errcode == 0){
  425. issent = 1;
  426. Toastr.success('已送达');
  427. }else{
  428. Toastr.error('错误码:'+data.errcode+'错误信息:'+data.errmsg);
  429. }
  430. },
  431. error:function(err){
  432. flag = 0;
  433. }
  434. })
  435. });
  436. //发送消息时间
  437. $(document).on('click','.s_time_box span',function(){
  438. var $this = $(this);
  439. var nval = parseInt($this.attr('stime'));
  440. var ntime = Date.parse(new Date());
  441. var nt = ntime + nval;
  442. $('#c-sendtime').val(GetRTime(nt));
  443. });
  444. function GetRTime(time){
  445. var stime;
  446. time = new Date(time);
  447. var year = time.getYear() + 1900;
  448. var month = time.getMonth()+1;
  449. var day = time.getDate();
  450. var hours = time.getHours();
  451. var minutes = time.getMinutes();
  452. var seconds = time.getSeconds();
  453. stime = year + '-' +
  454. (month < 10 ? '0'+month : month) + '-' +
  455. (day < 10 ? '0'+day : day) + ' ' +
  456. (hours < 10 ? '0'+hours : hours) + ':' +
  457. (minutes < 10 ? '0'+minutes : minutes) + ':' +
  458. (seconds < 10 ? '0'+seconds : seconds);
  459. return stime;
  460. }
  461. var ontmwspan = '';
  462. //选择模板
  463. $(document).on('click','.ntmw_li_edit',function(){
  464. var oThis=$(this);
  465. var oNextSpan = oThis.next('span');
  466. var sColor = oNextSpan.css('color');
  467. ontmwspan = oNextSpan;
  468. var shtml= '<div class="ntmw_pop_box">\
  469. <div class="ntmw_edit_textarea_box"><div class="ntmw_edit_textarea" contenteditable="true" style="color:#000000;">' + ontmwspan.html() + '</div></div>\
  470. <div class="ntmw_edit_color_box"><strong>字体颜色:</strong><span style="background-color:#000000"></span><span style="background-color:#ff0000"></span><span style="background-color:#ff9400"></span><span style="background-color:#0099ff"></span><span style="background-color:#ff3399"></span><span style="background-color:#999999"></span></div>\
  471. <div class="ntmw_edit_word_box"><span>占位符<i class="fa fa-question-circle" title="使用说明"></i>:</span><strong contenteditable="false" data-key="$user_nickname">用户昵称</strong><strong contenteditable="false" data-key="$user_id">用户id</strong><strong contenteditable="false" data-key="$user_vip_endtime">用户vip到期时间</strong><strong contenteditable="false" data-key="$wx_nickname">微信公众号名称</strong></div>\
  472. </div>';
  473. layer.open({
  474. type: 1,
  475. title:'',
  476. skin: 'layui-layer-rim', //加上边框
  477. btn: ['保存'],
  478. content: shtml,
  479. yes: function(index, layero){
  480. var $nuldiv = $('<div></div>');
  481. var sHtmlReg=/<[^<>]+>/g;
  482. var sNtmwEditTextarea =$('.ntmw_edit_textarea').html();
  483. $nuldiv.append(sNtmwEditTextarea);
  484. $nuldiv.find('strong[contenteditable="false"]').remove();
  485. sNtmwEditTextarea =$nuldiv.html();
  486. if(sHtmlReg.test(sNtmwEditTextarea)){
  487. Toastr.error("您输入的内容包含特殊字符,请重新输入");
  488. return false;
  489. }
  490. layer.close(index);
  491. var sTextareaColor = $('.ntmw_edit_textarea').css('color');
  492. var sTextareaContent = $.trim($('.ntmw_edit_textarea').html());
  493. oNextSpan.css('color',sTextareaColor).html(sTextareaContent);
  494. var $li = $('.ntmw_main_box ul li');
  495. var sVal =JSON.parse($.trim($('#select_ntmw').val()));
  496. for(var i=0; i<$li.length; i++){
  497. var aLi = sVal[i];
  498. $lispan = $li.eq(i).find('span');
  499. for(var j=0; j<$lispan.length; j++){
  500. var $prev = $lispan.eq(j).prev();
  501. if($prev.is('i')){
  502. aLi[j].color = colorRGB2Hex($lispan.eq(j).css('color'));
  503. }
  504. aLi[j].fieldname = $lispan.eq(j).html();
  505. }
  506. }
  507. $('#select_ntmw').val(JSON.stringify(sVal));
  508. }
  509. });
  510. //默认字体颜色
  511. var $span = $('.ntmw_edit_color_box span');
  512. for(var i=0; i<$span.length; i++){
  513. var sNowSpanColor = $span.eq(i).css('backgroundColor');
  514. if(sColor == sNowSpanColor){
  515. $span.eq(i).addClass('active').siblings('span').removeClass('active');
  516. break;
  517. }
  518. if(sColor == $span.eq(0).css('backgroundColor')){
  519. $span.eq(0).addClass('active').siblings('span').removeClass('active');
  520. break;
  521. }
  522. }
  523. $('.ntmw_edit_textarea').css('color',sColor);
  524. $('.ntmw_edit_textarea').append('\r');
  525. $('.ntmw_edit_textarea').focus();
  526. keepLastIndex($('.ntmw_edit_textarea').get(0));
  527. });
  528. //rgb转换未16进制
  529. function colorRGB2Hex(color) {
  530. if(!/#/.test(color)){
  531. var rgb = color.split(',');
  532. var r = parseInt(rgb[0].split('(')[1]);
  533. var g = parseInt(rgb[1]);
  534. var b = parseInt(rgb[2].split(')')[0]);
  535. var hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
  536. return hex;
  537. }
  538. return color;
  539. }
  540. //修改字体颜色
  541. $(document).on('click','.ntmw_edit_color_box span',function(){
  542. var $this = $(this);
  543. var sColor = $this.css('backgroundColor');
  544. $this.addClass('active').siblings('span').removeClass('active');
  545. $('.ntmw_edit_textarea').css('color',sColor);
  546. });
  547. //添加占位符
  548. var lastEditRange;
  549. $(document).on('click','.ntmw_edit_word_box strong',function(){
  550. var $this = $(this);
  551. var sHtml = $this.prop("outerHTML");
  552. var sTATxt = $.trim($('.ntmw_edit_textarea').html()) + '&nbsp;' + sHtml + '&nbsp;\r';
  553. var txtFocus = $('.ntmw_edit_textarea').get(0);
  554. var sTATxtLen = sTATxt.length - 1;
  555. $('.ntmw_edit_textarea').html(sTATxt);
  556. $this.blur();
  557. keepLastIndex(txtFocus);
  558. });
  559. //将光标放到最后面
  560. function keepLastIndex(obj) {
  561. if(window.getSelection) {//ie11 10 9 ff safari
  562. obj.focus(); //解决ff不获取焦点无法定位问题
  563. var range = window.getSelection();//创建range
  564. range.selectAllChildren(obj);//range 选择obj下所有子内容
  565. range.collapseToEnd();//光标移至最后
  566. }else if(document.selection) {//ie10 9 8 7 6 5
  567. var range = document.selection.createRange();//创建选择对象
  568. //var range = document.body.createTextRange();
  569. range.moveToElementText(obj);//range定位到obj
  570. range.collapse(false);//光标移至最后
  571. range.select();
  572. }
  573. }
  574. //选择模板下拉切换
  575. $(document).on('click','.ntmw_head_select li',function(){
  576. var $this=$(this);
  577. var sTxt = $this.text();
  578. var nIndex = $this.index();
  579. $this.addClass('hover').siblings('li').removeClass('hover');
  580. $('.ntmw_head_select strong').data('value',nIndex);
  581. $('.ntmw_head_select strong').text(sTxt);
  582. selectTemplate(nIndex);
  583. });
  584. $(document).on('click','.ntmw_edit_word_box i',function(){
  585. layer.open({
  586. type: 1,
  587. title:'',
  588. skin: 'layui-layer-rim', //加上边框
  589. btn: ['知道了'],
  590. content: '<div class="ntmw_question_box">\
  591. <div class="ntmw_question_li">模板:亲爱的<span>用户昵称</span>, 您的年费到期时间为<span>用户vip到期时间</span></div>\
  592. <div class="ntmw_question_li">效果:亲爱的宁静致远,您的年费到期时间为2018-12-29 17:28</span></div>\
  593. </div>',
  594. yes: function(index, layero){
  595. layer.close(index);
  596. }
  597. });
  598. })
  599. //修改url
  600. $(document).on('click','.img_txt_edit_url',function(){
  601. var $this=$(this);
  602. Fast.api.open('referral/referral/select?one=1', '选择', {
  603. callback: function (data) {
  604. var data = data[0];
  605. // console.log('展示title回调', data);
  606. $this.parent().siblings('input').val(data.source_url);
  607. }
  608. });
  609. });
  610. //修改book
  611. $(document).on('click','.img_txt_edit_book',function(){
  612. var $this=$(this);
  613. Fast.api.open('book.book/select?one=1', '选择', {
  614. callback: function (data) {
  615. var data = data[0];
  616. $this.parent().siblings('input').val(data.current_book_url);
  617. }
  618. });
  619. });
  620. }
  621. }
  622. };
  623. return Controller;
  624. });