fans.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. {template 'common/header'}
  2. {if $do == 'fans_sync_set'}
  3. <div class="we7-page-title">
  4. 粉丝管理
  5. </div>
  6. <ul class="we7-page-tab">
  7. <li class="">
  8. <a href="{php echo url('mc/fans')}" >全部粉丝</a>
  9. </li>
  10. <li class="active">
  11. <a href="{php echo url('mc/fans/fans_sync_set')}">粉丝同步设置</a>
  12. </li>
  13. </ul>
  14. <div class="alert alert-info">
  15. <p><i class="fa fa-exclamation-circle"></i> 此同步设置是指系统后台自动同步系统数据中已关注粉丝的基本信息,并非该公众号全部粉丝数据;</p>
  16. <p><i class="fa fa-exclamation-circle"></i> 如若想同步全部粉丝信息,请到菜单“粉丝”->“全部粉丝”,点击“同步全部粉丝信息”按钮!</p>
  17. </div>
  18. <div id="js-profile-sync" ng-controller="syncCtrl" ng-cloak>
  19. <table class="table we7-table table-hover table-form">
  20. <col width="140px " />
  21. <col />
  22. <col width="140px" />
  23. <tr>
  24. <th class="text-left" colspan="3">粉丝同步</th>
  25. </tr>
  26. <tr>
  27. <td >是否开启</td>
  28. <td>
  29. {{ syncSetting == 1 ? '开启' : '关闭' }}
  30. </td>
  31. <td class="text-center">
  32. <label>
  33. <input name="" class="form-control" type="checkbox" style="display: none;">
  34. <div ng-class="syncSetting == 1 ? 'switch switchOn' : 'switch'" ng-click="setSync()"></div>
  35. </label>
  36. </td>
  37. </tr>
  38. </table>
  39. </div>
  40. <script>
  41. angular.module('profileApp').value('config', {
  42. 'syncSetting' : "{$sync_setting}",
  43. 'saveSyncSetting' : "{php echo url('mc/fans/fans_sync_set', array('operate' => 'save_setting'))}"
  44. });
  45. angular.bootstrap($('#js-profile-sync'), ['profileApp']);
  46. </script>
  47. {else}
  48. <div class="we7-page-title">
  49. 粉丝管理
  50. </div>
  51. <ul class="we7-page-tab">
  52. <li class="active">
  53. <a href="{php echo url('mc/fans')}" >全部粉丝</a>
  54. </li>
  55. <li class="">
  56. <a href="{php echo url('mc/fans/fans_sync_set')}">粉丝同步设置</a>
  57. </li>
  58. </ul>
  59. <div id="main" ng-controller="DisplayCtrl" ng-cloak>
  60. <div class="we7-page-search we7-padding-bottom clearfix">
  61. <div class="pull-right">
  62. <button class="btn btn-primary we7-padding-horizontal add-group" data-toggle="popover">+添加分组</button>
  63. </div>
  64. <form action="" method="post" class="form-inline" role="form">
  65. <div class="form-group">
  66. <div class="form-controls">
  67. <select name="follow" class="we7-select" >
  68. <option value="1" {if $follow == 1}selected{/if}>已关注</option>
  69. <option value="2" {if $follow == 2}selected{/if}>取消关注</option>
  70. </select>
  71. </div>
  72. </div>
  73. <div class="form-group we7-margin-left-sm">
  74. <div class="input-group col-sm-12" >
  75. <div class="input-group-btn">
  76. <button data-toggle="dropdown" class="btn btn-default dropdown-toggle" type="button" aria-expanded="false"> {{ searchMod == 1 ? '精确' : '模糊'}}
  77. <span class="caret"></span>
  78. </button>
  79. <ul role="menu" class="dropdown-menu">
  80. <li>
  81. <a href="javascript:;" ng-click="switchSearchMod(1)">精确</a>
  82. </li>
  83. <li>
  84. <a href="javascript:;" ng-click="switchSearchMod(2)">模糊</a>
  85. </li>
  86. </ul>
  87. </div>
  88. <input name="search_mod" type="text" style="display:none;" ng-model="searchMod">
  89. <input name="nickname" value="{$nickname}" class="form-control" placeholder="" type="text">
  90. <span class="input-group-btn"><button class="btn btn-default"><i class="fa fa-search"></i></button></span>
  91. </div>
  92. </div>
  93. <input name="tag" value="{$tag}" type="hidden">
  94. </form>
  95. </div>
  96. <div class="popover-add-group" style="display: none;">
  97. <div class="input-group" style="width: 250px;">
  98. <p>标签名称</p>
  99. <input name="addtag" value="" class="form-control" placeholder="分组名称" type="text">
  100. </div>
  101. <div class="popover-btn we7-margin-top-sm">
  102. <a href="javascript:;" class="btn btn-primary we7-margin-right-sm" onclick="addTag()">确定</a>
  103. <a href="javascript:;" class="btn btn-default popover-hide">取消</a>
  104. </div>
  105. </div>
  106. <div class="fans-content">
  107. <div class="fans-list">
  108. <div class="panel we7-panel">
  109. <div class="panel-heading">
  110. {if empty($tag)}全部{else}{$fans_tag[$tag]['name']}
  111. <a href="javascript:;" class="color-default fans-group-edit we7-margin-left-sm edit-group" data-toggle='popover'>重命名</a>
  112. <a href="javascript:;" class="color-default fans-group-del we7-margin-left-sm" data-toggle='popover'>删除</a>
  113. {/if}
  114. <div class="pull-right we7-form">
  115. <input id='credit1' type="radio" name='1' {if $type == ''}checked='checked'{/if} onclick="changetype('')" />
  116. <label for="credit1">全部</label>
  117. <input id='credit3' type="radio" name='1' {if $type == 'bind'}checked='checked'{/if} onclick="changetype('bind')"/>
  118. <label for="credit3">
  119. 会员
  120. </label>
  121. <script>
  122. changetype = function(type) {
  123. if (type == '') {
  124. url = "{php echo url('mc/fans', array('follow' => $follow, 'nickname' => $nickname, 'tag' => $tag, 'type' => ''))}"
  125. } else {
  126. url = "{php echo url('mc/fans', array('follow' => $follow, 'nickname' => $nickname, 'tag' => $tag, 'type' => 'bind'))}"
  127. }
  128. location.href = url;
  129. }
  130. </script>
  131. </div>
  132. </div>
  133. <div class="panel-body">
  134. <table class="table we7-table table-hover fans-info vertical-middle">
  135. <col width="20px" />
  136. <col width="60px"/>
  137. <col />
  138. <col />
  139. <tr>
  140. <th class="text-left" colspan="5">
  141. <div class="we7-form">
  142. <input id='checkall' type="checkbox" we7-check-all="1" name='openid[]' onclick="checkall()"/>
  143. <label for="checkall">全选 </label>
  144. <script>
  145. checkall = function() {
  146. check = $('#checkall').prop('checked') == true ? 'checked' : '';
  147. $('.openid').prop('checked', check);
  148. }
  149. </script>
  150. <a href="javascript:;" class="btn btn-primary test we7-margin-left-sm batch-group" data-toggle='popover' >打标签</a>
  151. <a href="javascript:;" class="btn btn-default we7-margin-left-sm" ng-click="sync('check')">同步选中粉丝信息</a>
  152. <a href="javascript:;" class="btn btn-default we7-margin-left-sm" ng-click="downloadFans()">同步全部粉丝信息</a>
  153. <label>同步会员信息
  154. <input name="" class="form-control" type="checkbox" >
  155. <div style = "float:left;" ng-class="sync_member == 1 ? 'switch switchOn' : 'switch'" ng-click="syncMember()"></div>
  156. </label>
  157. </div>
  158. </th>
  159. </tr>
  160. {loop $fans_list $fan}
  161. <tr>
  162. <td>
  163. <div class="we7-form">
  164. <input id='option[{$fan['fanid']}]' type="checkbox" we7-check-all="1" class="openid" name='openid[]' value="{$fan['openid']}"/>
  165. <label for="option[{$fan['fanid']}]"> </label>
  166. </div>
  167. </td>
  168. <td style="overflow-x: hidden;">
  169. <a href="{php echo url('mc/chats', array('openid' => $fan['openid']))}" target="_blank" class="avatar">
  170. <img src="{php echo tomedia($fan['tag']['headimgurl'])}" width="48" />
  171. </a>
  172. </td>
  173. <td>
  174. <p><a href="{php echo url('mc/chats', array('openid' => $fan['openid']))}" target="_blank" class="nick-name" data-fanid="{$fan['fanid']}" data-group="{$fan['groupid']}">{$fan['nickname']}</a></p>
  175. {if !empty($fan['uid'])}
  176. <p class="remark-name"><a href="{php echo url('mc/member/base_information', array('uid' => $fan['uid']));}">
  177. {if !empty($fan['member']['realname'])}
  178. {$fan['member']['realname']}
  179. {else}
  180. {$fan['uid']}
  181. {/if}
  182. </a> {if !empty($fan['member']['mobile'])}<i class="wi wi-iphone fans-tel"></i>{/if}</p>
  183. {/if}
  184. <div class="fans-tag-area">
  185. <span class="tag-list get-fans-tag js-group" data-id="{$fan['fanid']}" data-toggle='popover'>
  186. {loop $fan['tag_show'] $k $tag_show}
  187. {if $k == 0 && $tag_show == '无标签'}
  188. 无标签
  189. {else}
  190. <a href="javascript:;" class="label label-primary">{$tag_show}</a>
  191. {/if}
  192. {/loop}
  193. <span class="tag-btn put-group" >
  194. <i class="caret"></i>
  195. </span>
  196. </span>
  197. </div>
  198. </td>
  199. <td class="text-right">
  200. <div class="send-message">
  201. {if empty($fan['uid'])}
  202. <a href="javascript:;" class="color-default" data-toggle="modal" data-target="#register_member" ng-click="registerMember('{$fan['openid']}')">注册为会员</a>
  203. {/if}
  204. <a href="{php echo url('mc/chats', array('openid' => $fan['openid']))}" target="_blank" class="color-default">
  205. 发送消息<span class="wi wi-angle-right"></span>
  206. </a>
  207. </div>
  208. {if empty($fan['follow'])}
  209. <p>取消关注:{php echo date('Y-m-d H:i:s', $fan['unfollowtime'])}</p>
  210. {else}
  211. <p>关注:{php echo date('Y-m-d H:i:s', $fan['followtime'])}</p>
  212. {/if}
  213. </td>
  214. </tr>
  215. {/loop}
  216. </table>
  217. </div>
  218. </div>
  219. </div>
  220. <input type="hidden" name="fanid" />
  221. <div class="fans-group-list">
  222. <dl>
  223. <dt class="fans-group-item">
  224. <a href="{php echo url('mc/fans', array('follow' => $follow, 'nickname' => $nickname, 'tag' => 0))}">全部用户({$fans['total']})</a>
  225. </dt>
  226. {loop $fans_tag $tag_info}
  227. <dd class="fans-group-item {if $tag == $tag_info['id']}active{/if}">
  228. <a href="{php echo url('mc/fans', array('follow' => $follow, 'nickname' => $nickname, 'tag' => $tag_info['id']))}">{$tag_info['name']}({$tag_info['count']})</a>
  229. </dd>
  230. {/loop}
  231. </dl>
  232. </div>
  233. <div class="modal fade" id="register_member" tabindex="1" role="dialog" aria-labelledby="myModalLabel">
  234. <div class="we7-modal-dialog modal-dialog we7-form" role="document">
  235. <div class="modal-content">
  236. <div class="modal-header">
  237. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  238. <h4 class="modal-title" id="address-add">注册为会员</h4>
  239. </div>
  240. <div class="modal-body">
  241. <div class="form-group">
  242. <label class="col-sm-2 control-label">新密码</label>
  243. <div class="col-sm-9 col-xs-12">
  244. <input class="form-control" type="password" ng-model="register.password">
  245. </div>
  246. </div>
  247. <div class="form-group">
  248. <label class="col-sm-2 control-label">确认密码</label>
  249. <div class="col-sm-9 col-xs-12">
  250. <input class="form-control" type="password" ng-model="register.repassword">
  251. </div>
  252. </div>
  253. <input class="form-control" type="hidden" ng-model="register.openid">
  254. <div class="modal-footer">
  255. <button type="button" class="btn btn-primary" data-dismiss="modal" ng-click="register()">注册</button>
  256. <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
  257. </div>
  258. </div>
  259. </div>
  260. </div>
  261. </div>
  262. </div>
  263. <div class="popover-edit-group" style="display: none;">
  264. <div class="input-group" style="width: 250px;">
  265. <p>标签名称</p>
  266. <input name="edittag" value="" class="form-control" placeholder="分组名称" type="text">
  267. </div>
  268. <div class="popover-btn we7-margin-top-sm">
  269. <a href="javascript:;" class="btn btn-primary we7-margin-right-sm" onclick="editTagName()">确定</a>
  270. <a href="javascript:;" class="btn btn-default popover-hide">取消</a>
  271. </div>
  272. </div>
  273. <div class="popover-del-group" style="display: none;">
  274. <div class="input-group" style="width: 250px;">
  275. <p>删除标签后,该标签下的所有用户将失去该标签属性。是否确定删除?</p>
  276. </div>
  277. <div class="popover-btn we7-margin-top-sm">
  278. <a href="javascript:;" class="btn btn-primary we7-margin-right-sm" onclick="delTag()">确定</a>
  279. <a href="javascript:;" class="btn btn-default popover-hide">取消</a>
  280. </div>
  281. </div>
  282. <div class="popover-group-list" >
  283. </div>
  284. <div class="text-right we7-margin-top">
  285. {$pager}
  286. </div>
  287. </div>
  288. <script>
  289. $("[data-toggle='popover']").on('show.bs.popover', function () {
  290. $("[aria-describedby]").popover('hide');
  291. });
  292. $(function(){
  293. var uid = '';
  294. $(".add-group").popover({
  295. placement : 'bottom',
  296. html : true,
  297. template : '<div class="popover we7-popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
  298. content : $('.popover-add-group').html(),
  299. });
  300. $(".edit-group").popover({
  301. placement : 'bottom',
  302. html : true,
  303. template : '<div class="popover we7-popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
  304. content : $('.popover-edit-group').html(),
  305. });
  306. $(".fans-group-del").popover({
  307. placement : 'bottom',
  308. html : true,
  309. template : '<div class="popover we7-popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
  310. content : $('.popover-del-group').html(),
  311. });
  312. $(".put-group").popover({
  313. placement : 'bottom',
  314. html : true,
  315. template : '<div class="popover we7-popover" role="tooltip" data-toggle="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content" ></div></div>',
  316. content : '' +
  317. '<div class="we7-form">' +
  318. '<div class="form-group row">'+
  319. {loop $fans_tag $tags}
  320. '<div class="col-sm-4" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"><input id="option{$tags['id']}" data-tag="{$tags['id']}" type="checkbox" name="tagname" value="{$tags['id']}" />' +
  321. '<label for="option{$tags['id']}">{$tags['name']} </label>' +
  322. '</div>' +
  323. {/loop}
  324. '</div>' +
  325. '</div>' +
  326. '<div class="popover-btn we7-margin-top-sm">' +
  327. '<a href="javascript:;" class="btn btn-primary we7-margin-right-sm" onclick="editFansTag()">确定</a>' +
  328. '<a href="javascript:;" class="btn btn-default popover-hide">取消</a>' +
  329. '</div>',
  330. });
  331. $(".batch-group").popover({
  332. placement : 'bottom',
  333. html : true,
  334. template : '<div class="popover we7-popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
  335. content : '' +
  336. '<div class="we7-form">' +
  337. '<div class="form-group">'+
  338. {loop $fans_tag $tags}
  339. '<input id="option{$tags['id']}" data-tag="{$tags['id']}" type="checkbox" name="tagname" value="{$tags['id']}" />' +
  340. '<label for="option{$tags['id']}">{$tags['name']} </label>' +
  341. {/loop}
  342. '</div>' +
  343. '</div>' +
  344. '<div class="popover-btn we7-margin-top-sm">' +
  345. '<a href="javascript:;" class="btn btn-primary we7-margin-right-sm" onclick="batchEditFansTag()">确定</a>' +
  346. '<a href="javascript:;" class="btn btn-default popover-hide">取消</a>' +
  347. '</div>',
  348. });
  349. $('body').on('click', '.popover-hide', function(){
  350. $("[data-toggle='popover']").popover('hide');
  351. });
  352. });
  353. $('.get-fans-tag').click(function() {
  354. fanid = $(this).data('id');
  355. groupid = $('[data-fanid="'+fanid+'"]').data('group');
  356. group = [];
  357. groupid = groupid.toString();
  358. group = groupid.split(',');
  359. $('.check-tag').attr('checked', '');
  360. for (var i = 0; i < group.length; i++) {
  361. $('[data-tag="'+group[i]+'"]').attr("checked",'checked');
  362. }
  363. $('[name="fanid"]').val(fanid);
  364. });
  365. batchEditFansTag = function() {
  366. $("[data-toggle='popover']").popover('hide');
  367. openids = $('.openid');
  368. openid = [];
  369. for(k in openids) {
  370. if (openids[k].checked) {
  371. openid.push(openids[k].value);
  372. }
  373. }
  374. tags = $('[name="tagname"]:checked');
  375. checktags = [];
  376. for(k in tags) {
  377. if (tags[k].checked) {
  378. checktags.push(tags[k].value);
  379. }
  380. }
  381. if (checktags.length > 3) {
  382. util.message('每个粉丝最多打3个标签', '', 'info');
  383. return false;
  384. }
  385. if (openid.length < 1) {
  386. util.message('请选择粉丝', '', 'info');
  387. return false;
  388. }
  389. if (checktags.length < 1) {
  390. util.message('请选择标签', '', 'info');
  391. return false;
  392. }
  393. $.post("{php echo url('mc/fans/batch_edit_fans_tag')}", {'openid' : openid, 'tag' : checktags}, function(data) {
  394. data = $.parseJSON(data);
  395. if (data.message.errno == 0) {
  396. util.message('修改成功', "{php echo url('mc/fans')}", 'success');
  397. } else {
  398. util.message(data.message.message.message, '', 'info');
  399. }
  400. });
  401. }
  402. editFansTag = function() {
  403. $("[data-toggle='popover']").popover('hide');
  404. tags = $('[name="tagname"]:checked');
  405. checktags = [];
  406. for(k in tags) {
  407. if (tags[k].checked) {
  408. checktags.push(tags[k].value);
  409. }
  410. }
  411. fanid = $('[name="fanid"]').val();
  412. $.post("{php echo url('mc/fans/edit_fans_tag')}", {'tags' : checktags, 'fanid' : fanid}, function(data) {
  413. data = $.parseJSON(data);
  414. if (data.message.errno == 0) {
  415. util.message('设置成功', "{php echo url('mc/fans')}", 'success');
  416. } else {
  417. util.message(data.message.message, "", 'info');
  418. }
  419. });
  420. }
  421. editTagName = function() {
  422. $("[data-toggle='popover']").popover('hide');
  423. tag = "{$fans_tag[$tag]['id']}";
  424. tag_name = $('[name="edittag"]').val();
  425. $.post("{php echo url('mc/fans/edit_tagname')}", {'tag' : tag, 'tag_name' : tag_name}, function(data) {
  426. data = $.parseJSON(data);
  427. if (data.message.errno == 0){
  428. util.message('修改成功', "{php echo url('mc/fans')}", 'success');
  429. } else {
  430. util.message(data.message.message, '', 'info');
  431. }
  432. });
  433. }
  434. delTag = function() {
  435. $("[data-toggle='popover']").popover('hide');
  436. tag = "{$fans_tag[$tag]['id']}";
  437. $.post("{php echo url('mc/fans/del_tag')}", {'tag' : tag}, function(data) {
  438. data = $.parseJSON(data);
  439. if (data.message.errno == 0) {
  440. util.message('删除成功', "{php echo url('mc/fans')}", 'success');
  441. } else {
  442. util.message(data.message.message, "", 'info');
  443. }
  444. });
  445. $("[data-toggle='popover']").popover('hide');
  446. };
  447. addTag = function() {
  448. $("[data-toggle='popover']").popover('hide');
  449. tag = $('[name="addtag"]').val();
  450. $.post("{php echo url('mc/fans/add_tag')}", {'tag' : tag}, function(data) {
  451. data = $.parseJSON(data);
  452. if (data.message.errno != 0) {
  453. util.message(data.message.message, '', 'info');
  454. return false;
  455. } else {
  456. util.message('添加成功', "{php echo url('mc/fans/display')}", 'ajax');
  457. return false;
  458. }
  459. });
  460. }
  461. window.onbeforeunload = function(e) {
  462. if(running) {
  463. return (e || window.event).returnValue = '正在进行微信素材数据同步,确定离开页面吗.';
  464. }
  465. }
  466. angular.module('fansApp').value('config', {
  467. 'addTagUrl' : "{php echo url('mc/fans/add_tag')}",
  468. 'syncAllUrl' : "{php echo url('mc/fans/download_fans')}",
  469. 'syncUrl' : "{php echo url('mc/fans/sync')}",
  470. 'msgUrl' : "{php echo url('mc/fans')}",
  471. 'searchMod' : "{$search_mod}",
  472. 'registerUrl' : "{php echo url('mc/fans/register')}"
  473. });
  474. angular.bootstrap($('#main'), ['fansApp']);
  475. </script>
  476. {/if}
  477. {template 'common/footer'}