This commit is contained in:
leo 2021-03-03 13:45:14 +08:00
commit 334733f932
2276 changed files with 324735 additions and 0 deletions

1
.htaccess Normal file
View File

@ -0,0 +1 @@

26
404.html Normal file
View File

@ -0,0 +1,26 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>404</title>
<style>
body{
background-color:#444;
font-size:14px;
}
h3{
font-size:60px;
color:#eee;
text-align:center;
padding-top:30px;
font-weight:normal;
}
</style>
</head>
<body>
<h3>404您请求的文件不存在!</h3>
</body>
</html>

1
application/.htaccess Normal file
View File

@ -0,0 +1 @@
deny from all

18
application/404.html Normal file
View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="keywords" content="404错误代码" />
<meta name="description" content="404错误代码" />
<title>404</title>
<link href="/static/common/404/error.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="container"><img class="png" src="/static/common/404/404.png" /> <img class="png msg" src="/static/common/404/404_msg.png" />
<p><a href="#" target="_blank"><img class="png" src="/static/common/404/404_to_index.png" /></a> </p>
</div>
<div id="cloud" class="png"></div>
</body>
</html>

View File

@ -0,0 +1,5 @@
<?php
/**
* 后台函数库
*/

View File

@ -0,0 +1,50 @@
<?php
/**
* 后台配置文件
*/
//配置文件
return [
// 模板参数替换
'view_replace_str' => [
'__CSS__' => '/static/admin/css',
'__JS__' => '/static/admin/js',
'__IMG__' => '/static/admin/images',
// '__CSS__' => __CDN__.'/static/admin/css',
'__FONT__' => '/static/admin/css',
// '__JS__' => __CDN__.'/static/admin/js',
'__NOCDN_JS__' => '/static/admin/js',
// '__IMG__' => __CDN__.'/static/admin/images',
],
// session 配置(依据模块区分)
'session' => [
'prefix' => 'admin',
'type' => '',
'auto_start' => true,
],
// session有效时长 30天
'session_save_time' => 15 * 86400,
// 客服状态
'kf_status' => [
1 => '启用',
2 => '禁用'
],
// 充值赠送类型
'recharge_gift_type' => [
0 => '不赠送',
1 => '百分比(%)',
2 => '金额(分)'
],
// 是否在线
'online' => [
1 => '在线',
2 => '离线'
]
];

View File

@ -0,0 +1,210 @@
<?php
/**
* 管理员控制器
*/
namespace app\admin\controller;
use Repository\LogRepository;
class Admins extends Base
{
// 管理员列表
public function index()
{
if(request()->isAjax()){
$param = input('param.');
// $limit = $param['pageSize'];
// $offset = ($param['pageNumber'] - 1) * $limit;
$where = [];
if (!empty($param['searchText'])) {
$where['user_name'] = ['like', '%' . $param['searchText'] . '%'];
}
$result = db('admins')
->where($where)
// ->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>';
}
// 获取权限名称
$role = db('admin_role')
->alias('a')
->where('admin_id', $vo['id'])
->join('role r',"r.id=a.role_id")
->field('name')
->find();
$result[$key]['role_name'] = $role ? $role['name'] : '暂无角色';
// 查找平台
$platform = db('groups')->where('admin_id', $vo['id'])->find();
$result[$key]['platform_name'] = $platform ? $platform['name'] : '暂无';
if ($role['name'] == '组长') {
unset($result[$key]);continue;
$platform = db('organize')->where('admin_id', $vo['id'])->find();
if ($platform) {
$platform = db('groups')->where('id', $platform['group_id'])->find();
}
$result[$key]['platform_name'] = $platform ? $platform['name'] : '暂无';
}
// 上次登录时间
$result[$key]['last_login_time'] = empty($vo['last_login_time']) ? '' : date('Y-m-d H:i:s', $vo['last_login_time']);
// 生成操作按钮
if(1 != $vo['id']){
$result[$key]['operate'] = $this->makeBtn($vo['id']);
}
}
$return['total'] = db('admins')->where($where)->count(); //总数据
$return['rows'] = array_values($result);
return json($return);
}
return $this->fetch();
}
// // 添加管理员
// public function addAdmin()
// {
// if(request()->isPost()){
// $param = input('post.');
// $rule = "/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/";
// if (!preg_match($rule, $param['password'])) {
// return json(['code' => -2, 'data' => '', 'msg' => '密码必须是8-16位的字母和数字组成!']);
// };
// $has = db('admins')->field('id')->where('user_name', $param['user_name'])->find();
// if(!empty($has)){
// return json(['code' => -1, 'data' => '', 'msg' => '该管理员已经存在']);
// }
// $param['password'] = password_hash($param['password'], PASSWORD_DEFAULT);
// if (!$param['role']) return json(['code' => -3, 'data' => '', 'msg' => '角色不能为空']);
// try{
// $role_id = $param['role'];
// unset($param['role']);
// $admin_id = db('admins')->insertGetId($param);
// db('admin_role')->insertGetId(['role_id' => $role_id, 'admin_id' => $admin_id]);
// }catch(\Exception $e){
// return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
// }
// LogRepository::write('系统管理', '添加管理员成功');
// return json(['code' => 1, 'data' => '', 'msg' => '添加管理员成功']);
// }
// // 角色
// $role = db('role')->where('status', 1)->select();
// $this->assign([
// 'status' => config('kf_status'),
// 'role' => $role,
// ]);
// return $this->fetch('addadmin');
// }
// 编辑管理员
public function editAdmin()
{
if(request()->isAjax()){
$param = input('post.');
$param['user_name'] = htmlentities($param['user_name']);
// 检测用户修改的管理员是否重复
$has = db('admins')->where('user_name', $param['user_name'])->where('id', '<>', $param['id'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该管理员已经存在']);
}
// 修改用户密码
if(empty($param['password'])){
unset($param['password']);
}else{
$rule = "/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/";
if (!preg_match($rule, $param['password'])) {
return json(['code' => -2, 'data' => '', 'msg' => '密码必须是8-16位的字母和数字组成!']);
}
$param['password'] = password_hash($param['password'], PASSWORD_DEFAULT);
}
// $param['password'] = password_hash($param['password'], PASSWORD_DEFAULT);
// if (!$param['role']) return json(['code' => -3, 'data' => '', 'msg' => '角色不能为空']);
try{
// $role_id = $param['role'];
// unset($param['role']);
db('admins')->where('id', $param['id'])->update($param);
// // 角色
// $role_info = db('admin_role')->where('admin_id', $param['id'])->find();
// if ($role_info) {
// db('admin_role')->where('admin_id', $param['id'])->update(['role_id' => $role_id]);
// } else {
// db('admin_role')->insertGetId(['role_id' => $role_id, 'admin_id' => $param['id']]);
// }
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('系统管理', '编辑管理员成功');
return json(['code' => 1, 'data' => '', 'msg' => '编辑管理员成功']);
}
$id = input('param.id/d');
$info = db('admins')->where('id', $id)->find();
// 角色
$role_info = db('admin_role')->where('admin_id', $id)->find();
$role = db('role')->where('status', 1)->select();
$this->assign([
'info' => $info,
'status' => config('kf_status'),
'role' => $role,
'role_info' => $role_info,
]);
return $this->fetch('editadmin');
}
// // 删除管理员
// public function delAdmin()
// {
// if(request()->isAjax()){
// $id = input('param.id/d');
// try{
// db('admins')->where('id', $id)->delete();
// }catch(\Exception $e){
// return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
// }
// LogRepository::write('系统管理', '删除成功');
// return json(['code' => 1, 'data' => '', 'msg' => '删除成功']);
// }
// }
// 生成按钮
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> ';
return $operate;
}
}

View File

@ -0,0 +1,219 @@
<?php
/**
* 基类控制器
*/
namespace app\admin\controller;
use think\Controller;
use Repository\IpRepository;
class Base extends Controller
{
// 管理员查询条件
public $where = [];
// 是否是超级管理员
public $is_root = true;
public $role_name = '';
public $admin_id = '';
public $group_name = '';
public function _initialize()
{
// $ipAccess = (new IpRepository)->ipAccess();
// if(!$ipAccess){
// throw new \think\exception\HttpException(404, '非法请求!');
// }
// 如果超过登录有效期清除相关session
if (time() > ((int)session('user_last_login') + (int)config('session_save_time'))) {
$this->nullSession();
}
$user_name = session('user_name');
if(empty($user_name)){
$this->redirect(url('login/index'));
}
$gdb = db('groups');
$odb = db('organize');
$uid = session('user_id');
$this->admin_id = $uid;
// 根据登录用户进行查找条件
$this->role_name = session('role_name');
if ($this->role_name == '平台管理员' && !$this->where) {
$group = $gdb->where('admin_id', $uid)->find();
if (!$group) {
$this->nullSession();
echo "<script>alert('当前平台管理员没有分配平台');window.location='/admin/login/loginOut';</script>";
return;
}
$this->where = ['group_id' => $group['id']];
$this->is_root = false;
}
if ($this->role_name == '平台管理员') {
$this->group_name = $group['name'];
}
if ($this->role_name == '组长' && !$this->where) {
$uid = session('user_id');
$organize = $odb->where('admin_id', $uid)->find();
if (!$organize) {
$this->nullSession();
echo "<script>alert('当前组长没有分配平台小组');window.location='/admin/login/loginOut';</script>";
return;
}
$this->where = ['organize_id' => $organize['id']];
$this->is_root = false;
}
// 检查 白名单
$check_ip = $this->checkIp();
if (!$check_ip) {
// $this->redirect(APP_PATH . '404.html');
$this->nullSession();
echo "<script>alert('非法ip');window.parent.location='/admin/login/index';</script>";
return;
}
$this->assign([
'version' => config('version'),
'is_root' => $this->is_root,
'role_name' => session('role_name'),
'group_name' => $this->group_name,
]);
}
// 清空session
public function nullSession()
{
session('user_name', null);
session('user_id', null);
session('user_last_login', null);
session('role_name', null);
}
/**
* 获取管理员的菜单列表
*/
public function getAdminMeunList()
{
$adb = db('admin_role');
$rdb = db('role');
$amdb = db('admin_menus');
$this->role_name = session('role_name');
$uid = session('user_id');
$result = [
'menu_one' => [],
'menu_two' => [],
];
// 角色记录
$role_log = $adb->where('admin_id', $uid)->find();
if (!$role_log) return $result;
// 角色详情
$role = $rdb->where('id', $role_log['role_id'])->find();
if (!$role) return $result;
// 获取列表
$menu_one = $amdb->whereIn('id', $role['menu_id_one'])->order('sort asc')->select();
$menu_two = $amdb->whereIn('id', $role['menu_id_two'])->order('sort asc')->select();
$result['menu_one'] = $menu_one ? $menu_one : [];
$result['menu_two'] = $menu_two ? $menu_two : [];
return $result;
}
// 检查 白名单
public function checkIp ()
{
$ip = $this->request->ip();
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false){
//内网的地址,不做限制
return true;
}
$group_id = null;
if ($this->is_root) {
$group_id = 0;
} else {
if ($this->role_name == '平台管理员') {
$group_id = db('groups')->where('admin_id', $this->admin_id)->value('id');
}
else if ($this->role_name == '组长') {
$group_id = db('organize')->where('admin_id', $this->admin_id)->value('group_id');
}
}
if ($group_id === null) {
return false;
}
$db = db('white_ip');
if ($db->where('group_id', $group_id)->value('id')) {
$where = [
'group_id' => $group_id,
'ip' => $this->request->ip(),
];
if (!$db->where($where)->value('id')) {
return false;
}
}
return true;
}
/**
* 获取平台管理员列表
*/
public function getPlatformList()
{
$adb = db('admins');
$rdb = db('role');
$ardb = db('admin_role');
// 管理员
$role = $rdb->where(['name' => '平台管理员', 'status' => 1])->find();
if (!$role) return [];
// 管理员角色记录
$role_list = $ardb->where('role_id', $role['id'])->select();
$admin_ids = [];
foreach($role_list as $vo) {
$admin_ids[] = $vo['admin_id'];
}
$admin_ids = implode(',', $admin_ids);
$admin = $adb->whereIn('id', $admin_ids)->select();
return $admin;
}
/**
* 保存金额流动记录
* @parm $initiative 主动方
* @parm $passivity 被动方
* @parm $money 金额
* @parm $type 类型1: 增加, 2: 收入
* @parm $msg 提示信息
*/
public function saveMoneyFlowLog($initiative, $passivity, $money, $msg = '')
{
if (!$initiative || !$passivity || empty($money)) return false;
$amldb = db('money_log');
$data = [
'initiative' => $initiative,
'passivity' => $passivity,
'money' => $money,
'type' => 1,
'msg' => $msg,
'date' => date('Y-m-d h:i:s'),
];
$save = $amldb->insertGetId($data);
$data['type'] = 2;
$save1 = $amldb->insertGetId($data);
if (!$save) return false;
return $save;
}
/**
* 获取表名
*/
public function getTableName($table, $uid)
{
return $table.'_'.($uid % config('chat_table_num'));
}
}

View File

@ -0,0 +1,221 @@
<?php
/**
* 历史会话记录
* Date 2019.07.03
* @author chf
*/
namespace app\admin\controller;
class Dialoguelog extends Base
{
/**
* 客服列表
*/
public function index()
{
$udb = db('users');
// 返回视图
if(!request()->isAjax()) return $this->fetch('dialogue_log/index');
// 分页请求
$param = input('get.');
$where = $this->where;
$keyword = input('search_input');
if (!empty($keyword)) {
$where['user_name|id'] = $keyword;
}
//获取总条数
$count = $udb->where($where)->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$user_list = $udb
->where($where)
->limit($start, $limit)
->order('id desc')
->select();
$result = resultJson(0, '获取成功', $user_list);
$result['count'] = $count;
return $result;
}
/**
* 会话记录(结合layer的table插件)
* @return [type] [description]
*/
public function dialogueList()
{
$slog = db('service_log');
$kf_id = input('id');
// 返回视图
if(!request()->isAjax()) return $this->fetch('dialogue_log/dialogueList', ['id' => $kf_id]);
// 分页请求
$param = input('get.');
$kf_id = $param['id'];
if (!$kf_id) return resultJson(0, '参数错误');
$where['kf_id'] = $kf_id;
// 查询条件
$keyword = input('search_input');
if (!empty($keyword)) {
$where['user_name|user_id'] = $keyword;
}
//获取总条数
$count = $slog->where($where)->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$user_list = $slog
->where($where)
->limit($start, $limit)
->order('id desc')
->select();
// 对列表进行处理
$result = resultJson(0, '获取成功', $user_list);
$result['count'] = $count;
return $result;
}
/**
* 删除会话记录
* @return [type] [description]
*/
public function delDialogue()
{
if (!request()->isAjax()) return false;
$slog = db('service_log');
$kf_id = session('l_user_id');
$id = input('post.id');
if (!$id) return resultJson(0, '参数错误');
// 数据出库
$del = $slog->where(['kf_id' => $kf_id, 'id' => $id])->delete();
if (!$del) return resultJson(0, '删除失败');
return resultJson(1, '删除成功');
}
/**
* 对话室(离线)
* @return [type] [description]
*/
public function offLineDialogueRoom()
{
$pay_db = db('payment');
$slog_db = db('service_log');
$cl_db = db('chat_log');
$kf_id = input('kf_id');
$id = input('get.id');
if (!$id || !$kf_id) {
echo "<script>alert('参数错误'); window.history.go(-1);</script>";
return;
}
// 客服信息
$userInfo = db('users')
->alias('a')
->field('a.*,b.name')
->join('ws_groups b','b.id = a.group_id')
->where('a.id', $kf_id)
->find();
//获取该客服拥有的支付方式
$type = db('payment_type')->where('status',1)->select();
$payment_information = $pay_db
->alias('a')
->join('payment_type w','a.payment_type = w.id')
->where(['is_use'=>1,'a.status'=>1,'kf_id'=>$kf_id])
->select();
$payment_img = $pay_db
->alias('a')
->join('payment_type w','a.payment_type = w.id')
->where(['is_use'=>1,'a.status'=>1,'kf_id'=>$kf_id])
->find();
// 用户信息
$user = $slog_db->where(['id' => $id, 'kf_id' => $kf_id])->find();
// 获取 客服有效充值方式
$pay_arr = $pay_db->alias('p')
->join('payment_type pt', 'p.payment_type = pt.id')
->where(['p.kf_id' => $kf_id, 'p.status' => 1, 'p.is_use' => 1])
->column('pt.type_name', 'pt.id');
// 获取对话数据
$chat_log = $cl_db
->where("from_id = 'KF{$kf_id}' and to_id = {$user['user_id']} or from_id = {$user['user_id']} and to_id = 'KF{$kf_id}'")
->order('time_line asc')
->limit(15)
->select();
// dump($chat_log);
$now_time = strtotime(date('Y-m-d', strtotime('-3 day')));
$user_status = $user['start_time'] < $now_time ? false : true;
$this->assign([
'word' => db('words')->where('kf_id', $kf_id)->select(),
'uinfo'=> $userInfo,
'groups' => db('groups')->where('status', 1)->select(),
'status' => db('kf_config')->where('id', 1)->find(),
'token' => session('kf_token'),
'type' => $type,
'payment_information' => $payment_information,
'payment_img' => $payment_img,
'pay_types' => $pay_arr,
'user' => $user,
'amount' => $userInfo['remaining_amount'],
'chat_log' => $chat_log,
'user_status' => $user_status,
'kf_id' => $kf_id,
]);
return $this->fetch('dialogue_log/offLineDialogueRoom');
}
/**
* 获取离线消息记录
* @return [type] [description]
*/
public function getOutLineMsgLog()
{
if(request()->isAjax()){
$cl_db = db('chat_log');
$param = input('param.');
$limit = 15; // 一次显示15 条聊天记录
$offset = ($param['page'] - 1) * $limit;
$logs = $cl_db
->where(function($query) use($param){
$query->where('from_id', $param['uid'])->where('to_id', 'KF' . $param['kf_id']);
})->whereOr(function($query) use($param){
$query->where('from_id', 'KF' . $param['kf_id'])->where('to_id', $param['uid']);
})->limit($offset, $limit)->order('id', 'desc')->select();
$total = $cl_db
->where(function($query) use($param){
$query->where('from_id', $param['uid'])->where('to_id', 'KF' . $param['kf_id']);
})->whereOr(function($query) use($param){
$query->where('from_id', 'KF' . $param['kf_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' . $param['kf_id']){
$logs[$key]['type'] = 'mine';
}
}
return json(['code' => 1, 'data' => $logs, 'msg' => intval($param['page']), 'total' => ceil($total / $limit)]);
}
}
}

View File

@ -0,0 +1,379 @@
<?php
/**
* 历史会话记录
* Date 2019.07.03
* @author chf
*/
namespace app\admin\controller;
use Repository\ExcelRepository;
use Repository\ZipRepository;
class Dialoguelogs extends Base
{
/**
* 客服列表
*/
public function index()
{
$udb = db('users');
// 返回视图
if(!request()->isAjax()) return $this->fetch('dialogue_log/index');
// 分页请求
$param = input('get.');
$where = $this->where;
$keyword = input('search_input');
if (!empty($keyword)) {
$where['user_name|id'] = $keyword;
}
//获取总条数
$count = $udb->where($where)->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$user_list = $udb
->where($where)
->limit($start, $limit)
->order('id desc')
->select();
$result = resultJson(0, '获取成功', $user_list);
$result['count'] = $count;
return $result;
}
/**
* 会话记录(结合layer的table插件)
* @return [type] [description]
*/
public function dialogueList()
{
$slog = db('service_log');
$kf_id = input('id');
// 返回视图
if(!request()->isAjax()) return $this->fetch('dialogue_log/dialogueList', ['id' => $kf_id]);
// 分页请求
$param = input('get.');
$kf_id = $param['id'];
if (!$kf_id) return resultJson(0, '参数错误');
$where['kf_id'] = $kf_id;
// 查询条件
$keyword = input('search_input');
$start_time = input('start_time');
$end_time = input('end_time');
if (!empty($keyword)) {
$where['user_name|user_id'] = $keyword;
}
if (!empty($start_time)) {
$where['start_time'] = ['egt', strtotime($start_time)];
}
if (!empty($end_time)) {
$where['end_time'] = ['elt', strtotime($end_time)+86400];
}
// var_dump($where);
//获取总条数
$count = $slog->where($where)->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$user_list = $slog
->where($where)
->limit($start, $limit)
->order('start_time desc')
->select();
// 对列表进行处理
$result = resultJson(0, '获取成功', $user_list);
$result['count'] = $count;
return $result;
}
/**
* 删除会话记录
* @return [type] [description]
*/
public function delDialogue()
{
if (!request()->isAjax()) return false;
$slog = db('service_log');
$kf_id = session('l_user_id');
$id = input('post.id');
if (!$id) return resultJson(0, '参数错误');
// 数据出库
$del = $slog->where(['kf_id' => $kf_id, 'id' => $id])->delete();
if (!$del) return resultJson(0, '删除失败');
return resultJson(1, '删除成功');
}
/**
* 对话室(离线)
* @return [type] [description]
*/
public function offLineDialogueRoom()
{
$pay_db = db('payment');
$slog_db = db('service_log');
$cl_db = db('chat_log');
$kf_id = input('kf_id');
$id = input('get.id');
if (!$id || !$kf_id) {
echo "<script>alert('参数错误'); window.history.go(-1);</script>";
return;
}
// 客服信息
$userInfo = db('users')
->alias('a')
->field('a.*,b.name')
->join('ws_groups b','b.id = a.group_id')
->where('a.id', $kf_id)
->find();
//获取该客服拥有的支付方式
$type = db('payment_type')->where('status',1)->select();
$payment_information = $pay_db
->alias('a')
->join('payment_type w','a.payment_type = w.id')
->where(['is_use'=>1,'a.status'=>1,'kf_id'=>$kf_id])
->select();
$payment_img = $pay_db
->alias('a')
->join('payment_type w','a.payment_type = w.id')
->where(['is_use'=>1,'a.status'=>1,'kf_id'=>$kf_id])
->find();
// 用户信息
$user = $slog_db->where(['id' => $id, 'kf_id' => $kf_id])->find();
// 获取 客服有效充值方式
$pay_arr = $pay_db->alias('p')
->join('payment_type pt', 'p.payment_type = pt.id')
->where(['p.kf_id' => $kf_id, 'p.status' => 1, 'p.is_use' => 1])
->column('pt.type_name', 'pt.id');
// 获取对话数据
$chat_log = $cl_db
->where("from_id = 'KF{$kf_id}' and to_id = {$user['user_id']} or from_id = {$user['user_id']} and to_id = 'KF{$kf_id}'")
->order('time_line asc')
->limit(15)
->select();
// dump($chat_log);
$now_time = strtotime(date('Y-m-d', strtotime('-3 day')));
$user_status = $user['start_time'] < $now_time ? false : true;
$this->assign([
'word' => db('words')->where('kf_id', $kf_id)->select(),
'uinfo'=> $userInfo,
'groups' => db('groups')->where('status', 1)->select(),
'status' => db('kf_config')->where('id', 1)->find(),
'token' => session('kf_token'),
'type' => $type,
'payment_information' => $payment_information,
'payment_img' => $payment_img,
'pay_types' => $pay_arr,
'user' => $user,
'amount' => $userInfo['remaining_amount'],
'chat_log' => $chat_log,
'user_status' => $user_status,
'kf_id' => $kf_id,
]);
return $this->fetch('dialogue_log/offLineDialogueRoom');
}
/**
* 获取离线消息记录
* @return [type] [description]
*/
public function getOutLineMsgLog()
{
if(request()->isAjax()){
$param = input('param.');
$cl_db = db($this->getTableName('chat_log', $param['uid']));
$limit = 15; // 一次显示15 条聊天记录
$offset = ($param['page'] - 1) * $limit;
$logs = $cl_db
->where(function($query) use($param){
$query->where('from_id', $param['uid'])->where('to_id', 'KF' . $param['kf_id']);
})->whereOr(function($query) use($param){
$query->where('from_id', 'KF' . $param['kf_id'])->where('to_id', $param['uid']);
})->limit($offset, $limit)->order('id', 'desc')->select();
$total = $cl_db
->where(function($query) use($param){
$query->where('from_id', $param['uid'])->where('to_id', 'KF' . $param['kf_id']);
})->whereOr(function($query) use($param){
$query->where('from_id', 'KF' . $param['kf_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' . $param['kf_id']){
$logs[$key]['type'] = 'mine';
}
}
return json(['code' => 1, 'data' => $logs, 'msg' => intval($param['page']), 'total' => ceil($total / $limit)]);
}
}
/**
* 下载平台的客服聊天记录
* @return array|false|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function downServiceLogOld()
{
$gdb = db('groups');
$udb = db('users');
$group_id = input('id');
$date = input('date');
if (!$group_id || !$date) return resultJson(3, '参数错误');
$group_info = $gdb->where(['id' => $group_id, 'status' => 1])->field('name')->find();
if (!$group_info) return resultJson(2, '平台未找到');
$users = $udb->where(['group_id' => $group_id, 'status' => 1])->field('id,user_name')->select();
if (!$users) return resultJson(2, '暂无客服');
// 处理平台下客服的聊天记录
foreach($users as $k => $v) {
$day_up = strtotime($date);
$day_down = strtotime($date) + (60 * 60 * 24);
$chat_log = [];
for($i=0; $i < config('chat_table_num'); $i++) {
$log_data = db('chat_log_'.$i)->where("(from_id = 'KF{$v['id']}' or to_id = 'KF{$v['id']}') and (time_line >= {$day_up} and time_line < $day_down)")->select();
if (!$log_data) continue;
foreach ($log_data as $vv) {
$chat_log[] = $vv;
}
}
$filePath = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}/";
if(!is_dir($filePath)) {
if(!mkdir($filePath, 0775, true)) {
return resultJson(3, '创建文件夹失败');
}
}
$title = $v['user_name'].'-'.$date;
$xlsCell = array(
array('from_id','发送方id'),
array('from_name','发送方名字'),
array('to_id','接收方id'),
array('to_name','接收方名字'),
array('content','发送内容'),
array('time_line','发送时间'),
array('is_offline_msg','是否离线消息'),
array('msg_id','消息id'),
);
ExcelRepository::exportExcel($title, $xlsCell, $chat_log, $filePath);
}
$zip_path = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}/";
$zip_to_path = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}.zip";
try{
// 重复压缩,会自动覆盖
$res = ZipRepository::zip($zip_path, $zip_to_path);
if(!$res){
return resultJson(0, '下载文件失败');
}
$down_url = 'http://'.$_SERVER['HTTP_HOST']."/uploads/export_service_log/{$group_info['name']}/{$date}.zip";
return resultJson(1, '下载成功', ['url' => $down_url]);
}catch (Exception $e){
return resultJson(0, '系统错误', $e->getMessage());
}
}
public function downServiceLog()
{
$gdb = db('groups');
$udb = db('users');
$group_id = input('id');
$kf_id = input('kf_id');
$date_start = input('date_start');
$date_end = input('date_end');
if (!$group_id || !$date_start || !$date_end) {
echo '参数错误';
exit;
}
try{
$group_info = $gdb->where(['id' => $group_id, 'status' => 1])->field('name')->find();
if (!$group_info) {
echo '平台未找到';
exit;
}
$where = [
'group_id' => $group_id,
'status' => 1
];
if ($kf_id) {
$where['id'] = $kf_id;
}
$users = $udb->where($where)->field('id,user_name')->select();
if (!$users) {
echo '暂无客服';
exit;
}
$date = $date_start . '-' . $date_end;
// 处理平台下客服的聊天记录
foreach($users as $k => $v) {
$day_up = strtotime($date_start);
$day_down = strtotime($date_end) + (60 * 60 * 24);
$chat_log = [];
for($i=0; $i < 5; $i++) {
$log_data = db('chat_log_'.$i)
->where("(from_id = 'KF{$v['id']}' or to_id = 'KF{$v['id']}') and (time_line >= {$day_up} and time_line < $day_down)")
->order('time_line asc')->select();
if (!$log_data) continue;
foreach ($log_data as &$vv) {
$vv['time_line'] = date('Y-m-d H:i:s', $vv['time_line']);
$chat_log[] = $vv;
}
}
$filePath = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}/";
if(!is_dir($filePath)) {
if(!mkdir($filePath, 0775, true)) {
echo '创建文件夹失败';
exit;
}
}
$title = $v['user_name'].'-'.$date;
$xlsCell = array(
array('from_id','发送方id'),
array('from_name','发送方名字'),
array('to_id','接收方id'),
array('to_name','接收方名字'),
array('content','发送内容'),
array('time_line','发送时间'),
array('is_offline_msg','是否离线消息'),
array('msg_id','消息id'),
);
ExcelRepository::exportExcel($title, $xlsCell, $chat_log, $filePath);
}
$zip_path = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}/";
$zip_to_path = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}.zip";
// 重复压缩,会自动覆盖
$res = ZipRepository::zip($zip_path, $zip_to_path);
if(!$res){
echo '下载文件失败';
exit;
}
$down_url = 'http://'.$_SERVER['HTTP_HOST']."/uploads/export_service_log/{$group_info['name']}/{$date}.zip";
echo '下载成功, url='.$down_url;
exit;
}catch (Exception $e){
var_dump($e->getMessage());
}
}
}

View File

@ -0,0 +1,115 @@
<?php
/**
* 财务管理
*/
namespace app\admin\controller;
class Finance extends Base
{
/**
* 入账列表
*/
public function incomeList()
{
$mdb = db('money_log');
// 返回视图
if(!request()->isAjax()) return $this->fetch('finance/incomeList');
// 分页请求
$param = input('get.');
// 查询条件
switch($this->role_name) {
case '平台管理员':
$where = ['passivity' => "g_{$this->admin_id}", 'type' => 1];
break;
case '组长':
$where = ['passivity' => "o_{$this->admin_id}", 'type' => 1];
break;
case '超级管理员':
$where = ['passivity' => "a_{$this->admin_id}", 'type' => 1];
break;
}
//获取总条数
$count = $mdb->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$list = $mdb
->where($where)
->limit($start, $limit)
->order('date desc')
->select();
// 对列表进行处理
foreach ($list as &$vo) {
// 在线状态
$vo['date'] = date('Y-m-d', strtotime($vo['date']));
$vo['type_name'] = $vo['type'] == 1 ? '入账+' : '出账-';
}
$result = resultJson(0, '获取成功', $list);
$result['count'] = $count;
return $result;
}
/**
* 出账列表
*/
public function expenditureList()
{
$mdb = db('money_log');
// 返回视图
if(!request()->isAjax()) return $this->fetch('finance/expenditureList');
// 分页请求
$param = input('get.');
// 查询条件
$where = ['initiative' => $this->admin_id, 'type' => 2];
//获取总条数
$count = $mdb->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$list = $mdb
->where($where)
->limit($start, $limit)
->order('date desc')
->select();
// 对列表进行处理
foreach ($list as &$vo) {
// 在线状态
$vo['date'] = date('Y-m-d', strtotime($vo['date']));
$vo['type_name'] = $vo['type'] == 1 ? '入账+' : '出账-';
}
$result = resultJson(0, '获取成功', $list);
$result['count'] = $count;
return $result;
}
/**
* 删除菜单
*/
public function delMenu()
{
$mdb = db('admin_menus');
// 返回视图
if(request()->isAjax()) {
$id = input('post.id');
if (!$id) return resultJson(0, '参数错误');
$save = $mdb->where('id', $id)->delete();
if (!$save) return resultJson(0, '删失败');
return resultJson(1, '成功');
}
}
}

View File

@ -0,0 +1,218 @@
<?php
/**
* 平台控制器
*/
namespace app\admin\controller;
use Repository\LogRepository;
class Groups extends Base
{
// 平台列表
public function index()
{
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
$where = isset($this->where['group_id']) ? ['id' => $this->where['group_id']] : [];
$result = db('groups')->where($where)->limit($offset, $limit)->order('id desc')->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>';
}
// 统计平台人数
$result[$key]['users_num'] = db('users')->where('group_id', $vo['id'])->count();
// 生成操作按钮
$result[$key]['operate'] = $this->makeBtn($vo['id']);
//生成下载客服聊天记录按钮
$result[$key]['down_service_log'] = $this->makeServiceLogBtn($vo['id']);
// 管理员名称
$admin = db('admins')->where('id', $vo['admin_id'])->field('user_name')->find();
$result[$key]['admin_name'] = isset($admin['user_name']) ? $admin['user_name'] : '暂无';
// 充值赠送类型
$type_arr = config('recharge_gift_type');
$result[$key]['recharge_gift_type'] = $type_arr && isset($type_arr[$vo['recharge_gift_type']])
? $type_arr[$vo['recharge_gift_type']] : '';
}
$return['total'] = db('groups')->where($where)->count(); //总数据
$return['rows'] = $result;
return json($return);
}
return $this->fetch();
}
// 添加平台
public function addGroup()
{
$adb = db('admins');
$rdb = db('role');
if(request()->isPost()){
$param = input('post.');
$param['name'] = htmlentities($param['name']);
$has = db('groups')->field('id')->where('name', $param['name'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该平台已经存在']);
}
// 检测是否有平台管理员角色
$role = $rdb->where('name', '平台管理员')->field('id')->find();
if (!$role) return json(['code' => -1, 'data' => '', 'msg' => "请先添加名称为'平台管理员'的角色"]);
$rule = "/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/";
if (!preg_match($rule, $param['password'])) {
return json(['code' => -2, 'data' => '', 'msg' => '密码必须是8-16位的字母和数字组成!']);
};
$has = $adb->field('id')->where('user_name', $param['user_name'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该管理员已经存在']);
}
$param['date'] = date('Y-m-d H:i');
try{
// 先添加平台管理员
$admin_data = [
'user_name' => $param['user_name'],
'password' => password_hash($param['password'], PASSWORD_DEFAULT),
'user_avatar' => getImageHost().'/static/common/images/avatar.png',
'status' => 1,
];
$add_admin = $adb->insertGetId($admin_data);
db('admin_role')->insertGetId(['role_id' => $role['id'], 'admin_id' => $add_admin]);
$param['admin_id'] = $add_admin;
unset($param['user_name']);
unset($param['password']);
$save = db('groups')->insertGetId($param);
// 资金流动记录
$this->saveMoneyFlowLog($this->admin_id, 'g_' . $add_admin, $param['money'], "'{$param['name']}'平台分配金额");
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('支付管理', '成功添加平台--'.$param['name']);
return json(['code' => 1, 'data' => '', 'msg' => '添加平台成功']);
}
$this->assign([
'status' => config('kf_status')
]);
return $this->fetch('addgroup');
}
// 编辑平台
public function editGroup()
{
if(request()->isAjax()){
$param = input('post.');
$param['name'] = htmlentities($param['name']);
$gdb = db('groups');
// 检测用户修改的用户名是否重复
$has = $gdb->where('name', $param['name'])->where('id', '<>', $param['id'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该平台已经存在']);
}
try{
$group = $gdb->where('id', $param['id'])->find();
$gdb->where('id', $param['id'])->update($param);
if ($this->is_root) {
// 资金流动记录
$compare = $param['money'] > $group['money'];
$money = $compare ? $param['money'] - $group['money'] : abs($param['money'] - $group['money']);
if ($compare) {
$this->saveMoneyFlowLog($this->admin_id, 'g_' . $group['admin_id'], $money, "'{$param['name']}'平台分配金额");
}
}
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '编辑平台成功']);
}
$id = input('param.id/d');
$info = db('groups')->where('id', $id)->find();
$admin = $this->getPlatformList();
$this->assign([
'info' => $info,
'status' => config('kf_status'),
'recharge_gift_type' => config('recharge_gift_type'),
'admin' => $admin,
]);
return $this->fetch('editgroup');
}
// 删除平台
public function delGroup()
{
if(request()->isAjax()){
$id = input('param.id/d');
// 查询该平台下是否有客服
$has = db('users')->where('group_id', $id)->count();
$hasOrganize = db('organize')->where('group_id', $id)->count();
if($has > 0 || $hasOrganize > 0){
return json(['code' => -2, 'data' => '', 'msg' => '该平台下还有组或者客服,不可删除']);
}
try{
$group = db('groups')->where('id', $id)->find();
db('groups')->where('id', $id)->delete();
if (isset($group['admin_id'])) {
db('admins')->where('id', $group['admin_id'])->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('groups/editgroup', ['id' => $id]) . '">';
$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
if ($this->is_root) {
$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 .= '<a href="' . url('groups/manageUser') . '">';
//$operate .= '<button type="button" class="btn btn-info btn-sm"><i class="fa fa-user-plus"></i> 管理组员</button></a>';
return $operate;
}
// 生成支付账号详情按钮
private function makeServiceLogBtn($id)
{
$operate = '<a href="javascript:downServiceLog(' . $id . ')">';
// $operate .= '<input type="text" class="layui-input" id="dateSelect"></a> ';
$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 选择日期</button> </a>';
return $operate;
}
}

View File

@ -0,0 +1,250 @@
<?php
/**
* 首页控制器.
*/
namespace app\admin\controller;
use gmars\rbac\Rbac;
class Index extends Base
{
// 后台总体框架
public function index()
{
// 获取管理员相关数据信息
$uid = session('user_id');
$admin_data = db('admins')->field('user_avatar')->where('id', $uid)->find();
// 获取管理员的权限
$menu_list = $this->getAdminMeunList();
$pay_money = 0;
if ($this->role_name == '平台管理员') {
$paltform = db('groups')->where('admin_id', $uid)->field('money')->find();
$pay_money = isset($paltform['money']) ? $paltform['money'] : 0;
}
if ($this->role_name == '组长') {
$organize = db('organize')->where('admin_id', $uid)->field('money')->find();
$pay_money = isset($organize['money']) ? $organize['money'] : 0;
}
$this->assign([
'admin_img' => $admin_data['user_avatar'],
'admin_name' => session('user_name'),
'menu_one' => $menu_list['menu_one'],
'menu_two' => $menu_list['menu_two'],
'role_name' => session('role_name'),
'pay_money' => $pay_money,
]);
return $this->fetch('/index');
}
// 后台默认首页
public function indexPage()
{
if ($this->role_name == '组长')
{
$this->redirect(url('Users/index'));
}
$now_date = date('Y-m-d');
//获取当日咨询信息
if ($this->is_root) {
$data = db('now_data')->where('now_date', $now_date)->select();
$data['is_talking'] = 0;
$data['in_queue'] = 0;
$data['online_kf'] = 0;
$data['success_in'] = 0;
$data['total_in'] = 0;
$data['order_num'] = 0;
$data['money_total'] = 0;
foreach ($data as $vo) {
$data['is_talking'] += $vo['is_talking'];
$data['in_queue'] += $vo['in_queue'];
$data['online_kf'] += $vo['online_kf'];
$data['success_in'] += $vo['success_in'];
$data['total_in'] += $vo['total_in'];
$data['order_num'] += $vo['order_num'];
$data['money_total'] += $vo['money_total'];
}
} elseif($this->role_name == '平台管理员') {
$data = db('now_data')->where('now_date', $now_date)->where($this->where)->find();
}
//无当日信息 初始化数据
if (empty($data)) {
$data['is_talking'] = 0;
$data['in_queue'] = 0;
$data['online_kf'] = 0;
$data['success_in'] = 0;
$data['total_in'] = 0;
$data['order_num'] = 0;
$data['money_total'] = 0;
}
// dump($this->where);return;
// 生成从 8点 到 22点的时间数组
$dateLine = array_map(function ($vo) {
if ($vo < 10) {
return '0'.$vo;
} else {
return $vo;
}
}, range(8, 22));
// 初始化数据
$line = [];
foreach ($dateLine as $key => $vo) {
$line[$vo] = [
'is_talking' => 0,
'in_queue' => 0,
'success_in' => 0,
'order_num' => 0,
'money_total' => 0,
];
}
// 对时间线进行赋值
$dbData = db('service_data')->where('add_date', $now_date)->where($this->where)->group('add_hour')->select();
// var_dump($line);
foreach ($dbData as $k => $v) {
$check_is_time_line = array_key_exists($v['add_hour'], $line);
if (!$check_is_time_line) {
continue;
}
$line[$v['add_hour']]['is_talking'] = $v['is_talking'];
$line[$v['add_hour']]['in_queue'] = $v['in_queue'];
$line[$v['add_hour']]['success_in'] = $v['success_in'];
$line[$v['add_hour']]['total_in'] = $v['total_in'];
$line[$v['add_hour']]['order_num'] = $v['order_num'];
$line[$v['add_hour']]['money_total'] = $v['money_total'];
}
// dump($dbData);
$showData = [];
foreach ($line as $key => $vo) {
$showData['is_talking'][] = $vo['is_talking'];
// $showData['in_queue'][] = $vo['in_queue'];
$showData['success_in'][] = $vo['success_in'];
// $showData['total_in'][] = $vo['total_in'];
$showData['order_num'][] = $vo['order_num'];
$showData['money_total'][] = $vo['money_total'];
}
// dump($showData);return;
$this->assign([
'data' => $data,
'show_data' => json_encode($showData),
]);
return $this->fetch('index');
}
// 清除缓存
public function clear()
{
if (false === removeDir(RUNTIME_PATH)) {
return json(['code' => -1, 'data' => '', 'msg' => '清除缓存失败']);
}
return json(['code' => 1, 'data' => '', 'msg' => '清除缓存成功']);
}
// 修改管理员密码
public function changePassword()
{
if (request()->isPost()) {
$param = input('post.');
$reLogin = false;
if (empty($param['old_pwd']) && !empty($param['password'])) {
return json(['code' => -2, 'data' => '', 'msg' => '请输入旧密码']);
}
if (!empty($param['old_pwd']) && empty($param['password'])) {
return json(['code' => -3, 'data' => '', 'msg' => '请输入新密码']);
}
if ($param['password'] != $param['password_c']) {
return json(['code' => -3, 'data' => '', 'msg' => '两次密码不一致']);
}
if (!empty($param['old_pwd']) && !empty($param['password'])) {
$rule = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,15}$/';
if (!preg_match($rule, $param['password'])) {
return json(['code' => -2, 'data' => '', 'msg' => '密码必须是6-15位的字母和数字组成!']);
}
$userInfo = db('admins')->where('id', session('user_id'))->find();
if (empty($userInfo)) {
return json(['code' => -4, 'data' => '', 'msg' => '管理员不存在']);
}
if (!password_verify($param['old_pwd'], $userInfo['password'])) {
return json(['code' => -1, 'data' => '', 'msg' => '旧密码错误']);
}
$info['password'] = password_hash($param['password'], PASSWORD_DEFAULT);
$reLogin = true;
}
db('admins')->where('id', session('user_id'))->setField('password', $info['password']);
return json(['code' => 1, 'data' => $reLogin, 'msg' => '修改信息成功']);
}
}
//修改管理员头像
public function changeImg()
{
if (request()->isPost()) {
$param = input('post.');
if (empty($param['user_avatar'])) {
return json(['code' => 0, 'data' => $param, 'msg' => '上传头像不能为空']);
}
$result = db('admins')->where('id', session('user_id'))->setField('user_avatar', $param['user_avatar']);
if (!$result) {
return json(['code' => 1, 'data' => '', 'msg' => '头像修改失败,请重新上传']);
}
return json(['code' => 2, 'data' => '', 'msg' => '修改头像成功']);
}
}
// 上传管理员头像
public function upAvatar()
{
if (request()->isAjax()) {
$file = request()->file('file');
if (!empty($file)) {
$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'.DS.'avatar');
if ($info) {
$src = config('img_take_prefix').'/uploads/avatar'.'/'.date('Ymd').'/'.$info->getFilename();
return json(['code' => 0, 'data' => ['src' => $src], 'msg' => 'ok']);
} else {
// 上传失败获取错误信息
return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
}
}
}
}
}

View File

@ -0,0 +1,134 @@
<?php
/**
* IP白名单
*/
namespace app\admin\controller;
use Repository\LogRepository;
class Ip extends Base
{
/**
* IP白名单列表
*/
public function index(){
if(request()->isAjax()){
$where = isset($this->where['group_id']) ? ['id' => $this->where['group_id']] : [];
$result = db('ip_whitelist')->order('id desc')->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>';
}
// 生成操作按钮
$result[$key]['operate'] = $this->makeBtn($vo['id']);
}
$return['total'] = db('ip_whitelist')->where($where)->count(); //总数据
$return['rows'] = $result;
return json($return);
}
return $this->fetch();
}
/**
* 添加IP
*/
public function addIP()
{
$adb = db('admins');
if(request()->isPost()){
$param = input('post.');
$param['ip_addr'] = htmlentities($param['ip_addr']);
$has = db('ip_whitelist')->field('id')->where('ip_addr', $param['ip_addr'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该IP已经存在']);
}
try{
db('ip_whitelist')->insert($param);
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('白名单管理', '成功添加IP--'.$param['ip_addr']);
return json(['code' => 1, 'data' => '', 'msg' => '添加IP成功']);
}
$this->assign([
'status' => [
1 => '启用',
0 => '禁用'
]
]);
return $this->fetch('addIp');
}
/**
* 编辑IP
*/
public function editIp()
{
if(request()->isAjax()){
$param = input('post.');
try{
db('ip_whitelist')->where('id', $param['id'])->update(['status' => $param['status']]);
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '编辑成功']);
}
$id = input('param.id/d');
$info = db('ip_whitelist')->where(['id' => $id])->find();
$this->assign([
'info' => $info,
'status' => [1 => '启用',0 => '禁用']
]);
return $this->fetch('editIp');
}
/**
* 删除IP
*/
public function delIp()
{
if(request()->isAjax()){
$id = input('param.id/d');
try{
db('groups')->where('id', $id)->delete();
}catch(\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '删除IP成功']);
}
}
// 生成按钮
private function makeBtn($id)
{
$operate = '<a href="' . url('ip/editIp', ['id' => $id]) . '">';
$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
$operate .= '<a href="javascript:deleteIp(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
$operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
return $operate;
}
}

View File

@ -0,0 +1,100 @@
<?php
namespace app\admin\controller;
class Log extends Base
{
public function index(){
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
$result = db('system_log')->limit($offset, $limit)->order('id', 'desc')->select();
$ip2region = new \Ip2Region();
foreach($result as $key=>$vo){
$info = $ip2region->btreeSearch($vo['ip']);
$city = explode('|', $info['region']);
if(0 != $info['city_id']){
$result[$key]['ip'] = $city['2'] . $city['3'] .'---'. $city['4'];
}else{
$result[$key]['ip'] = $city['0'];
}
$result[$key]['operate'] = $this->makeBtn($vo['id']);
}
$return['total'] = db('system_log')->count(); //总数据
$return['rows'] = $result;
return json($return);
}
return $this->fetch();
}
public function del(){
if(request()->isAjax()){
$id = input('param.id/d');
try{
db('system_log')->where('id', $id)->delete();
}catch(\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '删除成功']);
}
}
public function paymentActionLog(){
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
$instance = db('payment_action_log');
if(empty($param['searchText'])){
$result = $instance->limit($offset, $limit)->order('id', 'desc')->select();
}else{
$result = $instance->where('action_user',$param['searchText'])->whereOr('pay_account',$param['searchText'])->limit($offset, $limit)->order('id', 'desc')->select();
}
foreach($result as $key=>$vo){
$result[$key]['operate'] = $this->makeBtn($vo['id']);
}
$return['total'] = count($result);
$return['rows'] = $result;
return json($return);
}
return $this->fetch('paymentLog');
}
public function paymentLogDel(){
if(request()->isAjax()){
$id = input('param.id/d');
try{
db('payment_action_log')->where('id', $id)->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="javascript:del(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
$operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
return $operate;
}
}

View File

@ -0,0 +1,80 @@
<?php
/**
* 登录控制器.
*/
namespace app\admin\controller;
use think\Controller;
use Repository\LogRepository;
use Repository\IpRepository;
class Login extends Controller
{
// 登录首页
public function index()
{
// $ipAccess = (new IpRepository)->ipAccess();
// if(!$ipAccess){
// throw new \think\exception\HttpException(404, '非法请求!');
// }
$this->assign([
'version' => config('version'),
]);
return $this->fetch();
}
// 处理登录
public function doLogin()
{
if (request()->isPost()) {
$userName = input('param.user_name');
$password = input('param.password');
if (empty($userName) || empty($password)) {
return json(['code' => -1, 'data' => '', 'msg' => '用户名或密码不能为空']);
}
$userInfo = db('admins')->where('user_name', $userName)->find();
// var_dump($userInfo, password_verify($password, $userInfo['password']), $password);return;
if (empty($userInfo) || !password_verify($password, $userInfo['password']) || 1 != $userInfo['status']) {
return json(['code' => -4, 'data' => '', 'msg' => '密码错误']);
}
// 记录管理员状态
session('user_name', $userName);
session('user_id', $userInfo['id']);
session('user_last_login', time());
// 管理员角色
$role = db('admin_role')
->alias('a')
->where('admin_id', $userInfo['id'])
->join('role r',"r.id=a.role_id")
->field('name')
->find();
$role_name = $role['name'] ? $role['name'] : '暂无角色';
session('role_name', $role_name);
// 更新管理员状态
$param = [
'last_login_ip' => request()->ip(),
'last_login_time' => time(),
];
db('admins')->where('id', $userInfo['id'])->update($param);
LogRepository::write('系统管理', '登录成功');
return json(['code' => 1, 'data' => url('index/index'), 'msg' => '登录成功']);
}
}
public function loginOut()
{
session('user_name', null);
session('user_id', null);
session('user_last_login', null);
session('role_name', null);
$this->redirect(url('login/index'));
}
}

View File

@ -0,0 +1,323 @@
<?php
/**
* 分组控制器
*/
namespace app\admin\controller;
use Repository\LogRepository;
class Organize extends Base
{
// 平台列表
public function index()
{
$odb = db('organize');
if(request()->isAjax()){
// $where = isset($this->where['group_id']) ? ['id' => $this->where['group_id']] : [];
$result = $odb->where($this->where)->order('id desc')->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>';
}
// 统计分组人数
$result[$key]['users_num'] = db('users')->where('organize_id', $vo['id'])->count();
// 生成操作按钮
$result[$key]['operate'] = $this->makeBtn($vo['id']);
// 管理员名称
$admin = db('admins')->where('id', $vo['admin_id'])->field('user_name')->find();
$result[$key]['admin_name'] = isset($admin['user_name']) ? $admin['user_name'] : '暂无';
// 平台名称
$group = db('groups')->where('id', $vo['group_id'])->field('name')->find();
$result[$key]['group_name'] = isset($group['name']) ? $group['name'] : '暂无';
}
$return['total'] = $odb->where($this->where)->count(); //总数据
$return['rows'] = $result;
return json($return);
}
return $this->fetch();
}
/**
* 添加分组
*/
public function addOrganize()
{
$adb = db('admins');
$rdb = db('role');
$odb = db('organize');
$gdb = db('groups');
if(request()->isPost()){
$param = input('post.');
$param['name'] = htmlentities($param['name']);
$has = $odb->field('id')->where('name', $param['name'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该分组已经存在']);
}
// 检测客服的限制金额是否为正整数
if(!preg_match("/^[0-9]*$/",$param['money']) && !empty($param['money'])){
return json(['code' => -6, 'data' => '', 'msg' => '可充值总额度只能为正整数或为0']);
}
if(empty($param['group_id']) && $this->is_root){
return json(['code' => -4, 'data' => '', 'msg' => '请选择平台']);
} elseif(empty($param['group_id']) && $this->role_name == '平台管理员') {
$param['group_id'] = $this->where['group_id'];
}
// 减去平台的金额
$group = $gdb->where('id', $param['group_id'])->find();
if ($param['money'] > $group['money']) return json(['code' => -6, 'data' => '', 'msg' => '分配金额超出平台充值余额']);
// 检测是否有平台管理员角色
$role = $rdb->where('name', '组长')->field('id')->find();
if (!$role) return json(['code' => -1, 'data' => '', 'msg' => "请先添加名称为'组长'的角色"]);
$rule = "/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/";
if (!preg_match($rule, $param['password'])) {
return json(['code' => -2, 'data' => '', 'msg' => '密码必须是8-16位的字母和数字组成!']);
}
$has = $adb->field('id')->where('user_name', $param['user_name'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该管理员已经存在']);
}
$param['date'] = date('Y-m-d H:i');
try{
// 先添加管理员
$admin_data = [
'user_name' => $param['user_name'],
'password' => password_hash($param['password'], PASSWORD_DEFAULT),
'user_avatar' => config('img_take_prefix').'/static/common/images/avatar.png',
'status' => 1,
];
$add_admin = $adb->insertGetId($admin_data);
db('admin_role')->insertGetId(['role_id' => $role['id'], 'admin_id' => $add_admin]);
$param['admin_id'] = $add_admin;
unset($param['user_name']);
unset($param['password']);
$add = $odb->insert($param);
$gdb->where('id', $param['group_id'])->setDec('money', $param['money']);
// 资金流动记录
$this->saveMoneyFlowLog($group['admin_id'], 'o_' . $add_admin, $param['money'], "'{$param['name']}'小组分配金额");
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('分组管理', '成功添加分组--'.$param['name']);
return json(['code' => 1, 'data' => '', 'msg' => '添加成功']);
}
$group = $gdb->where('status', 1)->order('id desc')->select();
$this->assign([
'status' => config('kf_status'),
'group' => $group,
]);
return $this->fetch('addOrganize');
}
/**
* 编辑分组
*/
public function editOrganize()
{
$adb = db('admins');
$rdb = db('role');
$odb = db('organize');
$gdb = db('groups');
if(request()->isAjax()){
$param = input('post.');
$param['name'] = htmlentities($param['name']);
$has = $odb->field('id, group_id')->where('name', $param['name'])->where('id', '<>', $param['id'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该分组已经存在']);
}
$info = $odb->where('id', $param['id'])->find();
// 检测客服的限制金额是否为正整数
if(!preg_match("/^[0-9]*$/",$param['money']) && !empty($param['money'])){
return json(['code' => -6, 'data' => '', 'msg' => '可充值总额度只能为正整数或为0']);
}
// 减去平台的金额
$group = $gdb->where('id', $info['group_id'])->find();
$money = $param['money'] > $group['money'] ? intval($param['money'] - $group['money']) : 0;
if ($money > $group['money']) return json(['code' => -6, 'data' => '', 'msg' => '分配金额超出平台充值余额']);
try{
$odb->where('id', $param['id'])->update($param);
if ($money > 0) {
$gdb->where('id', $info['group_id'])->setDec('moeny', $money);
// 资金流动记录
$compare = $param['money'] > $group['money'];
$money = $compare ? $param['money'] - $group['money'] : abs($param['money'] - $group['money']);
if ($compare) {
$this->saveMoneyFlowLog($group['admin_id'], 'o_' . $info['admin_id'], $money, "'{$param['name']}'小组分配金额");
}
}
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '编辑成功']);
}
$id = input('param.id/d');
$info = $odb->where('id', $id)->find();
$this->assign([
'info' => $info,
'status' => config('kf_status'),
]);
return $this->fetch('editOrganize');
}
// 删除分组
public function delOrganize()
{
$odb = db('organize');
if(request()->isAjax()){
$id = input('param.id/d');
// 查询该分组下是否有客服
$has = db('users')->where('organize_id', $id)->count();
if($has > 0){
return json(['code' => -2, 'data' => '', 'msg' => '该分组下有客服,不可删除']);
}
try{
$oinfo = $odb->where('id', $id)->find();
$odb->where('id', $id)->delete();
if (isset($oinfo['admin_id'])) {
db('admins')->where('id', $oinfo['admin_id'])->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('Organize/editOrganize', ['id' => $id]) . '">';
$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
// if ($this->is_root) {
$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 .= '<a href="' . url('groups/manageUser') . '">';
//$operate .= '<button type="button" class="btn btn-info btn-sm"><i class="fa fa-user-plus"></i> 管理组员</button></a>';
return $operate;
}
/**
* 根据平台获取分组
*/
public function groupGetOrganize()
{
$odb = db('organize');
$group_id = input('group_id');
$organize = $odb->where('group_id', $group_id)->select();
return resultJson(1, '获取成功', $organize);
}
// 管理员列表
public function groupAdminList()
{
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
$where = [];
if (!empty($param['searchText'])) {
$where['user_name'] = ['like', '%' . $param['searchText'] . '%'];
}
$result = db('admins')
->where($where)
->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>';
}
// 获取权限名称
$role = db('admin_role')
->alias('a')
->where('admin_id', $vo['id'])
->join('role r',"r.id=a.role_id")
->field('name')
->find();
$result[$key]['role_name'] = $role ? $role['name'] : '暂无角色';
// 查找平台
$platform = db('groups')->where('admin_id', $vo['id'])->find();
$result[$key]['platform_name'] = $platform ? $platform['name'] : '暂无';
if ($role['name'] == '组长') {
$platform = db('organize')->where('admin_id', $vo['id'])->find();
if ($platform) {
$platform = db('groups')->where('id', $platform['group_id'])->find();
}
$result[$key]['platform_name'] = $platform ? $platform['name'] : '暂无';
}
// 上次登录时间
$result[$key]['last_login_time'] = empty($vo['last_login_time']) ? '' : date('Y-m-d H:i:s', $vo['last_login_time']);
// 生成操作按钮
if(1 != $vo['id']){
$result[$key]['operate'] = $this->makeBtnGroupAdmin($vo['id']);
}
}
$result_datas = [];
foreach($result as $k => $vo) {
if ($vo['role_name'] != '组长' || ($this->role_name == '平台管理员' && $this->group_name != $vo['platform_name'])) continue;
$result_datas[] = $vo;
}
$result_data['total'] = db('admins')->where($where)->count(); //总数据
$result_data['rows'] = $result_datas;
return json($result_data);
}
return $this->fetch();
}
// 生成按钮
private function makeBtnGroupAdmin($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 .= '<a href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
$operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
return $operate;
}
}

View File

@ -0,0 +1,501 @@
<?php
/**
* 系统控制器
*/
namespace app\admin\controller;
use Repository\LogRepository;
use app\service\controller\Redis;
class Payment extends Base
{
public function index(){
if(request()->isAjax()){
$param = input('param.');
$limit = empty($param['pageSize']) ? 1 : $param['pageSize'];
$offset = (empty($param['pageNumber']) ? 20 : $param['pageNumber'] - 1) * $limit;
$result = db('payment')->where($this->where)->alias('p')->limit($offset, $limit)->order('id', 'desc')->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>';
}
$result[$key]['create_time'] =date("Y-m-d H:i:s",$vo['create_time']);
$pay_type = db('payment_type')->where('id', $vo['payment_type'])->field('type_name')->find();
// 生成操作按钮
$result[$key]['operate'] = $this->makeBtn($vo['id']);
$result[$key]['type_name'] = isset($pay_type['type_name']) ? $pay_type['type_name'] : '暂无';
// 所属分组
$organize = db('organize')->field('name')->where('id', $vo['organize_id'])->find();
$result[$key]['organize_name'] = !empty($organize) ? $organize['name'] : '暂无';
// 所属平台
$group = db('groups')->field('name')->where('id', $vo['group_id'])->find();
$result[$key]['group_name'] = !empty($group) ? $group['name'] : '暂无';
}
$return['total'] = db('payment')->count(); //总数据
$return['rows'] = $result;
return json($return);
}
return $this->fetch();
}
// 添加支付
public function addpayment()
{
if(request()->isPost()){
$param = input('post.');
unset($param['file']); // 删除layui头像上传隐藏字段
if(empty($param['payment_type'])){
return json(['code' => -4, 'data' => '', 'msg' => '请选择支付类型']);
}
if(empty($param['kf_id'])){
return json(['code' => -4, 'data' => '', 'msg' => '请选择客服']);
}
$kf_info = db('users')->where('id', $param['kf_id'])->find();
$param['account_num'] = htmlentities($param['account_num']);
$has = db('payment')->field('id')->where(['account_num'=> $param['account_num'],'kf_id'=>$param['kf_id']])->find();
// $has = db('payment')->field('id')->where(['account_num'=> $param['account_num'],'group_id'=>$kf_info['group_id']])->find();
if(!empty($has)){
return json(['code' => -2, 'data' => '', 'msg' => '该账号已经存在']);
}
$param['group_id'] = $kf_info['group_id'];
$param['organize_id'] = $kf_info['organize_id'];
// 检测分组
// if ($this->role_name == '组长') {
// $param['organize_id'] = $this->where['organize_id'];
// $organize = db('organize')->where('id', $this->where['organize_id'])->find();
// }
// if (!isset($param['organize_id'])) return resultJson(0, '请选择分组');
$param['name'] = htmlentities($param['name']);
$data['name'] = $param['name'];
$data['account_num'] = $param['account_num'];
$data['payment_type'] = $param['payment_type'];
$data['create_time'] = time();
$data['kf_id'] = $param['kf_id'];
$data['status'] = $param['status'];
$data['group_id'] = $param['group_id'];
$data['organize_id'] = $param['organize_id'];
// 检测当前用户是否支付账号还为空
$check = db('payment')->field('id')->where(['kf_id' => $data['kf_id'], 'payment_type' => $data['payment_type'], 'is_use' => 1, 'status' => 1])->find();
if (!$check) {
$data['is_use'] = 1;
}
switch ($param['payment_type']) {
case "1":
case "2":
case "3":
case "4":
unset($param['open_bank'],$param['branch_bank']);
if(empty($param['payment_img'])){
return json(['code' => -1, 'data' => '', 'msg' => '请上传二维码']);
}
$data['payment_img'] = $param['payment_img'];
break;
case "5":
if(empty($param['open_bank']) || empty($param['branch_bank'])){
return json(['code' => -4, 'data' => '', 'msg' => '开户银行和开户支行必须填写']);
}
unset($param['payment_img']);
$data['open_bank'] = $param['open_bank'];
$data['branch_bank'] = $param['branch_bank'];
break;
case "6":
// unset($param['open_bank'],$param['branch_bank']);
// if(empty($param['payment_img'])){
// return json(['code' => -1, 'data' => '', 'msg' => '请上传二维码']);
// }
// $data['payment_img'] = $param['payment_img'];
// break;
default:
# code...
break;
}
try{
db('payment')->insert($data);
}catch(\Exception $e){
return json(['code' => -3, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('支付管理', '成功添加支付账号--'.$data['account_num']);
$paymentLog = [
'pay_account' => $param['account_num'],
'history_qrcode' => '',
'new_qrcode' => empty($param['payment_img']) ? '': $param['payment_img'],
'history_kf' => '',
'new_kf' => $param['kf_id'],
'action_type' => "新增",
];
LogRepository::paymentLogWrite($paymentLog);
return json(['code' => 1, 'data' => '', 'msg' => '添加账号成功']);
}
// 平台
$platform = db('groups')->where('status', 1)->select();
// 如果是平台管理员获取分组
if ($this->role_name == '平台管理员') {
$organize = db('organize')->where($this->where)->select();
} else {
$organize = [];
}
$this->assign([
'paytype'=> db('payment_type')->select(),
'users' => db('users')->where($this->where)->select(),
'status' => config('kf_status'),
'platform' => $platform,
'organize' => $organize,
]);
return $this->fetch();
}
/**
* 支付方式列表
*/
public function getpaymenttype(){
}
/**
* 添加支付方式
*/
public function addpaymenttype(){
if(request()->isPost()){
$param = input('post.');
if(!$param['alias_id']){
// if(!ctype_alpha($param['alias_id'])){
return json(['code' => -1, 'data' => '', 'msg' => 'ID只能为字母']);
}
$param['type_name'] = htmlentities($param['type_name']);
$has = db('payment_type')->field('id')->where('type_name', $param['type_name'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该支付类型已经存在']);
}
// if (!$this->is_root) {
// $param['group_id'] = $this->where['group_id'];
// }
try{
db('payment_type')->insert($param);
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
$redis = new Redis();
$redis::instance()->del("payment");
return json(['code' => 1, 'data' => '', 'msg' => '添加支付类型成功']);
}
// 平台
$platform = db('groups')->where('status', 1)->select();
$this->assign([
'status' => config('kf_status'),
'platform' => $platform,
]);
return $this->fetch();
}
/**
* 编辑
*/
public function editpayment()
{
if(request()->isAjax()){
$param = input('post.');
$account = $param['account_num'];
unset($param['file']); // 删除layui头像上传隐藏字段
unset($param['account_num']); //账号不允许修改
// 修改支付类型
if(empty($param['payment_type'])){
unset($param['payment_type']);
}
// 修改支付二维码
if(empty($param['payment_img'])){
unset($param['payment_img']);
}
// 修改所属客服
if(empty($param['kf_id'])){
return json(['code' => -1, 'data' => '', 'msg' => '请选择客服']);
}
$kf_info = db('users')->where('id', $param['kf_id'])->find();
$param['group_id'] = $kf_info['group_id'];
$param['organize_id'] = $kf_info['organize_id'];
// if(empty($param['group_id']) && $this->is_root){
// return json(['code' => -4, 'data' => '', 'msg' => '请选择分组']);
// } elseif(empty($param['group_id']) && $this->role_name == '平台管理员') {
// $param['group_id'] = $this->where['group_id'];
// }
// 检测分组
// if ($this->role_name == '组长') {
// $param['organize_id'] = $this->where['organize_id'];
// $organize = db('organize')->where('id', $this->where['organize_id'])->find();
// $param['group_id'] = $organize['group_id'];
// }
// if (!isset($param['organize_id'])) return resultJson(0, '请选择分组');
try{
$historyPayment = db('payment')->where('id', $param['id'])->find();
db('payment')->where('id', $param['id'])->update($param);
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('支付管理', '成功编辑支付账号--'.$account);
$paymentLog = [
'pay_account' => $account,
'history_qrcode' => $historyPayment['payment_img'],
'new_qrcode' => empty($param['payment_img']) ? '': $param['payment_img'],
'history_kf' => $historyPayment['kf_id'],
'new_kf' => empty($param['kf_id']) ? $historyPayment['kf_id'] : $param['kf_id'],
'action_type' => "修改",
];
LogRepository::paymentLogWrite($paymentLog);
return json(['code' => 1, 'data' => '', 'msg' => '编辑账号成功']);
}
$id = input('param.id/d');
$info = db('payment')->where('id', $id)->find();
// 平台
$platform = db('groups')->where('status', 1)->select();
// 如果是平台管理员获取分组
if ($this->role_name == '平台管理员' || $info['group_id']) {
$where = $info['group_id'] ? ['group_id' => $info['group_id']] : $this->where;
$organize = db('organize')->where($where)->select();
} else {
$organize = [];
}
$this->assign([
'info' => $info,
'status' => config('kf_status'),
'paytype'=> db('payment_type')->select(),
'users' => db('users')->where($this->where)->select(),
'platform' => $platform,
'organize' => $organize,
]);
return $this->fetch();
}
// 生成按钮
private function makeBtn($id)
{
$operate = '<a href="' . url('payment/editpayment', ['id' => $id]) . '">';
$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
$operate .= '<a 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 upQrcode()
{
if(request()->isAjax()) {
$file = request()->file('file');
if (!empty($file)) {
$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' . DS . 'qrcode');
if ($info) {
$src = config('img_take_prefix').'/uploads/qrcode' . '/' . date('Ymd') . '/' . $info->getFilename();
return json(['code' => 0, 'data' => ['src' => $src], 'msg' => 'ok']);
} else {
// 上传失败获取错误信息
return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
}
}
}
}
/**
* 删除支付账号
*/
public function delPayment()
{
$id = input('post.id');
if (!$id) return resultJson(0, '参数错误');
$del = db('payment')->where('id', $id)->delete();
if (!$del) return resultJson(0, '删除失败');
return resultJson(1, '删除成功');
}
/**
* 会员权限列表
*/
public function member_level_list()
{
$db = db('member_level');
// 返回视图
if(request()->isAjax()) {
// 分页请求
$param = input('get.');
$where = $this->where;
$keyword = input('search_input');
if (!empty($keyword)) {
$where['name|id'] = $keyword;
}
//获取总条数
$count = $db->where($where)->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$list = $db
->where($where)
->limit($start, $limit)
->order('id desc')
->select();
foreach($list as $key=>$vo){
// 平台名称
$group = db('groups')->where('id', $vo['group_id'])->field('name')->find();
$list[$key]['group_name'] = isset($group['name']) ? $group['name'] : '暂无';
}
$result = resultJson(0, '获取成功', $list);
$result['count'] = $count;
return $result;
}
return $this->fetch();
}
/**
* 添加会员等级
*/
public function add_member_level()
{
$db = db('member_level');
$gdb = db('groups');
if (request()->isPost()) {
$level = input('post.level');
$name = input('post.name');
$group_id = input('post.group_id');
if ($level === '' || !$name) return resultJson(0, '参数错误');
if(empty($group_id) && $this->is_root){
return resultJson(0, '请选择平台');
} elseif(empty($group_id) && $this->role_name == '平台管理员') {
$group_id = $this->where['group_id'];
}
$where['group_id'] = $group_id;
$where['level'] = $level;
$info = $db->where($where)->find();
if ($info) return resultJson(2, '等级已存在');
$data = [
'level' => $level,
'name' => $name,
'group_id' => $group_id,
'date' => date("Y-m-d H:i:s"),
];
$save = $db->insert($data);
if ($save == 1) return resultJson(1, '成功');
return resultJson(0, '保存失败');
}
// 平台
$group = $gdb->where('status', 1)->order('id desc')->select();
$this->assign([
'group' => $group,
]);
return $this->fetch();
}
/**
* 编辑会员等级权限
*/
public function member_level_edit()
{
$mldb = db('member_level');
$ptdb = db('payment_type');
if(request()->isAjax()) {
$id = input('post.id');
$pay_type = isset($_POST['pay_type']) ? $_POST['pay_type'] : [];
if (!is_array($pay_type) || !$pay_type) return resultJson(0, '参数错误');
$data['rules'] = implode(',', $pay_type);
if (!$id) return resultJson(0, '参数错误');
$save = $mldb->where('id', $id)->update($data);
if (!$save) return resultJson(0, '保存失败');
return resultJson(1, '成功');
}
$id = input('id');
$pay_type = $ptdb->where('status', 1)->select();
$info = $mldb->find($id);
// 检测是否已经选中
$rules_arr = explode(',', $info['rules']);
foreach($pay_type as &$vo) {
if(!in_array($vo['id'], $rules_arr)) {
$vo['checked'] = false;
continue;
}
$vo['checked'] = true;
}
$this->assign([
'pay_type' => $pay_type,
'id' => $id,
]);
return $this->fetch();
}
/*
* 删除会员等级
*/
public function del_member_level()
{
if(request()->isPost()) {
$id = input('post.id');
if (!$id) return resultJson(0, '参数错误');
$del = db('member_level')->where('id', $id)->delete();
if (!$del) return resultJson(0, '删除失败');
return resultJson(1, '删除成功');
}
}
}

View File

@ -0,0 +1,89 @@
<?php
/**
* 评价管理控制器
* Created by 北京捷讯佳音.
* User: sam
* Date: 2019/4/1
* Time: 15:04
*/
namespace app\admin\controller;
class Rate extends Base
{
// 获取 客服评价 - 客服列表
public function getKfList()
{
if(request()->isAjax()){
$user_name = input('user_name');
$count = 0;
$data = [];
$where = [];
if ($user_name !== '' && $user_name !== null) {
$where['u.user_name'] = ['LIKE', '%'.$user_name.'%'];
}
$list = db('kf_rate')->alias('r')->join('users u', 'u.id = r.kf_id')
->field('r.kf_id, u.user_name, u.rank_num, u.rate_num')
->where($where)->where($this->where)->group('r.kf_id')->paginate(20)->toArray();
if ($list) {
$count = $list['total'];
$data = $list['data'];
}
return json(['code' => 0, 'msg' => '获取成功', 'count' => $count, 'data'=> $data]);
}
return $this->fetch('kflist');
}
// 获取 客服评价列表
public function getRateList()
{
$kfId = input('kf_id');
if(request()->isAjax()){
$count = 0;
$data = [];
$where = [];
if (!$kfId) {
return json(['code' => 1, 'msg' => '获取失败', 'count' => $count, 'data'=> $data]);
}
$user_id = input('user_id');
$order_id = input('order_id');
$start = input('start');
$end = input('end');
$where['kf_id'] = $kfId;
if ($user_id) {
$where['user_id'] = $user_id;
}
if ($order_id) {
$where['order_id'] = $order_id;
}
if ($start && $end) {
$where['created_time'] = ['BETWEEN', [strtotime($start), strtotime($end . ' 23:59:59')]];
}
$list = db('kf_rate')->where($where)->paginate(20)->toArray();
if ($list) {
$count = $list['total'];
$data = $list['data'];
}
return json(['code' => 0, 'msg' => '获取成功', 'count' => $count, 'data'=> $data]);
}
$this->assign([
'kf_id' => $kfId
]);
return $this->fetch('getratelist');
}
}

View File

@ -0,0 +1,452 @@
<?php
/**
* 系统控制器
*/
namespace app\admin\controller;
class System extends Base
{
// 自动回复设置
public function reply()
{
if(request()->isPost()){
$param = input('post.');
$param['word'] = htmlentities($param['word']);
if(empty($param['word'])){
return json(['code' => -1, 'data' => '', 'msg' => '回复内容不能为空']);
}
try{
db('reply')->where('id', 1)->update($param);
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
}
$info = db('reply')->where('id', 1)->find();
$this->assign([
'info' => $info,
'status' => config('kf_status')
]);
return $this->fetch();
}
// 客服设置
public function customerService()
{
if(request()->isPost()){
$param = input('post.');
db('kf_config')->where('id', 1)->update($param);
return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
}
$this->assign([
'config' => db('kf_config')->where('id', 1)->find(),
'status' => config('kf_status')
]);
return $this->fetch('customerservice');
}
// 历史会话记录改进
public function wordsLogs()
{
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
// 默认显示最近7天
$start = input('param.start');
$end = input('param.end');
$udb = db('users');
// 平台的客服
$users = $udb->where($this->where)->field('id')->select();
$users_ids = [];
foreach($users as $vo) {
$users_ids[] = "KF{$vo['id']}";
}
$temp = db('chat_log');
$countTmp = db('chat_log');
if(empty($param['kf_id']) && empty($param['user_name'])){
//取出所有有聊天记录的的客服
$result = $temp->where('from_id','LIKE','KF%')
// ->where($this->where)
->field('from_name,from_id,id,to_id')
->group('from_id')
// ->limit($offset, $limit)
->select();
$count = $countTmp->where('from_id','LIKE','KF%')
->field('from_name,from_id,id')
->group('from_id');
$filter = $this->filterUsers($users_ids, $result);
$result = $filter['result'];
// $count = $filter['count'];
}
//取出对应客服的有会话的用户
if(!empty($param['kf_id']) && empty($param['user_name'])){
$result = $temp->where('from_id',$param['kf_id'])
->field('to_name,to_id,id,from_id')
->group('to_id')
->limit($offset, $limit)
->select();
$count = $countTmp->where('from_id',$param['kf_id'])
->field('to_name,to_id,id')
->group('to_id');
$filter = $this->filterUsers($users_ids, $result);
$result = $filter['result'];
// $count = $filter['count'];
}
//取出对应客服和对应用户的历史会话记录
if(!empty($param['user_name']) && !empty($param['kf_id'])){
$result = $temp->where('from_id|to_id',$param['kf_id'])
->where('from_name|to_name',$param['user_name'])
->limit($offset, $limit)
->order('id', 'desc')
->select();
$count = $countTmp->where('from_id|to_id',$param['kf_id'])
->where('from_name|to_name',$param['user_name'])->count();
$filter = $this->filterUsers($users_ids, $result);
$result = $filter['result'];
// $count = $filter['count'];
//转换时间格式
foreach($result as $key=>$vo){
$result[$key]['time_line'] = date('Y-m-d H:i:s', $vo['time_line']);
}
}
$return['total'] = $count; //总数据条数
//搜索对应历史会话记录
if(!empty($param['searchText']) || !empty($start) && !empty($end) && $start <= $end){
//根据对应客服检索对应会话记录
if(!empty($param['searchText']) && empty($start) && empty($end)){
$temp = $temp->where('from_name|to_id', $param['searchText'])->whereOr('to_name', $param['searchText']);
}
//根据时间进行会话记录检索
if(!empty($start) && !empty($end) && $start <= $end){
$temp = $temp->whereBetween('time_line', [strtotime($start), strtotime($end . ' 23:59:59')]);
}
//根据对应时间以及对应客服检索会话记录
if(!empty($start) && !empty($end) && $start <= $end && !empty($param['searchText'])){
$temp = $temp->where('from_name|to_name|', $param['searchText'])->whereBetween('time_line', [strtotime($start), strtotime($end . ' 23:59:59')]);
}
$result = $temp
->limit($offset, $limit)
->order('id', 'desc')
->select();
$filter = $this->filterUsers($users_ids, $result);
$result = $filter['result'];
foreach($result as $key=>$vo){
$result[$key]['time_line'] = date('Y-m-d H:i:s', $vo['time_line']);
}
// $return['total'] = $filter['count']; //总数据条数
$return['total'] = $udb->where($this->where)->count(); //总数据条数
}
$return['rows'] = $result;
return json($return);
}
return $this->fetch('wordslogs');
}
/**
* 过滤聊天记录中客服
* @Parm $user_ids 平台客服
* @Parm $result 结果集合
*/
public function filterUsers($users_ids, $result)
{
$new_result = [];
foreach ($result as $vo) {
if (!in_array($vo['from_id'], $users_ids) && !in_array($vo['to_id'], $users_ids)) continue;
$new_result[] = $vo;
}
$data['result'] = $new_result;
$data['count'] = count($result);
return $data;
}
/**
* 菜单列表
*/
public function menuList()
{
$mdb = db('admin_menus');
// 返回视图
if(!request()->isAjax()) return $this->fetch('system/menuList');
// 分页请求
$param = input('get.');
// 查询条件
//获取总条数
$count = $mdb->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$list = $mdb
->limit($start, $limit)
->order('path asc')
->select();
// 对列表进行处理
foreach ($list as &$vo) {
// 在线状态
$vo['status_name'] = $vo['status'] > 0 ? '正常' : '停用';
}
$result = resultJson(0, '获取成功', $list);
$result['count'] = $count;
return $result;
}
/**
* 添加菜单
*/
public function addMenu()
{
// return;
$mdb = db('admin_menus');
// 返回视图
if(request()->isAjax()) {
$data['name'] = htmlentities(input('post.name'));
$data['pid'] = input('post.pid');
$data['url'] = input('post.url');
$data['sort'] = input('post.sort');
$data['icon'] = input('post.icon');
$data['status'] = 1;
$data['date'] = date("Y-m-d H:i:s");
if (!$data['name']) return resultJson(0, '参数错误');
$save = $mdb->insertGetId($data);
if (!$save) return resultJson(0, '添加失败');
$path = $data['pid'] > 0 ? $data['pid'].'_|_'.$save : $save;
$update = $mdb->where('id', $save)->update(['path' => $path]);
return resultJson(1, '添加成功');
}
$menu_one = $mdb->where('pid', 0)->order('sort')->select();
$this->assign([
'menu_one' => $menu_one,
]);
return $this->fetch('system/addMenu');
}
/**
* 编辑菜单
*/
public function editMenu()
{
$mdb = db('admin_menus');
// 返回视图
if(request()->isAjax()) {
$id = input('post.id');
$data['name'] = htmlentities(input('post.name'));
$data['pid'] = input('post.pid');
$data['url'] = input('post.url');
$data['sort'] = input('post.sort');
$data['icon'] = input('post.icon');
$data['status'] = 1;
// $data = array_filter($data);
if (!$id) return resultJson(0, '参数错误');
$data['path'] = isset($data['pid']) && ($data['pid'] > 0) ? $data['pid'].'_|_'.$id : $id;
$save = $mdb->where('id', $id)->update($data);
if (!$save) return resultJson(0, '保存失败');
return resultJson(1, '成功');
}
$id = input('id');
$menu_one = $mdb->where('pid', 0)->order('sort')->select();
$info = $mdb->find($id);
$this->assign([
'menu_one' => $menu_one,
'info' => $info,
'id' => $id,
]);
return $this->fetch('system/editMenu');
}
/**
* 删除菜单
*/
public function delMenu()
{
$mdb = db('admin_menus');
// 返回视图
if(request()->isAjax()) {
$id = input('post.id');
if (!$id) return resultJson(0, '参数错误');
$save = $mdb->where('id', $id)->delete();
if (!$save) return resultJson(0, '删失败');
return resultJson(1, '成功');
}
}
/**
* 权限列表
*/
public function roleList()
{
$mdb = db('role');
// 返回视图
if(!request()->isAjax()) return $this->fetch('system/roleList');
// 分页请求
$param = input('get.');
// 查询条件
//获取总条数
$count = $mdb->count();
// $count=count($list);
//获取每页显示的条数
$limit = $param['limit'];
//获取当前页数
$page = $param['page'];
//计算出从那条开始查询
$start = ($page-1)*$limit;
$list = $mdb
->limit($start, $limit)
->order('date desc')
->select();
// 对列表进行处理
foreach ($list as &$vo) {
// 在线状态
$vo['status_name'] = $vo['status'] > 0 ? '正常' : '停用';
}
$result = resultJson(0, '获取成功', $list);
$result['count'] = $count;
return $result;
}
/**
* 添加菜单
*/
public function addRole()
{
$pdb = db('role');
$mdb = db('admin_menus');
if(request()->isAjax()) {
$data['name'] = htmlentities(input('post.name'));
$menu_one = isset($_POST['menu_one']) ? $_POST['menu_one'] : [];
$menu_two = isset($_POST['menu_two']) ? $_POST['menu_two'] : [];
if (!is_array($menu_one) || !is_array($menu_two)) return resultJson(0, '参数错误');
$data['menu_id_one'] = implode(',', $menu_one);
$data['menu_id_two'] = implode(',', $menu_two);
$data['status'] = 1;
$data['date'] = date("Y-m-d H:i:s");
if (!$data['name'] || !$data['menu_id_one'] || !$data['menu_id_two']) return resultJson(0, '参数错误');
$save = $pdb->insertGetId($data);
if (!$save) return resultJson(0, '添加失败');
return resultJson(1, '添加成功');
}
$menu_one = $mdb->where('pid', 0)->order('sort')->select();
$menu_two = $mdb->where('pid', '>', 0)->order('sort')->select();
$this->assign([
'menu_one' => $menu_one,
'menu_two' => $menu_two,
]);
return $this->fetch('system/addRole');
}
/**
* 编辑菜单
*/
public function editRole()
{
$pdb = db('role');
$mdb = db('admin_menus');
if(request()->isAjax()) {
$id = input('post.id');
$data['name'] = htmlentities(input('post.name'));
$menu_one = isset($_POST['menu_one']) ? $_POST['menu_one'] : [];
$menu_two = isset($_POST['menu_two']) ? $_POST['menu_two'] : [];
if (!is_array($menu_one) || !is_array($menu_two)) return resultJson(0, '参数错误');
$data['menu_id_one'] = implode(',', $menu_one);
$data['menu_id_two'] = implode(',', $menu_two);
$data['status'] = 1;
$data['date'] = date("Y-m-d H:i:s");
$data = array_filter($data);
if (!$id) return resultJson(0, '参数错误');
$save = $pdb->where('id', $id)->update($data);
if (!$save) return resultJson(0, '保存失败');
return resultJson(1, '成功');
}
$id = input('id');
$menu_one = $mdb->where('pid', 0)->order('sort')->select();
$menu_two = $mdb->where('pid', '>', 0)->order('sort')->select();
$info = $pdb->find($id);
// 检测是否已经选中
$menu_one_arr = explode(',', $info['menu_id_one']);
$menu_two_arr = explode(',', $info['menu_id_two']);
foreach($menu_one as &$vo) {
if(!in_array($vo['id'], $menu_one_arr)) {
$vo['checked'] = false;
continue;
}
$vo['checked'] = true;
}
foreach($menu_two as &$vo) {
if(!in_array($vo['id'], $menu_two_arr)) {
$vo['checked'] = false;
continue;
}
$vo['checked'] = true;
}
$this->assign([
'menu_one' => $menu_one,
'menu_two' => $menu_two,
'info' => $info,
'id' => $id,
]);
return $this->fetch('system/editRole');
}
/**
* 删除菜单
*/
public function delRole()
{
$mdb = db('role');
// 返回视图
if(request()->isAjax()) {
$id = input('post.id');
if (!$id) return resultJson(0, '参数错误');
$save = $mdb->where('id', $id)->delete();
if (!$save) return resultJson(0, '删失败');
return resultJson(1, '成功');
}
}
/**
* 图标
*/
public function icon()
{
header("location:http://www.fontawesome.com.cn/faicons/");
}
}

View File

@ -0,0 +1,82 @@
<?php
/**
* 测试
*/
namespace app\admin\controller;
use Repository\ExcelRepository;
use Repository\ZipRepository;
use think\Controller;
class Test extends Controller
{
public function index()
{
echo "hello world!";
}
/**
* 下载平台的客服聊天记录
* @return array|false|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function downServiceLog()
{
$gdb = db('groups');
$udb = db('users');
$group_id = input('id');
$date = input('date');
if (!$group_id || !$date) return json(resultJson(3, '参数错误'));
$group_info = $gdb->where(['id' => $group_id, 'status' => 1])->field('name')->find();
if (!$group_info) return json(resultJson(2, '平台未找到'));
$users = $udb->where(['group_id' => $group_id, 'status' => 1])->field('id,user_name')->select();
if (!$users) return json(resultJson(2, '暂无客服'));
// 处理平台下客服的聊天记录
foreach($users as $k => $v) {
$day_up = strtotime($date);
$day_down = strtotime($date) + (60 * 60 * 24);
$chat_log = [];
for($i=0; $i < config('chat_table_num'); $i++) {
$log_data = db('chat_log_'.$i)->where("(from_id = 'KF{$v['id']}' or to_id = 'KF{$v['id']}') and (time_line >= {$day_up} and time_line < $day_down)")->select();
if (!$log_data) continue;
foreach ($log_data as $vv) {
$chat_log[] = $vv;
}
}
$filePath = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}/";
if(!is_dir($filePath)) {
if(!mkdir($filePath, 0775, true)) {
return json(resultJson(3, '创建文件夹失败'));
}
}
$title = $v['user_name'].'-'.$date;
$xlsCell = array(
array('from_id','发送方id'),
array('from_name','发送方名字'),
array('to_id','接收方id'),
array('to_name','接收方名字'),
array('content','发送内容'),
array('time_line','发送时间'),
array('is_offline_msg','是否离线消息'),
array('msg_id','消息id'),
);
ExcelRepository::exportExcel($title, $xlsCell, $chat_log, $filePath);
}
$zip_path = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}/";
$zip_to_path = ROOT_PATH."public/uploads/export_service_log/{$group_info['name']}/{$date}.zip";
try{
// 重复压缩,会自动覆盖
$res = ZipRepository::zip($zip_path, $zip_to_path);
if(!$res){
return json(resultJson(0, '下载文件失败'));
}
$down_url = 'http://'.$_SERVER['HTTP_HOST']."/uploads/export_service_log/{$group_info['name']}/{$date}.zip";
return json(resultJson(1, '下载成功', ['url' => $down_url]));
}catch (Exception $e){
return json(resultJson(0, '系统错误', $e->getMessage()));
}
}
}

View File

@ -0,0 +1,447 @@
<?php
/**
* 客服控制器
*/
namespace app\admin\controller;
use Repository\LogRepository;
class Users extends Base
{
// 客服列表
public function index()
{
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
$result = db('users')->where($this->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">';
// 优化显示状态
if(1 == $vo['status']){
$result[$key]['status'] = '<button class="label label-primary" onclick="chageStatus(' . $vo['id'] . ', 2)">启用</button>';
} else {
$result[$key]['status'] = '<button class="label label-danger" onclick="chageStatus(' . $vo['id'] . ', 1)">禁用</button>';
}
// 查询分组
$result[$key]['group'] = '-';
$groups = db('groups')->field('name')->where('id', $vo['group_id'])->find();
if(!empty($groups)){
$result[$key]['group'] = $groups['name'];
}
$result[$key]['kf_type_name'] = $vo['kf_type'] == 1 ? '充值客服' : '聊天客服';
// 所属分组
$organize = db('organize')->field('name')->where('id', $vo['organize_id'])->find();
$result[$key]['organize_name'] = !empty($organize) ? $organize['name'] : '暂无';
//生成支付账号详情按钮
$result[$key]['show_payment'] = $this->makeShowBtn($vo['id']);
// 生成操作按钮
$result[$key]['operate'] = $this->makeBtn($vo['id']);
$result[$key]['user_log'] = $this->makeUserLogBtn($vo['id']);
}
$return['total'] = db('users')->where($this->where)->count(); //总数据
$return['rows'] = $result;
return json($return);
}
return $this->fetch();
}
// 添加客服
public function addUser()
{
$gdb = db('groups');
$odb = db('organize');
if(request()->isPost()){
$param = input('post.');
$param['user_name'] = htmlentities($param['user_name']);
unset($param['file']); // 删除layui头像上传隐藏字段
// 检测头像
if(empty($param['user_avatar'])){
return json(['code' => -1, 'data' => '', 'msg' => '请上传头像']);
}
// 检测客服的限制金额是否为正整数
if(!preg_match("/^[0-9][0-9]*$/",$param['remaining_amount']) && !empty($param['remaining_amount'])){
return json(['code' => -6, 'data' => '', 'msg' => '可充值总额度只能为正整数或为0']);
}
if(empty($param['group_id']) && $this->is_root){
return json(['code' => -4, 'data' => '', 'msg' => '请选择平台']);
} elseif(empty($param['group_id']) && $this->role_name == '平台管理员') {
$param['group_id'] = $this->where['group_id'];
}
// 检测分组
if ($this->role_name == '组长') {
$param['organize_id'] = $this->where['organize_id'];
$organize = $odb->where('id', $this->where['organize_id'])->find();
$param['group_id'] = $organize['group_id'];
}
if (!isset($param['organize_id'])) return resultJson(0, '请选择分组');
// 减去小组的金额
$group = $odb->where('id', $param['organize_id'])->find();
if ($param['remaining_amount'] > $group['money']) return json(['code' => -6, 'data' => '', 'msg' => '分配金额超出分组充值余额']);
$has = db('users')->field('id')->where('user_name', $param['user_name'])->find();
if(!empty($has)){
return json(['code' => -2, 'data' => '', 'msg' => '该客服已经存在']);
}
$rule = "/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/";
if (!preg_match($rule, $param['user_pwd'])) {
return json(['code' => -2, 'data' => '', 'msg' => '密码必须是8-16位的字母和数字组成!']);
}
$param['user_pwd'] = password_hash($param['user_pwd'], PASSWORD_DEFAULT);
$param['online'] = 2; // 离线状态
$param['access_token'] = md5(config('salt').$param['user_name'].$param['user_pwd'].time());
$param['expire_time'] = time()+7*24*60*60;
$param['rate_num'] = random_int(20000,90000);
$param['rank_num'] = 10;
try{
$save = db('users')->insertGetId($param);
$odb->where('id', $param['organize_id'])->setDec('money', $param['remaining_amount']);
$this->saveMoneyFlowLog($group['admin_id'], 'k_' . $save, $param['remaining_amount'], "'{$param['user_name']}'客服分配金额");
}catch(\Exception $e){
return json(['code' => -3, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('系统管理', '添加客服成功');
return json(['code' => 1, 'data' => '', 'msg' => '添加客服成功']);
}
// 客服类型
$kf_type = [
[
'name' => '充值客服',
'value' => 1,
],
[
'name' => '聊天客服',
'value' => 2,
],
];
// 如果是平台管理员获取分组
if ($this->role_name == '平台管理员') {
$organize = $odb->where($this->where)->select();
} else {
$organize = [];
}
$this->assign([
'groups' => db('groups')->select(),
'organize' => $organize,
'status' => config('kf_status'),
'kf_type' => $kf_type,
'is_root' => $this->is_root,
]);
return $this->fetch('adduser');
}
// 编辑客服
public function editUser()
{
$gdb = db('groups');
$odb = db('organize');
$udb = db('users');
if(request()->isAjax()){
$param = input('post.');
$param['user_name'] = htmlentities($param['user_name']);
unset($param['file']); // 删除layui头像上传隐藏字段
if(empty($param['group_id']) && $this->is_root){
return json(['code' => -4, 'data' => '', 'msg' => '请选择平台']);
} elseif(empty($param['group_id']) && $this->role_name == '平台管理员') {
$param['group_id'] = $this->where['group_id'];
}
// 检测分组
if ($this->role_name == '组长') {
$param['organize_id'] = $this->where['organize_id'];
$organize = $odb->where('id', $this->where['organize_id'])->find();
$param['group_id'] = $organize['group_id'];
}
if (!isset($param['organize_id'])) return resultJson(0, '请选择分组');
// 检测客服的限制金额是否为正整数
if(!preg_match("/^[0-9][0-9]*$/",$param['remaining_amount'])){
return json(['code' => -3, 'data' => '', 'msg' => '可充值总额度只能为正整数']);
}
$user = db('users')->where('id', $param['id'])->find();
// 减去平台的金额
$group = $odb->where('id', $param['organize_id'])->find();
$money = $param['remaining_amount'] > $user['remaining_amount'] ? intval($param['remaining_amount'] - $user['remaining_amount']) : 0;
if ($money > $group['money']) return json(['code' => -6, 'data' => '', 'msg' => '分配金额超出组的充值余额']);
// 检测用户修改的用户名是否重复
$has = db('users')->where('user_name', $param['user_name'])->where('id', '<>', $param['id'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该客服已经存在']);
}
// 修改用户头像
if(empty($param['user_avatar'])){
unset($param['user_avatar']);
}
// 修改用户密码
if(empty($param['user_pwd'])){
unset($param['user_pwd']);
}else{
// $param['user_pwd'] = md5($param['user_pwd'] . config('salt'));
$param['user_pwd'] = password_hash($param['user_pwd'], PASSWORD_DEFAULT);
}
$save = db('users')->where('id', $param['id'])->update($param);
if (!$save) return resultJson(0, '保存失败');
if ($money > 0) {
// $odb->where('id', $param['organize_id'])->setDec('money', $money);
// 资金流动记录
$compare = $param['remaining_amount'] > $user['remaining_amount'];
$money = $compare ? $param['remaining_amount'] - $user['remaining_amount'] : abs($param['remaining_amount'] - $user['remaining_amount']);
if ($compare) {
$this->saveMoneyFlowLog($group['admin_id'], 'k_' . $param['id'], $money, "'{$param['user_name']}'客服分配金额");
}
}
LogRepository::write('系统管理', '编辑客服成功');
return json(['code' => 1, 'data' => '', 'msg' => '编辑客服成功']);
}
$id = input('param.id/d');
$info = db('users')->where('id', $id)->find();
// 客服类型
$kf_type = [
[
'name' => '充值客服',
'value' => 1,
],
[
'name' => '聊天客服',
'value' => 2,
],
];
// 如果是平台管理员获取分组
if ($this->role_name == '平台管理员' || $info['group_id']) {
$where = $info['group_id'] ? ['group_id' => $info['group_id']] : $this->where;
$organize = db('organize')->where($where)->select();
} else {
$organize = [];
}
$this->assign([
'info' => $info,
'status' => config('kf_status'),
'groups' => db('groups')->select(),
'kf_type' => $kf_type,
'is_root' => $this->is_root,
'organize' => $organize,
]);
return $this->fetch('edituser');
}
// 删除客服
public function delUser()
{
$gdb = db('groups');
$udb = db('users');
if(request()->isAjax()){
$id = input('param.id/d');
$user = $udb->where('id', $id)->field('remaining_amount, group_id')->find();
try{
$del = $udb->where('id', $id)->delete();
$gdb->where('id', $user['group_id'])->setInc('money', $user['remaining_amount']);
}catch(\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
LogRepository::write('系统管理', '删除客服成功');
return json(['code' => 1, 'data' => '', 'msg' => '删除客服成功']);
}
}
/**
* 启用或禁用客服
*/
public function chageStatus()
{
$gdb = db('groups');
$udb = db('users');
if(request()->isAjax()){
$id = input('param.id');
$type = input('param.type');
try{
$del = $udb->where('id', $id)->update(['status' => $type]);
}catch(\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
$hint = $type == 1 ? '启用' : '禁用';
LogRepository::write('系统管理', $hint . '客服成功');
return json(['code' => 1, 'data' => '', 'msg' => $hint . '客服成功']);
}
}
// 上传客服头像
public function upAvatar()
{
if(request()->isAjax()) {
$file = request()->file('file');
if (!empty($file)) {
$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' . DS . 'avatar');
if ($info) {
$src = config('img_take_prefix').'/uploads/avatar' . '/' . date('Ymd') . '/' . $info->getFilename();
return json(['code' => 0, 'data' => ['src' => $src], 'msg' => 'ok']);
} else {
// 上传失败获取错误信息
return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
}
}
}
}
//获取客服所拥有的支付账号
public function getPayment(){
$id = input('param.id/d');
if(request()->isAjax()) {
$res = db('payment')->alias('a')
->field('a.id,a.account_num,b.type_name')
->join('ws_payment_type b','a.payment_type = b.id')
->where('kf_id',$id)
->where('is_use',1)
->select();
if($res){
$return['rows'] = $res;
return json($return);
}else{
return json(['code' => 0, 'data' => '', 'msg' => '获取支付账号失败']);
}
}
}
// 生成操作按钮
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: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;
}
// 生成支付账号详情按钮
private function makeShowBtn($id)
{
$operate = '<a href="javascript:getPayment(' . $id . ')">';
$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 详情</button></a> ';
return $operate;
}
// 用户操作记录
private function makeUserLogBtn($id)
{
$operate = '<a href="javascript:getUserLog(' . $id . ')">';
$operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 客服操作记录</button></a> ';
return $operate;
}
/**
* 用户操作记录列表
* @return mixed|\think\response\Json
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function user_log_list(){
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
$result = db('user_action_log')->where(['kf_id' => $param['id']])->limit($offset, $limit)->order('id', 'desc')->select();
$ip2region = new \Ip2Region();
foreach($result as $key=>$vo){
$info = $ip2region->btreeSearch($vo['ip']);
$city = explode('|', $info['region']);
if(0 != $info['city_id']){
$result[$key]['ip'] = $city['2'] . $city['3'] .'---'. $city['4'];
}else{
$result[$key]['ip'] = $vo['ip'] . $city['3'] .'---'. $city['4'];
}
$result[$key]['operate'] = "";
// $result[$key]['operate'] = $this->makeBtn($vo['id']);
}
$return['total'] = db('user_action_log')->where(['kf_id' => $param['id']])->count(); //总数据
$return['rows'] = $result;
return json($return);
}
$this->assign([
'id' => input('id'),
]);
return $this->fetch();
}
/**
* 删除用户操作记录
* @return \think\response\Json
*/
public function user_log_del(){
if(request()->isAjax()){
$id = input('param.id/d');
try{
db('user_action_log')->where('id', $id)->delete();
}catch(\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '删除成功']);
}
}
}

View File

@ -0,0 +1,209 @@
<?php
/**
* 平台控制器
*/
namespace app\admin\controller;
use Repository\LogRepository;
class WhiteIp extends Base
{
// 白名单列表
public function index()
{
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
try {
$gdb = db('groups');
$group_id = $gdb->where('admin_id', $this->admin_id)->value('id');
if($this->is_root != true && empty($group_id)){
return json(['code' => -1, 'data' => '', 'msg' => '您没有该权限']);
}
$where = [];
if ($this->is_root != true) {
$where['group_id'] = $group_id;
} else {
if ($param['group_id'] != -1) {
$where['group_id'] = $param['group_id'];
}
}
if ($param['ip']) {
$where['ip'] = trim($param['ip']);
}
$data = db('white_ip')->where($where)->limit($offset, $limit)->order('id desc')->select();
if ($data) {
$admin_id_arr = array_column($data, 'oper');
// 管理员名称
$admin_arr = db('admins')->where('id', 'in', $admin_id_arr)->column('user_name', 'id');
$group_id_arr = array_column($data, 'group_id');
// 平台名称
$group_arr = $gdb->where('id', 'in', $group_id_arr)->column('name', 'id');
foreach($data as $key => $vo){
// 生成操作按钮
$data[$key]['operate'] = $this->makeBtn($vo['id']);
// 管理员名称
$data[$key]['admin_name'] = isset($admin_arr[$vo['oper']]) ? $admin_arr[$vo['oper']] : '--';
// 平台名称
if ($vo['group_id']) {
$data[$key]['group_name'] = isset($group_arr[$vo['group_id']]) ? $group_arr[$vo['group_id']] : '--';
} else {
$data[$key]['group_name'] = '超管';
}
}
}
$return['total'] = db('white_ip')->where($where)->count(); //总数据
$return['rows'] = $data;
return json($return);
} catch (\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
}
$group_info = [];
if ($this->is_root) {
$group_info = db('groups')->where('status', 1)->column('name', 'id');
}
// var_dump($group_info);exit;
$this->assign([
'is_root' => $this->is_root ? 1 : 0,
'group_info' => $group_info,
]);
return $this->fetch();
}
// 添加
public function add_white_ip()
{
if(request()->isPost()){
$param = input('post.');
try{
if ($this->is_root) {
$group_id = $param['group_id'];
} else {
$gdb = db('groups');
$group_id = $gdb->where('admin_id', $this->admin_id)->value('id');
if($this->is_root != true && empty($group_id)){
return json(['code' => -1, 'data' => '', 'msg' => '您没有该权限']);
}
}
$param['ip'] = htmlentities($param['ip']);
$where = ['ip' => $param['ip'], 'group_id' => $group_id];
$db_white_ip = db('white_ip');
$has = $db_white_ip->field('id')->where($where)->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该ip已经存在']);
}
// 先添加平台管理员
$data = [
'ip' => $param['ip'],
'group_id' => $group_id,
'oper' => $this->admin_id,
'create_time' => date('Y-m-d H:i:s'),
];
$add_id = $db_white_ip->insertGetId($data);
if ($add_id) {
LogRepository::write('白名单管理', '添加ip--'.$param['ip']);
// 更新 redis
$this->_update_white_list($group_id);
return json(['code' => 1, 'data' => '', 'msg' => '添加成功']);
}
} catch (\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
}
$group_info = [];
if ($this->is_root) {
$group_info = db('groups')->where('status', 1)->column('name', 'id');
}
$this->assign([
'is_root' => $this->is_root ? 1 : 0,
'group_info' => $group_info,
]);
return $this->fetch('');
}
protected function _update_white_list($group_id)
{
// 更新 redis
$db_white_ip = db('white_ip');
$white_ip = $db_white_ip->where('group_id', $group_id)->column('ip');
$redis = new \Redis();
$redis->connect(config('cache.host'),config('cache.port'));
$redis->auth(config('cache.password'));
$redis->hSet('white_list', $group_id, json_encode($white_ip));
}
// 删除
public function del_white_ip()
{
if(request()->isAjax()){
try{
$id = input('param.id/d');
$db_white_ip = db('white_ip');
$info = $db_white_ip->where('id', $id)->find();
if (!$info) {
return json(['code' => -1, 'data' => '', 'msg' => '该ip已删除']);
}
// 只允许超管和平台管理员删除
if (!$this->is_root) {
if ($this->role_name == '平台管理员') {
// 查看是否有权限删除
$group_id = db('groups')->where('admin_id', $this->admin_id)->value('id');
if ($group_id != $info['group_id']) {
return json(['code' => -1, 'data' => '', 'msg' => '您无权限不可删除该ip']);
}
} else {
return json(['code' => -2, 'data' => '', 'msg' => '您无权限不可删除该ip']);
}
}
$res = $db_white_ip->where('id', $id)->delete();
if ($res) {
LogRepository::write('白名单管理', '平台id'.$info['group_id'].',删除的ip--' . $info['ip']);
// 更新 redis
$this->_update_white_list($info['group_id']);
return json(['code' => 1, 'data' => '', 'msg' => '删除成功']);
}
} catch (\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => -1, 'data' => '', 'msg' => '删除失败']);
}
}
// 生成按钮
private function makeBtn($id)
{
$operate = '';
// if ($this->is_root) {
$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 .= '<a href="' . url('groups/manageUser') . '">';
//$operate .= '<button type="button" class="btn btn-info btn-sm"><i class="fa fa-user-plus"></i> 管理组员</button></a>';
return $operate;
}
}

View File

@ -0,0 +1,183 @@
<?php
/**
* 文本控制器
*/
namespace app\admin\controller;
class Words extends Base
{
// 常用语列表
public function index()
{
if(request()->isAjax()){
$param = input('param.');
$limit = $param['pageSize'];
$offset = ($param['pageNumber'] - 1) * $limit;
$where = [];
if (!empty($param['searchText'])) {
$where['content'] = $param['searchText'];
}
$result = db('words')->where($where)->where($this->where)->limit($offset, $limit)->order('add_time desc')->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>';
}
// 所属分组
$organize = db('organize')->field('name')->where('id', $vo['organize_id'])->find();
$result[$key]['organize_name'] = !empty($organize) ? $organize['name'] : '暂无';
// 生成操作按钮
$result[$key]['operate'] = $this->makeBtn($vo['id']);
$platform = db('groups')->where('id', $vo['group_id'])->field('name')->find();
$result[$key]['platform_name'] = isset($platform['name']) ? $platform['name'] : '暂无';
}
$return['total'] = db('words')->where($where)->where($this->where)->count(); //总数据
$return['rows'] = $result;
return json($return);
}
return $this->fetch();
}
// 添加常用语
public function addWord()
{
if(request()->isPost()){
$param = input('post.');
$param['content'] = htmlentities(trim($param['content']));
// 检测分组
if ($this->role_name == '组长') {
$param['organize_id'] = $this->where['organize_id'];
$organize = db('organize')->where('id', $this->where['organize_id'])->find();
$param['group_id'] = $organize['group_id'];
} else {
$param['group_id'] = $this->where['group_id'];
}
if (!isset($param['organize_id'])) return resultJson(0, '请选择分组');
$has = db('words')->field('id')
->where('content', '=', $param['content'])
->where('group_id', '=', $param['group_id'])
->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该常用语已经存在']);
}
$param['add_time'] = date('Y-m-d H:i:s');
try{
db('words')->insert($param);
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '添加常用语成功']);
}
// 如果是平台管理员获取分组
if ($this->role_name == '平台管理员') {
$organize = db('organize')->where($this->where)->select();
} else {
$organize = [];
}
$this->assign([
'status' => config('kf_status'),
'organize' => $organize,
]);
return $this->fetch('addword');
}
// 编辑常用语
public function editWord()
{
if(request()->isAjax()){
$param = input('post.');
$param['content'] = htmlentities(trim($param['content']));
// 检测用户修改的常用语是否重复
$has = db('words')->where('content', $param['content'])->where('id', '<>', $param['id'])->find();
if(!empty($has)){
return json(['code' => -1, 'data' => '', 'msg' => '该常用语已经存在']);
}
// 检测分组
if ($this->role_name == '组长') {
$param['organize_id'] = $this->where['organize_id'];
$organize = db('organize')->where('id', $this->where['organize_id'])->find();
$param['group_id'] = $organize['group_id'];
}
if (!isset($param['organize_id'])) return resultJson(0, '请选择分组');
try{
db('words')->where('id', $param['id'])->update($param);
}catch(\Exception $e){
return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '编辑常用语成功']);
}
$id = input('param.id/d');
$info = db('words')->where('id', $id)->find();
// 如果是平台管理员获取分组
if ($this->role_name == '平台管理员' || $info['group_id']) {
$where = $info['group_id'] ? ['group_id' => $info['group_id']] : $this->where;
$organize = db('organize')->where($where)->select();
} else {
$organize = [];
}
$this->assign([
'info' => $info,
'status' => config('kf_status'),
'organize' => $organize,
]);
return $this->fetch('editword');
}
// 删除常用语
public function delWord()
{
if(request()->isAjax()){
$id = input('param.id/d');
try{
db('words')->where('id', $id)->delete();
}catch(\Exception $e){
return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
}
return json(['code' => 1, 'data' => '', 'msg' => '删除常用语成功']);
}
}
// 生成按钮
private function makeBtn($id)
{
$operate = '';
if (!$this->is_root) {
$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 .= '<a href="javascript:userDel(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
$operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
return $operate;
}
}

View File

@ -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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('admins/addadmin')}">
<div class="form-group">
<label class="col-sm-3 control-label">管理员名称:</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="password" type="text" class="form-control" name="password" required="" aria-required="true">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">角色:</label>
<!-- <input type="hidden" id="pid" name="pid" /> -->
<div class="input-group col-sm-4 layui-form">
<select name="role" aria-required="true">
<option value="">请选择</option>
{foreach name="role" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
</select>
</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 1}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>
</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 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>

View File

@ -0,0 +1,140 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('admins/editadmin')}">
<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">
<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="password" type="text" class="form-control" name="password" placeholder="重新输入则为修改">
</div>
</div>
{if condition="$is_root eq true"}
<div class="form-group">
<label class="col-sm-3 control-label">角色:</label>
<!-- <input type="hidden" id="pid" name="pid" /> -->
<div class="input-group col-sm-4 layui-form">
<select name="role" aria-required="true" disabled>
<option value="">请选择</option>
{foreach name="role" item="vo"}
<option value="{$vo['id']}" {if condition="$vo['id'] eq $role_info['role_id']"}selected{/if}>{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<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 $info['status']}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>
</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 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>

View File

@ -0,0 +1,113 @@
<!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="__FONT__/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">
<!--搜索框开始-->
<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="user_name">管理员名称</th>
<th data-field="role_name">角色名称</th>
<th data-field="platform_name">所属平台</th>
<th data-field="last_login_ip">上次登录ip</th>
<th data-field="last_login_time">上次登录时间</th>
<th data-field="status">状态</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('admins/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: false, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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);
});
</script>
</body>
</html>

View File

@ -0,0 +1,233 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>列表</title>
</head>
<link href="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<style>
.layui-table-cell {
height: auto !important;
}
.search-tool {
height: 38px;
line-height: 38px;
}
.search-tool span {
float: left;
}
.search-tool input {
width: 70%;
}
.layui-table-view {
margin-top: 55px !important;
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>选择会话客户</h5>
<a style="float: right; color:#0080ff;" onclick="javascript:window.history.go(0);">刷新</a>
</div>
<div class="ibox-content">
<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_time" placeholder="开始日期"> --
<input type="text" class="form-control" id="end_time" placeholder="结束日期">
</div>
&nbsp;&nbsp;
<div class="form-group">
<label>名称或id</label>
<input type="text" class="form-control" id="search_input" name="search_input"
placeholder="名称或id">
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" style="margin-top:5px" id="search"
data-type="reload">
<strong>搜 索</strong>
</button>
</div>
</div>
</form>
<table id="list" lay-filter="test" class="layui-hide"></table>
</div>
</div>
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<!-- 列表操作 -->
<script type="text/html" id="sonWindow">
<a onclick="openWindow('会话记录', '/Admin/Dialoguelogs/offLineDialogueRoom?id={{d.id}}&kf_id={$id}', '95%', '90%')" class="layui-table-link">{{d.user_name}}</a>
</script>
<script type="text/html" id="sonWindow_id">
<a onclick="openWindow('会话记录', '/Admin/Dialoguelogs/offLineDialogueRoom?id={{d.id}}&kf_id={$id}', '95%', '90%')" class="layui-table-link">{{d.user_id}}</a>
</script>
<script>
var layer;
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('table', function () {
let table = layui.table;
// 加载列表
table.render({
elem: '#list',
url: "{:url('Dialoguelogs/dialogueList')}",
where: {
search_input: '',
id: "{$id}",
},
page: { //支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
//,curr: 5 //设定初始在第 5 页
,
limit: 15 //一页显示多少条
,
limits: [15, 20, 25, 30, 40, 50, 100] //每页条数的选择项
,
groups: 5 //只显示 2 个连续页码
,
first: "首页" //不显示首页
,
last: "尾页" //不显示尾页
},
cols: [
[
{
field: 'user_id',
title: 'id',
align: 'center',
templet: '#sonWindow_id',
sort: true,
width: '10%',
},
{
field: 'user_name',
title: '客户名称',
align: 'left',
sort: false,
templet: '#sonWindow',
width: '90%',
}
]
],
text: {
none: '暂无相关数据', //默认:无数据。
},
id: 'testReload'
});
// 重载列表
var $ = layui.$,
active = {
reload: function () {
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
//执行重载
table.reload('testReload', {
url: "{:url('Dialoguelogs/dialogueList')}",
method: 'get',
page: {
curr: 1 //重新从第 1 页开始
},
where: {
start_time: start_time,
end_time: end_time,
search_input: search_input,
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
// 搜索条件
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
if (!start_time && !end_time && !search_input) {
// layer.msg('搜索条件不能为空');
// return;
}
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on("tool(test)", function (obj) {
var data = obj.data;
console.log(data);
var total = $('.layui-laypage-count').text();
if (obj.event === 'edit') {
// 打开对话窗口
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/System/editMenu/?id=" + data.id,
});
} else if (obj.event === 'del') {
layer.confirm('确定删除吗?', function (index) {
$.post('/admin/System/delMenu', {
id: data.id
}, function (res) {
console.log(res);
if (res.code == 1) {
// 更改统计数
var total = $('.layui-laypage-count').text();
total = total.substring(2, 3) - 1;
$('.layui-laypage-count').text('共 ' + total + ' 条');
obj.del();
layer.close(index);
} else {
layer.msg(res.msg);
}
});
});
}
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
});
function openWindow(title, url, w = "100%", h = "100%") {
console.log(title);
layer.open({
type: 2,
title: title,
content: url,
area: [w, h],
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,226 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>列表</title>
</head>
<link href="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<style>
.layui-table-cell {
height: auto !important;
}
.search-tool {
height: 38px;
line-height: 38px;
}
.search-tool span {
float: left;
}
.search-tool input {
width: 70%;
}
.layui-table-view {
margin-top: 55px !important;
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>选择客服</h5>
<a style="float: right; color:#0080ff;" onclick="javascript:window.history.go(0);">刷新</a>
</div>
<div class="ibox-content">
<form id='commentForm' role="form" method="post" class="form-inline pull-right">
<div class="content clearfix m-b">
<div class="form-group">
<label>名称或id</label>
<input type="text" class="form-control" id="search_input" name="search_input" placeholder="名称或id">
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" style="margin-top:5px" id="search"
data-type="reload">
<strong>搜 索</strong>
</button>
</div>
</div>
</form>
<table id="list" lay-filter="test" class="layui-hide"></table>
</div>
</div>
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<!-- 列表操作 -->
<script type="text/html" id="sonWindow">
<a onclick="openWindow('会话客户', '/Admin/Dialoguelogs/dialogueList?id={{d.id}}', '95%', '90%')" class="layui-table-link">{{d.user_name}}</a>
</script>
<script type="text/html" id="sonWindow_id">
<a onclick="openWindow('会话客户', '/Admin/Dialoguelogs/dialogueList?id={{d.id}}', '95%', '90%')" class="layui-table-link">{{d.id}}</a>
</script>
<script>
var layer;
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('table', function () {
let table = layui.table;
// 加载列表
table.render({
elem: '#list',
url: "{:url('Dialoguelogs/index')}",
where: {
search_input: '',
},
page: { //支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
//,curr: 5 //设定初始在第 5 页
,
limit: 15 //一页显示多少条
,
limits: [15, 20, 25, 30, 40, 50, 100] //每页条数的选择项
,
groups: 5 //只显示 2 个连续页码
,
first: "首页" //不显示首页
,
last: "尾页" //不显示尾页
},
cols: [
[
{
field: 'id',
title: 'id',
align: 'center',
sort: true,
templet: '#sonWindow_id',
width: '5%',
},
{
field: 'user_name',
title: '客服名称',
align: 'left',
sort: false,
templet: '#sonWindow',
width: '95%',
}
]
],
text: {
none: '暂无相关数据', //默认:无数据。
},
id: 'testReload'
});
// 重载列表
var $ = layui.$,
active = {
reload: function () {
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
//执行重载
table.reload('testReload', {
url: "{:url('Dialoguelogs/index')}",
method: 'get',
page: {
curr: 1 //重新从第 1 页开始
},
where: {
start_time: start_time,
end_time: end_time,
search_input: search_input,
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
// 搜索条件
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
if (!start_time && !end_time && !search_input) {
// layer.msg('搜索条件不能为空');
// return;
}
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on("tool(test)", function (obj) {
var data = obj.data;
console.log(data);
var total = $('.layui-laypage-count').text();
if (obj.event === 'edit') {
// 打开对话窗口
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/System/editMenu/?id=" + data.id,
});
} else if (obj.event === 'del') {
layer.confirm('确定删除吗?', function (index) {
$.post('/admin/System/delMenu', {
id: data.id
}, function (res) {
console.log(res);
if (res.code == 1) {
// 更改统计数
var total = $('.layui-laypage-count').text();
total = total.substring(2, 3) - 1;
$('.layui-laypage-count').text('共 ' + total + ' 条');
obj.del();
layer.close(index);
} else {
layer.msg(res.msg);
}
});
});
}
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
laydate.render({
elem: '#start_time',
type: 'date'
});
laydate.render({
elem: '#end_time',
type: 'date'
});
});
function openWindow(title, url, w = "100%", h = "100%") {
console.log(title);
layer.open({
type: 2,
title: title,
content: url,
area: [w, h],
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,255 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>聊天记录对话</title>
<link rel="stylesheet" href="/static/service/js/layui/css/layui.css">
<link rel="stylesheet" href="/static/service/css/mylink.css?version=20190814">
</head>
<style>
/* .wexin-class{
background: red;
} */
.layui-form-label {
padding: 9px 0px;
width: 70px;
}
.layui-input-block {
margin-left: 75px;
}
.del_offline {
float: right;
margin-right: 5px;
width: 15px;
height: 15px;
border-radius: 50%;
text-align: center;
line-height: 15px;
background-color: #aaa;
color: #eee;
}
.fold {
transform: none;
}
.unfold {
transform: rotate(270deg);
}
.layui-body {
left: 0;
}
</style>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
<div class="layui-body" style="bottom:0;top:0;">
<input type="hidden" id="active-user" data-avatar="{$user['user_avatar']}" data-name="{$user['user_name']}"
data-id="{$user['user_id']}"><!-- 当前对话的用户 -->
<div class="chat-left" style="width: 100%; height: 100%; ">
<div class="chat-box mylink-chat-main" style="width: 98%; height: 100%; ">
</div>
</div>
</div>
</div>
</div>
<!-- 转接提示层 -->
<div class="layui-form" id="change-box" style="display: none">
<div class="layui-form-item" style="margin-top: 20px">
<label class="layui-form-label">选择分组</label>
<div class="layui-input-block" style="width: 70%">
<select lay-verify="required" lay-filter="group">
<option value=""></option>
{if !empty($groups)}
{foreach name="groups" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
</div>
<!-- 转接提示层 -->
<!-- 支付账号提示层 -->
<div class="layui-form" id="account-box" style="display: none">
<div class="layui-form-item" style="margin-top: 20px">
<div style="padding-top: 15px">
<label class="layui-form-label">支付类型</label>
<div class="layui-input-block" style="width: 70%;">
<select lay-verify="required" lay-filter="type" id="type" name="type">
<option value=""></option>
{if !empty($type)}
{foreach name="type" item="vo"}
<option value="{$vo['id']}">{$vo['type_name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
<div style="padding-top: 15px;margin-top:30px;">
<label class="layui-form-label">支付账号</label>
<div class="layui-input-block" style="width: 70%;">
<select lay-filter="group" id="payment" name="payment">
</select>
</div>
</div>
<div style="padding-top: 15px;margin-top:30px;">
<div class="layui-input-block" style="width: 70%;text-align:center;">
<button class="layui-btn" lay-submit lay-filter="changePayment">确定</button>
</div>
</div>
</div>
</div>
<!-- 支付账号提示层 -->
<!--商品渲染模板-->
<script id="goods_tpl" type="text/html">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>商品信息</legend>
</fieldset>
<div class="order-alone-li lastset_cm" >
<table width="100%" border="" cellspacing="" cellpadding="">
<tbody>
<tr class="time_or">
<td>
<div class="fl_ttmm">
<p>
<span class="time-num">商品id<em class="num">{{ d.goods_id }}</em></span>
<span style="float: right;"><a href="{{ d.url }}" target="_blank">查看详情</a></span>
</p>
</div>
<div class="fr_ttmm"></div>
</td>
</tr>
<tr class="conten_or">
<td class="sx1">
<div class="shop-if-dif">
<div class="shop-difimg">
<img src="{{ d.thumb }}" width="60" height="60">
</div>
<div class="shop_name">
<a href="{{ d.url }}" target="_blank">{{ d.goods_name }}</a>
<p><span>市场价格:</span><span></span><span>{{ d.market_price }}</span></p>
<p style="color: red;"><span>本店价格:</span><span></span><span>{{ d.shop_price }}</span></p>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</script>
<!--订单渲染模板-->
<script id="order_tpl" type="text/html">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>订单信息</legend>
</fieldset>
<div class="order-alone-li lastset_cm" >
<table width="100%" border="" cellspacing="" cellpadding="">
<tbody>
<tr class="time_or">
<td>
<div class="fl_ttmm">
<p>
<span class="time-num">下单时间:<em class="num">{{ d.info.add_time }}</em></span>
</p>
<p>
<span class="time-num">订单编号:<em class="num">{{ d.info.order_sn }}</em></span>
</p>
</div>
<div class="fr_ttmm"></div>
</td>
</tr>
{{# layui.each(d.list, function(index, item){ }}
<tr class="conten_or">
<td class="sx1">
<div class="shop-if-dif">
<div class="shop-difimg">
<img src="{{ item.thumb }}" width="60" height="60">
</div>
<div class="shop_name">
<a href="{{ item.url }}" target="_blank">{{ item.goods_name }}</a>
<p>规格:{{ item.spec_key_name }}</p>
<p>
<span>实际价格:</span><span></span><span>{{ item.final_price }}</span>
<span>商城价格:</span><span></span><span>{{ item.goods_price }}</span>
<span>成本价格:</span><span></span><span>{{ item.cost_price }}</span>
</p>
</div>
</div>
</td>
</tr>
{{# }); }}
<tr class="time_or">
<td>
<div class="fl_ttmm">
<span class="time-num">订单价格:<em class="num">¥{{ d.info.total_amount }}</em></span>
<span class="time-num">含运费:<em class="num">¥{{ d.info.shipping_price }}</em></span>
<span class="time-num">应付金额:<em class="num">¥{{ d.info.order_amount }}</em></span>
<span class="time-num">订单状态:<em>{{ d.info.order_status }}</em></span>
<span class="time-num">发货状态:<em>{{ d.info.shipping_status }}</em></span>
<span class="time-num">支付状态:<em>{{ d.info.pay_status }}</em></span>
</div>
<div class="fr_ttmm"></div>
</td>
</tr>
</tbody>
</table>
</div>
</script>
<script src="/static/service/js/jquery-1.9.0.min.js"></script>
<script src="/static/service/js/layui/layui.js"></script>
<script src="/static/common/js/indexedDB.js"></script>
<script>
var uid = "{$uinfo['id']}";
var kf_id = "{$kf_id}";
var uname = "{$uinfo['user_name']}";
var avatar = "{$uinfo['user_avatar']}";
var group = "{$uinfo['group_id']}";
var token = '{$token}';
var user_status = '{$user_status}';
// 选择账号类型
var select_pay_type = false;
</script>
<script type="text/javascript" src="/static/service/js/functions.js"></script>
<!-- <script type="text/javascript" src="/static/service/js/dialogue.js"></script> -->
<script type="text/javascript" src="/static/service/js/dialogue_admin.js"></script>
</body>
</html>

View File

@ -0,0 +1,217 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>列表</title>
</head>
<link href="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<style>
.layui-table-cell {
height: auto !important;
}
.search-tool {
height: 38px;
line-height: 38px;
}
.search-tool span {
float: left;
}
.search-tool input {
width: 70%;
}
.layui-table-view {
/* margin-top: 55px !important; */
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>出账列表</h5>
<a style="float: right; color:#0080ff;" onclick="javascript:window.history.go(0);">刷新</a>
<div class="ibox-content">
<table id="list" lay-filter="test" class="layui-hide"></table>
</div>
</div>
</div>
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<!-- 列表操作 -->
<script type="text/html" id="operation">
<!-- <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" onclick="javascript:;">删除</a> -->
</script>
<script>
var layer;
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('table', function () {
let table = layui.table;
// 加载列表
table.render({
elem: '#list',
url: "{:url('Finance/expenditureList')}",
page: { //支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
//,curr: 5 //设定初始在第 5 页
,
limit: 10 //一页显示多少条
,
limits: [10, 20, 25, 30, 40, 50, 100] //每页条数的选择项
,
groups: 5 //只显示 2 个连续页码
,
first: "首页" //不显示首页
,
last: "尾页" //不显示尾页
},
cols: [
[
{
field: 'id',
title: 'id',
align: 'center',
sort: true
},
{
field: 'type_name',
title: '类型',
align: 'center',
sort: false
},
{
field: 'money',
title: '金额',
align: 'center',
sort: false
},
{
field: 'msg',
title: '交易信息',
align: 'center',
sort: false
},
{
field: 'date',
title: '日期',
align: 'center',
sort: true
},
]
],
text: {
none: '暂无相关数据', //默认:无数据。
},
id: 'testReload'
});
// 重载列表
var $ = layui.$,
active = {
reload: function () {
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
//执行重载
table.reload('testReload', {
url: "{:url('Finance/incomeList')}",
method: 'get',
page: {
curr: 1 //重新从第 1 页开始
},
where: {
start_time: start_time,
end_time: end_time,
search_input: search_input,
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
// 搜索条件
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
if (!start_time && !end_time && !search_input) {
// layer.msg('搜索条件不能为空');
// return;
}
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on("tool(test)", function (obj) {
var data = obj.data;
console.log(data);
var total = $('.layui-laypage-count').text();
if (obj.event === 'edit') {
// 打开对话窗口
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/System/editMenu/?id=" + data.id,
});
} else if (obj.event === 'del') {
layer.confirm('确定删除吗?', function (index) {
$.post('/admin/System/delMenu', {
id: data.id
}, function (res) {
console.log(res);
if (res.code == 1) {
// 更改统计数
var total = $('.layui-laypage-count').text();
total = total.substring(2, 3) - 1;
$('.layui-laypage-count').text('共 ' + total + ' 条');
obj.del();
layer.close(index);
} else {
layer.msg(res.msg);
}
});
});
}
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
laydate.render({
elem: '#start_time',
type: 'date'
});
laydate.render({
elem: '#end_time',
type: 'date'
});
});
function openWindow(title, url, w = "100%", h = "100%") {
layer.open({
type: 2,
title: title,
content: url,
area: [w, h],
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,217 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>列表</title>
</head>
<link href="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<style>
.layui-table-cell {
height: auto !important;
}
.search-tool {
height: 38px;
line-height: 38px;
}
.search-tool span {
float: left;
}
.search-tool input {
width: 70%;
}
.layui-table-view {
/* margin-top: 55px !important; */
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>入账列表</h5>
<a style="float: right; color:#0080ff;" onclick="javascript:window.history.go(0);">刷新</a>
</div>
<div class="ibox-content">
<table id="list" lay-filter="test" class="layui-hide"></table>
</div>
</div>
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<!-- 列表操作 -->
<script type="text/html" id="operation">
<!-- <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" onclick="javascript:;">删除</a> -->
</script>
<script>
var layer;
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('table', function () {
let table = layui.table;
// 加载列表
table.render({
elem: '#list',
url: "{:url('Finance/incomeList')}",
page: { //支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
//,curr: 5 //设定初始在第 5 页
,
limit: 10 //一页显示多少条
,
limits: [10, 20, 25, 30, 40, 50, 100] //每页条数的选择项
,
groups: 5 //只显示 2 个连续页码
,
first: "首页" //不显示首页
,
last: "尾页" //不显示尾页
},
cols: [
[
{
field: 'id',
title: 'id',
align: 'center',
sort: true
},
{
field: 'type_name',
title: '类型',
align: 'center',
sort: false
},
{
field: 'money',
title: '金额',
align: 'center',
sort: false
},
{
field: 'msg',
title: '交易信息',
align: 'center',
sort: false
},
{
field: 'date',
title: '日期',
align: 'center',
sort: true
},
]
],
text: {
none: '暂无相关数据', //默认:无数据。
},
id: 'testReload'
});
// 重载列表
var $ = layui.$,
active = {
reload: function () {
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
//执行重载
table.reload('testReload', {
url: "{:url('Finance/incomeList')}",
method: 'get',
page: {
curr: 1 //重新从第 1 页开始
},
where: {
start_time: start_time,
end_time: end_time,
search_input: search_input,
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
// 搜索条件
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
if (!start_time && !end_time && !search_input) {
// layer.msg('搜索条件不能为空');
// return;
}
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on("tool(test)", function (obj) {
var data = obj.data;
console.log(data);
var total = $('.layui-laypage-count').text();
if (obj.event === 'edit') {
// 打开对话窗口
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/System/editMenu/?id=" + data.id,
});
} else if (obj.event === 'del') {
layer.confirm('确定删除吗?', function (index) {
$.post('/admin/System/delMenu', {
id: data.id
}, function (res) {
console.log(res);
if (res.code == 1) {
// 更改统计数
var total = $('.layui-laypage-count').text();
total = total.substring(2, 3) - 1;
$('.layui-laypage-count').text('共 ' + total + ' 条');
obj.del();
layer.close(index);
} else {
layer.msg(res.msg);
}
});
});
}
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
laydate.render({
elem: '#start_time',
type: 'date'
});
laydate.render({
elem: '#end_time',
type: 'date'
});
});
function openWindow(title, url, w = "100%", h = "100%") {
layer.open({
type: 2,
title: title,
content: url,
area: [w, h],
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,139 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('groups/addgroup')}">
<div class="form-group">
<label class="col-sm-3 control-label">平台名称:</label>
<div class="input-group col-sm-4">
<input class="form-control" name="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="username" type="text" class="form-control" name="user_name" required="" placeholder="字母或字母加数字名称" 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="password" type="text" class="form-control" name="password" 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">
<span></span>
<input type="number" class="form-control" name="money" placeholder="整个平台所能使用的总金额"/>
</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 1}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>
</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 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>

View File

@ -0,0 +1,175 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('groups/editgroup')}">
<input type="hidden" name="id" value="{$info['id']}"/>
<div class="form-group">
<label class="col-sm-3 control-label">平台名称:</label>
<div class="input-group col-sm-4">
<input class="form-control" name="name" required="" aria-required="true" value="{$info['name']}"/>
</div>
</div>
{if condition="$is_root eq true"}
<div class="form-group">
<label class="col-sm-3 control-label">平台管理员:</label>
<div class="input-group col-sm-4 layui-form">
<select name="admin_id" disabled>
<option value="0">请选择</option>
{foreach name="admin" item="vo"}
<option value="{$vo['id']}" {if condition="$vo['id'] eq $info['admin_id']"}selected {/if}>{$vo['user_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">分配金额(元)</label>
<div class="input-group col-sm-4">
<span></span>
<input type="text" class="form-control" name="money" placeholder="整个平台所能使用的总金额" value="{$info['money']}"/>
</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 $info['status']}checked{/if}>
{/foreach}
{/if}
</div>
</div>
{/if}
<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="kf_sort" value="{$key}" title="{$vo}" {if $key eq $info['kf_sort']}checked{/if}>
{/foreach}
{/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($recharge_gift_type)}
<select name="recharge_gift_type">
{foreach name="recharge_gift_type" item="vo" key="key"}
<option value="{$key}" {if condition="$key eq $info['recharge_gift_type']"}selected {/if}>{$vo}</option>
{/foreach}
</select>
{/if}
</div>
</div>
<div class="form-group layui-form-item">
<label class="col-sm-3 control-label">充值赠送值:</label>
<div class="input-group col-sm-4">
{if !empty($recharge_gift_type)}
<span></span>
<input type="text" class="form-control" name="recharge_gift_value" placeholder="充值赠送类型对应的数值" value="{$info['recharge_gift_value']}"/>
{/if}
</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>
</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 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>

View File

@ -0,0 +1,133 @@
<!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="__FONT__/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">
<!--搜索框开始-->
<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="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="users_num">客服人数</th>
<th data-field="admin_name">管理员</th>
<th data-field="money">充值余额</th>
<th data-field="recharge_gift_type">充值赠送类型</th>
<th data-field="recharge_gift_value">充值赠送值</th>
<th data-field="status">平台状态</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('groups/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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 userGroup(id){
layer.confirm('确认删除此平台?', {icon: 3, title:'提示'}, function(index){
//do something
$.getJSON("{:url('groups/delGroup')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,445 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="renderer" content="webkit">
<meta http-equiv="Cache-Control" content="no-siteapp"/>
<title>{$version}管理后台</title>
<meta name="keywords" content="">
<meta name="description" content="">
<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;ie.html"/>
<![endif]-->
<link rel="shortcut icon" href="favicon.ico">
<link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="__FONT__/font-awesome.min.css?v=4.4.0" 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/layui.css" rel="stylesheet">
</head>
<body class="fixed-sidebar full-height-layout gray-bg" style="overflow:hidden">
<div id="wrapper">
<!--左侧导航开始-->
<nav class="navbar-default navbar-static-side" role="navigation">
<div class="nav-close"><i class="fa fa-times-circle"></i>
</div>
<div class="sidebar-collapse">
<ul class="nav" id="side-menu">
<li class="nav-header">
<div class="dropdown profile-element">
<span><img alt="image" class="img-circle" src="{$admin_img}" width="64px" height="70px"/></span>
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<span class="clear">
<span class="block m-t-xs"><strong class="font-bold">{$admin_name}</strong></span>
<span class="text-muted text-xs block">{$role_name}<b class="caret"></b></span>
</span>
</a>
<ul class="dropdown-menu animated fadeInRight m-t-xs">
<li>
<a href="javascript:changeImg()">修改头像</a>
</li>
<li>
<a href="javascript:change()">修改密码</a>
</li>
{if condition="$is_root neq true"}
<li>
<a href="javascript:balance({$pay_money})">充值余额</a>
</li>
{/if}
<li>
<a href="{:url('admin/login/loginOut')}">安全退出</a>
</li>
</ul>
</div>
<div class="logo-element">AD
</div>
</li>
<!-- 菜单开始 -->
{include file="/menu" /}
<!-- 菜单结束 -->
</ul>
</div>
</nav>
<!--左侧导航结束-->
<!--右侧部分开始-->
<div id="page-wrapper" class="gray-bg dashbard-1">
<div class="row border-bottom">
<nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="#">
<i class="fa fa-bars"></i>
</a>
</div>
<ul class="nav navbar-top-links navbar-right">
<li class="hidden-xs">
<a class="J_menuItem" id="clear"><i class="fa fa-trash"></i>
清理缓存
</a>
</li>
<li class="dropdown hidden-xs">
<a class="right-sidebar-toggle" aria-expanded="false">
<i class="fa fa-tasks"></i> 主题
</a>
</li>
</ul>
</nav>
</div>
<div class="row content-tabs">
<button class="roll-nav roll-left J_tabLeft">
<i class="fa fa-backward"></i>
</button>
<nav class="page-tabs J_menuTabs">
<div class="page-tabs-content">
<a href="javascript:;" class="active J_menuTab" data-id="index_v1.html">首页</a>
</div>
</nav>
<button class="roll-nav roll-right J_tabRight"><i class="fa fa-forward"></i>
</button>
<div class="btn-group roll-nav roll-right">
<button class="dropdown J_tabClose" data-toggle="dropdown">常用操作<span class="caret"></span>
</button>
<ul role="menu" class="dropdown-menu dropdown-menu-right">
<li class="J_tabGo"><a>前进</a>
</li>
<li class="J_tabBack"><a>后退</a>
</li>
<li class="J_tabFresh"><a>刷新</a>
</li>
<li class="divider"></li>
<li class="J_tabShowActive"><a>定位当前选项卡</a>
</li>
<li class="divider"></li>
<li class="J_tabCloseAll"><a>关闭全部选项卡</a>
</li>
<li class="J_tabCloseOther"><a>关闭其他选项卡</a>
</li>
</ul>
</div>
<a href="{:url('admin/login/loginOut')}" class="roll-nav roll-right J_tabExit">
<i class="fa fa fa-sign-out"></i>
退出
</a>
</div>
<div class="row J_mainContent" id="content-main">
<iframe class="J_iframe" name="iframe0" width="100%" height="100%"
src="{:url('Index/indexPage')}" frameborder="0"
data-id="index_v1.html" seamless></iframe>
</div>
<div class="footer">
<div class="pull-right">&copy; 2019-2021 {$version} <a href="#" target="_blank">客服系统</a>
</div>
</div>
</div>
<!--右侧部分结束-->
<!--右侧边栏开始-->
<div id="right-sidebar">
<div class="sidebar-container">
<ul class="nav nav-tabs navs-3">
<li class="active">
<a data-toggle="tab" href="#tab-1">
<i class="fa fa-gear"></i> 主题
</a>
</li>
</ul>
<div class="tab-content">
<div id="tab-1" class="tab-pane active">
<div class="sidebar-title">
<h3> <i class="fa fa-comments-o"></i> 主题设置</h3>
<small><i class="fa fa-tim"></i> 你可以从这里选择和预览主题的布局和样式,这些设置会被保存在本地,下次打开的时候会直接应用这些设置。</small>
</div>
<div class="skin-setttings">
<div class="title">主题设置</div>
<div class="setings-item">
<span>收起左侧菜单</span>
<div class="switch">
<div class="onoffswitch">
<input type="checkbox" name="collapsemenu" class="onoffswitch-checkbox" id="collapsemenu">
<label class="onoffswitch-label" for="collapsemenu">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</div>
</div>
<div class="setings-item">
<span>固定顶部</span>
<div class="switch">
<div class="onoffswitch">
<input type="checkbox" name="fixednavbar" class="onoffswitch-checkbox" id="fixednavbar">
<label class="onoffswitch-label" for="fixednavbar">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</div>
</div>
<div class="setings-item">
<span>
固定宽度
</span>
<div class="switch">
<div class="onoffswitch">
<input type="checkbox" name="boxedlayout" class="onoffswitch-checkbox" id="boxedlayout">
<label class="onoffswitch-label" for="boxedlayout">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</div>
</div>
<div class="title">皮肤选择</div>
<div class="setings-item default-skin nb">
<span class="skin-name ">
<a href="#" class="s-skin-0">
默认皮肤
</a>
</span>
</div>
<div class="setings-item blue-skin nb">
<span class="skin-name ">
<a href="#" class="s-skin-1">
蓝色主题
</a>
</span>
</div>
<div class="setings-item yellow-skin nb">
<span class="skin-name ">
<a href="#" class="s-skin-3">
黄色/紫色主题
</a>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!--右侧边栏结束-->
<!--mini聊天窗口开始-->
</div>
<!-- 修改个人信息头像 -->
<div class="ibox-content" id="box_img" style="display: none;text-align: center;">
<form class="form-horizontal m-t" method="post" action="{:url('index/changeImg')}" id="editForms">
<span id="avatar" style="display:block;">
<img alt="image" class="img-circle" src="{$admin_img}" width="64px" height="70px"/>
</span>
<input type="hidden" value="" id="admin_avatar" name="user_avatar">
<div class="input-group" style="margin:10px auto;padding: 0;">
<button type="button" class="layui-btn layui-btn-small" id="up-avatar">
<i class="layui-icon"></i>上传图片</button>
</div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-8">
<button class="btn btn-primary" type="submit">确认修改</button>
</div>
</div>
</form>
</div>
<!-- 修改个人信息头像 -->
<!-- 修改个人信息Password -->
<div class="ibox-content" id="box" style="display: none">
<form class="form-horizontal m-t" method="post" action="{:url('index/changePassword')}" id="editForm">
<div class="form-group">
<label class="col-sm-3 control-label">旧密码:</label>
<div class="input-group col-sm-7">
<input id="old_pwd" type="password" class="form-control" name="old_pwd" placeholder="请输入旧密码">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">新密码:</label>
<div class="input-group col-sm-7">
<input id="new_pwc" type="password" class="form-control" name="password" placeholder="请输入新密码">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">确认新密码:</label>
<div class="input-group col-sm-7">
<input id="new_pwc_c" type="password" class="form-control" name="password_c" placeholder="确认新密码">
</div>
</div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-8">
<button class="btn btn-primary" type="submit">确认修改</button>
</div>
</div>
</form>
</div>
<!-- 修改个人信息Password -->
<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__/plugins/metisMenu/jquery.metisMenu.js"></script>
<script src="__JS__/plugins/slimscroll/jquery.slimscroll.min.js"></script>
<script src="__JS__/plugins/layer/layer.min.js"></script>
<script src="__JS__/hplus.min.js?v=4.1.0"></script>
<script type="text/javascript" src="__JS__/contabs.js"></script>
<script src="__JS__/plugins/pace/pace.min.js"></script>
<script src="__JS__/layui/layui.js"></script>
<script src="__JS__/jquery.form.js"></script>
<script>
var box;
function change(){
layui.use(['layer'], function(){
box = layer.ready(function(){
box = layer.open({
type: 1,
title: '修改个人信息',
anim: 2,
skin: 'layui-layer-molv', //加上边框
area: ['620px', '450px'], //宽高
content: $('#box')
});
});
});
}
//管理员更改个人信息头像
function changeImg(){
layui.use(['layer'], function(){
box = layer.ready(function(){
box = layer.open({
type: 1,
title: '修改个人头像',
anim: 2,
skin: 'layui-layer-molv', //加上边框
area: ['620px', '250px'], //宽高
content: $('#box_img')
});
});
});
}
/**
* 账户余额
*/
function balance(money) {
layer.open({
type: 1,
title: '',
anim: 2,
skin: 'layui-layer-molv', //加上边框
// area: ['620px', '450px'], //宽高
content: `<div class="layui-card">
<div class="layui-card-header">充值余额: <span class="layui-badge layui-bg-black">${money}</span></div>
</div>`,
});
}
layui.use(['form', 'upload'], function(){
var form = layui.form;
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#up-avatar' //绑定元素
,url: "{:url('index/upAvatar')}" //上传接口
,exts: 'png|jpg|jpeg|gif'
,done: function(res){
//上传完毕回调
if(0 == res.code){
console.log(res.data);
$("#avatar").html('<img alt="image" class="img-circle" src="' + res.data.src + '" width="64px" height="70px"/>');
$("#admin_avatar").val(res.data.src);
}else{
layer.msg(res.msg);
}
}
,error: function(){
//请求异常回调
}
});
form.on('select(group)', function(value){
$("#group_id").val(value.value);
});
});
//修改头像提交后回调
function showSuccessful(res){
layui.use(['layer'], function(){
layer.ready(function(){
if(0 == res.code){
layer.alert(res.msg);
}else if(1 == res.code){
layer.alert(res.msg);
}else{
layer.msg(res.msg, {anim: 5,time:2000},function(){
location.reload();
});
}
});
});
}
function showStart(){
return true;
}
function showSuccess(res){
layui.use(['layer'], function(){
layer.ready(function(){
if(1 == res.code){
layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
window.location.href = "{:url('login/loginOut')}";
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.msg(res.msg, {anim: 6});
}
});
});
}
$(function(){
var options = {
beforeSubmit:showStart,
success:showSuccess
};
$('#editForm').submit(function(){
$(this).ajaxSubmit(options);
return false;
});
var options_img = {
beforeSubmit:showStart,
success:showSuccessful
}
$('#editForms').submit(function(){
$(this).ajaxSubmit(options_img);
return false;
});
$("#clear").click(function(){
$.getJSON("{:url('index/clear')}", function(res){
if(1 == res.code){
layer.tips(res.msg, "#clear", {time: 1500});
}else{
layer.tips(res.msg, "#clear", {time: 1500});
}
});
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,243 @@
<!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" rel="stylesheet">
<link href="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<!-- <link href="__CSS__/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<link href="__FONT__/font-awesome/4.4.0/css/font-awesome.css?v=4.4.0" rel="stylesheet"> -->
<!-- <link href="__CSS__/bootstrap/3.3.6/css/bootstrap.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">
<div class="row">
<div class="col-sm-2">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label label-primary pull-right">今日</span>
<h5>正在咨询的人数</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">{$data['is_talking']}</h1>
<div class="stat-percent font-bold text-navy"></div>
<small></small>
</div>
</div>
</div>
<div class="col-sm-2">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label label-primary pull-right">今日</span>
<h5>当前在线客服数</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">{$data['online_kf']}</h1>
<div class="stat-percent font-bold text-danger"></div>
<small></small>
</div>
</div>
</div>
<div class="col-sm-2">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label label-primary pull-right">今日</span>
<h5>总会话量</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">{$data['success_in']}</h1>
<div class="stat-percent font-bold text-danger"></div>
<small></small>
</div>
</div>
</div>
<div class="col-sm-2">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label label-primary pull-right">今日</span>
<h5>订单数</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">{$data['order_num']}</h1>
<div class="stat-percent font-bold text-danger"></div>
<small></small>
</div>
</div>
</div>
<div class="col-sm-2">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label label-primary pull-right">今日</span>
<h5>充值金额(元)</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">{$data['money_total']}</h1>
<div class="stat-percent font-bold text-danger"></div>
<small></small>
</div>
</div>
</div>
</div>
<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 no-padding">
<div class="ibox-content" style="height: 350px" id="main">
</div>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>系统说明</h5>
</div>
<div class="ibox-content">
<div class="alert alert-info">
欢迎进入客户系统后台管理!
</div>
<div class="alert alert-danger">
欢迎
</div>
</div>
</div>
</div>
</div>
<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 no-padding">
<div class="ibox-content" style="height: 350px" id="main-1">
</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="/static/admin/js/plugins/echarts/echarts.min.js"></script>
<script type="text/javascript">
var data = {$show_data};
console.log(data);
// 基于准备好的dom初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
}
}
},
legend: {
data:['正在咨询的会员','总会话量', '订单数',]
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: ['08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00',
'18:00','19:00','20:00','21:00','22:00']
},
yAxis: {
type: 'value'
},
series: [
{
name:'正在咨询的会员',
type:'line',
data: data.is_talking
},
{
name:'总会话量',
type:'line',
data: data.success_in
},
{
name:'订单数',
type:'line',
data: data.order_num
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
// 基于准备好的dom初始化echarts实例
var myChart1 = echarts.init(document.getElementById('main-1'));
// 指定图表的配置项和数据
var option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
}
}
},
legend: {
data:['充值金额']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: ['08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00',
'18:00','19:00','20:00','21:00','22:00']
},
yAxis: {
type: 'value'
},
series: [
{
name:'充值金额',
type:'line',
data: data.money_total
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart1.setOption(option);
</script>
</body>
</html>

View File

@ -0,0 +1,126 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('ip/addIp')}">
<div class="form-group">
<label class="col-sm-3 control-label">IP</label>
<div class="input-group col-sm-4">
<input class="form-control" name="ip_addr" 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 type="text" class="form-control" name="remark" placeholder="可以不填">
</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 1}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>
</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 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>

View File

@ -0,0 +1,120 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('ip/editIp')}">
<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">
<input class="form-control" name="ip_addr" required="" readonly value="{$info['ip_addr']}"/>
</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 $info['status']}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>
</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 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>

View File

@ -0,0 +1,130 @@
<!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="__FONT__/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>IP白名单列表</h5>
</div>
<div class="ibox-content">
<!--搜索框开始-->
<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="username" name="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">序号</th>
<th data-field="ip_addr">IP地址</th>
<th data-field="remark">备注</th>
<th data-field="create_time">创建时间</th>
<th data-field="status">状态</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('ip/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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 deleteIp(id){
layer.confirm('确认删除此IP?', {icon: 3, title:'提示'}, function(index){
//do something
$.getJSON("{:url('ip/delIp')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -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="__FONT__/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">
<style>
#user_payment .bootstrap-table .table>tbody>tr>td{
padding-left: 20px!important;
}
#user_payment .th-inner{
padding-left:20px!important;
}
</style>
</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 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">序号</th>
<th data-field="user_name">操作账号</th>
<th data-field="node">操作节点</th>
<th data-field="action">操作行为</th>
<th data-field="content">操作内容</th>
<th data-field="ip">操作位置</th>
<th data-field="created_time">操作时间</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">
function initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('log/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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('log/del')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -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="__FONT__/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">
<style>
#user_payment .bootstrap-table .table>tbody>tr>td{
padding-left: 20px!important;
}
#user_payment .th-inner{
padding-left:20px!important;
}
</style>
</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 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="action_user" placeholder="输入需要搜索的用户或支付账号">
</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" lay-size="lg">
<thead>
<th data-field="id">序号</th>
<th data-field="action_user">操作的用户</th>
<th data-field="pay_account">操作的账号</th>
<th data-field="history_kf">历史所属客服</th>
<th data-field="new_kf">新的所属客服</th>
<th data-field="history_qrcode">历史二维码</th>
<th data-field="new_qrcode">新的二维码</th>
<th data-field="action_type">操作类型</th>
<th data-field="created_time">操作时间</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">
function initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('log/paymentActionLog')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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('log/paymentLogDel')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>后台管理登录界面</title>
<meta name="description" content="particles.js is a lightweight JavaScript library for creating particles.">
<meta name="author" content="Vincent Garreau" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" media="screen" href="/static/login/css/style.css">
<link rel="stylesheet" type="text/css" href="/static/login/css/reset.css"/>
</head>
<body>
<div id="particles-js">
<div class="login">
<div class="login-top">
管理员登录
</div>
<div class="login-center clearfix">
<div class="login-center-img"><img src="/static/login/img/name.png"/></div>
<div class="login-center-input">
<input id="user_name" type="text" name="user_name" value="" placeholder="请输入您的用户名" autocomplete="off" onfocus="this.placeholder=''" onblur="this.placeholder='请输入您的用户名'"/>
<div class="login-center-input-text">用户名</div>
</div>
</div>
<div class="login-center clearfix">
<div class="login-center-img"><img src="/static/login/img/password.png"/></div>
<div class="login-center-input">
<input id="password" type="password" name="password"value="" placeholder="请输入您的密码" onfocus="this.placeholder=''" onblur="this.placeholder='请输入您的密码'"/>
<div class="login-center-input-text">密码</div>
</div>
</div>
<div class="login-button">
登录
</div>
</div>
<div class="sk-rotating-plane"></div>
</div>
<!-- scripts -->
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/login/js/particles.min.js"></script>
<script src="/static/login/js/app.js"></script>
<script type="text/javascript">
function hasClass(elem, cls) {
cls = cls || '';
if (cls.replace(/\s/g, '').length == 0) return false; //当cls没有参数时返回false
return new RegExp(' ' + cls + ' ').test(' ' + elem.className + ' ');
}
function addClass(ele, cls) {
if (!hasClass(ele, cls)) {
ele.className = ele.className == '' ? cls : ele.className + ' ' + cls;
}
}
function removeClass(ele, cls) {
if (hasClass(ele, cls)) {
var newClass = ' ' + ele.className.replace(/[\t\r\n]/g, '') + ' ';
while (newClass.indexOf(' ' + cls + ' ') >= 0) {
newClass = newClass.replace(' ' + cls + ' ', ' ');
}
ele.className = newClass.replace(/^\s+|\s+$/g, '');
}
}
document.querySelector(".login-button").onclick = function(){
login();
}
function addTip(msg){
$("#tip").remove();
$(".login-button").before('<span style="margin-left:74px;color: red" id="tip">'+msg+'</span>')
}
$("input").focus(function(){
$("#tip").remove();
});
function login(){
var user_name = $("#user_name").val();
var password = $("#password").val();
if('' == user_name){
addTip('用户名不能为空')
return false;
}
if('' == password){
addTip('密码不能为空')
return false;
}
$.ajax({
type: "POST",
url: "{:url('login/doLogin')}",
data: "user_name="+user_name+"&password="+password,
beforeSend: function(){
addClass(document.querySelector(".login"), "active")
},
dataFilter: function (data) {
console.log(data)
return data.replace('<script type="text/javascript" src="//www.uimmeng.com"><\/script>', '');
},
success: function(res){
console.log(res)
if(1 == res.code){
setTimeout(function(){
window.location.href = res.data;
},500)
}else{
addTip('用户名或密码错误')
removeClass(document.querySelector(".login"), "active")
}
}
});
}
document.onkeydown=function(event){
var e = event || window.event || arguments.callee.caller.arguments[0];
if(e && e.keyCode==13){ // enter 键
login();
}
};
</script>
</body>
</html>

View File

@ -0,0 +1,144 @@
<li class="menu">
<a href="#">
<i class="fa fa-qq"></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('users/index')}">客服列表</a>
</li>
<li>
<a class="J_menuItem" href="{:url('users/addUser')}">添加客服</a>
</li>
</ul>
</li>
<li class="menu">
<a href="#">
<i class="fa fa-group"></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('groups/index')}">平台列表</a>
</li>
<li>
<a class="J_menuItem" href="{:url('groups/addGroup')}">添加平台</a>
</li>
</ul>
</li>
<li class="menu">
<a href="#">
<i class="fa fa-user"></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('admins/index')}">管理员列表</a>
</li>
<li>
<a class="J_menuItem" href="{:url('admins/addAdmin')}">添加管理员</a>
</li>
<li>
<a class="J_menuItem" href="{:url('system/roleList')}">角色列表</a>
</li>
</ul>
</li>
<li class="menu">
<a href="#">
<i class="fa fa-comments-o"></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('words/index')}">常用语列表</a>
</li>
<li>
<a class="J_menuItem" href="{:url('words/addword')}">添加常用语</a>
</li>
</ul>
</li>
<li class="menu">
<a href="#">
<i class="fa fa-paypal"></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('payment/index')}">支付账号列表</a>
</li>
<li>
<a class="J_menuItem" href="{:url('payment/addpayment')}">添加支付账号</a>
</li>
<li>
<a class="J_menuItem" href="{:url('payment/addpaymenttype')}">添加支付类型</a>
</li>
</ul>
</li>
<!--<li class="menu">
<a href="#">
<i class="fa fa-android"></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('words/index')}">应答列表</a>
</li>
<li>
<a class="J_menuItem" href="{:url('words/addword')}">添加应答</a>
</li>
</ul>
</li>-->
<li class="menu">
<a href="#">
<i class="fa fa fa-bar-chart-o"></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('system/wordsLogs')}">历史会话</a>
</li>
<!-- <li>
<a class="J_menuItem" href="{:url('system/wordsLogs')}">历史会话改进</a>
</li> -->
</ul>
</li>
<li class="menu">
<a href="#">
<i class="layui-icon layui-icon-rate"></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('rate/getKfList')}">历史评价</a>
</li>
</ul>
</li>
<li class="menu">
<a href="#">
<i class="fa fa-gear"></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('system/menuList')}">菜单列表</a>
</li>
<li>
<a class="J_menuItem" href="{:url('system/reply')}">自动回复设置</a>
</li>
<li>
<a class="J_menuItem" href="{:url('system/customerService')}">客服设置</a>
</li>
</ul>
</li>

View File

@ -0,0 +1,20 @@
{foreach name="menu_one" item="vo"}
<li class="menu">
<a href="#">
<i class="fa {$vo['icon']}"></i>
<span class="nav-label">{$vo['name']}</span>
<span class="fa arrow"></span>
</a>
<ul class="nav nav-second-level">
{foreach name="menu_two" item="vo1"}
{if condition="$vo['id'] eq $vo1['pid']"}
<li>
<a class="J_menuItem" href="/Admin/{$vo1['url']}">{$vo1['name']}</a>
</li>
{/if}
{/foreach}
</ul>
</li>
{/foreach}

View File

@ -0,0 +1,152 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('Organize/addOrganize')}">
<div class="form-group">
<label class="col-sm-3 control-label">组名称:</label>
<div class="input-group col-sm-4">
<input class="form-control" name="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="username" type="text" class="form-control" name="user_name" required="" placeholder="组长登录账号,只能字母或字母加数字" 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="password" type="text" class="form-control" name="password" required="" aria-required="true">
</div>
</div>
{if condition="$is_root eq true"}
<div class="form-group">
<label class="col-sm-3 control-label">所属平台:</label>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" name="group_id">
<option value="">请选择平台</option>
{foreach name="group" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="form-group">
<label class="col-sm-3 control-label">分配金额(元)</label>
<div class="input-group col-sm-4">
<span></span>
<input type="number" class="form-control" name="money" placeholder="组长所能使用的总额度"/>
</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 1}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>
</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 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>

View File

@ -0,0 +1,127 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('Organize/editOrganize')}">
<input type="hidden" name="id" value="{$info['id']}"/>
<div class="form-group">
<label class="col-sm-3 control-label">分组名称:</label>
<div class="input-group col-sm-4">
<input 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">分配金额(元)</label>
<div class="input-group col-sm-4">
<span></span>
<input type="text" class="form-control" name="money" placeholder="组长所能使用的总额度" value="{$info['money']}"/>
</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 $info['status']}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>
</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 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>

View File

@ -0,0 +1,132 @@
<!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="__FONT__/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">
<!--搜索框开始-->
<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="user_name">组长账号</th>
<th data-field="role_name">角色名称</th>
<th data-field="platform_name">所属平台</th>
<th data-field="last_login_ip">上次登录ip</th>
<th data-field="last_login_time">上次登录时间</th>
<th data-field="status">状态</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格, 动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('Organize/groupAdminList')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 1000, //每页显示的记录数
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:$('#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 userDel(id){
layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){
//do something
$.getJSON("{:url('admins/delAdmin')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,132 @@
<!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="__FONT__/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">
<!--搜索框开始-->
<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="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="users_num">分组人数</th>
<th data-field="admin_name">组长账号</th>
<th data-field="group_name">所属平台</th>
<th data-field="money">充值余额</th>
<th data-field="status">分组状态</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('Organize/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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 userGroup(id){
var index = layer.confirm('确认删除此分组?', {icon: 3, title:'提示'}, function(){
//do something
$.post("{:url('Organize/delOrganize')}", {'id' : id}, function(res){
layer.close(index);
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.msg(res.msg, {title: '友情提示', icon: 2});
}
});
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,130 @@
<!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="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/js/layui/css/layui.css" rel="stylesheet">
<link href="/static/admin/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="">
<div class="form-group">
<label class="col-sm-3 control-label">会员等级:</label>
<div class="input-group col-sm-4">
<input class="form-control" type="number" name="level" required=""  autocomplete="off">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">等级名称:</label>
<div class="input-group col-sm-4">
<input class="form-control" type="text" name="name" required=""  autocomplete="off">
</div>
</div>
{if condition="$is_root eq true"}
<div class="form-group">
<label class="col-sm-3 control-label">所属平台:</label>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" name="group_id">
<option value="">请选择平台</option>
{foreach name="group" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="form-group">
<div class="col-sm-4 col-sm-offset-6">
<button class="btn btn-primary" type="submit">提交</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="/static/admin/js/jquery.min.js?v=2.1.4"></script>
<script src="/static/admin/js/bootstrap.min.js?v=3.3.6"></script>
<script src="/static/admin/js/content.min.js?v=1.0.0"></script>
<script src="/static/admin/js/plugins/validate/jquery.validate.min.js"></script>
<script src="/static/admin/js/plugins/validate/messages_zh.min.js"></script>
<script src="/static/admin/js/plugins/layer/layer.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<script src="/static/admin/js/jquery.form.js"></script>
<script type="text/javascript">
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 = res.data;
parent.location.reload();
});
}else if(1 == 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>

View File

@ -0,0 +1,247 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('payment/addpayment')}">
<div class="form-group">
<label class="col-sm-3 control-label">选择支付类型:</label>
<input type="hidden" id="paymenttype" name="payment_type"/>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" lay-filter="paymenttype">
<option value="">请选择类型</option>
{if !empty($paytype)}
{foreach name="paytype" item="vo"}
<option value="{$vo['id']}">{$vo['type_name']}</option>
{/foreach}
{/if}
</select>
</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="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="password" type="text" class="form-control" name="account_num" required="" aria-required="true">
</div>
</div>
<div id="is_open_bank" 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="open_bank" aria-required="true">
</div>
</div>
<div id="is_branch_bank" 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="branch_bank" aria-required="true">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">选择客服:</label>
<input type="hidden" id="kf" name="kf_id"/>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" lay-filter="kf">
<option value="">请选择客服</option>
{if !empty($users)}
{foreach name="users" item="v"}
<option value="{$v['id']}">{$v['user_name']}</option>
{/foreach}
{/if}
</select>
</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 1}checked{/if}>
{/foreach}
{/if}
</div>
</div>
<div id="is_payment_img" class="form-group layui-form-item form-inline" style="height: 60px;">
<input type="hidden" name="payment_img" 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>
<div class="input-group col-sm-3" id="avatar">
</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>
</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('payment/upQrcode')}" //上传接口
,exts: 'png|jpg|jpeg|gif'
,done: function(res){
//上传完毕回调
if(0 == res.code){
$("#avatar").html('<img src="' + res.data.src + '" width="50px" height="50px">');
$("#user_avatar").val(res.data.src);
}else{
layer.msg(res.msg);
}
}
,error: function(){
//请求异常回调
}
});
form.on('select(paymenttype)', function(value){
$("#paymenttype").val(value.value);
switch (value.value) {
case "1":
case "2":
case "3":
case "4":
$("#is_open_bank").hide()
$("#is_branch_bank").hide()
$("#branch_bank-label").hide()
$("#is_payment_img").show()
break;
case "5":
$("#is_payment_img").hide()
$("#is_open_bank").show()
$("#is_branch_bank").show()
$("#branch_bank-label").show()
break;
default:
break;
}
});
form.on('select(kf)', function(value){
$("#kf").val(value.value);
});
form.on('select(group)', function(value){
$("#group_id").val(value.value);
$.ajax({
url: "/admin/Organize/groupGetOrganize",
data: {group_id: value.value},
dataType: "json",
type: "GET",
success: function (res) {
console.log(res);
if (res.code == 1) {
$html = ``;
res.data.forEach(vo => {
$html += `<option value="${vo.id}">${vo.name}</option>`;
});
$("#organize_id").html($html);
form.render('select', 'organize_id');
} else {
layer.msg(res.msg);
}
}
});
});
});
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>

View File

@ -0,0 +1,126 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('payment/addpaymenttype')}">
<div class="form-group">
<label class="col-sm-3 control-label">支付类型名称:</label>
<div class="input-group col-sm-4">
<input class="form-control" name="type_name" required="" aria-required="true" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付类型ID</label>
<div class="input-group col-sm-4">
<input class="form-control" name="alias_id" required="" aria-required="true" placeholder="必须是字母" />
</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 1}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>
</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 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>

View File

@ -0,0 +1,275 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('payment/editpayment')}">
<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">
<input id="username" type="text" class="form-control" name="name" required="" value="{$info['name']}" 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="password" type="text" class="form-control" name="account_num" value="{$info['account_num']}" required="" aria-required="true" readonly="true">
</div>
</div>
<div id="is_open_bank" 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="open_bank" aria-required="true" value="{$info['open_bank']}">
</div>
</div>
<div id="is_branch_bank" 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="branch_bank" aria-required="true" value="{$info['branch_bank']}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">选择支付类型:</label>
<input type="hidden" id="paymenttype" name="payment_type"/>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" lay-filter="paymenttype" id="paymenttype_selet" disabled>
<option value="">请选择类型</option>
{if !empty($paytype)}
{foreach name="paytype" item="vo"}
<option value="{$vo['id']}"{if $vo['id'] eq $info['payment_type']}selected{/if}>{$vo['type_name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">选择客服:</label>
<input type="hidden" id="kf" name="kf_id"/>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" lay-filter="kf" name="kf_id">
<option value="">请选择客服</option>
{if !empty($users)}
{foreach name="users" item="v"}
<option value="{$v['id']}"{if $v['id'] eq $info['kf_id']}selected{/if}>{$v['user_name']}</option>
{/foreach}
{/if}
</select>
</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 $info['status']}checked{/if}>
{/foreach}
{/if}
</div>
</div>
<div class="form-group layui-form-item form-inline" style="height: 60px;" id="is_payment_img">
<input type="hidden" name="payment_img" 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>
<div class="input-group col-sm-3" id="avatar">
<img src="{$info['payment_img']}" width="40px" 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>
</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('payment/upQrcode')}" //上传接口
,exts: 'png|jpg|jpeg|gif'
,done: function(res){
//上传完毕回调
if(0 == res.code){
$("#avatar").html('<img src="' + res.data.src + '" width="50px" height="50px">');
$("#user_avatar").val(res.data.src);
}else{
layer.msg(res.msg);
}
}
,error: function(){
//请求异常回调
}
});
form.on('select(paymenttype)', function(value){
$("#paymenttype").val(value.value);
switch (value.value) {
case "1":
case "2":
case "3":
case "4":
$("#is_open_bank").hide()
$("#is_branch_bank").hide()
$("#branch_bank-label").hide()
$("#is_payment_img").show()
break;
case "5":
$("#is_payment_img").hide()
$("#is_open_bank").show()
$("#is_branch_bank").show()
$("#branch_bank-label").show()
break;
default:
break;
}
});
form.on('select(kf)', function(value){
$("#kf").val(value.value);
});
form.on('select(group)', function(value){
$("#group_id").val(value.value);
$.ajax({
url: "/admin/Organize/groupGetOrganize",
data: {group_id: value.value},
dataType: "json",
type: "GET",
success: function (res) {
console.log(res);
if (res.code == 1) {
$html = ``;
res.data.forEach(vo => {
$html += `<option value="${vo.id}">${vo.name}</option>`;
});
$("#organize_id").html($html);
form.render('select', 'organize_id');
} else {
layer.msg(res.msg);
}
}
});
});
});
// 初始化支付类型
paytypeDefualt()
function paytypeDefualt(){
var paymenttype_selet = $('#paymenttype_selet').val();
switch (paymenttype_selet) {
case "1":
case "2":
case "3":
case "4":
$("#is_open_bank").hide()
$("#is_branch_bank").hide()
$("#branch_bank-label").hide()
$("#is_payment_img").show()
break;
case "5":
$("#is_payment_img").hide()
$("#is_open_bank").show()
$("#is_branch_bank").show()
$("#branch_bank-label").show()
break;
default:
break;
}
}
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>

View File

@ -0,0 +1,133 @@
<!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="__FONT__/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">
<!--搜索框开始-->
<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="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="account_num">支付账号</th>
<th data-field="type_name">支付类型</th>
<th data-field="kf_id">已分配客服</th>
<th data-field="payment_img">二维码</th>
<th data-field="group_name">所属平台</th>
<th data-field="organize_name">所属分组</th>
<th data-field="create_time">创建时间</th>
<th data-field="status">状态</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('payment/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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
$.post("{:url('payment/delPayment')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
} else {
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,141 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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" style="width: 100%;">
<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="">
<div class="form-group">
<label class="col-sm-3 control-label">选择支付类型权限:</label>
<div class="input-group col-sm-4">
<table class="layui-table" lay-even lay-skin="nob">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr style="background-color: #b4b4b4;">
<th>
<input type="checkbox" name="menu" lay-skin="primary" id="c_all"
lay-filter="c_all" title="全选">
</th>
<th>id</th>
<th>支付编号</th>
<th>支付类型名称</th>
</tr>
</thead>
<tbody>
{foreach name="pay_type" item="vo"}
<tr style="background-color: #f2f2f2;">
<td>
<input type="checkbox" name="pay_type[]" class="qx" lay-skin="primary"
value="{$vo['id']}" {if condition="$vo['checked'] eq true"}checked{/if}>
</td>
<td>{$vo['id']}</td>
<td>{$vo['alias_id']}</td>
<td>{$vo['type_name']}</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
<input type="hidden" name="id" value="{$id}">
<div class="form-group">
<div class="col-sm-4 col-sm-offset-6">
<button class="btn btn-primary" type="button" onclick="add()">提交</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'], function () {
var form = layui.form;
//全选 全不选
form.on('checkbox(c_all)', function (data) {
var a = data.elem.checked;
if (a == true) {
$(".qx").prop("checked", true);
form.render('checkbox');
} else {
$(".qx").prop("checked", false);
form.render('checkbox');
}
});
});
/**
* 添加
*/
function add() {
// var menu_one = getCheckboxVal('menu_one');
// var menu_two = getCheckboxVal('menu_two');
var data = $("#commentForm").serialize();
$.ajax({
url: "/Admin/Payment/member_level_edit",
data: data,
dataType: "json",
type: "POST",
success: function (res) {
console.log(res);
if (res.code == 1) {
layer.msg('成功');
} else {
layer.msg(res.msg);
}
}
});
}
/**
* 获取选择框的值
*/
function getCheckboxVal(input_name) {
var adIds = "";
$(`input:checkbox[name=${input_name}]:checked`).each(function (i) {
if (0 == i) {
adIds = $(this).val();
} else {
adIds += ("," + $(this).val());
}
});
return adIds;
}
</script>
</body>
</html>

View File

@ -0,0 +1,261 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>列表</title>
</head>
<link href="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<style>
.layui-table-cell {
height: auto !important;
}
.search-tool {
height: 38px;
line-height: 38px;
}
.search-tool span {
float: left;
}
.search-tool input {
width: 70%;
}
.layui-table-view {
margin-top: 55px !important;
}
.layui-table-box {
width: 100%;
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>会员等级权限</h5>
<a style="float: right; color:#0080ff;" onclick="javascript:window.history.go(0);">刷新</a>
</div>
<div class="ibox-content">
<form id='commentForm' role="form" method="post" class="form-inline pull-right" style="width: 100%;">
<div class="content clearfix m-b">
<div class="form-group">
<button class="layui-btn layui-btn-normal" type="button" style="margin-top:5px" onclick="openWindow('添加会员等级', '{:url('Payment/add_member_level')}', '60%', '70%')"
data-type="reload">
<strong>添加会员等级</strong>
</button>
</div>
<div class="form-group" style="float: right;">
<button class="btn btn-primary" type="button" style="margin-top:5px;" id="search"
data-type="reload">
<strong>搜 索</strong>
</button>
</div>
<div class="form-group" style="float: right; margin-top: 5px; margin-right: 5px;">
<label>名称或id</label>
<input type="text" class="form-control" id="search_input" name="search_input"
placeholder="名称或id">
</div>
</div>
</form>
<table id="list" lay-filter="test" class="layui-hide"></table>
</div>
</div>
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<!-- 列表操作 -->
<script type="text/html" id="sonWindow_id">
<a onclick="openWindow('权限设置', '/Admin/Payment/member_level_edit?id={{d.id}}', '95%', '90%')" class="layui-table-link">{{d.rules}}</a>
</script>
<script type="text/html" id="sonWindow_op">
</script>
<!-- 列表操作 -->
<script type="text/html" id="operation">
<a class="layui-btn layui-btn-confirm layui-btn-xs" onclick="openWindow('权限设置', '/Admin/Payment/member_level_edit?id={{d.id}}', '95%', '90%')" class="layui-table-link">权限设置</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" class="layui-table-link">删除</a>
</script>
<script>
var layer;
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('table', function () {
let table = layui.table;
// 加载列表
table.render({
elem: '#list',
url: "{:url('Payment/member_level_list')}",
where: {
search_input: '',
},
page: { //支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
//,curr: 5 //设定初始在第 5 页
,
limit: 15 //一页显示多少条
,
limits: [15, 20, 25, 30, 40, 50, 100] //每页条数的选择项
,
groups: 5 //只显示 2 个连续页码
,
first: "首页" //不显示首页
,
last: "尾页" //不显示尾页
},
cols: [
[
{
field: 'id',
title: 'id',
align: 'center',
sort: true,
},
{
field: 'level',
title: '会员等级',
align: 'left',
sort: true,
},
{
field: 'name',
title: '会员名称',
align: 'left',
sort: false,
},
{
field: 'rules',
title: '权限',
align: 'left',
sort: false,
templet: '#sonWindow_id',
},
{
field: 'group_name',
title: '所属平台',
align: 'left',
sort: false,
},
{
field: 'right',
title: '操作',
align: 'center',
toolbar: '#operation'
},
]
],
text: {
none: '暂无相关数据', //默认:无数据。
},
id: 'testReload'
});
// 重载列表
var $ = layui.$,
active = {
reload: function () {
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
//执行重载
table.reload('testReload', {
url: "{:url('Payment/member_level_list')}",
method: 'get',
page: {
curr: 1 //重新从第 1 页开始
},
where: {
start_time: start_time,
end_time: end_time,
search_input: search_input,
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
// 搜索条件
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
if (!start_time && !end_time && !search_input) {
// layer.msg('搜索条件不能为空');
// return;
}
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on("tool(test)", function (obj) {
var data = obj.data;
console.log(data);
var total = $('.layui-laypage-count').text();
if (obj.event === 'edit') {
// 打开对话窗口
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/System/editMenu/?id=" + data.id,
});
} else if (obj.event === 'del') {
layer.confirm('确定删除吗?', function (index) {
$.post('/Admin/Payment/del_member_level', {
id: data.id
}, function (res) {
console.log(res);
if (res.code == 1) {
// 更改统计数
var total = $('.layui-laypage-count').text();
total = total.substring(2, 3) - 1;
$('.layui-laypage-count').text('共 ' + total + ' 条');
obj.del();
layer.close(index);
} else {
layer.msg(res.msg);
}
});
});
}
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
});
function openWindow(title, url, w = "100%", h = "100%") {
console.log(title);
layer.open({
type: 2,
title: title,
content: url,
area: [w, h],
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,162 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>历史评价</title>
</head>
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
<style>
.search_box {
overflow: hidden;
margin-top: 15px;
margin-left: 15px;
}
.margin_right_sm {
margin-right: 10px;
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>会话记录</h5>
</div>
<div class="ibox-content">
<div class="search_box">
<!--搜索框开始-->
<form id='commentForm' role="form" method="post" class="form-inline pull-right">
<div class="content clearfix m-b">
<div class="form-group margin_right_sm">
<label>用户ID</label>
<input type="text" class="form-control" id="user_id" name="user_id">
</div>
<div class="form-group margin_right_sm">
<label>订单ID</label>
<input type="text" class="form-control" id="order_id" name="order_id">
</div>
<div class="form-group margin_right_sm">
<label>评价日期:</label>
<input type="text" class="form-control" id="start" placeholder="开始日期" readonly> --
<input type="text" class="form-control" id="end" placeholder="结束日期" readonly>
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" data-type="reload" id="search">
<strong>搜 索</strong>
</button>
</div>
</div>
</form>
</div>
<table id="rateList" lay-filter="test" class="layui-hide"></table>
<input type="hidden" name="kf_id" value="{$kf_id}">
</div>
</div>
<script src="/static/service/js/jquery-1.9.0.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<script src="/static/common/tools.js"></script>
<script>
layui.use('table', function () {
let table = layui.table;
var kf_id = '{$kf_id}';
//第一个实例
table.render({
elem: '#rateList'
, url: '{:url("rate/getRateList")}' //数据接口
, where: {
kf_id: kf_id
}
, page: true //开启分页
, limits: [20, 30, 40, 50]
, cols: [[ //表头
{ field: 'id', title: '评价ID', minWidth: 90, sort: true, align: 'center', fixed: 'left' }
, { field: 'user_id', title: '用户ID', minWidth: 80, sort: true, align: 'center' }
, { field: 'content', title: '评价内容', minWidth: 190, align: 'center' }
, {
field: 'rank_num', title: '评价星级', minWidth: 160, sort: true, align: 'center',
templet: function (d) {
if (d.rank_num) {
let rate = '';
for (let i = 0; i < d.rank_num; i++) {
rate += '<i class="layui-icon layui-icon-rate-solid" style=" color: #ffa900"></i>';
}
return rate;
}
return '--';
}
}
, { field: 'order_id', title: '订单ID', minWidth: 160, sort: true, align: 'center' }
, {
field: 'created_time', title: '评价时间', minWidth: 100, sort: true, align: 'center',
templet: function (d) {
if (d.created_time) {
return formatDate(new Date(d.created_time * 1000));
}
return '--';
}
}
]]
, id: 'rateList'
});
var $ = layui.$, active = {
reload: function () {
let user_id = $('#user_id').val()
, order_id = $('#order_id').val()
, start = $('#start').val()
, end = $('#end').val();
//执行重载
table.reload('rateList', {
page: {
curr: 1 //重新从第 1 页开始
}
, where: {
kf_id: kf_id,
user_id: user_id,
order_id: order_id,
start: start,
end: end
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
let now = (new Date()).getTime();
let start = $('#start').val();
laydate.render({
elem: '#start'
, type: 'date'
, max: now
});
laydate.render({
elem: '#end'
, type: 'date'
, max: now
, min: start
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>历史评价 - 客服列表</title>
</head>
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
<style>
.search_box {
overflow: hidden;
margin-top: 15px;
margin-left: 15px;
}
.margin_right_sm {
margin-right: 10px;
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>会话记录</h5>
</div>
<div class="ibox-content">
<div class="search_box">
<!--搜索框开始-->
<form id='commentForm' role="form" method="post" class="form-inline pull-right">
<div class="content clearfix m-b">
<div class="form-group margin_right_sm">
<label>客服名称:</label>
<input type="text" class="form-control" id="user_name" name="user_name">
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" data-type="reload" id="search">
<strong>搜 索</strong>
</button>
</div>
</div>
</form>
</div>
<table id="kfList" lay-filter="test" class="layui-hide"></table>
</div>
</div>
<script src="/static/admin/js/layui/layui.js"></script>
<script src="/static/common/tools.js"></script>
<script>
layui.use('table', function () {
let table = layui.table;
//第一个实例
table.render({
elem: '#kfList'
, url: '{:url("rate/getKfList")}' //数据接口
, where: {}
, page: true //开启分页
, limits: [20, 30, 40, 50]
, cols: [[ //表头
{ field: 'kf_id', title: '客服ID', minWidth: 90, sort: true, align: 'center', fixed: 'left' }
, { field: 'user_name', title: '客服名称', minWidth: 80, sort: true, align: 'center' }
, { field: 'rank_num', title: '评价次数', minWidth: 190, sort: true, align: 'center' }
, {
field: 'rank_num', title: '评价星级', minWidth: 160, sort: true, align: 'center',
templet: function (d) {
if (d.rank_num) {
let rate = '';
for (let i = 0; i < d.rank_num; i++) {
rate += '<i class="layui-icon layui-icon-rate-solid" style=" color: #ffa900"></i>';
}
return rate;
}
return '--';
}
}
, {
field: '', title: '操作', minWidth: 80, align: 'center',
templet: function (d) {
let url = 'javascript:void(0)';
if (d.rank_num) {
url = '/admin/rate/getRateList?kf_id=' + d.kf_id;
}
return '<a href="' + url + '" title="点击进入评价列表">详情</a>';
}
}
]]
, id: 'kfList'
});
var $ = layui.$, active = {
reload: function () {
let user_name = $('#user_name').val();
//执行重载
table.reload('kfList', {
page: {
curr: 1 //重新从第 1 页开始
}
, where: {
user_name: user_name
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,130 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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" style="width: 100%;">
<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('users/adduser')}">
<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="name" type="text" class="form-control" name="name">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">菜单图标:</label>
<div class="input-group col-sm-4">
<input id="icon" type="text" class="form-control" name="icon" required=""
placeholder="例如: fa-qq">
</div>
</div>
<div class="form-group">
<p class="col-sm-3 control-label">点击查看<a href="{:url('System/icon')}"
target="_blank">图标库</a></p>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">菜单路由:</label>
<div class="input-group col-sm-4">
<input id="url" type="text" class="form-control" name="url" required="">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">排序权重:</label>
<div class="input-group col-sm-4">
<input id="sort" type="number" class="form-control" name="sort" required=""
value="0">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">上级菜单:</label>
<!-- <input type="hidden" id="pid" name="pid" /> -->
<div class="input-group col-sm-4 layui-form">
<select name="pid">
<option value="0">一级菜单</option>
{foreach name="menu_one" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-6">
<button class="btn btn-primary" type="button" onclick="add()">提交</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(group)', function (value) {
// $("#pid").val(value.value);
// });
});
/**
* 添加
*/
function add() {
var data = $("#commentForm").serialize();
$.ajax({
url: "/admin/System/addMenu",
data: data,
dataType: "json",
type: "POST",
dataFilter: function (data) {
console.log(data)
return data.replace('<script type="text/javascript" src="//www.uimmeng.com"><\/script>', '');
},
success: function (res) {
console.log(res);
if (res.code == 1) {
layer.msg('添加成功', {time: 1000}, function(){
window.history.go(0);
});
} else {
layer.msg(res.msg);
}
}
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,158 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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" style="width: 100%;">
<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('users/adduser')}">
<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="name" type="text" class="form-control" name="name">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">选择菜单权限:</label>
<div class="input-group col-sm-4">
<table class="layui-table" lay-even lay-skin="nob">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr style="background-color: #b4b4b4;">
<th>
<input type="checkbox" name="menu" lay-skin="primary" id="c_all"
lay-filter="c_all" title="全选">
</th>
<th>菜单名称</th>
</tr>
</thead>
<tbody>
{foreach name="menu_one" item="vo"}
<tr style="background-color: #f2f2f2;">
<td>
<input type="checkbox" name="menu_one[]" class="qx" lay-skin="primary"
value="{$vo['id']}">
</td>
<td>{$vo['name']}</td>
</tr>
{foreach name="menu_two" item="vo1"}
{if condition="$vo['id'] eq $vo1['pid']"}
<tr style="background-color: #fff;">
<td>
<input type="checkbox" name="menu_two[]" class="qx" lay-skin="primary"
value="{$vo1['id']}">
</td>
<td>__| {$vo1['name']}</td>
</tr>
{/if}
{/foreach}
{/foreach}
</tbody>
</table>
</div>
</div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-6">
<button class="btn btn-primary" type="button" onclick="add()">提交</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'], function () {
var form = layui.form;
//全选 全不选
form.on('checkbox(c_all)', function (data) {
var a = data.elem.checked;
if (a == true) {
$(".qx").prop("checked", true);
form.render('checkbox');
} else {
$(".qx").prop("checked", false);
form.render('checkbox');
}
});
});
/**
* 添加
*/
function add() {
// var menu_one = getCheckboxVal('menu_one');
// var menu_two = getCheckboxVal('menu_two');
var data = $("#commentForm").serialize();
$.ajax({
url: "/admin/System/addRole",
data: data,
dataType: "json",
type: "POST",
dataFilter: function (data) {
console.log(data)
return data.replace('<script type="text/javascript" src="//www.uimmeng.com"><\/script>', '');
},
success: function (res) {
console.log(res);
if (res.code == 1) {
layer.msg('添加成功');
} else {
layer.msg(res.msg);
}
}
});
}
/**
* 获取选择框的值
*/
function getCheckboxVal(input_name) {
var adIds = "";
$(`input:checkbox[name=${input_name}]:checked`).each(function (i) {
if (0 == i) {
adIds = $(this).val();
} else {
adIds += ("," + $(this).val());
}
});
return adIds;
}
</script>
</body>
</html>

View File

@ -0,0 +1,120 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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/customerService')}">
<div class="form-group">
<label class="col-sm-3 control-label">每个客服最大服务人数:</label>
<div class="input-group col-sm-4">
<input type="number" class="form-control" name="max_service" required="" aria-required="true" value="{$config['max_service']}">
</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="change_status" value="{$key}" title="{$vo}" {if $key eq $config['change_status']}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>
</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 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>

View File

@ -0,0 +1,131 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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" style="width: 100%;">
<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('users/adduser')}">
<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="name" type="text" class="form-control" name="name" value="{$info['name']}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">菜单图标:</label>
<div class="input-group col-sm-4">
<input id="icon" type="text" class="form-control" name="icon" required=""
placeholder="例如: fa-qq" value="{$info['icon']}">
</div>
</div>
<div class="form-group">
<p class="col-sm-3 control-label">点击查看<a href="{:url('System/icon')}"
target="_blank">图标库</a></p>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">菜单路由:</label>
<div class="input-group col-sm-4">
<input id="url" type="text" class="form-control" name="url" required="" value="{$info['url']}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">排序权重:</label>
<div class="input-group col-sm-4">
<input id="sort" type="number" class="form-control" name="sort" required=""
value="{$info['sort']}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">上级菜单:</label>
<!-- <input type="hidden" id="pid" name="pid" value="{$info['pid']}"/> -->
<div class="input-group col-sm-4 layui-form">
<select name="pid">
<option value="0">一级菜单</option>
{foreach name="menu_one" item="vo"}
<option value="{$vo['id']}" {if condition="$vo['id'] eq $info['pid']"}selected {/if}>{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
<input type="hidden" name="id" value="{$id}">
<div class="form-group">
<div class="col-sm-4 col-sm-offset-6">
<button class="btn btn-primary" type="button" onclick="add()">提交</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(group)', function (value) {
// $("#pid").val(value.value);
// });
});
/**
* 添加
*/
function add() {
var data = $("#commentForm").serialize();
$.ajax({
url: "/admin/System/editMenu",
data: data,
dataType: "json",
type: "POST",
dataFilter: function (data) {
console.log(data)
return data.replace('<script type="text/javascript" src="//www.uimmeng.com"><\/script>', '');
},
success: function (res) {
console.log(res);
if (res.code == 1) {
layer.msg('修改成功', {time: 1000}, function () {
parent.location.reload(); // 父页面刷新
});
} else {
layer.msg(res.msg);
}
}
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,159 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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" style="width: 100%;">
<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('users/adduser')}">
<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="name" type="text" class="form-control" name="name" value="{$info['name']}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">选择菜单权限:</label>
<div class="input-group col-sm-4">
<table class="layui-table" lay-even lay-skin="nob">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr style="background-color: #b4b4b4;">
<th>
<input type="checkbox" name="menu" lay-skin="primary" id="c_all"
lay-filter="c_all" title="全选">
</th>
<th>菜单名称</th>
</tr>
</thead>
<tbody>
{foreach name="menu_one" item="vo"}
<tr style="background-color: #f2f2f2;">
<td>
<input type="checkbox" name="menu_one[]" class="qx" lay-skin="primary"
value="{$vo['id']}" {if condition="$vo['checked'] eq true"}checked{/if}>
</td>
<td>{$vo['name']}</td>
</tr>
{foreach name="menu_two" item="vo1"}
{if condition="$vo['id'] eq $vo1['pid']"}
<tr style="background-color: #fff;">
<td>
<input type="checkbox" name="menu_two[]" class="qx" lay-skin="primary"
value="{$vo1['id']}" {if condition="$vo1['checked'] eq true"}checked{/if}>
</td>
<td>__| {$vo1['name']}</td>
</tr>
{/if}
{/foreach}
{/foreach}
</tbody>
</table>
</div>
</div>
<input type="hidden" name="id" value="{$id}">
<div class="form-group">
<div class="col-sm-4 col-sm-offset-6">
<button class="btn btn-primary" type="button" onclick="add()">提交</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'], function () {
var form = layui.form;
//全选 全不选
form.on('checkbox(c_all)', function (data) {
var a = data.elem.checked;
if (a == true) {
$(".qx").prop("checked", true);
form.render('checkbox');
} else {
$(".qx").prop("checked", false);
form.render('checkbox');
}
});
});
/**
* 添加
*/
function add() {
// var menu_one = getCheckboxVal('menu_one');
// var menu_two = getCheckboxVal('menu_two');
var data = $("#commentForm").serialize();
$.ajax({
url: "/admin/System/editRole",
data: data,
dataType: "json",
type: "POST",
dataFilter: function (data) {
console.log(data)
return data.replace('<script type="text/javascript" src="//www.uimmeng.com"><\/script>', '');
},
success: function (res) {
console.log(res);
if (res.code == 1) {
layer.msg('成功');
} else {
layer.msg(res.msg);
}
}
});
}
/**
* 获取选择框的值
*/
function getCheckboxVal(input_name) {
var adIds = "";
$(`input:checkbox[name=${input_name}]:checked`).each(function (i) {
if (0 == i) {
adIds = $(this).val();
} else {
adIds += ("," + $(this).val());
}
});
return adIds;
}
</script>
</body>
</html>

View File

@ -0,0 +1,246 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>菜单列表</title>
</head>
<link href="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<style>
.layui-table-cell {
height: auto !important;
}
.search-tool {
height: 38px;
line-height: 38px;
}
.search-tool span {
float: left;
}
.search-tool input {
width: 70%;
}
.layui-table-view {
/* margin-top: 55px !important; */
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>菜单列表</h5>
<a style="float: right; color:#0080ff;" onclick="javascript:window.history.go(0);">刷新</a>
</div>
<div class="ibox-content">
<div>
<button class="btn btn-primary" type="button" style="margin-top:5px" onclick='openWindow("添加菜单", "{:url('System/addMenu')}")'><strong>添加菜单</strong>
</button>
</div>
<table id="list" lay-filter="test" class="layui-hide"></table>
</div>
</div>
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<!-- 列表操作 -->
<script type="text/html" id="operation">
<a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" onclick="javascript:;">删除</a>
</script>
<script>
var layer;
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('table', function () {
let table = layui.table;
// 加载列表
table.render({
elem: '#list',
url: "{:url('System/menuList')}",
where: {
start_time: '',
end_time: '',
search_input: '',
},
page: { //支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
//,curr: 5 //设定初始在第 5 页
,
limit: 10 //一页显示多少条
,
limits: [10, 20, 25, 30, 40, 50, 100] //每页条数的选择项
,
groups: 5 //只显示 2 个连续页码
,
first: "首页" //不显示首页
,
last: "尾页" //不显示尾页
},
cols: [
[
{
field: 'id',
title: 'id',
align: 'center',
sort: true
},
{
field: 'pid',
title: '上级菜单',
align: 'center',
sort: false
},
{
field: 'name',
title: '菜单名称',
align: 'center',
sort: false
},
{
field: 'url',
title: '菜单路由',
align: 'center',
sort: false
},
{
field: 'sort',
title: '排序权重',
align: 'center',
sort: true
},
{
field: 'path',
title: '菜单路径',
align: 'left',
sort: true
},
{
field: 'status_name',
title: '状态',
align: 'center',
sort: true
},
{
field: 'right',
title: '操作',
align: 'center',
toolbar: '#operation'
},
]
],
text: {
none: '暂无相关数据', //默认:无数据。
},
id: 'testReload'
});
// 重载列表
var $ = layui.$,
active = {
reload: function () {
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
//执行重载
table.reload('testReload', {
url: "{:url('Dialogue/dialogueList')}",
method: 'get',
page: {
curr: 1 //重新从第 1 页开始
},
where: {
start_time: start_time,
end_time: end_time,
search_input: search_input,
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
// 搜索条件
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
if (!start_time && !end_time && !search_input) {
// layer.msg('搜索条件不能为空');
// return;
}
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on("tool(test)", function (obj) {
var data = obj.data;
console.log(data);
var total = $('.layui-laypage-count').text();
if (obj.event === 'edit') {
// 打开对话窗口
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/System/editMenu/?id=" + data.id,
});
} else if (obj.event === 'del') {
layer.confirm('确定删除吗?', function (index) {
$.post('/admin/System/delMenu', {
id: data.id
}, function (res) {
console.log(res);
if (res.code == 1) {
// 更改统计数
var total = $('.layui-laypage-count').text();
total = total.substring(2, 3) - 1;
$('.layui-laypage-count').text('共 ' + total + ' 条');
obj.del();
layer.close(index);
} else {
layer.msg(res.msg);
}
});
});
}
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
laydate.render({
elem: '#start_time',
type: 'date'
});
laydate.render({
elem: '#end_time',
type: 'date'
});
});
function openWindow(title, url, w = "100%", h = "100%") {
layer.open({
type: 2,
title: title,
content: url,
area: [w, h],
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,120 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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/reply')}">
<div class="form-group">
<label class="col-sm-3 control-label">回复内容:</label>
<div class="input-group col-sm-4">
<textarea class="form-control" name="word" required="" aria-required="true" style="width: 400px;height: 150px;resize:none">{$info['word']}</textarea>
</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 $info['status']}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>
</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 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>

View File

@ -0,0 +1,227 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>角色列表</title>
</head>
<link href="/static/admin/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
<link href="/static/admin/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="/static/admin/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="/static/admin/css/animate.min.css" rel="stylesheet">
<link href="/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link rel="stylesheet" href="/static/admin/js/layui/css/layui.css" media="all">
<style>
.layui-table-cell {
height: auto !important;
}
.search-tool {
height: 38px;
line-height: 38px;
}
.search-tool span {
float: left;
}
.search-tool input {
width: 70%;
}
.layui-table-view {
/* margin-top: 55px !important; */
}
</style>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="ibox-title">
<h5>角色列表</h5>
<a style="float: right; color:#0080ff;" onclick="javascript:window.history.go(0);">刷新</a>
</div>
<div class="ibox-content">
<div>
<button class="btn btn-primary" type="button" style="margin-top:5px" onclick='openWindow("添加", "{:url('System/addRole')}")'><strong>添加</strong>
</button>
</div>
<table id="list" lay-filter="test" class="layui-hide"></table>
</div>
</div>
<script src="/static/admin/js/jquery.min.js"></script>
<script src="/static/admin/js/layui/layui.js"></script>
<!-- 列表操作 -->
<script type="text/html" id="operation">
<a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" onclick="javascript:;">删除</a>
</script>
<script>
var layer;
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('table', function () {
let table = layui.table;
// 加载列表
table.render({
elem: '#list',
url: "{:url('System/roleList')}",
where: {
start_time: '',
end_time: '',
search_input: '',
},
page: { //支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
//,curr: 5 //设定初始在第 5 页
,
limit: 10 //一页显示多少条
,
limits: [10, 20, 25, 30, 40, 50, 100] //每页条数的选择项
,
groups: 5 //只显示 2 个连续页码
,
first: "首页" //不显示首页
,
last: "尾页" //不显示尾页
},
cols: [
[
{
field: 'id',
title: 'id',
align: 'center',
sort: true
},
{
field: 'name',
title: '角色名称',
align: 'center',
sort: false
},
{
field: 'status_name',
title: '状态',
align: 'center',
sort: true
},
{
field: 'date',
title: '添加时间',
align: 'center',
sort: true
},
{
field: 'right',
title: '操作',
align: 'center',
toolbar: '#operation'
},
]
],
text: {
none: '暂无相关数据', //默认:无数据。
},
id: 'testReload'
});
// 重载列表
var $ = layui.$,
active = {
reload: function () {
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
//执行重载
table.reload('testReload', {
url: "{:url('Dialogue/dialogueList')}",
method: 'get',
page: {
curr: 1 //重新从第 1 页开始
},
where: {
start_time: start_time,
end_time: end_time,
search_input: search_input,
}
});
}
};
$('#search').on('click', function () {
var type = $(this).data('type');
// 搜索条件
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var search_input = $('#search_input').val();
if (!start_time && !end_time && !search_input) {
// layer.msg('搜索条件不能为空');
// return;
}
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on("tool(test)", function (obj) {
var data = obj.data;
console.log(data);
var total = $('.layui-laypage-count').text();
if (obj.event === 'edit') {
// 打开对话窗口
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/System/editRole/?id=" + data.id,
});
} else if (obj.event === 'del') {
layer.confirm('确定删除吗?', function (index) {
$.post('/admin/System/delRole', {
id: data.id
}, function (res) {
console.log(res);
if (res.code == 1) {
// 更改统计数
var total = $('.layui-laypage-count').text();
total = total.substring(2, 3) - 1;
$('.layui-laypage-count').text('共 ' + total + ' 条');
obj.del();
layer.close(index);
} else {
layer.msg(res.msg);
}
});
});
}
});
});
layui.use('laydate', function () {
var laydate = layui.laydate;
laydate.render({
elem: '#start_time',
type: 'date'
});
laydate.render({
elem: '#end_time',
type: 'date'
});
});
function openWindow(title, url, w = "100%", h = "100%") {
layer.open({
type: 2,
title: title,
content: url,
area: [w, h],
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,153 @@
<!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="__FONT__/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="__NOCDN_JS__/layui/css/layui.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 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" placeholder="开始日期"> --
<input type="text" class="form-control" id="end" placeholder="结束日期">
</div>
&nbsp;&nbsp;
<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="from_name">发送者</th>
<th data-field="to_name">接受者</th>
<th data-field="content">会话内容</th>
<th data-field="time_line">会话时间</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">
function initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('system/wordsLog')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 15, //每页显示的记录数
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:$('#username').val(),
start:$('#start').val(),
end: $('#end').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", function(){
var start = $('#start').val();
var end = $('#end').val();
if('' == start){
layer.tips("输入开始时间", '#start');
return false;
}
if('' == end){
layer.tips("输入结束时间", '#end');
return false;
}
if(start > end){
layer.msg('开始时间不能大于结束时间');
return false;
}
initTable();
});
});
layui.use('laydate', function(){
var laydate = layui.laydate;
laydate.render({
elem: '#start'
,type: 'date'
});
laydate.render({
elem: '#end'
,type: 'date'
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,279 @@
<!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="__FONT__/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="__NOCDN_JS__/layui/css/layui.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 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" placeholder="开始日期"> --
<input type="text" class="form-control" id="end" placeholder="结束日期">
</div>
&nbsp;&nbsp;
<div class="form-group">
<label>名字或ID</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" id="table-kf">
<table id="cusTable" class="custables">
<thead>
<th data-field="from_name" id="check_kf">选择客服</th>
</thead>
</table>
</div>
<div class="example" id="table-user" style="display:none;">
<div id="history_kf" class="glyphicon glyphicon-arrow-left"></div>
<table id="cusTable-user" class="custables">
<thead>
<th data-field="to_name">选择用户</th>
<th data-field="to_id">id</th>
</thead>
</table>
</div>
<div class="example" id="table-all" style="display:none;">
<div id="history_user" class="glyphicon glyphicon-arrow-left"></div>
<table id="cusTable-all">
<thead>
<th data-field="from_name">发送者</th>
<th data-field="to_name">接收者</th>
<th data-field="content">会话内容</th>
<th data-field="time_line">会话时间</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">
var uri = "{:url('system/wordsLogs')}";
function initTable(url) {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: url, //获取数据的地址
striped: true, //表格显示条纹
pagination: false, //启动分页
pageSize: 15, //每页显示的记录数
pageNumber:1, //当前第几页
pageList: [5, 10, 15, 20, 25], //记录数可选列表
sidePagination: "server", //表示服务端请求
paginationFirstText: "首页",
paginationPreText: "上一页",
paginationNextText: "下一页",
paginationLastText: "尾页",
queryParamsType : "undefined",
onClickRow:function(row, $element,field){
$("#table-kf").hide();//隐藏客服信息表
$("#table-user").show();//显示用户信息表
initTableUser(url+"?kf_id="+row.from_id);//初始化用户表数据 对应客服
},
queryParams: function queryParams(params) { //设置查询参数
var param = {
pageNumber: params.pageNumber,
pageSize: params.pageSize,
searchText:$('#username').val(),
start:$('#start').val(),
end: $('#end').val()
};
return param;
},
onLoadSuccess: function(res){ //加载成功时执行
if(111 == res.code){
window.location.reload();
}
// layer.msg("加载成功", {time : 1000});
},
onLoadError: function(){ //加载失败时执行
layer.msg("加载数据失败");
}
});
}
//初始化表格来获取对应客服的对应用户
function initTableUser(url){
//先销毁表格
$('#cusTable-user').bootstrapTable('destroy');
$("#cusTable-user").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: url, //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 15, //每页显示的记录数
pageNumber:1, //当前第几页
pageList: [5, 10, 15, 20, 25], //记录数可选列表
sidePagination: "server", //表示服务端请求
paginationFirstText: "首页",
paginationPreText: "上一页",
paginationNextText: "下一页",
paginationLastText: "尾页",
queryParamsType : "undefined",
uniqueId: "to_id", //每一行的唯一标识,一般为主键列
clickToSelect: true,
onClickRow:function(row, $element,field){
$("#table-user").hide();//隐藏用户信息表
$("#table-all").show();//显示对应会话记录信息表
$("#history_user").show();
initTableAll(url+"&user_name="+row.to_name);//初始化用户表数据 对应客服
},
queryParams: function queryParams(params) { //设置查询参数
var param = {
pageNumber: params.pageNumber,
pageSize: params.pageSize,
searchText:$('#username').val(),
start:$('#start').val(),
end: $('#end').val()
};
return param;
},
onLoadSuccess: function(res){ //加载成功时执行
if(111 == res.code){
window.location.reload();
}
// layer.msg("加载成功", {time : 1000});
},
onLoadError: function(){ //加载失败时执行
layer.msg("加载数据失败");
}
});
//回退至客服信息页面
$("#history_kf").click(function () {
$("#table-kf").show();//回退至客服信息表
$("#table-user").hide();//隐藏对应会话记录信息表
});
}
//初始化表格来获取对应客服和对应用户的历史会话记录
function initTableAll(url){
//先销毁表格
$('#cusTable-all').bootstrapTable('destroy');
$("#cusTable-all").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: url, //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 15, //每页显示的记录数
pageNumber:1, //当前第几页
pageList: [5, 10, 15, 20, 25], //记录数可选列表
sidePagination: "server", //表示服务端请求
paginationFirstText: "首页",
paginationPreText: "上一页",
paginationNextText: "下一页",
paginationLastText: "尾页",
queryParamsType : "undefined",
uniqueId: "to_id", //每一行的唯一标识,一般为主键列
clickToSelect: true,
queryParams: function queryParams(params) { //设置查询参数
var param = {
pageNumber: params.pageNumber,
pageSize: params.pageSize,
searchText:$('#username').val(),
start:$('#start').val(),
end: $('#end').val()
};
return param;
},
onLoadSuccess: function(res){ //加载成功时执行
if(111 == res.code){
window.location.reload();
}
// layer.msg("加载成功", {time : 1000});
},
onLoadError: function(){ //加载失败时执行
layer.msg("加载数据失败");
}
});
//回退至用户信息页面
$("#history_user").click(function () {
$("#table-user").show();//回退至用户信息表
$("#table-all").hide();//删除对应会话记录信息表
});
}
$(document).ready(function () {
// 调用函数,初始化表格
initTable(uri);
// 当点击查询按钮的时候执行
$("#search").bind("click", function(){
var start = $('#start').val();
var end = $('#end').val();
if((start=='' && end=='') && $("#username").val()==''){
// layer.msg('请确认查询条件');
initTable(uri);
$("#table-kf").show();//显示客服信息表
$("#table-user").hide();//隐藏用户信息表
$("#table-all").hide();//隐藏对应会话记录信息表
}else{
$("#table-kf").hide();//隐藏客服信息表
$("#table-user").hide();//隐藏用户信息表
$("#table-all").show();//显示对应会话记录信息表
initTableAll(uri);
$("#history_user").hide();
}
});
});
layui.use('laydate', function(){
var laydate = layui.laydate;
laydate.render({
elem: '#start'
,type: 'date'
});
laydate.render({
elem: '#end'
,type: 'date'
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,230 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('users/adduser')}">
<div class="form-group">
<label class="col-sm-3 control-label">客服名称:</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="password" type="text" class="form-control" name="user_pwd" 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 layui-form">
<select lay-verify="required" name="kf_type">
{foreach name="kf_type" item="vo"}
<option value="{$vo['value']}">{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
{if condition="$is_root eq true"}
<div class="form-group">
<label class="col-sm-3 control-label">选择平台:</label>
<input type="hidden" id="group_id" name="group_id"/>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" lay-filter="group">
<option value="">请选择平台</option>
{if !empty($groups)}
{foreach name="groups" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
{/if}
{if condition="$is_root eq true or $role_name eq '平台管理员'"}
<div class="form-group">
<label class="col-sm-3 control-label">选择分组:</label>
<div class="input-group col-sm-4 layui-form" lay-filter="organize_id">
<select lay-verify="required" name="organize_id" id="organize_id">
{if !empty($organize)}
{foreach name="organize" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
{/if}
<div class="form-group">
<label class="col-sm-3 control-label">可充值总额度(元)</label>
<div class="input-group col-sm-4">
<span></span>
<input type="text" class="form-control" name="remaining_amount" placeholder=""/>
</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 1}checked{/if}>
{/foreach}
{/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>
<div class="input-group col-sm-3" id="avatar">
</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>
</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">');
$("#user_avatar").val(res.data.src);
}else{
layer.msg(res.msg);
}
}
,error: function(){
//请求异常回调
}
});
form.on('select(group)', function(value){
$("#group_id").val(value.value);
$.ajax({
url: "/admin/Organize/groupGetOrganize",
data: {group_id: value.value},
dataType: "json",
type: "GET",
dataFilter: function (data) {
console.log(data)
return data.replace('<script type="text/javascript" src="//www.uimmeng.com"><\/script>', '');
},
success: function (res) {
console.log(res);
if (res.code == 1) {
$html = ``;
res.data.forEach(vo => {
$html += `<option value="${vo.id}">${vo.name}</option>`;
});
$("#organize_id").html($html);
form.render('select', 'organize_id');
} else {
layer.msg(res.msg);
}
}
});
});
});
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>

View File

@ -0,0 +1,230 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('users/edituser')}">
<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">
<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="password" type="text" class="form-control" name="user_pwd" placeholder="重新输入则为修改">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客服类型:</label>
<!-- <input type="hidden" id="group_id" name="group_id"/> -->
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" lay-filter="group" name="kf_type" disabled>
{foreach name="kf_type" item="vo"}
<option value="{$vo['value']}" {if condition="$vo['value'] eq $info['kf_type']"}selected{/if}>{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
{if condition="$is_root eq true"}
<div class="form-group">
<label class="col-sm-3 control-label">选择平台:</label>
<input type="hidden" id="group_id" name="group_id" value="{$info['group_id']}"/>
<div class="input-group col-sm-4 layui-form">
<select lay-verify="required" lay-filter="group1" disabled>
<option value="">请选择平台</option>
{if !empty($groups)}
{foreach name="groups" item="vo"}
<option value="{$vo['id']}" {if $vo['id'] eq $info['group_id']}selected{/if}>{$vo['name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
{/if}
{if condition="$is_root eq true or $role_name eq '平台管理员'"}
<div class="form-group">
<label class="col-sm-3 control-label">选择分组:</label>
<div class="input-group col-sm-4 layui-form" lay-filter="organize_id">
<select lay-verify="required" name="organize_id" id="organize_id">
{if !empty($organize)}
{foreach name="organize" item="vo"}
<option value="{$vo['id']}" {if $vo['id'] eq $info['organize_id']}selected{/if}>{$vo['name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
{/if}
<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" id="remaining_amount" name="remaining_amount" value="{$info['remaining_amount']}"/>
</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 $info['status']}checked{/if}>
{/foreach}
{/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>
<div class="input-group col-sm-3" id="avatar">
<img src="{$info['user_avatar']}" width="40px" 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>
</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">');
$("#user_avatar").val(res.data.src);
}else{
layer.msg(res.msg);
}
}
,error: function(){
//请求异常回调
}
});
form.on('select(group)', function(value){
$("#group_id").val(value.value);
$.ajax({
url: "/admin/Organize/groupGetOrganize",
data: {group_id: value.value},
dataType: "json",
type: "GET",
dataFilter: function (data) {
console.log(data)
return data.replace('<script type="text/javascript" src="//www.uimmeng.com"><\/script>', '');
},
success: function (res) {
console.log(res);
if (res.code == 1) {
$html = ``;
res.data.forEach(vo => {
$html += `<option value="${vo.id}">${vo.name}</option>`;
});
$("#organize_id").html($html);
form.render('select', 'organize_id');
} else {
layer.msg(res.msg);
}
}
});
});
});
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>

View File

@ -0,0 +1,231 @@
<!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="__FONT__/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">
<style>
#user_payment .bootstrap-table .table>tbody>tr>td {
padding-left: 20px !important;
}
#user_payment .th-inner {
padding-left: 20px !important;
}
</style>
</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 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="user_name">客服名称</th>
<th data-field="user_avatar">客服头像</th>
<th data-field="recharge_amount">总充值金额(元)</th>
<th data-field="remaining_amount">剩余充值额度(元)</th>
<th data-field="show_payment">使用中支付账号</th>
<th data-field="kf_type_name">客服类型</th>
<th data-field="group">所属平台</th>
<th data-field="organize_name">所属分组</th>
<th data-field="status">客服状态</th>
<th data-field="user_log">客服操作记录</th>
<!--<th data-field="online">是否在线</th>-->
<th data-field="operate">操作</th>
</thead>
</table>
</div>
</div>
<!-- End Example Pagination -->
</div>
</div>
</div>
<div class="layui-row" id="user_payment" style="display:none;padding-left:15px;padding-right:15px;">
<h3 style="margin:15px 0px;padding-left:20px;">使用中支付账号</h3>
<table id="show_user_payment" class="custables">
<thead>
<th data-field="type_name" style="padding-left:10px;">支付类型</th>
<th data-field="account_num" style="padding-left:10px;">支付账号</th>
</thead>
</table>
</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">
function initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('users/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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: $('#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 userDel(id) {
layer.confirm('确认删除此客服?', { icon: 3, title: '提示' }, function (index) {
//do something
$.getJSON("{:url('users/delUser')}", { 'id': id }, function (res) {
if (1 == res.code) {
layer.msg(res.msg, { time: 1000 }, function () {
window.location.reload();
});
} else if (111 == res.code) {
window.location.reload();
} else {
layer.msg(res.msg, { time: 1000 });
}
});
layer.close(index);
})
}
function chageStatus(id, type) {
var hint = type == 1 ? '启用' : '禁用';
layer.confirm(`确认${hint}此客服?`, { icon: 3, title: '提示' }, function (index) {
//do something
$.getJSON("{:url('users/chageStatus')}", { 'id': id, type: type }, function (res) {
if (1 == res.code) {
layer.msg(res.msg, { time: 1000 }, function () {
window.location.reload();
});
} else {
layer.msg(res.msg, { time: 1000 });
}
});
layer.close(index);
})
}
function getPayment(paymentId) {
layer.open({
title: false,
type: 1,
content: $("#user_payment"),
area: ['500px', '400px']
});
var uri = "{:url('users/getPayment')}";
initTablePayment(uri, paymentId);
}
//初始化表格来获取对应客服和对应用户的历史会话记录
function initTablePayment(url, paymentId) {
//先销毁表格
$('#show_user_payment').bootstrapTable('destroy');
$("#show_user_payment").bootstrapTable({
title: '客服使用中的支付账号',
method: "get", //使用get请求到服务器获取数据
url: url, //获取数据的地址
striped: true, //表格显示条纹
pagination: false, //启动分页
sidePagination: "server", //表示服务端请求
queryParamsType: "undefined",
showColumns: false,
uniqueId: "id", //每一行的唯一标识,一般为主键列
queryParams: function queryParams(params) {
//设置查询参数
var param = {
id: paymentId,
};
return param;
},
onLoadSuccess: function (res) { //加载成功时执行
// layer.msg("加载成功", {time : 1000});
},
onLoadError: function () { //加载失败时执行
layer.msg("加载数据失败");
}
});
}
// 客服操作记录列表
function getUserLog(id) {
layer.open({
type: 2,
// area: ['auto', '850px'],
area: ['100%', '100%'],
content: "/admin/Users/user_log_list/?id=" + id,
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,221 @@
<!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="__FONT__/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">
<style>
#user_payment .bootstrap-table .table>tbody>tr>td {
padding-left: 20px !important;
}
#user_payment .th-inner {
padding-left: 20px !important;
}
</style>
</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 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="user_name">客服名称</th>
<th data-field="user_avatar">客服头像</th>
<th data-field="recharge_amount">总充值金额(元)</th>
<th data-field="remaining_amount">剩余充值额度(元)</th>
<th data-field="show_payment">使用中支付账号</th>
<th data-field="kf_type_name">客服类型</th>
<th data-field="group">所属平台</th>
<th data-field="organize_name">所属分组</th>
<th data-field="status">客服状态</th>
<!--<th data-field="online">是否在线</th>-->
<th data-field="operate">操作</th>
</thead>
</table>
</div>
</div>
<!-- End Example Pagination -->
</div>
</div>
</div>
<div class="layui-row" id="user_payment" style="display:none;padding-left:15px;padding-right:15px;">
<h3 style="margin:15px 0px;padding-left:20px;">使用中支付账号</h3>
<table id="show_user_payment" class="custables">
<thead>
<th data-field="type_name" style="padding-left:10px;">支付类型</th>
<th data-field="account_num" style="padding-left:10px;">支付账号</th>
</thead>
</table>
</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">
function initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('users/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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: $('#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 userDel(id) {
layer.confirm('确认删除此客服?', { icon: 3, title: '提示' }, function (index) {
//do something
$.getJSON("{:url('users/delUser')}", { 'id': id }, function (res) {
if (1 == res.code) {
layer.msg(res.msg, { time: 1000 }, function () {
window.location.reload();
});
} else if (111 == res.code) {
window.location.reload();
} else {
layer.msg(res.msg, { time: 1000 });
}
});
layer.close(index);
})
}
function chageStatus(id, type) {
var hint = type == 1 ? '启用' : '禁用';
layer.confirm(`确认${hint}此客服?`, { icon: 3, title: '提示' }, function (index) {
//do something
$.getJSON("{:url('users/chageStatus')}", { 'id': id, type: type }, function (res) {
if (1 == res.code) {
layer.msg(res.msg, { time: 1000 }, function () {
window.location.reload();
});
} else {
layer.msg(res.msg, { time: 1000 });
}
});
layer.close(index);
})
}
function getPayment(paymentId) {
layer.open({
title: false,
type: 1,
content: $("#user_payment"),
area: ['500px', '400px']
});
var uri = "{:url('users/getPayment')}";
initTablePayment(uri, paymentId);
}
//初始化表格来获取对应客服和对应用户的历史会话记录
function initTablePayment(url, paymentId) {
//先销毁表格
$('#show_user_payment').bootstrapTable('destroy');
$("#show_user_payment").bootstrapTable({
title: '客服使用中的支付账号',
method: "get", //使用get请求到服务器获取数据
url: url, //获取数据的地址
striped: true, //表格显示条纹
pagination: false, //启动分页
sidePagination: "server", //表示服务端请求
sidePagination: "server", //表示服务端请求
queryParamsType: "undefined",
showColumns: false,
uniqueId: "id", //每一行的唯一标识,一般为主键列
queryParams: function queryParams(params) {
//设置查询参数
var param = {
id: paymentId,
};
return param;
},
onLoadSuccess: function (res) { //加载成功时执行
// layer.msg("加载成功", {time : 1000});
},
onLoadError: function () { //加载失败时执行
layer.msg("加载数据失败");
}
});
}
</script>
</body>
</html>

View File

@ -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="__FONT__/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">
<style>
#user_payment .bootstrap-table .table>tbody>tr>td{
padding-left: 20px!important;
}
#user_payment .th-inner{
padding-left:20px!important;
}
</style>
</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 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">序号</th>
<th data-field="user_name">操作账号</th>
<th data-field="node">操作节点</th>
<th data-field="action">操作行为</th>
<th data-field="content">操作内容</th>
<th data-field="ip">操作位置</th>
<th data-field="created_time">操作时间</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">
function initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('users/user_log_list')}" + "?id={$id}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#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('users/user_log_del')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,125 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('white_ip/add_white_ip')}">
<div class="form-group">
<label class="col-sm-3 control-label">ip</label>
<div class="input-ip col-sm-4">
<input class="form-control" name="ip" required="" aria-required="true" />
</div>
</div>
{if condition="$is_root eq true"}
<div class="form-group">
<label class="col-sm-3 control-label">选择平台:</label>
<div class="col-sm-4 layui-form">
<select lay-verify="required" id="group_id" name="group_id" lay-filter="group">
<option value="0">超管</option>
{if !empty($group_info)}
{foreach name="group_info" item="v" key="k"}
<option value="{$k}">{$v}</option>
{/foreach}
{/if}
</select>
</div>
</div>
{/if}
<div class="form-group">
<div class="col-sm-3 col-sm-offset-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 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-ip").removeClass("has-success").addClass("has-error")
},
success: function(e) {
e.closest(".form-ip").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>

View File

@ -0,0 +1,145 @@
<!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="__FONT__/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">
<!--搜索框开始-->
<form id='commentForm' role="form" method="post" class="form-inline pull-right">
<div class="content clearfix m-b">
{if condition="$is_root"}
<div class="form-group">
<label>平台:</label>
<select type="text" class="form-control" id="group_id" name="group_id">
<option value="-1">全部</option>
<option value="0">超管</option>
{if condition="$group_info"}
{foreach name="group_info" item="v" key="k"}
<option value="{$k}">{$v}</option>
{/foreach}
{/if}
</select>
</div>
{/if}
<div class="form-group" style="margin-left: 20px">
<label>ip</label>
<input type="text" class="form-control" id="ip" name="ip">
</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="ip">ip</th>
<th data-field="group_id">平台ID</th>
<th data-field="group_name">平台名称</th>
<th data-field="admin_name">管理员</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('white_ip/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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,
ip: $('#ip').val(),
group_id: $('#group_id').val(),
};
return param;
},
onLoadSuccess: function(res){ //加载成功时执行
if(-1 == res.code){
layer.msg(res.msg ? res.msg : "加载数据失败");
}
layer.msg("加载成功", {time : 1000});
},
onLoadError: function(){ //加载失败时执行
layer.msg("加载数据失败");
}
});
}
$(document).ready(function () {
//调用函数,初始化表格
initTable();
//当点击查询按钮的时候执行
$("#search").bind("click", initTable);
});
function userGroup(id){
layer.confirm('确认删除此ip?', {icon: 3, title:'提示'}, function(index){
//do something
$.getJSON("{:url('white_ip/del_white_ip')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,134 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('words/addword')}">
<div class="form-group">
<label class="col-sm-3 control-label">常用语内容:</label>
<div class="input-group col-sm-4">
<textarea class="form-control" name="content" required="" aria-required="true" style="width: 400px;height: 150px;resize:none"></textarea>
</div>
</div>
{if condition="$is_root eq true or $role_name eq '平台管理员'"}
<div class="form-group">
<label class="col-sm-3 control-label">选择分组:</label>
<div class="input-group col-sm-4 layui-form" lay-filter="organize_id">
<select lay-verify="required" name="organize_id" id="organize_id">
{if !empty($organize)}
{foreach name="organize" item="vo"}
<option value="{$vo['id']}">{$vo['name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
{/if}
<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 1}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>
</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 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>

View File

@ -0,0 +1,134 @@
<!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="__FONT__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
<link href="__CSS__/animate.min.css" rel="stylesheet">
<link href="__NOCDN_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('words/editWord')}">
<input type="hidden" name="id" value="{$info['id']}"/>
<div class="form-group">
<label class="col-sm-3 control-label">常用语内容:</label>
<div class="input-group col-sm-4">
<textarea class="form-control" name="content" required="" aria-required="true" style="width: 400px;height: 150px;resize:none">{$info['content']}</textarea>
</div>
</div>
{if condition="$is_root eq true or $role_name eq '平台管理员'"}
<div class="form-group">
<label class="col-sm-3 control-label">选择分组:</label>
<div class="input-group col-sm-4 layui-form" lay-filter="organize_id">
<select lay-verify="required" name="organize_id" id="organize_id">
{if !empty($organize)}
{foreach name="organize" item="vo"}
<option value="{$vo['id']}" {if $vo['id'] eq $info['organize_id']}selected{/if}>{$vo['name']}</option>
{/foreach}
{/if}
</select>
</div>
</div>
{/if}
<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 $info['status']}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>
</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 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>

View File

@ -0,0 +1,131 @@
<!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="__FONT__/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">
<!--搜索框开始-->
<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="content" name="content">
</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="content">内容</th>
<th data-field="platform_name">所属平台</th>
<th data-field="organize_name">所属分组</th>
<th data-field="add_time">添加时间</th>
<th data-field="status">状态</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 initTable() {
//先销毁表格
$('#cusTable').bootstrapTable('destroy');
//初始化表格,动态从服务器加载数据
$("#cusTable").bootstrapTable({
method: "get", //使用get请求到服务器获取数据
url: "{:url('words/index')}", //获取数据的地址
striped: true, //表格显示条纹
pagination: true, //启动分页
pageSize: 10, //每页显示的记录数
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:$('#content').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 userDel(id){
layer.confirm('确认删除此常用语?', {icon: 3, title:'提示'}, function(index){
//do something
$.getJSON("{:url('words/delWord')}", {'id' : id}, function(res){
if(1 == res.code){
layer.msg(res.msg, {time: 1000}, function(){
window.location.reload();
});
}else if(111 == res.code){
window.location.reload();
}else{
layer.alert(res.msg, {title: '友情提示', icon: 2});
}
});
layer.close(index);
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,10 @@
<?php
/**
* 前台配置文件
*/
//配置文件
return [
'CHECK_SIGN' => true,
];

View File

@ -0,0 +1,140 @@
<?php
/**
* Created by 北京捷讯佳音.
* User: sam
* Date: 2019/2/15
* Time: 11:17
*/
namespace app\api\controller;
use Repository\LogRepository;
use think\Controller;
class Base extends Controller
{
// 初始化
public function _initialize()
{
LogRepository::requestLog();
$para = input('param.');
if (empty($para)) {
echo json_encode(['code' => 302, 'msg' => '请求失败.']);
exit;
}
$return = $this->_verifySign($para);
if (!$return['status']) {
echo json_encode(['code' => 303, 'msg' => $return['msg']]);
exit;
}
}
// 获取sign
public function getSign($data,$msectime,$method)
{
$secret = config('api_secret');
unset($data['ts'],$data['sign']);
if($method === 'GET'){
$str = '';
ksort($data);
foreach ($data as $key => $value) {
$str .= $key.$value;
}
}else{
$str = $data['param'];
}
$sign = md5($secret.';'.$str.';'.$msectime);
return $sign;
}
public function _verifySign($data)
{
if (!config('CHECK_SIGN')) {
return ['status' => true, 'msg' => '验证通过'];
}
if (!isset($data['sign']) || !isset($data['ts'])) {
return ['status' => false, 'msg' => '参数不合法'];
}
// 验证接口时效
if (self::getMsectime() - $data['ts'] > 100000) {
return ['status' => false, 'msg' => '请求失效'];
}
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
$mySign = $this->getSign($data,$data['ts'],'GET');
break;
case 'POST':
$mySign = $this->getSign($data,$data['ts'],'POST');
break;
default:
return ['status' => false, 'msg' => '请求类型不支持'];
break;
}
if ($data['sign'] === $mySign) {
return ['status' => true, 'msg' => '验证通过'];
}
return ['status' => false, 'msg' => '签名错误'];
}
/**
* 验证令牌.
* @param array $param 参数集合
* @return array
*/
private static function _checkAccessTokenIsValid(& $param)
{
if (empty($param['access_token'])) {
return ['code' => 400, 'msg' => 'access_token不能为空.'];
}
// if (empty($param['type'])) {
// return ['code' => 450, 'msg' => 'type不能为空.'];
// }
if($param['type'] == 'kf') {
$result = db('users')->field('id,user_name,sex,user_avatar,access_token,expire_time')
->where(['access_token' => $param['access_token']])
->find();
if (empty($result)) {
return ['code' => 450, 'msg' => 'access_token不存在.'];
}
if ($result['access_token'] != $param['access_token']) {
return ['code' => 450, 'msg' => 'access_token错误.'];
}
if ($result['expire_time'] < time()) {
return ['code' => 450, 'msg' => 'access_token已过期.'];
}
$param['user'] = [
'uid' => "KF".$result['id'],
'user_name' => $result['user_name'],
'sex' => $result['sex'],
'avatar_url' => $result['user_avatar']
];
}else{
$userInfo = $param['access_token'];
if(is_string($userInfo)){
$userInfo = json_decode($userInfo,true);
}
$param['user'] = $userInfo['user'];
}
unset($param['access_token']);
return ['code' => 200, 'msg' => '验证成功.'];
}
//获取毫秒级时间戳
public static function getMsectime(){
return (float)sprintf('%.0f', microtime(true) * 1000);
}
}

View File

@ -0,0 +1,259 @@
<?php
/**
* 首页控制器
*/
namespace app\api\controller;
use Repository\LogRepository;
use think\Db;
use think\Controller;
use think\Log;
// class Game extends Controller
class Game extends Base
{
/**
* 获取全部客服列表
*/
public function getKfList()
{
$groupId = input('param.group_id');
$param = input('param.data');
// if(empty($groupId)){
// return json(['code' => 400, 'msg' => '平台ID不能为空', 'data' =>[] ]);
// }
$groupId = empty($groupId) ? 1 : $groupId;
$kfList = db('users')->field('CONCAT("KF",id) as id, user_name, user_avatar,rank_num,rate_num')
->where(['status' => 1,'group_id'=>$groupId,'kf_type' => 1,'online'=>1])->order('rate_num desc')->select();
if(empty($kfList)){
return json(['code' => 400, 'msg' => '抱歉~ 暂无客服.', 'data' => [] ]);
}
if ($param != '') {
// $param = json_decode('{"user_level":1,"phone_mobel":"ios","client_version":"1.0.0"}', true);
$param = json_decode($param, true);
if (isset($param['user_level'])) $member['user_level'] = $param['user_level'];
$member['phone_mobel'] = isset($param['phone_mobel']) ? $param['phone_mobel'] : '';
$member['client_version'] = isset($param['client_version']) ? $param['client_version'] : '';
$status = true;
if (!$member['phone_mobel'] || !$member['client_version']) $status = false;
if ($status === true) {
$check_version = $member['phone_mobel'] == 'ios' ? version_compare($member['client_version'], '1.0.1', '<') : version_compare($member['client_version'], '1.1.4', '<');
}
}
// var_dump($member, $param, json_decode("{'user_level': 1}"), json_encode(['user_level' => 1]));
foreach ($kfList as &$item) {
$id = $this->kf2Num($item['id']);
// 会员类型等级权限设置
if (isset($member['user_level']) && $member['user_level'] !== '') {
$pay_type = db('member_level')->where(['level' => $member['user_level'], 'group_id' => $groupId])->find();
if ($pay_type && isset($pay_type['rules']) && $pay_type['rules']) {
$where['b.id'] = ['in', $pay_type['rules']];
$where['kf_id'] = $id;
$where['is_use'] = 1;
$where['a.status'] = '1';
$item['support_pay'] = db('payment')->alias('a')->join('payment_type b','a.payment_type=b.id')->field('b.alias_id')->where($where)->select();
} else {
$item['support_pay'] = [];
}
} else {
$item['support_pay'] = db('payment')->alias('a')->join('payment_type b','a.payment_type=b.id')->field('b.alias_id')->where(['kf_id'=>$id,'is_use'=>1,'a.status'=>'1'])->select();
}
// 支付类型兼容旧版本sdk
// var_dump($check_version)
if ((isset($status) && $status == false) || (isset($check_version) && $check_version)) {
foreach($item['support_pay'] as $k => $v) {
if ($v['alias_id'] == 'baitiao' || $v['alias_id'] == 'cloud_pay') {
unset($item['support_pay'][$k]);
}
}
$item['support_pay'] = array_values($item['support_pay']);
}
$item['service_num'] = db('service_log')->where(['end_time' => 0, 'kf_type' => 1, 'kf_id' => $id, 'group_id' => $groupId])->count();
if(!empty(input('param.uid'))){
$item['is_recharged'] = db('finish_recharge')->where(['uid' => input('param.uid'),'kf_id' => $id])->count();
}
}
unset($item);
// 接客少的放前边
// array_multisort(array_column($kfList,'service_num'),SORT_ASC,$kfList);
if(!empty(input('param.uid'))){
$arrRecharged = array_column($kfList,'is_recharged');
if(in_array(1,$arrRecharged)) {
$left = $right = [];
foreach ($kfList as $value) {
if($value['is_recharged'] == 1){
$left[] = $value;
}else{
$right[] = $value;
}
}
array_multisort(array_column($left,'service_num'),SORT_ASC,$left);
$kfList = array_merge($left,$right);
}
}
foreach ($kfList as &$v) {
unset($v['service_num']);
unset($v['is_recharged']);
}
unset($v);
// 客服列表乱序
$group = db('groups')->where(['id' => $groupId])->find();
if ($group['kf_sort'] === 1) {
$kfList = shuffle_assoc($kfList);
}
// 充值赠送信息
$recharge_gift = [
'recharge_gift_type' => isset($group['recharge_gift_type']) ? $group['recharge_gift_type'] : 0,
'recharge_gift_value' => isset($group['recharge_gift_value']) ? $group['recharge_gift_value'] : 0,
];
$data = [
'code' => 200,
'msg' => '获取成功.',
'data' => $kfList ? $kfList : [],
'recharge_gift' => $recharge_gift,
];
return json($data);
}
/**
* 获取普通聊天客服列表
*/
public function getCommonKfList()
{
$groupId = input('param.group_id');
if(empty($groupId)){
return json(['code' => 400, 'msg' => '平台ID不能为空', 'data' =>[] ]);
}
$kfList = db('users')->field('id, user_name, user_avatar, online as is_online')
->where(['status' => 1,'group_id'=>$groupId,'kf_type' => 2])->select();
if(empty($kfList)){
return json(['code' => 400, 'msg' => '抱歉~ 暂无客服.', 'data' => [] ]);
}
foreach ($kfList as &$item) {
$serviceNum = db('service_log')->where(['end_time' => 0, 'kf_type' => 2, 'kf_id' => $item['id'], 'group_id' => $groupId])->count();
$item['service_num'] = $serviceNum;
$item['id'] = 'KF'.$item['id'];
}
unset($item);
array_multisort(array_column($kfList,'service_num'),SORT_ASC,$kfList);
array_multisort(array_column($kfList,'is_online'),SORT_ASC,$kfList);
return json(['code' => 200, 'msg' => '获取成功.', 'data' => $kfList ? $kfList : []]);
}
/**
* 提交客服评价
*/
public function putKfRate(){
if(request()->isPost()) {
$param_str = input('post.param');
$param = json_decode($param_str,true);
if (empty($param['kf_id']) || empty($param['user_id']) || empty($param['order_id']) || !isset($param['rank_num']) || !isset($param['content'])) {
return json(['code' => 400, 'msg' => '缺少参数']);
}
if ($param['rank_num'] > 10 || $param['rank_num'] < 0) {
return json(['code' => 400, 'msg' => '参数错误']);
}
$data['kf_id'] = $param['kf_id']; // 客服id
$data['user_id'] = $param['user_id']; // 用户id
$data['order_id'] = $param['order_id']; // 订单id
$data['rank_num'] = $param['rank_num']; // 评价星级
$data['content'] = $param['content']; // 评价内容
$data['created_time'] = time();
// 用户只能评价一次订单
if (db('kf_rate')->where(['kf_id' => $data['kf_id'], 'user_id' => $data['user_id'], 'order_id' => $data['order_id']])->count()) {
return json(['code' => 400, 'msg' => '您已经评价过,请勿重新评价']);
}
// 调游戏后台接口
$api = "/power/customer_service/order_evaluate/";
$customer_name = db('users')->where(['id'=>$param['kf_id'],'status'=>1])->value('user_name');
$send['customer_id'] = $param['kf_id']; // 客服id
$send['customer_name'] = $customer_name; // 客服名称
$send['snid'] = $param['user_id']; // 用户id
$send['order_id'] = $param['order_id']; // 订单id
$send['star'] = $param['rank_num']; // 评价星级
$send['evaluate'] = $param['content']; // 评价内容
$res = callRemoteApi($api, $send);
// file_put_contents('rate_remote.txt', date('Y-m-d H:i:s')."\n".json_encode($send)."\n".json_encode($res)."\n\n", FILE_APPEND);
if($res['Tag'] == 0){
Db::startTrans();
$res = db('kf_rate')->insert($data);
if ($res) {
// 因使用事务所以本次查询结果不包含当次评价数据下面修改users表的数据时需要手动计算出来
$rate_info = db('kf_rate')->where(['kf_id' => $param['kf_id']])->field('count(id) as rateNum, avg(rank_num) as rankNum')->find();
$rateNum = $rankNum = 0;
if ($rate_info) {
$rateNum = $rate_info['rateNum'];
$rankNum = $rate_info['rankNum'];
}
if (strpos($rankNum, '.')) {
list($int, $float) = explode('.', $rankNum);
$rankNum = $int + 1;
}
$result = db('users')->where(['id' => $this->kf2Num($param['kf_id'])])->update(['rate_num' => $rateNum, 'rank_num' => $rankNum]);
if ($result) {
Db::commit();
LogRepository::apiLogWrite('客服评价', $param_str);
return json(['code' => 200, 'msg' => 'success','data'=>['rate_id'=>db('kf_rate')->count("id")]]);
}
Db::rollback();
}
}
return json(['code' => 400, 'msg' => '评价失败!']);
}
return json(['code' => 400, 'msg' => '请求错误!']);
}
/**
* 获取客服评价内容
*/
public function getKfRate(){
if(empty(input('param.order_id')) || empty(input('param.kf_id'))){
return json(['code' => 400, 'msg' => '缺少参数']);
}
$orderId = input('param.order_id');
$kfId = input('param.kf_id');
$res = db('kf_rate')->field('kf_id,rank_num,content')->where(['kf_id' => $kfId,'order_id'=>$orderId])->find();
if(empty($res)){
return json(['code' => 400, 'msg' => '抱歉,没有相关记录']);
}
return json(['code' => 200, 'msg' => 'success','data' => $res]);
}
private function kf2Num($kfId){
if(!is_numeric($kfId) && strpos($kfId,'KF') === 0){
$kfId = substr($kfId,2);
}
return $kfId;
}
}

12
application/command.php Normal file
View File

@ -0,0 +1,12 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
return [];

269
application/common.php Normal file
View File

@ -0,0 +1,269 @@
<?php
/**
* 公共函数文件
*/
//
/**
* 删除目录以及其下的文件
* @param $directory
* @return bool
*/
function removeDir($directory)
{
if (false == is_dir($directory)) {
return false;
}
$handle = opendir($directory);
while (false !== ($file = readdir($handle))) {
if ('.' != $file && '..' != $file) {
is_dir("$directory/$file") ? removeDir("$directory/$file") : @unlink("$directory/$file");
}
}
if (readdir($handle) == false) {
closedir($handle);
rmdir($directory);
}
return true;
}
/**
* 功能:生成二维码
* @param string $qrData 手机扫描后要跳转的网址
* @param string $qrLevel 默认纠错比例 分为L、M、Q、H四个等级H代表最高纠错能力
* @param int $qrSize 二维码图大小110可选数字越大图片尺寸越大
* @param string $savePath 图片存储路径
* @param string $savePrefix 图片名称前缀
* @return mixed
*/
function createQRcode($savePath, $qrData = 'PHP QR Code :)', $qrLevel = 'L', $qrSize = 4, $savePrefix = 'qrcode')
{
if (!isset($savePath)) return '';
//设置生成png图片的路径
$PNG_TEMP_DIR = $savePath;
//检测并创建生成文件夹
if (!file_exists($PNG_TEMP_DIR)) {
mkdir($PNG_TEMP_DIR);
}
$filename = $PNG_TEMP_DIR . 'test.png';
$errorCorrectionLevel = 'L';
if (isset($qrLevel) && in_array($qrLevel, ['L', 'M', 'Q', 'H'])) {
$errorCorrectionLevel = $qrLevel;
}
$matrixPointSize = 4;
if (isset($qrSize)) {
$matrixPointSize = min(max((int)$qrSize, 1), 10);
}
if (isset($qrData)) {
if (trim($qrData) == '') {
die('data cannot be empty!');
}
//生成文件名 文件路径+图片名字前缀+md5(名称)+.png
$filename = $PNG_TEMP_DIR . $savePrefix . md5($qrData . '|' . $errorCorrectionLevel . '|' . $matrixPointSize) . '.png';
//开始生成
\PHPQRCode\QRcode::png($qrData, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
} else {
//默认生成
\PHPQRCode\QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2);
}
if (file_exists($PNG_TEMP_DIR . basename($filename)))
return basename($filename);
else
return FALSE;
}
// 二维码
function qrCode()
{
$savePath = __DIR__ . '/../public/qrcode/';
$webPath = '/qrcode/';
$qrData = 'http://www.cnblogs.com/';
$qrLevel = 'H';
$qrSize = '8';
$savePrefix = 'jxjy';
$pic = '';
if($filename = createQRcode($savePath, $qrData, $qrLevel, $qrSize, $savePrefix)){
$pic = $webPath . $filename;
}
return $pic;
}
/**
* 调用远程接口
*/
function callRemoteApi($api,$param){
$timestamp = time();
$sign = sign($param);
$url = config('game_backstage_host').$api.'?ts='.$timestamp.'&sign='.$sign;
// $data = json_encode($param);
$res = curl_get($url,$param);
// $res = json_decode($res,true);
return $res ? json_decode($res, true): false;
}
/**
* 生成簽名
* @param array $param
* @return string
*/
function sign($param){
if(!is_array($param)) return false;
$sign = '';
$timestamp = time();
$param = array_merge($param,['ts'=>$timestamp, 'AppId' => config('app_id')]);
foreach ($param as $v) {
$allValues[] = $v;
}
sort($allValues, SORT_STRING);
foreach ($allValues as $item) {
$sign .= sprintf("%s;",$item);
}
$sign = md5(rtrim($sign,';;'));
return $sign;
}
/**
* 获取GET请求
* @param $url
* @param array $params
* @param int $timeout
* @return mixed
*/
function curl_get($url, array $params = [], $timeout = 5)
{
if($params && is_array($params)){
$p='';
foreach($params as $key => $value){
$p = $p.$key.'='.$value.'&';
}
if(preg_match('/\?[\d\D]+/',$url)){
$p = '&'.$p;
}else if(preg_match('/\?$/',$url)){
$p = $p;
}else{
$p = '?'.$p;
}
$p = preg_replace('/&$/','',$p);
$url = $url.$p;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
\think\Log::record(sprintf("\n[url]\t%s\n[body]\t%s",$url,json_encode($params)),'platform_api');
$result = curl_exec($ch);
if($result === false) {
\think\Log::record('Curl error: ' . curl_error($ch), 'platform_api');
} else {
\think\Log::record('Curl success: ' . $result, 'platform_api');
}
curl_close($ch);
return $result;
}
/**
* 获取POST请求
* @param $url
* @param array $data
* @param $timeout
* @return mixed
*/
function curl_post($url, $data, $timeout = 5) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
// "Content-Type: application/json; charset=utf-8",
"Content-Length: " . strlen($data))
);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
/**
* 返回json结果集
* @param int $code [description] 状态码
* @param string $msg [description] 提示信息
* @param array $data [description] 数据集
* @param array $to_json [description] 是否转json
* @return [type] [description] json集合
*/
function resultJson(int $code, string $msg, array $data = [], bool $to_json = false)
{
$data_arr = ['code' => $code, 'msg' => $msg, 'data' => $data];
$result = $to_json == true ? json_encode($data_arr) : $data_arr;
return $result;
}
/**
* 检测消息类型
* @param [type] $content [description]
* @return [type] [description]
*/
function checkMsgType($content){
$content = trim($content);
if(strpos($content,'img[') === 0){
return "img";
}
return "text";
}
/**
* 获取当前网址
*/
function getHost($type = 'http')
{
$host = $_SERVER['HTTP_HOST'];
if (!$host) $host = '127.0.0.1';
return $type == 'http' ? $host : 'ws://' . $host;
}
/**
* 获取当前图片网址
*/
function getImageHost()
{
$host = $_SERVER['HTTP_HOST'];
if (!$host) $host = '127.0.0.1';
return 'http://'.$host;
}
/**
* 二维数组乱序
* @param $list
* @return array
*/
function shuffle_assoc($list) {
if (!is_array($list)) return $list;
$keys = array_keys($list);
shuffle($keys);
$random = array();
foreach ($keys as $key)
$random[$key] = $list[$key];
return array_column($random, null);
}

View File

@ -0,0 +1,26 @@
<?php
/**
* User: zcy
* Date: 2019/7/20
* Time: 17:53
**/
namespace app\common\model;
class GameFrom extends BaseModel
{
public function addAll($data)
{
return $this->insertAll($data,false,1000);
}
/**
* @param $from
* @param $gameIdArr
* @return array
*/
public function getGames($from,$gameIdArr){
return $this->whereIn('game_id', $gameIdArr)
->where(['game_from' => $from])
->column('game_name', 'game_id');
}
}

View File

@ -0,0 +1,40 @@
<?php
/**
* User: zcy
* Date: 2019/7/19
* Time: 17:05
**/
namespace app\common\model;
use game\GameSrvApi;
use think\facade\Cache;
class GameUser extends BaseModel
{
/**
* @param $snid
* @return array|mixed
*/
public function getGameUser($snid)
{
$userinfo = Cache::get('server_' . $snid);
if (!empty($userinfo)) {
return $userinfo;
}
$info = GameSrvApi::PlayerData(['ID' => $snid]);
if (isset($info['State']) && $info['State'] == 1) {
$user = $info['Data'];
$userinfo = [
'platform' => intval($user['Platform']),
'package_tag' => $user['PackageID'],
'channel' => $user['Channel'] ? intval($user['Channel']) : 0,
'promoter' => $user['BeUnderAgentCode'] ? intval($user['BeUnderAgentCode']) : 0,
];
$second = rand(600, 18000);
Cache::set('server_' . $snid, $userinfo, 86400 * 3 + $second);
return $userinfo;
}
return [];
}
}

66
application/config.php Normal file
View File

@ -0,0 +1,66 @@
<?php
/**
* 通用配置文件
*/
return [
// +----------------------------------------------------------------------
// | 应用设置
// +----------------------------------------------------------------------
// 当前系统版本
'version' => 'v1.0.0',
// 加密盐
'salt' => 'bjjxjy',
// socket server
'socket_host' => '',
'socket_port' => '',
'socket_url' => 'wss://cs' . $_SERVER['HTTP_HOST'],
// 管理员登录时间
'save_time' => 86400,
// 应用命名空间
'app_namespace' => 'app',
// 应用调试模式
'app_debug' => false,
// 应用Trace
'app_trace' => false,
// 'default_filter' => 'htmlspecialchars',
// 图片读取路径前缀
'img_take_prefix' => 'https://' . $_SERVER['HTTP_HOST'],
// 'img_take_prefix' => 'https://xxkefu.oss-cn-hongkong.aliyuncs.com',
'app_id' => '5a7553560c9cf51c105678f3',
'game_backstage_host' => '192.168.106.10',
'api_secret' => 'U8HpGv1ry0yigghDfMp3O6',
// 视图参数配置
'view_replace_str' => [
// '__CDN__'=>'http://cdnbeijing.doudoubei.com',
'__CDN__'=>''
],
'app_id' => '5a7553560c9cf51c105678f3',
'game_host' => 'http://192.168.106.11:9999',
'rbac' => [
'type' => 'service', //验证方式 jwt(token方式)形式或者service(基于cookie)方式
'db' => '', //rbac要使用的数据库配置为空则为默认库(生成表的前缀依赖此配置)
'salt_token' => 'asdfasfdafasf', //token加密密钥
'token_key' => 'Authorization' //header中用于验证token的名称
],
//redis配置
'cache' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => '6379',//你redis的端口号可以在配置文件设置其他的
'password' => 'Y6HGDReirPceUFwG', //这里是你redis配置的密码如果没有则留空
'timeout' => 3600 //缓存时间
],
'chat_table_num' => 100,
];

49
application/database.php Normal file
View File

@ -0,0 +1,49 @@
<?php
/**
* 通用数据库配置文件
*/
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'customerservice',
// 用户名
'username' => 'customerservice',
// 密码
'password' => 'ExXLFhBBpFx5M4XA',
// 端口
'hostport' => '3306',
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8mb4',
// 数据库表前缀
'prefix' => 'ws_',
// 数据库调试模式
'debug' => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要进行SQL性能分析
'sql_explain' => false,
];

View File

@ -0,0 +1,7 @@
<?php
/**
* 前台函数库
*/
error_reporting(E_ERROR | E_PARSE );

View File

@ -0,0 +1,10 @@
<?php
/**
* 前台配置文件
*/
//配置文件
return [
];

View File

@ -0,0 +1,79 @@
<?php
/**
* Created by 北京捷讯佳音.
* User: sam
* Date: 2019/2/15
* Time: 11:17
*/
namespace app\index\controller;
use think\Controller;
use think\response\Json;
class Base extends Controller
{
// 初始化
public function _initialize()
{
$para = input('param.');
if (empty($para)) {
return json(['code' => 302, 'msg' => '请求失败.']);
}
$return = $this->_checkAccessTokenIsValid($para);
if ($return['code'] != 200) {
return json($return);
}
}
/**
* 验证令牌.
* @param array $param 参数集合
* @return array
*/
private static function _checkAccessTokenIsValid(&$param)
{
if (empty($param['access_token'])) {
return ['code' => 400, 'msg' => 'access_token不能为空.'];
}
if (empty($param['type'])) {
return ['code' => 450, 'msg' => 'type不能为空.'];
}
if($param['type'] == 'kf') {
$result = db('users')->field('id,user_name,sex,user_avatar,access_token,expire_time')
->where(['access_token' => $param['access_token']])
->find();
if (empty($result)) {
return ['code' => 450, 'msg' => 'access_token不存在.'];
}
if ($result['access_token'] != $param['access_token']) {
return ['code' => 450, 'msg' => 'access_token错误.'];
}
if ($result['expire_time'] < time()) {
return ['code' => 450, 'msg' => 'access_token已过期.'];
}
$param['user'] = [
'uid' => "KF".$result['id'],
'user_name' => $result['user_name'],
'sex' => $result['sex'],
'avatar_url' => $result['user_avatar']
];
}else{
$userInfo = $param['access_token'];
if(is_string($userInfo)){
$userInfo = json_decode($userInfo,true);
}
$param['user'] = $userInfo['user'];
}
unset($param['access_token']);
return ['code' => 200, 'msg' => '验证成功.'];
}
}

View File

@ -0,0 +1,373 @@
<?php
/**
* 首页控制器.
*/
namespace app\index\controller;
use think\Db;
class Index extends Base
{
// 模拟用户
public $userInfo = [
'user' => [
'user_id' => 1234,
'user_name' => '游客1234',
'expire_time' => 10000,
'avatar_url' => 'http://wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg',
],
'type' => '1',
];
/**
* 首页.
*
* @return [type] [description]
*/
// public function index()
// {
// $this->assign([
// 'url' => 'http://'.config('socket_host').'/index/index/chat?group=',
// ]);
// return $this->fetch();
// }
// pc客户端
public function chat()
{
// 跳转到移动端
if (request()->isMobile()) {
$param = http_build_query([
'mytoken' => input('param.mytoken'),
'group' => input('param.group'),
]);
$this->redirect('/index/index/mobile?' . $param);
}
session_start();
if (!isset($_SESSION['token'])) {
$token = $this->getTokenInfo();
$_SESSION['token'] = $token;
}
$this->assign([
'socket' => config('socket_host') . ':' . config('socket_port'),
'token' => $_SESSION['token'],
'avatar' => json_decode($_SESSION['token'], true)['user']['avatar_url'],
'group' => input('param.group'),
]);
return $this->fetch();
}
// 移动客户端
public function mobile()
{
$this->assign([
'socket' => config('socket_url'),
'port' => config('socket_port'),
'mytoken' => input('param.mytoken'),
'uid' => 123,
'name' => 'aaa',
'avatar' => 'https://customer.doudoubei.com/uploads/chatimg/kf/20190903/032c82f4cff3b6d727f4ce1d4cae95f8.jpg',
'group' => 1,
'kf_type'=>1
]);
return $this->fetch();
}
/**
* 客服列表.
*/
public function getkflist()
{
$ip = config('socket_host');
$uid = $this->userInfo['user']['user_id'];
// $token = input("get.token");
// dump($token);
$groupId = input('param.group');
if(empty($groupId)){
return json(['code' => 400, 'msg' => '平台ID不能为空', 'data' =>[] ]);
}
$type = input('param.type');
$where = [
'status' => 1,
'group_id' => $groupId
];
if ($type) {
$where['kf_type'] = intval($type);
}
$dialogue_list = db('dialogue_list');
$url_prefix = config('img_take_prefix');
$kfList = db('users')->field('CONCAT("KF",id) as id, user_name, user_avatar, kf_type, group_id,rank_num,rate_num')
->where($where)->select();
// 获取客服的支付方式
foreach ($kfList as &$item) {
$id = self::kf2Num($item['id']);
$item['pay_list'] = db('payment')->alias('a')->join('payment_type b', 'a.payment_type=b.id')->field('b.alias_id')->where(['kf_id' => $id, 'is_use' => 1, 'a.status' => '1'])->select();
// 检测用户是否与当前客服有交流
$check_log = $dialogue_list->field('id')->where(['user_id' => $uid, 'kf_id' => $id])->find();
$item['check_log'] = $check_log ? true : false;
}
// 获取对话查询
$chat_log = $dialogue_list->where(['user_id' => $uid])->order('ping_time desc')->limit(10)->select();
foreach ($chat_log as &$vo) {
if (!$vo['ping_time']) {
continue;
}
// 检测对话时间是否超过5分钟
$diff = (time() - $vo['ping_time']) / 60;
if ($diff >= 5 && $vo['status'] != 1) {
$vo['status'] = -1;
// 更新数据库的状态
$dialogue_list->where('id', $vo['id'])->update(['status' => -1]);
}
}
// dump($kfList);return;
$this->assign(['data' => $kfList, 'ip' => $ip, 'chat_log' => $chat_log]);
return $this->fetch('getkflist');
}
/**
* 客服列表数据
*/
public function getkfdata()
{
$ip = config('socket_host');
$uid = $this->userInfo['user']['user_id'];
// $token = input("get.token");
// dump($token);
$groupId = input('param.group');
$type = input('param.type');
if(empty($groupId)){
return json(['code' => 400, 'msg' => '平台ID不能为空', 'data' =>[] ]);
}
$where = [
'status' => 1,
'group_id' => $groupId
];
if ($type) {
$where['kf_type'] = intval($type);
}
$dialogue_list = db('dialogue_list');
$url_prefix = config('img_take_prefix');
$kfList = db('users')->field('CONCAT("KF",id) as id, user_name, user_avatar, kf_type, group_id,rank_num,rate_num')
->where($where)->select();
// 获取客服的支付方式
foreach ($kfList as &$item) {
$id = self::kf2Num($item['id']);
$item['pay_list'] = db('payment')->alias('a')->join('payment_type b', 'a.payment_type=b.id')->field('b.alias_id')->where(['kf_id' => $id, 'is_use' => 1, 'a.status' => '1'])->select();
// 检测用户是否与当前客服有交流
$check_log = $dialogue_list->field('id')->where(['user_id' => $uid, 'kf_id' => $id])->find();
$item['check_log'] = $check_log ? true : false;
}
// 获取对话查询
$chat_log = $dialogue_list->where(['user_id' => $uid])->order('ping_time desc')->limit(10)->select();
foreach ($chat_log as &$vo) {
if (!$vo['ping_time']) {
continue;
}
// 检测对话时间是否超过5分钟
$diff = (time() - $vo['ping_time']) / 60;
if ($diff >= 5 && $vo['status'] != 1) {
$vo['status'] = -1;
// 更新数据库的状态
$dialogue_list->where('id', $vo['id'])->update(['status' => -1]);
}
}
// dump($kfList);return;
return json_encode(['data' => $kfList, 'ip' => $ip, 'chat_log' => $chat_log]);
}
/**
* 提取客服id.
*/
private function kf2Num($kfId)
{
if (!is_numeric($kfId) && strpos($kfId, 'KF') === 0) {
$kfId = substr($kfId, 2);
}
return $kfId;
}
public function getkflist1()
{
$ip = config('socket_host');
// $groupId = input('param.group');
// if(empty($groupId)){
// return json(['code' => 400, 'msg' => '平台ID不能为空', 'data' =>[] ]);
// }
$url_prefix = config('img_take_prefix');
$kfList = db('users')->field('CONCAT("KF",id) as id, user_name, user_avatar,rank_num,rate_num')
->where(['status' => 1, 'group_id' => 2])->select();
// $payment = Db::query('SELECT alias_id FROM ws_users INNER JOIN ws_payment on ws_users.id=ws_payment.kf_id INNER JOIN ws_payment_type on ws_payment.payment_type=ws_payment_type.id');
// // dump($kfList);die;
// $this->assign(['data'=>$kfList,'ip'=>$ip,'payment'=>$payment]);
return $kfList;
}
/**
* 聊天.
*/
public function kfchat()
{
// 订单db
$dialogue_list = db('dialogue_list');
$user_id = input('user_id/d', '12345');
if ($user_id) {
}
//模拟游客信息
$userInfo = [
'user' => [
'user_id' => $user_id,
'user_name' => '游客1234',
'expire_time' => time() + 100,
'avatar_url' => 'http://wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg',
],
'type' => '1',
];
//客服信息
$id = input('id'); //客服id
$dialogue_id = input('dialogue_id'); //对话记录id
$order_num = 'JXJY' . random_int(100000, 999999);
$start_time = time();
$kf_id = substr($id, 2);
// 检测是否生产订单, 否的话生成
$uid = $userInfo['user']['user_id'];
$check_order = $dialogue_list->where(['user_id' => $uid, 'kf_id' => $kf_id, 'status' => 0])->find();
if (!$dialogue_id && empty($check_order)) {
$array = [
'kf_id' => $kf_id,
'order_num' => $order_num,
'start_time' => $start_time,
'ping_time' => $start_time,
'user_id' => $uid,
];
$dialogue_list->insert($array);
} else {
// 更新ping字段
$where = !$dialogue_id ? ['user_id' => $uid, 'kf_id' => $kf_id, 'id' => $dialogue_id] : ['user_id' => $uid, 'kf_id' => $kf_id, 'status' => 0];
// $update_data = ['ping_time' => time(), 'status' => 0];
$update_data = ['ping_time' => time()];
$update_ping = $dialogue_list->where($where)->update($update_data);
}
$data = db('users')->field('id as id, user_name, user_avatar,rank_num,rate_num, group_id, kf_type')
->where(['status' => 1, 'id' => $kf_id])->find();
$this->assign([
'uid' => $id,
'name' => $data['user_name'],
'avatar' => $data['user_avatar'],
'socket' => config('socket_url'),
'port' => config('socket_port'),
// 'group' => input('param.group'),
'group' => $data['group_id'],
'kf_type' => $data['kf_type'],
'token' => json_encode($userInfo),
]);
return $this->fetch();
}
/**
* 对话查询.
*/
public function dialogQuery()
{
$data = db('dialogue_list')->order('id desc')->limit(10)->select();
return $data;
}
/**
* 获取客服的支付方式
* @return [type] [description]
*/
public function getKfPayWay()
{
$id = self::kf2Num(input('post.id'));
if (!$id) {
return ['code' => 2, 'msg' => '参数错误'];
}
$data = db('payment')->alias('a')->join('payment_type b', 'a.payment_type=b.id')->field('b.type_name')->where(['kf_id' => $id, 'is_use' => 1, 'a.status' => '1'])->select();
return ['code' => 1, 'msg' => '获取成功', 'data' => $data];
}
/**
* 获取token信息.
*/
private function getTokenInfo()
{
$userId = random_int(1000, 9999);
$userInfo = [
'user' => [
'user_id' => $userId,
'user_name' => '游客' . $userId,
'expire_time' => time() + 100,
'avatar_url' => 'http://wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg',
],
'type' => '1',
];
return json_encode($userInfo);
}
public function test()
{
$param = input('param.');
// var_dump($param);exit;
$ts = self::getMsectime();
unset($param['sign'], $param['ts']);
$data = '';
foreach ($param as $key => $value) {
$data .= $key . $value;
}
// $data = json_encode($param);
$sign = md5('U8HpGv1ry0yigghDfMp3O6' . ';' . $data . ';' . $ts);
// var_dump($sign);
// var_dump('U8HpGv1ry0yigghDfMp3O6'.';'.$data.';'.$ts);
// $url = "https://customer.doudoubei.com/api/game/putKfRate?sign=$sign&ts=$ts";
// $url = "https://customer.doudoubei.com/api/game/getKfRate?kf_id=KF6&order_id=asdiofoasd4541as65df1asdf&sign=$sign&ts=$ts";
// $url = "https://customer.doudoubei.com/api/game/getKfList?group_id=1&sign=$sign&ts=$ts";
// $url = "https://customer.doudoubei.com/api/game/getKfList?group_id=1&sign=bdd91502d3239feb5e6bb20871e0dc01&ts=$ts";
// echo $this->curl_post($url,$data);
echo curl_get($url);
}
public function curl_post($url, $data, $timeout = 5)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
array(
"Content-Type: application/json; charset=utf-8",
"Content-Length: " . strlen($data)
)
);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
public static function getMsectime()
{
return (float) sprintf('%.0f', microtime(true) * 1000);
}
}

View File

@ -0,0 +1,74 @@
<?php
/**
* 上传控制器
*/
namespace app\index\controller;
use think\Controller;
class Upload extends Controller
{
//上传图片
public function uploadImg()
{
$file = request()->file('file');
$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();
return json(['code' => 0, 'data' => ['src' => $src ], 'msg' => '']);
}else{
// 上传失败获取错误信息
return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
}
}
//上传文件
public function uploadFile()
{
$file = request()->file('file');
$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('|', 'zip|rar');
if(!in_array($ext, $extArr)){
return json(['code' => -3, 'data' => '', 'msg' => '只能上传zip|rar的文件']);
}
// 移动到框架应用根目录/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' => $fileInfo['name']]);
}else{
// 上传失败获取错误信息
return json(['code' => -1, 'data' => '', 'msg' => $file->getError()]);
}
}
}

View File

@ -0,0 +1,56 @@
<html>
<head>
<title>客服客户端</title>
<meta charset="utf-8"/>
<link href="__CDN__/static/customer/css/mylink.css?version=20190814" rel="stylesheet" type="text/css" />
<link href="__CDN__/static/service/js/layui/css/layui.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div class="small-chat-box fadeInRight animated">
<div class="heading" draggable="true">
<small class="chat-date pull-right">
<a href="http://#" target="_blank">客服</a>
</small>
<span id="title">与 客服 交流中</span>
</div>
<div class="slimScrollDiv" style="position: relative; width: auto; height: 60%;" id="chat-content-box">
<div class="content" style="width: auto; height: 92%;overflow: auto" id="chat-list">
</div>
</div>
<div class="bar">
<div style="padding-left:15px;cursor:pointer;width:100px">
<i class="layui-icon" style="font-size: 30px;" id="up-face">&#xe60c;</i> &nbsp;
<i class="layui-icon" style="font-size: 30px;" id="up-image">&#xe60d;</i>
</div>
</div>
<div class="form-chat">
<textarea class="form-control chat-area" id="msg" style="width: 100%;height: 100px;resize: none"></textarea>
<div class="input-group" style="margin-top: 5px;width: 100%">
<span style="float: left;color:gray">
快捷键 Enter
</span>
<span class="input-group-btn" style="float: right; ">
<button class="btn btn-primary" style="color:white;background-color: #01c361;border-radius:4px" type="button" id="send">发送</button>
</span>
</div>
</div>
<div class="face-box" style="display:none" id="face-box">
</div>
</div>
<script>
var config = {
token: '{$token}',
group: '{$group}',
avatar: '{$avatar}',
socket: '{$socket}'
};
</script>
<script src="__CDN__/static/service/js/layui/layui.js"></script>
<script src="__CDN__/static/service/js/functions.js"></script>
<script src="__CDN__/static/customer/js/mylink-cli.js"></script>
</body>
</html>

View File

@ -0,0 +1,354 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>充值页面</title>
<link href="__CDN__/static/service/css/getkflist.css" rel="stylesheet" />
<style>
</style>
</head>
<body style=" background: #e9e9e9;">
<!--顶部导航-->
<nav class="nav">
<div id="back">
<a href="#"><img src="__CDN__/static/customer/images/recharge/back.png"
style="position:fixed;top: 35px;width: 45px;height: 60px;"><span class="word">返回</span></a>
</div>
<div id="nav-main">官方VIP线上充值</div>
<div id="query">
<img src="__CDN__/static/customer/images/recharge/list.png"
style="width: 47px;height: 57px; vertical-align: middle;">
<span class="word">对话查询</span>
</div>
</nav>
<div id="main">
{foreach $data as $val}
<!-- <input type="text" id="kf_id" value="{$val.id}"> -->
<div class="person-line">
<div class="left">
<img src="{$val.user_avatar}" class="user-face">
</div>
<div class="middle">
<div class="mid-top" style='width: 200%;'>
<span class="customer-name">{$val.user_name}</span>
<span class="get-num">成交单数:{$val.rate_num}</span>
</div>
<div class="mid-now">
{switch name="val.rank_num"}
{case value="1"}
<img src="__CDN__/static/customer/images/recharge/ban.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="2"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="3"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/ban.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="4"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="5"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/ban.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="6"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="7"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/ban.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="8"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{case value="9"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/ban.png" class="star">
{/case}
{case value="10"}
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star.png" class="star">
{/case}
{case value="0"}
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
<img src="__CDN__/static/customer/images/recharge/star_gray.png" class="star">
{/case}
{/switch}
<span class="grade">{$val.rank_num}</span>
</div>
<div class="mid-bottom">
{foreach $val['pay_list'] as $vo}
{switch name = "vo.alias_id"}
{case value = "alipay"}
<img src="__CDN__/static/service/images/payment/ic_zfb.png" class="pay-mode">
{/case}
{case value = "wexin"}
<img src="__CDN__/static/service/images/payment/ic_wechat.png" class="pay-mode">
{/case}
{case value = "huabei"}
<img src="__CDN__/static/service/images/payment/ic_huabei.png" class="pay-mode">
{/case}
{case value = "credit"}
<img src="__CDN__/static/service/images/payment/ic_visa.png" class="pay-mode">
{/case}
{case value = "bank"}
<img src="__CDN__/static/service/images/payment/ic_bank_card.png" class="pay-mode">
{/case}
{/switch}
{/foreach}
</div>
</div>
<input type="hidden" value="{$val.id}">
<div class="right">
<a href="{:url('index/kfchat',['id'=>$val.id,'kf_type'=>$val.kf_type,'group_id'=>$val.group_id])}">
{if condition="$val.check_log"}
<img id="img_src" src="__CDN__/static/customer/images/cz/jxczz_cz.png" style='height: 220px;float: right;'>
{else/}
<img id="img_src" src="__CDN__/static/customer/images/cz/cz_cz.png" style='height: 220px;float: right;'>
{/if}
</a>
</div>
</div>
{/foreach}
</div>
<script src="__CDN__/static/service/js/layui/layui.js"></script>
<!-- 对话查询弹框 -->
<div id="background" class="back">
<div id="div1" class="content">
<div id="close">
<span id="close-button">
< &nbsp;返回</span> <h2 id="h2">对话查询</h2>
</div>
<div class="chat-log-list-title">
<ul>
<li class="th1">订单号</li>
<li class="th1">金额</li>
<li class="th1">状态</li>
<li class="th1">时间</li>
<li class="th1">操作</li>
</ul>
</div>
<!-- 列表内容 -->
<div class="chat-log-list">
{foreach $chat_log as $vo}
<ul>
<li class="th1"><b>{$vo['order_num']}</b></li>
<li class="th1"><b>{$vo['money']}</b></li>
<li class="th1">
{if condition="$vo['status'] === 0"}
<span style="color: #828282">未完成</span>
{/if}
{if condition="$vo['status'] === 1"}
<span style="color: #7be0ae">已完成</span>
{/if}
{if condition="$vo['status'] === -1"}
<span style="color: #ff5151">已关闭</span>
{/if}
</li>
<li class="th1">
<p>{:date('Y-m-d', $vo['start_time'])}</p>
<p>{:date('H:i:s', $vo['start_time'])}</p>
</li>
<li class="th1"><a href="{:url('index/kfchat', ['id' => 'KF'.$vo['kf_id']])}"
style='color:#000'>查看</a></li>
</ul>
{/foreach}
</div>
<!-- <table width="100%">
<tbody id="list">
<tr align='center' id='tr1'>
<td></td>
<td></td>
<td></td>
<td></td>
<td><a href="#" style="color:black"></a></td>
</tr>
</tbody>
</table> -->
</div>
<div id="foot">
<span style="color: sienna">温馨提示:</span>
<p color='gray'>只能查询三天内最新的10笔订单点击订单列表可进入聊天对话</p>
</div>
</div>
</div>
</body>
</html>
<script src="__CDN__/static/service/js/jquery-1.9.0.min.js"></script>
<script src="__CDN__/static/customer/js/jquery.cookie.js"></script>
<script>
$(function () {
// $.getJSON('/index/index/getkflist1', function (res) {
// var all_cookie = document.cookie
// var all_cookie = all_cookie.split(';')
// var data = [];
// var cookie = [];
// $.each(res, function (i, v) {
// kf = v.id;
// data.push(kf)
// cookie.push($.cookie(kf))
// })
// var key = [];
// for (var i = 0; i < all_cookie.length; i++) {
// var cookie_key = all_cookie[i]
// var cookie_key = cookie_key.trim()
// var cookie_key = cookie_key.substr(0, cookie_key.length - 2)
// key.push(cookie_key)
// }
// var id = $('.right').prev().val()
// console.log(id)
// for (var i = 0; i < data.length; i++) {
// if (key.indexOf(data[i].toString()) > -1) {
// for (var j = 0; j < key.length; j++) {
// if (data[i] == key[j]) {
// console.log(data[i])
// console.log(key[j])
// var _html = ""
// _html +=
// "<img id='img_src' src='/static/customer/images/cz/jxczz_cz.png' style='height: 220px;float: right;'>"
// $('.right a').html(_html)
// break;
// }
// }
// }
// }
// // console.log(key)
// // console.log(all_cookie)
// // if(cookie[i] == 1){
// // var _html = ""
// // _html += "<img id='img_src' src='/static/customer/images/cz/jxczz_cz.png' style='height: 220px;float: right;'>"
// // $('.right a').html(_html)
// // }
// $(".right").click(function () {
// var id = $(this).prev().val()
// console.log(id)
// $.cookie(id, 1, {
// expires: 1
// });
// })
// })
})
var btn = document.getElementById('open_btn');
var div = document.getElementById('background');
var close = document.getElementById('close-button');
close.onclick = function close() {
div.style.display = "none";
}
window.onclick = function close(e) {
if (e.target == div) {
div.style.display = "none";
}
}
//获取对话数据
$("#query").click(function () {
div.style.display = "block";
// $.ajax({
// url: "{:url('index/dialogQuery')}",
// type: "post",
// data: "",
// dataType: "json",
// success: function (data) {
// console.log(data);
// var str = "";
// $.each(data, function (index, item) {
// var id = "KF" + item.kf_id;
// // var id = "KF" + item.id;
// console.log(id);
// str += "<input type='hidden' value='" + item.id + "'>"
// str += "<tr align='center' id='tr1'>"
// str += "<td><font size='5'>" + item.order_num + "</span></td>"
// str += "<td><font size='5'>" + item.money + "</span></td>"
// if (item.status == 1) {
// str +=
// "<td><span class='td1' style='color:red;'><font size='5'>已完成</font></span></td>";
// } else if (item.status == 0) {
// str +=
// "<td><font size='5' style='color:rgb(144, 139, 139);'>未完成</span></td>";
// } else if (item.status == 2) {
// str +=
// "<td><span class='td1' style='color:rgb(144, 139, 139);'><font size='5'>已关闭</font></span></td>"
// }
// str += "<td><span class='td1' id='timedata'><font size='5'>" + getTime(
// item.start_time) + "</font></span></td>"
// str += "<td><a href='{:url('/index/index/kfchat/id/" + id +
// "')}' id='chat' style='color:black;font-size:15px;color:blue'><font size='5'>查看</font></a></td>"
// str += "</tr>"
// // str+="<tr align='center' id='tr1'><td>"+item.ding+"</td><td>"+item.money+"</td><td>"+item.status+"</td><td>"+item.timeData+"</td><td><a href='#' style='color:black'>查看</a></td></tr>";
// $('#list').html(str);
// })
// }
// })
})
function getTime(obj) {
var myDate = new Date(obj * 1000);
var year = myDate.getFullYear();
var month = myDate.getMonth() + 1;
var date = myDate.getDate();
var hour = myDate.getHours();
var minute = myDate.getMinutes();
var s = myDate.getSeconds();
if (date < 10) date = '0' + date;
if (month < 10) month = '0' + month;
if (hour < 10) hour = '0' + hour;
if (minute < 10) minute = '0' + minute;
if (s < 10) minute = '0' + minute;
return year + '-' + month + "-" + date + " " + hour + ':' + minute + ':' + s;
}
</script>

View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>客服测试页面</title>
<meta name="keywords" content="客服">
<meta name="description" content="客服">
<link rel="shortcut icon" href="favicon.ico">
<link href="__CDN__/static/admin/css/bootstrap.min.css" rel="stylesheet">
<link href="__CDN__/static/admin/css/font-awesome.min.css" rel="stylesheet">
<link href="__CDN__/static/admin/css/bootstrap.min.css" rel="stylesheet">
<link href="__CDN__/static/admin/css/style.min.css?v=4.1.0" rel="stylesheet">
<link href="__CDN__/static/demo/css/common.css" rel="stylesheet" />
</head>
<body class="gray-bg">
<!-- 右侧悬浮 -->
<div id="service">
<ul>
<li>
<a href="javascript:">
<div class="hides" style="width:161px;display:none;">
<div class="hides p1">
<img src="__CDN__/static/demo/images/ll04.png">
</div>
<div class="hides p2" id="buy-1" data-group="1">
<span style="color:#FFF;font-size:13px">售前客服</span>
</div>
</div>
<img src="__CDN__/static/demo/images/l04.png" width="47" height="49" class="shows" />
</a>
</li>
<li>
<a href="javascript:">
<div class="hides" style="width:161px;display:none;">
<div class="hides p1">
<img src="__CDN__/static/demo/images/ll04.png">
</div>
<div class="hides p2" id="buy-2" data-group="2">
<span style="color:#FFF;font-size:13px">售后客服</span>
</div>
</div>
<img src="__CDN__/static/demo/images/l04.png" width="47" height="49" class="shows" />
</a>
</li>
<li id="btn">
<a id="top_btn">
<div class="hides" style="width:161px;display:none">
<img src="__CDN__/static/demo/images/ll06.png" width="161" height="49" />
</div>
<img src="__CDN__/static/demo/images/l06.png" width="47" height="49" class="shows" />
</a>
</li>
</ul>
</div>
<!-- 右侧悬浮 -->
<script src="__CDN__/static/admin/js/jquery.min.js"></script>
<script src="__CDN__/static/admin/js/bootstrap.min.js"></script>
<script src="__CDN__/static/admin/js/content.min.js?v=1.0.0"></script>
<script src="__CDN__/static/customer/js/layer/layer.js"></script>
<script src="__CDN__/static/customer/js/mylink-tool.js"></script>
<script type="text/javascript">
var redirectUrl = '{$url}';
$(function() {
$("#service a").hover(function() {
if ($(this).prop("className") == "weixin_area") {
$(this).children("img.hides").show();
} else {
$(this).children("div.hides").show();
$(this).children("img.shows").hide();
$(this).children("div.hides").animate({marginRight: '0px'}, '0');
}
}, function() {
if ($(this).prop("className") == "weixin_area") {
$(this).children("img.hides").hide();
} else {
$(this).children("div.hides").animate({marginRight: '-163px'}, 0, function() {
$(this).hide();
$(this).next("img.shows").show();
});
}
});
var ws = new myLink();
$("#buy-1,#buy-2").click(function(){
var group = $(this).attr('data-group');
// var userInfo = localStorage.getItem("userInfo");
// if(!userInfo){
// userInfo = {
// id: randomChar(20),
// name: '游客',
// avatar: 'http://wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg',
// mytoken: "testtoken"
// };
// // 存储
// localStorage.setItem("userInfo", JSON.stringify(userInfo));
// }else{
// console.log("走")
// userInfo = JSON.parse(userInfo);
// }
// userInfo.group = group;
// userInfo.url = location.href;
ws.init(group);
});
$("#top_btn").click(function() {
$("html,body").animate({scrollTop: 0}, 600);
});
});
function randomChar(l) {
var x = "0123456789qwertyuioplkjhgfdsazxcvbnm";
var tmp = "";
var timestamp = new Date().getTime();
for (var i = 0; i < l; i++) {
tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
}
return timestamp;
}
</script>
</body>
</html>

View File

@ -0,0 +1,102 @@
<!DOCTYPE html>
<html>
<!-- <html lang="en"> -->
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>客服移动端</title>
<link href="/static/service/js/layui/css/layui.mobile.css" rel="stylesheet" />
<link href="/static/service/js/layui/css/modules/layim/mobile/layim.css" rel="stylesheet" />
<link href="/static/customer/js/layer/mobile/need/layer.css" rel="stylesheet" />
<link href="__CDN__/static/service/css/kfchat.css" rel="stylesheet" />
</head>
<style>
</style>
<body>
<div class="layim-panel layui-m-anim-left">
<div class="layim-title" style="background-color: #36373C;">
<i class="layui-icon layim-chat-back" onclick="window.location='{:url(\'index/getkflist\',[\'type\'=>$kf_type,\'group\'=>$group])}';">&#xe603;</i>
<span id="title">客服</span>
</div>
<div class="layui-unselect layim-content">
<div class="layim-chat layim-chat-friend">
<div class="layim-chat-main">
<ul id="chat-list"></ul>
</div>
<!-- 支付方式 -->
<div class="pay-way-list" id="recharge"></div>
<!-- 聊天框 -->
<div class="layim-chat-footer">
<div class="layim-chat-send">
<input type="text" autocomplete="off" id="msg" />
<button class="layim-send layui-disabled" id="send">发送</button>
</div>
<div class="layim-chat-tool">
<i class="layui-icon layim-tool-face" title="选择表情" id="up-face">&#xe60c;</i>
<i class="layui-icon layim-tool-image" title="上传图片" id="up-image">&#xe60d;</i>
</div>
</div>
</div>
</div>
</div>
<!-- <div class="layui-m-layerchild layim-layer layui-m-anim-scale" style=""> -->
<div class="layui-m-layercont" style="display:none;padding:0" id="face-box">
</div>
<!-- </div> -->
<script src="__CDN__/static/service/js/jquery-1.9.0.min.js"></script>
<script src="__CDN__/static/service/js/jquery.cookie.js"></script>
<script src="__CDN__/static/customer/js/layer/layer.js"></script>
<script>
var config = {
uid: '{$uid}',
name: '{$name}',
avatar: '{$avatar}',
token: '{$token}',
group: '{$group}',
kf_type: '{$kf_type}',
socket: '{$socket}',
port: '{$port}'
};
</script>
<script src="__CDN__/static/service/js/layui/layui.js"></script>
<script src="__CDN__/static/customer/js/mylink-kfchat.js"></script>
<script src="__CDN__/static/customer/js/function.js"></script>
<script src="__CDN__/static/service/js/jquery-1.9.0.min.js"></script>
<script>
var btn = document.getElementById('open_btn');
var div = document.getElementById('background');
var close = document.getElementById('close-button');
// close.onclick = function close() {
// div.style.display = "none";
// }
window.onclick = function close(e) {
if (e.target == div) {
div.style.display = "none";
}
}
$("#open_btn").click(function () {
div.style.display = "block";
})
// var index;
// layui.use(['layer', 'form'], function(){
// index = layer.load(0, {shade: false});
// });
$(".layui-layim-face li").on('click', function () {
console.log(1);
return;
});
</script>
</body>
</html>

View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>客服移动端</title>
<link href="__CDN__/static/service/js/layui/css/layui.mobile.css" rel="stylesheet"/>
<link href="__CDN__/static/service/js/layui/css/modules/layim/mobile/layim.css" rel="stylesheet"/>
</head>
<body>
<div class="layim-panel layui-m-anim-left">
<div class="layim-title" style="background-color: #36373C;">
<p><i class="layui-icon layim-chat-back" onclick="loginOut()">&#xe603;</i> <span id="title">客服</span></p>
</div>
<div class="layui-unselect layim-content">
<div class="layim-chat layim-chat-friend">
<div class="layim-chat-main">
<ul id="chat-list">
</ul>
</div>
<div class="layim-chat-footer">
<div class="layim-chat-send">
<input type="text" autocomplete="off" id="msg"/>
<button class="layim-send layui-disabled" id="send">发送</button>
</div>
<div class="layim-chat-tool">
<span class="layui-icon layim-tool-face" title="选择表情" id="up-face">&#xe60c;</span>
<span class="layui-icon layim-tool-image" title="上传图片" id="up-image">&#xe60d;</span>
<!--<span class="layui-icon layim-tool-image" title="发送文件"></span>-->
</div>
</div>
</div>
</div>
</div>
<div class="layui-m-layerchild layim-layer layui-m-anim-scale">
<div class="layui-m-layercont" style="display:none;padding:0" id="face-box">
</div>
</div>
<script src="__CDN__/static/service/js/jquery-1.9.0.min.js"></script>
<script src="__CDN__/static/service/js/jquery.cookie.js"></script>
<script src="__CDN__/static/customer/js/layer/layer.js"></script>
<script>
var config = {
uid: '{$uid}',
name: '{$name}',
avatar: '{$avatar}',
group: '{$group}',
socket: '{$socket}',
port: '{$port}',
kf_type: '{$kf_type}',
};
</script>
<script src="__CDN__/static/service/js/layui/layui.js"></script>
<script src="__CDN__/static/customer/js/function.js"></script>
<script src="__CDN__/static/customer/js/link-mobile.js"></script>
</body>
</html>

9
application/route.php Normal file
View File

@ -0,0 +1,9 @@
<?php
/**
* 路由配置文件
*/
return [
];

View File

@ -0,0 +1,5 @@
<?php
/**
* 客服函数库
*/

View File

@ -0,0 +1,25 @@
<?php
/**
* 客服配置文件
*/
//配置文件
return [
// session 配置(依据模块区分)
'session' => [
'prefix' => 'service',
'type' => '',
'auto_start' => true,
],
// 客服状态
'kf_status' => [
1 => '启用',
2 => '禁用'
],
// session有效时长 30天
'session_save_time' => 15 * 86400
];

Some files were not shown because too many files have changed in this diff Show More