ソースを参照

'基础设置'

Ethan 6 年 前
コミット
42a47d40b2

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

@@ -7,6 +7,9 @@ class Base extends Controller
 {
     public function _initialize()
     {
+        if (!session('user_id')) {
+            $this->redirect('admin/login/index');
+        }
         $this->assign([
             'version' => config('version'),
             'socket' =>config('socket'),

+ 3 - 3
application/admin/controller/Login.php

@@ -49,8 +49,8 @@ class Login extends Controller
                 return json(['code' => -5, 'data' => '', 'msg' => '您已被禁用']);
             }
 
-            cookie('user_name',$userName);
-            cookie('user_id',$userInfo['id']);
+            session('user_name',$userName);
+            session('user_id',$userInfo['id']);
 
             // 登陆成功 生成token
             $module = mt_rand(100000,999999);
@@ -79,4 +79,4 @@ class Login extends Controller
         $this->redirect(url('login/index'));
     }
 
-}
+}

+ 0 - 89
application/admin/controller/Server.php

@@ -1,89 +0,0 @@
-<?php
-namespace app\admin\controller;
-
-class Server extends Base
-{
-    public function index()
-    {
-        // 客服信息
-        $userInfo = db('users')->where('id', cookie('l_user_id'))->find();
-
-        $this->assign([
-            'uinfo' => $userInfo,
-            'word' => db('words')->select(),
-            'groups' => db('groups')->where('status', 1)->select(),
-            'status' => db('kf_config')->where('id', 1)->find()
-        ]);
-
-        return $this->fetch();
-    }
-
-    // 获取服务用户列表
-    // 此方法是为了防止客服工作期间错误的刷新工作台,导致服务人员消失的问题
-    public function getUserList()
-    {
-        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();
-
-            return json(['code' => 1, 'data' => $userList, 'msg' => 'ok']);
-        }
-    }
-
-    // 获取聊天记录
-    public function getChatLog()
-    {
-        if(request()->isAjax()){
-
-            $param = input('param.');
-
-            $limit = 10; // 一次显示10 条聊天记录
-            $offset = ($param['page'] - 1) * $limit;
-
-            $logs = db('chat_log')->where(function($query) use($param){
-                    $query->where('from_id', $param['uid'])->where('to_id', 'KF' . cookie('l_user_id'));
-            })->whereOr(function($query) use($param){
-                $query->where('from_id', 'KF' . cookie('l_user_id'))->where('to_id', $param['uid']);
-            })->limit($offset, $limit)->order('id', 'desc')->select();
-
-            $total =  db('chat_log')->where(function($query) use($param){
-                $query->where('from_id', $param['uid'])->where('to_id', 'KF' . cookie('l_user_id'));
-            })->whereOr(function($query) use($param){
-                $query->where('from_id', 'KF' . cookie('l_user_id'))->where('to_id', $param['uid']);
-            })->count();
-
-            foreach($logs as $key=>$vo){
-
-                $logs[$key]['type'] = 'user';
-                $logs[$key]['time_line'] = date('Y-m-d H:i:s', $vo['time_line']);
-
-                if($vo['from_id'] == 'KF' . cookie('l_user_id')){
-                    $logs[$key]['type'] = 'mine';
-                }
-            }
-
-            return json(['code' => 1, 'data' => $logs, 'msg' => intval($param['page']), 'total' => ceil($total / $limit)]);
-        }
-    }
-
-    // ip 定位
-    public function getCity()
-    {
-        $ip = input('param.ip');
-
-        $ip2region = new \Ip2Region();
-        $info = $ip2region->btreeSearch($ip);
-
-        $city = explode('|', $info['region']);
-
-        if(0 != $info['city_id']){
-            return json(['code' => 1, 'data' => $city['2'] . $city['3'] . $city['4'], 'msg' => 'ok']);
-        }else{
-
-            return json(['code' => 1, 'data' => $city['0'], 'msg' => 'ok']);
-        }
-    }
-}

+ 63 - 6
application/admin/controller/System.php

@@ -1,13 +1,69 @@
 <?php
-/**
- * User: nickbai
- * Date: 2017/10/31 12:47
- * Email: 1902822973@qq.com
- */
 namespace app\admin\controller;
 
+/**
+ * 管理系统系统设置类
+ */
 class System extends Base
 {
+
+
+    /**
+     * 基础设置
+     *
+     * @access public
+     */
+    public function basics()
+    {
+        // 表单提交.
+        if (request()->isPost()) {
+            $param = input('post.');
+
+            try {
+                // 修改系统欢迎语.
+                if (empty($param['advertisement_img']) === false) {
+                    $updateAstData['advertisement_img'] = $param['advertisement_img'];
+                }
+
+                $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);
+                // 修改客服欢迎语.
+                $updateSevData['word'] = $param['serverWord'];
+                $updateSevWhere['id']  = 2;
+                model('Reply')->updateReply($updateSevWhere, $updateSevData);
+                return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
+            } catch (\Exception $e) {
+                return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
+            }//end try
+        }//end if
+
+        // 获取广告.
+        $advertisement = model('Advertisement')->findAst();
+        // 获取系统欢迎语.
+        $replySystemWhere['id'] = 1;
+        $replySystem            = model('Reply')->findReply($replySystemWhere);
+        // 获取客服欢迎语.
+        $replyServerWhere['id'] = 2;
+        $replyServer            = model('Reply')->findReply($replyServerWhere);
+        $this->assign(
+            [
+                'advertisement' => $advertisement,
+                'replySystem'   => $replySystem,
+                'replyServer'   => $replyServer,
+                'status'        => config('kf_status'),
+            ]
+        );
+
+        return $this->fetch();
+
+    }//end basics()
+
+
     // 自动回复设置
     public function reply()
     {
@@ -188,6 +244,7 @@ class System extends Base
         return $this->fetch();
     }
 
+
     // 历史会话记录详情
     public function detail($id)
     {
@@ -222,4 +279,4 @@ class System extends Base
 
         return $operate;
     }
-}
+}

+ 42 - 0
application/admin/model/Advertisement.php

@@ -0,0 +1,42 @@
+<?php
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * 广告模型
+ */
+class Advertisement extends Model
+{
+
+
+    /**
+     * find数据筛选
+     *
+     * @access public
+     * @return array 返回类型
+     */
+    public function findAst()
+    {
+        $result = $this->find();
+        return $result;
+
+    }//end findAst()
+
+
+    /**
+     * 数据修改
+     *
+     * @access public
+     * @param mixed $data 数据
+     * @return array 返回类型
+     */
+    public function updateAst($data)
+    {
+        $result = $this->where(['advertisement_id' => 1])->update($data);
+        return $result;
+
+    }//end updateAst()
+
+
+}

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

@@ -0,0 +1,44 @@
+<?php
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * 欢迎语模型
+ */
+class Reply extends Model
+{
+
+
+    /**
+     * find数据筛选
+     *
+     * @access public
+     * @param mixed $where 数据
+     * @return array 返回类型
+     */
+    public function findReply($where)
+    {
+        $result = $this->where($where)->find();
+        return $result;
+
+    }//end findReply()
+
+
+    /**
+     * 数据修改
+     *
+     * @access public
+     * @param mixed $data 数据
+     * @param mixed $where 条件
+     * @return array 返回类型
+     */
+    public function updateReply($where, $data)
+    {
+        $result = $this->where($where)->update($data);
+        return $result;
+
+    }//end updateReply()
+
+
+}

+ 3 - 12
application/admin/view/menu.html

@@ -1,15 +1,3 @@
-<li class="menu">
-    <a href="#">
-        <i class="fa fa-server"></i>
-        <span class="nav-label">工作台</span>
-        <span class="fa arrow"></span>
-    </a>
-    <ul class="nav nav-second-level">
-        <li>
-            <a class="J_menuItem" href="{:url('server/index')}">我的工作台</a>
-        </li>
-    </ul>
-</li>
 <li class="menu">
     <a href="#">
         <i class="fa fa-qq"></i>
@@ -92,6 +80,9 @@
         <span class="fa arrow"></span>
     </a>
     <ul class="nav nav-second-level">
+        <li>
+            <a class="J_menuItem" href="{:url('system/basics')}">基础设置</a>
+        </li>
         <li>
             <a class="J_menuItem" href="{:url('system/reply')}">自动回复设置</a>
         </li>

+ 172 - 0
application/admin/view/system/basics.html

@@ -0,0 +1,172 @@
+<!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/basics')}">
+                        <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">
+                                <input type="text" class="form-control" name="serverWord" required="" aria-required="true" value="{$replyServer['word']}">
+                            </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">
+                                <input type="text" class="form-control" name="advertisementUrl" required="" aria-required="true" value="{$advertisement['advertisement_url']}">
+                            </div>
+                        </div>
+                        <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">
+                                <button type="button" class="layui-btn layui-btn-small" id="up-avatar">
+                                    <i class="layui-icon"></i>上传图片</button>
+                            </div>
+                            <div class="input-group col-sm-3" id="avatar">
+                                <img src="{$advertisement['advertisement_img']}" width="40px" height="40px"/>
+                            </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="status" value="{$key}" title="{$vo}" {if $key eq $advertisement['advertisement_status']}checked{/if}>
+                                {/foreach}
+                                {/if}
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <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>
+                </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-avatar' //绑定元素
+            ,url: "{:url('users/upAvatar')}" //上传接口
+            ,exts: 'png|jpg|jpeg|gif'
+            ,done: function(res){
+                //上传完毕回调
+                if(0 == res.code){
+                    $("#avatar").html('<img src="' + res.data.src + '" width="50px" height="50px">');
+                    $("#advertisement_img").val(res.data.src);
+                }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 = 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>

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

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

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

@@ -52,7 +52,7 @@ class Index extends Controller
 
     public function systime()
     {
-        $time = time();
+        $time = strtotime(date('Y-m-d'));
         return json(['code' => 1, 'data' => ['time' => $time], 'msg' => '成功']);
     }
 

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

@@ -22,14 +22,21 @@ class Common extends Base
         $action       = $request->action();
         $controller   = $request->controller();
         $module       = $request->module();
-        $apiToken     = md5(strtoupper($action.'Customer-Service'.$controller.strtotime(date('Y-m-d')).$module));
+        $apiToken     = md5(strtolower($action.'Customer-Service'.$controller.strtotime(date('Y-m-d')).$module));
         // 验证服务器token.
         if ($getApiToken === $apiToken && empty($getUserToken) === false) {
-            $usersField          = ['id'];
+            $usersField          = [
+                'id',
+                'expire_time',
+            ];
             $usersWhere['token'] = $getUserToken;
             // 验证用户token.
-            $users = model('users')->findUsers($usersField, $usersWhere);
-            if (empty($users) === false) {
+            $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']) {
+                $updateWhere['id']         = $users['id'];
+                $updateData['expire_time'] = strtotime(date('Y-m-d H:i:s'));
+                model('users')->updateUsers($updateWhere, $updateData);
                 return true;
             } else {
                 return false;

+ 24 - 3
application/service/controller/History.php

@@ -46,9 +46,30 @@ class History extends Common
             $serviceLogJoin['groups b'] = 'a.group_id = b.id';
             $serviceLogWhere['kf_id']   = $getUserInfo->id;
             // 分页.
-            $currentPage = input('get.currentPage', '1');
-            $pageSize    = input('get.pageSize', '10');
-            $offset      = (($currentPage - 1) * $pageSize);
+            $currentPage = input('post.currentPage', '1');
+            $pageSize    = input('post.pageSize', '10');
+            $start       = input('post.start');
+            $end         = input('post.end');
+            $userName    = input('post.user_name');
+            $startTime   = strtotime(date('Y-m-d').'-6 day');
+            $endTime     = strtotime(date('Y-m-d').'+1 day');
+            if (empty($start) === false && empty($end) === false) {
+                $startTime = strtotime($start);
+                $endTime   = strtotime($end);
+            }
+
+            if (empty($userName) === false) {
+                $serviceLogWhere['user_name'] = $userName;
+            }
+
+            $serviceLogWhere['start_time'] = [
+                'between',
+                [
+                    $startTime,
+                    $endTime,
+                ],
+            ];
+            $offset = (($currentPage - 1) * $pageSize);
             // 获取用户信息.
             $serviceLog      = model('ServiceLog')->selectServiceLog(
                 $serviceLogField,

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

@@ -112,15 +112,26 @@ class Index extends Common
             // 获取快捷语.
             $wordsField = ['*'];
             $sysWordsWhere['sensitivewords_status'] = 1;
+            $sysWordsWhere['sensitivewords_for']    = 1;
             // 查询系统快捷语.
-            $sensitiveWords = model('sensitivewords')->selectWords($wordsField, $sysWordsWhere);
+            $userSensitive = model('sensitivewords')->selectWords($wordsField, $sysWordsWhere);
+            // 获取快捷语.
+            $wordsField = ['*'];
+            $sysWordsWhere['sensitivewords_status'] = 1;
+            $sysWordsWhere['sensitivewords_for']    = 2;
+            // 查询系统快捷语.
+            $serverSensitive = model('sensitivewords')->selectWords($wordsField, $sysWordsWhere);
+            $data            = [
+                'userSensitive'   => $userSensitive,
+                'serverSensitive' => $serverSensitive,
+            ];
 
-            return json(['code' => 200, 'data' => $sensitiveWords, 'msg' => '成功']);
+            return json(['code' => 200, 'data' => $data, 'msg' => '成功']);
         } catch (\Exception $e) {
             return json(['code' => $code, 'data' => [], 'msg' => $msg]);
         }//end try
 
-    }//end userWords()
+    }//end sensitiveWords()
 
 
     public function index()

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

@@ -31,6 +31,22 @@ class Users extends Model
     }//end findUsers()
 
 
+    /**
+     * 数据修改
+     *
+     * @access public
+     * @param mixed $data 数据
+     * @param mixed $where 条件
+     * @return array 返回类型
+     */
+    public function updateUsers($where, $data)
+    {
+        $result = $this->where($where)->update($data);
+        return $result;
+
+    }//end updateUsers()
+
+
     /**
      * 单个数据筛选
      *

+ 30 - 0
vendor/GatewayWorker_windows/Applications/whisper/Events.php

@@ -232,6 +232,17 @@ class Events
             unset($hello);
         }
         unset($sayHello);
+        // 检测是否开启广告
+        $advertisement = self::$db->query('select `*` from `ws_advertisement` where `advertisement_status` = 1');
+        if (!empty($advertisement)) {
+            $chat_message = [
+                'message_type' => 'advertisement',
+                'data' => $advertisement
+            ];
+            Gateway::sendToClient($client_id, json_encode($chat_message, 256));
+            unset($chat_message);
+        }
+        unset($advertisement);
     }
 
     /**
@@ -1113,6 +1124,25 @@ class Events
             Gateway::sendToClient($client_id, json_encode($noticeUser, 256));
             unset($noticeUser);
 
+
+            // 发送客服欢迎语
+            $sayHello = self::$db->query('select `word`,`status` from `ws_reply` where `id` = 2');
+            if (!empty($sayHello) && 1 == $sayHello['0']['status']) {
+                $chat_message = [
+                    'message_type' => 'chatMessage',
+                    'data' => [
+                        'name' => $res['data']['1'],
+                        'avatar' => self::$global->kfList[$group][$res['data']['0']],
+                        'id' => $res['data']['0'],
+                        'time' => date('H:i'),
+                        'content' => htmlspecialchars($sayHello['0']['word'])
+                    ]
+                ];
+                Gateway::sendToClient($client_id, json_encode($chat_message, 256));
+                unset($chat_message);
+            }
+            unset($sayHello);
+
             // 通知客服端绑定会员的信息
             $noticeKf = [
                 'message_type' => 'connect',