user_analysis.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. {extend name="public/container"}
  2. {block name="head_top"}
  3. <link rel="stylesheet" href="{__PLUG_PATH}daterangepicker/daterangepicker.css">
  4. <link href="{__FRAME_PATH}css/plugins/footable/footable.core.css" rel="stylesheet">
  5. <script src="{__PLUG_PATH}sweetalert2/sweetalert2.all.min.js"></script>
  6. <script src="{__PLUG_PATH}moment.js"></script>
  7. <script src="{__PLUG_PATH}daterangepicker/daterangepicker.js"></script>
  8. <script src="{__PLUG_PATH}echarts.common.min.js"></script>
  9. <style>
  10. .btn-group-sm>.btn, .btn-sm{
  11. padding: 4px 10px;
  12. font-size: 12px;
  13. }
  14. .btn{
  15. padding: 4px 10px;
  16. font-size: 12px;
  17. }
  18. .search-form{
  19. margin-top: 0;
  20. }
  21. .search-form .search-item span{
  22. margin-right: 0;
  23. }
  24. .search-form .search-item{
  25. padding: 0;
  26. }
  27. .search-form .search-item-css{
  28. padding: 6px 0;
  29. }
  30. </style>
  31. {/block}
  32. {block name="content"}
  33. <div class="row">
  34. <div class="col-sm-12">
  35. <div class="ibox">
  36. <div class="ibox-content">
  37. <div class="row">
  38. <div class="m-b m-l">
  39. <form action="" class="form-inline search-form">
  40. <div class="search-item" data-name="date">
  41. <span>创建时间:</span>
  42. <button type="button" class="btn btn-outline btn-link" data-value="">本月</button>
  43. <button type="button" class="btn btn-outline btn-link" data-value="today">今天</button>
  44. <button type="button" class="btn btn-outline btn-link" data-value="week">本周</button>
  45. <button type="button" class="btn btn-outline btn-link" data-value="quarter">本季度</button>
  46. <button type="button" class="btn btn-outline btn-link" data-value="year">本年</button>
  47. <div class="datepicker" style="display: inline-block;">
  48. <button type="button" class="btn btn-outline btn-link" data-value="{$where.date?:'no'}">自定义</button>
  49. </div>
  50. <input class="search-item-value" type="hidden" name="date" value="{$where.date}" />
  51. </div>
  52. <div class="search-item search-item-css" data-name="status">
  53. <span>选择状态:</span>
  54. <button type="button" class="btn btn-outline btn-link" data-value="">默认</button>
  55. <button type="button" class="btn btn-outline btn-link" data-value="1">正常</button>
  56. <button type="button" class="btn btn-outline btn-link" data-value="0">锁定</button>
  57. <input class="search-item-value" type="hidden" name="status" value="{$where.status}" />
  58. </div>
  59. <div class="search-item search-item-css" data-name="is_promoter">
  60. <span>选择身份:</span>
  61. <button type="button" class="btn btn-outline btn-link" data-value="">全部</button>
  62. <button type="button" class="btn btn-outline btn-link" data-value="0">普通用户</button>
  63. <button type="button" class="btn btn-outline btn-link" data-value="1">推广用户</button>
  64. <input class="search-item-value" type="hidden" name="is_promoter" value="{$where.is_promoter}" />
  65. </div>
  66. {volist name='header' id='val'}
  67. <div class="col-sm-3">
  68. <div class="widget style1 {$val.color}-bg" style="height: 120px;">
  69. <div class="row" style="margin-top: 16px;padding: 0 20px;">
  70. <div class="col-xs-4">
  71. <i class="fa {$val.class} fa-5x"></i>
  72. </div>
  73. <div class="col-xs-8 text-right">
  74. <span> {$val.name} </span>
  75. <h2 class="font-bold">{$val.value}</h2>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. {/volist}
  81. </form>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. </div>
  87. </div>
  88. <div class="row">
  89. <div class="col-sm-12">
  90. <div class="col-sm-8">
  91. <div class="ibox float-e-margins">
  92. <div class="ibox-title">
  93. <h5>主要数据统计</h5>
  94. <div class="ibox-tools">
  95. <a class="collapse-link">
  96. <i class="fa fa-chevron-up"></i>
  97. </a>
  98. </div>
  99. <div class="ibox-content">
  100. <div data-hide="true" id="container" style="height: 390px;"></div>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. <div class="col-sm-4">
  106. <div class="ibox float-e-margins">
  107. <div class="ibox-title">
  108. <h5>消费统计</h5>
  109. <div class="ibox-tools">
  110. <a class="collapse-link">
  111. <i class="fa fa-chevron-up"></i>
  112. </a>
  113. </div>
  114. <div class="ibox-content" data-hide="true" id="user_index" style="height: 310px"></div>
  115. <div class="ibox-content" style="height: 115px">
  116. <div class="col-sm-6" style="border-right: 1px solid #CCCCCC">
  117. <p style="font-size: 12px">{$consume.rightTitle.title}</p>
  118. <p style="font-size: 16px;color:#ed5565"><i class="fa {$consume.rightTitle.icon}" style="padding-right: 10px;"></i>&nbsp;&nbsp;¥{$consume.rightTitle.number}</p>
  119. </div>
  120. <div class="col-sm-6">
  121. <p style="font-size: 12px">{$consume.leftTitle.title}</p>
  122. <p style="font-size: 16px;color:#23c6c8;"><i class="fa {$consume.leftTitle.icon}" style="padding-right: 10px;">&nbsp;&nbsp;{$consume.leftTitle.count}</i></p>
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. <div class="row">
  131. <div class="col-sm-4">
  132. <div class="ibox float-e-margins">
  133. <div class="ibox-title">
  134. <h5>用户分布</h5>
  135. <div class="ibox-tools">
  136. <a class="collapse-link">
  137. <i class="fa fa-chevron-up"></i>
  138. </a>
  139. </div>
  140. </div>
  141. <div class="ibox-content">
  142. <div id="distribution" style="height:290px;"></div>
  143. </div>
  144. </div>
  145. </div>
  146. <div class="col-sm-4">
  147. <div class="ibox float-e-margins">
  148. <div class="ibox-title">
  149. <h5>用户浏览分析(次)</h5>
  150. <div class="ibox-tools">
  151. <a class="collapse-link">
  152. <i class="fa fa-chevron-up"></i>
  153. </a>
  154. </div>
  155. </div>
  156. <div class="ibox-content">
  157. <div style="height:290px;" id='count'></div>
  158. </div>
  159. </div>
  160. </div>
  161. <div class="col-sm-4">
  162. <div class="ibox float-e-margins">
  163. <div class="ibox-title">
  164. <h5>消费排行榜 TOP20</h5>
  165. <div class="ibox-tools">
  166. <a class="collapse-link">
  167. <i class="fa fa-chevron-up"></i>
  168. </a>
  169. </div>
  170. </div>
  171. <div class="ibox-content" style="height:290px;overflow-y: scroll;background-color: #ffffff">
  172. <table class="table table-striped table-bordered">
  173. <thead>
  174. <tr>
  175. <th class="text-center">排名</th>
  176. <th class="text-center">用户名</th>
  177. <th class="text-center">时间</th>
  178. <th class="text-center">消费金额 ¥</th>
  179. <th class="text-center">余额 ¥</th>
  180. <th class="text-center">操作</th>
  181. </tr>
  182. </thead>
  183. <tbody>
  184. {volist name='user_null' id='vo'}
  185. <tr>
  186. <td class="text-center">{$key+1}</td>
  187. <td class="text-center">{$vo.nickname}</td>
  188. <td class="text-center">{$vo.add_time|date='Y-m-d H:i:s'}</td>
  189. <td class="text-center">{$vo.totel_number}</td>
  190. <td class="text-center">{$vo.now_money}</td>
  191. <td class="text-center">
  192. <button class="btn btn-info btn-xs" type="button" onclick="$eb.createModalFrame('编辑','{:Url('edit',array('uid'=>$vo['uid']))}')">
  193. <i class="fa fa-edit"></i> 编辑</button>
  194. </td>
  195. </tr>
  196. {/volist}
  197. {if !$user_null}
  198. <tr>
  199. <td colspan="6" class="text-center"><h4>暂无数据</h4></td>
  200. </tr>
  201. {/if}
  202. </tbody>
  203. </table>
  204. </div>
  205. </div>
  206. </div>
  207. </div>
  208. {/block}
  209. {block name="script"}
  210. <script src="{__FRAME_PATH}js/content.min.js?v=1.0.0"></script>
  211. <script>
  212. $('.search-item>.btn').on('click',function(){
  213. var that = $(this),value = that.data('value'),p = that.parent(),name = p.data('name'),form = p.parents();
  214. form.find('input[name="'+name+'"]').val(value);
  215. form.submit();
  216. });
  217. $('.search-item-value').each(function(){
  218. var that = $(this),name = that.attr('name'), value = that.val(),dom = $('.search-item[data-name="'+name+'"] .btn[data-value="'+value+'"]');
  219. dom.eq(0).removeClass('btn-outline btn-link').addClass('btn-primary btn-sm')
  220. .siblings().addClass('btn-outline btn-link').removeClass('btn-primary btn-sm')
  221. });
  222. (function(){
  223. var dom = document.getElementById("container"), myChart = echarts.init(dom), option = null;
  224. option = {
  225. tooltip: {trigger: 'axis'},
  226. toolbox: {left: 'right', feature: {restore: {}, saveAsImage: {}}},
  227. legend: {orient: 'horizontal', left: 'center', top: 25, data: <?php echo $user_index['name']?$user_index['name']:'false';?> || []},
  228. xAxis: {type: 'category', splitLine: {show: false}, data:<?php echo $user_index['date']?$user_index['date']:'false';?> || []},
  229. yAxis: {type: 'log',show :true,min:1},
  230. grid: {left: '3%', right: '4%', bottom: '3%', containLabel: true},
  231. series:<?php echo $user_index['series']?$user_index['series']:'false';?> || []
  232. <?php if($where['date']==null || $where['date']=='today'){?>
  233. ,dataZoom: [{
  234. endValue : <?php echo $where['date']=='today'?date('H',time()):date('d',time());?>
  235. }, {
  236. type: 'inside'
  237. }],
  238. <?php }?>
  239. };
  240. if (option && typeof option === "object") {
  241. myChart.setOption(option, true);
  242. }
  243. })();
  244. (function() {
  245. var dom = document.getElementById("user_index"), myChart = echarts.init(dom), option=null;
  246. option={
  247. title:{text:<?php echo empty($consume['series']['data'])?'false':json_encode($consume['title']);?> || '暂无数据'},
  248. tooltip: {trigger: 'item', formatter: "{a} <br/>{b}: {c} ({d}%)"},
  249. series: [<?php echo empty($consume['series']['data'])?'false':json_encode($consume['series']);?> || {name:'暂无数据',type:'pie',radius:['40%', '50%'],data:[{value:100,name:'暂无数据'}]}]
  250. };
  251. if (option && typeof option === "object"){
  252. myChart.setOption(option, true);
  253. }
  254. })();
  255. (function () {
  256. var distributionChart = echarts.init(document.getElementById("distribution"));
  257. option={
  258. tooltip: {trigger: 'item', formatter: "{a} <br/>{b}: {c} ({d}%)"},
  259. legend:{
  260. orient: 'vertical',
  261. x: 'left',
  262. data:<?php echo empty($form['legend_date'])?'false':json_encode($form['legend_date']);?> || [{name:'暂无数据',icon:'circle'}]
  263. },
  264. series: [
  265. {
  266. name:'<?php echo isset($form['legend_date'][0]['name'])?$form['legend_date'][0]['name']:'暂无数据';?>',
  267. type:'pie',
  268. radius: ['70%', '90%'],
  269. label: {
  270. normal: {
  271. show: false,
  272. position: 'center'
  273. },
  274. emphasis: {
  275. show: true,
  276. textStyle: {
  277. fontSize: '20',
  278. fontWeight: 'bold'
  279. }
  280. }
  281. },
  282. labelLine: {
  283. normal: {
  284. show: false
  285. }
  286. },
  287. data:<?php echo empty($form['series_date'])?'false':json_encode($form['series_date']);?> || [{value:100,name:'暂无数据'}]
  288. }
  289. ]
  290. };
  291. if (option && typeof option === "object") {
  292. distributionChart.setOption(option, true);
  293. }
  294. })();
  295. (function(){
  296. var option = {
  297. tooltip : {
  298. trigger: 'axis',
  299. axisPointer : {
  300. type : 'shadow'
  301. }
  302. },
  303. grid: {
  304. left: '3%',
  305. right: '4%',
  306. top: '4%',
  307. containLabel: true
  308. },
  309. yAxis : [
  310. {
  311. inverse:true,
  312. axisLine: {show: false},
  313. type : 'category',
  314. data : <?php echo empty($view['name'])?'false':json_encode($view['name'])?> || [],
  315. axisTick: {
  316. alignWithLabel: true
  317. }
  318. }
  319. ],
  320. xAxis : [
  321. {
  322. show:false,
  323. type : 'value'
  324. }
  325. ],
  326. series : [
  327. {
  328. name:'<?php echo isset($view['name'][0])?$view['name'][0]:'';?>',
  329. type:'bar',
  330. barWidth: '<?php if($view['name'][0]=='暂无数据'){echo '20%'; }else{ echo '50%';}?>',
  331. data:<?php echo empty($view['name'])?'false':json_encode($view['value']);?> || []
  332. },
  333. ]
  334. };
  335. var myChart = echarts.init(document.getElementById('count'),'light');
  336. myChart.setOption(option);
  337. })();
  338. $(".open_image").on('click',function (e) {
  339. var image = $(this).data('image');
  340. $eb.openImage(image);
  341. })
  342. var dateInput =$('.datepicker');
  343. dateInput.daterangepicker({
  344. autoUpdateInput: false,
  345. "opens": "center",
  346. "drops": "down",
  347. "ranges": {
  348. '今天': [moment(), moment().add(1, 'days')],
  349. '昨天': [moment().subtract(1, 'days'), moment()],
  350. '上周': [moment().subtract(6, 'days'), moment()],
  351. '前30天': [moment().subtract(29, 'days'), moment()],
  352. '本月': [moment().startOf('month'), moment().endOf('month')],
  353. '上月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
  354. },
  355. "locale" : {
  356. applyLabel : '确定',
  357. cancelLabel : '取消',
  358. fromLabel : '起始时间',
  359. toLabel : '结束时间',
  360. format : 'YYYY/MM/DD',
  361. customRangeLabel : '自定义',
  362. daysOfWeek : [ '日', '一', '二', '三', '四', '五', '六' ],
  363. monthNames : [ '一月', '二月', '三月', '四月', '五月', '六月',
  364. '七月', '八月', '九月', '十月', '十一月', '十二月' ],
  365. firstDay : 1
  366. }
  367. });
  368. dateInput.on('cancel.daterangepicker', function(ev, picker) {
  369. //$("input[name=limit_time]").val('');
  370. });
  371. dateInput.on('apply.daterangepicker', function(ev, picker) {
  372. $("input[name=date]").val(picker.startDate.format('YYYY/MM/DD') + ' - ' + picker.endDate.format('YYYY/MM/DD'));
  373. $('form').submit();
  374. });
  375. </script>
  376. {/block}