index.html 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>后台首页</title>
  7. <link rel="shortcut icon" href="favicon.ico">
  8. <link href="https://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
  9. <link href="https://cdn.staticfile.org/font-awesome/4.4.0/css/font-awesome.css?v=4.4.0" rel="stylesheet">
  10. <link href="https://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
  11. <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
  12. </head>
  13. <body class="gray-bg">
  14. <div class="wrapper wrapper-content">
  15. <div class="row">
  16. <div class="col-sm-2">
  17. <div class="ibox float-e-margins">
  18. <div class="ibox-title">
  19. <span class="label label-primary pull-right">今天</span>
  20. <h5>正在咨询的人数</h5>
  21. </div>
  22. <div class="ibox-content">
  23. <h1 class="no-margins">{$data['is_talking']}</h1>
  24. <div class="stat-percent font-bold text-navy"></div>
  25. <small></small>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="col-sm-2">
  30. <div class="ibox float-e-margins">
  31. <div class="ibox-title">
  32. <span class="label label-primary pull-right">今天</span>
  33. <h5>正在排队的用户</h5>
  34. </div>
  35. <div class="ibox-content">
  36. <h1 class="no-margins">{$data['in_queue']}</h1>
  37. <div class="stat-percent font-bold text-danger"></div>
  38. <small></small>
  39. </div>
  40. </div>
  41. </div>
  42. <div class="col-sm-2">
  43. <div class="ibox float-e-margins">
  44. <div class="ibox-title">
  45. <span class="label label-primary pull-right">今天</span>
  46. <h5>当前在线客服数</h5>
  47. </div>
  48. <div class="ibox-content">
  49. <h1 class="no-margins">{$data['online_kf']}</h1>
  50. <div class="stat-percent font-bold text-danger"></div>
  51. <small></small>
  52. </div>
  53. </div>
  54. </div>
  55. <div class="col-sm-2">
  56. <div class="ibox float-e-margins">
  57. <div class="ibox-title">
  58. <span class="label label-primary pull-right">今天</span>
  59. <h5>接入会话量</h5>
  60. </div>
  61. <div class="ibox-content">
  62. <h1 class="no-margins">{$data['success_in']}</h1>
  63. <div class="stat-percent font-bold text-danger"></div>
  64. <small></small>
  65. </div>
  66. </div>
  67. </div>
  68. <div class="col-sm-2">
  69. <div class="ibox float-e-margins">
  70. <div class="ibox-title">
  71. <span class="label label-primary pull-right">今天</span>
  72. <h5>总会话量</h5>
  73. </div>
  74. <div class="ibox-content">
  75. <h1 class="no-margins">{$data['total_in']}</h1>
  76. <div class="stat-percent font-bold text-danger"></div>
  77. <small></small>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. <div class="row">
  83. <div class="col-sm-8">
  84. <div class="ibox float-e-margins">
  85. <div class="ibox-title">
  86. <h5>今日数据分析</h5>
  87. </div>
  88. <div class="ibox-content no-padding">
  89. <div class="ibox-content" style="height: 350px" id="main">
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. <div class="col-sm-4">
  95. <div class="ibox float-e-margins">
  96. <div class="ibox-title">
  97. <h5>系统说明</h5>
  98. </div>
  99. <div class="ibox-content">
  100. <p>whisper客服系统:
  101. 为了让更多的站长拥有自己可以控制的客服系统而开发的。
  102. </p>
  103. <div class="alert alert-info">
  104. 您可以通过<a href="baiyf.com" target="_blank"> 这里 </a> 查看详细的文档,以及更新说明。
  105. </div>
  106. <p>
  107. whisper采取一次授权终身免费升级的策略。
  108. </p>
  109. <div class="alert alert-info">
  110. 作者私人 QQ:876337011。 邮箱: 876337011@qq.com
  111. </div>
  112. <div class="alert alert-danger">
  113. 一切未授权就使用的用户,本人保留追究责任的权利!
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. <script src="https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js"></script>
  121. <script src="https://cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  122. <script src="/static/admin/js/plugins/echarts/echarts.min.js"></script>
  123. <script src="/static/customer/js/md5.js"></script>
  124. <script type="text/javascript">
  125. var data = {$show_data};
  126. // 基于准备好的dom,初始化echarts实例
  127. var myChart = echarts.init(document.getElementById('main'));
  128. // 指定图表的配置项和数据
  129. var option = {
  130. tooltip: {
  131. trigger: 'axis'
  132. },
  133. legend: {
  134. data:['正在咨询的会员','排队的会员','接入会话量','总会话量']
  135. },
  136. grid: {
  137. left: '3%',
  138. right: '4%',
  139. bottom: '3%',
  140. containLabel: true
  141. },
  142. toolbox: {
  143. feature: {
  144. saveAsImage: {}
  145. }
  146. },
  147. xAxis: {
  148. type: 'category',
  149. boundaryGap: false,
  150. data: ['08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00',
  151. '18:00','19:00','20:00','21:00','22:00']
  152. },
  153. yAxis: {
  154. type: 'value'
  155. },
  156. series: [
  157. {
  158. name:'正在咨询的会员',
  159. type:'line',
  160. stack: '总量',
  161. data: data.is_talking
  162. },
  163. {
  164. name:'排队的会员',
  165. type:'line',
  166. stack: '总量',
  167. data: data.in_queue
  168. },
  169. {
  170. name:'接入会话量',
  171. type:'line',
  172. stack: '总量',
  173. data: data.success_in
  174. },
  175. {
  176. name:'总会话量',
  177. type:'line',
  178. stack: '总量',
  179. data: data.total_in
  180. }
  181. ]
  182. };
  183. // 使用刚指定的配置项和数据显示图表。
  184. myChart.setOption(option);
  185. </script>
  186. <!--webSocket-->
  187. <script>
  188. let config = {
  189. socket: '{$socket}',
  190. token: '{$token}',
  191. };
  192. let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
  193. let getLocation = window.location.href;
  194. let host = getLocation.split('/admin')[0];
  195. let apiToken = hex_md5('customer-service'+date+host);
  196. let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
  197. socket.onopen = function(res) {
  198. console.log('握手成功');
  199. // 登录
  200. let login_data = JSON.stringify({
  201. type: 'adminInit',
  202. token: config.token
  203. });
  204. socket.send(login_data);
  205. };
  206. socket.onmessage = function(res) {
  207. var data = eval("("+res.data+")");
  208. switch(data['message_type']){
  209. // 服务端ping客户端
  210. case 'helloMessage':
  211. console.log(data);
  212. break;
  213. }
  214. };
  215. </script>
  216. </body>
  217. </html>