custom.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. //编辑按钮
  3. $(document).on('click','.btn-editone',function(){
  4. var url = $(this).data('tourl');
  5. var sendtime = Number($(this).data('sendtime'));
  6. if((sendtime - Date.parse(new Date())/1000)<300){
  7. $(this).hide();
  8. return false;
  9. }else{
  10. Fast.api.open(url, __('Edit'), $(this).data() || {});
  11. }
  12. });
  13. var Controller = {
  14. index: function () {
  15. // 初始化表格参数配置
  16. Table.api.init({
  17. extend: {
  18. index_url: 'custom/index',
  19. add_url: 'custom/add',
  20. edit_url: 'custom/edit',
  21. del_url: 'custom/del',
  22. multi_url: 'custom/multi',
  23. table: 'custom',
  24. },
  25. search:false,
  26. });
  27. var table = $("#table");
  28. // 初始化表格
  29. table.bootstrapTable({
  30. url: $.fn.bootstrapTable.defaults.extend.index_url,
  31. pk: 'id',
  32. sortName: 'id',
  33. columns: [
  34. [
  35. {checkbox: true},
  36. // {field: 'id', title: __('Id')},
  37. {field: 'title', title: __('标题'),operate: 'LIKE %...%'},
  38. {field: 'sendtime', title: __('Sendtime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
  39. {field: 'statue', title: __('Statue'),visible:false,operate:false},
  40. {field: 'statue_text', title: __('Statue'), operate:false},
  41. {field: 'send_num', title: '发送人数', operate:false},
  42. {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
  43. // {field: 'updatetime', title: __('Updatetime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
  44. // {field: 'edit', title: __('编辑'), table: table, events: Table.api.events.operate,formatter: Controller.api.editCustom},
  45. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  46. ]
  47. ]
  48. });
  49. // 为表格绑定事件
  50. Table.api.bindevent(table);
  51. },
  52. add: function () {
  53. Controller.api.bindevent();
  54. $('.s_time_box span:eq(1)').click();
  55. },
  56. edit: function () {
  57. Controller.api.bindevent();
  58. },
  59. api: {
  60. getStatue: function (value, row, index) {
  61. if(value == 'normal'){
  62. if (row.sendtime < Date.parse(new Date())/1000){
  63. return '<span style="color:red">发送失败</span>';
  64. }else{
  65. return '未发送';
  66. }
  67. }else{
  68. return '<span style="color:green">已发送</span>';
  69. }
  70. },
  71. editCustom: function (value, row, index) {
  72. if(row.statue == 'normal' && (Number(row.sendtime) - Date.parse(new Date())/1000)>300){
  73. //5分钟外的
  74. return '<a href="javascript:;" class="btn btn-xs btn-success btn-editone" data-sendtime="'+row.sendtime+'" data-tourl="/admin/custom/edit/ids/'+row.id+'" data-table-id="table" data-field-index="8" data-row-index="2" data-button-index="1"><i class="fa fa-pencil"></i></a>';
  75. }
  76. },
  77. bindevent: function () {
  78. Form.api.bindevent($("form[role=form]"));
  79. //资源管理
  80. var ore={
  81. arrma:[
  82. {
  83. 'title':'',
  84. 'image':'',
  85. 'url':'http://'
  86. }
  87. ],
  88. imglis:[],
  89. titlist:[],
  90. sli:'<div class="img_txt_li img_txt_main">\
  91. <div class="img_txt_li_img img_txt_edit_img"><img src="sli_img" /></div>\
  92. <div class="img_txt_li_txt">\
  93. <i class="fa fa-pencil img_txt_edit_tit"></i>\
  94. <div class="img_txt_li_h3"><input type="text" value="sli_value" /></div>\
  95. <i class="fa fa-chain img_txt_edit_url"></i>\
  96. <i class="fa fa-book img_txt_edit_book"></i>\
  97. <div class="img_txt_li_url"><input type="text" value="click_url" /></div>\
  98. </div>\
  99. <div class="fa img_txt_remvoe"></div>\
  100. </div>'
  101. };
  102. /**
  103. * form表单验证
  104. */
  105. $("form[role=form]").data("validator-options", {
  106. ignore: ':hidden',
  107. beforeSubmit: function (form) {
  108. var $imgTxtMain = $('.img_txt_main');
  109. var reg = /^(http[s]?|ftp):\/\/[^\/\.]+?\..+\w/;
  110. var sList = '';
  111. ore.arrma = [];
  112. //标题
  113. if($.trim($('#title').val()).length == 0){
  114. Toastr.error("标题不能为空");
  115. return false;
  116. }
  117. for(var i=0; i<$imgTxtMain.length; i++){
  118. ore.arrma.push({});
  119. //标题
  120. if($('.img_txt_main:eq('+ i +') input:eq(0)').val().length > 0){
  121. ore.arrma[i].title = $('.img_txt_main:eq('+ i +') input:eq(0)').val();
  122. }else{
  123. Toastr.error("图文标题不能为空");
  124. return false;
  125. }
  126. //链接
  127. if(reg.test($('.img_txt_main:eq('+ i +') input:eq(1)').val())){
  128. ore.arrma[i].url = $('.img_txt_main:eq('+ i +') input:eq(1)').val();
  129. }else{
  130. Toastr.error("请填写图文正确的跳转链接");
  131. return false;
  132. }
  133. //图片
  134. if($('.img_txt_main:eq('+ i +') img').attr('src').length > 0){
  135. ore.arrma[i].image = $('.img_txt_main:eq('+ i +') img').attr('src');
  136. }else{
  137. Toastr.error("请填写图文正确的跳转链接");
  138. return false;
  139. }
  140. }
  141. //发送时间必须大于当前时间
  142. var sdatatime=$('#c-sendtime').val()+'';
  143. sdatatime = sdatatime.replace(/-/g,'/');
  144. sdatatime =new Date(sdatatime).getTime();
  145. if(sdatatime <= new Date().getTime()){
  146. Toastr.error("发送时间必须大于当前时间");
  147. return false;
  148. }
  149. sList = JSON.stringify(ore.arrma);
  150. $('.img_txt_hidde_input').val(sList);
  151. // console.log('验证');
  152. // return false;
  153. }
  154. });
  155. Form.api.bindevent($("form[role=form]"),
  156. function (data) {
  157. Fast.api.close(data);
  158. },
  159. function (data) {
  160. console.log('error', data);
  161. }
  162. );
  163. /**
  164. * 资源类型管理
  165. */
  166. $(document).on('click', "input[name='row[type]']", function () {
  167. var type = $(this).val();
  168. if (type=='all'){
  169. var tagObj = {
  170. all:"1"
  171. }
  172. }else{
  173. var tagObj ={
  174. sex:-1,
  175. tag:-1,
  176. consume:-1,
  177. kandian: -1,
  178. subscribe_time:-1,
  179. all:"0"
  180. }
  181. }
  182. var ucon = JSON.stringify(tagObj);
  183. $('#usercondition').val(ucon);
  184. $('.group-tag-type').addClass('hide');
  185. $('.group-tag-type input').attr('disabled');
  186. $('#group-tag-type-' + type).removeClass('hide');
  187. $('#group-tag-type-' + type+' input').removeAttr('disabled');
  188. });
  189. /**
  190. * 插入链接
  191. */
  192. $(document).on('click', ".btn-insertlink", function () {
  193. var textarea = $("textarea[name='row[content]']");
  194. var cursorPos = textarea.prop('selectionStart');
  195. var v = textarea.val();
  196. var textBefore = v.substring(0, cursorPos);
  197. var textAfter = v.substring(cursorPos, v.length);
  198. Layer.prompt({title: '请输入显示的文字', formType: 3}, function (text, index) {
  199. Layer.close(index);
  200. Layer.prompt({title: '请输入跳转的链接URL(包含http/https)', formType: 3}, function (link, index) {
  201. text = text == '' ? link : text;
  202. textarea.val(textBefore + '<a href="' + link + '">' + text + '</a>' + textAfter);
  203. Layer.close(index);
  204. });
  205. });
  206. });
  207. if ($('#usercondition').val().length > 0) {
  208. $tagval = JSON.parse($('#usercondition').val());
  209. if ($tagval.all == 1){ //选择所有用户
  210. $('#type-all').attr('checked',true);
  211. var type = 'all';
  212. $('.group-tag-type').addClass('hide');
  213. $('.group-tag-type input').attr('disabled');
  214. $('#group-tag-type-' + type).removeClass('hide');
  215. $('#group-tag-type-' + type+' input').removeAttr('disabled');
  216. }
  217. }
  218. $.ajax({
  219. type:'get',
  220. url:'/admin/custom/ajaxcategory',
  221. cache:false,
  222. async:false,
  223. success:function(res){
  224. data = res.data;
  225. var htmlstr = '';
  226. for(var i=0;i<data.length;i++){
  227. htmlstr+='<span data-cid="'+data[i].id+'" >'+data[i].name+'</span>';
  228. }
  229. $('#ctag').append(htmlstr);
  230. $('#mustbe').html('约'+res.ids+'人');
  231. if ($('#usercondition').val().length > 0){
  232. $tagval = JSON.parse($('#usercondition').val());
  233. $("#sex span[data-sex='"+$tagval.sex+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  234. $("#ctag span[data-cid='"+$tagval.tag+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  235. $("#consume span[data-fee='"+$tagval.consume+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  236. $("#kandian span[data-kandian='"+$tagval.kandian+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  237. $("#subTime span[data-week='"+$tagval.subscribe_time+"']").addClass('s_s_tag').siblings().removeClass('s_s_tag');
  238. console.log($tagval);
  239. }else{
  240. var tagObj1 ={
  241. sex:-1,
  242. tag:-1,
  243. consume:-1,
  244. kandian: -1,
  245. subscribe_time:-1,
  246. all:"0"
  247. };
  248. var ucon1 = JSON.stringify(tagObj1);
  249. $('#usercondition').val(ucon1);
  250. }
  251. },
  252. error:function(err){
  253. }
  254. });
  255. $.ajax({
  256. type:'get',
  257. url:'/admin/manage/cover/ajax?sort=id&order=desc&offset=0&limit=10&filter={"status":"normal"}',
  258. cache:false,
  259. async:false,
  260. success:function(data){
  261. // console.log(data)
  262. ore.imglis = data.rows;
  263. },
  264. error:function(err){
  265. }
  266. });
  267. $.ajax({
  268. type:'get',
  269. url:'/admin/manage/title/ajax?sort=id&order=desc&offset=0&limit=10&filter={"status":"normal"}',
  270. cache:false,
  271. async:false,
  272. success:function(data){
  273. // console.log(data)
  274. ore.titlist = data.rows;
  275. ore.arrma[0]['image'] = ore.imglis[parseInt(Math.random()*ore.imglis.length)]['image'];
  276. ore.arrma[0]['title'] = ore.titlist[parseInt(Math.random()*ore.titlist.length)]['title'];
  277. console.log($('.img_txt_hidde_input').val());
  278. if($('.img_txt_hidde_input').val().length > 0){
  279. ore.arrma = JSON.parse($('.img_txt_hidde_input').val());
  280. for(var i=0; i<ore.arrma.length; i++){
  281. if(i==0){
  282. $('.img_txt_list').html('<div class="img_txt_one img_txt_main">\
  283. <div class="img_txt_one_tit">\
  284. <i class="fa fa-pencil img_txt_edit_tit"></i>\
  285. <div class="img_txt_one_h3"><input type="text" value="' + ore.arrma[0]['title'] + '" /></div>\
  286. <i class="fa fa-chain img_txt_edit_url"></i>\
  287. <i class="fa fa-book img_txt_edit_book"></i>\
  288. <div class="img_txt_one_url"><input type="text" value="' + ore.arrma[0]['url'] + '" /></div>\
  289. </div>\
  290. <div class="img_txt_one_img img_txt_edit_img"><img src="' + ore.arrma[0]['image'] + '" /></div>\
  291. </div>');
  292. }else{
  293. var sLiImg=ore.sli.replace(/sli_img/g,ore.arrma[i]['image']);
  294. sLiImg=sLiImg.replace(/sli_value/g,ore.arrma[i]['title']);
  295. sLiImg=sLiImg.replace(/click_url/g,ore.arrma[i]['url']);
  296. $('.img_txt_list').append(sLiImg);
  297. }
  298. }
  299. }else{
  300. $('.img_txt_list').html('<div class="img_txt_one img_txt_main">\
  301. <div class="img_txt_one_tit">\
  302. <i class="fa fa-pencil img_txt_edit_tit"></i>\
  303. <div class="img_txt_one_h3"><input type="text" value="' + ore.arrma[0]['title'] + '" /></div>\
  304. <i class="fa fa-chain img_txt_edit_url"></i>\
  305. <i class="fa fa-book img_txt_edit_book"></i>\
  306. <div class="img_txt_one_url"><input type="text" value="' + ore.arrma[0]['url'] + '" /></div>\
  307. </div>\
  308. <div class="img_txt_one_img img_txt_edit_img"><img src="' + ore.arrma[0]['image'] + '" /></div>\
  309. </div>');
  310. }
  311. },
  312. error:function(err){
  313. }
  314. });
  315. var flag = 0;
  316. //测试发送
  317. $('.test_fans_but').click(function(){
  318. if(flag == 1){
  319. return false;
  320. }
  321. flag = 1;
  322. var $imgTxtMain = $('.img_txt_main');
  323. var reg = /^(http[s]?|ftp):\/\/[^\/\.]+?\..+\w/;
  324. var sList = '';
  325. ore.arrma = [];
  326. //标题
  327. if($.trim($('#title').val()).length == 0){
  328. Toastr.error("标题不能为空");
  329. flag = 0;
  330. return false;
  331. }
  332. for(var i=0; i<$imgTxtMain.length; i++){
  333. ore.arrma.push({});
  334. //标题
  335. if($('.img_txt_main:eq('+ i +') input:eq(0)').val().length > 0){
  336. ore.arrma[i].title = $('.img_txt_main:eq('+ i +') input:eq(0)').val();
  337. }else{
  338. Toastr.error("图文标题不能为空");
  339. return false;
  340. }
  341. //链接
  342. if(reg.test($('.img_txt_main:eq('+ i +') input:eq(1)').val())){
  343. ore.arrma[i].url = $('.img_txt_main:eq('+ i +') input:eq(1)').val();
  344. }else{
  345. Toastr.error("请填写图文正确的跳转链接");
  346. return false;
  347. }
  348. //图片
  349. if($('.img_txt_main:eq('+ i +') img').attr('src').length > 0){
  350. ore.arrma[i].image = $('.img_txt_main:eq('+ i +') img').attr('src');
  351. }else{
  352. Toastr.error("请填写图文正确的跳转链接");
  353. return false;
  354. }
  355. }
  356. sList = JSON.stringify(ore.arrma);
  357. if($.trim($('#userId').val()) == ''){
  358. Toastr.error("请填写测试粉丝ID");
  359. flag = 0;
  360. return false;
  361. }
  362. var sentData = {
  363. admin_id:$('#admin_id').val(),
  364. user_id:$('#userId').val(),
  365. cdata:sList
  366. };
  367. $.ajax({
  368. type:'post',
  369. url:'/admin/custom/sent',
  370. data:sentData,
  371. dataType:'json',
  372. cache:false,
  373. async:false,
  374. success:function(data){
  375. flag = 0;
  376. if (data.error == 1){
  377. Toastr.error(data.msg);
  378. };
  379. if(data.error == 0){
  380. Toastr.success(data.msg);
  381. }
  382. },
  383. error:function(err){
  384. flag = 0;
  385. }
  386. })
  387. });
  388. //发送消息时间
  389. $(document).on('click','.s_time_box span',function(){
  390. var $this = $(this);
  391. var nval = parseInt($this.attr('stime'));
  392. var ntime = Date.parse(new Date());
  393. var nt = ntime + nval;
  394. $('#c-sendtime').val(GetRTime(nt));
  395. });
  396. $(document).on('click','.s_tag_li_list span',function(){
  397. var $this = $(this);
  398. $this.addClass('s_s_tag').siblings('span').removeClass('s_s_tag');
  399. var tagObj ={
  400. sex:$('#sex span.s_s_tag').data('sex'),
  401. tag:$('#ctag span.s_s_tag').data('cid'),
  402. consume:$('#consume span.s_s_tag').data('fee'),
  403. kandian: $('#kandian span.s_s_tag').data('kandian'),
  404. subscribe_time:$('#subTime span.s_s_tag').data('week'),
  405. all:"0"
  406. }
  407. var uconditon = JSON.stringify(tagObj);
  408. $('#usercondition').val(uconditon);
  409. });
  410. var ofansopen=true;
  411. //tag切换
  412. $(document).on('click','.s_tag_fans_num',function(){
  413. var $this = $(this);
  414. //防止重复点击
  415. if(!ofansopen){
  416. return false;
  417. }
  418. ofansopen = false;
  419. $('.s_tag_footer').addClass('s_tag_fans_show');
  420. var tagObj ={
  421. sex:$('#sex span.s_s_tag').data('sex'),
  422. tag:$('#ctag span.s_s_tag').data('cid'),
  423. consume:$('#consume span.s_s_tag').data('fee'),
  424. kandian: $('#kandian span.s_s_tag').data('kandian'),
  425. subscribe_time:$('#subTime span.s_s_tag').data('week'),
  426. all:"0"
  427. }
  428. var uconditon = JSON.stringify(tagObj);
  429. $('#usercondition').val(uconditon);
  430. //console.log(tagObj);
  431. $.ajax({
  432. type:'post',
  433. data:tagObj,
  434. //dataType:'json',
  435. url:'/admin/custom/ajaxcustom',
  436. success:function(data){
  437. //console.log(data);
  438. $('#mustbe').html('约'+data.ids+'人');
  439. ofansopen = true;
  440. $('.s_tag_footer').removeClass('s_tag_fans_show');
  441. },
  442. error:function(err){
  443. ofansopen = true;
  444. $('.s_tag_footer').removeClass('s_tag_fans_show');
  445. }
  446. });
  447. });
  448. $(document).on('click','.img_txt_add_but',function(){
  449. var $List=$('.img_txt_main');
  450. var oNowData = {
  451. image:ore.imglis[parseInt(Math.random()*ore.imglis.length)]['image'],
  452. title:ore.titlist[parseInt(Math.random()*ore.titlist.length)]['title'],
  453. url:'http://'
  454. };
  455. var sLiImg=ore.sli.replace(/sli_img/g,oNowData['image']);
  456. sLiImg=sLiImg.replace(/sli_value/g,oNowData['title']);
  457. sLiImg=sLiImg.replace(/click_url/g,'http://');
  458. if($List.length<8){
  459. $('.img_txt_list').append(sLiImg);
  460. ore.arrma.push(oNowData);
  461. }else{
  462. Toastr.error("不能超过8篇");
  463. }
  464. });
  465. $(document).on('click','.img_txt_remvoe',function(){
  466. var $this=$(this);
  467. $this.parent().remove();
  468. });
  469. //修改title
  470. $(document).on('click','.img_txt_edit_tit',function(){
  471. var $this=$(this);
  472. Fast.api.open('manage/title/select', '选择', {
  473. callback: function (data) {
  474. // console.log('展示title回调', data);
  475. $this.parent().find('input').eq(0).val(data.title);
  476. }
  477. });
  478. });
  479. //修改url
  480. $(document).on('click','.img_txt_edit_url',function(){
  481. var $this=$(this);
  482. Fast.api.open('referral/referral/select?one=1', '选择', {
  483. callback: function (data) {
  484. var data = data[0];
  485. // console.log('展示title回调', data);
  486. $this.parent().find('input').eq(1).val(data.source_url);
  487. }
  488. });
  489. });
  490. //修改book
  491. $(document).on('click','.img_txt_edit_book',function(){
  492. var $this=$(this);
  493. Fast.api.open('book.book/select?one=1', '选择', {
  494. callback: function (data) {
  495. var data = data[0];
  496. $this.parent().find('input').eq(1).val(data.current_book_url);
  497. }
  498. });
  499. });
  500. //修改图片
  501. $(document).on('click','.img_txt_edit_img',function(){
  502. var $this=$(this);
  503. Fast.api.open('manage/cover/select', '选择', {
  504. callback: function (data) {
  505. // console.log('展示image回调', data);
  506. $this.find('img').attr('src',data.image);
  507. }
  508. });
  509. });
  510. //修改跳转链接
  511. $(document).on('click','.img_txt_main a',function(){
  512. var $this=$(this);
  513. var nIndex = $this.parents('.img_txt_main').index();
  514. layer.prompt({
  515. formType: 2,
  516. value: ore.arrma[nIndex].url,
  517. title: '请输入跳转链接地址(http://)',
  518. area: ['300px', '100px'] //自定义文本域宽高
  519. }, function(value, index, elem){
  520. var reg=/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/;
  521. if(reg.test(value)){
  522. layer.close(index);
  523. ore.arrma[nIndex].url = value;
  524. $this.html(value);
  525. }else{
  526. Toastr.error("请输入正确的跳转地址。");
  527. }
  528. });
  529. });
  530. function GetRTime(time){
  531. var stime;
  532. time = new Date(time);
  533. var year = time.getYear() + 1900;
  534. var month = time.getMonth()+1;
  535. var day = time.getDate();
  536. var hours = time.getHours();
  537. var minutes = time.getMinutes();
  538. var seconds = time.getSeconds();
  539. stime = year + '-' +
  540. (month < 10 ? '0'+month : month) + '-' +
  541. (day < 10 ? '0'+day : day) + ' ' +
  542. (hours < 10 ? '0'+hours : hours) + ':' +
  543. (minutes < 10 ? '0'+minutes : minutes) + ':' +
  544. (seconds < 10 ? '0'+seconds : seconds);
  545. return stime;
  546. }
  547. }
  548. }
  549. };
  550. return Controller;
  551. });