ソースを参照

Merge branch 'master' of http://git.bocai108.com:10180/Ethan/Customer-Service

# Conflicts:
#	vendor/GatewayWorker_windows/Applications/whisper/Events.php
vali 6 年 前
コミット
b76f9f5dca
38 ファイル変更696 行追加90 行削除
  1. 3 2
      application/admin/controller/Admins.php
  2. 0 4
      application/admin/controller/Base.php
  3. 9 2
      application/admin/controller/Index.php
  4. 9 5
      application/admin/controller/Messages.php
  5. 30 2
      application/admin/controller/Users.php
  6. 7 1
      application/admin/model/Accountsmessage.php
  7. 2 1
      application/admin/model/Admins.php
  8. 7 8
      application/admin/view/admins/index.html
  9. 3 3
      application/admin/view/messages/detail.html
  10. 3 3
      application/admin/view/messages/index.html
  11. 18 0
      application/admin/view/users/adduser.html
  12. 21 2
      application/admin/view/users/edituser.html
  13. 4 1
      application/admin/view/users/index.html
  14. 1 1
      application/index/controller/Common.php
  15. 1 0
      application/index/controller/Evaluate.php
  16. 1 0
      application/index/controller/Groups.php
  17. 2 2
      application/index/controller/Login.php
  18. 4 4
      application/index/controller/Register.php
  19. 2 0
      application/index/controller/Robot.php
  20. 3 3
      application/index/controller/Upload.php
  21. 49 17
      application/index/controller/User.php
  22. 0 4
      application/service/controller/Base.php
  23. 62 0
      application/service/controller/Common.php
  24. 116 0
      application/service/controller/History.php
  25. 100 5
      application/service/controller/Index.php
  26. 15 7
      application/service/controller/Login.php
  27. 49 0
      application/service/controller/Message.php
  28. 27 0
      application/service/model/Evaluate.php
  29. 42 0
      application/service/model/ServiceLog.php
  30. 63 0
      application/service/model/Users.php
  31. 34 0
      application/service/model/Words.php
  32. 4 3
      public/static/customer/js/whisper-cli.js
  33. 5 10
      public/static/service/js/whisper.js
  34. BIN
      public/uploads/20190628/0f24febff80d0fac0975d6bbc15266f6.jpg
  35. BIN
      public/uploads/20190628/330a62e9fc212b46ef41e18e4f6b7981.jpg
  36. BIN
      public/uploads/20190628/83ce184aa0808cd430cb0be2976b1325.jpg
  37. BIN
      public/uploads/20190628/83e4b1e2b23dc4ef9d7d8f2b5bccf5b2.png
  38. BIN
      public/uploads/20190628/f2707910919b6e6574aa5bd3f14008f9.png

+ 3 - 2
application/admin/controller/Admins.php

@@ -133,6 +133,7 @@ class Admins extends Base
     {
         if(request()->isAjax()){
             $id = input('param.id/d');
+            //return $id;
 
             try{
                 db('admins')->where('id', $id)->delete();
@@ -140,7 +141,7 @@ class Admins extends Base
                 return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
             }
 
-            return json(['code' => 1, 'data' => '', 'msg' => '删除客服成功']);
+            return json(['code' => 1, 'data' => '', 'msg' => '删除管理员成功']);
         }
     }
 
@@ -150,7 +151,7 @@ class Admins extends Base
         $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 .= '<a href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
+        $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> ';
 
         return $operate;

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

@@ -7,10 +7,6 @@ class Base extends Controller
 {
     public function _initialize()
     {
-        if(empty(cookie('user_name'))){
-            $this->redirect(url('login/index'));
-        }
-
         $this->assign([
             'version' => config('version'),
             'socket' =>config('socket'),

+ 9 - 2
application/admin/controller/Index.php

@@ -81,6 +81,13 @@ 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;
+
         if(request()->isPost()){
 
             $param = input('post.');
@@ -96,7 +103,7 @@ class Index extends Base
 
             if(!empty($param['old_pwd']) && !empty($param['password'])){
 
-                $userPwd = db('admins')->where('id', cookie('user_id'))->find();
+                $userPwd = db('admins')->where('id', $user_id)->find();
                 if(empty($userPwd)){
                     return json(['code' => -4, 'data' => '', 'msg' => '管理员不存在']);
                 }
@@ -109,7 +116,7 @@ class Index extends Base
                 $reLogin = true;
             }
 
-            db('admins')->where('id', cookie('user_id'))->setField('password', $info['password']);
+            db('admins')->where('id', $user_id)->setField('password', $info['password']);
 
             return json(['code' => 1, 'data' => $reLogin, 'msg' => '修改信息成功']);
         }

+ 9 - 5
application/admin/controller/Messages.php

@@ -21,11 +21,13 @@ class Messages extends Base
             if (empty($param['searchText']) === false) {
                 $where['user_name'] = $param['searchText'];
             }
-
             $join   = [
-                'accounts b'      => 'a.user_id = b.id',
+                'accounts b'      => 'a.account_id = b.id',
+            ];
+            $leftjoin   = [
+                'users c'      => 'a.user_id = c.id',
             ];
-            $result = model('Accountsmessage')->selectJoin($join,$where, $offset, $limit);
+            $result = model('Accountsmessage')->selectJoin($join,$leftjoin,$where, $offset, $limit);
             foreach($result as $key=>$vo){
                 // 优化显示附件
                 $result[$key]['image'] = '<img src="' . $vo['image'] . '" width="40px" height="40px">';
@@ -65,9 +67,11 @@ class Messages extends Base
 
         $id = input('param.id/d');
         $info = db('Accountsmessage')->where('message_id', $id)->find();
-        $user = db('Accounts')->where('id', $info['user_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_email'] = $account['account_email'];
         $info['user_name'] = $user['user_name'];
-        $info['user_email'] = $user['user_email'];
 
         // 优化时间
         if(null != $info['add_time']){

+ 30 - 2
application/admin/controller/Users.php

@@ -12,8 +12,14 @@ class Users extends Base
     public function index()
     {
         if(request()->isAjax()){
-
-            $result = db('users')->order('id', 'desc')->select();
+            $param  = input('param.');
+            $limit  = $param['pageSize'];
+            $offset = (($param['pageNumber'] - 1) * $limit);
+            $where = [];
+            if (empty($param['searchText']) === false) {
+                $where['user_name'] = $param['searchText'];
+            }
+            $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">';
@@ -74,6 +80,16 @@ class Users extends Base
                 return json(['code' => -2, 'data' => '', 'msg' => '该客服已经存在']);
             }
 
+            $user_job_number = db('users')->field('id')->where('user_job_number', $param['user_job_number'])->find();
+            if(!empty($user_job_number)){
+                return json(['code' => -2, 'data' => '', 'msg' => '该工号已经存在']);
+            }
+
+            $user_email = db('users')->field('id')->where('user_email', $param['user_email'])->find();
+            if(!empty($user_email)){
+                return json(['code' => -2, 'data' => '', 'msg' => '该邮箱已经存在']);
+            }
+
             $param['user_pwd'] = md5($param['user_pwd'] . config('salt'));
             $param['online'] = 2; // 离线状态
 
@@ -112,6 +128,18 @@ class Users extends Base
                 return json(['code' => -1, 'data' => '', 'msg' => '该客服已经存在']);
             }
 
+            // 检测用户修改的工号是否重复
+            $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' => '该工号已经存在']);
+            }
+
+            // 检测用户修改的邮箱是否重复
+            $user_email = db('users')->where('user_email', $param['user_email'])->where('id', '<>', $param['id'])->find();
+            if(!empty($user_email)){
+                return json(['code' => -2, 'data' => '', 'msg' => '该邮箱已经存在']);
+            }
+
             // 修改用户头像
             if(empty($param['user_avatar'])){
                 unset($param['user_avatar']);

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

@@ -18,7 +18,7 @@ class Accountsmessage extends Model
      * @param mixed $order 排序
      * @return array 返回类型
      */
-    public function selectJoin($join, $where=[], $offset='', $limit='', $order=['a.message_id'=>'desc'])
+    public function selectJoin($join,$leftjoin, $where=[], $offset='', $limit='', $order=['a.message_id'=>'desc'])
     {
         $result = $this;
         if (empty($join) === false) {
@@ -28,6 +28,12 @@ class Accountsmessage extends Model
             }
         }
 
+        if (empty($leftjoin) === false) {
+            foreach ($leftjoin as $k => $v) {
+                $result = $result->join('users c', 'a.user_id = c.id','LEFT');
+            }
+        }
+
         if (empty($where) === false) {
             $result = $result->where($where);
         }

+ 2 - 1
application/admin/model/Admins.php

@@ -13,7 +13,8 @@ class Admins extends Model
             $time = time()-$user['expire_time'];
             if($time<3600){
                 db('admins')->where('id', $user['id'])->update(['expire_time' => time()]);
-                return 1;
+                $user_id = explode('/',base64_decode($token))['2'];
+                return $user_id;
             }else{
                 return -1;
             }

+ 7 - 8
application/admin/view/admins/index.html

@@ -106,24 +106,23 @@
         $("#search").bind("click", initTable);
     });
 
-    function userDel(id){
-        layer.confirm('确认删除此客服?', {icon: 3, title:'提示'}, function(index){
+    function adminDel(id) {
+        layer.confirm('确认删除管理员?', {icon: 3, title: '提示'}, function (index) {
             //do something
-            $.getJSON("{:url('users/delUser')}", {'id' : id}, function(res){
-                if(1 == res.code){
-                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+            $.getJSON("{:url('admins/delAdmin')}", {'id': id}, function (res) {
+                if (1 == res.code) {
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function () {
                         initTable();
                     });
-                }else if(111 == res.code){
+                } else if (111 == res.code) {
                     window.location.reload();
-                }else{
+                } else {
                     layer.alert(res.msg, {title: '友情提示', icon: 2});
                 }
             });
 
             layer.close(index);
         })
-
     }
 </script>
 </body>

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

@@ -25,7 +25,7 @@
                         <div class="form-group">
                             <label class="col-sm-3 control-label">用户名称:</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']}">
+                                <input id="account_name" type="text" class="form-control" name="Account_name" required="" aria-required="true" value="{$info['account_name']}">
                             </div>
                         </div>
                         <div class="form-group">
@@ -57,7 +57,7 @@
                         <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_pwd" value="{$info['user_email']}">
+                                <input id="account_email" type="text" class="form-control" name="account_email" value="{$info['account_email']}">
                             </div>
                         </div>
                         <div class="form-group">
@@ -69,7 +69,7 @@
                         <div class="form-group">
                             <label class="col-sm-3 control-label">处理人:</label>
                             <div class="input-group col-sm-4">
-                                <input id="kefu_name" type="text" class="form-control" name="user_pwd" value="{$info['kefu_name']}">
+                                <input id="user_name" type="text" class="form-control" name="user_pwd" value="{$info['user_name']}">
                             </div>
                         </div>
                         <div class="form-group">

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

@@ -37,14 +37,14 @@
                 <div class="example">
                     <table id="cusTable">
                         <thead>
-                        <th class="user_name" id="user_name" data-field="user_name">用户名称</th>
+                        <th class="user_name" id="user_name" data-field="account_name">用户名称</th>
                         <th class="add_time" id="add_time" data-field="add_time">留言时间</th>
                         <th data-field="content">内容</th>
                         <th data-field="image">附件</th>
                         <th data-field="phone">手机</th>
-                        <th data-field="user_email">邮箱</th>
+                        <th data-field="account_email">邮箱</th>
                         <th data-field="status">当前状态</th>
-                        <th data-field="kefu_name">处理人</th>
+                        <th data-field="user_name">处理人</th>
                         <th data-field="dealWith_time">处理时间</th>
                         <th data-field="operate">操作</th>
                         </thead>

+ 18 - 0
application/admin/view/users/adduser.html

@@ -28,6 +28,24 @@
                                 <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="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">客服邮箱:</label>
+                            <div class="input-group col-sm-4">
+                                <input id="useremail" type="text" class="form-control" name="user_email" 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="phone" type="text" class="form-control" name="phone" 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">

+ 21 - 2
application/admin/view/users/edituser.html

@@ -28,6 +28,24 @@
                                 <input id="username" type="text" class="form-control" name="user_name" required="" aria-required="true" value="{$info['user_name']}">
                             </div>
                         </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">客服工号:</label>
+                            <div class="input-group col-sm-4">
+                                <input id="userjobnumber" 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>
+                            <div class="input-group col-sm-4">
+                                <input id="useremail" type="text" class="form-control" name="user_email" required="" 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']}">
+                            </div>
+                        </div>
                         <div class="form-group">
                             <label class="col-sm-3 control-label">登录密码:</label>
                             <div class="input-group col-sm-4">
@@ -71,8 +89,9 @@
                         </div>
 
                         <div class="form-group">
-                            <div class="col-sm-4 col-sm-offset-6">
-                                <button class="btn btn-primary" type="submit">提交</button>
+                            <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>
                         </div>
                     </form>

+ 4 - 1
application/admin/view/users/index.html

@@ -37,9 +37,12 @@
                 <div class="example">
                     <table id="cusTable">
                         <thead>
-                        <th data-field="id">客服ID</th>
+                        <!--<th data-field="id">客服ID</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="group">所属组别</th>
                         <th data-field="status">客服状态</th>
                         <!--<th data-field="online">是否在线</th>-->

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

@@ -4,7 +4,7 @@ namespace app\index\controller;
 use think\Controller;
 
 /**
- * 分组
+ * 公共
  */
 class Common extends Controller
 {

+ 1 - 0
application/index/controller/Evaluate.php

@@ -16,6 +16,7 @@ class Evaluate extends Common
      */
     public function index()
     {
+        // 验证token.
         $tokenStatus = $this->verifyApiToken();
         $code        = -2;
         $msg         = '错误';

+ 1 - 0
application/index/controller/Groups.php

@@ -17,6 +17,7 @@ class Groups extends Common
      */
     public function index()
     {
+        // 验证token.
         $tokenStatus = $this->verifyApiToken();
         $code        = -2;
         $msg         = '错误';

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

@@ -37,8 +37,8 @@ class Login extends Controller
                 return json(['code' => -2, 'data' => '', 'msg' => '密码不能为空']);
             }
 
-            $user_name = db('accounts')->where('user_name', $userName)->find();
-            $user_email = db('accounts')->where('user_name', $userName)->find();
+            $user_name = db('accounts')->where('account_name', $userName)->find();
+            $user_email = db('accounts')->where('account_email', $userName)->find();
 
             if(empty($user_name) && empty($user_email)){
                 return json(['code' => -3, 'data' => '', 'msg' => '用户名或邮箱不存在']);

+ 4 - 4
application/index/controller/Register.php

@@ -50,20 +50,20 @@ class Register extends Controller
                 return json(['code' => -5, 'data' => '', 'msg' => '验证码不正确']);
             }
 
-            $name = db('accounts')->where('user_name', $userName)->find();
+            $name = db('accounts')->where('account_name', $userName)->find();
             if(!empty($name)){
                 return json(['code' => -6, 'data' => '', 'msg' => '用户名已存在']);
             }
 
-            $email = db('accounts')->where('user_email', $userEmail)->find();
+            $email = db('accounts')->where('account_email', $userEmail)->find();
             if(!empty($email)){
                 return json(['code' => -7, 'data' => '', 'msg' => '邮箱已存在']);
             }
 
             // 添加用户信息
             $userInfo = [
-                'user_name' => $userName,
-                'user_email' => $userEmail,
+                'account_name' => $userName,
+                'account_email' => $userEmail,
                 'password' => md5($password . config('salt')),
                 'status' => 1,
                 'add_time' => time(),

+ 2 - 0
application/index/controller/Robot.php

@@ -16,6 +16,7 @@ class Robot extends Common
      */
     public function index()
     {
+        // 验证token.
         $tokenStatus = $this->verifyApiToken();
         $code        = -2;
         $msg         = '错误';
@@ -56,6 +57,7 @@ class Robot extends Common
      */
     public function getRobotGroups()
     {
+        // 验证token.
         $tokenStatus = $this->verifyApiToken();
         $code        = -2;
         $msg         = '错误';

+ 3 - 3
application/index/controller/Upload.php

@@ -30,7 +30,7 @@ class Upload extends Controller
         $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
         if($info){
             $src =  '/uploads' . '/' . date('Ymd') . '/' . $info->getFilename();
-            return json(['code' => 0, 'data' => ['src' => $src ], 'msg' => '']);
+            return json(['code' => 200, 'data' => ['src' => $src ], 'msg' => '']);
         }else{
             // 上传失败获取错误信息
             return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
@@ -61,10 +61,10 @@ class Upload extends Controller
         $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
         if($info){
             $src =  '/uploads' . '/' . date('Ymd') . '/' . $info->getFilename();
-            return json(['code' => 0, 'data' => ['src' => $src ], 'msg' => $fileInfo['name']]);
+            return json(['code' => 200, 'data' => ['src' => $src ], 'msg' => $fileInfo['name']]);
         }else{
             // 上传失败获取错误信息
             return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
         }
     }
-}
+}

+ 49 - 17
application/index/controller/User.php

@@ -84,27 +84,59 @@ class User extends Controller
         if(request()->isPost()){
             $content = input("param.content/s");
             $phone = input("param.phone/s");
-        }
-
-        if(empty($content)){
-            return json(['code' => -1, 'data' => '', 'msg' => '内容不能为空']);
-        }
 
-        if(empty($phone)){
-            return json(['code' => -2, 'data' => '', 'msg' => '电话不能为空']);
+            $file = request()->file('file');
+
+            if(empty($content)){
+                return json(['code' => -1, 'data' => '', 'msg' => '内容不能为空']);
+            }
+
+            if(empty($phone)){
+                return json(['code' => -2, 'data' => '', 'msg' => '电话不能为空']);
+            }
+
+            if(empty($file)){
+                return json(['code' => -3, 'data' => '', 'msg' => '附件不能为空']);
+            }
+            $fileInfo = $file->getInfo();
+            /*if($fileInfo['size'] > 1024 * 1024 * 2){
+                // 上传失败获取错误信息
+                return json( ['code' => -2, 'data' => '', 'msg' => '文件超过2M'] );
+            }*/
+
+            //检测图片格式
+            $ext = explode('.', $fileInfo['name']);
+            $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){
+                $src =  '/uploads' . '/' . date('Ymd') . '/' . $info->getFilename();
+            }else{
+                // 上传失败获取错误信息
+                return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
+            }
+
+            $param = [
+                'account_id' => $user_id,
+                'content' => $content,
+                'image' => $src,
+                'phone' => $phone,
+                'message_status' => 0,
+                'add_time' => time()
+            ];
+
+            db('accountsmessage')->insertGetId($param);
+
+            return json(['code' => 1, 'data' => url('user/index'), 'msg' => '留言成功']);
         }
 
-        $param = [
-            'user_id' => $user_id,
-            'content' => $content,
-            'phone' => $phone,
-            'message_status' => 0,
-            'add_time' => time()
-        ];
-
-        db('accountsmessage')->insertGetId($param);
 
-        return json(['code' => 1, 'data' => url('user/index'), 'msg' => '留言成功']);
 
     }
 

+ 0 - 4
application/service/controller/Base.php

@@ -7,10 +7,6 @@ class Base extends Controller
 {
     public function _initialize()
     {
-        if(empty(cookie('l_user_name'))){
-
-            $this->redirect(url('login/index'));
-        }
         $this->assign([
             'version' => config('version'),
             'socket' => config('socket')

+ 62 - 0
application/service/controller/Common.php

@@ -0,0 +1,62 @@
+<?php
+namespace app\service\controller;
+
+/**
+ * 公共类
+ */
+class Common extends Base
+{
+
+
+    /**
+     * 验证token
+     *
+     * @access public
+     * @return string
+     */
+    protected function verifyToken()
+    {
+        $request      = \think\Request::instance();
+        $getApiToken  = input('server.HTTP_apiToken');
+        $getUserToken = input('server.HTTP_userToken');
+        $action       = $request->action();
+        $controller   = $request->controller();
+        $module       = $request->module();
+        $apiToken     = md5(strtoupper($action.'Customer-Service'.$controller.strtotime(date('Y-m-d')).$module));
+        // 验证服务器token.
+        if ($getApiToken === $apiToken && empty($getUserToken) === false) {
+            $usersField          = ['id'];
+            $usersWhere['token'] = $getUserToken;
+            // 验证用户token.
+            $users = model('users')->findUsers($usersField, $usersWhere);
+            if (empty($users) === false) {
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+
+    }//end verifyToken()
+
+
+    /**
+     * 获取用户信息
+     *
+     * @access public
+     * @return string
+     */
+    protected function getUserInfo()
+    {
+        $getUserToken        = input('server.HTTP_userToken');
+        $usersField          = ['*'];
+        $usersWhere['token'] = $getUserToken;
+        // 获取用户信息.
+        $usersInfo = model('users')->findUsers($usersField, $usersWhere);
+        return $usersInfo;
+
+    }//end getUserInfo()
+
+
+}

+ 116 - 0
application/service/controller/History.php

@@ -0,0 +1,116 @@
+<?php
+namespace app\service\controller;
+
+/**
+ * 客服系统会话历史类
+ */
+class History extends Common
+{
+
+
+    /**
+     * 获取会话历史
+     *
+     * @access public
+     * @return array JsonString
+     */
+    public function historyList()
+    {
+        // 验证token.
+        $tokenStatus = $this->verifyToken();
+        $code        = -2;
+        $msg         = '错误';
+        if ($tokenStatus === false) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }
+
+        try {
+            // 获取用户信息.
+            $getUserInfo     = $this->getUserInfo();
+            $serviceLogField = [
+                'user_id',
+                'user_name',
+                'user_avatar',
+                'user_ip',
+                'start_time',
+                'end_time',
+                'name',
+                'website',
+                'system',
+                'browse',
+                'a.status',
+                'evaluate_id',
+            ];
+            // 关联信息.
+            $serviceLogJoin['groups b'] = 'a.group_id = b.id';
+            $serviceLogWhere['kf_id']   = $getUserInfo->id;
+            // 获取用户信息.
+            $serviceLog = model('ServiceLog')->selectServiceLog($serviceLogField, $serviceLogWhere, $serviceLogJoin);
+            $evaluate   = model('Evaluate')->getEvaluate();
+            foreach ($serviceLog as $k => $v) {
+                foreach ($evaluate as $va) {
+                    if ($v->evaluate_id === $va->evaluate_id) {
+                        $serviceLog[$k]->evaluate_name = $va->evaluate_name;
+                    }
+                }
+            }
+
+
+            return json(['code' => 200, 'data' => $serviceLog, 'msg' => '成功']);
+        } catch (\Exception $e) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }//end try
+
+    }//end historyList()
+
+
+    /**
+     * 获取会话历史详细
+     *
+     * @access public
+     * @return array JsonString
+     */
+    public function historyInfo()
+    {
+        // 验证token.
+        $tokenStatus = $this->verifyToken();
+        $code        = -2;
+        $msg         = '错误';
+        if ($tokenStatus === false) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }
+
+        try {
+            // 获取用户信息.
+            $getUserToken = input('get.HTTP_userToken');
+            $getUserInfo     = $this->getUserInfo();
+            $serviceLogField = [
+                'user_id',
+                'user_name',
+                'user_avatar',
+                'user_ip',
+                'start_time',
+                'end_time',
+                'name',
+                'website',
+                'system',
+                'browse',
+                'a.status',
+                'evaluate_id',
+            ];
+            // 关联信息.
+            $serviceLogJoin['groups b'] = 'a.group_id = b.id';
+            $serviceLogWhere['kf_id']   = $getUserInfo->id;
+            // 获取用户信息.
+            $serviceLog = model('ServiceLog')->selectServiceLog($serviceLogField, $serviceLogWhere, $serviceLogJoin);
+
+
+            return json(['code' => 200, 'data' => $serviceLog, 'msg' => '成功']);
+        } catch (\Exception $e) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }//end try
+
+    }//end historyList()
+
+
+}

+ 100 - 5
application/service/controller/Index.php

@@ -1,12 +1,102 @@
 <?php
 namespace app\service\controller;
 
-class Index extends Base
+/**
+ * 客服系统首页类
+ */
+class Index extends Common
 {
+
+
+    /**
+     * 获取用户详情
+     *
+     * @access public
+     * @return array JsonString
+     */
+    public function userInfo()
+    {
+        // 验证token.
+        $tokenStatus = $this->verifyToken();
+        $code        = -2;
+        $msg         = '错误';
+        if ($tokenStatus === false) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }
+
+        try {
+            $getUserToken = input('server.HTTP_userToken');
+            $usersField   = [
+                'a.id',
+                'user_name',
+                'user_avatar',
+                'b.name',
+            ];
+            // 关联信息.
+            $join['groups b']    = 'a.group_id = b.id';
+            $usersWhere['token'] = $getUserToken;
+            // 获取用户信息.
+            $usersInfo = model('users')->findInfo($usersField, $usersWhere, $join);
+
+            return json(['code' => 200, 'data' => $usersInfo, 'msg' => '成功']);
+        } catch (\Exception $e) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }//end try
+
+    }//end userInfo()
+
+
+    /**
+     * 获取用户快捷语
+     *
+     * @access public
+     * @return array JsonString
+     */
+    public function userWords()
+    {
+        // 验证token.
+        $tokenStatus = $this->verifyToken();
+        $code        = -2;
+        $msg         = '错误';
+        if ($tokenStatus === false) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }
+
+        try {
+            // 获取用户信息.
+            $getUserInfo = $this->getUserInfo();
+            // 获取快捷语.
+            $wordsField               = [
+                'id',
+                'content',
+            ];
+            $sysWordsWhere['status']  = 1;
+            $sysWordsWhere['user_id'] = 0;
+            // 查询系统快捷语.
+            $sysWords = model('words')->selectWords($wordsField, $sysWordsWhere);
+            // 查询用户私有快捷语条件.
+            $userWordsWhere['user_id'] = $getUserInfo->id;
+            // 查询用户私有快捷语.
+            $userWords = model('words')->selectWords($wordsField, $userWordsWhere);
+            $result    = [
+                'sysWords'  => $sysWords,
+                'userWords' => $userWords,
+            ];
+
+            return json(['code' => 200, 'data' => $result, 'msg' => '成功']);
+        } catch (\Exception $e) {
+            return json(['code' => $code, 'data' => [], 'msg' => $msg]);
+        }//end try
+
+    }//end userWords()
+
+
     public function index()
     {
+        $getUserInfo = $this->getUserInfo();
+
         // 客服信息
-        $userInfo = db('users')->where('id', cookie('l_user_id'))->find();
+        $userInfo = db('users')->where('id', 1)->find();
 
         $this->assign([
             'uinfo' => $userInfo,
@@ -18,6 +108,7 @@ class Index extends Base
         return $this->fetch();
     }
 
+
     // 获取服务用户列表
     // 此方法是为了防止客服工作期间错误的刷新工作台,导致服务人员消失的问题
     public function getUserList()
@@ -25,9 +116,13 @@ class Index extends Base
         if(request()->isAjax()){
 
             // 此处只查询过去 三个小时 内的未服务完的用户
-            $userList = db('service_log')->field('user_id id,user_name name,user_avatar avatar,user_ip ip')
-                ->where('kf_id', cookie('l_user_id'))
-                ->where('start_time', '>', time() - 3600 * 3)->where('end_time', 0)->select();
+            $userList = db('service_log')
+                ->where(function ($query) {
+                    $query = $query->where('status', 1);
+                    $query = $query->whereOr('status', 3);
+                    return $query;
+                })
+                ->select();
 
             return json(['code' => 1, 'data' => $userList, 'msg' => 'ok']);
         }

+ 15 - 7
application/service/controller/Login.php

@@ -30,10 +30,21 @@ class Login extends Controller
                 return json(['code' => -2, 'data' => '', 'msg' => '密码错误']);
             }
 
-            // 设置session标识状态
-            cookie('l_user_name', $user['user_name'], config('save_time'));
-            cookie('l_user_id', $user['id'], config('save_time'));
-            cookie('l_user_avatar', $user['user_avatar'], config('save_time'));
+
+            // 登陆成功 生成token
+            $module = mt_rand(100000,999999);
+            $token = base64_encode($module.'#$@%!^*/'.time().'/'.$user['id']);
+            // 更新管理员状态
+            $param = [
+                'token' => $token,
+                'expire_time' => time()
+            ];
+            db('users')->where('id', $user['id'])->update($param);
+
+            $this->assign([
+                'token' => $token,
+                'user_name' => $userName
+            ]);
 
             return json(['code' => 1, 'data' => url('index/index'), 'msg' => '登录成功']);
         }
@@ -43,9 +54,6 @@ class Login extends Controller
 
     public function loginOut()
     {
-        cookie('l_user_name', null);
-        cookie('l_user_id', null);
-        cookie('l_user_avatar', null);
 
         $this->redirect(url('login/index'));
     }

+ 49 - 0
application/service/controller/Message.php

@@ -0,0 +1,49 @@
+<?php
+namespace app\service\controller;
+
+class Message extends Base
+{
+    public function index()
+    {
+        // 留言信息
+        $message = db('accountsmessage')->join('accounts','accounts.id=ws_accountsmessage.account_id')->where('message_status', 0)->select();
+        //print_r($message);
+        $this->assign([
+            'message' => $message,
+        ]);
+
+        return $this->fetch();
+    }
+
+    // 处理留言
+    public function dealmessage()
+    {
+        if(request()->isPost()){
+
+            //客服id
+            $user_id = 2;
+            //留言id
+            $message_id = 14;
+
+            $user = db('users')->where('id', $user_id)->find();
+            if(empty($user)){
+                return json(['code' => -1, 'data' => '', 'msg' => '客服不存在']);
+            }
+            $message = db('accountsmessage')->where('message_id', $message_id)->find();
+            if(empty($message)){
+                return json(['code' => -1, 'data' => '', 'msg' => '留言不存在']);
+            }
+
+            // 更新留言状态
+            $param = [
+                'user_id' => $user_id,
+                'message_status' => 1,
+                'dealWith_time' => time()
+            ];
+            db('accountsmessage')->where('message_id', $message_id)->update($param);
+
+            return json(['code' => 1, 'data' => url('message/index'), 'msg' => '处理成功']);
+        }
+    }
+
+}

+ 27 - 0
application/service/model/Evaluate.php

@@ -0,0 +1,27 @@
+<?php
+namespace app\service\model;
+
+use think\Model;
+
+/**
+ * 评价模型
+ */
+class Evaluate extends Model
+{
+
+
+    /**
+     * 查询评价
+     *
+     * @access public
+     * @return array 返回类型
+     */
+    public function getEvaluate()
+    {
+        $result = $this->select();
+        return $result;
+
+    }//end getEvaluate()
+
+
+}

+ 42 - 0
application/service/model/ServiceLog.php

@@ -0,0 +1,42 @@
+<?php
+namespace app\service\model;
+
+use think\Model;
+
+/**
+ * 工单模型
+ */
+class ServiceLog extends Model
+{
+
+
+    /**
+     * 数据筛选
+     *
+     * @access public
+     * @param mixed $field 字段
+     * @param mixed $where 条件
+     * @param mixed $join 关联
+     * @return array 返回类型
+     */
+    public function selectServiceLog($field, $where=[], $join=[])
+    {
+        $result = $this->field($field);
+        if (empty($join) === false) {
+            $result = $result->alias('a');
+            foreach ($join as $k => $v) {
+                $result = $result->join($k, $v);
+            }
+        }
+
+        if (empty($where) === false) {
+            $result = $result->where($where);
+        }
+
+        $result = $result->select();
+        return $result;
+
+    }//end selectServiceLog()
+
+
+}

+ 63 - 0
application/service/model/Users.php

@@ -0,0 +1,63 @@
+<?php
+namespace app\service\model;
+
+use think\Model;
+
+/**
+ * 用户模型
+ */
+class Users extends Model
+{
+
+
+    /**
+     * 单个数据筛选
+     *
+     * @access public
+     * @param mixed $field 字段
+     * @param mixed $where 条件
+     * @return array 返回类型
+     */
+    public function findUsers($field, $where=[])
+    {
+        $result = $this->field($field);
+        if (empty($where) === false) {
+            $result = $result->where($where);
+        }
+
+        $result = $result->find();
+        return $result;
+
+    }//end findUsers()
+
+
+    /**
+     * 单个数据筛选
+     *
+     * @access public
+     * @param mixed $field 字段
+     * @param mixed $where 条件
+     * @param mixed $join 关联
+     * @return array 返回类型
+     */
+    public function findInfo($field, $where=[], $join=[])
+    {
+        $result = $this->field($field);
+        if (empty($join) === false) {
+            $result = $result->alias('a');
+            foreach ($join as $k => $v) {
+                $result = $result->join($k, $v);
+            }
+        }
+
+        if (empty($where) === false) {
+            $result = $result->where($where);
+        }
+
+        $result = $result->find();
+        return $result;
+
+    }//end findUsers()
+
+
+}

+ 34 - 0
application/service/model/Words.php

@@ -0,0 +1,34 @@
+<?php
+namespace app\service\model;
+
+use think\Model;
+
+/**
+ * 快捷语模型
+ */
+class Words extends Model
+{
+
+
+    /**
+     * 数据筛选
+     *
+     * @access public
+     * @param mixed $field 字段
+     * @param mixed $where 条件
+     * @return array 返回类型
+     */
+    public function selectWords($field, $where=[])
+    {
+        $result = $this->field($field);
+        if (empty($where) === false) {
+            $result = $result->where($where);
+        }
+
+        $result = $result->select();
+        return $result;
+
+    }//end selectWords()
+
+
+}

+ 4 - 3
public/static/customer/js/whisper-cli.js

@@ -14,7 +14,7 @@ var commChat = 1;
 if(config != undefined && config.socket != undefined){
 
     // 创建一个Socket实例
-    var socket = new WebSocket('ws://' + config.socket+'?apiToken=70b0a7d015ef9a5268b2bc7e3e96af24');
+    var socket = new WebSocket('ws://' + config.socket+'?apiToken=8444fb09eec653b322a4ad74b836aed0');
 
     // 加锁
     lockTextarea();
@@ -25,7 +25,7 @@ if(config != undefined && config.socket != undefined){
     socket.onopen = function(res) {
         console.log('握手成功');
         // 登录
-        var login_data = '{"type":"userInit", "uid": 1, "name" : "' + config.name +
+        var login_data = '{"type":"userInit", "uid": "' + config.uid + '", "name" : "' + config.name +
             '", "avatar" : "' + config.avatar + '", "group" : ' + config.group + '}';
         socket.send(login_data);
 
@@ -219,7 +219,8 @@ function sendMsg(sendMsg){
     // 发送消息
     socket.send(JSON.stringify({
         type: 'chatMessage',
-        data: {to_id: kf_id, content: msg, from_id: config.uid}
+        data: {to_id: kf_id, to_name: kf_name, content: msg, from_name: config.name,
+            from_id: config.uid, from_avatar: config.avatar, conversationId: 1}
     }));
 
     // 储存我发出的信息

+ 5 - 10
public/static/service/js/whisper.js

@@ -6,7 +6,7 @@ var uinfo = {
 };
 
 // 创建一个Socket实例
-var socket = new WebSocket('ws://' + socket_server+'?apiToken=70b0a7d015ef9a5268b2bc7e3e96af24');
+var socket = new WebSocket('ws://' + socket_server+'?apiToken=8444fb09eec653b322a4ad74b836aed0');
 
 // 打开Socket
 socket.onopen = function (res) {
@@ -291,7 +291,7 @@ function sendMessage(sendMsg) {
     socket.send(JSON.stringify({
         type: 'chatMessage',
         data: {to_id: uid, to_name: uname, content: msg, from_name: uinfo.username,
-            from_id: uinfo.id, from_avatar: uinfo.avatar}
+            from_id: uinfo.id, from_avatar: uinfo.avatar, conversationId: 1}
     }));
 
     $("#u-" + uid).append(word);
@@ -300,20 +300,15 @@ function sendMessage(sendMsg) {
     wordBottom();
 }
 
-// 发送消息
+// 关闭工单
 function cc() {
 
     var uid = $("#active-user").attr('data-id');
 
     socket.send(JSON.stringify({
-        type: 'closeUser',
-        data: {to_id: uid, from_name: uinfo.username, from_id: uinfo.id}
+        type: 'kfCloseUser',
+        data: {to_id: uid}
     }));
-
-    $("#u-" + uid).append(word);
-    $(".msg-area").val('');
-    // 滚动条自动定位到最底端
-    wordBottom();
 }
 
 // 展示客服发送来的消息

BIN
public/uploads/20190628/0f24febff80d0fac0975d6bbc15266f6.jpg


BIN
public/uploads/20190628/330a62e9fc212b46ef41e18e4f6b7981.jpg


BIN
public/uploads/20190628/83ce184aa0808cd430cb0be2976b1325.jpg


BIN
public/uploads/20190628/83e4b1e2b23dc4ef9d7d8f2b5bccf5b2.png


BIN
public/uploads/20190628/f2707910919b6e6574aa5bd3f14008f9.png