init
This commit is contained in:
commit
334733f932
|
|
@ -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>
|
||||
|
|
@ -0,0 +1 @@
|
|||
deny from all
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 后台函数库
|
||||
*/
|
||||
|
|
@ -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 => '离线'
|
||||
]
|
||||
];
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
@ -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)]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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, '成功');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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, '删除成功');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
@ -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/");
|
||||
}
|
||||
}
|
||||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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' => '删除成功']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
||||
<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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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">© 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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
||||
<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>
|
||||
|
|
@ -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>
|
||||
|
||||
<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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 前台配置文件
|
||||
*/
|
||||
|
||||
//配置文件
|
||||
return [
|
||||
'CHECK_SIGN' => true,
|
||||
];
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -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 [];
|
||||
|
|
@ -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 二维码图大小,1-10可选,数字越大图片尺寸越大
|
||||
* @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);
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
@ -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 [];
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
];
|
||||
|
||||
|
|
@ -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,
|
||||
];
|
||||
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 前台函数库
|
||||
*/
|
||||
|
||||
error_reporting(E_ERROR | E_PARSE );
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 前台配置文件
|
||||
*/
|
||||
|
||||
//配置文件
|
||||
return [
|
||||
|
||||
];
|
||||
|
|
@ -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' => '验证成功.'];
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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"></i>
|
||||
<i class="layui-icon" style="font-size: 30px;" id="up-image"></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>
|
||||
|
|
@ -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">
|
||||
< 返回</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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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])}';"></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"></i>
|
||||
<i class="layui-icon layim-tool-image" title="上传图片" id="up-image"></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>
|
||||
|
|
@ -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()"></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"></span>
|
||||
<span class="layui-icon layim-tool-image" title="上传图片" id="up-image"></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>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 路由配置文件
|
||||
*/
|
||||
|
||||
return [
|
||||
|
||||
];
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* 客服函数库
|
||||
*/
|
||||
|
|
@ -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
Loading…
Reference in New Issue