index.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. {extend name="public/container"}
  2. {block name="head_top"}
  3. <link href="{__FRAME_PATH}css/plugins/iCheck/custom.css" rel="stylesheet">
  4. <script src="{__PLUG_PATH}moment.js"></script>
  5. <link rel="stylesheet" href="{__PLUG_PATH}daterangepicker/daterangepicker.css">
  6. <script src="{__PLUG_PATH}daterangepicker/daterangepicker.js"></script>
  7. <script src="{__ADMIN_PATH}frame/js/plugins/iCheck/icheck.min.js"></script>
  8. <link href="{__FRAME_PATH}css/plugins/footable/footable.core.css" rel="stylesheet">
  9. <script src="{__PLUG_PATH}sweetalert2/sweetalert2.all.min.js"></script>
  10. <script src="{__FRAME_PATH}js/plugins/footable/footable.all.min.js"></script>
  11. <style>
  12. .on-tag{background-color: #eea91e;}
  13. .height-auto{height: 300px;}
  14. .tag{border: solid 1px #eee;}
  15. </style>
  16. {/block}
  17. {block name="content"}
  18. <div class="row">
  19. <div class="col-sm-12">
  20. <div class="ibox">
  21. <div class="ibox-content">
  22. <div class="row">
  23. <div class="m-b m-l">
  24. <form action="" class="form-inline" id="form" method="get">
  25. <div class="search-item" data-name="data">
  26. <span>选择时间:</span>
  27. <button type="button" class="btn btn-outline btn-link" data-value="">全部</button>
  28. <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.today}">今天</button>
  29. <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.week}">本周</button>
  30. <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.month}">本月</button>
  31. <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.quarter}">本季度</button>
  32. <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.year}">本年</button>
  33. <div class="datepicker" style="display: inline-block;">
  34. <button type="button" class="btn btn-outline btn-link" data-value="{$where.data?:'no'}">自定义时间</button>
  35. </div>
  36. <input class="search-item-value" type="hidden" name="data" value="{$where.data}" />
  37. <input class="search-item-value" type="hidden" name="groupid" value="{$where.groupid}" />
  38. <input class="search-item-value" type="hidden" name="tagid_list" value="{$where.tagid_list}" />
  39. <input class="search-item-value" type="hidden" name="sex" value="{$where.sex}" />
  40. <input class="search-item-value" type="hidden" name="subscribe" value="{$where.subscribe}" />
  41. <input class="search-item-value" type="hidden" name="stair" value="" />
  42. <input class="search-item-value" type="hidden" name="second" value="" />
  43. <input class="search-item-value" type="hidden" name="order_stair" value="" />
  44. <input class="search-item-value" type="hidden" name="order_second" value="" />
  45. <input class="search-item-value" type="hidden" name="now_money" value="" />
  46. <input class="search-item-value" type="hidden" id="batch" name="batch" value="" />
  47. </div>
  48. <hr>
  49. <div class="tag-item" data-name="tagid_list">
  50. <span>用户标签:</span>
  51. {volist name="tagList" id="vo"}
  52. <button type="button" class="btn btn-outline btn-link tag" data-value="{$vo.id}">{$vo.name}</button>
  53. {/volist}
  54. <input class="tag-item-value" type="hidden" name="tagid_list" value="{$where.tagid_list}" />
  55. </div>
  56. <hr>
  57. <div class="btn-group">
  58. <button data-toggle="dropdown" class="btn btn-white btn-xs dropdown-toggle" style="padding: 5px 15px;"
  59. aria-expanded="false">批量操作
  60. <span class="caret"></span>
  61. </button>
  62. <ul class="dropdown-menu left">
  63. <li>
  64. <a class="save_mark grant" href="javascript:void(0);" >
  65. <i class="fa fa-space-shuttle"></i> 发放优惠券
  66. </a>
  67. </li>
  68. <li>
  69. <a class="save_mark news" href="javascript:void(0);" >
  70. <i class="fa fa-space-shuttle"></i> 发送消息
  71. </a>
  72. </li>
  73. </ul>
  74. </div>
  75. <div class="input-group" style="float: right">
  76. <input type="text" name="nickname" value="{$where.nickname}" placeholder="请输入会员名称" class="input-sm form-control">
  77. <input type="hidden" name="export" value="{$where.export}" />
  78. <span class="input-group-btn">
  79. <button type="submit" class="btn btn-sm btn-primary"> <i class="fa fa-search"></i>搜索</button>
  80. <button style="margin: 0 16px" type="submit" id="export" class="btn btn-sm btn-info btn-outline"> <i class="fa fa-exchange" ></i> Excel导出</button>
  81. <script>
  82. $('#export').on('click',function(){
  83. $('input[name=export]').val(1);
  84. });
  85. $('#no_export').on('click',function(){
  86. $('input[name=export]').val(0);
  87. });
  88. </script>
  89. </span>
  90. </div>
  91. </form>
  92. </div>
  93. </div>
  94. <div class="table-responsive">
  95. <table class="table table-striped table-bordered" data-page-size="20">
  96. <thead>
  97. <tr>
  98. <th class="text-cente">
  99. <div class="btn-group">
  100. <button data-toggle="dropdown" class="btn btn-white btn-xs dropdown-toggle" style="font-weight: bold;background-color: #f5f5f6;border: solid 0;"
  101. aria-expanded="false">
  102. 选择
  103. <span class="caret"></span>
  104. </button>
  105. <ul class="dropdown-menu left">
  106. <li class="this-page">
  107. <a class="save_mark" href="javascript:void(0);" >
  108. <i class="fa fa-check-square-o"></i>本页用户
  109. </a>
  110. </li>
  111. <li class="this-all">
  112. <a class="save_mark" href="javascript:void(0);">
  113. <i class="fa fa-check-square"></i>全部用户
  114. </a>
  115. </li>
  116. <li class="this-up">
  117. <a class="save_mark" href="javascript:void(0);">
  118. <i class="fa fa-square-o"></i>取消选择
  119. </a>
  120. </li>
  121. </ul>
  122. </div>
  123. </th>
  124. <th class="text-center">编号</th>
  125. <th class="text-center">微信用户名称</th>
  126. <th class="text-center">头像</th>
  127. <th class="text-center">
  128. <div class="btn-group">
  129. <button data-toggle="dropdown" class="btn btn-white btn-xs dropdown-toggle" style="font-weight: bold;background-color: #f5f5f6;border: solid 0;"
  130. aria-expanded="false">性别
  131. <span class="caret"></span>
  132. </button>
  133. <ul class="dropdown-menu search-item" data-name="sex">
  134. <li data-value="">
  135. <a class="save_mark" href="javascript:void(0);" >
  136. <i class="fa fa-venus-mars"></i>全部
  137. </a>
  138. </li>
  139. <li data-value="1">
  140. <a class="save_mark" href="javascript:void(0);" >
  141. <i class="fa fa-mars"></i>男
  142. </a>
  143. </li>
  144. <li data-value="2">
  145. <a class="save_mark" href="javascript:void(0);">
  146. <i class="fa fa-venus"></i>女
  147. </a>
  148. </li>
  149. <li data-value="0">
  150. <a class="save_mark" href="javascript:void(0);">
  151. <i class="fa fa-transgender"></i>保密
  152. </a>
  153. </li>
  154. </ul>
  155. </div>
  156. </th>
  157. <th class="text-center no-sort">地区</th>
  158. <th class="text-center">
  159. <div class="btn-group">
  160. <button data-toggle="dropdown" class="btn btn-white btn-xs dropdown-toggle" style="font-weight: bold;background-color: #f5f5f6;border: solid 0;"
  161. aria-expanded="false">是否关注公众号
  162. <span class="caret"></span>
  163. </button>
  164. <ul class="dropdown-menu search-item" data-name="subscribe">
  165. <li data-value="">
  166. <a class="save_mark" href="javascript:void(0);" >
  167. 全部
  168. </a>
  169. </li>
  170. <li data-value="1">
  171. <a class="save_mark" href="javascript:void(0);" >
  172. 关注
  173. </a>
  174. </li>
  175. <li data-value="0">
  176. <a class="save_mark" href="javascript:void(0);">
  177. 未关注
  178. </a>
  179. </li>
  180. </ul>
  181. </div>
  182. </th>
  183. <th class="text-center">
  184. <div class="btn-group">
  185. <button data-toggle="dropdown" class="btn btn-white btn-xs dropdown-toggle" style="font-weight: bold;padding: 6px 50px;background-color: #f5f5f6;border: solid 0;"
  186. aria-expanded="false">用户分组
  187. <span class="caret"></span>
  188. </button>
  189. <ul class="dropdown-menu search-item" data-name="groupid">
  190. <li data-value="-1">
  191. <a class="save_mark" href="javascript:void(0);" >
  192. 全部
  193. </a>
  194. </li>
  195. {volist name="groupList" id="vo"}
  196. <li data-value="{$vo.id}">
  197. <a class="save_mark" href="javascript:void(0);" >
  198. {$vo.name}
  199. </a>
  200. </li>
  201. {/volist}
  202. </ul>
  203. </div>
  204. </th>
  205. <th class="text-center">用户标签</th>
  206. <!-- <th class="text-center">首次关注时间</th>-->
  207. <th class="text-center">操作</th>
  208. </tr>
  209. </thead>
  210. <tbody>
  211. <?php $count = count($list); ?>
  212. {if condition="$count"}
  213. {volist name="list" id="vo"}
  214. <tr>
  215. <td class="text-center">
  216. <label class="checkbox-inline i-checks">
  217. <input type="checkbox" name="coupon[]" value="{$vo.uid}">
  218. </label>
  219. </td>
  220. <td class="text-center">
  221. {$vo.uid}
  222. </td>
  223. <td class="text-center">
  224. {$vo.nickname}
  225. </td>
  226. <td class="text-center">
  227. <img src="{$vo.headimgurl}" alt="{$vo.nickname}" title="{$vo.nickname}" style="width:50px;height: 50px;cursor: pointer;" class="head_image" data-image="{$vo.headimgurl}">
  228. </td>
  229. <td class="text-center">
  230. {if condition="$vo['sex'] eq 1"}
  231. {elseif condition="$vo['sex'] eq 2"/}
  232. {else/}
  233. 保密
  234. {/if}
  235. </td>
  236. <td class="text-center">
  237. {$vo.country}{$vo.province}{$vo.city}
  238. </td>
  239. <td class="text-center">
  240. {if condition="$vo['subscribe']"}
  241. 关注
  242. {else/}
  243. 未关注
  244. {/if}
  245. </td>
  246. <td class="text-center">
  247. <?php if(!is_array($groupList)){ ?>
  248. <?php }else{ ?>
  249. <?php if(!$groupList || $vo['groupid'] == 0 || !isset($groupList[$vo['groupid']])){ ?>
  250. <?php }else{ ?>
  251. <span class="badge badge-primary">{$groupList[$vo['groupid']]['name']}</span>
  252. <?php } ?>
  253. <?php }?>
  254. </td>
  255. <td class="text-center">
  256. <?php if(!is_array($tagList)){ ?>
  257. <?php }else{ ?>
  258. <?php $tagId = explode(',',$vo['tagid_list']);
  259. if(!$tagList || $vo['tagid_list'] == ''|| !$tagId){ ?>
  260. <?php }else{ foreach($tagId as $tag){ if(isset($tagList[$tag])){?>
  261. <span class="badge badge-info">{$tagList[$tag]['name']}</span>
  262. <?php }?>
  263. <?php } } ?>
  264. <?php }?>
  265. </td>
  266. <!-- <td class="text-center">-->
  267. <!-- {$vo.add_time|date="Y-m-d H:i:s",###}-->
  268. <!-- </td>-->
  269. <td class="text-center">
  270. <div class="btn-group">
  271. <button data-toggle="dropdown" class="btn btn-warning btn-xs dropdown-toggle"
  272. aria-expanded="false">操作
  273. <span class="caret"></span>
  274. </button>
  275. <ul class="dropdown-menu">
  276. {eq name="vo.subscribe" value="1"}
  277. <li>
  278. <a class="save_mark" href="javascript:void(0);" onclick="$eb.createModalFrame('修改分组','{:Url('edit_user_group',['openid'=>$vo['openid']])}',{w:350,h:500})" >
  279. 修改分组
  280. </a>
  281. </li>
  282. <li>
  283. <a class="save_mark" href="javascript:void(0);" onclick="$eb.createModalFrame('修改标签','{:Url('edit_user_tag',['openid'=>$vo['openid']])}',{w:350,h:500})" >
  284. 修改标签
  285. </a>
  286. </li>
  287. <li>
  288. <a class="save_mark synchro" href="javascript:void(0);" data-url="{:Url('synchro_tag',['openid'=>$vo['openid']])}" >
  289. 同步标签
  290. </a>
  291. </li>
  292. {else/}
  293. <li>
  294. <a class="save_mark" href="javascript:void(0);">
  295. 无法操作
  296. </a>
  297. </li>
  298. {/eq}
  299. </ul>
  300. </div>
  301. </td>
  302. </tr>
  303. {/volist}
  304. {else/}
  305. <tr id="content" style="display:none;height:400px;"></tr>
  306. {/if}
  307. </tbody>
  308. </table>
  309. </div>
  310. {include file="public/inner_page"}
  311. </div>
  312. </div>
  313. </div>
  314. </div>
  315. {/block}
  316. {block name="script"}
  317. <script>
  318. window.$list = <?php echo json_encode($list);?>;
  319. window.$uidAll = <?php echo json_encode($uidAll);?>;
  320. window.$where = <?php echo json_encode($where);?>;
  321. $('.this-page').on('click',function () {
  322. $('input[name="coupon[]"]').each(function(){
  323. $(this).checked = true;
  324. $(this).parent().addClass('checked');
  325. $('#batch').val(1);
  326. });
  327. })
  328. $('.this-all').on('click',function () {
  329. $('input[name="coupon[]"]').each(function(){
  330. $(this).checked = true;
  331. $(this).parent().addClass('checked');
  332. $('#batch').val(2);
  333. });
  334. })
  335. $('.this-up').on('click',function () {
  336. $('input[name="coupon[]"]').each(function(){
  337. $(this).checked = false;
  338. $(this).parent().removeClass('checked');
  339. $('#batch').val('');
  340. });
  341. })
  342. $(function init() {
  343. $('.search-item>.btn').on('click', function () {
  344. var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name'), form = p.parents();
  345. form.find('input[name="' + name + '"]').val(value);
  346. $('input[name=export]').val(0);
  347. form.submit();
  348. });
  349. $('.tag-item>.btn').on('click', function () {
  350. var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name'), form = p.parents(),list = $('input[name="' + name + '"]').val().split(',');
  351. var bool = 0;
  352. $.each(list,function (index,item) {
  353. if(item == value){
  354. bool = 1
  355. list.splice(index,1);
  356. }
  357. })
  358. if(!bool) list.push(''+value+'');
  359. form.find('input[name="' + name + '"]').val(list.join(','));
  360. $('input[name=export]').val(0);
  361. form.submit();
  362. });
  363. $('.search-item>li').on('click', function () {
  364. var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name'), form = $('#form');
  365. form.find('input[name="' + name + '"]').val(value);
  366. $('input[name=export]').val(0);
  367. form.submit();
  368. });
  369. $('.search-item>li').each(function () {
  370. var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name');
  371. if($where[name]) $('.'+name).css('color','#1ab394');
  372. });
  373. $('.search-item-value').each(function () {
  374. var that = $(this), name = that.attr('name'), value = that.val(), dom = $('.search-item[data-name="' + name + '"] .btn[data-value="' + value + '"]');
  375. dom.eq(0).removeClass('btn-outline btn-link').addClass('btn-primary btn-sm')
  376. .siblings().addClass('btn-outline btn-link').removeClass('btn-primary btn-sm')
  377. });
  378. $('.tag-item-value').each(function () {
  379. var that = $(this), name = that.attr('name'), value = that.val().split(',');
  380. dom = [];
  381. $.each(value,function (index,item) {
  382. dom.push($('.tag-item[data-name="' + name + '"] .btn[data-value="' + item + '"]'));
  383. })
  384. $.each(dom,function (index,item) {
  385. item.eq(0).removeClass('btn-outline btn-link tag').addClass('btn-primary btn-sm')
  386. })
  387. });
  388. })
  389. $('.i-checks').iCheck({
  390. checkboxClass: 'icheckbox_square-green',
  391. });
  392. $('.head_image').on('click',function (e) {
  393. var image = $(this).data('image');
  394. $eb.openImage(image);
  395. })
  396. var dateInput =$('.datepicker');
  397. dateInput.daterangepicker({
  398. autoUpdateInput: false,
  399. "opens": "center",
  400. "drops": "down",
  401. "ranges": {
  402. '今天': [moment(), moment().add(1, 'days')],
  403. '昨天': [moment().subtract(1, 'days'), moment()],
  404. '上周': [moment().subtract(6, 'days'), moment()],
  405. '前30天': [moment().subtract(29, 'days'), moment()],
  406. '本月': [moment().startOf('month'), moment().endOf('month')],
  407. '上月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
  408. },
  409. "locale" : {
  410. applyLabel : '确定',
  411. cancelLabel : '清空',
  412. fromLabel : '起始时间',
  413. toLabel : '结束时间',
  414. format : 'YYYY/MM/DD',
  415. customRangeLabel : '自定义',
  416. daysOfWeek : [ '日', '一', '二', '三', '四', '五', '六' ],
  417. monthNames : [ '一月', '二月', '三月', '四月', '五月', '六月',
  418. '七月', '八月', '九月', '十月', '十一月', '十二月' ],
  419. firstDay : 1
  420. }
  421. });
  422. dateInput.on('cancel.daterangepicker', function(ev, picker) {
  423. $("#data").val('');
  424. });
  425. dateInput.on('apply.daterangepicker', function(ev, picker) {
  426. $("input[name=data]").val(picker.startDate.format('YYYY/MM/DD') + ' - ' + picker.endDate.format('YYYY/MM/DD'));
  427. $('input[name=export]').val(0);
  428. $('#form').submit();
  429. });
  430. //发优惠券
  431. $('.grant').on('click',function (e) {
  432. var chk_value =[];
  433. var batch = $('#batch').val();
  434. if(batch == 1){
  435. $.each($list.data,function (index,item) {
  436. chk_value.push(item.uid);
  437. })
  438. }else if(batch == 2){
  439. chk_value = $uidAll;
  440. }else{
  441. $('input[name="coupon[]"]:checked').each(function(){
  442. chk_value.push($(this).val());
  443. str += $(this).val();
  444. });
  445. if(chk_value.length < 1){
  446. $eb.message('请选择要发放优惠券的用户');
  447. return false;
  448. }
  449. }
  450. var str = chk_value.join(',');
  451. var url = "http://"+window.location.host+"/admin/store.store_coupon/grant/id/"+str;
  452. $eb.createModalFrame(this.innerText,url,{'w':800});
  453. })
  454. $('.news').on('click',function (e) {
  455. var chk_value =[];
  456. var batch = $('#batch').val();
  457. if(batch == 1){
  458. $.each($list.data,function (index,item) {
  459. chk_value.push(item.uid);
  460. })
  461. }else if(batch == 2){
  462. chk_value = $uidAll;
  463. }else{
  464. $('input[name="coupon[]"]:checked').each(function(){
  465. chk_value.push($(this).val());
  466. str += $(this).val();
  467. });
  468. if(chk_value.length < 1){
  469. $eb.message('请选择要发消息的用户');
  470. return false;
  471. }
  472. }
  473. var str = chk_value.join(',');
  474. var url = "http://"+window.location.host+"/admin/wechat.wechat_news_category/send_news/id/"+str;
  475. $eb.createModalFrame(this.innerText,url,{'w':800});
  476. })
  477. $('.synchro').on('click',function(){
  478. window.t = $(this);
  479. var _this = $(this),url =_this.data('url');
  480. $eb.$swal('delete',function(){
  481. $eb.axios.get(url).then(function(res){
  482. if(res.status == 200 && res.data.code == 200) {
  483. $eb.$swal('success',res.data.msg);
  484. }else
  485. return Promise.reject(res.data.msg || '同步失败')
  486. }).catch(function(err){
  487. $eb.$swal('error',err);
  488. });
  489. },{'title':'您确定要同步该用户的标签吗?','text':'请谨慎操作!','confirm':'是的,我要同步'})
  490. });
  491. </script>
  492. {/block}