blade 6 rokov pred
rodič
commit
a5d5459f7b
100 zmenil súbory, kde vykonal 6536 pridanie a 923 odobranie
  1. 29 0
      application/404.html
  2. 2 0
      application/admin/config.php
  3. 28 6
      application/admin/controller/Accounts.php
  4. 35 13
      application/admin/controller/Admins.php
  5. 15 0
      application/admin/controller/Base.php
  6. 121 0
      application/admin/controller/Clean.php
  7. 17 10
      application/admin/controller/Groups.php
  8. 19 22
      application/admin/controller/Index.php
  9. 198 0
      application/admin/controller/Iplimit.php
  10. 64 9
      application/admin/controller/Kfnotice.php
  11. 10 0
      application/admin/controller/Login.php
  12. 236 0
      application/admin/controller/Material.php
  13. 113 43
      application/admin/controller/Messages.php
  14. 2 2
      application/admin/controller/Report.php
  15. 29 6
      application/admin/controller/Robot.php
  16. 47 5
      application/admin/controller/Sensitivec.php
  17. 219 67
      application/admin/controller/Settings.php
  18. 241 0
      application/admin/controller/SettingsOld.php
  19. 313 56
      application/admin/controller/System.php
  20. 86 16
      application/admin/controller/Users.php
  21. 37 6
      application/admin/controller/Words.php
  22. 1 1
      application/admin/model/Accountsmessage.php
  23. 45 0
      application/admin/model/Reply.php
  24. 19 2
      application/admin/view/accounts/addlabel.html
  25. 11 11
      application/admin/view/accounts/edit.html
  26. 18 1
      application/admin/view/accounts/editlabel.html
  27. 17 9
      application/admin/view/accounts/index.html
  28. 20 3
      application/admin/view/accounts/label.html
  29. 1 1
      application/admin/view/admins/addadmin.html
  30. 1 1
      application/admin/view/admins/addpower.html
  31. 1 1
      application/admin/view/admins/editadmin.html
  32. 1 1
      application/admin/view/admins/editpower.html
  33. 5 5
      application/admin/view/admins/index.html
  34. 3 3
      application/admin/view/admins/power.html
  35. 144 0
      application/admin/view/clean/index.html
  36. 18 1
      application/admin/view/groups/addgroup.html
  37. 18 1
      application/admin/view/groups/editgroup.html
  38. 20 3
      application/admin/view/groups/index.html
  39. 3 2
      application/admin/view/index.html
  40. 267 244
      application/admin/view/index/index.html
  41. 146 0
      application/admin/view/iplimit/add.html
  42. 122 0
      application/admin/view/iplimit/edit.html
  43. 272 0
      application/admin/view/iplimit/index.html
  44. 19 10
      application/admin/view/kfnotice/add.html
  45. 86 19
      application/admin/view/kfnotice/index.html
  46. 1 1
      application/admin/view/kfonitoring/cpkfjiankong.html
  47. 2 2
      application/admin/view/kfonitoring/index.html
  48. 51 0
      application/admin/view/login/aaaa.html
  49. 1 0
      application/admin/view/login/index.html
  50. 154 0
      application/admin/view/material/add.html
  51. 200 0
      application/admin/view/material/index.html
  52. 2 2
      application/admin/view/menu/index.html
  53. 1 1
      application/admin/view/messages/add.html
  54. 78 11
      application/admin/view/messages/detail.html
  55. 1 1
      application/admin/view/messages/edit.html
  56. 36 18
      application/admin/view/messages/index.html
  57. 3 3
      application/admin/view/messages/type.html
  58. 44 10
      application/admin/view/report/attendancereport.html
  59. 2 2
      application/admin/view/report/index.html
  60. 16 8
      application/admin/view/report/workreport.html
  61. 1 1
      application/admin/view/reportForm/index.html
  62. 1 1
      application/admin/view/robot/addword.html
  63. 1 1
      application/admin/view/robot/editword.html
  64. 60 15
      application/admin/view/robot/index.html
  65. 1 1
      application/admin/view/sensitivec/addsensitive.html
  66. 1 1
      application/admin/view/sensitivec/editsensitive.html
  67. 85 17
      application/admin/view/sensitivec/index.html
  68. 42 10
      application/admin/view/settings/add.html
  69. 189 0
      application/admin/view/settings/demo.html
  70. 43 11
      application/admin/view/settings/edit.html
  71. 189 0
      application/admin/view/settings/entrancelist.html
  72. 108 48
      application/admin/view/settings/index.html
  73. 197 0
      application/admin/view/settings/indexOld.html
  74. 204 0
      application/admin/view/system/addwelcome.html
  75. 108 17
      application/admin/view/system/basics.html
  76. 26 9
      application/admin/view/system/conversation.html
  77. 205 0
      application/admin/view/system/editwelcome.html
  78. 146 0
      application/admin/view/system/platform.html
  79. 17 0
      application/admin/view/system/reply.html
  80. 138 0
      application/admin/view/system/welcoming.html
  81. 49 32
      application/admin/view/system/wordslog.html
  82. 80 15
      application/admin/view/users/adduser.html
  83. 98 14
      application/admin/view/users/edituser.html
  84. 35 9
      application/admin/view/users/index.html
  85. 1 1
      application/admin/view/words/addword.html
  86. 1 1
      application/admin/view/words/editword.html
  87. 66 16
      application/admin/view/words/index.html
  88. 102 0
      application/common.php
  89. 19 6
      application/common/KfjkLogic.php
  90. 14 2
      application/config.php
  91. 4 4
      application/database.php
  92. 2 2
      application/index/controller/Common.php
  93. 4 3
      application/index/controller/Index.php
  94. 23 4
      application/index/controller/Message.php
  95. 58 16
      application/index/controller/Register.php
  96. 239 20
      application/index/controller/User.php
  97. 15 0
      application/redis.php
  98. 4 2
      application/service/controller/Common.php
  99. 171 2
      application/service/controller/History.php
  100. 78 3
      application/service/controller/Index.php

+ 29 - 0
application/404.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+	<title>404 not find</title>
+	<style type="text/css">
+		*{
+			margin: 0px;
+			padding: 0px;
+		}
+		div{
+			font-size: 256px;
+			height: 320px;
+			line-height: 320px;
+			width: 500px;
+			text-align: center;
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			margin-top: -160px;
+			margin-left: -250px;
+			color: white;
+		}
+	</style>
+</head>
+<body style="background-color: #000000;">
+	<div>404</div>
+</body>
+</html>

+ 2 - 0
application/admin/config.php

@@ -7,6 +7,8 @@ return [
         '__CSS__' => '/static/admin/css',
         '__JS__'  => '/static/admin/js',
         '__IMG__' => '/static/admin/images',
+        '__EDIT__' => '/static/kindeditor',
+        '__ENTRANCE__' => '/static/entranceJs',
     ],
 
     // 客服状态

+ 28 - 6
application/admin/controller/Accounts.php

@@ -158,6 +158,10 @@ class Accounts extends Base
                 }
             }
 
+            if($param['label_id'] == 0){
+                return json(['code' => -10, 'data' => '', 'msg' => '请选择用户标签']);
+            }
+
             $info['nick_name'] = $param['nick_name'];
             $info['account_email'] = $param['account_email'];
             $info['account_phone'] = $param['account_phone'];
@@ -167,8 +171,16 @@ class Accounts extends Base
             if(!empty($param['user_id']) && $param['user_id'] != 0){
                 $info['user_id'] = $param['user_id'];
             }
+            $update = array();
+            $update['nick_name'] = $param['nick_name'];
+            $update['email'] = $param['account_email'];
+            $update['phone'] = $param['account_phone'];
             try{
                 db('accounts')->where('id', $param['id'])->update($info);
+                $accounts = db('accountsmessage')->where('account_id', $param['id'])->select();
+                if(!empty($accounts)){
+                    db('accountsmessage')->where('account_id', $param['id'])->update($update);
+                }
             }catch(\Exception $e){
                 return json(['code' => -6, 'data' => '', 'msg' => $e->getMessage()]);
             }
@@ -228,7 +240,7 @@ class Accounts extends Base
     {
         //$operate = '<a href="javascript:resetPwd(' . $id . ')"><button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 重置密码</button></a>';
 
-        $operate = '<a style="margin-left:5px;" href="' . url('Accounts/edit', ['id' => $id]) . '"><button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate = '<a style="margin-left:5px;" href="' . url('Accounts/edit', ['id' => $id]) . '"><button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
 //        $operate .= '<a href="javascript:accountDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
 //        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
@@ -247,18 +259,25 @@ class Accounts extends Base
 //            if (strlen($param['searchText'])) {
 //                $where['name'] = ['like', '%' . $param['searchText'] . '%'];
 //            }
-            $result = db('accountslabel')->where($where)->limit($offset, $limit)->order('add_time', 'desc')->select();
+            $result = db('accountslabel')->where($where)->limit($offset, $limit)->order('id', 'asc')->select();
 
             foreach($result as $key=>$vo){
                 $result[$key]['add_time'] = date('Y-m-d H:i:s',$result[$key]['add_time']);
 
                 // 生成操作按钮
-                $result[$key]['operate'] = $this->makeBtnLabel($vo['id']);
+                if($vo['id'] != 1){
+                    $result[$key]['operate'] = $this->makeBtnLabel($vo['id']);
+                }else{
+                    $result[$key]['operate'] = $operate = '<a style="margin-left:5px;" href="' . url('Accounts/editlabel', ['id' => $vo['id']]) . '"><button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
+                }
             }
             $return['total'] = db('accountslabel')->count();  //总数据
             $return['rows'] = $result;
             return json($return);
         }
+        $this->assign([
+            'socket' => config('socket'),
+        ]);
         return $this->fetch();
     }
 
@@ -282,7 +301,8 @@ class Accounts extends Base
             return json(['code' => 1, 'data' => '', 'msg' => '添加用户标签成功']);
         }
         $this->assign([
-            'status' => config('kf_status')
+            'status' => config('kf_status'),
+            'socket' => config('socket'),
         ]);
         return $this->fetch();
     }
@@ -313,6 +333,7 @@ class Accounts extends Base
         $this->assign([
             'label' => $label,
             'id' => $id,
+            'socket' => config('socket'),
             'status' => config('kf_status')
         ]);
         return $this->fetch();
@@ -326,6 +347,7 @@ class Accounts extends Base
             $id = input('param.id/d');
 
             try {
+                db('accounts')->where('label_id', $id)->update(['label_id'=>1]);
                 db('accountslabel')->where('id', $id)->delete();
             } catch (\Exception $e) {
                 return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
@@ -337,10 +359,10 @@ class Accounts extends Base
     // 生成标签按钮
     private function makeBtnLabel($id)
     {
-        $operate = '<a style="margin-left:5px;" href="' . url('Accounts/editlabel', ['id' => $id]) . '"><button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate = '<a style="margin-left:5px;" href="' . url('Accounts/editlabel', ['id' => $id]) . '"><button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:labelDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }

+ 35 - 13
application/admin/controller/Admins.php

@@ -40,12 +40,19 @@ class Admins extends Base
                     }
                 }
                 // 优化显示状态
-                if (1 == $vo['status']) {
-                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
-                } else {
-                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+                if(1 == $vo['status']){
+                    $result[$key]['status'] = '<span style="color: #2fbe1b">启用</span>';
+                }else{
+                    $result[$key]['status'] = '<span style="color: red">禁用</span>';
                 }
 
+//                // 优化显示状态
+//                if (1 == $vo['status']) {
+//                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+//                } else {
+//                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+//                }
+
                 // 上次登录时间
                 $result[$key]['last_login_time'] = empty($vo['last_login_time']) ? '' : date('Y-m-d H:i:s', $vo['last_login_time']);
 
@@ -174,12 +181,19 @@ class Admins extends Base
             $result = db('admingroup')->limit($offset, $limit)->select();
             foreach ($result as $key => $vo) {
                 // 优化显示状态
-                if (1 == $vo['status']) {
-                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
-                } else {
-                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+
+                if(1 == $vo['status']){
+                    $result[$key]['status'] = '<span style="color: #2fbe1b">启用</span>';
+                }else{
+                    $result[$key]['status'] = '<span style="color: red">禁用</span>';
                 }
 
+//                if (1 == $vo['status']) {
+//                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+//                } else {
+//                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+//                }
+
                 // 上次登录时间
                 $result[$key]['addtime'] = date('Y-m-d H:i:s', $vo['addtime']);
 
@@ -350,12 +364,16 @@ class Admins extends Base
         if (request()->isAjax()) {
             $id = input('param.id/d');
             //return $id;
+            $admins = db('admins')->where('group_id', $id)->select();
+            if(!empty($admins)){
+                return json(['code' => -1, 'data' => '', 'msg' => '请先移除该权限组下的管理员再删除']);
+            }
 
             try {
                 db('admingroup')->where('group_id', $id)->delete();
                 db('admingrouppower')->where('group_id', $id)->delete();
             } catch (\Exception $e) {
-                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
             }
 
             return json(['code' => 1, 'data' => '', 'msg' => '删除权限组成功']);
@@ -366,10 +384,12 @@ class Admins extends Base
     private function makeBtn($id)
     {
         $operate = '<a href="' . url('admins/editadmin', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+//        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:adminDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+//        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }
@@ -378,10 +398,12 @@ class Admins extends Base
     private function makeBtnPower($id)
     {
         $operate = '<a href="' . url('admins/editpower', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+//        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:powerDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+//        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }

+ 15 - 0
application/admin/controller/Base.php

@@ -25,12 +25,27 @@ class Base extends Controller
                 }
             }
         }
+        $settings = db('settings')->where('id',1)->find();
+        if($settings['kf_white_list'] == 'on'){
+            $settings['white_list'] = '关闭客服白名单';
+        }else{
+            $settings['white_list'] = '开启客服白名单';
+        }
+        if($settings['account_black_list'] == 'on'){
+            $settings['black_list'] = '关闭用户黑名单';
+        }else{
+            $settings['black_list'] = '开启用户黑名单';
+        }
+
+        $material = db('material')->select();
 
         $this->assign([
             'version' => config('version'),
             'socket' =>config('socket'),
             'menu' =>$menu,
             'admin' =>$admin,
+            'settings' =>$settings,
+            'material' =>$material,
         ]);
     }
 }

+ 121 - 0
application/admin/controller/Clean.php

@@ -0,0 +1,121 @@
+<?php
+namespace app\admin\controller;
+
+use think\Db;
+
+/**
+ * 管理系统系统设置类
+ */
+class Clean extends Base
+{
+    /**
+     *数据清理
+     *
+     * @access public
+     */
+    public function index()
+    {
+        // 表单提交.
+        if (request()->isPost()) {
+            $param = input('post.');
+            //聊天数据
+            $del_time = '';
+            if($param['chat_data'] == 'one_month'){
+                $del_time = time()-2592000;
+            }
+            if($param['chat_data'] == 'three_month'){
+                $del_time = time()-7776000;
+            }
+            if($param['chat_data'] == 'six_month'){
+                $del_time = time()-15552000;
+            }
+            if($param['chat_data'] == 'one_year'){
+                $del_time = time()-31104000;
+            }
+
+            //客服操作记录
+            $delete_time = '';
+            if($param['operational_records'] == 'half_year'){
+                $delete_time = date('Y-m-d',time()-15552000);
+            }
+            if($param['operational_records'] == 'one_year'){
+                $delete_time = date('Y-m-d',time()-31104000);
+            }
+            if($param['operational_records'] == 'three_year'){
+                $delete_time = date('Y-m-d',time()-93312000);
+            }
+
+            if($del_time != ''){
+                $servicelog = array();
+                $servicelog_id = db('service_log')->field('servicelog_id')->where('start_time','<',$del_time)->select();
+                for($i=0;$i<count($servicelog_id);$i++){
+                    $servicelog[] = $servicelog_id[$i]['servicelog_id'];
+                }
+                if($delete_time != ''){
+                    // 启动事务
+                    Db::startTrans();
+                    try {
+                        //聊天数据清理
+                        db('service_log')->where('start_time','<',$del_time)->delete();
+                        db('chat_log')->where('servicelog_id','in',$servicelog)->delete();
+                        db('alarm')->where('servicelog_id','in',$servicelog)->delete();
+                        //客服操作记录清理
+                        db('kfonlinehistory')->where('wday','<',$delete_time)->delete();
+                        db('kfstatetimes')->where('sday','<',$delete_time)->delete();
+                        db('service_data')->where('add_date','<',$delete_time)->delete();
+                        db('servicetimelog')->where('cdate','<',$delete_time)->delete();
+                        // 提交事务
+                        Db::commit();
+                        return json(['code' => 1, 'data' => '', 'msg' => '数据清理成功']);
+                    } catch (\Exception $e) {
+                        // 回滚事务
+                        Db::rollback();
+                        return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+                    }
+                }else{
+                    // 启动事务
+                    Db::startTrans();
+                    try {
+                        db('service_log')->where('start_time','<',$del_time)->delete();
+                        db('chat_log')->where('servicelog_id','in',$servicelog)->delete();
+                        db('alarm')->where('servicelog_id','in',$servicelog)->delete();
+                        // 提交事务
+                        Db::commit();
+                        return json(['code' => 1, 'data' => '', 'msg' => '聊天数据清理成功']);
+                    } catch (\Exception $e) {
+                        // 回滚事务
+                        Db::rollback();
+                        return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+                    }
+                }
+            }else{
+                if($delete_time != ''){
+                    // 启动事务
+                    Db::startTrans();
+                    try {
+                        db('kfonlinehistory')->where('wday','<',$delete_time)->delete();
+                        db('kfstatetimes')->where('sday','<',$delete_time)->delete();
+                        db('service_data')->where('add_date','<',$delete_time)->delete();
+                        db('servicetimelog')->where('cdate','<',$delete_time)->delete();
+                        // 提交事务
+                        Db::commit();
+                        return json(['code' => 1, 'data' => '', 'msg' => '客服操作记录清理成功']);
+                    } catch (\Exception $e) {
+                        // 回滚事务
+                        Db::rollback();
+                        return json(['code' => -3, 'data' => '', 'msg' => $e->getMessage()]);
+                    }
+                }else{
+                    return json(['code' => -4, 'data' => '', 'msg' => '请选择时间']);
+                }
+            }
+        }
+
+        $this->assign([
+                'status' => config('kf_status'),
+        ]);
+
+        return $this->fetch();
+
+    }
+}

+ 17 - 10
application/admin/controller/Groups.php

@@ -17,17 +17,17 @@ class Groups extends Base
             foreach($result as $key=>$vo){
                 // 优化显示状态
                 if(1 == $vo['status']){
-                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+                    $result[$key]['status'] = '<span style="color: #2fbe1b">启用</span>';
                 }else{
-                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+                    $result[$key]['status'] = '<span style="color: red">禁用</span>';
                 }
 
-                // 优化显示状态
-                if(1 == $vo['status']){
-                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
-                }else{
-                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
-                }
+//                // 优化显示状态
+//                if(1 == $vo['status']){
+//                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+//                }else{
+//                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+//                }
 
                 // 统计分组人数
                 $result[$key]['users_num'] = db('users')->where('group_id', $vo['id'])->count();
@@ -42,6 +42,9 @@ class Groups extends Base
             return json($return);
 
         }
+        $this->assign([
+            'socket' => config('socket'),
+        ]);
 
         return $this->fetch();
     }
@@ -68,6 +71,7 @@ class Groups extends Base
         }
 
         $this->assign([
+            'socket' => config('socket'),
             'status' => config('kf_status')
         ]);
 
@@ -101,6 +105,7 @@ class Groups extends Base
 
         $this->assign([
             'info' => $info,
+            'socket' => config('socket'),
             'status' => config('kf_status')
         ]);
         return $this->fetch('editgroup');
@@ -138,10 +143,12 @@ class Groups extends Base
     private function makeBtn($id)
     {
         $operate = '<a href="' . url('groups/editgroup', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        //$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:userGroup(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+//        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         //$operate .= '<a href="' . url('groups/manageUser') . '">';
         //$operate .= '<button type="button" class="btn btn-info btn-sm"><i class="fa fa-user-plus"></i> 管理组员</button></a>';

+ 19 - 22
application/admin/controller/Index.php

@@ -90,44 +90,41 @@ class Index extends Base
     // 修改管理员密码
     public function changePassword()
     {
-        $token = input("param.token/s");
-        $res = model('Admins')->checktoken($token);
-        if($res == -1){
-            return $res;
-        }
-        $user_id = $res;
+//        $token = session('token');
+//        $res = model('Admins')->checktoken($token);
+//        if($res == -1){
+//            return $res;
+//        }
+//        $user_id = $res;
+
+        $user_id = session('user_id');
 
         if(request()->isPost()){
 
             $param = input('post.');
-            $reLogin = false;
 
-            if(empty($param['old_pwd']) && !empty($param['password'])){
+            if(empty($param['old_pwd'])){
                 return json(['code' => -2, 'data' => '', 'msg' => '请输入旧密码']);
             }
 
-            if(!empty($param['old_pwd']) && empty($param['password'])){
+            if(empty($param['password'])){
                 return json(['code' => -3, 'data' => '', 'msg' => '请输入新密码']);
             }
 
-            if(!empty($param['old_pwd']) && !empty($param['password'])){
-
-                $userPwd = db('admins')->where('id', $user_id)->find();
-                if(empty($userPwd)){
-                    return json(['code' => -4, 'data' => '', 'msg' => '管理员不存在']);
-                }
-
-                if(md5($param['old_pwd'] . config('salt')) != $userPwd['password']){
-                    return json(['code' => -1, 'data' => '', 'msg' => '旧密码错误']);
-                }
+            $userPwd = db('admins')->where('id', $user_id)->find();
+            if(empty($userPwd)){
+                return json(['code' => -4, 'data' => '', 'msg' => '管理员不存在']);
+            }
 
-                $info['password'] = md5($param['password'] . config('salt'));
-                $reLogin = true;
+            if(md5($param['old_pwd'] . config('salt')) != $userPwd['password']){
+                return json(['code' => -1, 'data' => '', 'msg' => '旧密码错误']);
             }
 
+            $info['password'] = md5($param['password'] . config('salt'));
+
             db('admins')->where('id', $user_id)->setField('password', $info['password']);
 
-            return json(['code' => 1, 'data' => $reLogin, 'msg' => '修改信息成功']);
+            return json(['code' => 1, 'data' => '', 'msg' => '修改密码成功']);
         }
     }
 

+ 198 - 0
application/admin/controller/Iplimit.php

@@ -0,0 +1,198 @@
+<?php
+namespace app\admin\controller;
+
+class Iplimit extends Base
+{
+    //访问ip管理
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $param  = input('param.');
+            $limit  = $param['pageSize'];
+            $offset = (($param['pageNumber'] - 1) * $limit);
+            $where['object'] = $param['type'];
+            if (strlen($param['searchText'])) {
+                $ip = bindec(decbin(ip2long($param['searchText'])));
+                $where['ip'] = ['like', '%' . $param['searchText'] . '%'];
+                $res = db('iplimit')->where('start_ip','<',$ip)->where('end_ip','>',$ip)->where('object',$param['type'])->limit($offset, $limit)->select();
+            }
+
+            $result = db('iplimit')->where($where)->limit($offset, $limit)->select();
+            if(!empty($res)){
+                for($i=0;$i<count($res);$i++){
+                    $result[] = $res[$i];
+                }
+            }
+//            array_unique($result, SORT_REGULAR);
+
+            $admins = db('admins')->select();
+            foreach ($result as $key => $vo) {
+
+                for($i=0;$i<count($admins);$i++){
+                    if($vo['admin_id'] == $admins[$i]['id']){
+                        $result[$key]['admin'] = $admins[$i]['user_name'];
+                    }
+                }
+
+                if($vo['ip'] == ''){
+                    $result[$key]['ip'] = $result[$key]['start_ip'].' - '.$result[$key]['end_ip'];
+                }
+
+                // 生成操作按钮.
+                $result[$key]['operate'] = $this->makeBtn($vo['id']);
+            }
+
+            // 总数据.
+            $return['total'] = count($result);  //总数据
+//            $return['total'] = db('iplimit')->where($where)->count();  //总数据
+            $return['rows'] = $result;
+
+            return json($return);
+
+        }
+
+        return $this->fetch();
+    }
+
+    //访问ip添加
+    public function add(){
+        if(request()->isPost()){
+
+            $param     = input('post.');
+            $findWhere = [
+                'ip' => $param['ip'],
+                'object'  => $param['object'],
+            ];
+
+            $has = db('iplimit')->where($findWhere)->find();
+            if (empty($has) === false) {
+                return json(['code' => -1, 'data' => '', 'msg' => '该ip已经存在']);
+            }
+
+            if(strpos($param['ip'], '-') !== false){
+                $ip = explode('-',$param['ip']);
+                //将ip地址转换成int型
+                $param['start_ip'] = bindec(decbin(ip2long($ip[0])));
+                $param['end_ip'] = bindec(decbin(ip2long($ip[1])));
+            }
+            $param['ctime'] = date('Y-m-d H:i:s',time());
+            $param['utime']  = date('Y-m-d H:i:s',time());
+            $param['admin_id']  = session('user_id');
+
+
+            try {
+                db('iplimit')->insert($param);
+            } catch(\Exception $e) {
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '添加访问ip成功']);
+        }
+
+        $this->assign([
+            'status' => config('kf_status')
+        ]);
+
+        return $this->fetch();
+    }
+
+    //访问ip编辑
+    public function edit(){
+        if(request()->isAjax()){
+
+            $param = input('post.');
+
+            // 检测用户修改的管理员是否重复
+            $has = db('iplimit')->where('ip', $param['ip'])->where('id', $param['id'])->find();
+            if(!empty($has)){
+                return json(['code' => -1, 'data' => '', 'msg' => '该访问ip已经存在']);
+            }
+
+            if(strpos($param['ip'], '-') !== false){
+                $ip = explode('-',$param['ip']);
+                //将ip地址转换成int型
+                $param['start_ip'] = bindec(decbin(ip2long($ip[0])));
+                $param['end_ip'] = bindec(decbin(ip2long($ip[1])));
+            }
+            $param['ctime'] = date('Y-m-d H:i:s',time());
+            $param['utime']  = date('Y-m-d H:i:s',time());
+            $param['admin_id']  = session('user_id');
+
+            try{
+                db('iplimit')->where('id', $param['id'])->update($param);
+            }catch(\Exception $e){
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '编辑访问ip成功']);
+        }
+
+        $id = input('param.id/d');
+        $info = db('iplimit')->where('id', $id)->find();
+
+        $this->assign([
+            'info' => $info,
+            'status' => config('kf_status')
+        ]);
+        return $this->fetch();
+    }
+
+    //删除
+    public function del(){
+        if(request()->isAjax()){
+            $id = input('param.id/d');
+            // return $id;
+
+            try{
+                db('iplimit')->where('id', $id)->delete();
+            }catch(\Exception $e){
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '删除ip成功']);
+        }
+    }
+
+    //开启/关闭ip限制
+    public function disjunctor(){
+        if(request()->isAjax()){
+            $disjunctor = input('param.disjunctor');
+            $type = input('param.type');
+            try{
+                if($disjunctor == 'on' && $type == 'kf'){
+                    $msg = '开启客服白名单';
+                    db('settings')->where('id', 1)->update(['kf_white_list'=>$disjunctor]);
+                }
+                if($disjunctor == 'off' && $type == 'kf'){
+                    $msg = '关闭客服白名单';
+                    db('settings')->where('id', 1)->update(['kf_white_list'=>$disjunctor]);
+                }
+                if($disjunctor == 'on' && $type == 'account'){
+                    $msg = '开启用户黑名单';
+                    db('settings')->where('id', 1)->update(['account_black_list'=>$disjunctor]);
+                }
+                if($disjunctor == 'off' && $type == 'account'){
+                    $msg = '关闭用户黑名单';
+                    db('settings')->where('id', 1)->update(['account_black_list'=>$disjunctor]);
+                }
+            }catch(\Exception $e){
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => $msg.'成功']);
+        }
+    }
+
+    // 生成按钮
+    private function makeBtn($id)
+    {
+        $operate = '<a href="' . url('iplimit/edit', ['id' => $id]) . '">';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
+
+        $operate .= '<a href="javascript:Del(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= ' 删除</button></a> ';
+
+        return $operate;
+    }
+
+}

+ 64 - 9
application/admin/controller/Kfnotice.php

@@ -65,20 +65,72 @@ class Kfnotice extends Base
 
             $model = new ServicenoticeModel();
             if (!$bibao) {
-                $result = $model->where($where)->limit($offset, $limit)->order('id', 'desc')->select();
+                $result = $model->where($where)->limit($offset, $limit)->order('sendtime', 'desc')->select();
             } else {
                 $result = $model->where($where)->where(function ($query) use ($biaaodata) {
                     $query->where(['sendtime' => ['>=', $biaaodata['0']]])->where(['sendtime' => ['<=', $biaaodata['1']]]);
-                })->limit($offset, $limit)->order('id', 'desc')->select();
+                })->limit($offset, $limit)->order('sendtime', 'desc')->select();
+            }
+
+            //管理员
+            $admins = db('admins')->select();
+            $adminKey = [];
+            foreach ($admins as $nowadmin) {
+                $adminKey[$nowadmin['id']] = $nowadmin;
+            }
+
+            //客服
+            $users = db('users')->select();
+            $userKey = [];
+            foreach ($users as $nowuser) {
+                $userKey[$nowuser['id']] = $nowuser;
             }
 
 
             foreach ($result as $key => $vo) {
                 $vo->readtime = empty($vo->readtime) ? '' : date('Y-m-d H:i:s', $vo->readtime);
-                $vo->uid = $vo->kfuser->user_name;
-                unset($vo->kfuser);
                 $vo->sendtype = $vo->sendtype == 1 ? '即时发送' : '预约发送';
                 $result[$key] = array_merge($vo->toArray(), ['operate' => $this->makeBtn($vo->id)]);
+                $result[$key]['admin_name'] = isset($adminKey[$vo['admin_id']]) ? $adminKey[$vo['admin_id']]['user_name'] : '-err';
+
+                $result[$key]['user_name'] = isset($userKey[$vo['uid']]) ? $userKey[$vo['uid']]['user_name'] : $result[$key]['uid'];
+
+
+                $date = explode(' ', $vo->ctime);
+                $year = explode('-', $vo->ctime);
+                if ($date[0] == date('Y-m-d', time())) {
+                    $result[$key]['ctime'] = '<span style="float: right;">' . $date[1] . '</span>';
+                } else if ($date[0] == date('Y-m-d', strtotime("-1 day"))) {
+                    $result[$key]['ctime'] = '<span style="float: right;">' . '昨天 ' . $date[1] . '</span>';
+                } else {
+                    if ($year[0] == date('Y', time())) {
+                        $result[$key]['ctime'] = '<span style="float: right;">' . date('m-d H:i:s', strtotime($vo->ctime)) . '</span>';
+                    }
+                }
+
+                $date = explode(' ', $vo->readtime);
+                $year = explode('-', $vo->readtime);
+                if ($date[0] == date('Y-m-d', time())) {
+                    $result[$key]['readtime'] = '<span style="float: right;">' . $date[1] . '</span>';
+                } else if ($date[0] == date('Y-m-d', strtotime("-1 day"))) {
+                    $result[$key]['readtime'] = '<span style="float: right;">' . '昨天 ' . $date[1] . '</span>';
+                } else {
+                    if ($year[0] == date('Y', time())) {
+                        $result[$key]['readtime'] = '<span style="float: right;">' . date('m-d H:i:s', strtotime($vo->readtime)) . '</span>';
+                    }
+                }
+
+                $date = explode(' ', $vo->sendtime);
+                $year = explode('-', $vo->sendtime);
+                if ($date[0] == date('Y-m-d', time())) {
+                    $result[$key]['sendtime'] = '<span style="float: right;">' . $date[1] . '</span>';
+                } else if ($date[0] == date('Y-m-d', strtotime("-1 day"))) {
+                    $result[$key]['sendtime'] = '<span style="float: right;">' . '昨天 ' . $date[1] . '</span>';
+                } else {
+                    if ($year[0] == date('Y', time())) {
+                        $result[$key]['sendtime'] = '<span style="float: right;">' . date('m-d H:i:s', strtotime($vo->sendtime)) . '</span>';
+                    }
+                }
             }
 
             if (!$bibao) {
@@ -108,8 +160,8 @@ class Kfnotice extends Base
 
         if (request()->isPost()) {
 
-            $atext = input('post.atext');
-            $title = input('post.title', 0);
+            $atext = trim(input('post.atext'));
+            $title = trim(input('post.title', 0));
             $group = intval(input('post.groupid', 0));
 
 
@@ -123,7 +175,8 @@ class Kfnotice extends Base
             }
             $sendtype = (strtotime($sendtime) >= (time() + 60)) ? 2 : 1;
             if (strtotime($sendtime) < time()) {
-                return json(['code' => -1, 'data' => '', 'msg' => '时间不能小于当前时间!']);
+                $sendtime = date("Y-m-d H:i:s", time() + 10);
+                //return json(['code' => -1, 'data' => '', 'msg' => '时间不能小于当前时间!']);
             }
 
 
@@ -134,6 +187,7 @@ class Kfnotice extends Base
                     'atext' => $atext,
                     'sendtime' => $sendtime,
                     'sendtype' => $sendtype,
+                    'admin_id' => session('user_id'),
                 ];
                 $datas[] = $arr;
             } else {
@@ -152,6 +206,7 @@ class Kfnotice extends Base
                         'atext' => $atext,
                         'sendtime' => $sendtime,
                         'sendtype' => $sendtype,
+                        'admin_id' => session('user_id'),
                     ];
                     $datas[] = $arr;
                 }
@@ -195,8 +250,8 @@ class Kfnotice extends Base
     private function makeBtn($id)
     {
         $operate = '<a href="javascript:View(' . $id . ')"><button type="button" class="btn btn-info btn-sm">详细内容 </button></a>';
-        $operate .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:Del(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' <a href="javascript:Del(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }

+ 10 - 0
application/admin/controller/Login.php

@@ -10,6 +10,16 @@ use think\Controller;
 
 class Login extends Controller
 {
+    // 稳定性测试
+    /*public function aaaa()
+    {
+        $accounts = db('accounts')->select();
+        $this->assign([
+            'accounts' => json_encode($accounts),
+            'socket' => config('socket'),
+        ]);
+        return $this->fetch();
+    }*/
     // 登录首页
     public function index()
     {

+ 236 - 0
application/admin/controller/Material.php

@@ -0,0 +1,236 @@
+<?php
+/**
+ * User: nickbai
+ * Date: 2017/10/23 13:33
+ * Email: 1902822973@qq.com
+ */
+namespace app\admin\controller;
+
+use think\Loader;
+use think\Controller;
+use think\Db;
+
+class Material extends Base
+{
+    // 素材列表
+    public function index()
+    {
+        $div = '<div>';
+        if(request()->isAjax()){
+            $param  = input('param.');
+            $limit  = $param['pageSize'];
+            $offset = (($param['pageNumber'] - 1) * $limit);
+            $where = [];
+            if (empty($param['searchText']) === false || intval($param['searchText']) == 0) {
+                if($param['user'] == 'user_account'){
+                    $where['user_account'] = ['like', '%' . $param['searchText'] . '%'];
+                }
+                if($param['user'] == 'user_name'){
+                    $where['user_name'] = ['like', '%' . $param['searchText'] . '%'];
+                }
+                // $where['user_account|user_name|user_job_number|fullname'] = ['like', '%' . $param['searchText'] . '%'];
+            }else{
+                return 1;
+            }
+            $result = db('material')->where($where)->limit($offset, $limit)->order('id', 'desc')->select();
+
+            foreach($result as $key=>$vo){
+                // 优化显示头像
+                $result[$key]['url'] = '<img src="' . $vo['url'] . '" height="40px">';
+
+                $div .= $result[$key]['url'];
+                // 生成操作按钮
+                $result[$key]['operate'] = $this->makeBtn($vo['id']);
+            }
+
+//            $return['total'] = db('users')->where($where)->count();  //总数据
+//            $return['rows'] = $result;
+
+//            return json($return);
+
+        }
+
+        //所有素材
+        $material = db('material')->order('name', 'asc')->select();
+        $allmaterial = '';
+        if(!empty($material)){
+            $allmaterial = '<div style="margin-top: 20px;">';
+            for($i=0;$i<count($material);$i++){
+                $allmaterial .= '<div style="width: 33.3%;height:150px;float: left;border: 1px solid red;">';
+                $allmaterial .= '<img src="' . $material[$i]['url'] . '" height="30%">';
+                $allmaterial .= '</div>';
+            }
+            $allmaterial .= '</div>';
+        }
+        $this->assign([
+            'div' => $div,
+            'material' => $material,
+            'allmaterial' => $allmaterial
+        ]);
+
+        return $this->fetch();
+    }
+
+    // 添加素材
+    public function add()
+    {
+        if(request()->isPost()){
+
+            $param = input('post.');
+            unset($param['file']); // 删除layui头像上传隐藏字段
+
+            // 检测图片名称
+            $res = db('material')->where('name',$param['name'])->select();
+            if(!empty($res)){
+                return json(['code' => -1, 'data' => '', 'msg' => '名称已存在']);
+            }
+
+            // 检测图片
+            if(empty($param['material'])){
+                return json(['code' => -2, 'data' => '', 'msg' => '请上传素材']);
+            }
+            $info =array();
+            $info['url'] = $param['material'];
+            $info['name'] = $param['name'];
+
+            try{
+                db('material')->insert($info);
+            }catch(\Exception $e){
+                return json(['code' => -5, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => 'material/index', 'msg' => '添加素材成功']);
+        }
+
+        $this->assign([
+            'status' => config('kf_status')
+        ]);
+
+        return $this->fetch('add');
+    }
+
+    // 删除素材
+    public function del()
+    {
+        if(request()->isAjax()){
+            $id = input('param.id/d');
+            $material = db('material')->where('id',$id)->find();
+            $name = './'.$material['url'];
+//            $name = iconv("UTF-8", "gbk",$name);
+            try{
+                if (file_exists($name)) {
+                    unlink($name);
+                }
+                db('material')->where('id', $id)->delete();
+            }catch(\Exception $e){
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => url('material/index'), 'msg' => '删除图片成功']);
+        }
+    }
+
+    // 删除全部素材
+    public function delAll()
+    {
+        if(request()->isAjax()){
+            $material = db('material')->select();
+            try{
+                for($i=0;$i<count($material);$i++){
+                    $name = './'.$material[$i]['url'];
+                    if (file_exists($name)) {
+                        unlink($name);
+                    }
+                }
+                Db::execute("truncate table ws_material");
+            }catch(\Exception $e){
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+            return json(['code' => 1, 'data' => url('material/index'), 'msg' => '删除全部图片成功']);
+        }
+    }
+
+    // 上传图片(图片原名)
+//    public function upMaterial()
+//    {
+//        if(request()->isAjax()) {
+//            $file = request()->file('file');
+//            if (!empty($file)) {
+//                // 移动到框架应用根目录/public/static/material/ 目录下
+//                $name = $_FILES['file']['name'];
+//                $res = db('material')->where('url','/static/material/'.$name)->find();
+//                if(!empty($res)){
+//                    return json(['code' => -1, 'data' => '', 'msg' => '素材已存在']);
+//                }
+//                //中文乱码问题
+//                $name = iconv("UTF-8", "gbk",$name);
+//                $info = $file->move(ROOT_PATH . 'public' . DS . 'static/material/',$savename = $name,$replace = true);
+//                $name = iconv("gbk","UTF-8",$name);
+//                if ($info) {
+//                    $src = '/static/material' . '/' . $name;
+//                    return json(['code' => 0, 'data' => ['src' => $src,'name' => $name], 'msg' => 'ok']);
+//                } else {
+//                    // 上传失败获取错误信息
+//                    return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
+//                }
+//            }
+//        }
+//    }
+
+    // 上传图片
+    public function upMaterial()
+    {
+        if(request()->isAjax()) {
+            $file = request()->file('file');
+            if (!empty($file)) {
+
+                $fileInfo = $file->getInfo();
+                //return $fileInfo;
+                if ($fileInfo['size'] > 1024 * 512 * 2) {
+                    // 上传失败获取错误信息.
+                    return json(['code' => -2, 'data' => '', 'msg' => '文件超过0.5M'] );
+                }
+
+                //检测图片格式
+                $ext = explode('/', $fileInfo['type']);
+                $ext = array_pop($ext);
+                $extArr = explode('|', 'jpg|png|gif|jpeg');
+                if(!in_array($ext, $extArr)){
+                    return json(['code' => -3, 'data' => '', 'msg' => '只能上传jpg|png|gif|jpeg的文件']);
+                }
+
+                // 移动到框架应用根目录/public/uploads/ 目录下
+                $info = $file->move(ROOT_PATH . 'public' . DS . 'static/material/');
+                if ($info) {
+                    $src = '/static/material' . '/' . date('Ymd') . '/' . $info->getFilename();
+                    return json(['code' => 0, 'data' => ['src' => $src], 'msg' => 'ok']);
+                } else {
+                    // 上传失败获取错误信息
+                    return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
+                }
+            } else {
+                return json(['code' => -2, 'data' => '', 'msg' => '文件超过0.5M'] );
+            }
+        }
+    }
+
+    // 生成按钮
+    private function makeBtn($id)
+    {
+//        $operate = '<a href="' . url('users/edituser', ['id' => $id]) . '">';
+//        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+
+        $operate = '<a href="javascript:resetPwd(' . $id . ')"><button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 重置密码</button></a>';
+
+        $operate .= '<a style="margin-left:5px;" href="' . url('users/editUser', ['id' => $id]) . '">';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+
+        $operate .= '<a style="margin-left:5px;" href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+
+        //$operate .= '<a href="javascript:;">';
+        //$operate .= '<button type="button" class="btn btn-info btn-sm"><i class="fa fa-institution"></i> 详情</button></a>';
+
+        return $operate;
+    }
+}

+ 113 - 43
application/admin/controller/Messages.php

@@ -20,10 +20,28 @@ class Messages extends Base
 
             $where  = [];
             $orwhere  = [];
-            //用户名称
+
+//            //用户账号/昵称
+//            if (strlen($param['searchText'])) {
+//                if($param['account'] == 'account_name'){
+//                    $account_id = db('accounts')->where('account_name','like','%'.$param['searchText'].'%')->selest();
+//                    $ids = array();
+//                    for($i=0;$i<count($account_id);$i++){
+//                        $ids[] = $account_id[$i]['id'];
+//                    }
+//                    $where['a.account_id'] = $ids;
+//                    $orwhere['account_id'] = $ids;
+//                }
+//                if($param['account'] == 'nick_name'){
+//                    $where['a.nick_name'] = array('like','%'.$param['searchText'].'%');
+//                    $orwhere['nick_name'] = array('like','%'.$param['searchText'].'%');
+//                }
+//            }
+
+            //用户昵称
             if (strlen($param['searchText'])) {
-                $where['a.name'] = array('like','%'.$param['searchText'].'%');
-                $orwhere['name'] = array('like','%'.$param['searchText'].'%');
+                $where['a.nick_name'] = array('like','%'.$param['searchText'].'%');
+                $orwhere['nick_name'] = array('like','%'.$param['searchText'].'%');
             }
             //处理客服id
             if (empty($param['user_id']) === false) {
@@ -58,33 +76,57 @@ class Messages extends Base
                 'users c'      => 'a.user_id = c.id',
             ];
             $result = model('Accountsmessage')->selectJoin($join,$leftjoin,$where, $start,$end,$offset, $limit);
+            $accounts = db('accounts')->select();
             foreach($result as $key=>$vo){
 
-                // 优化显示附件
-                $images = $result[$key]['image'];
-                //转换成数组格式
-                $images = explode(",", $images);
-                if(!empty($images)){
-                    $img = '';
-                    for($i=0;$i<count($images);$i++){
-                        $img = $img.'<img src="'.$images[$i].'" width="40px" height="40px" style="margin-left:5px;margin-top:5px;">';
+                $result[$key]['content'] = str_replace('>','&gt',$result[$key]['content']);
+                $result[$key]['content'] = str_replace('<','&lt',$result[$key]['content']);
+                $result[$key]['content'] = '<div style="overflow: hidden;text-overflow:ellipsis;white-space: nowrap;max-width: 120px;">'.$result[$key]['content'].'</div>';
+
+                $result[$key]['reply_content'] = str_replace('>','&gt',$result[$key]['reply_content']);
+                $result[$key]['reply_content'] = str_replace('<','&lt',$result[$key]['reply_content']);
+                $result[$key]['reply_content'] = '<div style="overflow: hidden;text-overflow:ellipsis;white-space: nowrap;max-width: 120px;">'.$result[$key]['reply_content'].'</div>';
+
+                if(!empty($result[$key]['image'])){
+                    // 优化显示附件
+                    $images = $result[$key]['image'];
+                    //转换成数组格式
+                    $images = explode(",", $images);
+                    if(!empty($images)){
+                        $img = '';
+                        for($i=0;$i<count($images);$i++){
+                            $img = $img.'<img src="'.$images[$i].'" width="40px" height="40px" style="margin-left:5px;margin-top:5px;">';
+                        }
+                        $result[$key]['image'] = $img;
                     }
-                    $result[$key]['image'] = $img;
                 }
 
                 // 优化时间
                 if(null != $vo['add_time']){
-                    $result[$key]['add_time'] = date('Y-m-d H:m:s',$result[$key]['add_time']);
+                    $result[$key]['add_time'] = date('Y-m-d H:i:s',$result[$key]['add_time']);
                 }
+
+                $date = explode(' ',$result[$key]['add_time']);
+                $year = explode('-',$result[$key]['add_time']);
+                if($date[0] == date('Y-m-d',time())){
+                    $result[$key]['add_time'] = '<span style="float: right;">'.$date[1].'</span>';
+                }else if($date[0] == date('Y-m-d',strtotime("-1 day"))){
+                    $result[$key]['add_time'] = '<span style="float: right;">'.'昨天 '.$date[1].'</span>';
+                }else{
+                    if($year[0] == date('Y',time())){
+                        $result[$key]['add_time'] = '<span style="float: right;">'.date('m-d H:i:s',strtotime($result[$key]['add_time'])).'</span>';
+                    }
+                }
+
                 if(null != $vo['dealWith_time']){
-                    $result[$key]['dealWith_time'] = date('Y-m-d H:m:s',$result[$key]['dealWith_time']);
+                    $result[$key]['dealWith_time'] = date('Y-m-d H:i:s',$result[$key]['dealWith_time']);
                 }
 
                 // 优化显示状态
-                if(1 == $vo['message_status']){
-                    $result[$key]['status'] = '<span class="label label-primary">已处理</span>';
-                }else{
-                    $result[$key]['status'] = '<span class="label label-danger">未处理</span>';
+                if(1 == $vo['message_status']) {
+                    $result[$key]['status'] = '<span style="color: #2fbe1b">已处理</span>';
+                } else {
+                    $result[$key]['status'] = '<span style="color: red">未处理</span>';
                 }
 
                 // 是否公开
@@ -95,6 +137,12 @@ class Messages extends Base
                 }
                 // 生成操作按钮
                 $result[$key]['operate'] = $this->makeBtn($vo['message_id']);
+
+                for($i=0;$i<count($accounts);$i++){
+                    if($result[$key]['account_id'] == $accounts[$i]['id']){
+                        $result[$key]['account_name'] = $accounts[$i]['account_name'];
+                    }
+                }
             }
 
             //$return['total'] = db('Accountsmessage')->where($orwhere)->count();  //总数据
@@ -149,7 +197,7 @@ class Messages extends Base
                 }
             }
 
-            if($type_id == -1){
+            if($type_id == -1 || $type_id == 0 || $type_id == ''){
                 return json(['code' => -2, 'data' => '', 'msg' => '请选择留言类别']);
             }
             try{
@@ -161,32 +209,48 @@ class Messages extends Base
         }
         $id = input('param.id/d');
         $info = db('Accountsmessage')->where('message_id', $id)->find();
-        //$account = db('Accounts')->where('id', $info['account_id'])->find();
+        $account = db('Accounts')->where('id', $info['account_id'])->find();
         $user = db('Users')->where('id', $info['user_id'])->find();
-        //$info['account_name'] = $account['account_name'];
+        $info['account_name'] = $account['account_name'];
         //$info['account_email'] = $account['account_email'];
         $info['user_name'] = $user['user_name'];
 
         $messagetype = db('messagetype')->select();
 
-        // 优化显示附件
-        $images = $info['image'];
-        //转换成数组格式
-        $images = explode(",", $images);
-        if(!empty($images)){
-            $img = '';
-            for($i=0;$i<count($images);$i++){
-                $img = $img.'<img src="'.$images[$i].'" width="240px" style="margin-top:20px;">';
+        // 优化显示留言图片
+        if(!empty($info['image'])){
+            $image = $info['image'];
+            //转换成数组格式
+            $image = explode(",", $image);
+            if(!empty($image)){
+                $img = '';
+                for($i=0;$i<count($image);$i++){
+                    $img = $img.'<img onclick="checkImg()" src="'.$image[$i].'" height="40px" style="margin:5px;" id="image">';
+                }
+                $info['image'] = $img;
+            }
+        }
+
+        // 优化显示回复图片
+        if(!empty($info['images'])){
+            $images = $info['images'];
+            //转换成数组格式
+            $images = explode(",", $images);
+            if(!empty($images)){
+                $img = '';
+                for($i=0;$i<count($images);$i++){
+                    $img = $img.'<img onclick="checkImg()" src="'.$images[$i].'" height="40px" style="margin:5px;" id="image">';
+                }
+                $info['images'] = $img;
             }
-            $info['image'] = $img;
         }
 
         // 优化时间
         if (null != $info['add_time']) {
-            $info['add_time'] = date('Y-m-d H:m:s', $info['add_time']);
+            $info['add_time'] = date('Y-m-d H:i:s', $info['add_time']);
         }
         if (null != $info['dealWith_time']) {
-            $info['dealWith_time'] = date('Y-m-d H:m:s', $info['dealWith_time']);
+            $info['dealWith_time'] = date('Y-m-d H:i:s', $info['dealWith_time']);
         }
 
         // 优化显示状态
@@ -245,10 +309,10 @@ class Messages extends Base
     {
         $operate = '<a href="' . url('Messages/detail', ['id' => $id]) . '">';
 
-        $operate .= '<button type="button" class="btn btn-info btn-sm"><i class="fa fa-institution"></i> 详情</button></a>';
+        $operate .= '<button type="button" class="btn btn-info btn-sm">详情</button></a>';
 
-        $operate .= '<a href="javascript:messageDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' <a href="javascript:messageDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }
@@ -273,14 +337,20 @@ class Messages extends Base
             foreach($result as $key=>$vo){
                 // 优化时间
                 if(null != $vo['addtime']){
-                    $result[$key]['addtime'] = date('Y-m-d H:m:s',$result[$key]['addtime']);
+                    $result[$key]['addtime'] = date('Y-m-d H:i:s',$result[$key]['addtime']);
                 }
 
-                // 优化显示状态
-                if(1 == $vo['status']){
-                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
-                }else{
-                    $result[$key]['status'] = '<span class="label label-danger">停用</span>';
+//                // 优化显示状态
+//                if(1 == $vo['status']){
+//                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+//                }else{
+//                    $result[$key]['status'] = '<span class="label label-danger">停用</span>';
+//                }
+                // 优化显示状态.
+                if(1 == $vo['status']) {
+                    $result[$key]['status'] = '<span style="color: #2fbe1b">启用</span>';
+                } else {
+                    $result[$key]['status'] = '<span style="color: red">停用</span>';
                 }
 
                 // 生成操作按钮
@@ -372,10 +442,10 @@ class Messages extends Base
     private function makeBtnType($id)
     {
         $operate = '<a href="' . url('Messages/edit', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:typeDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }

+ 2 - 2
application/admin/controller/Report.php

@@ -109,7 +109,7 @@ class Report extends Base
 
         $allChat = 0;  // 会话总数.
         $allService = 0;  // 消息总数.
-        $allQueue = 0;  // 消息总数.
+        $allQueue = 0;  // 排队总数.
         foreach ($chatData as $v) {
             $allChat += $v;
         }
@@ -154,7 +154,7 @@ class Report extends Base
             'allQueue' => $allQueue,
             'transfer' => floor($transfer / 2),
             'reply' => ($allChatLog ? sprintf("%.2f", (($reply / ($allChatLog - $reply)) * 100)) : '--'),
-            'waitTime' => ($allService ? ceil($alllWaitTime / $allService) : '--'),
+            'waitTime' => ($allQueue ? ceil($alllWaitTime / $allQueue) : '--'),
             'serviceTime' => ($allService ? ceil($serviceTime / $allService) : '--'),
             'cpdTime' => ($allService ? ceil($cpdTime / $allService) : '--'),
             'evaluateGood' => (($evaluateGood + $evaluateSecondary + $evaluateBad) ? sprintf("%.2f", (($evaluateGood / ($evaluateGood + $evaluateSecondary + $evaluateBad)) * 100)) : '--'),

+ 29 - 6
application/admin/controller/Robot.php

@@ -3,14 +3,13 @@ namespace app\admin\controller;
 
 use think\Loader;
 use think\Controller;
-
+use think\Db;
 /**
  * 智能问答类
  */
 class Robot extends Base
 {
 
-
     /**
      * 智能问答列表
      *
@@ -167,14 +166,27 @@ class Robot extends Base
         }
     }
 
+    // 删除全部智能问答
+    public function delAll()
+    {
+        if(request()->isAjax()){
+            try{
+                Db::execute("truncate table ws_robot");
+            }catch(\Exception $e){
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+            return json(['code' => 1, 'data' => '', 'msg' => '删除全部智能问答成功']);
+        }
+    }
+
     // 生成按钮
     private function makeBtn($id)
     {
         $operate = '<a href="' . url('robot/editword', ['robot_id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }
@@ -187,6 +199,11 @@ class Robot extends Base
         Loader::import('PHPExcel.PHPExcel.PHPExcel_Cell');
         //获取表单上传文件
         $file = request()->file('excel');
+        if(empty($file)){
+            $this->error('请先上传文件');
+            return json(['code' => -4, 'data' => '', 'msg' => '请先上传文件']);
+        }
+
         $info = $file->validate(['ext' => 'xlsx'])->move(ROOT_PATH . 'public' . DS . 'uploads');
         //上传验证后缀名,以及上传之后移动的地址
         if ($info) {
@@ -205,20 +222,23 @@ class Robot extends Base
                 $info[$k]['robot_host'] = $v[3];
                 $info[$k]['groups_id'] = 1;
                 $info[$k]['robotgroups_id'] = 1;
-                $info[$k]['robot_addTime'] = date('Y-m-d H:m:s',time());
-                $info[$k]['robot_updateTime'] = date('Y-m-d H:m:s',time());
+                $info[$k]['robot_addTime'] = date('Y-m-d H:i:s',time());
+                $info[$k]['robot_updateTime'] = date('Y-m-d H:i:s',time());
                 $info[$k]['admin_id'] = session('user_id');
             }
             //检查表中数据是否为空和重复
             for($a=0;$a<count($info);$a++){
                 if(empty($info[$a]['robot_name'])){
+                    $this->error('excel表第'.($a+2).'行智能问答问题为空');
                     return json(['code' => -3, 'data' => url('robot/index'), 'msg' => 'excel表第'.($a+2).'行智能问答问题为空']);
                 }
                 if(empty($info[$a]['robot_content'])){
+                    $this->error('excel表第'.($a+2).'行智能问答答案为空');
                     return json(['code' => -4, 'data' => url('robot/index'), 'msg' => 'excel表第'.($a+2).'行智能问答答案为空']);
                 }
                 for($b=$a+1;$b<count($info);$b++){
                     if($info[$a]['robot_name'] == $info[$b]['robot_name']){
+                        $this->error('excel表第'.($a+2).'行与第'.($b+2).'行智能问答问题重复');
                         return json(['code' => -2, 'data' => url('robot/index'), 'msg' => 'excel表第'.($a+2).'行与第'.($b+2).'行智能问答问题重复']);
                     }
                 }
@@ -228,13 +248,16 @@ class Robot extends Base
             for($i=0;$i<count($info);$i++){
                 for($j=0;$j<count($robot);$j++){
                     if($info[$i]['robot_name'] == $robot[$j]['robot_name']){
+                        $this->error('excel表第'.($i+2).'行智能问答问题已存在');
                         return json(['code' => -1, 'data' => url('robot/index'), 'msg' => 'excel表第'.($i+2).'行智能问答问题已存在']);
                     }
                 }
             }
             db('robot')->insertAll($info); //批量插入数据
+            $this->success('插入智能问答数据成功');
             return json(['code' => 1, 'data' => $this->redirect('robot/index'), 'msg' => '插入智能问答数据成功']);
         } else {
+            $this->error('插入智能问答数据失败');
             return json(['code' => -2, 'data' => url('robot/index'), 'msg' => '插入智能问答数据失败']);
         }
     }

+ 47 - 5
application/admin/controller/Sensitivec.php

@@ -90,8 +90,9 @@ class Sensitivec extends Base
             $param = input('post.');
 
             // 检测用户修改的管理员是否重复
-            $has = db('sensitivewords')->where('sensitivewords_word', $param['sensitivewords_word'])->where('sensitivewords_id', '<>', $param['sensitivewords_id'])->find();
-            if(!empty($has)){
+            $has = db('sensitivewords')->where('sensitivewords_word', $param['sensitivewords_word'])->find();
+            $thisWord = db('sensitivewords')->where('sensitivewords_id', $param['sensitivewords_id'])->find();
+            if(!empty($has) && $has['sensitivewords_id'] != $param['sensitivewords_id'] && $thisWord['sensitivewords_for'] == $has['sensitivewords_for']){
                 return json(['code' => -1, 'data' => '', 'msg' => '该敏感词已经存在']);
             }
 
@@ -133,14 +134,35 @@ class Sensitivec extends Base
         }
     }
 
+    //删除所有关键字
+    public function delAll(){
+        if(request()->isAjax()){
+            $type = input('param.type/d');
+            if($type == 1){
+                $name = '用户';
+            }
+            if($type == 2){
+                $name = '客服';
+            }
+            try{
+                db('sensitivewords')->where('sensitivewords_for', $type)->delete();
+            }catch(\Exception $e){
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+            return json(['code' => 1, 'data' => '', 'msg' => '删除全部'.$name.'敏感词成功']);
+        }
+    }
+
     // 生成按钮
     private function makeBtn($id)
     {
         $operate = '<a href="' . url('sensitivec/editsensitive', ['sensitivewords_id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+//        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+//        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }
@@ -153,6 +175,21 @@ class Sensitivec extends Base
         Loader::import('PHPExcel.PHPExcel.PHPExcel_Cell');
         //获取表单上传文件
         $file = request()->file('excel');
+        //$file = $_FILES['excel'];
+//        return $file;
+//        print_r($file) ;
+
+//        if(request()->isAjax()){
+//            $file = input('param.file');
+//             //return $file;
+//        }
+
+        if(empty($file)){
+//return  '<script src="/static/admin/js/jquery.min.js?v=2.1.4"></script><script src="/static/admin/js/plugins/layer/layer.min.js"></script><script>layer.msg("请先上传文件123", {icon: 1});console.log(12345);</script>';
+            $this->error('请先上传文件');
+            return json(['code' => -4, 'data' => '', 'msg' => '请先上传文件']);
+        }
+
         $info = $file->validate(['ext' => 'xlsx'])->move(ROOT_PATH . 'public' . DS . 'uploads');
         //上传验证后缀名,以及上传之后移动的地址
         if ($info) {
@@ -168,16 +205,18 @@ class Sensitivec extends Base
                 $info[$k]['sensitivewords_word'] = $v[0];
                 $info[$k]['sensitivewords_status'] = $v[1];
                 $info[$k]['sensitivewords_for'] = $v[2];
-                $info[$k]['sensitivewords_time'] = date('Y-m-d H:m:s',time());
+                $info[$k]['sensitivewords_time'] = date('Y-m-d H:i:s',time());
                 $info[$k]['sensitivewords_uid'] = session('user_id');
             }
             //检查表中数据是否为空和重复
             for($a=0;$a<count($info);$a++){
                 if(empty($info[$a]['sensitivewords_word'])){
+                    $this->error('excel表第'.($a+2).'行敏感词为空');
                     return json(['code' => -3, 'data' => url('sensitivec/index'), 'msg' => 'excel表第'.($a+2).'行敏感词为空']);
                 }
                 for($b=$a+1;$b<count($info);$b++){
                     if($info[$a]['sensitivewords_word'] == $info[$b]['sensitivewords_word'] && $info[$a]['sensitivewords_for'] == $info[$b]['sensitivewords_for']){
+                        $this->error('excel表第'.($a+2).'行与第'.($b+2).'行敏感词重复');
                         return json(['code' => -1, 'data' => url('sensitivec/index'), 'msg' => 'excel表第'.($a+2).'行与第'.($b+2).'行敏感词重复']);
                     }
                 }
@@ -187,13 +226,16 @@ class Sensitivec extends Base
             for($i=0;$i<count($info);$i++){
                 for($j=0;$j<count($sensitivewords);$j++){
                     if($info[$i]['sensitivewords_word'] == $sensitivewords[$j]['sensitivewords_word'] && $info[$i]['sensitivewords_for'] == $sensitivewords[$j]['sensitivewords_for']){
+                        $this->error('excel表第'.($i+2).'行敏感词已存在');
                         return json(['code' => -1, 'data' => url('sensitivec/index'), 'msg' => 'excel表第'.($i+2).'行敏感词已存在']);
                     }
                 }
             }
             db('sensitivewords')->insertAll($info); //批量插入数据
+            $this->success('插入敏感词成功');
             return json(['code' => 1, 'data' => $this->redirect('sensitivec/index'), 'msg' => '插入敏感词成功']);
         } else {
+            $this->error('插入敏感词失败');
             return json(['code' => -2, 'data' => url('sensitivec/index'), 'msg' => '插入敏感词失败']);
         }
     }

+ 219 - 67
application/admin/controller/Settings.php

@@ -8,27 +8,83 @@ namespace app\admin\controller;
 
 class Settings extends Base
 {
-    // 功能菜单列表
+    // 访客端入口列表
+    public function entranceList()
+    {
+        if(request()->isAjax()){
+            // 查询目录下所有文件
+            $files = $this->allFile(ROOT_PATH.'public/entranceJs/new');
+            $filesInfo = [];
+            foreach ($files as $v) {
+                $addTime = filemtime(ROOT_PATH."public/entranceJs/new/$v");
+                $lastLoad = fileatime(ROOT_PATH."public/entranceJs/new/$v");
+                $filesInfo[] = (object)[
+                    'fileName' => 'entranceJs/new/'.$v,
+                    'addTime' => date("Y-m-d H:i:s",$addTime),
+                    'lastLoad' => $lastLoad ? date("Y-m-d H:i:s",$lastLoad) : '--',
+                    'operate' => $this->fileBtn($v),
+                ];
+            }
+            $return = (object)[
+                'total' => count($filesInfo),
+                'rows' => $filesInfo,
+            ];
+            return json($return);
+        }
+
+        return $this->fetch('entrancelist');
+    }
+    // 访客端入口新增
     public function index()
     {
+        if(request()->isPost()){
+            $param = input('post.');
+            $name = $param['name'];
+            // 查询目录下所有文件
+            $files = $this->allFile(ROOT_PATH.'public/entranceJs/new');
+            $have = 0;
+            // 判断是否存在该文件.
+            foreach ($files as $v) {
+                $fileName = substr($v,0,strpos($v, '.'));
+                if ($fileName == $name) {
+                    $have = 1;
+                    break;
+                }
+            }
+            if ($have) {
+                return json(['code' => -2, 'data' => '', 'msg' => '文件名已存在']);
+            }
+            $result = db('guestenter')->order('sort','asc')->select();
+            $copy = $this->file2dir(ROOT_PATH.'public/entranceJs/FloatingButton.js',ROOT_PATH.'public/entranceJs/new/', $name.'.js');
+            $result[] = (object)[
+                "margin_top" => $param['marginTop'],
+                "stop_time" => $param['overtime'],
+                "copywriting" => $param['overtimeInfo'],
+            ];
+            $data = json_encode($result);
+            if ($copy) {
+                $dataArr = ["data = $data;"];
+                $result = $this->UpdataFile(ROOT_PATH.'public/entranceJs/new/'.$name.'.js', $dataArr, 24, 24, false);
+                if ($result) {
+                    return json(['code' => 1, 'data' => 'settings/index', 'msg' => '入口添加成功']);
+                } else {
+                    return json(['code' => -2, 'data' => '', 'msg' => '操作失败']);
+                }
+            } else {
+                return json(['code' => -2, 'data' => '', 'msg' => '操作失败']);
+            }
+        }
         if(request()->isAjax()){
             $param  = input('param.');
             $limit  = $param['pageSize'];
             $offset = (($param['pageNumber'] - 1) * $limit);
             $where = [];
-//            if (empty($param['searchText']) === false || intval($param['searchText']) == 0) {
-//                $where['user_account|user_name|user_job_number|fullname'] = ['like', '%' . $param['searchText'] . '%'];
-//            }
-            //客服组
-//            if ($param['group_id'] != '' && $param['group_id'] != 0) {
-//                $where['group_id'] = $param['group_id'];
-//            }
             $result = db('guestenter')->where($where)->limit($offset, $limit)->order('sort', 'asc')->select();
             //客服组
             $group = db('groups')->select();
             foreach($result as $key=>$vo){
                 // 优化显示头像
-                $result[$key]['image'] = '<img src="' . $vo['image'] . '" width="40px" height="40px">';
+                $result[$key]['image'] = '<img src="' . $vo['image'] . '" height="40px">';
 
                 if($vo['group_id'] == 'all'){
                     $result[$key]['user_group'] = '所有客服组';
@@ -58,60 +114,51 @@ class Settings extends Base
 
         return $this->fetch();
     }
-
-    // 添加功能菜单
+    // 访客端入口列表
     public function add()
     {
-        if(request()->isPost()){
+        if(request()->isAjax()){
+            $param  = input('param.');
+            $limit  = $param['pageSize'];
+            $offset = (($param['pageNumber'] - 1) * $limit);
+            $where = [];
+            $result = db('guestenter')->where($where)->limit($offset, $limit)->order('sort', 'asc')->select();
+            //客服组
+            $group = db('groups')->select();
+            foreach($result as $key=>$vo){
+                // 优化显示头像
+                $result[$key]['image'] = '<img src="' . $vo['image'] . '" height="40px">';
 
-            $param = input('post.');
-            unset($param['file']); // 删除layui头像上传隐藏字段
-            // 检测账号
-            if(!empty($param['name'])){
-                $user = db('guestenter')->where('name', $param['name'])->find();
-                if(!empty($user)){
-                    return json(['code' => -1, 'data' => '', 'msg' => '该名称已存在']);
+                if($vo['group_id'] == 'all'){
+                    $result[$key]['user_group'] = '所有客服组';
+                }
+                for($i=0;$i<count($group);$i++){
+                    if($vo['group_id'] == $group[$i]['id']){
+                        $result[$key]['user_group'] = $group[$i]['name'];
+                    }
                 }
-            }
-
-            if(strlen($param['name'])>12) {
-                return json(['code' => -8, 'data' => '', 'msg' => '名称字数超过限制']);
-            }
-
-            if(!is_numeric($param['margin_top'])) {
-                return json(['code' => -7, 'data' => '', 'msg' => '上边距未输入整数']);
-            }
 
-            if(!is_numeric($param['sort'])) {
-                return json(['code' => -6, 'data' => '', 'msg' => '排序未输入整数']);
+                // 生成操作按钮
+                $result[$key]['operate'] = $this->makeBtn($vo['id']);
             }
 
-            if(empty($param['group_id'])){
-                return json(['code' => -3, 'data' => '', 'msg' => '请选择分组']);
-            }
-             //检测头像
-            if(empty($param['image'])){
-                return json(['code' => -4, 'data' => '', 'msg' => '请上传图片']);
-            }
+            $return['total'] = db('guestenter')->where($where)->count();  //总数据
+            $return['rows'] = $result;
 
-            try{
-                db('guestenter')->insert($param);
-            }catch(\Exception $e){
-                return json(['code' => -5, 'data' => '', 'msg' => $e->getMessage()]);
-            }
+            return json($return);
 
-            return json(['code' => 1, 'data' => 'settings/index', 'msg' => '添加功能菜单成功']);
         }
+        $settings = db('settings')->where('id',1)->find();
 
         $this->assign([
-            'groups' => db('groups')->select(),
+            'settings' => $settings,
             'status' => config('kf_status')
         ]);
 
-        return $this->fetch('add');
+        return $this->fetch();
     }
 
-    // 编辑功能菜单
+    // 编辑访客端入口
     public function edit()
     {
         if(request()->isAjax()){
@@ -123,10 +170,6 @@ class Settings extends Base
                 return json(['code' => -8, 'data' => '', 'msg' => '名称字数超过限制']);
             }
 
-            if(!is_numeric($param['margin_top'])) {
-                return json(['code' => -7, 'data' => '', 'msg' => '上边距未输入整数']);
-            }
-
             if(!is_numeric($param['sort'])) {
                 return json(['code' => -6, 'data' => '', 'msg' => '排序未输入整数']);
             }
@@ -143,7 +186,6 @@ class Settings extends Base
             $info = array();
             $info['name'] = $param['name'];
             $info['image'] = $param['image'];
-            $info['margin_top'] = $param['margin_top'];
             $info['group_id'] = $param['group_id'];
             $info['sort'] = $param['sort'];
 
@@ -165,7 +207,7 @@ class Settings extends Base
         return $this->fetch('edit');
     }
 
-    // 删除功能菜单
+    // 删除访客端入口
     public function del()
     {
         if(request()->isAjax()){
@@ -181,6 +223,30 @@ class Settings extends Base
         }
     }
 
+    // 删除访客端入口文件
+    public function delFile()
+    {
+        if(request()->isAjax()){
+            $fileName = input('param.fileName');
+
+            try{
+                unlink(ROOT_PATH."public/entranceJs/new/$fileName");
+            }catch(\Exception $e){
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '删除成功']);
+        }
+    }
+
+    /**
+     * 效果预览
+     */
+    function demo()
+    {
+        return $this->fetch();
+    }
+
     // 上传客服头像
     public function upAvatar()
     {
@@ -204,30 +270,116 @@ class Settings extends Base
     // 生成按钮
     private function makeBtn($id)
     {
-        $operate = '<a style="margin-left:5px;" href="' . url('settings/edit', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate = '<a href="' . url('settings/edit', ['id' => $id]) . '">';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
-        $operate .= '<a style="margin-left:5px;" href="javascript:Del(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= '<a href="javascript:Del(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }
 
-    //自动邀请设置
-    public function update(){
-        if(request()->isPost()){
+    // 生成按钮
+    private function fileBtn($fileName)
+    {
 
-            $param = input('post.');
+        $operate = '<a style="margin-left:5px;" href="javascript:DelFile(`' . $fileName . '`)"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= ' 删除</button></a> ';
 
-            $info['stop_time'] = $param['overtime'];
-            $info['copywriting'] = $param['overtimeInfo'];
+        return $operate;
+    }
+    //复制文件
+    function file2dir($sourcefile, $dir,$filename){
+        if( ! file_exists($sourcefile)){
+            return false;
+        }
+        //$filename = basename($sourcefile);
+        return copy($sourcefile, $dir .''. $filename);
+    }
+    // 获取文件夹下的文件.
+    function allFile($dir) {
+        $handle=opendir($dir);
+        $i=0;
+        $list = [];
+        while(!!$file = readdir($handle)) {
+            if (($file!=".")and($file!="..")) {
+                $list[$i]=$file;
+                $i=$i+1;
+            }
+        }
+        closedir($handle);
+        return $list;
+    }
 
-            try{
-                db('settings')->where('id', $param['id'])->update($info);
-            }catch(\Exception $e){
-                return json(['code' => -5, 'data' => 'settings/index', 'msg' => $e->getMessage()]);
+    /**
+     * 修改文件
+     * @author GRACE
+     * @param $file       文件路径
+     * @param $arr        修改值数组
+     * @param $len        开始索引位置
+     * @param $end        结束索引位置 或 匹配 索引值
+     * @param bool $loke  文件为空时,是否添加 <?php 头
+     */
+    function UpdataFile ($file, $arr, $len, $end, $loke = true)
+    {
+        if (is_dir($file)) {
+            exit($file. '请传入正确的文件路径');
+        }
+        if (is_file($file)) {
+            // 判断是否是常规文件
+            if (is_readable($file)) {
+                // 文件是否可读
+                if (is_writable($file)) {
+                    // 文件是否可写
+                    $fp = file($file);
+                    // 以数据的方式读取文件
+                    if (!empty($fp)) {
+                        $lokes = true;
+                        $arr1 = [];
+                        // 接收前半部分
+                        $arr2 = [];
+                        // 接收后半部分
+                        foreach ($fp as $k => $v) {
+                            if ($k >= $len && $lokes) {
+                                if (is_int($end)) {
+                                    if ($k == $end) {
+                                        $lokes = false;
+                                    }
+                                } else {
+                                    if (trim($v) == $end) {
+                                        $arr2[] = $v; $lokes = false;
+                                    }
+                                }
+                            } else {
+                                if ($lokes) {
+                                    $arr1[] = $v;
+                                } else {
+                                    $arr2[] = $v;
+                                }
+                            }
+                        }
+                        $arr3 = join('', $arr1).join(PHP_EOL, $arr).PHP_EOL.join('', $arr2);
+                        if (file_put_contents($file, $arr3)) {
+                            return '修改成功';
+                        } else {
+                            return '修改失败';
+                        }
+                    } else {
+                        if ($loke) {
+                            $a = '<?php'.PHP_EOL; $a.= join(PHP_EOL, $arr).PHP_EOL; file_put_contents($file, $a, FILE_APPEND);
+                        } else {
+                            $a = join(PHP_EOL, $arr).PHP_EOL; file_put_contents($file, $a, FILE_APPEND);
+                        }
+                    }
+                } else {
+                    exit($file. 'The file is not writable');
+                }
+            } else {
+                exit($file. ' is not a regular file');
             }
-            return json(['code' => 1, 'data' => $this->redirect('settings/index'), 'msg' => '自动邀请设置成功']);
+        } else {
+            exit($file. ' is not a regular file');
         }
     }
+
 }

+ 241 - 0
application/admin/controller/SettingsOld.php

@@ -0,0 +1,241 @@
+<?php
+/**
+ * User: nickbai
+ * Date: 2017/10/23 13:33
+ * Email: 1902822973@qq.com
+ */
+namespace app\admin\controller;
+
+class Settings extends Base
+{
+    // 访客端入口列表
+    public function index()
+    {
+        if(request()->isAjax()){
+            $param  = input('param.');
+            $limit  = $param['pageSize'];
+            $offset = (($param['pageNumber'] - 1) * $limit);
+            $where = [];
+//            if (empty($param['searchText']) === false || intval($param['searchText']) == 0) {
+//                $where['user_account|user_name|user_job_number|fullname'] = ['like', '%' . $param['searchText'] . '%'];
+//            }
+            //客服组
+//            if ($param['group_id'] != '' && $param['group_id'] != 0) {
+//                $where['group_id'] = $param['group_id'];
+//            }
+            $result = db('guestenter')->where($where)->limit($offset, $limit)->order('sort', 'asc')->select();
+            //客服组
+            $group = db('groups')->select();
+            foreach($result as $key=>$vo){
+                // 优化显示头像
+                $result[$key]['image'] = '<img src="' . $vo['image'] . '" height="40px">';
+
+                if($vo['group_id'] == 'all'){
+                    $result[$key]['user_group'] = '所有客服组';
+                }
+                for($i=0;$i<count($group);$i++){
+                    if($vo['group_id'] == $group[$i]['id']){
+                        $result[$key]['user_group'] = $group[$i]['name'];
+                    }
+                }
+
+                // 生成操作按钮
+                $result[$key]['operate'] = $this->makeBtn($vo['id']);
+            }
+
+            $return['total'] = db('guestenter')->where($where)->count();  //总数据
+            $return['rows'] = $result;
+
+            return json($return);
+
+        }
+        $settings = db('settings')->where('id',1)->find();
+
+        $this->assign([
+            'settings' => $settings,
+            'status' => config('kf_status')
+        ]);
+
+        return $this->fetch();
+    }
+
+    // 添加访客端入口
+    public function add()
+    {
+        if(request()->isPost()){
+
+            $param = input('post.');
+            unset($param['file']); // 删除layui头像上传隐藏字段
+            // 检测账号
+            if(!empty($param['name'])){
+                $user = db('guestenter')->where('name', $param['name'])->find();
+                if(!empty($user)){
+                    return json(['code' => -1, 'data' => '', 'msg' => '该名称已存在']);
+                }
+            }
+
+            if(strlen($param['name'])>12) {
+                return json(['code' => -8, 'data' => '', 'msg' => '名称字数超过限制']);
+            }
+
+            if(!is_numeric($param['sort'])) {
+                return json(['code' => -6, 'data' => '', 'msg' => '排序未输入整数']);
+            }
+
+            if(empty($param['group_id'])){
+                return json(['code' => -3, 'data' => '', 'msg' => '请选择分组']);
+            }
+             //检测头像
+            if(empty($param['image'])){
+                return json(['code' => -4, 'data' => '', 'msg' => '请上传图片']);
+            }
+
+            try{
+                db('guestenter')->insert($param);
+            }catch(\Exception $e){
+                return json(['code' => -5, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => 'settings/index', 'msg' => '添加功能菜单成功']);
+        }
+
+        $this->assign([
+            'groups' => db('groups')->select(),
+            'status' => config('kf_status')
+        ]);
+
+        return $this->fetch('add');
+    }
+
+    // 编辑访客端入口
+    public function edit()
+    {
+        if(request()->isAjax()){
+
+            $param = input('post.');
+            unset($param['file']); // 删除layui头像上传隐藏字段
+
+            if(strlen($param['name'])>12) {
+                return json(['code' => -8, 'data' => '', 'msg' => '名称字数超过限制']);
+            }
+
+            if(!is_numeric($param['sort'])) {
+                return json(['code' => -6, 'data' => '', 'msg' => '排序未输入整数']);
+            }
+
+            if(empty($param['group_id'])){
+                return json(['code' => -2, 'data' => '', 'msg' => '请选择分组']);
+            }
+
+            $name = db('guestenter')->where('name',$param['name'])->where('id','<>',$param['id'])->select();
+            if(!empty($name)){
+                return json(['code' => -3, 'data' => '', 'msg' => '此名称已存在']);
+            }
+
+            $info = array();
+            $info['name'] = $param['name'];
+            $info['image'] = $param['image'];
+            $info['group_id'] = $param['group_id'];
+            $info['sort'] = $param['sort'];
+
+            try{
+                db('guestenter')->where('id', $param['id'])->update($info);
+            }catch(\Exception $e){
+                return json(['code' => -6, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+            return json(['code' => 1, 'data' => 'settings/index', 'msg' => '编辑功能菜单成功']);
+        }
+        $id = input('param.id/d');
+        $info = db('guestenter')->where('id', $id)->find();
+
+        $this->assign([
+            'info' => $info,
+            'status' => config('kf_status'),
+            'groups' => db('groups')->select()
+        ]);
+        return $this->fetch('edit');
+    }
+
+    // 删除访客端入口
+    public function del()
+    {
+        if(request()->isAjax()){
+            $id = input('param.id/d');
+
+            try{
+                db('guestenter')->where('id', $id)->delete();
+            }catch(\Exception $e){
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '删除功能菜单成功']);
+        }
+    }
+
+    // 上传客服头像
+    public function upAvatar()
+    {
+        if(request()->isAjax()) {
+
+            $file = request()->file('file');
+            if (!empty($file)) {
+                // 移动到框架应用根目录/public/uploads/ 目录下
+                $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
+                if ($info) {
+                    $src = '/uploads' . '/' . date('Ymd') . '/' . $info->getFilename();
+                    return json(['code' => 0, 'data' => ['src' => $src], 'msg' => 'ok']);
+                } else {
+                    // 上传失败获取错误信息
+                    return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
+                }
+            }
+        }
+    }
+
+    // 生成按钮
+    private function makeBtn($id)
+    {
+        $operate = '<a style="margin-left:5px;" href="' . url('settings/edit', ['id' => $id]) . '">';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+
+        $operate .= '<a style="margin-left:5px;" href="javascript:Del(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+
+        return $operate;
+    }
+
+    //自动邀请设置
+    public function update(){
+        if(request()->isPost()){
+
+            $param = input('post.');
+
+            $info['stop_time'] = $param['overtime'];
+            $info['copywriting'] = $param['overtimeInfo'];
+
+            try{
+                db('settings')->where('id', $param['id'])->update($info);
+            }catch(\Exception $e){
+                return json(['code' => -5, 'data' => 'settings/index', 'msg' => $e->getMessage()]);
+            }
+            return json(['code' => 1, 'data' => $this->redirect('settings/index'), 'msg' => '自动邀请设置成功']);
+        }
+    }
+
+    //访客端入口上边距设置
+    public function margin(){
+        if(request()->isPost()){
+
+            $param = input('post.');
+
+            $info['margin_top'] = $param['margin-top'];
+
+            try{
+                db('settings')->where('id', $param['id'])->update($info);
+            }catch(\Exception $e){
+                return json(['code' => -6, 'data' => 'settings/index', 'msg' => $e->getMessage()]);
+            }
+            return json(['code' => 1, 'data' => $this->redirect('settings/index'), 'msg' => '自动邀请设置成功']);
+        }
+    }
+}

+ 313 - 56
application/admin/controller/System.php

@@ -2,6 +2,7 @@
 namespace app\admin\controller;
 
 use app\admin\model\Office;
+use think\cache\driver\Redis;
 
 /**
  * 管理系统系统设置类
@@ -30,19 +31,22 @@ class System extends Base
                 if (empty($param['logo_img']) === false) {
                     $updateinfo['logo'] = $param['logo_img'];
                 }
+                $updateinfo['enterprise_name'] = $param['enterprise_name'];
 
                 $updateAstData['advertisement_url']    = $param['advertisementUrl'];
                 $updateAstData['advertisement_status'] = $param['status'];
                 model('Advertisement')->updateAst($updateAstData);
-                // 修改系统欢迎语.
+                /*// 修改系统欢迎语.
                 $updateSysData['word'] = $param['systemWord'];
                 $updateSysWhere['id']  = 1;
-                model('Reply')->updateReply($updateSysWhere, $updateSysData);
+                model('Reply')->updateReply($updateSysWhere, $updateSysData);*/
                 // 修改客服欢迎语.
                 $updateSevData['word'] = $param['serverWord'];
                 $updateSevWhere['id']  = 2;
                 model('Reply')->updateReply($updateSevWhere, $updateSevData);
-                db('settings')->where('id',1)->update($updateinfo);
+                if(!empty($updateinfo)){
+                    db('settings')->where('id',1)->update($updateinfo);
+                }
                 return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
             } catch (\Exception $e) {
                 return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
@@ -51,9 +55,9 @@ class System extends Base
 
         // 获取广告.
         $advertisement = model('Advertisement')->findAst();
-        // 获取系统欢迎语.
+        /*// 获取系统欢迎语.
         $replySystemWhere['id'] = 1;
-        $replySystem            = model('Reply')->findReply($replySystemWhere);
+        $replySystem            = model('Reply')->findReply($replySystemWhere);*/
         // 获取客服欢迎语.
         $replyServerWhere['id'] = 2;
         $replyServer            = model('Reply')->findReply($replyServerWhere);
@@ -62,9 +66,10 @@ class System extends Base
         $this->assign(
             [
                 'advertisement' => $advertisement,
-                'replySystem'   => $replySystem,
+                //'replySystem'   => $replySystem,
                 'replyServer'   => $replyServer,
                 'settings'   => $settings,
+                'socket' => config('socket'),
                 'status'        => config('kf_status'),
             ]
         );
@@ -73,6 +78,117 @@ class System extends Base
 
     }//end basics()
 
+    /**
+     * 系统欢迎语
+     *
+     * @access public
+     */
+    public function welcoming()
+    {
+        if (request()->isAjax()) {
+            $replySystemWhere['type'] = 1;
+            $result                   = model('Reply')->selectReply($replySystemWhere);
+            foreach($result as $key=>$vo){
+                // 生成操作按钮
+                $result[$key]['operate'] = $this->makeBotton($vo['id']);
+                $result[$key]['word'] = htmlspecialchars_decode($vo['word']);
+            }
+            $return['rows'] = $result;
+            return json($return);
+        }
+        $this->assign([
+            'socket' => config('socket'),
+        ]);
+
+        return $this->fetch();
+
+    }//end welcoming()
+
+    /**
+     * 修改系统欢迎语
+     *
+     * @access public
+     */
+    public function editWelcome()
+    {
+        if(request()->isAjax()){
+            $param = input('post.');
+            $where['id'] = $param['id'];
+            $data['sort'] = $param['sort'];
+            $data['word'] = htmlspecialchars($param['word']);
+
+            try{
+                model('Reply')->updateReply($where, $data);
+            }catch(\Exception $e){
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '编辑成功']);
+        }
+
+        $id                     = input('param.id');
+        $replySystemWhere['id'] = $id;
+        $replySystem            = model('Reply')->findReply($replySystemWhere);
+
+        $this->assign([
+            'replySystem' => $replySystem,
+            'socket' => config('socket'),
+        ]);
+        return $this->fetch('editwelcome');
+
+    }//end editWelcome()
+
+    /**
+     * 新增系统欢迎语
+     *
+     * @access public
+     */
+    public function delWelcome()
+    {
+        if (request()->isAjax()) {
+            $id = input('param.id');
+            $where['id'] = $id;
+
+            try {
+                model('Reply')->delReply($where);
+            } catch (\Exception $e) {
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '删除成功']);
+        }
+    }
+
+    /**
+     * 新增系统欢迎语
+     *
+     * @access public
+     */
+    public function addWelcome()
+    {
+        if(request()->isAjax()){
+            $param = input('post.');
+            $data['sort'] = $param['sort'];
+            $data['word'] = htmlspecialchars($param['word']);
+            $data['status'] = 1;
+            $data['type'] = 1;
+
+            try{
+                model('Reply')->addReply($data);
+            }catch(\Exception $e){
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '新增成功']);
+        }
+        $this->assign([
+            'socket' => config('socket'),
+        ]);
+
+        return $this->fetch('addwelcome');
+
+    }//end addWelcome()
+
 
     /**
      * 会话设置
@@ -87,12 +203,14 @@ class System extends Base
 
             try {
                 // 修改会话超时.
-                $updateOvertimeData['systemconfig_data'] = $param['overtime'];
-                $updateOvertimeWhere['systemconfig_id']  = 1;
+                $updateOvertimeData['systemconfig_data']    = $param['overtime'];
+                $updateOvertimeData['systemconfig_content'] = $param['overtimeInfo'];
+                $updateOvertimeWhere['systemconfig_id']     = 1;
                 model('Systemconfig')->updateSystemconfig($updateOvertimeWhere, $updateOvertimeData);
                 // 修改访客静默.
-                $upUptdData['systemconfig_data'] = $param['unoperated'];
-                $upUptdWhere['systemconfig_id']  = 2;
+                $upUptdData['systemconfig_data']    = $param['unoperated'];
+                $upUptdData['systemconfig_content'] = $param['unoperatedInfo'];
+                $upUptdWhere['systemconfig_id']     = 2;
                 model('Systemconfig')->updateSystemconfig($upUptdWhere, $upUptdData);
                 // 质检会话时长设置.
                 $upAllTimeData['systemconfig_data'] = $param['verifyAllTime'];
@@ -107,9 +225,13 @@ class System extends Base
                 $upRoundWhere['systemconfig_id']  = 5;
                 model('Systemconfig')->updateSystemconfig($upRoundWhere, $upRoundData);
                 // 客服接待人数设置.
-                $upKfConfigData['max_service']      = $param['max_service'];
-                $upKfConfigData['kfConfig_maxWait'] = $param['kfConfig_maxWait'];
-                db('kf_config')->where('id', 1)->update($upKfConfigData);
+                $upMSWhere['systemconfig_enName'] = 'KFMaxServices';
+                $upMSData['systemconfig_data']    = $param['max_service'];
+                model('Systemconfig')->updateSystemconfig($upMSWhere, $upMSData);
+                // 最大排队人数设置.
+                $upMWWhere['systemconfig_enName'] = 'maxWait';
+                $upMWData['systemconfig_data']    = $param['kfConfig_maxWait'];
+                model('Systemconfig')->updateSystemconfig($upMWWhere, $upMWData);
 
                 return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
             } catch (\Exception $e) {
@@ -119,12 +241,11 @@ class System extends Base
 
         // 获取设置.
         $systemconfig = model('Systemconfig')->selectSystemconfig();
-        $kfConfig     = db('kf_config')->where('id', 1)->find();
         $this->assign(
             [
                 'systemconfig' => $systemconfig,
-                'kfConfig'     => $kfConfig,
                 'status'       => config('kf_status'),
+                'socket' => config('socket'),
             ]
         );
 
@@ -155,6 +276,7 @@ class System extends Base
         $info = db('reply')->where('id', 1)->find();
         $this->assign([
             'info' => $info,
+            'socket' => config('socket'),
             'status' => config('kf_status')
         ]);
 
@@ -164,22 +286,18 @@ class System extends Base
     // 历史会话记录
     public function wordsLog()
     {
-        $toExcel = input('param.toExcel', 0);
+//        $toExcel = input('param.toExcel', 0);
 
         if(request()->isAjax()){
-
             $param = input('param.');
-
             $limit = $param['pageSize'];
             $offset = ($param['pageNumber'] - 1) * $limit;
-
             // 默认显示最近7天
             $start = input('param.start');
             $end = input('param.end');
 
             $user_id = input('param.user_id');
             $group_id = input('param.group_id');
-
             $temp = db('service_log');
             $countTmp = db('service_log');
             if(strlen($param['searchText'])){
@@ -195,18 +313,13 @@ class System extends Base
             //结束时间为空
             if(!empty($start) && empty($end)){
                 $temp = $temp->where('start_time','>',strtotime($start));
-                $countTmp = $temp->where('start_time','>',strtotime($start));
+                $countTmp = $countTmp->where('start_time','>',strtotime($start));
             }
             //开始时间为空
             if(empty($start) && !empty($end)){
                 $temp = $temp->where('start_time','<',strtotime($end . ' 23:59:59'));
-                $countTmp = $temp->where('start_time','<',strtotime($end . ' 23:59:59'));
+                $countTmp = $countTmp->where('start_time','<',strtotime($end . ' 23:59:59'));
             }
-            //开始时间/结束时间都为空(默认查七天)
-//            if(empty($start) && empty($end)){
-//                $temp = $temp->where('start_time','<',time())->where('start_time','>',time()-604800);
-//                $countTmp = $temp->where('start_time','<',time())->where('start_time','>',time()-604800);
-//            }
 
             //客服
             if($user_id != 0){
@@ -217,7 +330,7 @@ class System extends Base
             //客服组
             if($group_id != 0){
                 $temp = $temp->where('group_id', $group_id);
-                $countTmp = $temp->where('group_id', $group_id);
+                $countTmp = $countTmp->where('group_id', $group_id);
             }
 
             $result = $temp->limit($offset, $limit)->order('start_time', 'desc')->select();
@@ -233,16 +346,55 @@ class System extends Base
             foreach($result as $key=>$vo){
                 if($result[$key]['intime'] != 0){
                     $result[$key]['intime'] = date('Y-m-d H:i:s', $vo['intime']);
+
+                    $date = explode(' ',$result[$key]['intime']);
+                    $year = explode('-',$result[$key]['intime']);
+                    if($date[0] == date('Y-m-d',time())){
+                        $result[$key]['intime'] = '<span style="float: right;">'.$date[1].'</span>';
+                    }else if($date[0] == date('Y-m-d',strtotime("-1 day"))){
+                        $result[$key]['intime'] = '<span style="float: right;">'.'昨天 '.$date[1].'</span>';
+                    }else{
+                        if($year[0] == date('Y',time())){
+                            $result[$key]['intime'] = '<span style="float: right;">'.date('m-d H:i:s',strtotime($result[$key]['intime'])).'</span>';
+                        }
+                    }
+
                 }else{
                     $result[$key]['intime'] = '-';
                 }
                 if($result[$key]['start_time'] != 0){
                     $result[$key]['start_time'] = date('Y-m-d H:i:s', $vo['start_time']);
+
+                    $date = explode(' ',$result[$key]['start_time']);
+                    $year = explode('-',$result[$key]['start_time']);
+                    if($date[0] == date('Y-m-d',time())){
+                        $result[$key]['start_time'] = '<span style="float: right;">'.$date[1].'</span>';
+                    }else if($date[0] == date('Y-m-d',strtotime("-1 day"))){
+                        $result[$key]['start_time'] = '<span style="float: right;">'.'昨天 '.$date[1].'</span>';
+                    }else{
+                        if($year[0] == date('Y',time())){
+                            $result[$key]['start_time'] = '<span style="float: right;">'.date('m-d H:i:s',strtotime($result[$key]['start_time'])).'</span>';
+                        }
+                    }
+
                 }else{
                     $result[$key]['start_time'] = '-';
                 }
                 if($result[$key]['end_time'] != 0){
                     $result[$key]['end_time'] = date('Y-m-d H:i:s', $vo['end_time']);
+
+                    $date = explode(' ',$result[$key]['end_time']);
+                    $year = explode('-',$result[$key]['end_time']);
+                    if($date[0] == date('Y-m-d',time())){
+                        $result[$key]['end_time'] = '<span style="float: right;">'.$date[1].'</span>';
+                    }else if($date[0] == date('Y-m-d',strtotime("-1 day"))){
+                        $result[$key]['end_time'] = '<span style="float: right;">'.'昨天 '.$date[1].'</span>';
+                    }else{
+                        if($year[0] == date('Y',time())){
+                            $result[$key]['end_time'] = '<span style="float: right;">'.date('m-d H:i:s',strtotime($result[$key]['end_time'])).'</span>';
+                        }
+                    }
+
                 }else{
                     $result[$key]['end_time'] = '-';
                 }
@@ -285,10 +437,10 @@ class System extends Base
                     $result[$key]['servicelog_close_type'] = '未知';
                 }
                 if($vo['servicelog_close_type'] == 1){
-                    $result[$key]['servicelog_close_type'] = '访客静默';
+                    $result[$key]['servicelog_close_type'] = '无效会话';
                 }
                 if($vo['servicelog_close_type'] == 2){
-                    $result[$key]['servicelog_close_type'] = '会话超时';
+                    $result[$key]['servicelog_close_type'] = '双方静默';
                 }
                 if($vo['servicelog_close_type'] == 3){
                     $result[$key]['servicelog_close_type'] = '客服关闭';
@@ -297,7 +449,10 @@ class System extends Base
                     $result[$key]['servicelog_close_type'] = '客服掉线';
                 }
                 if($vo['servicelog_close_type'] == 5){
-                    $result[$key]['servicelog_close_type'] = '转接';
+                    $result[$key]['servicelog_close_type'] = '转出';
+                }
+                if($vo['servicelog_close_type'] == 6){
+                    $result[$key]['servicelog_close_type'] = '用户关闭';
                 }
 
                 // 生成操作按钮
@@ -309,14 +464,14 @@ class System extends Base
             $return['total'] = $countTmp->count();  //总数据
             $return['rows'] = $result;
 
-            if (!$toExcel) {
-                return json($return);
-            } else {
-                $head = ['工单id', '访客进线时间', '接待客服', '所在组', '访客账号', '开始时间', '结束时间', '会话时长', '响应时长', '关闭原因', '满意度'];
-                $key = ['servicelog_id', 'intime', 'kefu_name', 'group_name', 'user_name', 'start_time', 'end_time', 'conversation', 'response', 'servicelog_close_type', 'evaluate_name'];
-                (new Office())->outdata('工作报表数据导出', $result, $head, $key);
-                return true;
-            }
+//            if (!$toExcel) {
+//                return json($return);
+//            } else {
+//                $head = ['工单id', '访客进线时间', '接待客服', '所在组', '访客账号', '开始时间', '结束时间', '会话时长', '响应时长', '关闭原因', '满意度'];
+//                $key = ['servicelog_id', 'intime', 'kefu_name', 'group_name', 'user_name', 'start_time', 'end_time', 'conversation', 'response', 'servicelog_close_type', 'evaluate_name'];
+//                (new Office())->outdata('工作报表数据导出', $result, $head, $key);
+//                return true;
+//            }
 
             return json($return);
 
@@ -329,7 +484,7 @@ class System extends Base
             for($i=0;$i<count($users);$i++){
                 $option = $option.'<option value="'.$users[$i]['id'].'">'.$users[$i]['user_name'].'</option>';
             }
-            $useroption = '<select lay-verify="required" lay-filter="user_id">'.$option.'</select>';
+            $useroption = '<select class="selector_user" lay-verify="required" lay-filter="user_id" style="height: 30px;">'.$option.'</select>';
         }
         //所有客服组
         $groups = db('groups')->select();
@@ -339,7 +494,7 @@ class System extends Base
             for($j=0;$j<count($groups);$j++){
                 $option = $option.'<option value="'.$groups[$j]['id'].'">'.$groups[$j]['name'].'</option>';
             }
-            $groupoption = '<select lay-verify="required" lay-filter="group_id">'.$option.'</select>';
+            $groupoption = '<select class="selector_group" lay-verify="required" lay-filter="group_id" style="height: 30px;">'.$option.'</select>';
         }
 
         $this->assign([
@@ -360,7 +515,7 @@ class System extends Base
     }
 
     // 历史会话记录详情
-    public function detail($id)
+    public function detail($id, $type='')
     {
         $chat = db('chat_log')->where('servicelog_id',$id)->order('time_line')->select();
         $html = '';
@@ -368,7 +523,7 @@ class System extends Base
             $content = json_decode($chat[$i]['content'], true);
             $chat[$i]['time_line'] = date('H:i',$chat[$i]['time_line']);
             if(!empty($content['text'])){
-                $content['content'] = $content['text'];
+                $content['content'] = '&nbsp&nbsp'.$content['text'].'&nbsp&nbsp';
             }
             if(!empty($content['img'])){
                 $content['content'] = '<img width="100%" src="'.$content['img'].'"/>';
@@ -388,13 +543,22 @@ class System extends Base
             }
 
         }
-        $servicelog = db('service_log')->where('servicelog_id',$id)->find();
+        $redis = new Redis;
+        if ($type === 'onLine') {
+            $servicelog = json_decode($redis->handler()->Hget('SERVICELOG', $id), true);
+        } else {
+            $servicelog = db('service_log')->where('servicelog_id',$id)->find();
+        }
         //满意度
         $evaluate = db('evaluate')->where('evaluate_id',$servicelog['evaluate_id'])->find();
         $evaluate = '<img width="40px" style="margin-top:15px;" src="'.$evaluate['evaluate_url'].'"/>';
 
         //$alarm报警信息
-        $alarm =  db('alarm')->where('servicelog_id',$id)->find();
+        if ($type === 'onLine') {
+            $alarm = json_decode($redis->handler()->Hget('SERVICELOG', $id), true);
+        } else {
+            $alarm =  db('alarm')->where('servicelog_id',$id)->find();
+        }
 
         //会话超时标准
         $verifyAllTime =  db('systemconfig')->where('systemconfig_name','质检会话时长设置')->find();
@@ -417,6 +581,9 @@ class System extends Base
             if($alarm['alarm_respond'] == 1){
                 $span = $span . '<span class="alarm_info">客服未回应</span>';
             }
+            if($alarm['alarm_count'] == 0 && $type !== 'onLine'){
+                $span = $span . '<span class="alarm_info">会话无内容</span>';
+            }
         }
 
         //用户信息
@@ -437,7 +604,8 @@ class System extends Base
     private function makeBtn($id)
     {
         $operate = '<a href="' . url('system/detail', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 详情</button></a> ';
+//        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 详情</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 详情</button></a> ';
 
         return $operate;
     }
@@ -454,16 +622,21 @@ class System extends Base
         return $key;
     }
 
+    //导出数据
     public function toexcel()
     {
         $param = input('param.');
+
+        $limit = $param['pageSize'];
+        $offset = ($param['pageNumber'] - 1) * $limit;
+
         $start = $param['start'];
         $end = $param['end'];
         $where = [];
-        if(!empty($param['user_id'])){
-            $where['user_id'] = $param['user_id'];
+        if($param['user_id'] != 0){
+            $where['kf_id'] = $param['user_id'];
         }
-        if(!empty($param['group_id'])){
+        if($param['group_id'] != 0){
             $where['group_id'] = $param['group_id'];
         }
         if(!empty($param['username'])){
@@ -479,6 +652,33 @@ class System extends Base
         $evaluate = db('evaluate')->select();
         //$alarm报警信息
         $alarm =  db('alarm')->select();
+        //会话超时标准
+        $verifyAllTime =  db('systemconfig')->where('systemconfig_name','质检会话时长设置')->find();
+        //会话响应时长标准
+        $verifyReturnTime =  db('systemconfig')->where('systemconfig_name','质检会话响应时长设置')->find();
+        for($c=0;$c<count($alarm);$c++){
+            $alarm[$c]['alarminfo'] = '';
+            if($alarm[$c]['alarm_userSensitive'] != 0){
+                $alarm[$c]['alarminfo'] .= '访客敏感词/';
+            }
+            if($alarm[$c]['alarm_serverSensitive'] != 0){
+                $alarm[$c]['alarminfo'] .= '客服敏感词/';
+            }
+            if($alarm[$c]['alarm_corresponding'] > $verifyReturnTime['systemconfig_data']){
+                $alarm[$c]['alarminfo'] .= '响应超时/';
+            }
+            if($alarm[$c]['alarm_cvtOvertime'] > $verifyAllTime['systemconfig_data']){
+                $alarm[$c]['alarminfo'] .= '会话超时/';
+            }
+            if($alarm[$c]['alarm_respond'] == 1){
+                $alarm[$c]['alarminfo'] .= '客服未回应/';
+            }
+            if($alarm[$c]['alarm_count'] == 0){
+                $alarm[$c]['alarminfo'] .= '会话无内容';
+            }
+
+        }
+
         foreach($result as $key=>$vo){
             if($result[$key]['intime'] != 0){
                 $result[$key]['intime'] = date('Y-m-d H:i:s', $vo['intime']);
@@ -495,8 +695,9 @@ class System extends Base
             }else{
                 $result[$key]['end_time'] = '-';
             }
-            //客服
+            //客服
             for($i=0;$i<count($users);$i++){
+                $result[$key]['kefu_name'] = '-';
                 if($result[$key]['kf_id'] == $users[$i]['id']){
                     $result[$key]['kefu_name'] = $users[$i]['user_name'];
                 }
@@ -517,9 +718,10 @@ class System extends Base
                 }
             }
 
-            //会话时长/响应时长
+            //会话时长/响应时长/报警信息
             $result[$key]['conversation'] = '';
             $result[$key]['response'] = '';
+            $result[$key]['alarm'] = '';
             for($b=0;$b<count($alarm);$b++){
                 if($result[$key]['servicelog_id'] == $alarm[$b]['servicelog_id']){
                     //会话时长
@@ -530,6 +732,8 @@ class System extends Base
                     $response_min = intval($alarm[$b]['alarm_corresponding']/60);
                     $response_s = $alarm[$b]['alarm_corresponding']%60;
                     $result[$key]['response'] = $response_min.'分'.$response_s.'秒';
+                    //报警信息
+                    $result[$key]['alarminfo'] = $alarm[$b]['alarminfo'];
                 }
             }
 
@@ -537,10 +741,10 @@ class System extends Base
                 $result[$key]['servicelog_close_type'] = '未知';
             }
             if($vo['servicelog_close_type'] == 1){
-                $result[$key]['servicelog_close_type'] = '访客静默';
+                $result[$key]['servicelog_close_type'] = '无效会话';
             }
             if($vo['servicelog_close_type'] == 2){
-                $result[$key]['servicelog_close_type'] = '会话超时';
+                $result[$key]['servicelog_close_type'] = '双方静默';
             }
             if($vo['servicelog_close_type'] == 3){
                 $result[$key]['servicelog_close_type'] = '客服关闭';
@@ -549,7 +753,10 @@ class System extends Base
                 $result[$key]['servicelog_close_type'] = '客服掉线';
             }
             if($vo['servicelog_close_type'] == 5){
-                $result[$key]['servicelog_close_type'] = '转接';
+                $result[$key]['servicelog_close_type'] = '转出';
+            }
+            if($vo['servicelog_close_type'] == 6){
+                $result[$key]['servicelog_close_type'] = '用户关闭';
             }
 
             //工单聊天详情
@@ -559,6 +766,7 @@ class System extends Base
                 $content = json_decode($chat_log[$c]['content'], true);
                 $chat_log[$c]['time_line'] = date('Y-m-d H:i:s',$chat_log[$c]['time_line']);
                 $result[$key]['detail'] = $result[$key]['detail'].' '.$chat_log[$c]['time_line'].' '.$chat_log[$c]['from_name'];
+                $content['content'] = '';
                 if(!empty($content['text'])){
                     $content['content'] = $content['text'];
                 }
@@ -569,10 +777,59 @@ class System extends Base
             }
 
         }
-        $head = ['工单id', '访客进线时间', '接待客服', '所在组', '访客账号', '开始时间', '结束时间', '会话时长', '响应时长', '关闭原因', '满意度','来源ip','来源网站','来源系统','来源浏览器','聊天详情'];
-        $key = ['servicelog_id', 'intime', 'kefu_name', 'group_name', 'user_name', 'start_time', 'end_time', 'conversation', 'response', 'servicelog_close_type', 'evaluate_name','user_ip','website','system','browse','detail'];
+        $head = ['工单id', '访客进线时间', '接待客服', '所在组', '访客账号', '开始时间', '结束时间', '会话时长', '响应时长', '关闭原因', '满意度','来源ip','来源网站','来源系统','来源浏览器','报警信息','聊天详情'];
+        $key = ['servicelog_id', 'intime', 'kefu_name', 'group_name', 'user_name', 'start_time', 'end_time', 'conversation', 'response', 'servicelog_close_type', 'evaluate_name','user_ip','website','system','browse','alarminfo','detail'];
         (new Office())->outdata('工单数据导出', $result, $head, $key);
         return true;
     }
 
+    // 生成按钮
+    private function makeBotton($id)
+    {
+        $operate = '<a href="' . url('editWelcome', ['id' => $id]) . '">';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+
+        $operate .= '<a href="javascript:delWelcome(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        return $operate;
+    }
+
+
+    /**
+     * 验证平台设置
+     *
+     * @access public
+     */
+    public function platform()
+    {
+        // 表单提交.
+        if (request()->isPost()) {
+            $param = input('post.');
+
+            try {
+                $updateWhere['platform_code'] = 'Customer-Service';
+                $updateData = [
+                    'platform_url_token' => $param['urlToken'],
+                    'platform_url_code'  => $param['urlToken'],
+                ];
+                db('platform')->where($updateWhere)->update($updateData);
+                return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
+            } catch (\Exception $e) {
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }//end try
+        }//end if
+
+        // 信息.
+        $settings = db('platform')->find();
+        $this->assign(
+            [
+                'urlToken' => $settings['platform_url_token'],
+                'urlCode' => $settings['platform_url_code'],
+            ]
+        );
+
+        return $this->fetch();
+
+    }//end basics()
+
 }

+ 86 - 16
application/admin/controller/Users.php

@@ -34,13 +34,31 @@ class Users extends Base
             $result = db('users')->where($where)->limit($offset, $limit)->order('id', 'desc')->select();
             foreach($result as $key=>$vo){
                 // 优化显示头像
-                $result[$key]['user_avatar'] = '<img src="' . $vo['user_avatar'] . '" width="40px" height="40px">';
+                $result[$key]['user_avatar'] = '<img src="' . $vo['user_avatar'] . '" height="40px">';
+
+                // 优化显示状态
+                if(0 == $vo['gender']){
+                    $result[$key]['gender'] = '保密';
+                }
+                if(1 == $vo['gender']){
+                    $result[$key]['gender'] = '男';
+                }
+                if(2 == $vo['gender']){
+                    $result[$key]['gender'] = '女';
+                }
 
                 // 优化显示状态
                 if(1 == $vo['status']){
-                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+                    $result[$key]['status'] = '<span style="color: #2fbe1b">启用</span>';
+                }else{
+                    $result[$key]['status'] = '<span style="color: red">禁用</span>';
+                }
+
+                // 优化显示状态
+                if(1 == $vo['user_overview']){
+                    $result[$key]['user_overview'] = '<span style="color: #2fbe1b">启用</span>';
                 }else{
-                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+                    $result[$key]['user_overview'] = '<span style="color: red">禁用</span>';
                 }
 
                 // 查询分组
@@ -79,6 +97,7 @@ class Users extends Base
             $groupsoption = '<select lay-verify="required" lay-filter="group">'.$option.'</select>';
         }
         $this->assign([
+            'socket' => config('socket'),
             'groupsoption' => $groupsoption
         ]);
 
@@ -110,12 +129,17 @@ class Users extends Base
             if(empty($param['group_id'])){
                 return json(['code' => -3, 'data' => '', 'msg' => '请选择分组']);
             }
+            // 检测密码
+            $n = preg_match_all("/^[a-zA-Z\d_]{6,}$/",$param['user_pwd'],$array);
+            if($n != 1){
+                return json(['code' => -8, 'data' => '', 'msg' => '密码长度不够,请重新输入']);
+            }
             // 检测头像
 //            if(empty($param['user_avatar'])){
 //                return json(['code' => -4, 'data' => '', 'msg' => '请上传头像']);
 //            }
 
-            $param['user_pwd'] = md5('123456' . config('salt'));
+            $param['user_pwd'] = md5($param['user_pwd'] . config('salt'));
             $param['online'] = 2; // 离线状态
 
             try{
@@ -143,17 +167,46 @@ class Users extends Base
             $param = input('post.');
             unset($param['file']); // 删除layui头像上传隐藏字段
 
+            // 检测客服工号
+            if(!empty($param['user_job_number'])){
+                $user_job_number = db('users')->where('user_job_number', $param['user_job_number'])->where('id','<>',$param['id'])->find();
+                if(!empty($user_job_number)){
+                    return json(['code' => -2, 'data' => '', 'msg' => '该工号已经存在']);
+                }
+            }
+            if(empty($param['group_id'])){
+                return json(['code' => -3, 'data' => '', 'msg' => '请选择分组']);
+            }
+            // 检测密码
+            if(!empty($param['user_pwd'])){
+                $n = preg_match_all("/^[a-zA-Z\d_]{6,}$/",$param['user_pwd'],$array);
+                if($n != 1){
+                    return json(['code' => -8, 'data' => '', 'msg' => '密码长度不够,请重新输入']);
+                }
+            }
+
             if(empty($param['group_id'])){
                 return json(['code' => -2, 'data' => '', 'msg' => '请选择分组']);
             }
 
             $addar = array();
-            $where = array();
-            $where['id'] = $param['id'];
+            $addar['user_name'] = $param['user_name'];
+            $addar['gender'] = $param['gender'];
+            $addar['user_job_number'] = $param['user_job_number'];
+            if(!empty($param['user_pwd'])){
+                $addar['user_pwd'] = md5($param['user_pwd'] . config('salt'));
+            }
+            $addar['user_email'] = $param['user_email'];
+            $addar['phone'] = $param['phone'];
+            $addar['fullname'] = $param['fullname'];
+            $addar['signature'] = $param['signature'];
             $addar['group_id'] = $param['group_id'];
             $addar['status'] = $param['status'];
-            $addar['user_avatar'] = $param['user_avatar'];
-          
+            $addar['user_overview'] = $param['user_overview'];
+            if(!empty($param['user_avatar'])){
+                $addar['user_avatar'] = $param['user_avatar'];
+            }
+
             try{
                 db('users')->where('id', $param['id'])->update($addar);
             }catch(\Exception $e){
@@ -166,6 +219,7 @@ class Users extends Base
 
         $this->assign([
             'info' => $info,
+            'socket' => config('socket'),
             'status' => config('kf_status'),
             'groups' => db('groups')->select()
         ]);
@@ -209,6 +263,21 @@ class Users extends Base
 
             $file = request()->file('file');
             if (!empty($file)) {
+
+                $fileInfo = $file->getInfo();
+                //return $fileInfo;
+                if ($fileInfo['size'] > 1024 * 512 * 2) {
+                    // 上传失败获取错误信息.
+                    return json(['code' => -2, 'data' => '', 'msg' => '文件超过0.5M'] );
+                }
+
+                //检测图片格式
+                $ext = explode('/', $fileInfo['type']);
+                $ext = array_pop($ext);
+                $extArr = explode('|', 'jpg|png|gif|jpeg');
+                if(!in_array($ext, $extArr)){
+                    return json(['code' => -3, 'data' => '', 'msg' => '只能上传jpg|png|gif|jpeg的文件']);
+                }
                 // 移动到框架应用根目录/public/uploads/ 目录下
                 $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
                 if ($info) {
@@ -218,6 +287,8 @@ class Users extends Base
                     // 上传失败获取错误信息
                     return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
                 }
+            } else {
+                return json(['code' => -2, 'data' => '', 'msg' => '文件超过0.5M'] );
             }
         }
     }
@@ -225,16 +296,15 @@ class Users extends Base
     // 生成按钮
     private function makeBtn($id)
     {
-//        $operate = '<a href="' . url('users/edituser', ['id' => $id]) . '">';
-//        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+//        $operate = '<a href="javascript:resetPwd(' . $id . ')"><button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 重置密码</button></a>';
 
-        $operate = '<a href="javascript:resetPwd(' . $id . ')"><button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 重置密码</button></a>';
-
-        $operate .= '<a style="margin-left:5px;" href="' . url('users/editUser', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate = '<a href="' . url('users/editUser', ['id' => $id]) . '">';
+//        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
-        $operate .= '<a style="margin-left:5px;" href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= '<a href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+//        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         //$operate .= '<a href="javascript:;">';
         //$operate .= '<button type="button" class="btn btn-info btn-sm"><i class="fa fa-institution"></i> 详情</button></a>';

+ 37 - 6
application/admin/controller/Words.php

@@ -35,10 +35,16 @@ class Words extends Base
                 ->select();
             foreach($result as $key=>$vo){
                 // 优化显示状态
+//                if(1 == $vo['status']){
+//                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+//                }else{
+//                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+//                }
+
                 if(1 == $vo['status']){
-                    $result[$key]['status'] = '<span class="label label-primary">启用</span>';
+                    $result[$key]['status'] = '<span style="color: #2fbe1b">启用</span>';
                 }else{
-                    $result[$key]['status'] = '<span class="label label-danger">禁用</span>';
+                    $result[$key]['status'] = '<span style="color: red">禁用</span>';
                 }
 
                 if ($param['type'] == 1) {
@@ -123,7 +129,7 @@ class Words extends Base
         return $this->fetch('editword');
     }
 
-    // 删除常用语
+    // 删除快捷回复
     public function delWord()
     {
         if(request()->isAjax()){
@@ -139,14 +145,28 @@ class Words extends Base
         }
     }
 
+    // 删除全部快捷回复
+    public function delAll()
+    {
+        if(request()->isAjax()){
+            try{
+                db('words')->where('user_id',0)->delete();
+            }catch(\Exception $e){
+                return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
+            }
+
+            return json(['code' => 1, 'data' => '', 'msg' => '删除全部快捷回复成功']);
+        }
+    }
+
     // 生成按钮
     private function makeBtn($id)
     {
         $operate = '<a href="' . url('words/editword', ['id' => $id]) . '">';
-        $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
+        $operate .= '<button type="button" class="btn btn-primary btn-sm"> 编辑</button></a> ';
 
         $operate .= '<a href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
-        $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
+        $operate .= ' 删除</button></a> ';
 
         return $operate;
     }
@@ -159,6 +179,11 @@ class Words extends Base
         Loader::import('PHPExcel.PHPExcel.PHPExcel_Cell');
         //获取表单上传文件
         $file = request()->file('excel');
+        if(empty($file)){
+            $this->error('请先上传文件');
+            return json(['code' => -4, 'data' => '', 'msg' => '请先上传文件']);
+        }
+
         $info = $file->validate(['ext' => 'xlsx'])->move(ROOT_PATH . 'public' . DS . 'uploads');
         //上传验证后缀名,以及上传之后移动的地址
         if ($info) {
@@ -174,20 +199,23 @@ class Words extends Base
                 $info[$k]['title'] = $v[0];
                 $info[$k]['content'] = $v[1];
                 $info[$k]['status'] = $v[2];
-                $info[$k]['update_time'] = date('Y-m-d H:m:s',time());
+                $info[$k]['update_time'] = date('Y-m-d H:i:s',time());
                 $info[$k]['user_id'] = 0;
                 $info[$k]['admin_id'] = session('user_id');
             }
             //检查表中数据是否为空和重复
             for($a=0;$a<count($info);$a++){
                 if(empty($info[$a]['title'])){
+                    $this->error('excel表第'.($a+2).'行快捷词为空');
                     return json(['code' => -3, 'data' => url('words/index'), 'msg' => 'excel表第'.($a+2).'行快捷词为空']);
                 }
                 if(empty($info[$a]['content'])){
+                    $this->error('excel表第'.($a+2).'行内容为空');
                     return json(['code' => -4, 'data' => url('words/index'), 'msg' => 'excel表第'.($a+2).'行内容为空']);
                 }
                 for($b=$a+1;$b<count($info);$b++){
                     if($info[$a]['title'] == $info[$b]['title']){
+                        $this->error('excel表第'.($a+2).'行与第'.($b+2).'行快捷词重复');
                         return json(['code' => -1, 'data' => url('words/index'), 'msg' => 'excel表第'.($a+2).'行与第'.($b+2).'行快捷词重复']);
                     }
                 }
@@ -197,13 +225,16 @@ class Words extends Base
             for($i=0;$i<count($info);$i++){
                 for($j=0;$j<count($words);$j++){
                     if($info[$i]['title'] == $words[$j]['title']){
+                        $this->error('excel表第'.($i+2).'行快捷回复已存在');
                         return json(['code' => -1, 'data' => url('words/index'), 'msg' => 'excel表第'.($i+2).'行快捷回复已存在']);
                     }
                 }
             }
             db('words')->insertAll($info); //批量插入数据
+            $this->success('导入快捷回复成功');
             return json(['code' => 1, 'data' => $this->redirect('words/index'), 'msg' => '导入快捷回复成功']);
         } else {
+            $this->error('导入快捷回复失败');
             return json(['code' => -2, 'data' => url('words/index'), 'msg' => '导入快捷回复失败']);
         }
     }

+ 1 - 1
application/admin/model/Accountsmessage.php

@@ -24,7 +24,7 @@ class Accountsmessage extends Model
     {
         $result = $this;
         $result = $result->alias('a');
-        $result = $result->field('a.message_id,a.name,a.email,a.content,a.add_time,a.message_status,a.user_id,a.dealWith_time,a.image,a.phone,a.qq,a.wechat,a.if_public,a.reply_content,b.name as type_name,c.user_name');
+        $result = $result->field('a.message_id,a.account_id,a.nick_name,a.email,a.content,a.add_time,a.message_status,a.user_id,a.dealWith_time,a.image,a.phone,a.qq,a.wechat,a.if_public,a.reply_content,b.name as type_name,c.user_name');
         if (empty($join) === false) {
             foreach ($join as $k => $v) {
                 $result = $result->join($k, $v,'LEFT');

+ 45 - 0
application/admin/model/Reply.php

@@ -25,6 +25,51 @@ class Reply extends Model
     }//end findReply()
 
 
+    /**
+     * select数据筛选
+     *
+     * @access public
+     * @param mixed $where 数据
+     * @return array 返回类型
+     */
+    public function selectReply($where)
+    {
+        $result = $this->where($where)->order('sort', 'asc')->select();
+        return $result;
+
+    }//end selectReply()
+
+
+    /**
+     * 新增数据
+     *
+     * @access public
+     * @param mixed $data 数据
+     * @return array 返回类型
+     */
+    public function addReply($data)
+    {
+        $result = $this->insert($data);
+        return $result;
+
+    }//end addReply()
+
+
+    /**
+     * 删除数据筛选
+     *
+     * @access public
+     * @param mixed $where 条件
+     * @return array 返回类型
+     */
+    public function delReply($where)
+    {
+        $result = $this->where($where)->delete();
+        return $result;
+
+    }//end delReply()
+
+
     /**
      * 数据修改
      *

+ 19 - 2
application/admin/view/accounts/addlabel.html

@@ -10,6 +10,7 @@
     <link href="__CSS__/animate.min.css" rel="stylesheet">
     <link href="__JS__/layui/css/layui.css" rel="stylesheet">
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+    <script src="../../../../entranceJs/FloatingButton.js"></script>
 </head>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
@@ -31,7 +32,7 @@
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
                                 <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -49,8 +50,16 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
-
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
         form.on('select(menu)', function(value){
@@ -65,6 +74,14 @@
     }
 
     function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
 
         layer.ready(function(){
             layer.close(index);

+ 11 - 11
application/admin/view/accounts/edit.html

@@ -36,38 +36,38 @@
                         <input type="hidden" value="{$info['id']}" name="id"/>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">账号:</label>
-                            <div class="input-group col-sm-4">
+                            <div class="input-group col-sm-5">
                                 <input id="account_name" type="text" class="form-control" name="account_name" required="" aria-required="true" value="{$info['account_name']}" disabled="disabled">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">昵称:</label>
-                            <div class="input-group col-sm-4">
+                            <div class="input-group col-sm-5">
                                 <input id="nick_name" type="text" class="form-control" name="nick_name" aria-required="true" value="{$info['nick_name']}">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">邮箱:</label>
-                            <div class="input-group col-sm-4">
+                            <div class="input-group col-sm-5">
                                 <input id="account_email" type="text" class="form-control" name="account_email" aria-required="true" value="{$info['account_email']}">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">电话:</label>
-                            <div class="input-group col-sm-4">
+                            <div class="input-group col-sm-5">
                                 <input id="account_phone" type="text" class="form-control" name="account_phone" aria-required="true" value="{$info['account_phone']}">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">地址:</label>
-                            <div class="input-group col-sm-4">
+                            <div class="input-group col-sm-5">
                                 <input id="address" type="text" class="form-control" name="address" aria-required="true" value="{$info['address']}">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">标签:</label>
                             <input type="hidden" id="label_id" name="label_id" value="{$info['label_id']}"/>
-                            <div class="input-group col-sm-4 layui-form">
+                            <div class="input-group col-sm-5 layui-form">
                                 <select lay-verify="required" lay-filter="label">
                                     <option value="0">请选择用户标签</option>
                                     {if !empty($label)}
@@ -80,7 +80,7 @@
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">备注:</label>
-                            <div class="input-group col-sm-4">
+                            <div class="input-group col-sm-5">
                                 <input id="remark" type="text" class="form-control" name="remark" aria-required="true" value="{$info['remark']}">
                             </div>
                         </div>
@@ -106,12 +106,12 @@
                             <!--</div>-->
                         <!--</div>-->
 
-                        
+
 
                         <div class="form-group">
-                            <div class="col-sm-4 col-sm-offset-6" style="margin-left: 20%;">
+                            <div class="col-sm-4 col-sm-offset-6">
                                 <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -154,7 +154,7 @@
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
         var upload = layui.upload;
-        
+
         //执行实例
         var uploadInst = upload.render({
             elem: '#up-avatar' //绑定元素

+ 18 - 1
application/admin/view/accounts/editlabel.html

@@ -31,7 +31,7 @@
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
                                 <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -49,7 +49,16 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -65,6 +74,14 @@
     }
 
     function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
 
         layer.ready(function(){
             layer.close(index);

+ 17 - 9
application/admin/view/accounts/index.html

@@ -12,6 +12,14 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
     <!-- Panel Other -->
@@ -24,17 +32,17 @@
             <form id='commentForm' role="form" method="post" class="form-inline pull-right">
                 <div class="content clearfix m-b">
                     <div class="form-group">
-                        <label>注册日期</label>
-                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-604800);?>" style="width: 100px;"> --
-                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time());?>" style="width: 100px;">
+                        <label>注册日期:</label>
+                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-604800);?>" style="width: 100px;height: 30px;"> --
+                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time());?>" style="width: 100px;height: 30px;">
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <div class="input-group col-sm-4 layui-form" style="width: 100px;">
                             <input type="hidden" id="label_id"/>
                             {$labeloption}
                         </div>
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <div class="input-group col-sm-4 layui-form" style="width: 70px;">
                             <input type="hidden" id="account" value="account_name"/>
                             <select lay-verify="required" lay-filter="account">
@@ -45,14 +53,14 @@
                     </div>
                     <div class="form-group">
                         <!--<label>账号:</label>-->
-                        <input type="text" class="form-control" id="username" name="user_name">
+                        <input type="text" class="form-control" id="username" name="user_name" style="height: 30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong> </strong>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索
                         </button>
                     </div>
-                    <div class="form-group" style="margin-left:50px;margin-top: 5px;">
-                        <button class="btn btn-primary" type="button" id="toExcel" name="toExcel" value="0"><strong>导出Excel</strong>
+                    <div class="form-group" style="margin-left:20px;margin-top: 5px;">
+                        <button class="btn btn-primary btn-sm" type="button" id="toExcel" name="toExcel" value="0">导出Excel
                         </button>
                     </div>
                 </div>

+ 20 - 3
application/admin/view/accounts/label.html

@@ -20,7 +20,7 @@
         </div>
         <div class="ibox-content">
             <a href="/admin/accounts/addlabel.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增会员标签</strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
 
@@ -48,7 +48,16 @@
 <script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
 <script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
 <script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
     function initTable() {
         //先销毁表格
         $('#cusTable').bootstrapTable('destroy');
@@ -58,9 +67,9 @@
             url: "{:url('accounts/label')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [10,20],  //记录数可选列表
+            pageList: [20,50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -99,6 +108,14 @@
         layer.confirm('确认删除此标签?', {icon: 3, title:'提示'}, function(index){
             //do something
             $.getJSON("{:url('accounts/delLabel')}", {'id' : id}, function(res){
+              let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+              socket.onopen = function(res) {
+                console.log('握手成功');
+                socket.send(JSON.stringify({
+                  type: 'updatecache',
+                  data: {dtype: ''},
+                }));
+              };
                 if(1 == res.code){
                     layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
                         initTable();

+ 1 - 1
application/admin/view/admins/addadmin.html

@@ -60,7 +60,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 1 - 1
application/admin/view/admins/addpower.html

@@ -60,7 +60,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 1 - 1
application/admin/view/admins/editadmin.html

@@ -60,7 +60,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 1 - 1
application/admin/view/admins/editpower.html

@@ -70,7 +70,7 @@
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
                                 <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 5 - 5
application/admin/view/admins/index.html

@@ -20,7 +20,7 @@
         </div>
         <div class="ibox-content">
             <a href="/admin/admins/addadmin.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增管理员</strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <!--搜索框开始-->
@@ -28,10 +28,10 @@
                 <div class="content clearfix m-b">
                     <div class="form-group">
                         <label>管理员名称:</label>
-                        <input type="text" class="form-control" id="username" name="user_name">
+                        <input type="text" class="form-control" id="username" name="user_name" style="height: 30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong> </strong>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索
                         </button>
                     </div>
                 </div>
@@ -74,9 +74,9 @@
             url: "{:url('admins/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 3 - 3
application/admin/view/admins/power.html

@@ -20,7 +20,7 @@
         </div>
         <div class="ibox-content">
             <a href="/admin/admins/addpower.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增角色</strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <div class="example-wrap">
@@ -58,9 +58,9 @@
             url: "{:url('admins/power')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 144 - 0
application/admin/view/clean/index.html

@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>数据清理</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>数据清理</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('clean/index')}">
+                        <h4 style="margin-bottom: 10px;">聊天数据清理</h4>
+                        <div class="ibox-title">
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">聊天数据:</label>
+                            <div class="input-group col-sm-4 layui-form">
+                                <input type="hidden" name="chat_data" id="chat_data" value="-1"/>
+                                <select lay-verify="required" lay-filter="chat_data">
+                                    <option value="-1">请选择聊天数据时间</option>
+                                    <option value="one_month">一个月前</option>
+                                    <option value="three_month">三个月前</option>
+                                    <option value="six_month">六个月前</option>
+                                    <option value="one_year">一年前</option>
+                                </select>
+                            </div>
+                        </div>
+                        <h4 style="margin-bottom: 10px; margin-top: 40px">客服操作记录清理</h4>
+                        <div class="ibox-title">
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">客服操作记录:</label>
+                            <div class="input-group col-sm-4 layui-form">
+                                <input type="hidden" name="operational_records" id="operational_records" value="-1"/>
+                                <select lay-verify="required" lay-filter="operational_records">
+                                    <option value="-1">请选择客服操作记录时间</option>
+                                    <option value="half_year">半年前</option>
+                                    <option value="one_year">一年前</option>
+                                    <option value="three_year">三年前</option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="form-group" style="margin-top: 40px;">
+                            <label class="col-sm-3 control-label"></label>
+                            <div class="input-group col-sm-4">
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script type="text/javascript">
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(operational_records)', function(value){
+            $("#operational_records").val(value.value);
+        });
+
+        form.on('select(chat_data)', function(value){
+            $("#chat_data").val(value.value);
+        });
+    });
+
+    var index = '';
+    function showStart(){
+        index = layer.load(0, {shade: false});
+        return true;
+    }
+
+    function showSuccess(res){
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+                layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                    window.location.href = res.data;
+                });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function(){
+        // 添加管理员
+        var options = {
+            beforeSubmit:showStart,
+            success:showSuccess
+        };
+
+        $('#commentForm').submit(function(){
+            $(this).ajaxSubmit(options);
+            return false;
+        });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+        highlight: function(e) {
+            $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+        },
+        success: function(e) {
+            e.closest(".form-group").removeClass("has-error").addClass("has-success")
+        },
+        errorElement: "span",
+        errorPlacement: function(e, r) {
+            e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+        },
+        errorClass: "help-block m-b-none",
+        validClass: "help-block m-b-none"
+    });
+
+</script>
+</body>
+</html>

+ 18 - 1
application/admin/view/groups/addgroup.html

@@ -40,7 +40,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -58,7 +58,16 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -71,6 +80,14 @@
     }
 
     function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
 
         layer.ready(function(){
             layer.close(index);

+ 18 - 1
application/admin/view/groups/editgroup.html

@@ -40,7 +40,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -58,7 +58,16 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -71,6 +80,14 @@
     }
 
     function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
 
         layer.ready(function(){
             layer.close(index);

+ 20 - 3
application/admin/view/groups/index.html

@@ -20,7 +20,7 @@
         </div>
         <div class="ibox-content">
             <a href="/admin/groups/addgroup.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增客服组</strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <!--搜索框开始-->
@@ -62,7 +62,16 @@
 <script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
 <script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
 <script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
     function initTable() {
         //先销毁表格
         $('#cusTable').bootstrapTable('destroy');
@@ -72,9 +81,9 @@
             url: "{:url('groups/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -113,6 +122,14 @@
         layer.confirm('确认删除此分组?', {icon: 3, title:'提示'}, function(index){
             //do something
             $.getJSON("{:url('groups/delGroup')}", {'id' : id}, function(res){
+              let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+              socket.onopen = function(res) {
+                console.log('握手成功');
+                socket.send(JSON.stringify({
+                  type: 'updatecache',
+                  data: {dtype: ''},
+                }));
+              };
                 if(1 == res.code){
                     layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
                         initTable();

+ 3 - 2
application/admin/view/index.html

@@ -28,7 +28,8 @@
             <ul class="nav" id="side-menu">
                 <li class="nav-header">
                     <div class="dropdown profile-element">
-                        <span><img alt="image" class="img-circle" src="__IMG__/backlogo.png"/></span>
+                        <span><img alt="image" height="48px" width="48px" class="" src="{$settings['logo']}"/></span>
+                        <span style="font-size:25px;position:absolute;margin:8px 5px;">{$settings['enterprise_name']}</span>
                         <a data-toggle="dropdown" class="dropdown-toggle" href="#">
                             <span class="clear">
                                 <span style="font-size: 18px; margin-top: 20px" onclick="change()" class="block m-t-xs">欢迎您 · <strong class="font-bold"></strong>{$admin['user_name']}</span>
@@ -235,7 +236,7 @@
 
         <div class="form-group">
             <div class="col-sm-4 col-sm-offset-8">
-                <button class="btn btn-primary" type="submit">确认修改</button>
+                <button class="btn btn-primary btn-sm" type="submit">确认修改</button>
             </div>
         </div>
     </form>

+ 267 - 244
application/admin/view/index/index.html

@@ -15,6 +15,14 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content">
     <div class="row">
@@ -112,8 +120,8 @@
             <!--搜索框开始-->
             <form id="realTimeForm"  role="form" method="post" class="form-inline">
                 <div class="content clearfix m-b">
-                    <div class="form-group">
-                        <label>分组名称</label>
+                    <div class="form-group" style="margin-top: 5px;">
+                        <label>分组名称:</label>
                         <div class="input-group col-sm-4 layui-form" style="width: 120px;">
                             <input type="hidden" id="group_id"/>
                             <select lay-verify="required" lay-filter="group">
@@ -126,8 +134,8 @@
                             </select>
                         </div>
                     </div>
-                    <div class="form-group" style="margin-left: 40px">
-                        <label>报警状态</label>
+                    <div class="form-group" style="margin-left: 40px;margin-top: 5px;">
+                        <label>报警状态:</label>
                         <div class="input-group col-sm-4 layui-form" style="width: 120px;">
                             <input type="hidden" id="alarm_id"/>
                             <select lay-verify="required" lay-filter="alarm">
@@ -169,7 +177,7 @@
             <form id='commentForm' style="display: none" role="form" method="get" class="form-inline">
                 <div class="content clearfix m-b">
                     <div class="form-group">
-                        <label>分组名称</label>
+                        <label>分组名称:</label>
                         <div class="input-group col-sm-4 layui-form" style="width: 120px;">
                             <select lay-verify="required" lay-filter="group" name="type1" id="type1">
                                 <option value="">全部客服组</option>
@@ -182,7 +190,7 @@
                         </div>
                     </div>
                     <div class="form-group" style="margin-left: 40px">
-                        <label>登陆状态</label>
+                        <label>登陆状态:</label>
                         <div class="input-group col-sm-4 layui-form" style="width: 120px;">
                             <select lay-verify="required" lay-filter="alarm"  name="type2" id="type2">
                                 <option value="">所有状态</option>
@@ -205,8 +213,7 @@
 
                     <div class="form-group">
                         <lable>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</lable>
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜
-                            索</strong>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索
                         </button>
                     </div>
                 </div>
@@ -237,7 +244,6 @@
         </div>
     </div>
 </div>
-
 <script src="https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js"></script>
 <script src="https://cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
 <script src="/static/admin/js/plugins/echarts/echarts.min.js"></script>
@@ -254,258 +260,275 @@
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
 <script type="text/javascript">
-    function current(id) {
-        $("#type").val(id);
-        if (id == 1) {
-            $("#current1").css("background","#fff");
-            $("#current2").css("background","#eee");
-            $("#realTimeForm").css("display","block");
-            $("#realTimeTable").css("display","block");
-            $("#commentForm").css("display","none");
-            $("#commentTable").css("display","none");
-        } else if (id == 2) {
-            $("#current2").css({"background":"#fff"});
-            $("#current1").css({"background":"#eee"});
-            $("#realTimeForm").css({"display":"none"});
-            $("#realTimeTable").css({"display":"none"});
-            $("#commentForm").css({"display":"block"});
-            $("#commentTable").css({"display":"block"});
-        }
-        initTable()
+  function current(id) {
+    $("#type").val(id);
+    if (id == 1) {
+      $("#current1").css("background","#fff");
+      $("#current2").css("background","#eee");
+      $("#realTimeForm").css("display","block");
+      $("#realTimeTable").css("display","block");
+      $("#commentForm").css("display","none");
+      $("#commentTable").css("display","none");
+    } else if (id == 2) {
+      $("#current2").css({"background":"#fff"});
+      $("#current1").css({"background":"#eee"});
+      $("#realTimeForm").css({"display":"none"});
+      $("#realTimeTable").css({"display":"none"});
+      $("#commentForm").css({"display":"block"});
+      $("#commentTable").css({"display":"block"});
+      initTable()
     }
-    layui.use(['form', 'upload'], function(){
-        var form = layui.form;
-
-        form.on('select(group)', function(value){
-            $("#group_id").val(value.value);
-            onSearch()
-        });
+  }
+  layui.use(['form', 'upload'], function(){
+    var form = layui.form;
 
-        form.on('select(alarm)', function(value){
-            $("#alarm_id").val(value.value);
-            onSearch()
-        });
+    form.on('select(group)', function(value){
+      $("#group_id").val(value.value);
+      onSearch()
     });
-    function initTable() {
-        //先销毁表格
-        $('#cusTable').bootstrapTable('destroy');
-        //初始化表格,动态从服务器加载数据
-        $("#cusTable").bootstrapTable({
-            method: "get",  //使用get请求到服务器获取数据
-            url: "{:url('kfonitoring/kfjiankong')}", //获取数据的地址
-            striped: true,  //表格显示条纹
-            pagination: true, //启动分页
-            pageSize: 50,  //每页显示的记录数
-            pageNumber: 1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
-            sidePagination: "server", //表示服务端请求
-            paginationFirstText: "首页",
-            paginationPreText: "上一页",
-            paginationNextText: "下一页",
-            paginationLastText: "尾页",
-            queryParamsType: "undefined",
-            queryParams: function queryParams(params) {   //设置查询参数
-                var param = {
-                    pageNumber: params.pageNumber,
-                    pageSize: params.pageSize,
-                    searchText: $('#type1').val() + ',' + $('#type2').val() + ',' + $('#type3').val()
-                };
-                return param;
-            },
-            onLoadSuccess: function (res) {  //加载成功时执行
-                if (111 == res.code) {
-                    window.location.reload();
-                }
-                layer.msg("加载成功", {time: 1000});
-            },
-            onLoadError: function () {  //加载失败时执行
-                layer.msg("加载数据失败");
-            }
-        });
-    }
-    $(document).ready(function () {
-        //调用函数,初始化表格
-        initTable();
 
-        //当点击查询按钮的时候执行
-        $("#search").bind("click", initTable);
+    form.on('select(alarm)', function(value){
+      $("#alarm_id").val(value.value);
+      onSearch()
+    });
+  });
+  function initTable() {
+    //先销毁表格
+    $('#cusTable').bootstrapTable('destroy');
+    //初始化表格,动态从服务器加载数据
+    $("#cusTable").bootstrapTable({
+      method: "get",  //使用get请求到服务器获取数据
+      url: "{:url('kfonitoring/kfjiankong')}", //获取数据的地址
+      striped: true,  //表格显示条纹
+      pagination: true, //启动分页
+      pageSize: 50,  //每页显示的记录数
+      pageNumber: 1, //当前第几页
+      pageList: [20, 50],  //记录数可选列表
+      sidePagination: "server", //表示服务端请求
+      paginationFirstText: "首页",
+      paginationPreText: "上一页",
+      paginationNextText: "下一页",
+      paginationLastText: "尾页",
+      queryParamsType: "undefined",
+      queryParams: function queryParams(params) {   //设置查询参数
+        var param = {
+          pageNumber: params.pageNumber,
+          pageSize: params.pageSize,
+          searchText: $('#type1').val() + ',' + $('#type2').val() + ',' + $('#type3').val()
+        };
+        return param;
+      },
+      onLoadSuccess: function (res) {  //加载成功时执行
+        if (111 == res.code) {
+          window.location.reload();
+        }
+        layer.msg("加载成功", {time: 1000});
+      },
+      onLoadError: function () {  //加载失败时执行
+        layer.msg("加载数据失败");
+      }
     });
+  }
+  $(document).ready(function () {
+    //调用函数,初始化表格
+    initTable();
+
+    //当点击查询按钮的时候执行
+    $("#search").bind("click", initTable);
+  });
 </script>
 <!--webSocket-->
 <script>
-    let config = {
-        socket: '{$socket}',
-        token: '{$token}',
-    };
-    let myData = [];
-    let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
-    let getLocation = window.location.href;
-    let host = getLocation.split('/admin')[0];
-    let apiToken = hex_md5('customer-service'+date+host);
-    let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
-    socket.onopen = function(res) {
-        console.log('握手成功');
-        // 登录
-        let login_data = JSON.stringify({
-            type: 'adminInit',
-            token:  config.token
-        });
-        socket.send(login_data);
-    };
-    socket.onmessage = function(res) {
-        var data = eval("("+res.data+")");
-        switch(data['message_type']){
-            // 服务端ping客户端
-            case 'monitor':
-                myData = data.data.cvtList;
-                putMonitor(data.data);
-                break;
+  let config = {
+    socket: '{$socket}',
+    token: '{$token}',
+  };
+  let myData = [];
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
+  let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+  socket.onopen = function(res) {
+    console.log('握手成功');
+    // 登录
+    let login_data = JSON.stringify({
+      type: 'adminInit',
+      token:  config.token
+    });
+    socket.send(login_data);
+  };
+
+  // 心跳检测.
+  setInterval(function(){
+    socket.send(JSON.stringify({
+      type: 'ping',
+    }));
+  }, 5000);
+
+
+  socket.onmessage = function(res) {
+    var data = eval("("+res.data+")");
+    switch(data['message_type']){
+        // 服务端ping客户端
+      case 'monitor':
+        myData = data.data.cvtList;
+        putMonitor(data.data);
+        break;
+    }
+  };
+
+  socket.onclose = function(res) {
+    layer.alert('实时监控连接失败', {
+      title: '错误提示',  icon: 2, closeBtn: 0
+    }, '');
+  };
+
+  /**
+   * 时间戳转化为年 月 日 时 分 秒
+   * time: 传入时间戳
+   * format:返回格式,支持自定义,但参数必须与formateArr里保持一致
+   */
+  function customFormatDateTime(timeStamp,custom,isDtae) {
+    var date = new Date();
+    date.setTime(timeStamp * 1000);
+    var y = date.getFullYear();
+    var m = date.getMonth() + 1;
+    m = m < 10 ? ('0' + m) : m;
+    var d = date.getDate();
+    d = d < 10 ? ('0' + d) : d;
+    var h = date.getHours();
+    h = h < 10 ? ('0' + h) : h;
+    var minute = date.getMinutes();
+    var second = date.getSeconds();
+    minute = minute < 10 ? ('0' + minute) : minute;
+    second = second < 10 ? ('0' + second) : second;
+    if (isDtae == 0){
+      return y + custom + m //+'student';
+    }else if (isDtae ==1){
+      return y + custom + m + custom + d;
+    } else if (isDtae ==2) {
+      return h + ':' + minute;
+    } else {
+      return y + '-' + m + '-' + d + '-' + h + ':' + minute + ':' + second;
+    }
+  };
+  function onSearch() {
+    let table = "";
+    let cvtList = searchData();
+    for(key in cvtList){
+      let start_time = cvtList[key].start_time;
+      let intime = cvtList[key].intime
+      if (key != "length") {
+        table += "<tr>" +
+            "<td>"+cvtList[key].servicelog_id+"</td>" +
+            "<td>"+customFormatDateTime(intime,'',2)+"</td>" +
+            "<td>"+cvtList[key].server_name+"</td>" +
+            "<td>"+cvtList[key].user_name+"</td>" +
+            "<td>"+customFormatDateTime(start_time,'',2)+"</td>" +
+            "<td>"+cvtList[key].allCount+"</td>" +
+            "<td>" +
+            "<a href='/admin/system/detail/id/"+cvtList[key].servicelog_id+"/type/onLine.html'>" +
+            "<button type='button' class='btn btn-primary btn-sm'>" +
+            " 详情" +
+            "</button>" +
+            "</a>" +
+            "</td>" +
+            "</tr>"
+      }
+    }
+    if (table) {
+      $("#table").html(table);
+    } else {
+      $("#table").html("<tr>" +
+          "<td colspan='6' style='text-align: center'>暂无数据</td>" +
+          "</tr>");
+    }
+  }
+  function searchData() {
+    let group_id = $("#group_id").val();
+    let alarm_id = $("#alarm_id").val();
+    let newData = [];
+    if (group_id && alarm_id) {
+      if (alarm_id == 1) {
+        for (keys in myData) {
+          if (group_id == myData[keys].group_id && !myData[keys].allCount) {
+            newData.push(myData[keys])
+          }
         }
-    };
-    /**
-     * 时间戳转化为年 月 日 时 分 秒
-     * time: 传入时间戳
-     * format:返回格式,支持自定义,但参数必须与formateArr里保持一致
-     */
-    function customFormatDateTime(timeStamp,custom,isDtae) {
-        var date = new Date();
-        date.setTime(timeStamp * 1000);
-        var y = date.getFullYear();
-        var m = date.getMonth() + 1;
-        m = m < 10 ? ('0' + m) : m;
-        var d = date.getDate();
-        d = d < 10 ? ('0' + d) : d;
-        var h = date.getHours();
-        h = h < 10 ? ('0' + h) : h;
-        var minute = date.getMinutes();
-        var second = date.getSeconds();
-        minute = minute < 10 ? ('0' + minute) : minute;
-        second = second < 10 ? ('0' + second) : second;
-        if (isDtae == 0){
-            return y + custom + m //+'student';
-        }else if (isDtae ==1){
-            return y + custom + m + custom + d;
-        } else if (isDtae ==2) {
-            return h + ':' + minute;
-        } else {
-            return y + '-' + m + '-' + d + '-' + h + ':' + minute + ':' + second;
+      } else if (alarm_id == 2) {
+        for (keys in myData) {
+          if (group_id == myData[keys].group_id && myData[keys].allCount) {
+            newData.push(myData[keys])
+          }
         }
-    };
-    function onSearch() {
-        let table = "";
-        let cvtList = searchData();
-        for(key in cvtList){
-            let start_time = cvtList[key].start_time;
-            let intime = cvtList[key].intime
-            if (key != "length") {
-                table += "<tr>" +
-                            "<td>"+cvtList[key].servicelog_id+"</td>" +
-                            "<td>"+customFormatDateTime(intime,'',2)+"</td>" +
-                            "<td>"+cvtList[key].server_name+"</td>" +
-                            "<td>"+cvtList[key].user_name+"</td>" +
-                            "<td>"+customFormatDateTime(start_time,'',2)+"</td>" +
-                            "<td>"+cvtList[key].allCount+"</td>" +
-                            "<td>" +
-                                "<a href='/admin/system/detail/id/"+cvtList[key].servicelog_id+".html'>" +
-                                    "<button type='button' class='btn btn-primary btn-sm'>" +
-                                        "<i class='fa fa-paste'></i> 详情" +
-                                    "</button>" +
-                                "</a>" +
-                            "</td>" +
-                        "</tr>"
-            }
+      }
+    } else if(group_id) {
+      for (keys in myData) {
+        if (group_id == myData[keys].group_id) {
+          newData.push(myData[keys])
         }
-        if (table) {
-            $("#table").html(table);
-        } else {
-            $("#table").html("<tr>" +
-                                    "<td colspan='6' style='text-align: center'>暂无数据</td>" +
-                            "</tr>");
+      }
+    } else if(alarm_id) {
+      if (alarm_id == 1) {
+        for (keys in myData) {
+          if (!myData[keys].allCount) {
+            newData.push(myData[keys])
+          }
         }
-    }
-    function searchData() {
-        let group_id = $("#group_id").val();
-        let alarm_id = $("#alarm_id").val();
-        let newData = [];
-        if (group_id && alarm_id) {
-            if (alarm_id == 1) {
-                for (keys in myData) {
-                    if (group_id == myData[key].group_id && !myData[key].allCount) {
-                        newData.push(myData[key])
-                    }
-                }
-            } else if (alarm_id == 2) {
-                for (keys in myData) {
-                    if (group_id == myData[key].group_id && myData[key].allCount) {
-                        newData.push(myData[key])
-                    }
-                }
-            }
-        } else if(group_id) {
-            for (keys in myData) {
-                if (group_id == myData[key].group_id) {
-                    newData.push(myData[key])
-                }
-            }
-        } else if(alarm_id) {
-            if (alarm_id == 1) {
-                for (keys in myData) {
-                    if (!myData[key].allCount) {
-                        newData.push(myData[key])
-                    }
-                }
-            } else if (alarm_id == 2) {
-                for (keys in myData) {
-                    if (myData[key].allCount) {
-                        newData.push(myData[key])
-                    }
-                }
-            }
-        } else {
-            newData = myData
+      } else if (alarm_id == 2) {
+        for (keys in myData) {
+          if (myData[keys].allCount) {
+            newData.push(myData[keys])
+          }
         }
-        return newData;
-    }
-
-    function msg(id) {
-        layui.use('layer', function () {
-                layer.open({
-                    type: 2,
-                    title: '请输入消息内容',
-                    area: ['500px', '600px'], //自定义文本域宽高
-                    content:'/admin/kfnotice/add.html?uid='+id
-                });
-            }
-        )
+      }
+    } else {
+      newData = myData
     }
+    return newData;
+  }
 
-    // 渲染
-    function putMonitor(data) {
-        $("#allSensitive").html(data.userSensitive + data.serverSensitive);
-        $("#userSensitive").html(data.userSensitive);
-        $("#serverSensitive").html(data.serverSensitive);
-        $("#csdNumber").html(data.csdNumber);
-        $("#overtimeNumber").html(data.overtimeNumber);
-        $("#evaluateCount1").html(data.evaluateCount);
-        $("#evaluateCount2").html(data.evaluateCount);
-        // 响应超时.
-        let n = data.csdTime.length;
-        let csdTime = 0;
-        for(keys in data.csdTime){
-            csdTime += data.csdTime[keys]
+  function msg(id) {
+    layui.use('layer', function () {
+          layer.open({
+            type: 2,
+            title: '请输入消息内容',
+            area: ['500px', '600px'], //自定义文本域宽高
+            content:'/admin/kfnotice/add.html?uid='+id
+          });
         }
-        csdTime = csdTime ? Math.ceil(csdTime/n) : 0;
-        $("#csdTime").html(csdTime);
-        // 会话超时.
-        let m = data.overtimeTime.length;
-        let overtimeTime = 0;
-        for(keys in data.overtimeTime){
-            overtimeTime += data.overtimeTime[keys]
-        }
-        overtimeTime = overtimeTime ? Math.ceil(overtimeTime/m) : 0;
-        $("#overtimeTime").html(overtimeTime);
-        onSearch();
+    )
+  }
+
+  // 渲染
+  function putMonitor(data) {
+    $("#allSensitive").html(data.userSensitive + data.serverSensitive);
+    $("#userSensitive").html(data.userSensitive);
+    $("#serverSensitive").html(data.serverSensitive);
+    $("#csdNumber").html(data.csdNumber);
+    $("#overtimeNumber").html(data.overtimeNumber);
+    $("#evaluateCount1").html(data.evaluateCount);
+    $("#evaluateCount2").html(data.evaluateCount);
+    // 响应超时.
+    let n = data.csdTime.length;
+    let csdTime = 0;
+    for(keys in data.csdTime){
+      csdTime += data.csdTime[keys]
+    }
+    csdTime = csdTime ? Math.ceil(csdTime/n) : 0;
+    $("#csdTime").html(csdTime);
+    // 会话超时.
+    let m = data.overtimeTime.length;
+    let overtimeTime = 0;
+    for(keys in data.overtimeTime){
+      overtimeTime += data.overtimeTime[keys]
     }
+    overtimeTime = overtimeTime ? Math.ceil(overtimeTime/m) : 0;
+    $("#overtimeTime").html(overtimeTime);
+    onSearch();
+  }
 </script>
 </body>
 </html>

+ 146 - 0
application/admin/view/iplimit/add.html

@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>添加访问IP</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>添加访问IP</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('iplimit/add')}">
+
+                        <input style="display: none" id="type" name="object" value=""/>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">IP/IP范围:</label>
+                            <div class="input-group col-sm-4" style="width: 320px;">
+                                <input class="form-control" name="ip" required="" aria-required="true" placeholder="ip范围用“-”隔开,例如'127.0.0.1-127.0.0.11'">
+                            </div>
+                        </div>
+                        <!--<div class="form-group">
+                            <label class="col-sm-3 control-label">选择对象:</label>
+                            <input type="hidden" id="sensitivewords_for" name="sensitivewords_for"/>
+                            <div class="input-group col-sm-4 layui-form">
+                                <select lay-verify="required" lay-filter="group">
+                                    <option value="">请选择对象</option>
+                                    <option value="1">用户</option>
+                                    <option value="2">客服</option>
+                                </select>
+                            </div>
+                        </div>-->
+                        <div class="form-group">
+                            <div class="col-sm-4 col-sm-offset-6">
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script type="text/javascript">
+    const myHost = "http://" + window.location.host;
+    const type = getQueryVariable('type');
+    $('#type').val(type);
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(group)', function(value){
+            $("#object").val(value.value);
+        });
+
+        // form.on('select(robotgroups)', function(value){
+        //     $("#robotgroups_id").val(value.value);
+        // });
+    });
+    function getQueryVariable(variable)
+    {
+      var query = window.location.search.substring(1);
+      var vars = query.split("&");
+      for (var i=0;i<vars.length;i++) {
+        var pair = vars[i].split("=");
+        if(pair[0] == variable){return pair[1];}
+      }
+      return(false);
+    }
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+    });
+
+    var index = '';
+    function showStart(){
+        index = layer.load(0, {shade: false});
+        return true;
+    }
+
+    function showSuccess(res){
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+               layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                   window.location.href = myHost + '/admin/iplimit/index';
+               });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function(){
+        // 添加管理员
+        var options = {
+            beforeSubmit:showStart,
+            success:showSuccess
+        };
+
+        $('#commentForm').submit(function(){
+            $(this).ajaxSubmit(options);
+            return false;
+        });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+        highlight: function(e) {
+            $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+        },
+        success: function(e) {
+            e.closest(".form-group").removeClass("has-error").addClass("has-success")
+        },
+        errorElement: "span",
+        errorPlacement: function(e, r) {
+            e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+        },
+        errorClass: "help-block m-b-none",
+        validClass: "help-block m-b-none"
+    });
+
+</script>
+</body>
+</html>

+ 122 - 0
application/admin/view/iplimit/edit.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>编辑访问ip</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>编辑访问ip</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('iplimit/edit')}">
+                        <input type="hidden" name="id" value="{$info['id']}"/>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">访问ip:</label>
+                            <div class="input-group col-sm-4" style="width: 320px;">
+                                <input class="form-control" name="ip" required="" aria-required="true" value="{$info['ip']}" placeholder="ip范围用“-”隔开,例如'127.0.0.1-127.0.0.11'">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <div class="col-sm-4 col-sm-offset-6">
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script type="text/javascript">
+    const myHost = "http://" + window.location.host;
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+    });
+
+    var index = '';
+    function showStart(){
+        index = layer.load(0, {shade: false});
+        return true;
+    }
+
+    function showSuccess(res){
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+                layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                    window.location.href = myHost + '/admin/iplimit/index';
+                });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function(){
+        // 添加管理员
+        var options = {
+            beforeSubmit:showStart,
+            success:showSuccess
+        };
+
+        $('#commentForm').submit(function(){
+            $(this).ajaxSubmit(options);
+            return false;
+        });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+        highlight: function(e) {
+            $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+        },
+        success: function(e) {
+            e.closest(".form-group").removeClass("has-error").addClass("has-success")
+        },
+        errorElement: "span",
+        errorPlacement: function(e, r) {
+            e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+        },
+        errorClass: "help-block m-b-none",
+        validClass: "help-block m-b-none"
+    });
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(group)', function(value){
+            $("#object").val(value.value);
+        });
+
+        // form.on('select(robotgroups)', function(value){
+        //     $("#robotgroups_id").val(value.value);
+        // });
+    });
+</script>
+</body>
+</html>

+ 272 - 0
application/admin/view/iplimit/index.html

@@ -0,0 +1,272 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>访客IP设置列表</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <!-- Panel Other -->
+    <div class="ibox float-e-margins">
+        <input style="display:none;" type="text" value="2" id="type">
+        <div style="display: flex;">
+            <div class="ibox-title" style="width: 100px; cursor:pointer;" id="current1" onclick="current(2)">
+                <h5>客服白名单</h5>
+            </div>
+            <div class="ibox-title" id="current2" style="width: 100px; cursor:pointer; background: #eee" onclick="current(1)">
+                <h5>用户黑名单</h5>
+            </div>
+            <div class="ibox-title" style="width: calc(100% - 200px); background: #eee;">
+            </div>
+        </div>
+        <div class="ibox-content">
+            <a id="add" href="/admin/iplimit/add.html?type=2">
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
+                </button>
+            </a>
+
+
+            <form action="/admin/sensitivec/disjunctor" enctype="multipart/form-data" method="post" role="form" class="form-inline pull-right">
+                <div class="content clearfix m-b">
+                    <div class="form-group" style="margin-left: 20px">
+                        <a href="javascript:disjunctor()" class="btn" style="margin-top:5px;" >
+                            <input type="hidden" id="account_black_list" value="{$settings['account_black_list']}">
+                            <input type="hidden" id="kf_white_list" value="{$settings['kf_white_list']}">
+                            <input type="button" id="disjunctor" class="btn {if($settings['kf_white_list']=='on')}btn-primary{else}btn-danger{/if} btn-sm" value="{$settings['white_list']}" style="height: 30px;margin-top: -7px;">
+                        </a>
+                    </div>
+                </div>
+            </form>
+
+
+            <!--搜索框开始-->
+            <form id='commentForm' role="form" method="post" class="form-inline pull-right">
+                <div class="content clearfix m-b">
+                    <div class="form-group">
+                        <label>IP地址:</label>
+                        <input type="text" class="form-control" id="content" name="content" value="" placeholder="请输入IP地址" style="height: 30px;">
+                        <input style="display: none">
+                    </div>
+                    <div class="form-group">
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索
+                        </button>
+                    </div>
+                </div>
+            </form>
+            <!--搜索框结束-->
+            <div class="example-wrap">
+                <div class="example">
+                    <table id="cusTable">
+                        <thead>
+                        <th data-field="id">ID</th>
+                        <th data-field="ip">IP/IP范围</th>
+                        <th data-field="utime">修改时间</th>
+                        <th data-field="admin">管理员</th>
+                        <th data-field="operate">操作</th>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+
+            <!-- End Example Pagination -->
+        </div>
+    </div>
+</div>
+<!-- End Panel Other -->
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script type="text/javascript">
+    function current(id) {
+        $("#type").val(id);
+        if (id == 1) {
+            $("#current1").css("background","#eee");
+            $("#current2").css("background","#fff");
+            $("#add").attr('href','/admin/iplimit/add.html?type=1');
+            if($('#account_black_list').val() == 'on'){
+                $('#disjunctor').val('关闭用户黑名单');
+                $("#disjunctor").addClass("btn-primary");
+                $("#disjunctor").removeClass("btn-danger");
+            }else{
+                $('#disjunctor').val('开启用户黑名单');
+                $("#disjunctor").addClass("btn-danger");
+                $("#disjunctor").removeClass("btn-primary");
+            }
+
+        } else if (id == 2) {
+            $("#current2").css({"background":"#eee"});
+            $("#current1").css({"background":"#fff"});
+            $("#add").attr('href','/admin/iplimit/add.html?type=2');
+            if($('#kf_white_list').val() == 'on'){
+                $('#disjunctor').val('关闭客服白名单');
+                $("#disjunctor").addClass("btn-primary");
+                $("#disjunctor").removeClass("btn-danger");
+            }else{
+                $('#disjunctor').val('开启客服白名单');
+                $("#disjunctor").addClass("btn-danger");
+                $("#disjunctor").removeClass("btn-primary");
+            }
+        }
+        initTable()
+    }
+    function initTable() {
+        //先销毁表格
+        $('#cusTable').bootstrapTable('destroy');
+        let type = $('#type').val();
+        //初始化表格,动态从服务器加载数据
+        $("#cusTable").bootstrapTable({
+            method: "get",  //使用get请求到服务器获取数据
+            url: "{:url('iplimit/index')}", //获取数据的地址
+            striped: true,  //表格显示条纹
+            pagination: true, //启动分页
+            pageSize: 50,  //每页显示的记录数
+            pageNumber:1, //当前第几页
+            pageList: [20, 50],  //记录数可选列表
+            sidePagination: "server", //表示服务端请求
+            paginationFirstText: "首页",
+            paginationPreText: "上一页",
+            paginationNextText: "下一页",
+            paginationLastText: "尾页",
+            queryParamsType : "undefined",
+            queryParams: function queryParams(params) {   //设置查询参数
+                var param = {
+                    pageNumber: params.pageNumber,
+                    type: type,
+                    pageSize: params.pageSize,
+                    searchText:$('#content').val()
+                };
+                return param;
+            },
+            onLoadSuccess: function(res){  //加载成功时执行
+                if(111 == res.code){
+                    window.location.reload();
+                }
+                layer.msg("加载成功", {time : 1000});
+            },
+            onLoadError: function(){  //加载失败时执行
+                layer.msg("加载数据失败");
+            }
+        });
+    }
+
+    function showSuccess(res){
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+                layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                    window.location.href = myHost + '/admin/iplimit/index';
+                });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function () {
+        //调用函数,初始化表格
+        initTable();
+
+        //当点击查询按钮的时候执行
+        $("#search").bind("click", initTable);
+    });
+
+    function Del(id){
+        layer.confirm('确认删除此ip?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('iplimit/del')}", {'id' : id}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+
+    }
+
+    function disjunctor(){
+        if($('#disjunctor').val() == '开启客服白名单'){
+            var disjunctor = 'on';
+            var type = 'kf';
+        }
+        if($('#disjunctor').val() == '关闭客服白名单'){
+            var disjunctor = 'off';
+            var type = 'kf';
+        }
+        if($('#disjunctor').val() == '开启用户黑名单'){
+            var disjunctor = 'on';
+            var type = 'account';
+        }
+        if($('#disjunctor').val() == '关闭用户黑名单'){
+            var disjunctor = 'off';
+            var type = 'account';
+        }
+        layer.confirm('确认'+$('#disjunctor').val()+'?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('iplimit/disjunctor')}", {'disjunctor':disjunctor,'type':type}, function(res){
+                //console.log(disjunctor);
+                console.log(res);
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                        if(res.msg == '开启客服白名单成功'){
+                            $('#disjunctor').val('关闭客服白名单');
+                            $('#kf_white_list').val('on');
+                            $("#disjunctor").addClass("btn-primary");
+                            $("#disjunctor").removeClass("btn-danger");
+                        }
+                        if(res.msg == '关闭客服白名单成功'){
+                            $('#disjunctor').val('开启客服白名单');
+                            $('#kf_white_list').val('off');
+                            $("#disjunctor").addClass("btn-danger");
+                            $("#disjunctor").removeClass("btn-primary");
+                        }
+                        if(res.msg == '开启用户黑名单成功'){
+                            $('#disjunctor').val('关闭用户黑名单');
+                            $('#account_black_list').val('on');
+                            $("#disjunctor").addClass("btn-primary");
+                            $("#disjunctor").removeClass("btn-danger");
+                        }
+                        if(res.msg == '关闭用户黑名单成功'){
+                            $('#disjunctor').val('开启用户黑名单');
+                            $('#account_black_list').val('off');
+                            $("#disjunctor").addClass("btn-danger");
+                            $("#disjunctor").removeClass("btn-primary");
+                        }
+
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+
+    }
+
+</script>
+</body>
+</html>

+ 19 - 10
application/admin/view/kfnotice/add.html

@@ -70,23 +70,23 @@
 
                         <label class="layui-form-label">内容</label>
                         <div class="layui-input-block">
-                            <textarea name="atext" id="atext" placeholder="请输入内容"  lay-verify="required"
+                            <textarea name="atext" id="atext" placeholder="请输入内容" lay-verify="required"
                                       class="layui-textarea"></textarea>
                         </div>
-                </div>
 
-                <div class="form-group">
-                    <div class="col-sm-4 col-sm-offset-6">
-                        <button class="btn btn-primary" type="submit">提交</button>
-                    </div>
+
+                        <div class="form-group" style="margin-top: 20px;">
+                            <div class="col-sm-4 col-sm-offset-6">
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
                 </div>
-                </form>
             </div>
-        </div>
 
+        </div>
     </div>
 </div>
-</div>
 <script src="__JS__/jquery.min.js?v=2.1.4"></script>
 <script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
 <script src="__JS__/content.min.js?v=1.0.0"></script>
@@ -126,7 +126,12 @@
                     });
                 } else {
                     var index = parent.layer.getFrameIndex(window.name);
-                    parent.layer.close(index);
+                    //alert("公告添加成功");
+                    //parent.layer.close(index);
+                    layer.msg("公告添加成功");
+                    setTimeout(function () {
+                        parent.layer.close(index)
+                    }, 1500);
                 }
             } else if (111 == res.code) {
                 window.location.reload();
@@ -181,6 +186,10 @@
         laydate.render({
             elem: '#sendtime'
             , type: 'datetime'
+            , format: 'yyyy-MM-dd HH:mm:ss'
+            , value: new Date()
+            , btns: ['clear', 'confirm'],
+
         });
     });
 

+ 86 - 19
application/admin/view/kfnotice/index.html

@@ -12,16 +12,24 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/layui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
     <!-- Panel Other -->
     <div class="ibox float-e-margins">
         <div class="ibox-title">
-            <h5>公告列表</h5>
+            <h5  style="font-weight:bold;">公告列表</h5>
         </div>
         <div class="ibox-content">
             <a href="{:url('kfnotice/add')}">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong> </strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <!--搜索框开始-->
@@ -29,14 +37,15 @@
                 <div class="content clearfix m-b">
                     <div class="form-group">
                         <div class="layui-input-inline">
-                            <input type="text" class="layui-input" name="daterang" id="daterang" placeholder="发送时间段"
+                            <input type="text" class="layui-input" name="daterang" id="daterang" placeholder="发送时间段" style="height: 30px;"
                                    readonly="">
                         </div>
                     </div>
 
-                    <div class="form-group">
-                        <div class="layui-input-inline">
-                            <select name="sendtype" id="sendtype" class="form-control">
+                    <div class="form-group" style="margin-left: 10px;">
+                        <div class="input-group col-sm-4 layui-form" style="width: 100px;">
+                            <input type="hidden" id="sendtype" value="0"/>
+                            <select lay-verify="required" lay-filter="sendtype">
                                 <option value="0" selected>全部状态</option>
                                 <option value="1">已发送</option>
                                 <option value="2">延迟发送</option>
@@ -44,9 +53,20 @@
                         </div>
                     </div>
 
-                    <div class="form-group">
-                        <div class="layui-input-inline">
-                            <select name="groupid" id="groupid" class="form-control">
+                    <!--<div class="form-group">-->
+                        <!--<div class="layui-input-inline">-->
+                            <!--<select name="sendtype" id="sendtype" class="form-control">-->
+                                <!--<option value="0" selected>全部状态</option>-->
+                                <!--<option value="1">已发送</option>-->
+                                <!--<option value="2">延迟发送</option>-->
+                            <!--</select>-->
+                        <!--</div>-->
+                    <!--</div>-->
+
+                    <div class="form-group" style="margin-left: 10px;">
+                        <div class="input-group col-sm-4 layui-form" style="width: 100px;">
+                            <input type="hidden" id="groupid" value="0"/>
+                            <select lay-verify="required" lay-filter="groupid">
                                 <option value="0" selected>所有分组</option>
                                 {volist name="groups" id="vo"}
                                 <option value="{$vo.id}">{$vo.name}</option>
@@ -55,21 +75,42 @@
                         </div>
                     </div>
 
-                    <div class="form-group">
-                        <div class="layui-input-inline">
-                            <select name="txttype" id="txttype" class="form-control">
+                    <!--<div class="form-group">-->
+                        <!--<div class="layui-input-inline">-->
+                            <!--<select name="groupid" id="groupid" class="form-control">-->
+                                <!--<option value="0" selected>所有分组</option>-->
+                                <!--{volist name="groups" id="vo"}-->
+                                <!--<option value="{$vo.id}">{$vo.name}</option>-->
+                                <!--{/volist}-->
+                            <!--</select>-->
+                        <!--</div>-->
+                    <!--</div>-->
+
+                    <div class="form-group" style="margin-left: 10px;">
+                        <div class="input-group col-sm-4 layui-form" style="width: 100px;">
+                            <input type="hidden" id="txttype" value="1"/>
+                            <select lay-verify="required" lay-filter="txttype">
                                 <option value="1">标题</option>
                                 <option value="2">内容</option>
                             </select>
                         </div>
                     </div>
 
+                    <!--<div class="form-group">-->
+                        <!--<div class="layui-input-inline">-->
+                            <!--<select name="txttype" id="txttype" class="form-control">-->
+                                <!--<option value="1">标题</option>-->
+                                <!--<option value="2">内容</option>-->
+                            <!--</select>-->
+                        <!--</div>-->
+                    <!--</div>-->
+
                     <div class="form-group">
-                        <input type="text" class="form-control" id="txttext" name="txttext" placeholder="文本">
+                        <input type="text" class="form-control" id="txttext" name="txttext" placeholder="文本" style="height: 30px;">
                     </div>
 
-                    <div class="form-group">
-                        <button class="btn btn-primary" type="button" id="search"><strong>搜 索</strong>
+                    <div class="form-group" style="margin-top: 5px;">
+                        <button class="btn btn-primary btn-sm" type="button" id="search">搜索
                         </button>
                     </div>
 
@@ -81,11 +122,12 @@
                     <table id="cusTable">
                         <thead>
                         <th data-field="title">标题</th>
-                        <th data-field="uid">收件人</th>
+                        <th data-field="user_name">收件人</th>
                         <th data-field="sendtype">发送状态</th>
                         <th data-field="ctime">创建时间</th>
                         <th data-field="sendtime">发送时间</th>
                         <th data-field="readtime">读取时间</th>
+                        <th data-field="admin_name">发件人</th>
                         <th data-field="operate">操作</th>
                         </thead>
                     </table>
@@ -102,7 +144,29 @@
 <script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
 <script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
 <script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.all.js"></script>
+<script type="text/javascript">
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(sendtype)', function(value){
+            $("#sendtype").val(value.value);
+            onSearch()
+        });
+
+        form.on('select(groupid)', function(value){
+            $("#groupid").val(value.value);
+            onSearch()
+        });
+        form.on('select(txttype)', function(value){
+            $("#txttype").val(value.value);
+            onSearch()
+        });
+    });
+
+</script>
 <script type="text/javascript">
     var ReturnRes;
 
@@ -126,9 +190,9 @@
             url: "{:url('kfnotice/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber: 1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -139,7 +203,10 @@
                 var param = {
                     pageNumber: params.pageNumber,
                     pageSize: params.pageSize,
-                    searchText: getSearch()
+                    searchText: getSearch(),
+                    sendtype:$('#sendtype').val(),
+                    groupid:$('#groupid').val(),
+                    txttype:$('#txttype').val()
                 };
                 return param;
             },

+ 1 - 1
application/admin/view/kfonitoring/cpkfjiankong.html

@@ -102,7 +102,7 @@
             pagination: true, //启动分页
             pageSize: 50,  //每页显示的记录数
             pageNumber: 1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 2 - 2
application/admin/view/kfonitoring/index.html

@@ -69,9 +69,9 @@
             url: "{:url('kfnotice/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 51 - 0
application/admin/view/login/aaaa.html

@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta http-equiv="Pragma" content="no-cache">
+    <meta http-equiv="Cache-Control" content="no-cache">
+    <meta http-equiv="Expires" content="0">
+    <title>后台登录</title>
+    <link href="__CSS__/login.css" type="text/css" rel="stylesheet">
+    <link rel="shortcut icon" href="__IMG__/favicon.ico">
+</head>
+<body>
+aaaaaaaaaaaaaaaaaaaaaaa
+<script src="__JS__/jquery.min.js" type="text/javascript"></script>
+<script src="__JS__/layui/layui.js" type="text/javascript"></script>
+
+<script>
+  let config = {
+    socket: '{$socket}',
+  };
+  var accounts = JSON.stringify({$accounts});
+  var accounts = JSON.parse(accounts);
+  console.log(accounts);
+  var i = 0;
+  var n = -1;
+  let time = 0;
+  for (i;i<=100;i++) {
+    time += 2000;
+    var t=setTimeout("aaaa()",time);
+  }
+  function aaaa() {
+    let socket = new WebSocket('ws://' + config.socket);
+    socket.onopen = function(res) {
+      n++;
+      console.log('--------------',accounts[n]['account_name'])
+      // 登录
+      let login_data = JSON.stringify({
+        type: 'userInit',
+        data:  {
+          uid: accounts[n]['id'],
+          name: accounts[n]['account_name'],
+          avatar: '',
+          group: 1,
+        }
+      });
+      socket.send(login_data);
+    }
+  }
+</script>
+</body>
+</html>

+ 1 - 0
application/admin/view/login/index.html

@@ -7,6 +7,7 @@
     <meta http-equiv="Expires" content="0">
     <title>后台登录</title>
     <link href="__CSS__/login.css" type="text/css" rel="stylesheet">
+    <link rel="shortcut icon" href="__IMG__/favicon.ico">
 </head>
 <body>
 

+ 154 - 0
application/admin/view/material/add.html

@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>添加素材</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>添加素材</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('material/add')}">
+
+                        <!--<div class="form-group">-->
+                            <!--<label class="col-sm-3 control-label">客服昵称 <span style="color: red;">*</span>:</label>-->
+                            <!--<div class="input-group col-sm-4">-->
+                                <!--<input id="username" type="text" class="form-control" name="user_name" required="" aria-required="true">-->
+                            <!--</div>-->
+                        <!--</div>-->
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">图片名称:</label>
+                            <div class="input-group col-sm-4">
+                                <input id="useraccount" type="text" class="form-control" name="name" required="" aria-required="true">
+                            </div>
+                        </div>
+
+                        <div class="form-group layui-form-item form-inline" style="height: 60px;">
+                            <input type="hidden" name="material" id="material"/>
+                            <label class="col-sm-3 control-label">素材:</label>
+                            <div class="input-group col-sm-2">
+                                <button type="button" class="layui-btn layui-btn-small" id="up-material">
+                                    <i class="layui-icon"></i>上传图片</button>
+                            </div>
+                            <div class="input-group col-sm-3" id="img_material">
+
+                            </div>
+                            <!--<input type="hidden" name="img_name" id="img_name"/>-->
+                        </div>
+
+                        <div class="form-group">
+                            <div class="col-sm-4 col-sm-offset-6">
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script type="text/javascript">
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+        var upload = layui.upload;
+        //执行实例
+        var uploadInst = upload.render({
+            elem: '#up-material' //绑定元素
+            ,url: "{:url('material/upMaterial')}" //上传接口
+            ,exts: 'png|jpg|jpeg|gif'
+            ,done: function(res){
+                //上传完毕回调
+                if(0 == res.code){
+                    $("#img_material").html('<img src="' + res.data.src + '" height="40px">');
+                    $("#material").val(res.data.src);
+//                    $("#img_name").val(res.data.name);
+                }else{
+                    layer.msg(res.msg);
+                }
+            }
+            ,error: function(){
+                //请求异常回调
+            }
+        });
+
+        form.on('select(group)', function(value){
+            $("#group_id").val(value.value);
+        });
+    });
+
+    var index = '';
+    function showStart(){
+        index = layer.load(0, {shade: false});
+        return true;
+    }
+
+    function showSuccess(res){
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+               layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                   window.location.href = '/admin/material/index.html';
+               });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function(){
+        // 添加管理员
+        var options = {
+            beforeSubmit:showStart,
+            success:showSuccess
+        };
+
+        $('#commentForm').submit(function(){
+            $(this).ajaxSubmit(options);
+            return false;
+        });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+        highlight: function(e) {
+            $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+        },
+        success: function(e) {
+            e.closest(".form-group").removeClass("has-error").addClass("has-success")
+        },
+        errorElement: "span",
+        errorPlacement: function(e, r) {
+            e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+        },
+        errorClass: "help-block m-b-none",
+        validClass: "help-block m-b-none"
+    });
+
+</script>
+</body>
+</html>

+ 200 - 0
application/admin/view/material/index.html

@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>素材库</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+    <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
+</head>
+<style>
+    .img_info{
+        width: 23%;
+        height:120px;
+        float: left;
+        text-align: center;
+        background-color: #DCDCDC;
+        margin: 1%;
+        position: relative;
+    }
+    .img_name{
+        height:23px;
+        line-height: 23px;
+        width: 60%;
+        margin:0 auto;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+</style>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <!-- Panel Other -->
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>素材库</h5>
+        </div>
+        <div class="ibox-content">
+            <a href="/admin/material/add.html">
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
+                </button>
+            </a>
+            <!--搜索框开始-->
+            <form id='commentForm' role="form" method="post" class="form-inline pull-right">
+                <div class="content clearfix m-b" style="margin-top:5px">
+                    <div class="form-group" style="margin-left: 20px;">
+                        <a href="javascript:allDel()" class="" style="margin-top:5px;" ><button type="button" class="btn btn-danger btn-sm">全部删除</button></a>
+                    </div>
+                </div>
+            </form>
+            <!--搜索框结束-->
+            <!--<div style="margin-bottom: 20px;">{$allmaterial}1</div>-->
+            <div style="margin-top: 20px;">
+                {volist name="material" id="vo"}
+                <div class="img_info">
+                    <span class="layui-layer-setwin" style="right: 8px;top:8px;"><a class="layui-layer-ico layui-layer-close layui-layer-close1" href="javascript:Del('{$vo.id}')"></a></span>
+                    <div class="img_name">{$vo.name}</div>
+                    <img src="{$vo.url}"  style="margin-top: 0px;height: 90px;">
+                </div>
+                {/volist}
+            </div>
+            <div style="width: 10%;color: white;">1</div>
+
+            <div class="example-wrap">
+                <!--{$allmaterial}-->
+                <!--<div class="example">-->
+                    <!--<table id="cusTable">-->
+                        <!--<thead>-->
+                        <!--<th data-field="user_account">客服账号</th>-->
+                        <!--<th data-field="user_name">客服昵称</th>-->
+                        <!--<th data-field="user_job_number">客服工号</th>-->
+                        <!--<th data-field="user_email">客服邮箱</th>-->
+                        <!--<th data-field="user_avatar">客服头像</th>-->
+                        <!--<th data-field="phone">客服电话</th>-->
+                        <!--<th data-field="fullname">真实姓名</th>-->
+                        <!--<th data-field="operate">操作</th>-->
+                        <!--</thead>-->
+                    <!--</table>-->
+                <!--</div>-->
+            </div>
+            <!-- End Example Pagination -->
+        </div>
+    </div>
+</div>
+<!-- End Panel Other -->
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script type="text/javascript">
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(user)', function(value){
+            $("#user").val(value.value);
+            onSearch()
+        });
+
+    });
+
+</script>
+<script type="text/javascript">
+    function initTable() {
+        //先销毁表格
+        $('#cusTable').bootstrapTable('destroy');
+        //初始化表格,动态从服务器加载数据
+        $("#cusTable").bootstrapTable({
+            method: "get",  //使用get请求到服务器获取数据
+            url: "{:url('Material/index')}", //获取数据的地址
+            striped: true,  //表格显示条纹
+            pagination: true, //启动分页
+            pageSize: 50,  //每页显示的记录数
+            pageNumber:1, //当前第几页
+            pageList: [20, 50],  //记录数可选列表
+            sidePagination: "server", //表示服务端请求
+            paginationFirstText: "首页",
+            paginationPreText: "上一页",
+            paginationNextText: "下一页",
+            paginationLastText: "尾页",
+            queryParamsType : "undefined",
+            queryParams: function queryParams(params) {   //设置查询参数
+                var param = {
+                    pageNumber: params.pageNumber,
+                    pageSize: params.pageSize,
+                    searchText:$('#username').val(),
+                    user:$('#user').val()
+                };
+                return param;
+            },
+            onLoadSuccess: function(res){  //加载成功时执行
+                if(111 == res.code){
+                    window.location.reload();
+                }
+                layer.msg("加载成功", {time : 1000});
+            },
+            onLoadError: function(){  //加载失败时执行
+                layer.msg("加载数据失败");
+            }
+        });
+    }
+
+    $(document).ready(function () {
+        //调用函数,初始化表格
+        initTable();
+
+        //当点击查询按钮的时候执行
+        $("#search").bind("click", initTable);
+    });
+
+    function Del(id){
+        layer.confirm('确认删除此图片?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('material/del')}", {'id' : id}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        window.location.href = '/admin/material/index.html';
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                    window.location.href = '/admin/material/index.html';
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                    window.location.href = '/admin/material/index.html';
+                }
+            });
+
+            layer.close(index);
+        })
+
+    }
+    function allDel(){
+        layer.confirm('确认删除全部图片?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('material/delAll')}", function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        window.location.href = '/admin/material/index.html';
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+            layer.close(index);
+        })
+    }
+
+</script>
+</body>
+</html>

+ 2 - 2
application/admin/view/menu/index.html

@@ -59,9 +59,9 @@
             url: "{:url('menu/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 1 - 1
application/admin/view/messages/add.html

@@ -38,7 +38,7 @@
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
                                 <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 78 - 11
application/admin/view/messages/detail.html

@@ -12,6 +12,25 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
 </head>
 <body class="gray-bg">
+<div class="layui-layer-shade" id="all_blank" style="display: none"></div>
+<div class="layui-layer layui-layer-dialog" id="check_img" style="display: none;">
+    <div class="layui-layer-title" style="cursor: move;">图片预览</div>
+    <div id="imgs" padding="0" class="layui-layer-content layui-layer-padding" style="height: 70vh;text-align: center;padding: 0;line-height: 70vh;">
+        <img id="large_image" src="" max-width="100%" alt="">
+        <!--{volist name="material" id="vo"}-->
+        <!--<div style="width: 21.5%;height:100px;float: left;text-align: center;background-color: #DCDCDC;margin: 1%;position: relative;">-->
+            <!--<div style="height:23px;line-height: 23px;width:80%;margin: 0 auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 11px;">{$vo.name}</div>-->
+            <!--<img onclick="onCheckImg(`{$vo.url}`)"  src="{$vo.url}"  style="margin-top: 0px;height: 70px;">-->
+        <!--</div>-->
+        <!--{/volist}-->
+    </div>
+    <!--<span class="layui-layer-setwin"></span>-->
+    <div class="layui-layer-btn layui-layer-btn-">
+        <a class="layui-layer-btn0" onclick="closeCheckImg()">取消</a>
+    </div>
+    <span class="layui-layer-resize"></span>
+</div>
+
 <div class="wrapper wrapper-content animated fadeInRight">
     <div class="row">
         <div class="col-sm-8">
@@ -23,9 +42,15 @@
                     <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('Messages/detail')}">
                         <input type="hidden" value="{$info['message_id']}" name="id"/>
                         <div class="form-group">
-                            <label class="col-sm-3 control-label">用户名称:</label>
+                            <label class="col-sm-3 control-label">用户账号:</label>
+                            <div class="input-group col-sm-4">
+                                <input id="account_name" type="text" class="form-control" name="name" required="" aria-required="true" value="{$info['account_name']}" readonly="readonly">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">昵称:</label>
                             <div class="input-group col-sm-4">
-                                <input id="name" type="text" class="form-control" name="name" required="" aria-required="true" value="{$info['name']}" readonly="readonly">
+                                <input id="nick_name" type="text" class="form-control" name="name" required="" aria-required="true" value="{$info['nick_name']}" readonly="readonly">
                             </div>
                         </div>
                         <div class="form-group">
@@ -37,17 +62,20 @@
                         <div class="form-group">
                             <label class="col-sm-3 control-label">内容:</label>
                             <div class="input-group col-sm-4">
-                                <input id="content" type="text" class="form-control" name="content" value="{$info['content']}" readonly="readonly">
+                                <!--<input id="content" type="text" class="form-control" name="content" value="{$info['content']}" readonly="readonly">-->
+                                <textarea autoHeight="true" style="resize:none;" id="content" type="text" class="form-control" name="content"  readonly="readonly">{$info['content']}</textarea>
                             </div>
                         </div>
+                        {if !empty($info['image'])}
                         <div class="form-group layui-form-item form-inline" style="">
                             <input type="hidden" name="user_avatar" id="user_avatar"/>
-                            <label class="col-sm-3 control-label">附件:</label>
+                            <label class="col-sm-3 control-label">留言图片:</label>
 
-                            <div class="input-group col-sm-3" id="avatar">
+                            <div class="input-group col-sm-4" id="avatar">
                                 {$info['image']}
                             </div>
                         </div>
+                        {/if}
                         <div class="form-group">
                             <label class="col-sm-3 control-label">手机:</label>
                             <div class="input-group col-sm-4">
@@ -75,9 +103,20 @@
                         <div class="form-group">
                             <label class="col-sm-3 control-label">回复内容:</label>
                             <div class="input-group col-sm-4">
-                                <input id="reply_content" type="text" class="form-control" name="reply_content" value="{$info['reply_content']}" readonly="readonly">
+                                <!--<input id="reply_content" type="text" class="form-control" name="reply_content" value="{$info['reply_content']}" readonly="readonly">-->
+                                <textarea autoHeight="true" style="resize:none;" id="reply_content" type="text" class="form-control" name="content"  readonly="readonly">{$info['reply_content']}</textarea>
                             </div>
                         </div>
+                        {if !empty($info['images'])}
+                        <div class="form-group layui-form-item form-inline" style="">
+                            <input type="hidden" name="user_avatar" id=""/>
+                            <label class="col-sm-3 control-label">回复图片:</label>
+
+                            <div class="input-group col-sm-4">
+                                {$info['images']}
+                            </div>
+                        </div>
+                        {/if}
                         <div class="form-group">
                             <label class="col-sm-3 control-label">处理时间:</label>
                             <div class="input-group col-sm-4">
@@ -86,13 +125,13 @@
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">选择留言类型:</label>
-                            <input type="hidden" id="type_id" name="type_id" value="-1"/>
+                            <input type="hidden" id="type_id" name="type_id" value="{$info['type_id']}"/>
                             <div class="input-group col-sm-4 layui-form">
                                 <select lay-verify="required" lay-filter="type">
                                     <option value="-1">选择留言类型</option>
                                     {if !empty($messagetype)}
                                     {foreach name="messagetype" item="vo"}
-                                    <option value="{$vo['id']}">{$vo['name']}</option>
+                                    <option value="{$vo['id']}" {if($vo['id']=$info['type_id'])} selected {/if}}>{$vo['name']}</option>
                                     {/foreach}
                                     {/if}
                                 </select>
@@ -106,9 +145,8 @@
                             </div>
                         </div>
                         <div class="form-group">
-                            <div class="col-sm-4 col-sm-offset-6" style="margin-left: 25%;">
-                                <a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>
-                                <button class="btn btn-primary" type="submit" id="button" style="margin-left: 10%;">提交</button>
+                            <div class="col-sm-4 col-sm-offset-6">
+                                <button class="btn btn-primary btn-sm" type="submit" id="button">提交</button>
                             </div>
                         </div>
                     </form>
@@ -126,7 +164,36 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script>
+    $("img").click(function (){
+        $src = $(this)[0].src;
+        $("#large_image").attr('src',$src);
+    })
+    function checkImg() {
+        $("#all_blank").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_img").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImg() {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+    }
+</script>
+
 <script type="text/javascript">
+    $.fn.autoHeight = function(){
+        function autoHeight(elem){
+            elem.style.height = 'auto';
+            elem.scrollTop = 0; //防抖动
+            elem.style.height = elem.scrollHeight + 'px';
+        }
+        this.each(function(){
+            autoHeight(this);
+            $(this).on('keyup', function(){
+                autoHeight(this);
+            });
+        });
+    }
+    $('textarea[autoHeight]').autoHeight();
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;

+ 1 - 1
application/admin/view/messages/edit.html

@@ -38,7 +38,7 @@
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
                                 <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 36 - 18
application/admin/view/messages/index.html

@@ -12,6 +12,14 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
     <!-- Panel Other -->
@@ -24,17 +32,17 @@
             <form id='commentForm' role="form" method="post" class="form-inline pull-right">
                 <div class="content clearfix m-b">
                     <div class="form-group">
-                        <label>留言日期:</label>
-                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-604800);?>" style="width: 100px;"> --
-                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time());?>" style="width: 100px;">
+                        <label>日期:</label>
+                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-604800);?>" style="width: 100px;height: 30px;"> --
+                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time());?>" style="width: 100px;height: 30px;">
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <div class="input-group col-sm-4 layui-form" style="width: 100px;">
                             <input type="hidden" id="user_id"/>
                         {$useroption}
                         </div>
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <!--<label>留言状态:</label>-->
                         <div class="input-group col-sm-4 layui-form" style="width: 100px;">
                             <input type="hidden" id="message_status"/>
@@ -45,7 +53,7 @@
                             </select>
                         </div>
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <!--<label>公开状态:</label>-->
                         <div class="input-group col-sm-4 layui-form" style="width: 100px;">
                             <input type="hidden" id="if_public"/>
@@ -56,18 +64,27 @@
                             </select>
                         </div>
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <div class="input-group col-sm-4 layui-form" style="width: 100px;">
                             <input type="hidden" id="type_id"/>
                         {$optiontype}
                         </div>
                     </div>
-                    <div class="form-group">
-                        <label>用户名称:</label>
-                        <input type="text" class="form-control" id="username" name="user_name" style="width: 100px;">
+                    <!--<div class="form-group" style="margin-left: 10px;">-->
+                        <!--<div class="input-group col-sm-4 layui-form" style="width: 70px;">-->
+                            <!--<input type="hidden" id="account" value="account_name"/>-->
+                            <!--<select lay-verify="required" lay-filter="account">-->
+                                <!--<option value="account_name">账号</option>-->
+                                <!--<option value="nick_name">昵称</option>-->
+                            <!--</select>-->
+                        <!--</div>-->
+                    <!--</div>-->
+                    <div class="form-group" style="margin-left: 10px;">
+                        <label>昵称:</label>
+                        <input type="text" class="form-control" id="username" name="user_name" style="width: 100px;height: 30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜 索</strong>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜 索
                         </button>
                     </div>
                 </div>
@@ -77,14 +94,15 @@
                 <div class="example">
                     <table id="cusTable">
                         <thead>
-                        <th class="user_name" id="user_name" data-field="name">用户名称</th>
-                        <th style="width: 100px" class="add_time" id="add_time" data-field="add_time">留言时间</th>
+                        <th data-field="account_name">用户账号</th>
+                        <th data-field="nick_name">昵称</th>
+                        <th data-field="add_time">留言时间</th>
                         <th data-field="content">留言内容</th>
-                        <th data-field="image">附件</th>
+                        <!--<th data-field="image">附件</th>-->
                         <th data-field="phone">手机</th>
                         <th data-field="email">邮箱</th>
-                        <th data-field="qq">QQ</th>
-                        <th data-field="wechat">微信</th>
+                        <!--<th data-field="qq">QQ</th>-->
+                        <!--<th data-field="wechat">微信</th>-->
                         <th data-field="status">当前状态</th>
                         <th data-field="user_name">处理人</th>
                         <th data-field="reply_content">回复内容</th>
@@ -144,9 +162,9 @@
             url: "{:url('messages/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 3 - 3
application/admin/view/messages/type.html

@@ -20,7 +20,7 @@
         </div>
         <div class="ibox-content">
             <a href="/admin/messages/add.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增留言类型</strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <!--搜索框开始-->
@@ -73,9 +73,9 @@
             url: "{:url('messages/type')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 44 - 10
application/admin/view/report/attendancereport.html

@@ -12,12 +12,20 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/layui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
     <!-- Panel Other -->
     <div class="ibox float-e-margins">
         <div class="ibox-title">
-            <h5>客服考情</h5>
+            <h5  style="font-weight:bold;">客服考勤</h5>
         </div>
         <div class="ibox-content">
 
@@ -25,17 +33,19 @@
             <form id='commentForm' role="form" method="post" class="form-inline pull-right">
                 <div class="content clearfix m-b">
                     <div class="form-group">
+                        <label>考勤日期:</label>
                         <div class="layui-input-inline">
                             <input type="text" class="layui-input" name="daterang"
                                    id="daterang" value="{$dzone}"
                                    placeholder="时间段"
-                                   readonly="">
+                                   readonly="" style="height: 30px;">
                         </div>
                     </div>
 
-                    <div class="form-group">
-                        <div class="layui-input-inline">
-                            <select name="groupid" id="groupid" class="form-control">
+                    <div class="form-group" style="margin-left:10px;">
+                        <div class="input-group col-sm-4 layui-form" style="width: 100px;">
+                            <input type="hidden" id="groupid" value="0"/>
+                            <select lay-verify="required" lay-filter="groupid">
                                 <option value="0" selected>所有分组</option>
                                 {volist name="groups" id="vo"}
                                 <option value="{$vo.id}">{$vo.name}</option>
@@ -44,13 +54,24 @@
                         </div>
                     </div>
 
-                    <div class="form-group">
-                        <button class="btn btn-primary" type="button" id="search"><strong>搜 索</strong>
+                    <!--<div class="form-group">-->
+                        <!--<div class="layui-input-inline">-->
+                            <!--<select name="groupid" id="groupid" class="form-control">-->
+                                <!--<option value="0" selected>所有分组</option>-->
+                                <!--{volist name="groups" id="vo"}-->
+                                <!--<option value="{$vo.id}">{$vo.name}</option>-->
+                                <!--{/volist}-->
+                            <!--</select>-->
+                        <!--</div>-->
+                    <!--</div>-->
+
+                    <div class="form-group" style="margin-top: 5px;">
+                        <button class="btn btn-primary btn-sm" type="button" id="search">搜索
                         </button>
                     </div>
 
-                    <div class="form-group" style="margin-left:50px;">
-                        <button class="btn btn-primary" type="button" id="toExcel" name="toExcel" value="0"><strong>导出Excel</strong>
+                    <div class="form-group" style="margin-left:20px;margin-top: 5px;">
+                        <button class="btn btn-primary btn-sm" type="button" id="toExcel" name="toExcel" value="0">导出Excel
                         </button>
                     </div>
 
@@ -89,6 +110,18 @@
 <script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
 <script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
 <script src="__JS__/layui/layui.all.js"></script>
+<script type="text/javascript">
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(groupid)', function(value){
+            $("#groupid").val(value.value);
+            onSearch()
+        });
+    });
+
+</script>
 <script type="text/javascript">
     var ReturnRes;
 
@@ -112,7 +145,7 @@
             pagination: true, //启动分页
             pageSize: 50,  //每页显示的记录数
             pageNumber: 1, //当前第几页
-            pageList: [20, 50, 100],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -123,6 +156,7 @@
                 var param = {
                     pageNumber: params.pageNumber,
                     pageSize: params.pageSize,
+                    groupid:$('#groupid').val(),
                     searchText: getSearch()
                 };
                 return param;

+ 2 - 2
application/admin/view/report/index.html

@@ -25,12 +25,12 @@
                     <div class="form-group">
                         <label>时间区间:</label>
                         <div class="layui-input-inline">
-                            <input style="width: 180px;" type="text" class="layui-input" name="daterang" id="daterang" value={$defaultTime} placeholder="时间段"
+                            <input style="width: 180px;height: 30px;" type="text" class="layui-input" name="daterang" id="daterang" value={$defaultTime} placeholder="时间段"
                                    readonly="">
                         </div>
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" id="search"><strong> </strong>
+                        <button class="btn btn-primary btn-sm" type="button" id="search">搜索
                         </button>
                     </div>
                 </div>

+ 16 - 8
application/admin/view/report/workreport.html

@@ -12,6 +12,14 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
     <!-- Panel Other -->
@@ -24,11 +32,11 @@
             <form id='commentForm' role="form" method="post" class="form-inline pull-right">
                 <div class="content clearfix m-b">
                     <div class="form-group">
-                        <label>工作日期</label>
-                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-86400);?>" style="width: 100px;"> --
-                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time()-86400);?>" style="width: 100px;">
+                        <label>工作日期:</label>
+                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-86400);?>" style="width: 100px;height: 30px;"> --
+                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time()-86400);?>" style="width: 100px;height: 30px;">
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <div class="input-group col-sm-4 layui-form" style="width: 70px;">
                             <input type="hidden" id="user" value="user_account"/>
                             <select lay-verify="required" lay-filter="user">
@@ -39,14 +47,14 @@
                     </div>
                     <div class="form-group">
                         <!--<label>客服:</label>-->
-                        <input type="text" class="form-control" id="username" name="user_name">
+                        <input type="text" class="form-control" id="username" name="user_name" style="height:30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong> </strong>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索
                         </button>
                     </div>
-                    <div class="form-group" style="margin-left:50px;margin-top:5px">
-                        <button class="btn btn-primary" type="button" id="toExcel" name="toExcel" value="0"><strong>导出Excel</strong>
+                    <div class="form-group" style="margin-left:20px;margin-top:5px">
+                        <button class="btn btn-primary btn-sm" type="button" id="toExcel" name="toExcel" value="0">导出Excel
                         </button>
                     </div>
                 </div>

+ 1 - 1
application/admin/view/reportForm/index.html

@@ -287,7 +287,7 @@
             pagination: true, //启动分页
             pageSize: 50,  //每页显示的记录数
             pageNumber: 1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",

+ 1 - 1
application/admin/view/robot/addword.html

@@ -84,7 +84,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 1 - 1
application/admin/view/robot/editword.html

@@ -84,7 +84,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 60 - 15
application/admin/view/robot/index.html

@@ -20,20 +20,26 @@
         </div>
         <div class="ibox-content">
             <a href="/admin/robot/addword.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong> </strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <form action="/admin/robot/inserExcel" enctype="multipart/form-data" method="post" role="form" class="form-inline pull-right">
-                <div class="content clearfix m-b" style="margin-left: 30px;">
-                    <div class="form-group">
-                        <a href="/static/admin/file/robot.xlsx" class="btn btn-primary" style="margin-top:5px" >下载智能问答模板文件</a>
+                <div class="content clearfix m-b" style="margin-top:5px">
+                    <div class="form-group" style="margin-left: 20px;">
+                        <a href="javascript:allDel()" class="" style="margin-top:5px;" ><button type="button" class="btn btn-danger btn-sm">全部删除</button></a>
                     </div>
-                    <div class="form-group">
-                        <!--<label>导入智能问答:</label>-->
-                        <input type="file" class="form-control" name="excel" style="width: 200px;border: none;" />
-                    </div>
-                    <div class="form-group">
-                        <input type="submit" class="btn btn-primary" style="margin-top:5px" value="导入">
+                    <!--<div class="form-group">-->
+                        <!--<a href="/static/admin/file/robot.xlsx" class="btn btn-primary" style="margin-top:5px" >下载智能问答模板文件</a>-->
+                    <!--</div>-->
+                    <!--<div class="form-group">-->
+                        <!--&lt;!&ndash;<label>导入智能问答:</label>&ndash;&gt;-->
+                        <!--<input type="file" class="form-control" name="excel" style="width: 200px;border: none;" />-->
+                    <!--</div>-->
+                    <!--<div class="form-group">-->
+                        <!--<input type="submit" class="btn btn-primary" style="margin-top:5px" value="导入">-->
+                    <!--</div>-->
+                    <div class="form-group" style="margin-left: 20px;">
+                        <a href="javascript:leadingin()" class="" style="margin-top:5px;" ><button type="button" class="btn btn-primary btn-sm">导入智能问答</button></a>
                     </div>
                 </div>
             </form>
@@ -42,11 +48,11 @@
                 <input style="display: none">
                 <div class="content clearfix m-b">
                     <div class="form-group">
-                        <label>问题关键字:</label>
-                        <input type="text" class="form-control" id="content" name="content">
+                        <label>问题:</label>
+                        <input type="text" class="form-control" id="content" name="content" style="height: 30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong> </strong>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索
                         </button>
                     </div>
                 </div>
@@ -92,9 +98,9 @@
             url: "{:url('robot/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -143,9 +149,48 @@
                     layer.alert(res.msg, {title: '友情提示', icon: 2});
                 }
             });
+            layer.close(index);
+        })
+    }
 
+    function allDel(){
+        layer.confirm('确认删除全部智能问答?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('robot/delAll')}", function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
             layer.close(index);
         })
+    }
+
+    function leadingin(){
+        layer.confirm('<form action="/admin/robot/inserExcel" enctype="multipart/form-data" method="post" role="form" class="form-inline pull-right"> <div class=""><input type="file" class=""  name="excel" style="border: none;" /> </div><div class="" style="margin-top: 20px;"><input type="submit" class="btn btn-primary"  value="开始导入"></div><div class="" style="margin-top: 20px;"> <a href="/static/admin/file/robot.xlsx" style="color:black;" class=""><input type="button"  value="下载智能问答模板文件"></a></div></form>', {icon: 6, title:'导入智能问答'}, function(index){
+            //do something
+            $.getJSON("{:url('robot/inserExcel')}", {'id' : id}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+
+        $('a.layui-layer-btn0').css('display','none');
+        $('.layui-layer-ico').css('display','none');
 
     }
 </script>

+ 1 - 1
application/admin/view/sensitivec/addsensitive.html

@@ -52,7 +52,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 1 - 1
application/admin/view/sensitivec/editsensitive.html

@@ -51,7 +51,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 85 - 17
application/admin/view/sensitivec/index.html

@@ -28,34 +28,39 @@
         </div>
         <div class="ibox-content">
             <a id="add" href="/admin/sensitivec/addsensitive.html?type=2">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong> </strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <form action="/admin/sensitivec/inserExcel" enctype="multipart/form-data" method="post" role="form" class="form-inline pull-right">
-                <div class="content clearfix m-b" style="margin-left: 50px;">
-                    <div class="form-group">
-                        <a href="/static/admin/file/sensitivewords.xlsx" class="btn btn-primary" style="margin-top:5px" >下载敏感词模板文件</a>
-                    </div>
-                    <div class="form-group">
-                        <!--<label>导入敏感词:</label>-->
-                        <input type="file" class="form-control" name="excel" style="width: 200px;border: none;" />
+                <div class="content clearfix m-b" style="margin-top: 5px;">
+                    <div class="form-group" style="margin-left: 20px">
+                        <a href="javascript:allDel()" class="" style="" ><button type="button" class="btn btn-danger btn-sm">全部删除</button></a>
                     </div>
-                    <div class="form-group">
-                        <input type="submit" class="btn btn-primary" style="margin-top:5px" value="导入">
+                    <!--<div class="form-group">-->
+                        <!--<a href="/static/admin/file/sensitivewords.xlsx" class="btn btn-primary"  >下载敏感词模板文件</a>-->
+                    <!--</div>-->
+                    <!--<div class="form-group">-->
+                        <!--&lt;!&ndash;<label>导入敏感词:</label>&ndash;&gt;-->
+                        <!--<input type="file" class="form-control" name="excel" style="width: 200px;border: none;" />-->
+                    <!--</div>-->
+                    <!--<div class="form-group">-->
+                        <!--<input type="submit" class="btn btn-primary"  value="导入">-->
+                    <!--</div>-->
+                    <div class="form-group" style="margin-left: 20px;">
+                        <a href="javascript:leadingin()" class="" ><button type="button" class="btn btn-primary btn-sm">导入敏感词</button></a>
                     </div>
                 </div>
             </form>
             <!--搜索框开始-->
             <form id='commentForm' role="form" method="post" class="form-inline pull-right">
-                <div class="content clearfix m-b">
+                <div class="content clearfix m-b" >
                     <div class="form-group">
-                        <label>敏感词关键字:</label>
-                        <input type="text" class="form-control" id="content" name="content" value="" placeholder="请输入敏感词">
+                        <label>敏感词:</label>
+                        <input type="text" class="form-control" id="content" name="content" value="" placeholder="请输入敏感词" style="height: 30px;">
                         <input style="display: none">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜 索</strong>
-                        </button>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索</button>
                     </div>
                 </div>
             </form>
@@ -111,9 +116,9 @@
             url: "{:url('sensitivec/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -184,6 +189,69 @@
         })
 
     }
+
+    function allDel(){
+        var type = $('#type').val();
+        var name = '';
+        if(type == 1){
+            name = '用户';
+        }
+        if(type == 2){
+            name = '客服';
+        }
+        layer.confirm('确认删除全部'+name+'敏感词?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('sensitivec/delAll')}", {'type' : type}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+
+    }
+
+
+    function leadingin(){
+        layer.confirm('<form action="/admin/sensitivec/inserExcel" enctype="multipart/form-data" method="post" role="form" class="form-inline pull-right"> <div class=""><input type="file" class="" id="insert"  name="excel" style="border: none;" /> </div><div class="" style="margin-top: 20px;"><input type="submit" id="daoru" class="btn btn-primary btn-sm"  value="开始导入"></div><div class="" style="margin-top: 20px;"> <a href="/static/admin/file/sensitivewords.xlsx" style="color:black;" class=""><input type="button"  value="下载敏感词模板文件"></a></div></form>', {icon: 6, title:'导入敏感词'}, function(index){
+            //do something
+            $.getJSON("{:url('sensitivec/inserExcel')}", {'id' : id}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+
+        $('a.layui-layer-btn0').css('display','none');
+        $('.layui-layer-ico').css('display','none');
+
+//        $('#daoru').click(function () {
+//            $.post("{:url('sensitivec/inserExcel')}", $('.form-inline').serialize(), function (result) {
+//                console.log(result);
+//                if (result.code == 1) {
+//                    layer.msg(result.msg, {icon: 1});
+//                }  else {
+//                    layer.msg(result.msg, {icon: 5});
+//                }
+//            }, 'json');
+//        });
+
+    }
 </script>
 </body>
 </html>

+ 42 - 10
application/admin/view/settings/add.html

@@ -12,6 +12,25 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
 </head>
 <body class="gray-bg">
+
+<div class="layui-layer-shade" id="all_blank" style="display: none"></div>
+<div class="layui-layer layui-layer-dialog" id="check_img" style="display: none">
+    <div class="layui-layer-title" style="cursor: move;">请选择图片</div>
+    <div id="imgs" padding="0" class="layui-layer-content layui-layer-padding" style="height: 70vh;">
+        {volist name="material" id="vo"}
+        <div style="width: 21.5%;height:100px;float: left;text-align: center;background-color: #DCDCDC;margin: 1%;position: relative;">
+            <div style="height:23px;line-height: 23px;width:80%;margin: 0 auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 11px;">{$vo.name}</div>
+            <img onclick="onCheckImg(`{$vo.url}`)"  src="{$vo.url}"  style="margin-top: 0px;height: 70px;">
+        </div>
+        {/volist}
+    </div>
+    <span class="layui-layer-setwin"></span>
+    <div class="layui-layer-btn layui-layer-btn-">
+        <a class="layui-layer-btn0" onclick="closeCheckImg()">取消</a>
+    </div>
+    <span class="layui-layer-resize"></span>
+</div>
+
 <div class="wrapper wrapper-content animated fadeInRight">
     <div class="row">
         <div class="col-sm-8">
@@ -28,12 +47,6 @@
                                 <input id="name" type="text" class="form-control" name="name" required="" aria-required="true" placeholder="最多输入四个中文汉字">
                             </div>
                         </div>
-                        <div class="form-group">
-                            <label class="col-sm-3 control-label">上边距(px):</label>
-                            <div class="input-group col-sm-4">
-                                <input id="margin_top" type="text" class="form-control" name="margin_top" required="" aria-required="true" placeholder="请输入整数">
-                            </div>
-                        </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">排列顺序:</label>
                             <div class="input-group col-sm-4">
@@ -57,19 +70,22 @@
                         <div class="form-group layui-form-item form-inline" style="height: 60px;">
                             <input type="hidden" name="image" id="image"/>
                             <label class="col-sm-3 control-label">图片:</label>
-                            <div class="input-group col-sm-2">
+                            <div class="input-group col-sm-1">
                                 <button type="button" class="layui-btn layui-btn-small" id="up-image">
                                     <i class="layui-icon"></i>上传图片</button>
                             </div>
                             <span>建议上传42px*42px</span>
-                            <div class="input-group col-sm-3" id="images">
 
+                            <button type="button" class="layui-btn layui-btn-small" id="" onclick="checkImg()">选择图片</button>
+
+                            <div class="input-group col-sm-3" id="images">
+                                <img src="" id="onChoiceImg" height="40px">
                             </div>
                         </div>
 
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -87,6 +103,22 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script>
+    function checkImg() {
+        $("#all_blank").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_img").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImg() {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+    }
+    function onCheckImg(path) {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+        $("#onChoiceImg").attr('src',path);
+        $("#image").val(path);
+    }
+</script>
 <script type="text/javascript">
 
     layui.use(['form', 'upload'], function(){
@@ -100,7 +132,7 @@
             ,done: function(res){
                 //上传完毕回调
                 if(0 == res.code){
-                    $("#images").html('<img src="' + res.data.src + '" width="50px" height="50px">');
+                    $("#images").html('<img src="' + res.data.src + '" id="onChoiceImg" height="40px">');
                     $("#image").val(res.data.src);
                 }else{
                     layer.msg(res.msg);

+ 189 - 0
application/admin/view/settings/demo.html

@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>效果展示</title>
+</head>
+<body class="gray-bg">
+<script type="text/javascript">
+
+  var xmlhttp=new XMLHttpRequest();
+  var data = [];//配置信息
+  var appip_source = '';
+  var appuip_user = '';
+  var isIE=!!window.ActiveXObject;    //是否IE浏览器
+  var isIE6=isIE&&!window.XMLHttpRequest;  //是否IE6浏览器
+  var isIE7=isIE&&!isIE6&&!isIE8;  //是否IE7浏览器
+  var isIE8=isIE&&!!document.documentMode;  //是否IE8浏览器
+  var availheight = screen.availHeight;   //默认高度为屏幕的高度
+  var hostname = location.protocol+'//'+location.host;
+  var adminDomain = 'http://kfadmin.bocai186.com';   //服务器域名
+  var serverDomain = 'http://kefu.bocai186.com';   //客服域名
+  var userDomain = 'http://kf.bocai186.com?pid='+escape("这就是一个编码没有什么用啊");   //用户域名
+  if(isIE8){
+    availheight= screen.height;
+  }
+  //IE11升级弹出窗口小
+  if (!!window.ActiveXObject || "ActiveXObject" in window){
+    availheight= screen.height;
+  }
+  function getQueryVariable(variable)
+  {
+    var query = window.location.search.substring(1);
+    var vars = query.split("&");
+    for (var i=0;i<vars.length;i++) {
+      var pair = vars[i].split("=");
+      if(pair[0] == variable){return pair[1];}
+    }
+    return(false);
+  }
+
+  var div = document.createElement('div');
+
+  //ajax获取浮动按钮和提示配置信息
+  xmlhttp.open("GET",hostname+"/service/Index/getGuestEnter?t="+ Math.random(),true);
+  xmlhttp.send();
+  var runTime = getQueryVariable('runTime');
+  var runContent = decodeURI(getQueryVariable('runContent'));
+  var distance = getQueryVariable('distance');
+  xmlhttp.onreadystatechange=function(){
+    if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
+      console.log(JSON.parse(xmlhttp.responseText));
+      let res = JSON.parse(xmlhttp.responseText);
+      if(res.code == 1 ){
+        data = res.data;
+        //浮动按钮样式
+        div.style= `position: fixed; right:15px; top:${distance}px;width:80px;background: #867c7c00;border-radius: 10px 0 0 10px;
+            display:flex;flex-direction: column; justify-content: space-between;`;
+        div.style.height = 80*(data.length)+'px';
+        //拼接浮动按钮样式
+        let btn_html ='';
+        for(let i = 0 ;i<data.length-1;i++){
+          btn_html += `<div id='set_user_info_${data[i].group_id}' style="width:80px;height:80px;background:#9a949775;display:flex;
+                flex-direction: column;justify-content: center;align-items: center; cursor:pointer;z-index:1000; ">
+                <img  id='set_user_img_${data[i].group_id}'src='${data[i].image}'></img>
+                <span id='set_user_span_${data[i].group_id}' style="font-size:12px;font-weight:bold; color: #f0f0f0;">${data[i].name}</span> </div>`;
+        }
+        div.innerHTML = btn_html;
+      }
+      //延时显示提示框
+      setTimeout(function(){
+        create_prompt_box();
+      }, runTime*1000);
+    }
+  }
+
+  /***
+   * 打开会话窗口
+   */
+  div.onclick =function(e){
+    console.log(window.location.href)
+    var index=e.target.id.lastIndexOf("_");
+    // console.log(e.target,index);
+    var group_id  = e.target.id.substring(index+1,e.target.id.length);
+    console.log(window);
+    if(appuip_user && appip_source){
+      openWindowCenter(userDomain+"&appid="+appip_source+"&appuid="+appuip_user+'&group_id='+group_id,700,700);
+    }else{
+      openWindowCenter(userDomain+"&appid="+appip_source+"&appuid="+appuip_user,700,700);
+    }
+  }
+  //将浮动按钮添加到对应到网站body上
+  document.body.appendChild(div);
+
+
+
+  /**
+   * 提示框样式
+   */
+  function create_prompt_box(){
+    var popupWindowBox = document.createElement('div');
+    popupWindowBox.style = `position: fixed; top:35%; padding: 10px; left:45%;width:350px;height:160px;
+    background:#e5e5e5;border-radius:10px;font-size:17px;display:flex; flex-direction: column;
+    justify-content: space-between;z-index:9999;`;
+    //拼接提示框样式
+    popupWindowBox.innerHTML =`
+    <div style='display:flex;flex-direction: row;justify-content: center;'>
+    <span style="font-weight:bold; color: #666666;">${runContent}</span>
+    </div>
+    <div style='flex-direction: row;display:flex;justify-content: flex-end;'>
+    <div id="$startSession" style='margin-right: 10px; padding: 4px;border: 1px solid #999; border-radius: 4px; color: #666666;font-weight: bold;cursor:pointer;'>开始会话</div>
+    <div id="$cancel" style="padding: 3px;border: 1px solid #999; border-radius: 4px; color: #666666;font-weight: bold;cursor:pointer;">下次再说</div>
+    </div>
+    `;
+    popupWindowBox.onclick =function(e){
+      if(e.target.id == '$startSession'){
+        openWindowCenter(userDomain+"&appid="+appip_source+"&appuid="+appuip_user,700,700);
+      }else if(e.target.id == '$cancel'){
+        popupWindowBox.style.display="none";
+      }
+    }
+
+
+    //将提示框添加到对应到网站body上
+    document.body.appendChild(popupWindowBox);
+  }
+
+  // padding: 3px;border: 1px solid #999; border-radius: 4px; color: #666666;font-weight: bold;
+
+  // /***
+  //  *
+  //  */
+  // function   (){
+
+  // }
+
+  /**
+   * 打开一个居中的窗口
+   * @param pageUrl url链接
+   * @param innerWidth 宽度,不带px,小于0表示百分比
+   * @param innerHeight 高度,不带px,小于0表示百分比
+   */
+  function openWindowCenter(pageUrl, innerWidth, innerHeight){
+    var screenWidth = screen.availWidth;
+    var screenHeight = screen.availHeight;
+    var width = screenWidth;
+    var height = screenHeight;
+
+    if(innerWidth < 1){
+      width = screenWidth * innerWidth;
+      screenWidth = (screen.availWidth - width)/2;
+    }else{
+      width = innerWidth;
+      screenWidth = (screen.availWidth - innerWidth)/2;
+    }
+    if(innerHeight < 1){
+      height = screenHeight * innerHeight;
+      screenHeight = (screen.availHeight - height)/2;
+    }else{
+      height = innerHeight;
+      screenHeight = (screen.availHeight - innerHeight)/2;
+    }
+    window.open(pageUrl, "", "left=" + screenWidth + ",top=" + screenHeight +",width=" + width + ",height=" + height + ",resizable=no,scrollbars=no,status=no,toolbar=no,menubar=no,location=no");
+  };
+
+
+  //html页面调用
+  /**
+   * 获取数据
+   */
+  function set_user_info_js(a,b){
+    appip_source = a;
+    appuip_user=b;
+  }
+
+  //vue调用
+  // export default {
+  //     /**
+  //      * 获取数据
+  //      */
+  //     set_user_info_vue: function (a,b){
+  //         appip_source = a;
+  //         appuip_user =b;
+  //     }
+  // }
+
+</script>
+</body>
+</html>

+ 43 - 11
application/admin/view/settings/edit.html

@@ -12,6 +12,25 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
 </head>
 <body class="gray-bg">
+
+<div class="layui-layer-shade" id="all_blank" style="display: none"></div>
+<div class="layui-layer layui-layer-dialog" id="check_img" style="display: none">
+    <div class="layui-layer-title" style="cursor: move;">请选择图片</div>
+    <div id="imgs" padding="0" class="layui-layer-content layui-layer-padding" style="height: 70vh;">
+        {volist name="material" id="vo"}
+        <div style="width: 21.5%;height:100px;float: left;text-align: center;background-color: #DCDCDC;margin: 1%;position: relative;">
+            <div style="height:23px;line-height: 23px;width:80%;margin: 0 auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 11px;">{$vo.name}</div>
+            <img onclick="onCheckImg(`{$vo.url}`)"  src="{$vo.url}"  style="margin-top: 0px;height: 70px;">
+        </div>
+        {/volist}
+    </div>
+    <span class="layui-layer-setwin"></span>
+    <div class="layui-layer-btn layui-layer-btn-">
+        <a class="layui-layer-btn0" onclick="closeCheckImg()">取消</a>
+    </div>
+    <span class="layui-layer-resize"></span>
+</div>
+
 <div class="wrapper wrapper-content animated fadeInRight">
     <div class="row">
         <div class="col-sm-8">
@@ -28,12 +47,6 @@
                                 <input id="name" type="text" class="form-control" name="name" required="" aria-required="true" value="{$info['name']}">
                             </div>
                         </div>
-                        <div class="form-group">
-                            <label class="col-sm-3 control-label">上边距(px):</label>
-                            <div class="input-group col-sm-4">
-                                <input id="margin_top" type="text" class="form-control" name="margin_top" required="" aria-required="true" value="{$info['margin_top']}">
-                            </div>
-                        </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">排序:</label>
                             <div class="input-group col-sm-4">
@@ -57,20 +70,23 @@
                         <div class="form-group layui-form-item form-inline" style="height: 60px;">
                             <input type="hidden" name="image" id="image" value="{$info['image']}"/>
                             <label class="col-sm-3 control-label">图片:</label>
-                            <div class="input-group col-sm-2">
+                            <div class="input-group col-sm-1">
                                 <button type="button" class="layui-btn layui-btn-small" id="up-image">
                                     <i class="layui-icon"></i>上传图片</button>
                             </div>
                             <span>建议上传42px*42px</span>
+
+                            <button type="button" class="layui-btn layui-btn-small" id="" onclick="checkImg()">选择图片</button>
+
                             <div class="input-group col-sm-3" id="images">
-                                <img src="{$info['image']}" width="40px" height="40px"/>
+                                <img src="{$info['image']}" id="onChoiceImg" height="40px"/>
                             </div>
                         </div>
 
                         <div class="form-group">
-                            <div class="col-sm-4 col-sm-offset-6" style="margin-left: 20%;">
+                            <div class="col-sm-4 col-sm-offset-6">
                                 <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
-                                <button class="btn btn-primary" type="submit" style="margin-left: 10%;">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -88,6 +104,22 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script>
+    function checkImg() {
+        $("#all_blank").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_img").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImg() {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+    }
+    function onCheckImg(path) {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+        $("#onChoiceImg").attr('src',path);
+        $("#image").val(path);
+    }
+</script>
 <script type="text/javascript">
 
     layui.use(['form', 'upload'], function(){
@@ -102,7 +134,7 @@
             ,done: function(res){
                 //上传完毕回调
                 if(0 == res.code){
-                    $("#images").html('<img src="' + res.data.src + '" width="50px" height="50px">');
+                    $("#images").html('<img src="' + res.data.src + '" id="onChoiceImg" height="40px">');
                     $("#image").val(res.data.src);
                 }else{
                     layer.msg(res.msg);

+ 189 - 0
application/admin/view/settings/entrancelist.html

@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>功能菜单</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+    <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <!-- Panel Other -->
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>接入文件列表</h5>
+        </div>
+        <div class="ibox-content">
+            <a href="/admin/settings/index.html" style="margin-top: -10px">
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
+                </button>
+            </a>
+            <div class="example-wrap">
+                <div class="example">
+                    <table id="cusTable">
+                        <thead>
+                        <!--<th data-field="id">id</th>-->
+                        <th data-field="fileName">文件名称</th>
+                        <th data-field="addTime">生成时间</th>
+                        <th data-field="lastLoad">最后访问时间</th>
+                        <th data-field="operate">最后访问时间</th>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+            <!-- End Example Pagination -->
+        </div>
+    </div>
+</div>
+<!-- End Panel Other -->
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script type="text/javascript">
+    function goDemo() {
+      let runTime = $('#runTime').val();
+      let runContent = $('#runContent').val();
+      let distance = $('#distance').val();
+      window.open("/admin/Settings/demo.html?runTime="+runTime+"&runContent="+runContent+"&distance="+distance);
+    }
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(group)', function(value){
+            $("#group_id").val(value.value);
+            onSearch()
+        });
+
+    });
+
+</script>
+<script type="text/javascript">
+    function initTable() {
+        //先销毁表格
+        $('#cusTable').bootstrapTable('destroy');
+        //初始化表格,动态从服务器加载数据
+        $("#cusTable").bootstrapTable({
+            method: "get",  //使用get请求到服务器获取数据
+            url: "{:url('settings/entranceList')}", //获取数据的地址
+            striped: true,  //表格显示条纹
+            pagination: false, //启动分页
+            pageSize: 50,  //每页显示的记录数
+            pageNumber:1, //当前第几页
+            pageList: [20, 50],  //记录数可选列表
+            sidePagination: "server", //表示服务端请求
+            paginationFirstText: "首页",
+            paginationPreText: "上一页",
+            paginationNextText: "下一页",
+            paginationLastText: "尾页",
+            queryParamsType : "undefined",
+            queryParams: function queryParams(params) {   //设置查询参数
+                var param = {
+                    pageNumber: params.pageNumber,
+                    pageSize: params.pageSize,
+                    group_id:$('#group_id').val(),
+                    searchText:$('#username').val()
+                };
+                return param;
+            },
+            onLoadSuccess: function(res){  //加载成功时执行
+                if(111 == res.code){
+                    window.location.reload();
+                }
+                layer.msg("加载成功", {time : 1000});
+            },
+            onLoadError: function(){  //加载失败时执行
+                layer.msg("加载数据失败");
+            }
+        });
+    }
+
+    $(document).ready(function () {
+        //调用函数,初始化表格
+        initTable();
+
+        //当点击查询按钮的时候执行
+        $("#search").bind("click", initTable);
+    });
+
+    function DelFile(fileName){
+        layer.confirm('确认删除此入口文件吗?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('settings/delFile')}", {'fileName' : fileName}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+            layer.close(index);
+        })
+    }
+    function showStart(){
+      index = layer.load(0, {shade: false});
+      return true;
+    }
+
+    function showSuccess(res){
+
+      layer.ready(function(){
+        layer.close(index);
+        if(1 == res.code){
+          layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+            window.location.href = '/admin/accounts/label.html';
+          });
+        }else if(111 == res.code){
+          window.location.reload();
+        }else{
+          layer.msg(res.msg, {anim: 6});
+        }
+      });
+    }
+
+    $(document).ready(function(){
+      // 添加菜单
+      var options = {
+        beforeSubmit:showStart,
+        success:showSuccess
+      };
+
+      $('#commentForm').submit(function(){
+        $(this).ajaxSubmit(options);
+        return false;
+      });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+      highlight: function(e) {
+        $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+      },
+      success: function(e) {
+        e.closest(".form-group").removeClass("has-error").addClass("has-success")
+      },
+      errorElement: "span",
+      errorPlacement: function(e, r) {
+        e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+      },
+      errorClass: "help-block m-b-none",
+      validClass: "help-block m-b-none"
+    });
+</script>
+</body>
+</html>

+ 108 - 48
application/admin/view/settings/index.html

@@ -20,53 +20,13 @@
             <h5>接入设置</h5>
         </div>
         <div class="ibox-content">
-            <form class="form-horizontal m-t layui-form" id="Form" method="post" action="{:url('settings/update')}">
-                <h4 style="margin-bottom: 10px;">自动邀请设置</h4>
-                <div class="ibox-title">
-                </div>
-                <div class="form-group" style="flex-wrap: wrap; display: flex">
-                    <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">访客访问网站时,系统可以自动发起会话邀请,默认0秒为不邀请。</p>
-                    <label class="col-sm-3 control-label">访问停留:</label>
-                    <div class="input-group col-sm-1">
-                        <input type="hidden" name="id" value="{$settings['id']}">
-                        <input type="text" class="form-control" name="overtime" required="" aria-required="true" value="{$settings['stop_time']}">
-                    </div>
-                    <label class="control-label" style="margin-left: 20px;">秒,</label>
-                </div>
-                <div class="form-group" style="flex-wrap: wrap; display: flex">
-                    <label class="col-sm-3 control-label">发出邀请文案:</label>
-                    <div class="input-group col-sm-8">
-                        <input type="text" class="form-control" name="overtimeInfo" required="" aria-required="true" value="{$settings['copywriting']}">
-                    </div>
-                </div>
-                <div class="form-group" style="margin-top: 40px;">
-                    <label class="col-sm-3 control-label"></label>
-                    <div class="input-group col-sm-4">
-                        <button class="btn btn-primary" type="submit">提交</button>
-                    </div>
-                </div>
-            </form>
-            <h4 style="margin-bottom: 10px;">访客端入口设置</h4>
-            <div class="ibox-title">
+            <h4 style="margin-bottom: 10px;">入口设置</h4>
+            <div class="ibox-title" style="min-height: 0px;">
             </div>
-            <a href="/admin/settings/add.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增访客端入口</strong>
+            <a href="/admin/settings/add.html" style="margin-top: -10px">
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
-            <!--搜索框开始-->
-            <!--<form id='commentForm' role="form" method="post" class="form-inline pull-right">-->
-                <!--<div class="content clearfix m-b">-->
-                    <!--<div class="form-group">-->
-                        <!--<label>功能菜单:</label>-->
-                        <!--<input type="text" class="form-control" id="username" name="user_name">-->
-                    <!--</div>-->
-                    <!--<div class="form-group">-->
-                        <!--<button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜 索</strong>-->
-                        <!--</button>-->
-                    <!--</div>-->
-                <!--</div>-->
-            <!--</form>-->
-            <!--搜索框结束-->
             <div class="example-wrap">
                 <div class="example">
                     <table id="cusTable">
@@ -75,13 +35,57 @@
                         <th data-field="name">名称</th>
                         <th data-field="image">图片</th>
                         <th data-field="user_group">关联客服组</th>
-                        <th data-field="margin_top">上边距</th>
                         <th data-field="sort">排序</th>
                         <th data-field="operate">操作</th>
                         </thead>
                     </table>
                 </div>
             </div>
+            <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('settings/index')}">
+                <h4 style="margin-bottom: 10px; margin-top: 40px;">自动邀请设置</h4>
+                <div class="ibox-title" style="min-height: 0px;">
+                </div>
+                <div class="form-group" style="flex-wrap: wrap; display: flex">
+                    <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">访客访问网站时,系统可以自动发起会话邀请,默认0秒为不邀请。</p>
+                    <label style="font-weight: 500;" class="col-sm-2 control-label">访问停留:</label>
+                    <div class="input-group col-sm-1">
+                        <input id="runTime" type="text" class="form-control" name="overtime" required="" aria-required="true" value="{$settings['stop_time']}">
+                    </div>
+                    <label style="font-weight: 500;" class="control-label" style="margin-left: 20px;">秒</label>
+                </div>
+                <div class="form-group" style="flex-wrap: wrap; display: flex">
+                    <label style="font-weight: 500;" class="col-sm-2 control-label">发出邀请文案:</label>
+                    <div class="input-group col-sm-8">
+                        <input id="runContent" type="text" class="form-control" name="overtimeInfo" required="" aria-required="true" value="{$settings['copywriting']}">
+                    </div>
+                </div>
+                <h4 style="margin-bottom: 10px; margin-top: 40px;">访客端入口位置设置</h4>
+                <div class="ibox-title" style="min-height: 0px;">
+                </div>
+                <div class="form-group" style="flex-wrap: wrap; display: flex">
+                    <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">访客端入口上边距设置</p>
+                    <label style="font-weight: 500;" class="col-sm-2 control-label">上边距:</label>
+                    <div class="input-group col-sm-1">
+                        <input id="distance" type="text" class="form-control" name="marginTop" required="" aria-required="true" value="{$settings['margin_top']}">
+                    </div>
+                    <label style="font-weight: 500;" class="control-label" style="margin-left: 20px;">px</label>
+                </div>
+                <h4 style="margin-bottom: 10px; margin-top: 40px;">JS设置</h4>
+                <div class="ibox-title" style="min-height: 0px;">
+                </div>
+                <div class="form-group" style="flex-wrap: wrap; display: flex">
+                    <label style="font-weight: 500;" class="col-sm-2 control-label">JS名:</label>
+                    <div class="input-group col-sm-1">
+                        <input type="text" class="form-control" name="name" required="" aria-required="true">
+                    </div>
+                </div>
+                <div class="form-group" style="margin-top: 40px;">
+                    <div class="input-group col-sm-4" style="margin-left: 20px;">
+                        <a class="btn btn-primary btn-sm" onclick="goDemo()">预览</a>
+                        <button class="btn btn-primary btn-sm" type="submit" style="margin-left: 20px;">提交</button>
+                    </div>
+                </div>
+            </form>
             <!-- End Example Pagination -->
         </div>
     </div>
@@ -95,7 +99,14 @@
 <script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
 <script type="text/javascript">
+    function goDemo() {
+      let runTime = $('#runTime').val();
+      let runContent = $('#runContent').val();
+      let distance = $('#distance').val();
+      window.open("/admin/Settings/demo.html?runTime="+runTime+"&runContent="+runContent+"&distance="+distance);
+    }
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -117,10 +128,10 @@
             method: "get",  //使用get请求到服务器获取数据
             url: "{:url('settings/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
-            pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pagination: false, //启动分页
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -173,6 +184,55 @@
             layer.close(index);
         })
     }
+    function showStart(){
+      index = layer.load(0, {shade: false});
+      return true;
+    }
+
+    function showSuccess(res){
+
+      layer.ready(function(){
+        layer.close(index);
+        if(1 == res.code){
+          layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+            window.location.href = '/admin/settings/entranceList.html';
+          });
+        }else if(111 == res.code){
+          window.location.reload();
+        }else{
+          layer.msg(res.msg, {anim: 6});
+        }
+      });
+    }
+
+    $(document).ready(function(){
+      // 添加菜单
+      var options = {
+        beforeSubmit:showStart,
+        success:showSuccess
+      };
+
+      $('#commentForm').submit(function(){
+        $(this).ajaxSubmit(options);
+        return false;
+      });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+      highlight: function(e) {
+        $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+      },
+      success: function(e) {
+        e.closest(".form-group").removeClass("has-error").addClass("has-success")
+      },
+      errorElement: "span",
+      errorPlacement: function(e, r) {
+        e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+      },
+      errorClass: "help-block m-b-none",
+      validClass: "help-block m-b-none"
+    });
 </script>
 </body>
 </html>

+ 197 - 0
application/admin/view/settings/indexOld.html

@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>功能菜单</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+    <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <!-- Panel Other -->
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>接入设置</h5>
+        </div>
+        <div class="ibox-content">
+            <form class="form-horizontal m-t layui-form" id="Form" method="post" action="{:url('settings/update')}">
+                <h4 style="margin-bottom: 10px;">自动邀请设置</h4>
+                <div class="ibox-title">
+                </div>
+                <div class="form-group" style="flex-wrap: wrap; display: flex">
+                    <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">访客访问网站时,系统可以自动发起会话邀请,默认0秒为不邀请。</p>
+                    <label class="col-sm-2 control-label">访问停留:</label>
+                    <div class="input-group col-sm-1">
+                        <input type="hidden" name="id" value="{$settings['id']}">
+                        <input type="text" class="form-control" name="overtime" required="" aria-required="true" value="{$settings['stop_time']}">
+                    </div>
+                    <label class="control-label" style="margin-left: 20px;">秒</label>
+                </div>
+                <div class="form-group" style="flex-wrap: wrap; display: flex">
+                    <label class="col-sm-2 control-label">发出邀请文案:</label>
+                    <div class="input-group col-sm-8">
+                        <input type="text" class="form-control" name="overtimeInfo" required="" aria-required="true" value="{$settings['copywriting']}">
+                    </div>
+                </div>
+                <div class="form-group" style="margin-top: 40px;">
+                    <label class="col-sm-2 control-label"></label>
+                    <div class="input-group col-sm-4">
+                        <button class="btn btn-primary" type="submit">提交</button>
+                    </div>
+                </div>
+            </form>
+
+            <h4 style="margin-bottom: 10px;">访客端入口设置</h4>
+            <div class="ibox-title">
+            </div>
+
+            <form class="form-horizontal m-t layui-form" id="marginForm" method="post" action="{:url('settings/margin')}">
+                <div class="form-group" style="flex-wrap: wrap; display: flex">
+                    <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">访客端入口上边距设置</p>
+                    <label class="col-sm-2 control-label">上边距:</label>
+                    <div class="input-group col-sm-1">
+                        <input type="hidden" name="id" value="{$settings['id']}">
+                        <input type="text" class="form-control" name="margin-top" required="" aria-required="true" value="{$settings['margin_top']}">
+                    </div>
+                    <label class="control-label" style="margin-left: 20px;">px</label>
+                </div>
+                <div class="form-group" style="margin-top: 40px;">
+                    <label class="col-sm-2 control-label"></label>
+                    <div class="input-group col-sm-4">
+                        <button class="btn btn-primary" type="submit">提交</button>
+                    </div>
+                </div>
+            </form>
+
+            <a href="/admin/settings/add.html">
+                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增访客端入口</strong>
+                </button>
+            </a>
+            <!--搜索框开始-->
+            <!--<form id='commentForm' role="form" method="post" class="form-inline pull-right">-->
+                <!--<div class="content clearfix m-b">-->
+                    <!--<div class="form-group">-->
+                        <!--<label>功能菜单:</label>-->
+                        <!--<input type="text" class="form-control" id="username" name="user_name">-->
+                    <!--</div>-->
+                    <!--<div class="form-group">-->
+                        <!--<button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜 索</strong>-->
+                        <!--</button>-->
+                    <!--</div>-->
+                <!--</div>-->
+            <!--</form>-->
+            <!--搜索框结束-->
+            <div class="example-wrap">
+                <div class="example">
+                    <table id="cusTable">
+                        <thead>
+                        <!--<th data-field="id">id</th>-->
+                        <th data-field="name">名称</th>
+                        <th data-field="image">图片</th>
+                        <th data-field="user_group">关联客服组</th>
+                        <th data-field="sort">排序</th>
+                        <th data-field="operate">操作</th>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+            <!-- End Example Pagination -->
+        </div>
+    </div>
+</div><a href="http://kefu.bocai186.com/demo/index.html" target="_blank">aaaaaaa</a>
+<!-- End Panel Other -->
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script type="text/javascript">
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(group)', function(value){
+            $("#group_id").val(value.value);
+            onSearch()
+        });
+
+    });
+
+</script>
+<script type="text/javascript">
+    function initTable() {
+        //先销毁表格
+        $('#cusTable').bootstrapTable('destroy');
+        //初始化表格,动态从服务器加载数据
+        $("#cusTable").bootstrapTable({
+            method: "get",  //使用get请求到服务器获取数据
+            url: "{:url('settings/index')}", //获取数据的地址
+            striped: true,  //表格显示条纹
+            pagination: true, //启动分页
+            pageSize: 50,  //每页显示的记录数
+            pageNumber:1, //当前第几页
+            pageList: [20, 50],  //记录数可选列表
+            sidePagination: "server", //表示服务端请求
+            paginationFirstText: "首页",
+            paginationPreText: "上一页",
+            paginationNextText: "下一页",
+            paginationLastText: "尾页",
+            queryParamsType : "undefined",
+            queryParams: function queryParams(params) {   //设置查询参数
+                var param = {
+                    pageNumber: params.pageNumber,
+                    pageSize: params.pageSize,
+                    group_id:$('#group_id').val(),
+                    searchText:$('#username').val()
+                };
+                return param;
+            },
+            onLoadSuccess: function(res){  //加载成功时执行
+                if(111 == res.code){
+                    window.location.reload();
+                }
+                layer.msg("加载成功", {time : 1000});
+            },
+            onLoadError: function(){  //加载失败时执行
+                layer.msg("加载数据失败");
+            }
+        });
+    }
+
+    $(document).ready(function () {
+        //调用函数,初始化表格
+        initTable();
+
+        //当点击查询按钮的时候执行
+        $("#search").bind("click", initTable);
+    });
+
+    function Del(id){
+        layer.confirm('确认删除此功能菜单?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('settings/del')}", {'id' : id}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+            layer.close(index);
+        })
+    }
+</script>
+</body>
+</html>

+ 204 - 0
application/admin/view/system/addwelcome.html

@@ -0,0 +1,204 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>新增欢迎语</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+    <script charset="utf-8" src="__EDIT__/kindeditor-min.js"></script>
+    <script charset="utf-8" src="__EDIT__/lang/zh_CN.js"></script>
+    <script>
+      KindEditor.ready(function(K) {
+        K.each({
+          'plug-align' : {
+            name : '对齐方式',
+            method : {
+              'justifyleft' : '左对齐',
+              'justifycenter' : '居中对齐',
+              'justifyright' : '右对齐'
+            }
+          },
+          'plug-order' : {
+            name : '编号',
+            method : {
+              'insertorderedlist' : '数字编号',
+              'insertunorderedlist' : '项目编号'
+            }
+          },
+          'plug-indent' : {
+            name : '缩进',
+            method : {
+              'indent' : '向右缩进',
+              'outdent' : '向左缩进'
+            }
+          }
+        },function( pluginName, pluginData ){
+          var lang = {};
+          lang[pluginName] = pluginData.name;
+          KindEditor.lang( lang );
+          KindEditor.plugin( pluginName, function(K) {
+            var self = this;
+            self.clickToolbar( pluginName, function() {
+              var menu = self.createMenu({
+                name : pluginName,
+                width : pluginData.width || 100
+              });
+              K.each( pluginData.method, function( i, v ){
+                menu.addItem({
+                  title : v,
+                  checked : false,
+                  iconClass : pluginName+'-'+i,
+                  click : function() {
+                    self.exec(i).hideMenu();
+                  }
+                });
+              })
+            });
+          });
+        });
+        K.create('#contentqq', {
+          themeType : 'qq',
+          items : [
+            'bold','italic','underline','fontname','fontsize','forecolor','hilitecolor','plug-align','plug-order','plug-indent','link'
+          ]
+        });
+      });
+    </script>
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>新增欢迎语</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('system/addWelcome')}">
+                        <div class="form-group" style="display: flex">
+                            <label style="margin-left: 40px; line-height: 2.5;">排序:</label>
+                            <div class="input-group col-sm-4">
+                                <input class="form-control" name="sort" required="" aria-required="true"/>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label style="margin-left: 40px">欢迎语:</label>
+                            <div class="input-group col-sm-4" style="margin-top: 10px; margin-left: 40px">
+                                <textarea id="contentqq" name="word" style="width:700px;height:200px;visibility:hidden;"></textarea>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <div style="margin-left: 40px; margin-top: 20px;">
+                                <button class="btn btn-primary" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
+<script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
+
+    const myHost = "http://" + window.location.host;
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+    });
+
+    var index = '';
+    function showStart(){
+        index = layer.load(0, {shade: false});
+        return true;
+    }
+
+    function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+                layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                    window.location.href = myHost + '/admin/system/welcoming';
+                });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function(){
+        // 添加管理员
+        var options = {
+            beforeSubmit:showStart,
+            success:showSuccess
+        };
+
+        $('#commentForm').submit(function(){
+            $(this).ajaxSubmit(options);
+            return false;
+        });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+        highlight: function(e) {
+            $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+        },
+        success: function(e) {
+            e.closest(".form-group").removeClass("has-error").addClass("has-success")
+        },
+        errorElement: "span",
+        errorPlacement: function(e, r) {
+            e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+        },
+        errorClass: "help-block m-b-none",
+        validClass: "help-block m-b-none"
+    });
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(group)', function(value){
+            $("#groups_id").val(value.value);
+        });
+
+        form.on('select(robotgroups)', function(value){
+            $("#robotgroups_id").val(value.value);
+        });
+    });
+</script>
+</body>
+</html>

+ 108 - 17
application/admin/view/system/basics.html

@@ -12,6 +12,43 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
 </head>
 <body class="gray-bg">
+
+<div class="layui-layer-shade" id="all_blank_img" style="display: none;"></div>
+<div class="layui-layer layui-layer-dialog" id="check_image" style="display: none;">
+    <div class="layui-layer-title" style="cursor: move;">请选择图片</div>
+    <div id="images" class="layui-layer-content layui-layer-padding" style="height: 70vh;">
+        {volist name="material" id="vo"}
+        <div style="width: 21.5%;height:100px;float: left;text-align: center;background-color: #DCDCDC;margin: 1%;position: relative;">
+            <div style="height:23px;line-height: 23px;width:80%;margin: 0 auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 11px;">{$vo.name}</div>
+            <img onclick="onCheckImage(`{$vo.url}`)"  src="{$vo.url}"  style="margin-top: 0px;height: 70px;">
+        </div>
+        {/volist}
+    </div>
+    <span class="layui-layer-setwin"></span>
+    <div class="layui-layer-btn layui-layer-btn-">
+        <a class="layui-layer-btn0" onclick="closeCheckImage()">取消</a>
+    </div>
+    <span class="layui-layer-resize"></span>
+</div>
+
+<div class="layui-layer-shade" id="all_blank" style="display: none"></div>
+<div class="layui-layer layui-layer-dialog" id="check_img" style="display: none">
+    <div class="layui-layer-title" style="cursor: move;">请选择图片</div>
+    <div id="imgs" padding="0" class="layui-layer-content layui-layer-padding" style="height: 70vh;">
+        {volist name="material" id="vo"}
+        <div style="width: 21.5%;height:100px;float: left;text-align: center;background-color: #DCDCDC;margin: 1%;position: relative;">
+            <div style="height:23px;line-height: 23px;width:80%;margin: 0 auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 11px;">{$vo.name}</div>
+            <img onclick="onCheckImg(`{$vo.url}`)"  src="{$vo.url}"  style="margin-top: 0px;height: 70px;">
+        </div>
+        {/volist}
+    </div>
+    <span class="layui-layer-setwin"></span>
+    <div class="layui-layer-btn layui-layer-btn-">
+        <a class="layui-layer-btn0" onclick="closeCheckImg()">取消</a>
+    </div>
+    <span class="layui-layer-resize"></span>
+</div>
+
 <div class="wrapper wrapper-content animated fadeInRight">
     <div class="row">
         <div class="col-sm-8">
@@ -24,12 +61,6 @@
                         <h4 style="margin-bottom: 10px;">欢迎语设置</h4>
                         <div class="ibox-title">
                         </div>
-                        <div class="form-group">
-                            <label class="col-sm-3 control-label">系统欢迎语:</label>
-                            <div class="input-group col-sm-4">
-                                <input type="text" class="form-control" name="systemWord" required="" aria-required="true" value="{$replySystem['word']}">
-                            </div>
-                        </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">客服欢迎语:</label>
                             <div class="input-group col-sm-4">
@@ -48,17 +79,20 @@
                         <div class="form-group layui-form-item form-inline" style="height: 60px;">
                             <input type="hidden" name="advertisement_img" id="advertisement_img"/>
                             <label class="col-sm-3 control-label">广告图片:</label>
-                            <div class="input-group col-sm-2">
+                            <div class="input-group col-sm-1">
                                 <button type="button" class="layui-btn layui-btn-small" id="up-avatar">
                                     <i class="layui-icon"></i>上传图片</button>
                             </div>
                             <span>建议上传420px*700px</span>
+
+                            <button type="button" class="layui-btn layui-btn-small" onclick="checkImage()">选择图片</button>
+
                             <div class="input-group col-sm-3" id="avatar">
-                                <img src="{$advertisement['advertisement_img']}" width="40px" height="40px"/>
+                                <img src="{$advertisement['advertisement_img']}" id="ChoiceImg" height="40px"/>
                             </div>
 
                         </div>
-                        <div class="form-group layui-form-item">
+                        <div class="form-group layui-form-item" style="display: none;">
                             <label class="col-sm-3 control-label">是否启用:</label>
                             <div class="input-group col-sm-6">
                                 {if !empty($status)}
@@ -69,26 +103,35 @@
                             </div>
                         </div>
 
-                        <h4 style="margin-bottom: 10px; margin-top: 40px">logo设置</h4>
+                        <h4 style="margin-bottom: 10px; margin-top: 40px">企业logo设置</h4>
                         <div class="ibox-title">
                         </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">企业名称:</label>
+                            <div class="input-group col-sm-4">
+                                <input type="text" class="form-control" name="enterprise_name" required="" aria-required="true" value="{$settings['enterprise_name']}" placeholder="不超过8个字符">
+                            </div>
+                        </div>
                         <div class="form-group layui-form-item form-inline" style="height: 60px;">
                             <input type="hidden" name="logo_img" id="logo_img"/>
-                            <label class="col-sm-3 control-label">logo:</label>
-                            <div class="input-group col-sm-2">
+                            <label class="col-sm-3 control-label">企业logo:</label>
+                            <div class="input-group col-sm-1">
                                 <button type="button" class="layui-btn layui-btn-small" id="up-logo">
                                     <i class="layui-icon"></i>上传logo</button>
                             </div>
-                            <span>建议上传420px*700px</span>
+                            <span>建议上传48px*48px</span>
+
+                            <button type="button" class="layui-btn layui-btn-small" id="" onclick="checkImg()">选择图片</button>
+
                             <div class="input-group col-sm-3" id="logo">
-                                <img src="{$settings['logo']}" width="40px" height="40px"/>
+                                <img src="{$settings['logo']}" id="onChoiceImg" height="40px"/>
                             </div>
                         </div>
 
                         <div class="form-group" style="margin-top: 40px;">
                             <label class="col-sm-3 control-label"></label>
                             <div class="input-group col-sm-4">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -106,7 +149,47 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
+<script>
+    function checkImage() {
+        $("#all_blank_img").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_image").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImage() {
+        $("#all_blank_img").css({"display": "none"});
+        $("#check_image").css({"display": "none"});
+    }
+    function onCheckImage(path) {
+        $("#all_blank_img").css({"display": "none"});
+        $("#check_image").css({"display": "none"});
+        $("#ChoiceImg").attr('src',path);
+        $("#advertisement_img").val(path);
+    }
+
+    function checkImg() {
+        $("#all_blank").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_img").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImg() {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+    }
+    function onCheckImg(path) {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+        $("#onChoiceImg").attr('src',path);
+        $("#logo_img").val(path);
+    }
+</script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -119,7 +202,7 @@
             ,done: function(res){
                 //上传完毕回调
                 if(0 == res.code){
-                    $("#avatar").html('<img src="' + res.data.src + '" width="50px" height="50px">');
+                    $("#avatar").html('<img src="' + res.data.src + '" id="ChoiceImg" height="40px">');
                     $("#advertisement_img").val(res.data.src);
                 }else{
                     layer.msg(res.msg);
@@ -137,7 +220,7 @@
             ,done: function(res){
                 //上传完毕回调
                 if(0 == res.code){
-                    $("#logo").html('<img src="' + res.data.src + '" width="50px" height="50px">');
+                    $("#logo").html('<img src="' + res.data.src + '" id="onChoiceImg" height="40px">');
                     $("#logo_img").val(res.data.src);
                 }else{
                     layer.msg(res.msg);
@@ -160,6 +243,14 @@
     }
 
     function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
 
         layer.ready(function(){
             layer.close(index);

+ 26 - 9
application/admin/view/system/conversation.html

@@ -21,7 +21,7 @@
                 </div>
                 <div class="ibox-content">
                     <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('system/conversation')}">
-                        <h4 style="margin-bottom: 10px;">会话超时设置</h4>
+                        <h4 style="margin-bottom: 10px;">双方静默超时设置</h4>
                         <div class="ibox-title">
                         </div>
                         <div class="form-group" style="flex-wrap: wrap; display: flex">
@@ -39,11 +39,11 @@
                             </div>
                         </div>
 
-                        <h4 style="margin-bottom: 10px; margin-top: 40px">访客静默设置</h4>
+                        <h4 style="margin-bottom: 10px; margin-top: 40px">无效会话关闭设置</h4>
                         <div class="ibox-title">
                         </div>
                         <div class="form-group" style="flex-wrap: wrap; display: flex">
-                            <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">访客开启会话框后,在设置的时间内,没有任何操作,系统将发出提示语并立即关闭对话。</p>
+                            <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">访客开启会话框后,在设置的时间内,访客没有任何操作,系统将发出提示语并立即关闭对话。</p>
                             <label class="col-sm-3 control-label">超时时间:</label>
                             <div class="input-group col-sm-1">
                                 <input type="text" class="form-control" name="unoperated" required="" aria-required="true" value="{$systemconfig[1]['systemconfig_data']}">
@@ -85,7 +85,7 @@
                         <div class="ibox-title">
                         </div>
                         <div class="form-group" style="flex-wrap: wrap; display: flex">
-                            <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">设置会话回合数后,会话回合数低于设置的值时,访客端右上角评价按钮隐藏,所有系统邀评都不触发。</p>
+                            <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">设置会话回合数后,会话聊天条数没超过设置的值时,访客端右上角评价按钮隐藏,所有系统邀评都不触发。系统消息条数不计算在内。</p>
                             <label class="col-sm-3 control-label">起始值:</label>
                             <div class="input-group col-sm-1" style="width: 45px">
                                 <input type="text" class="form-control" name="round" required="" aria-required="true" value="{$systemconfig[4]['systemconfig_data']}">
@@ -98,23 +98,23 @@
                         </div>
                         <div class="form-group" style="flex-wrap: wrap; display: flex">
                             <p style="width: 100%; margin-left: 20px; color: #9c9c9c; margin-bottom: 15px; font-size: 15px;">当客服服务达到上限时,顾客会进入排队等待状态。当排队人数达上限,后续不再接入顾客。</p>
-                            <label class="col-sm-3 control-label">客服接待人数设置:</label>
+                            <label class="col-sm-3 control-label">单个客服接待人数:</label>
                             <div class="input-group col-sm-1" style="width: 45px">
-                                <input type="text" class="form-control" name="max_service" required="" aria-required="true" value="{$kfConfig['max_service']}">
+                                <input type="text" class="form-control" name="max_service" required="" aria-required="true" value="{$systemconfig[6]['systemconfig_data']}">
                             </div>
                             <label class="control-label" style="margin-left: 20px;">人</label>
                         </div>
                         <div class="form-group" style="flex-wrap: wrap; display: flex">
-                            <label class="col-sm-3 control-label">最大排队人数设置:</label>
+                            <label class="col-sm-3 control-label">最大排队人数上限:</label>
                             <div class="input-group col-sm-1" style="width: 45px">
-                                <input type="text" class="form-control" name="kfConfig_maxWait" required="" aria-required="true" value="{$kfConfig['kfConfig_maxWait']}">
+                                <input type="text" class="form-control" name="kfConfig_maxWait" required="" aria-required="true" value="{$systemconfig[7]['systemconfig_data']}">
                             </div>
                             <label class="control-label" style="margin-left: 20px;">人</label>
                         </div>
                         <div class="form-group" style="margin-top: 40px;">
                             <label class="col-sm-3 control-label"></label>
                             <div class="input-group col-sm-4">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -132,7 +132,16 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -168,6 +177,14 @@
     }
 
     function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
 
         layer.ready(function(){
             layer.close(index);

+ 205 - 0
application/admin/view/system/editwelcome.html

@@ -0,0 +1,205 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>编辑欢迎语</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+    <script charset="utf-8" src="__EDIT__/kindeditor-min.js"></script>
+    <script charset="utf-8" src="__EDIT__/lang/zh_CN.js"></script>
+    <script>
+      KindEditor.ready(function(K) {
+        K.each({
+          'plug-align' : {
+            name : '对齐方式',
+            method : {
+              'justifyleft' : '左对齐',
+              'justifycenter' : '居中对齐',
+              'justifyright' : '右对齐'
+            }
+          },
+          'plug-order' : {
+            name : '编号',
+            method : {
+              'insertorderedlist' : '数字编号',
+              'insertunorderedlist' : '项目编号'
+            }
+          },
+          'plug-indent' : {
+            name : '缩进',
+            method : {
+              'indent' : '向右缩进',
+              'outdent' : '向左缩进'
+            }
+          }
+        },function( pluginName, pluginData ){
+          var lang = {};
+          lang[pluginName] = pluginData.name;
+          KindEditor.lang( lang );
+          KindEditor.plugin( pluginName, function(K) {
+            var self = this;
+            self.clickToolbar( pluginName, function() {
+              var menu = self.createMenu({
+                name : pluginName,
+                width : pluginData.width || 100
+              });
+              K.each( pluginData.method, function( i, v ){
+                menu.addItem({
+                  title : v,
+                  checked : false,
+                  iconClass : pluginName+'-'+i,
+                  click : function() {
+                    self.exec(i).hideMenu();
+                  }
+                });
+              })
+            });
+          });
+        });
+        K.create('#contentqq', {
+          themeType : 'qq',
+          items : [
+            'bold','italic','underline','fontname','fontsize','forecolor','hilitecolor','plug-align','plug-order','plug-indent','link'
+          ]
+        });
+      });
+    </script>
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>编辑欢迎语</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('system/editWelcome')}">
+                        <input type="hidden" name="id" value="{$replySystem['id']}"/>
+                        <div class="form-group" style="display: flex">
+                            <label style="margin-left: 40px; line-height: 2.5;">排序:</label>
+                            <div class="input-group col-sm-4">
+                                <input class="form-control" name="sort" required="" aria-required="true" value="{$replySystem['sort']}"/>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label style="margin-left: 40px">欢迎语:</label>
+                            <div class="input-group col-sm-4" style="margin-top: 10px; margin-left: 40px">
+                                <textarea id="contentqq" name="word" style="width:700px;height:200px;visibility:hidden;">{$replySystem['word']}</textarea>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <div style="margin-left: 40px; margin-top: 20px;">
+                                <button class="btn btn-primary" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
+<script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
+
+    const myHost = "http://" + window.location.host;
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+    });
+
+    var index = '';
+    function showStart(){
+        index = layer.load(0, {shade: false});
+        return true;
+    }
+
+    function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+                layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                    window.location.href = myHost + '/admin/system/welcoming';
+                });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function(){
+        // 添加管理员
+        var options = {
+            beforeSubmit:showStart,
+            success:showSuccess
+        };
+
+        $('#commentForm').submit(function(){
+            $(this).ajaxSubmit(options);
+            return false;
+        });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+        highlight: function(e) {
+            $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+        },
+        success: function(e) {
+            e.closest(".form-group").removeClass("has-error").addClass("has-success")
+        },
+        errorElement: "span",
+        errorPlacement: function(e, r) {
+            e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+        },
+        errorClass: "help-block m-b-none",
+        validClass: "help-block m-b-none"
+    });
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+
+        form.on('select(group)', function(value){
+            $("#groups_id").val(value.value);
+        });
+
+        form.on('select(robotgroups)', function(value){
+            $("#robotgroups_id").val(value.value);
+        });
+    });
+</script>
+</body>
+</html>

+ 146 - 0
application/admin/view/system/platform.html

@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>编辑管理员</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>验证平台设置</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('system/platform')}">
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">绑定地址:</label>
+                            <div class="input-group col-sm-4">
+                                <input type="text" class="form-control" name="urlToken" required="" aria-required="true" value="{$urlToken}">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">验证地址:</label>
+                            <div class="input-group col-sm-4">
+                                <input type="text" class="form-control" name="urlToken" required="" aria-required="true" value="{$urlToken}">
+                            </div>
+                        </div>
+
+                        <div class="form-group" style="margin-top: 40px;">
+                            <label class="col-sm-3 control-label"></label>
+                            <div class="input-group col-sm-4">
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
+<script>
+    function checkImage() {
+        $("#all_blank_img").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_image").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImage() {
+        $("#all_blank_img").css({"display": "none"});
+        $("#check_image").css({"display": "none"});
+    }
+    function onCheckImage(path) {
+        $("#all_blank_img").css({"display": "none"});
+        $("#check_image").css({"display": "none"});
+        $("#ChoiceImg").attr('src',path);
+        $("#advertisement_img").val(path);
+    }
+
+    function checkImg() {
+        $("#all_blank").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_img").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImg() {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+    }
+    function onCheckImg(path) {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+        $("#onChoiceImg").attr('src',path);
+        $("#logo_img").val(path);
+    }
+</script>
+<script type="text/javascript">
+
+  var index = '';
+  function showStart(){
+    index = layer.load(0, {shade: false});
+    return true;
+  }
+
+    function showSuccess(res){
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+                layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                    window.location.href = res.data;
+                });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+  $(document).ready(function(){
+    // 添加管理员
+    var options = {
+      beforeSubmit:showStart,
+      success:showSuccess
+    };
+
+    $('#commentForm').submit(function(){
+      $(this).ajaxSubmit(options);
+      return false;
+    });
+  });
+
+  // 表单验证
+  $.validator.setDefaults({
+    highlight: function(e) {
+      $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+    },
+    success: function(e) {
+      e.closest(".form-group").removeClass("has-error").addClass("has-success")
+    },
+    errorElement: "span",
+    errorPlacement: function(e, r) {
+      e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+    },
+    errorClass: "help-block m-b-none",
+    validClass: "help-block m-b-none"
+  });
+
+</script>
+</body>
+</html>

+ 17 - 0
application/admin/view/system/reply.html

@@ -58,7 +58,16 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -71,6 +80,14 @@
     }
 
     function showSuccess(res){
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'updatecache',
+          data: {dtype: ''},
+        }));
+      };
 
         layer.ready(function(){
             layer.close(index);

+ 138 - 0
application/admin/view/system/welcoming.html

@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>欢迎语列表</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <!-- Panel Other -->
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>欢迎语列表</h5>
+        </div>
+        <div class="ibox-content">
+            <a href="/admin/system/addWelcome.html">
+                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新 增</strong>
+                </button>
+            </a>
+            <div class="example-wrap">
+                <div class="example">
+                    <table id="cusTable">
+                        <thead>
+                        <th data-field="id">菜单ID</th>
+                        <th data-field="word">欢迎语</th>
+                        <th data-field="sort">排序</th>
+                        <th data-field="operate">操作</th>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+            <!-- End Example Pagination -->
+        </div>
+    </div>
+</div>
+<!-- End Panel Other -->
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="/static/customer/js/md5.js"></script>
+<script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
+
+    function initTable() {
+        //先销毁表格
+        $('#cusTable').bootstrapTable('destroy');
+        //初始化表格,动态从服务器加载数据
+        $("#cusTable").bootstrapTable({
+            method: "get",  //使用get请求到服务器获取数据
+            url: "{:url('System/welcoming')}", //获取数据的地址
+            striped: true,  //表格显示条纹
+            pagination: false, //启动分页
+            pageSize: 50,  //每页显示的记录数
+            pageNumber:1, //当前第几页
+            pageList: [20, 50],  //记录数可选列表
+            sidePagination: "server", //表示服务端请求
+            paginationFirstText: "首页",
+            paginationPreText: "上一页",
+            paginationNextText: "下一页",
+            paginationLastText: "尾页",
+            queryParamsType : "undefined",
+            queryParams: function queryParams(params) {   //设置查询参数
+                var param = {
+                    pageNumber: params.pageNumber,
+                    pageSize: params.pageSize,
+                    searchText:$('#username').val()
+                };
+                return param;
+            },
+            onLoadSuccess: function(res){  //加载成功时执行
+                if(111 == res.code){
+                    window.location.reload();
+                }
+                layer.msg("加载成功", {time : 1000});
+            },
+            onLoadError: function(){  //加载失败时执行
+                layer.msg("加载数据失败");
+            }
+        });
+    }
+
+    $(document).ready(function () {
+        //调用函数,初始化表格
+        initTable();
+
+        //当点击查询按钮的时候执行
+        $("#search").bind("click", initTable);
+    });
+
+
+
+    function delWelcome(id){
+      layer.confirm('确认删除此欢迎语吗?', {icon: 3, title:'提示'}, function(index){
+        //do something
+        $.getJSON("{:url('system/delWelcome')}", {'id' : id}, function(res){
+          let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+          socket.onopen = function(res) {
+            console.log('握手成功');
+            socket.send(JSON.stringify({
+              type: 'updatecache',
+              data: {dtype: ''},
+            }));
+          };
+          if(1 == res.code){
+            layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+              initTable();
+            });
+          }else if(111 == res.code){
+            window.location.reload();
+          }else{
+            layer.alert(res.msg, {title: '友情提示', icon: 2});
+          }
+        });
+
+        layer.close(index);
+      })
+
+    }
+</script>
+</body>
+</html>

+ 49 - 32
application/admin/view/system/wordslog.html

@@ -12,6 +12,14 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/layui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
     <!-- Panel Other -->
@@ -35,37 +43,33 @@
                             <!--</select>-->
                         <!--</div>-->
                     <!--</div>-->
-                    &nbsp;&nbsp;
                     <div class="form-group">
-                        <label>聊天日期:</label>
-                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-604800);?>" style="width: 100px;"> --
-                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time());?>" style="width: 100px;">
+                        <label>聊天日期:</label>
+                        <input type="text" class="form-control" id="start" value="<?php echo date('Y-m-d',time()-604800);?>" style="width: 100px;height: 30px;"> --
+                        <input type="text" class="form-control" id="end" value="<?php echo date('Y-m-d',time());?>" style="width: 100px;height: 30px;">
+                        <input type="hidden" id="now" value="<?php echo date('Y-m-d',time());?>">
                     </div>
-                    &nbsp;&nbsp;
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <div class="input-group col-sm-4 layui-form" style="width: 100px;">
-                            <input type="hidden" id="user_id"/>
+                            <input type="hidden" id="user_id" value="0" style="height: 30px;"/>
                             {$useroption}
                         </div>
                     </div>
-                    <div class="form-group">
+                    <div class="form-group" style="margin-left: 10px;">
                         <div class="input-group col-sm-4 layui-form" style="width: 120px;">
-                            <input type="hidden" id="group_id"/>
+                            <input type="hidden" id="group_id" value="0" style="height: 30px;"/>
                             {$groupoption}
                         </div>
                     </div>
-                    <div class="form-group">
-                        <label>访客账号</label>
-                        <input type="text" class="form-control" id="username" name="user_name" style="width: 120px;">
+                    <div class="form-group" style="margin-left: 10px;">
+                        <label>访客账号:</label>
+                        <input type="text" class="form-control" id="username" name="user_name" style="height: 30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search">
-                            <strong>搜 索</strong>
-                        </button>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索</button>
                     </div>
-                    <div class="form-group" style="margin-left:40px;margin-top:5px">
-                        <button class="btn btn-primary" type="button" id="toExcel" name="toExcel" value="0"><strong>导出Excel</strong>
-                        </button>
+                    <div class="form-group" style="margin-left:20px;margin-top:5px">
+                        <button class="btn btn-primary btn-sm" type="button" id="toExcel" name="toExcel" value="0">导出Excel</button>
                     </div>
                 </div>
             </form>
@@ -108,6 +112,9 @@
 <script src="__JS__/layui/layui.js"></script>
 <script type="text/javascript">
 
+    $(".selector_user").val("0");
+    $(".selector_group").val("0");
+
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
 
@@ -173,21 +180,31 @@
         $("#search").bind("click", function(){
             var start = $('#start').val();
             var end = $('#end').val();
+            var now = $('#now').val();
+
+            if('' == start){
+                layer.tips("输入开始时间", '#start');
+                return false;
+            }
+
+            if('' == end){
+                layer.tips("输入结束时间", '#end');
+                return false;
+            }
 
-//            if('' == start){
-//                layer.tips("输入开始时间", '#start');
-//                return false;
-//            }
-//
-//            if('' == end){
-//                layer.tips("输入结束时间", '#end');
-//                return false;
-//            }
-//
-//            if(start > end){
-//                layer.msg('开始时间不能大于结束时间');
-//                return false;
-//            }
+            if(start > now){
+                layer.msg('开始时间不能大于当前时间');
+                return false;
+            }
+            if(end > now){
+                layer.msg('结束时间不能大于当前时间');
+                return false;
+            }
+
+            if(start > end){
+                layer.msg('开始时间不能大于结束时间');
+                return false;
+            }
 
             initTable();
         });

+ 80 - 15
application/admin/view/users/adduser.html

@@ -10,8 +10,27 @@
     <link href="__CSS__/animate.min.css" rel="stylesheet">
     <link href="__JS__/layui/css/layui.css" rel="stylesheet">
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+    <script src="../../../../../aa/Customer-Service/public/static/customer/js/whisper-cli.js"></script>
 </head>
 <body class="gray-bg">
+<div class="layui-layer-shade" id="all_blank" style="display: none"></div>
+<div class="layui-layer layui-layer-dialog" id="check_img" style="display: none">
+    <div class="layui-layer-title" style="cursor: move;">请选择图片</div>
+    <div id="imgs" padding="0" class="layui-layer-content layui-layer-padding" style="height: 70vh;">
+        {volist name="material" id="vo"}
+        <div style="width: 21.5%;height:100px;float: left;text-align: center;background-color: #DCDCDC;margin: 1%;position: relative;">
+            <div style="height:23px;line-height: 23px;width:80%;margin: 0 auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 11px;">{$vo.name}</div>
+            <img onclick="onCheckImg(`{$vo.url}`)"  src="{$vo.url}"  style="margin-top: 0px;height: 70px;">
+        </div>
+        {/volist}
+    </div>
+    <span class="layui-layer-setwin"></span>
+    <div class="layui-layer-btn layui-layer-btn-">
+        <a class="layui-layer-btn0" onclick="closeCheckImg()">取消</a>
+    </div>
+    <span class="layui-layer-resize"></span>
+</div>
+
 <div class="wrapper wrapper-content animated fadeInRight">
     <div class="row">
         <div class="col-sm-8">
@@ -22,6 +41,22 @@
                 <div class="ibox-content">
                     <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('users/adduser')}">
 
+                        <div class="form-group layui-form-item form-inline" style="height: 60px;">
+                            <input type="hidden" name="user_avatar" id="user_avatar"/>
+                            <label class="col-sm-3 control-label">客服头像:</label>
+                            <div class="input-group col-sm-1">
+                                <button type="button" class="layui-btn layui-btn-small" id="up-avatar">
+                                    <i class="layui-icon"></i>上传图片</button>
+                            </div>
+                            <span>建议上传180px*180px</span>
+
+                            <button type="button" class="layui-btn layui-btn-small" id="" onclick="checkImg()">选择图片</button>
+
+                            <div class="input-group col-sm-3" id="avatar">
+                                <img src="" id="onChoiceImg" height="40px">
+                            </div>
+                        </div>
+
                         <div class="form-group">
                             <label class="col-sm-3 control-label">客服账号 <span style="color: red;">*</span>:</label>
                             <div class="input-group col-sm-4">
@@ -29,17 +64,33 @@
                             </div>
                         </div>
                         <div class="form-group">
-                            <label class="col-sm-3 control-label">客服称 <span style="color: red;">*</span>:</label>
+                            <label class="col-sm-3 control-label">客服称 <span style="color: red;">*</span>:</label>
                             <div class="input-group col-sm-4">
                                 <input id="username" type="text" class="form-control" name="user_name" required="" aria-required="true">
                             </div>
                         </div>
+
+                        <div class="form-group layui-form-item">
+                            <label class="col-sm-3 control-label">性别 <span style="color: red;">*</span>:</label>
+                            <div class="input-group col-sm-6">
+                                <input type="radio" name="gender" value="0" title="保密" checked>
+                                <input type="radio" name="gender" value="1" title="男">
+                                <input type="radio" name="gender" value="2" title="女">
+                            </div>
+                        </div>
+
                         <div class="form-group">
                             <label class="col-sm-3 control-label">客服工号 <span style="color: red;">*</span>:</label>
                             <div class="input-group col-sm-4">
                                 <input id="userjobnumber" type="text" class="form-control" name="user_job_number" required="" aria-required="true">
                             </div>
                         </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">登录密码 <span style="color: red;">*</span>:</label>
+                            <div class="input-group col-sm-4">
+                                <input id="password" type="text" class="form-control" name="user_pwd" required="" aria-required="true" placeholder="密码长度不得低于6位">
+                            </div>
+                        </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">客服邮箱:</label>
                             <div class="input-group col-sm-4">
@@ -59,9 +110,9 @@
                             </div>
                         </div>
                         <div class="form-group">
-                            <label class="col-sm-3 control-label">登录密码:</label>
+                            <label class="col-sm-3 control-label">个性签名:</label>
                             <div class="input-group col-sm-4">
-                                <input id="password" type="text" class="form-control" name="user_pwd" required="" aria-required="true" value="123456" disabled="disabled">
+                                <input id="signature" type="text" class="form-control" name="signature" aria-required="true">
                             </div>
                         </div>
                         <div class="form-group">
@@ -88,22 +139,20 @@
                                 {/if}
                             </div>
                         </div>
-                        <div class="form-group layui-form-item form-inline" style="height: 60px;">
-                            <input type="hidden" name="user_avatar" id="user_avatar"/>
-                            <label class="col-sm-3 control-label">客服头像:</label>
-                            <div class="input-group col-sm-2">
-                                <button type="button" class="layui-btn layui-btn-small" id="up-avatar">
-                                    <i class="layui-icon"></i>上传图片</button>
-                            </div>
-                            <span>建议上传180px*180px</span>
-                            <div class="input-group col-sm-3" id="avatar">
-
+                        <div class="form-group layui-form-item">
+                            <label class="col-sm-3 control-label">会话总览 <span style="color: red;">*</span>:</label>
+                            <div class="input-group col-sm-6">
+                                {if !empty($status)}
+                                {foreach name="status" item="vo" key="key"}
+                                <input type="radio" name="user_overview" value="{$key}" title="{$vo}" {if $key eq 2}checked{/if}>
+                                {/foreach}
+                                {/if}
                             </div>
                         </div>
 
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -121,6 +170,22 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script>
+    function checkImg() {
+        $("#all_blank").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_img").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImg() {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+    }
+    function onCheckImg(path) {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+        $("#onChoiceImg").attr('src',path);
+        $("#user_avatar").val(path);
+    }
+</script>
 <script type="text/javascript">
 
     layui.use(['form', 'upload'], function(){
@@ -134,7 +199,7 @@
             ,done: function(res){
                 //上传完毕回调
                 if(0 == res.code){
-                    $("#avatar").html('<img src="' + res.data.src + '" width="50px" height="50px">');
+                    $("#avatar").html('<img src="' + res.data.src + '" id="onChoiceImg" height="40px">');
                     $("#user_avatar").val(res.data.src);
                 }else{
                     layer.msg(res.msg);

+ 98 - 14
application/admin/view/users/edituser.html

@@ -12,6 +12,25 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
 </head>
 <body class="gray-bg">
+
+<div class="layui-layer-shade" id="all_blank" style="display: none"></div>
+<div class="layui-layer layui-layer-dialog" id="check_img" style="display: none">
+    <div class="layui-layer-title" style="cursor: move;">请选择图片</div>
+    <div id="imgs" padding="0" class="layui-layer-content layui-layer-padding" style="height: 70vh;">
+        {volist name="material" id="vo"}
+        <div style="width: 21.5%;height:100px;float: left;text-align: center;background-color: #DCDCDC;margin: 1%;position: relative;">
+            <div style="height:23px;line-height: 23px;width:80%;margin: 0 auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 11px;">{$vo.name}</div>
+            <img onclick="onCheckImg(`{$vo.url}`)"  src="{$vo.url}"  style="margin-top: 0px;height: 70px;">
+        </div>
+        {/volist}
+    </div>
+    <span class="layui-layer-setwin"></span>
+    <div class="layui-layer-btn layui-layer-btn-">
+        <a class="layui-layer-btn0" onclick="closeCheckImg()">取消</a>
+    </div>
+    <span class="layui-layer-resize"></span>
+</div>
+
 <div class="wrapper wrapper-content animated fadeInRight">
     <div class="row">
         <div class="col-sm-8">
@@ -25,15 +44,19 @@
                         <div class="form-group layui-form-item form-inline" style="height: 60px;">
                             <input type="hidden" name="user_avatar" id="user_avatar"/>
                             <label class="col-sm-3 control-label">客服头像:</label>
-                            <div class="input-group col-sm-2">
+                            <div class="input-group col-sm-1">
                                 <button type="button" class="layui-btn layui-btn-small" id="up-avatar">
                                     <i class="layui-icon"></i>上传图片</button>
                             </div>
                             <span>建议上传180px*180px</span>
+
+                            <button type="button" class="layui-btn layui-btn-small" id="" onclick="checkImg()">选择图片</button>
+
                             <div class="input-group col-sm-3" id="avatar">
-                                <img src="{$info['user_avatar']}" width="40px" height="40px"/>
+                                <img src="{$info['user_avatar']}" id="onChoiceImg" height="40px"/>
                             </div>
                         </div>
+
                         <div class="form-group">
                             <label class="col-sm-3 control-label">客服账号:</label>
                             <div class="input-group col-sm-4">
@@ -41,39 +64,55 @@
                             </div>
                         </div>
                         <div class="form-group">
-                            <label class="col-sm-3 control-label">客服名称:</label>
+                            <label class="col-sm-3 control-label">客服昵称 <span style="color: red;">*</span>:</label>
+                            <div class="input-group col-sm-4">
+                                <input id="user_name" type="text" class="form-control" name="user_name" required="" aria-required="true" value="{$info['user_name']}">
+                            </div>
+                        </div>
+
+                        <div class="form-group layui-form-item">
+                            <label class="col-sm-3 control-label">性别 <span style="color: red;">*</span>:</label>
+                            <div class="input-group col-sm-6">
+                                <input type="radio" name="gender" value="0" title="保密" {if $info['gender'] eq 1}checked{/if}>
+                                <input type="radio" name="gender" value="1" title="男" {if $info['gender'] eq 1}checked{/if}>
+                                <input type="radio" name="gender" value="2" title="女" {if $info['gender'] eq 2}checked{/if}>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">客服工号 <span style="color: red;">*</span>:</label>
                             <div class="input-group col-sm-4">
-                                <input id="user_name" type="text" class="form-control" name="user_name" required="" aria-required="true" value="{$info['user_name']}" disabled="disabled">
+                                <input id="user_job_number" type="text" class="form-control" name="user_job_number" required="" aria-required="true" value="{$info['user_job_number']}">
                             </div>
                         </div>
                         <div class="form-group">
-                            <label class="col-sm-3 control-label">客服工号:</label>
+                            <label class="col-sm-3 control-label">登录密码:</label>
                             <div class="input-group col-sm-4">
-                                <input id="user_job_number" type="text" class="form-control" name="user_job_number" required="" aria-required="true" value="{$info['user_job_number']}" disabled="disabled">
+                                <input id="password" type="text" class="form-control" name="user_pwd" aria-required="true" placeholder="重新输入则为修改">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">客服邮箱:</label>
                             <div class="input-group col-sm-4">
-                                <input id="user_email" type="text" class="form-control" name="user_email" required="" aria-required="true" value="{$info['user_email']}" disabled="disabled">
+                                <input id="user_email" type="text" class="form-control" name="user_email" aria-required="true" value="{$info['user_email']}">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">客服电话:</label>
                             <div class="input-group col-sm-4">
-                                <input id="phone" type="text" class="form-control" name="phone" required="" aria-required="true" value="{$info['phone']}" disabled="disabled">
+                                <input id="phone" type="text" class="form-control" name="phone" aria-required="true" value="{$info['phone']}">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">真实姓名:</label>
                             <div class="input-group col-sm-4">
-                                <input id="fullname" type="text" class="form-control" name="fullname" required="" aria-required="true" value="{$info['fullname']}" disabled="disabled">
+                                <input id="fullname" type="text" class="form-control" name="fullname" aria-required="true" value="{$info['fullname']}">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">个性签名:</label>
                             <div class="input-group col-sm-4">
-                                <input id="signature" type="text" class="form-control" name="signature" required="" aria-required="true" value="{$info['signature']}" disabled="disabled">
+                                <input id="signature" type="text" class="form-control" name="signature" aria-required="true" value="{$info['signature']}">
                             </div>
                         </div>
                         <div class="form-group">
@@ -100,12 +139,22 @@
                                 {/if}
                             </div>
                         </div>
+                        <div class="form-group layui-form-item">
+                            <label class="col-sm-3 control-label">会话总览:</label>
+                            <div class="input-group col-sm-6">
+                                {if !empty($status)}
+                                {foreach name="status" item="vo" key="key"}
+                                <input type="radio" name="user_overview" value="{$key}" title="{$vo}" {if $key eq $info['user_overview']}checked{/if}>
+                                {/foreach}
+                                {/if}
+                            </div>
+                        </div>
 
 
                         <div class="form-group">
-                            <div class="col-sm-4 col-sm-offset-6" style="margin-left: 20%;">
-                                <a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>
-                                <button class="btn btn-primary" type="submit" style="margin-left: 10%;">提交</button>
+                            <div class="col-sm-4 col-sm-offset-6">
+                                <!--<a class="layui-btn layui-btn-sm lay-btn-diy" href="javascript:history.go(-1)" style="background-color:#1E9FFF;margin-bottom: 5px;height: 35px;line-height: 35px;">返回</a>-->
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>
@@ -123,7 +172,33 @@
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
 <script src="__JS__/jquery.form.js"></script>
+<script src="/static/customer/js/md5.js"></script>
+<script>
+    function checkImg() {
+        $("#all_blank").css({"z-index": "19991015", "background-color": "rgb(0, 0, 0)", "opacity": "0.3", "display": "block"});
+        $("#check_img").css({"z-index": "19991016", "top": "40px", "left": "170px", "width": "70vw", "display": "block"});
+    }
+    function closeCheckImg() {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+    }
+    function onCheckImg(path) {
+        $("#all_blank").css({"display": "none"});
+        $("#check_img").css({"display": "none"});
+        $("#onChoiceImg").attr('src',path);
+        $("#user_avatar").val(path);
+    }
+</script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+    id: "{$info['id']}",
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
 
     layui.use(['form', 'upload'], function(){
         var form = layui.form;
@@ -137,7 +212,7 @@
             ,done: function(res){
                 //上传完毕回调
                 if(0 == res.code){
-                    $("#avatar").html('<img src="' + res.data.src + '" width="50px" height="50px">');
+                    $("#avatar").html('<img src="' + res.data.src + '" id="onChoiceImg" height="40px">');
                     $("#user_avatar").val(res.data.src);
                 }else{
                     layer.msg(res.msg);
@@ -161,6 +236,15 @@
 
     function showSuccess(res){
 
+      let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+      socket.onopen = function(res) {
+        console.log('握手成功');
+        socket.send(JSON.stringify({
+          type: 'kfupdateinfo',
+          data: {kfuid: config.id},
+        }));
+      };
+
         layer.ready(function(){
             layer.close(index);
             if(1 == res.code){

+ 35 - 9
application/admin/view/users/index.html

@@ -12,6 +12,14 @@
     <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
     <link href="__JS__/layui/css/myLayui.css" rel="stylesheet">
 </head>
+<style>
+    dl dd{
+        height: 30px;
+    }
+    input.layui-input.layui-unselect {
+        height: 30px;
+    }
+</style>
 <body class="gray-bg">
 <div class="wrapper wrapper-content animated fadeInRight">
     <!-- Panel Other -->
@@ -21,7 +29,7 @@
         </div>
         <div class="ibox-content">
             <a href="/admin/users/adduser.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增客服</strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <!--搜索框开始-->
@@ -32,8 +40,8 @@
                             <input type="hidden" id="group_id" value="0"/>
                             {$groupsoption}
                         </div>
-                    </div>&nbsp&nbsp&nbsp&nbsp&nbsp
-                    <div class="form-group">
+                    </div>
+                    <div class="form-group" style="margin-left: 10px">
                         <div class="input-group col-sm-4 layui-form" style="width: 70px;">
                             <input type="hidden" id="user" value="user_account"/>
                             <select lay-verify="required" lay-filter="user">
@@ -44,11 +52,10 @@
                     </div>
                     <div class="form-group">
                         <!--<label>客服名:</label>-->
-                        <input type="text" class="form-control" id="username" name="user_name">
+                        <input type="text" class="form-control" id="username" name="user_name" style="height: 30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜 索</strong>
-                        </button>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索</button>
                     </div>
                 </div>
             </form>
@@ -58,7 +65,8 @@
                     <table id="cusTable">
                         <thead>
                         <th data-field="user_account">客服账号</th>
-                        <th data-field="user_name">客服名称</th>
+                        <th data-field="user_name">客服昵称</th>
+                        <th data-field="gender">性别</th>
                         <th data-field="user_job_number">客服工号</th>
                         <th data-field="user_email">客服邮箱</th>
                         <th data-field="user_avatar">客服头像</th>
@@ -66,6 +74,7 @@
                         <th data-field="fullname">真实姓名</th>
                         <th data-field="group">所属组别</th>
                         <th data-field="status">账号状态</th>
+                        <th data-field="user_overview">会话总览</th>
                         <!--<th data-field="online">是否在线</th>-->
                         <th data-field="operate">操作</th>
                         </thead>
@@ -85,6 +94,7 @@
 <script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
 <script src="__JS__/plugins/layer/layer.min.js"></script>
 <script src="__JS__/layui/layui.js"></script>
+<script src="/static/customer/js/md5.js"></script>
 <script type="text/javascript">
 
     layui.use(['form', 'upload'], function(){
@@ -103,6 +113,14 @@
 
 </script>
 <script type="text/javascript">
+  let config = {
+    socket: '{$socket}',
+  };
+  let date = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
+  let getLocation = window.location.href;
+  let host = getLocation.split('/admin')[0];
+  //let apiToken = hex_md5('customer-service'+date+host);
+  let apiToken = hex_md5('customer-service'+host);
     function initTable() {
         //先销毁表格
         $('#cusTable').bootstrapTable('destroy');
@@ -112,9 +130,9 @@
             url: "{:url('users/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -155,6 +173,14 @@
         layer.confirm('确认删除此客服?', {icon: 3, title:'提示'}, function(index){
             //do something
             $.getJSON("{:url('users/delUser')}", {'id' : id}, function(res){
+              let socket = new WebSocket('ws://' + config.socket+'?apiToken=' + apiToken);
+              socket.onopen = function(res) {
+                console.log('握手成功');
+                socket.send(JSON.stringify({
+                  type: 'tickkf',
+                  data: {kfuid: id},
+                }));
+              };
                 if(1 == res.code){
                     layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
                         initTable();

+ 1 - 1
application/admin/view/words/addword.html

@@ -46,7 +46,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 1 - 1
application/admin/view/words/editword.html

@@ -46,7 +46,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                                <button class="btn btn-primary btn-sm" type="submit">提交</button>
                             </div>
                         </div>
                     </form>

+ 66 - 16
application/admin/view/words/index.html

@@ -29,35 +29,42 @@
         <div class="ibox-title">
             <h5>系统常用语列表</h5>
         </div>
-        <div class="ibox-content" style="border-top: 0;">
+        <div class="ibox-content">
             <a href="/admin/words/addword.html">
-                <button class="btn btn-primary" type="button" style="margin-top:5px"><strong>新增常用语</strong>
+                <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px">新增
                 </button>
             </a>
             <form action="/admin/words/inserExcel" enctype="multipart/form-data" method="post" role="form" class="form-inline pull-right">
-                <div class="content clearfix m-b" style="margin-left: 50px;">
-                    <div class="form-group">
-                        <a href="/static/admin/file/words.xlsx" class="btn btn-primary" style="margin-top:5px" >下载快捷回复模板文件</a>
+                <div class="content clearfix m-b" style="margin-top: 5px;">
+                    <div class="form-group" style="margin-left:20px;">
+                        <a href="javascript:allDel()" class="" style="margin-top:5px;" ><button type="button" class="btn btn-danger btn-sm">全部删除</button></a>
                     </div>
-                    <div class="form-group">
-                        <!--<label>导入快捷回复:</label>-->
-                        <input type="file" class="form-control" name="excel" style="width: 200px;border: none;" />
-                    </div>
-                    <div class="form-group">
-                        <input type="submit" class="btn btn-primary" style="margin-top:5px" value="导入">
+                    <!--<div class="form-group">-->
+                        <!--<a href="/static/admin/file/words.xlsx" class="btn btn-primary" style="margin-top:5px" >下载快捷回复模板文件</a>-->
+                    <!--</div>-->
+                    <!--<div class="form-group">-->
+                        <!--&lt;!&ndash;<label>导入快捷回复:</label>&ndash;&gt;-->
+                        <!--<input type="file" class="form-control" name="excel" style="width: 200px;border: none;" />-->
+                    <!--</div>-->
+                    <!--<div class="form-group">-->
+                        <!--<input type="submit" class="btn btn-primary" style="margin-top:5px" value="导入">-->
+                    <!--</div>-->
+                    <div class="form-group" style="margin-left:20px;">
+                        <a href="javascript:leadingin()" class="" style="margin-top:5px;" ><button type="button" class="btn btn-primary btn-sm">导入快捷回复</button></a>
                     </div>
                 </div>
+
             </form>
             <!--搜索框开始-->
             <form id='commentForm' role="form" method="post" class="form-inline pull-right">
                 <input style="display: none">
                 <div class="content clearfix m-b">
                     <div class="form-group">
-                        <label>常用语内容:</label>
-                        <input type="text" class="form-control" id="content" name="content">
+                        <label>常用语:</label>
+                        <input type="text" class="form-control" id="content" name="content" style="height: 30px;">
                     </div>
                     <div class="form-group">
-                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong> </strong>
+                        <button class="btn btn-primary btn-sm" type="button" style="margin-top:5px" id="search">搜索
                         </button>
                     </div>
                 </div>
@@ -112,9 +119,9 @@
             url: "{:url('words/index')}", //获取数据的地址
             striped: true,  //表格显示条纹
             pagination: true, //启动分页
-            pageSize: 10,  //每页显示的记录数
+            pageSize: 50,  //每页显示的记录数
             pageNumber:1, //当前第几页
-            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            pageList: [20, 50],  //记录数可选列表
             sidePagination: "server", //表示服务端请求
             paginationFirstText: "首页",
             paginationPreText: "上一页",
@@ -169,6 +176,49 @@
         })
 
     }
+
+    function allDel(){
+        layer.confirm('确认删除全部快捷回复?', {icon: 3, title:'提示'}, function(index){
+            //do something
+            $.getJSON("{:url('words/delAll')}", function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+
+    }
+
+    function leadingin(){
+        layer.confirm('<form action="/admin/words/inserExcel" enctype="multipart/form-data" method="post" role="form" class="form-inline pull-right"> <div class=""><input type="file" class=""  name="excel" style="border: none;" /> </div><div class="" style="margin-top: 20px;"><input type="submit" class="btn btn-primary"  value="开始导入"></div><div class="" style="margin-top: 20px;"> <a href="/static/admin/file/words.xlsx" style="color:black;" class=""><input type="button"  value="下载快捷回复模板文件"></a></div></form>', {icon: 6, title:'导入快捷回复'}, function(index){
+            //do something
+            $.getJSON("{:url('words/inserExcel')}", {'id' : id}, function(res){
+                if(1 == res.code){
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                        initTable();
+                    });
+                }else if(111 == res.code){
+                    window.location.reload();
+                }else{
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+
+        $('a.layui-layer-btn0').css('display','none');
+        $('.layui-layer-ico').css('display','none');
+
+    }
 </script>
 </body>
 </html>

+ 102 - 0
application/common.php

@@ -119,3 +119,105 @@ function perDisplay($dit, $xiaos = 2)
     return floatPointDigit(floor(100 * $dit), $xiaos) . '%';
 }
 
+/**
+ * 数据加密
+ */
+function lock_url($txt, $key)
+{
+    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
+    $nh = rand(0, 64);
+    $ch = $chars[$nh];
+    $mdKey = md5($key.$ch);
+    $mdKey = substr($mdKey,$nh%8, $nh%8+7);
+    $txt = base64_encode($txt);
+    $tmp = '';
+    $i = 0;
+    $j = 0;
+    $k = 0;
+    for ($i=0; $i<strlen($txt); $i++) {
+        $k = $k == strlen($mdKey) ? 0 : $k;
+        $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;
+        $tmp .= $chars[$j];
+    }
+    return urlencode($ch.$tmp);
+}
+
+/**
+ * 数据解密
+ */
+function unlock_url($txt, $key)
+{
+    $txt = urldecode($txt);
+    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
+    $ch = $txt[0];
+    $nh = strpos($chars,$ch);
+    $mdKey = md5($key.$ch);
+    $mdKey = substr($mdKey,$nh%8, $nh%8+7);
+    $txt = substr($txt,1);
+    $tmp = '';
+    $i = 0;
+    $j = 0;
+    $k = 0;
+    for ($i=0; $i<strlen($txt); $i++) {
+        $k = $k == strlen($mdKey) ? 0 : $k;
+        $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
+        while ($j<0) $j+=64;
+        $tmp .= $chars[$j];
+    }
+    return base64_decode($tmp);
+}
+
+
+/**
+ * 接口调用
+ *
+ * @access public
+ * @param mixed $url 接口地址
+ * @param mixed $where $params参数
+ * @param mixed $timeout 请求时效
+ * @return String
+ */
+function make_request($url, $params, $timeout=30)
+{
+    set_time_limit(0);
+    if (function_exists('curl_init') === true) {
+        $ch = curl_init();
+        $header = array(
+            'Accept-Language: zh-cn',
+            'Connection: Keep-Alive',
+            'Cache-Control: no-cache'
+        );
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+        if ($timeout > 0) curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
+        $result = curl_exec($ch);
+        $errno = curl_errno($ch);
+        curl_close($ch);
+        return $result;
+    } else {
+        $context = array(
+            'http' => array(
+                'method' => 'POST',
+                'header' => 'Content-type: application/x-www-form-urlencoded' . "\r\n" .
+                    'Content-length: ' . strlen($params),
+                'content' => $params));
+        if ($timeout > 0) $context['http']['timeout'] = $timeout;
+        $contextid = stream_context_create($context);
+        $sock = @fopen($url, 'r', false, $contextid);
+        if ($sock) {
+            $result = '';
+            while (!feof($sock)) {
+                $result .= fgets($sock, 8192);
+            }
+            fclose($sock);
+        } else {
+            return 'TimeOut';
+        }
+    }
+    return $result;
+
+}//end make_request()
+

+ 19 - 6
application/common/KfjkLogic.php

@@ -74,8 +74,8 @@ class KfjkLogic
             $kfuidarray_index[$uid]['hhl'] = $hyl[$uid];
             $kfuidarray_index[$uid]['jdl'] = $jdl[$uid];
             $kfuidarray_index[$uid]['pjhysc'] = $pjhysc[$uid];
-            $kfuidarray_index[$uid]['cpl'] = $cpl[$uid];
-            $kfuidarray_index[$uid]['mydl'] = $mydl[$uid];
+            $kfuidarray_index[$uid]['cpl'] = perDisplay($cpl[$uid]);
+            $kfuidarray_index[$uid]['mydl'] = perDisplay($mydl[$uid]);
             $kfuidarray_index[$uid]['pjxysc'] = $pjxysc[$uid];
             $kfuidarray_index[$uid]['jrxxsc'] = $jrxxsc[$uid];
             $kfuidarray_index[$uid]['fxx'] = $this->makeBtn($uid);
@@ -117,6 +117,8 @@ class KfjkLogic
         }
         $statusArr = (new KfonlineModel())->getOnlineAll($onlinestatus);
         $return = array_intersect($groupuserArray, $statusArr);
+
+
         return $return;
     }
 
@@ -199,8 +201,13 @@ class KfjkLogic
         foreach ($rets as $uid => $aaa) {
             foreach ($alllogs as $log) {
                 if ($uid == $log['kf_id']) {
-                    !(isset($rets[$uid]['count'])) ? 1 : $rets[$uid]['count']++;
-                    isset($rets[$uid]['pl']) ? ($rets[$uid]['pl'] = ($log['evaluate_id'] > 0 ? 1 : 0)) : 0;
+                    (!isset($rets[$uid]['count'])) ? ($rets[$uid]['count'] = 1) : $rets[$uid]['count']++;
+                    if (!isset($rets[$uid]['pl'])) {
+                        $rets[$uid]['pl'] = 0;
+                    }
+                    if (($log['evaluate_id'] > 0)) {
+                        $rets[$uid]['pl']++;
+                    }
                 }
             }
         }
@@ -208,7 +215,7 @@ class KfjkLogic
         $return = [];
         foreach ($rets as $uid => $val) {
             if (isset($rets[$uid]['count'])) {
-                $return[$uid] = $return[$uid]['pl'] / $return[$uid]['cocountunt'];
+                $return[$uid] = $rets[$uid]['pl'] / $rets[$uid]['count'];
             } else {
                 $return[$uid] = 0;
             }
@@ -225,7 +232,13 @@ class KfjkLogic
             foreach ($alllogs as $log) {
                 if ($uid == $log['kf_id'] && $log['evaluate_id'] > 0) {
                     (!isset($rets[$uid]['count'])) ? ($rets[$uid]['count'] = 1) : $rets[$uid]['count']++;
-                    (!isset($rets[$uid]['times'])) ? (($log['evaluate_id'] == 1) ? 1 : 0) : (($log['evaluate_id'] == 1) ? $rets[$uid]['times']++ : '');
+
+                    if (!isset($rets[$uid]['times'])) {
+                        $rets[$uid]['times'] = 0;
+                    }
+                    if ($log['evaluate_id'] == 1) {
+                        $rets[$uid]['times']++;
+                    }
                 }
             }
         }

+ 14 - 2
application/config.php

@@ -21,7 +21,7 @@ return [
     'salt' => '~NickBai!@#',
 
     // socket server
-    'socket' => '192.168.2.168:9101',
+    'socket' => 'kfadmin.bocai186.com:9101',
 
     // 管理员登录时间
     'save_time' => 86400,
@@ -34,10 +34,22 @@ return [
         'expire' => 0,
     ],
 
+
     // 应用命名空间
     'app_namespace' => 'app',
+
+    'exception_tmpl' => APP_PATH.'404.html',
+    'http_exception_template' => [
+        // 定义404错误的重定向页面地址
+        '404' => APP_PATH.'404.html',
+        // 还可以定义其它的HTTP status
+        '401' => APP_PATH.'404.html',
+        '403' => APP_PATH.'404.html',
+    ],
+
     // 应用调试模式
-    'app_debug' => true,
+    'app_debug' => false,
     // 应用Trace
     'app_trace' => false
 ];
+

+ 4 - 4
application/database.php

@@ -13,13 +13,13 @@ return [
     // 数据库类型
     'type'            => 'mysql',
     // 服务器地址
-    'hostname'        => '192.168.2.200',
+    'hostname'        => '192.168.2.220',
     // 数据库名
     'database'        => 'customer_service',
     // 用户名
-    'username'        => 'vali',
+    'username'        => 'ethan',
     // 密码
-    'password'        => '1234',
+    'password'        => 'ethan1234',
     // 端口
     'hostport'        => '3306',
     // 连接dsn
@@ -27,7 +27,7 @@ return [
     // 数据库连接参数
     'params'          => [],
     // 数据库编码默认采用utf8
-    'charset'         => 'utf8',
+    'charset'         => 'utf8mb4',
     // 数据库表前缀
     'prefix'          => 'ws_',
     // 数据库调试模式

+ 2 - 2
application/index/controller/Common.php

@@ -23,8 +23,8 @@ class Common extends Controller
         $action      = $request->action();
         $controller  = $request->controller();
         $module      = $request->module();
-        $apiToken    = md5(strtolower($action.'Customer-Service'.$controller.strtotime(date('Y-m-d')).$module));
-        //print_r([strtolower($action.'Customer-Service'.$controller.strtotime(date('Y-m-d')).$module),$apiToken, $getApiToken]);die;
+        $apiToken    = md5(strtolower($action.'Customer-Service'.$controller.$module));
+        //print_r([strtolower($action.'Customer-Service'.$controller.$module),$apiToken, $getApiToken]);die;
         if ($getApiToken === $apiToken) {
             return true;
         } else {

+ 4 - 3
application/index/controller/Index.php

@@ -51,10 +51,10 @@ class Index extends Common
     }//end sensitiveWords()
 
 
-    /*public function index()
+    public function index()
     {
         return $this->fetch();
-    }*/
+    }
 
     // pc客户端
     public function chat()
@@ -99,7 +99,8 @@ class Index extends Common
     {
         $now = time();
         $time = date('Y-m-d H:i', $now);
-        return json(['code' => 1, 'data' => ['time' => $time], 'msg' => '成功']);
+        $settings = db('settings')->where('id',1)->find();
+        return json(['code' => 1, 'data' => ['time' => $time,'logo' => $settings['logo'],'enterprise_name' => $settings['enterprise_name']], 'msg' => '成功']);
     }
 
 }

+ 23 - 4
application/index/controller/Message.php

@@ -14,6 +14,9 @@ class Message extends Controller
             $time = input("param.time/s");
             $key = input("param.key/s");
             $type = input("param.type/s");
+            $limit  = input("param.pageSize/s");
+            $pageNumber = input("param.pageNumber/s");
+            $offset = (input("param.pageNumber/s") - 1) * $limit;
             if($time == 'week'){
                 //前一周
                 $start = time()-604800;
@@ -42,12 +45,15 @@ class Message extends Controller
             }
         }
         if(!empty($key)){
-            $message = db('accountsmessage')->whereBetween('add_time', [$start, $end])->where($where)->whereLike('content','%'.$key.'%')->where('if_public', 1)->select();
+            $message = db('accountsmessage')->whereBetween('add_time', [$start, $end])->where($where)->whereLike('content','%'.$key.'%')->where('if_public', 1)->limit($offset, $limit)->order('add_time', 'desc')->select();
+            $total = db('accountsmessage')->whereBetween('add_time', [$start, $end])->where($where)->whereLike('content','%'.$key.'%')->where('if_public', 1)->limit($offset, $limit)->order('add_time', 'desc')->count();
         }else{
-            $message = db('accountsmessage')->whereBetween('add_time', [$start, $end])->where($where)->where('if_public', 1)->select();
+            $message = db('accountsmessage')->whereBetween('add_time', [$start, $end])->where($where)->where('if_public', 1)->limit($offset, $limit)->order('add_time', 'desc')->select();
+            $total = db('accountsmessage')->whereBetween('add_time', [$start, $end])->where($where)->where('if_public', 1)->limit($offset, $limit)->order('add_time', 'desc')->count();
         }
 
         $type = db('messagetype')->select();
+        $users = db('users')->select();
         foreach($message as $key=>$vo){
             //转为日期时间格式
             $message[$key]['add_time'] = date('Y-m-d H:i:s',$vo['add_time']);
@@ -58,12 +64,25 @@ class Message extends Controller
                     $message[$key]['type_name'] = $type[$i]['name'];
                 }
             }
+            foreach($users as $k=>$v){
+                if($vo['user_id'] == $v['id']){
+                    $message[$key]['user_name'] = $users[$k]['user_name'];
+                }
+            }
         }
+        //总页数
+        $pages = ceil($total/$limit);
+        $list = array();
+        $list['total'] = $total;
+        $list['pages'] = $pages;
+        $list['pageSize'] = $limit;
+        $list['pageNumber'] = $pageNumber;
+        $list['list'] = $message;
 
         $data = [
             'status'=>1,
             'msg'=>'成功',
-            'data'=>$message
+            'data'=>$list
         ];
 
         return json_encode($data,JSON_UNESCAPED_UNICODE);
@@ -72,7 +91,7 @@ class Message extends Controller
     // 留言类型
     public function type()
     {
-        $type = db('messagetype')->select();
+        $type = db('messagetype')->where('status',1)->select();
         for($i=0;$i<count($type);$i++){
             $type[$i]['addtime'] = date('Y-m-d H:i:s',$type[$i]['addtime']);
         }

+ 58 - 16
application/index/controller/Register.php

@@ -98,15 +98,51 @@ class Register extends Common
     //自动注册
     public function autoReg()
     {
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            return json(['code' => 0, 'data' => [], 'msg' => '注册用户失败']);
+        }
+
+        //验证用户IP
+        $settings = db('settings')->where('id', 1)->find();
+        if ($settings['account_black_list'] == 'on') {
+            @$ip = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
+            $ip = ($ip) ? $ip : $_SERVER["REMOTE_ADDR"];
+            //将ip地址转换成int型
+            $intip = bindec(decbin(ip2long($ip)));
+            $res = db('iplimit')->where('ip', $ip)->where('object', 1)->find();
+            $result = db('iplimit')->where('start_ip', '<=', $intip)->where('end_ip', '>=', $intip)->where('object', 1)->find();
+            if (!empty($res) || !empty($result)) {
+                return json(['code' => 0, 'data' => [], 'msg' => '访问受限']);
+            }
+        }
+
+        /*
         if (!$this->verifyApiToken()) {
             return json(['code' => -6, 'data' => [], 'msg' => 'require false']);
         }
+        */
+
+        $appid = trim(input("post.appid/s", ''));
+        $appuid = trim(input("post.appuid/s", ''));
+        $token = trim(input("post.token/s", ''));
+        $nowuid = (empty($appuid)) ? uniqid('anon_') : $appuid;
+        $nowuid = $appid . $nowuid;
 
-        $appid = input("post.appid/s");
-        $appuid = input("post.appuid/s");
-        $token = trim(input("post.token/s"));
-        $nowuid = (empty($appuid) || empty($appuid)) ? uniqid('anon_') : $appid . '_' . $appuid;
-        $avatar = "http://wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg";  //默认头像
+        if (!empty($nowuid) && !empty($token)) {
+            $old = Db::name('accounts')->where(['account_name' => $nowuid, 'tokenvip' => $token])->find();
+            if ($old) {
+                Db::name('accounts')->where(['account_name' => $nowuid])->update(['last_login_time' => time()]);
+                return json(['code' => 1, 'data' => ['id' => $old['id'], 'name' => $nowuid, 'token' => $old['tokenvip']], 'msg' => '注册成功', 'tutype' => 1]);
+            }
+        }
+
+        if (!empty($nowuid)) {
+            $old = Db::name('accounts')->where(['account_name' => $nowuid])->find();
+            if ($old) {
+                Db::name('accounts')->where(['account_name' => $nowuid])->update(['last_login_time' => time()]);
+                return json(['code' => 1, 'data' => ['id' => $old['id'], 'name' => $nowuid, 'token' => $old['tokenvip']], 'msg' => '注册成功', 'tutype' => 1]);
+            }
+        }
 
         if ($token) {
             $old = db('accounts')->where(['token' => $token])->find();
@@ -115,35 +151,41 @@ class Register extends Common
                     return json(['code' => 0, 'data' => [], 'msg' => '禁止登陆']);
                 }
                 Db::name('accounts')->where(['token' => $token])->update(['last_login_time' => time()]);
-                return json(['code' => 1, 'data' => ['id' => $old['id'], 'name' => $old['account_name'], 'token' => $old['token'], 'avatar' => $avatar], 'msg' => '注册成功']);
+                return json(['code' => 1, 'data' => ['id' => $old['id'], 'name' => $old['account_name'], 'token' => $old['token']], 'msg' => '注册成功', 'tutype' => 0]);
             }
         }
 
 
-        $old = Db::name('accounts')->where(['account_name' => $nowuid])->find();
-        if ($old) {
-            Db::name('accounts')->where(['account_name' => $nowuid])->update(['last_login_time' => time()]);
-            return json(['code' => 1, 'data' => ['id' => $old['id'], 'name' => $nowuid, 'token' => $old['token'], 'avatar' => $avatar], 'msg' => '注册成功']);
-        }
-
+        NEWUSERLABLE:
         $now = time();
         $token = md5(uniqid() . rand(10000, 50000));
+        $tokenvip = md5(md5(uniqid() . rand(60000, 90000)));
         $newdata = [
             'account_name' => $nowuid,
-            'password' => md5(time() . rand(1, 5000)),
+            'password' => md5(microtime() . rand(1, 5000)),
             'status' => 1,
             'add_time' => $now,
             'last_login_time' => $now,
             'token' => $token,
+            'tokenvip' => $tokenvip,
             'expire_time' => $now,
         ];
-        $retid = Db::name('accounts')->insertGetId($newdata);
+        try {
+            $retid = Db::name('accounts')->insertGetId($newdata);
+        } catch (\Exception $e) {
+            $retid = false;
+        }
+
         if ($retid) {
-            return json(['code' => 1, 'data' => ['id' => $retid, 'name' => $nowuid, 'token' => $token, 'avatar' => $avatar], 'msg' => '注册成功']);
+            if (empty($appuid)) {
+                return json(['code' => 1, 'data' => ['id' => $retid, 'name' => $nowuid, 'token' => $token], 'msg' => '注册成功', 'tutype' => -1]);
+            } else {
+                return json(['code' => 1, 'data' => ['id' => $retid, 'name' => $nowuid, 'token' => $tokenvip], 'msg' => '注册成功', 'tutype' => 2]);
+            }
         } else {
             return json(['code' => 0, 'data' => [], 'msg' => '注册用户失败']);
         }
 
     }
 
-}
+}

+ 239 - 20
application/index/controller/User.php

@@ -80,22 +80,26 @@ class User extends Controller
     {
 
         if(request()->isPost()){
-            $name = input("param.name/s");
+            $account_id = input("param.account_id/s");
+            $nick_name = input("param.nick_name/s");
             $email = input("param.email/s");
-            $content = input("param.content/s");
             $phone = input("param.phone/s");
-            $qq = input("param.qq/s");
-            $wechat = input("param.wechat/s");
+            $content = input("param.content/s");
+            $account_ip = $_SERVER["REMOTE_ADDR"];
+            //获得访问者浏览器
+            $browse = $this->browse_info();
+            //获得访客操作系统
+            $system = $this->get_os();
 
             $image = input("param.file/s");
 
-            if(empty($name)){
-                return json(['code' => -1, 'data' => '', 'msg' => '用户名称不能为空']);
+            if(empty($account_id)){
+                return json(['code' => -1, 'data' => '', 'msg' => '用户id不能为空']);
             }
 
-//            if(empty($email)){
-//                return json(['code' => -2, 'data' => '', 'msg' => '邮箱不能为空']);
-//            }
+            if(empty($nick_name)){
+                return json(['code' => -2, 'data' => '', 'msg' => '昵称不能为空']);
+            }
 
 //            if(empty($qq)){
 //                return json(['code' => -3, 'data' => '', 'msg' => 'QQ不能为空']);
@@ -109,28 +113,59 @@ class User extends Controller
                 return json(['code' => -5, 'data' => '', 'msg' => '内容不能为空']);
             }
 
-            if(empty($phone)){
-                return json(['code' => -6, 'data' => '', 'msg' => '电话不能为空']);
-            }
+//            if(empty($phone)){
+//                return json(['code' => -6, 'data' => '', 'msg' => '电话不能为空']);
+//            }
 
-            if(empty($image)){
-                return json(['code' => -7, 'data' => '', 'msg' => '附件不能为空']);
-            }
+//            if(empty($image)){
+//                return json(['code' => -7, 'data' => '', 'msg' => '附件不能为空']);
+//            }
 
             $param = [
-                'name' => $name,
-                'email' => $email,
+                'account_id' => $account_id,
+                'nick_name' => $nick_name,
                 'content' => $content,
+                'account_ip' => $account_ip,
+                'browse' => $browse,
+                'system' => $system,
                 'image' => $image,
-                'phone' => $phone,
-                'qq' => $qq,
-                'wechat' => $wechat,
                 'message_status' => 0,
                 'add_time' => time()
             ];
 
+            $account = db('accounts')->where('id',$account_id)->find();
+
+            $info = array();
+            $messageinfo = array();
+            $info['nick_name'] = $nick_name;
+            $messageinfo['nick_name'] = $nick_name;
+            if(!empty($email)){
+                $param['email'] = $email;
+                $info['account_email'] = $email;
+                $messageinfo['email'] = $email;
+            }else{
+                if(!empty($account)){
+                    $param['email'] = $account['account_email'];
+                    $messageinfo['email'] = $account['account_email'];
+                }
+            }
+            if(!empty($phone)){
+                $param['phone'] = $phone;
+                $info['account_phone'] = $phone;
+                $messageinfo['phone'] = $phone;
+            }else{
+                if(!empty($account)){
+                    $param['phone'] = $account['account_phone'];
+                    $messageinfo['phone'] = $account['account_phone'];
+                }
+            }
+
             try{
                 db('accountsmessage')->insertGetId($param);
+                if(!empty($info)){
+                    db('accounts')->where('id',$account_id)->update($info);
+                    db('accountsmessage')->where('account_id',$account_id)->update($messageinfo);
+                }
             }catch(\Exception $e){
                 return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
             }
@@ -140,6 +175,26 @@ class User extends Controller
 
     }
 
+    // 用户消息记录
+    public function historyNews()
+    {
+        if(request()->isPost()){
+            $time = input("param.time/s");
+            $user_id = input("param.user_id/s");
+            $time = strtotime($time);
+//            $user_id = 2;
+        }
+        $news = db('chat_log')->where(function($query) use($user_id) {
+            $query->where('from_id', $user_id)->whereor('to_id',$user_id);
+        })->where('time_line' ,'<=' ,$time)->order('time_line','desc')->limit(10)->select();
+
+        for($i=0;$i<count($news);$i++){
+            $news[$i]['time_line'] = date('Y-m-d H:i:s',$news[$i]['time_line']);
+        }
+        return json(['code' => 1, 'data' => $news, 'msg' => '成功']);
+
+    }
+
     // 上传图片
     public function uplodeImg()
     {
@@ -175,4 +230,168 @@ class User extends Controller
         }
     }
 
+
+    /**
+     * 获得访客操作系统
+     * @return string
+     */
+//    public static function get_os(){
+//        if (!empty($_SESSION['userAgent'])) {
+//            $os = $_SESSION['userAgent'];
+//            if (preg_match('/win/i', $os)) {
+//                $os = 'Windows';
+//            } else if (preg_match('/mac/i', $os)) {
+//                $os = 'MAC';
+//            } else if (preg_match('/linux/i', $os)) {
+//                $os = 'Linux';
+//            } else if (preg_match('/unix/i', $os)) {
+//                $os = 'Unix';
+//            } else if (preg_match('/bsd/i', $os)) {
+//                $os = 'BSD';
+//            } else {
+//                $os = 'Other';
+//            }
+//            return $os;
+//        } else {
+//            return 'unknow';
+//        }
+//    }
+
+    function get_os() {
+        $agent = $_SERVER['HTTP_USER_AGENT'];
+        $os = false;
+        if (stristr($agent,'win')) {
+            $os = 'Windows';
+        }
+        else if (stristr($agent,'win') && stristr($agent, '95')) {
+            $os = 'Windows 95';
+        }
+        else if (stristr($agent,'win 9x') && stristr($agent, '4.90')) {
+            $os = 'Windows ME';
+        }
+        else if (stristr($agent,'win') && stristr($agent,'98')) {
+            $os = 'Windows 98';
+        }
+        else if (stristr($agent,'win') && stristr($agent,'nt 5.1')) {
+            $os = 'Windows XP';
+        }
+        else if (stristr($agent,'win') && stristr($agent,'nt 5')) {
+            $os = 'Windows 2000';
+        }
+        else if (stristr($agent,'win') && stristr($agent,'nt')) {
+            $os = 'Windows NT';
+        }
+        else if (stristr($agent,'win') && stristr($agent,'32')) {
+            $os = 'Windows 32';
+        } else if (stristr($agent,'linux')) {
+            $os = 'Linux';
+        }
+        else if (stristr($agent,'unix')) {
+            $os = 'Unix';
+        }
+        else if (stristr($agent,'sun') && stristr($agent,'os')) {
+            $os = 'SunOS';
+        }
+        else if (stristr($agent,'ibm') && stristr($agent,'os')) {
+            $os = 'IBM OS/2';
+        }
+        else if (stristr($agent,'Mac')) {
+            $os = 'Mac OS X';
+        }
+        else if (stristr($agent,'PowerPC')) {
+            $os = 'PowerPC';
+        }
+        else if (stristr($agent,'AIX')) {
+            $os = 'AIX';
+        }
+        else if (stristr($agent,'HPUX')) {
+            $os = 'HPUX';
+        }
+        else if (stristr($agent,'NetBSD')) {
+            $os = 'NetBSD';
+        }
+        else if (stristr($agent,'BSD')) {
+            $os = 'BSD';
+        }
+        else if (stristr($agent,'OSF1')) {
+            $os = 'OSF1';
+        }
+        else if (stristr($agent,'IRIX')) {
+            $os = 'IRIX';
+        }
+        else if (stristr($agent,'FreeBSD')) {
+            $os = 'FreeBSD';
+        }
+        else if (stristr($agent,'teleport')) {
+            $os = 'teleport';
+        }
+        else if (stristr($agent,'flashget')) {
+            $os = 'flashget';
+        }
+        else if (stristr($agent,'webzip')) {
+            $os = 'webzip';
+        }
+        else if (stristr($agent,'offline')) {
+            $os = 'offline';
+        }
+        else{
+            $os = '';
+        }
+        return $os;
+    }
+
+    /**
+     * 获得访问者浏览器
+     * @return string
+     */
+//    public static function browse_info(){
+//        if (!empty($_SESSION['userAgent'])) {
+//            $br = $_SESSION['userAgent'];
+//            if (preg_match('/MSIE/i', $br)) {
+//                $br = 'MSIE';
+//            } else if (preg_match('/Firefox/i', $br)) {
+//                $br = 'Firefox';
+//            } else if (preg_match('/Chrome/i', $br)) {
+//                $br = 'Chrome';
+//            } else if (preg_match('/Safari/i', $br)) {
+//                $br = 'Safari';
+//            } else if (preg_match('/Opera/i', $br)) {
+//                $br = 'Opera';
+//            } else {
+//                $br = 'Other';
+//            }
+//            return $br;
+//        } else {
+//            return 'unknow';
+//        }
+//    }
+
+      public function browse_info(){
+          if(!empty($_SERVER['HTTP_USER_AGENT'])){
+              $br = $_SERVER['HTTP_USER_AGENT'];
+              if (preg_match('/MSIE/i',$br)) {
+                  $br = 'MSIE';
+              }
+              elseif (preg_match('/Firefox/i',$br)) {
+                  $br = 'Firefox';
+              }
+              elseif (preg_match('/Chrome/i',$br)) {
+                  $br = 'Chrome';
+              }
+              elseif (preg_match('/Safari/i',$br)) {
+                  $br = 'Safari';
+              }
+              elseif (preg_match('/Opera/i',$br)) {
+                  $br = 'Opera';
+              }else {
+                  $br = 'Other';
+              }
+              return $br;
+          }
+          else{
+              return "";
+          }
+      }
+
+
 }

+ 15 - 0
application/redis.php

@@ -0,0 +1,15 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/7/25
+ * Time: 14:30
+ */
+
+return [
+    'host' => '192.168.2.200',
+    'port' => 26379,
+    'passwd' => '',
+    'db' => 1,
+    'overtime' => 1,
+];

+ 4 - 2
application/service/controller/Common.php

@@ -22,7 +22,7 @@ class Common extends Base
         $action       = $request->action();
         $controller   = $request->controller();
         $module       = $request->module();
-        $apiToken     = md5(strtolower($action.'Customer-Service'.$controller.strtotime(date('Y-m-d')).$module));
+        $apiToken     = md5(strtolower($action.'Customer-Service'.$controller.$module));
         //print_r([$apiToken,$getApiToken]);die;
         // 验证服务器token.
         if ($getApiToken === $apiToken && empty($getUserToken) === false) {
@@ -31,10 +31,12 @@ class Common extends Base
                 'expire_time',
             ];
             $usersWhere['token'] = $getUserToken;
+            $usersWhere['status'] = 1;
             // 验证用户token.
             $users         = model('users')->findUsers($usersField, $usersWhere);
             $effectiveTime = strtotime(date('Y-m-d H:i:s').'-1 hours');
-            if (empty($users) === false && $effectiveTime <= $users['expire_time']) {
+            //if (empty($users) === false && $effectiveTime <= $users['expire_time']) {
+            if (empty($users) === false) {
                 $updateWhere['id']         = $users['id'];
                 $updateData['expire_time'] = strtotime(date('Y-m-d H:i:s'));
                 model('users')->updateUsers($updateWhere, $updateData);

+ 171 - 2
application/service/controller/History.php

@@ -1,6 +1,8 @@
 <?php
 namespace app\service\controller;
 
+use think\cache\driver\Redis;
+
 /**
  * 客服系统会话历史类
  */
@@ -8,6 +10,91 @@ class History extends Common
 {
 
 
+    /**
+     * 获取当前所有会话
+     *
+     * @access public
+     * @return array JsonString
+     */
+    public function allConversation()
+    {
+        // 验证token.
+        $tokenStatus = $this->verifyToken();
+        $code        = -2;
+        $msg         = '错误';
+        if ($tokenStatus === false) {
+            $msg = 'token错误';
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }
+
+        try {
+            // 获取用户信息.
+            $getUserInfo = $this->getUserInfo();
+            if ($getUserInfo['user_overview'] != 1) {
+                $msg = '您没有权限查看';
+                return json(['code' => 1, 'data' => [], 'msg' => $msg]);
+            }
+
+            $groups     = model('Groups')->selectGroups();
+            $redis      = new Redis;
+            $kefuInfo   = $redis->handler()->hGetall('KFINFO');
+            $servicelog = $redis->handler()->hGetall('SERVICELOG');
+            // 获取所有用户ID.
+            $userIds = [];
+            foreach ($servicelog as $value) {
+                $kefuInfoData = json_decode($value, true);
+                $userIds[] = $kefuInfoData['user_id'];
+            }
+            $getAccountsField = [
+                'id',
+                'nick_name',
+            ];
+            $getAccountsWhere['id'] = ['in', $userIds];
+            $getAllAccounts     = model('Accounts')->selectAccounts($getAccountsField, $getAccountsWhere);
+
+            foreach ($groups as $k => $v) {
+                $data[$k]           = (object) [
+                    'label' => $v['name'].'-组',
+                ];
+                $n                  = 0;
+                $data[$k]->children = [];
+                foreach ($kefuInfo as $va) {
+                    $kefuInfoData = json_decode($va, true);
+                    if ($kefuInfoData['group'] == $v['id']) {
+                        $KFstatus = $kefuInfoData['status'] == 1 ? '(在线)'
+                            : ($kefuInfoData['status'] == 2 ? '(隐身)'
+                                : ($kefuInfoData['status'] == 3 ? '(休息)' : '(未知)'));
+                        $data[$k]->children[$n] = (object) [
+                            'label' => $kefuInfoData['name'].$KFstatus.'-客服',
+                        ];
+                        $data[$k]->children[$n]->children = [];
+                        foreach ($servicelog as $val) {
+                            $servicelogData = json_decode($val, true);
+                            if (('KF'.$servicelogData['kf_id']) == $kefuInfoData['id']) {
+                                $found_key = array_search($servicelogData['user_id'], array_column($getAllAccounts, 'id'));
+                                $label = $getAllAccounts[$found_key]['nick_name'] ?? $servicelogData['user_name'];
+                                $data[$k]->children[$n]->children[] = (object) [
+                                    'label'         => $label.'-会话',
+                                    'user_id'         => $servicelogData['user_id'],
+                                    'servicelog_id' => $servicelogData['servicelog_id'],
+                                ];
+                            }
+
+                        }
+
+                        $n++;
+                    }
+                }//end foreach
+            }//end foreach
+
+            return json(['code' => 1, 'data' => $data, 'msg' => '成功', 'serverList' => array_keys($servicelog)]);
+        } catch (\Exception $e) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }//end try
+
+    }//end allConversation()
+
+
     /**
      * 获取会话历史
      *
@@ -57,11 +144,11 @@ class History extends Common
             $endTime     = strtotime(date('Y-m-d').'+1 day');
             if (strlen($start) && strlen($end) ) {
                 $startTime = strtotime($start);
-                $endTime   = strtotime($end);
+                $endTime   = strtotime($end.'+1 day');
             }
 
             if (strlen($userName)) {
-                $serviceLogWhere['user_name'] = $userName;
+                $serviceLogWhere['user_name'] = ['like', '%' . $userName . '%'];
             }
 
             $serviceLogWhere['start_time'] = [
@@ -166,12 +253,24 @@ class History extends Common
                 }
             }
 
+            $service_log = db('service_log')->where('servicelog_id',$servicelogId)->find();
+            $account = db('accounts')
+                ->alias('a')
+                ->join('accountslabel b', 'a.label_id = b.id')
+                ->field('a.id,account_name,nick_name,account_email,account_phone,address,remark,name as label')
+                ->where('a.id',$service_log['user_id'])
+                ->find();
+            $account['user_ip'] = $service_log['user_ip'];
+            $account['system'] = $service_log['system'];
+            $account['browse'] = $service_log['browse'];
+
 
             $result['total']       = $countChatLog;
             $result['countPage']   = (ceil(($result['total']) / $pageSize));
             $result['currentPage'] = $currentPage;
             $result['list']        = $chatLog;
             $result['pageSize']    = $pageSize;
+            $result['account']    = $account;
             $result['alarm']       = [
                 'evaluate_id'      => $alarm['evaluate_id'],
                 'verifyReturnTime' => $verifyReturnTime,
@@ -189,6 +288,76 @@ class History extends Common
     }//end historyInfo()
 
 
+    /**
+     * 获取会话历史详细
+     *
+     * @access public
+     * @return array JsonString
+     */
+    public function chatByTime()
+    {
+        // 验证token.
+        $tokenStatus = $this->verifyToken();
+        $code        = -2;
+        $msg         = '错误';
+        if ($tokenStatus === false) {
+            $msg = 'token错误';
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }
+
+        try {
+            // 工单ID信息.
+            $servicelogId = input('get.servicelog_id');
+            $chatLogField = ['*'];
+            // 关联信息.
+            $chatLogWhere['servicelog_id'] = $servicelogId;
+            if (strlen(input('get.lastTime'))) {
+                $lastTime = input('get.lastTime');
+                $chatLogWhere['time_line']  = array('gt', $lastTime);
+            }
+            // 分页.
+            $currentPage = 1;
+            $pageSize    = 999999;
+            $offset      = (($currentPage - 1) * $pageSize);
+            $chatLog      = model('ChatLog')->selectChatLog($chatLogField, $offset, $pageSize, $chatLogWhere);
+
+            $service_log = db('service_log')->where('servicelog_id',$servicelogId)->find();
+            $account = db('accounts')
+                ->alias('a')
+                ->join('accountslabel b', 'a.label_id = b.id')
+                ->field('a.id,account_name,nick_name,account_email,account_phone,address,remark,name as label')
+                ->where('a.id',$service_log['user_id'])
+                ->find();
+            $account['user_ip'] = $service_log['user_ip'];
+            $account['system'] = $service_log['system'];
+            $account['browse'] = $service_log['browse'];
+            // 获取用户信息.
+            $usersField   = [
+                'a.id',
+                'user_name',
+                'user_avatar',
+                'b.name',
+            ];
+            // 关联信息.
+            $join['groups b']    = 'a.group_id = b.id';
+            $usersWhere['a.id'] = $service_log['kf_id'];
+            // 获取用户信息.
+            $serverInfo = model('users')->findInfo($usersField, $usersWhere, $join);
+
+
+            $result['list']        = $chatLog;
+            $result['account']    = $account;
+            $result['serverName'] = $serverInfo['user_name'];
+            $result['groupName'] = $serverInfo['name'];
+
+            return json(['code' => 1, 'data' => $result, 'msg' => '成功']);
+        } catch (\Exception $e) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }//end try
+
+    }//end historyInfo()
+
+
     /**
      * 获取用户会话历史详细
      *

+ 78 - 3
application/service/controller/Index.php

@@ -186,13 +186,13 @@ class Index extends Common
     }
 
 
-    //获取功能菜单
+    //获取访客端入口
     public function getGuestEnter()
     {
-        //功能菜单
+        //访客端入口
         $guestenter = db('guestenter')->order('sort','asc')->select();
         //自动邀请设置信息
-        $settings = db('settings')->field('id,stop_time,copywriting')->find();
+        $settings = db('settings')->field('id,margin_top,stop_time,copywriting')->find();
 
         $guestenter[] = $settings;
 
@@ -202,4 +202,79 @@ class Index extends Common
             return json(['code' => -1, 'data' => '', 'msg' => '失败']);
         }
     }
+
+
+    /**
+     * 获取未读公告
+     * @access public
+     * @return array JsonString
+     */
+    public function unreadnotice()
+    {
+        $user_id = input('post.user_id');
+        //获取未读公告
+        try{
+            $admins = db('admins')->select();
+            $readnotice = db('servicenotice')->field('id,uid,title,atext,sendtime,admin_id')->where('readtime',0)->where('uid',$user_id)->where('sendtime','<',date('Y-m-d H:i:s',time()))->order('sendtime','desc')->select();
+            for($i=0;$i<count($readnotice);$i++){
+                for($j=0;$j<count($admins);$j++)
+                    if($readnotice[$i]['admin_id'] == $admins[$j]['id']){
+                        $readnotice[$i]['admin_name'] = $admins[$j]['user_name'];
+                    }
+            }
+            return json(['code' => 1, 'data' => $readnotice, 'msg' => '成功']);
+        } catch (\Exception $e) {
+            return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+        }
+
+    }
+
+    /**
+     * 获取已读公告
+     * @access public
+     * @return array JsonString
+     */
+    public function readnotice()
+    {
+        $user_id = input('post.user_id');
+        //获取已读公告
+        try{
+            $admins = db('admins')->select();
+            $unreadnotice = db('servicenotice')->field('id,uid,title,atext,sendtime,admin_id')->where('readtime','<>',0)->where('uid',$user_id)->order('sendtime','desc')->select();
+            for($i=0;$i<count($unreadnotice);$i++){
+                for($j=0;$j<count($admins);$j++)
+                if($unreadnotice[$i]['admin_id'] == $admins[$j]['id']){
+                    $unreadnotice[$i]['admin_name'] = $admins[$j]['user_name'];
+                }
+            }
+            return json(['code' => 1, 'data' => $unreadnotice, 'msg' => '成功']);
+        } catch (\Exception $e) {
+            return json(['code' => -3, 'data' => '', 'msg' => $e->getMessage()]);
+        }
+
+    }
+
+    /**
+     * 修改公告阅读状态
+     * @access public
+     * @return array JsonString
+     */
+    public function updatenotice()
+    {
+        $servicenotice_id = input('post.servicenotice_id');
+
+        $data = db('servicenotice')->where('id',$servicenotice_id)->find();
+        if(empty($data)){
+            return json(['code' => -1, 'data' => '', 'msg' => '公告不存在']);
+        }
+
+        try{
+            //修改公告阅读状态
+            db('servicenotice')->where('id',$servicenotice_id)->update(['readtime' => time()]);
+            return json(['code' => 1, 'data' => '', 'msg' => '公告阅读状态修改成功']);
+        } catch (\Exception $e) {
+            return json(['code' => -3, 'data' => '', 'msg' => $e->getMessage()]);
+        }
+
+    }
 }

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov