feat: 牛牛单独限红 - 新增limit_low_nn/limit_high_nn字段,代理端添加/编辑代理和会员支持牛牛限红设置,语言包三语支持

This commit is contained in:
li
2026-02-11 19:53:50 +08:00
parent 1ce6c3d780
commit 71d7ff1d7b
36 changed files with 2590 additions and 18 deletions
Binary file not shown.
+16 -2
View File
@@ -95,16 +95,30 @@
layui.use('laydate', function () {
var laydate = layui.laydate;
// 计算默认时间:今天07:00:00 ~ 明天06:59:59
var now = new Date();
var y = now.getFullYear();
var m = ('0' + (now.getMonth() + 1)).slice(-2);
var d = ('0' + now.getDate()).slice(-2);
var tomorrow = new Date(now.getTime() + 86400000);
var ty = tomorrow.getFullYear();
var tm = ('0' + (tomorrow.getMonth() + 1)).slice(-2);
var td = ('0' + tomorrow.getDate()).slice(-2);
var defaultStart = y + '-' + m + '-' + d + ' 07:00:00';
var defaultEnd = ty + '-' + tm + '-' + td + ' 06:59:59';
// 开始时间
laydate.render({
elem: '#start',
type: 'datetime'
type: 'datetime',
value: defaultStart
});
// 结束时间
laydate.render({
elem: '#end',
type: 'datetime'
type: 'datetime',
value: defaultEnd
});
});
function get_profit(){
+89
View File
@@ -0,0 +1,89 @@
{include file="public/header" /}
<body>
<div class="x-body">
<div class="layui-card">
<div class="layui-card-header">会话信息</div>
<div class="layui-card-body">
<table class="layui-table" lay-skin="nob">
<tr>
<td width="120"><strong>会话ID:</strong></td>
<td>{$session.id}</td>
<td width="120"><strong>用户名:</strong></td>
<td>{$session.username}</td>
</tr>
<tr>
<td><strong>用户余额:</strong></td>
<td>{$session.money}</td>
<td><strong>客服:</strong></td>
<td>{$session.admin_username|default='未分配'}</td>
</tr>
<tr>
<td><strong>来源:</strong></td>
<td>
{switch name="session.source"}
{case value="1"}PC{/case}
{case value="2"}Game{/case}
{case value="3"}Portal{/case}
{/switch}
</td>
<td><strong>状态:</strong></td>
<td>
{switch name="session.status"}
{case value="0"}待分配{/case}
{case value="1"}进行中{/case}
{case value="2"}已结束{/case}
{/switch}
</td>
</tr>
<tr>
<td><strong>开始时间:</strong></td>
<td>{$session.create_time|date='Y-m-d H:i:s',###}</td>
<td><strong>结束时间:</strong></td>
<td>{if condition="$session.end_time"}{$session.end_time|date='Y-m-d H:i:s',###}{else/}-{/if}</td>
</tr>
{if condition="$session.rating"}
<tr>
<td><strong>评分:</strong></td>
<td colspan="3">
<span style="color: #FFB800;">{$session.rating}星</span>
{if condition="$session.rating_content"}
<br><span style="color: #666;">{$session.rating_content}</span>
{/if}
</td>
</tr>
{/if}
</table>
</div>
</div>
<div class="layui-card" style="margin-top: 20px;">
<div class="layui-card-header">聊天记录</div>
<div class="layui-card-body" style="height: 400px; overflow-y: auto; background: #f8f8f8;">
{volist name="messages" id="msg"}
<div style="margin-bottom: 15px; {eq name='msg.sender_type' value='2'}text-align: right;{/eq}">
<div style="display: inline-block; max-width: 60%; text-align: left;">
<div style="font-size: 12px; color: #999; margin-bottom: 3px;">
{eq name="msg.sender_type" value="1"}
用户
{else/}
客服
{/eq}
· {$msg.create_time|date='Y-m-d H:i:s',###}
</div>
<div style="padding: 10px; background: {eq name='msg.sender_type' value='1'}#fff{else/}#1E9FFF{/eq};
color: {eq name='msg.sender_type' value='1'}#333{else/}#fff{/eq};
border-radius: 5px; word-break: break-all;">
{eq name="msg.msg_type" value="2"}
<img src="{$msg.content}" style="max-width: 300px;">
{else/}
{$msg.content}
{/eq}
</div>
</div>
</div>
{/volist}
</div>
</div>
</div>
</body>
</html>
+117
View File
@@ -0,0 +1,117 @@
{include file="public/header" /}
<body>
<div class="x-nav">
<span class="layui-breadcrumb">
<a href="">首页</a>
<a><cite>聊天记录查询</cite></a>
</span>
<a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right" href="javascript:location.replace(location.href);" title="刷新">
<i class="layui-icon" style="line-height:30px">ဂ</i></a>
</div>
<div class="x-body">
<div class="layui-row">
<form class="layui-form layui-col-md12 x-so" method="get">
<div class="layui-input-inline">
<input type="text" name="username" value="{$get.username|default=''}"
placeholder="用户名" class="layui-input">
</div>
<div class="layui-input-inline">
<select name="admin_id">
<option value="">全部客服</option>
{volist name="admins" id="admin"}
<option value="{$admin.id}" {if condition="isset($get['admin_id']) && $get['admin_id'] == $admin['id']"}selected{/if}>
{$admin.nickname|default=$admin.username}
</option>
{/volist}
</select>
</div>
<div class="layui-input-inline">
<input type="text" name="startDate" id="startDate" value="{$get.startDate|default=''}"
placeholder="开始日期" class="layui-input">
</div>
<div class="layui-input-inline">
<input type="text" name="endDate" id="endDate" value="{$get.endDate|default=''}"
placeholder="结束日期" class="layui-input">
</div>
<button class="layui-btn" type="submit"><i class="layui-icon">&#xe615;</i></button>
<button class="layui-btn layui-btn-warm" type="submit" name="export" value="1">
<i class="layui-icon">&#xe67d;</i>导出
</button>
</form>
</div>
<table class="layui-table">
<thead>
<tr>
<th>会话ID</th>
<th>用户名</th>
<th>客服</th>
<th>来源</th>
<th>状态</th>
<th>评分</th>
<th>开始时间</th>
<th>结束时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{volist name="list" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{$vo.username}</td>
<td>{$vo.admin_username|default='未分配'}</td>
<td>
{switch name="vo.source"}
{case value="1"}PC{/case}
{case value="2"}Game{/case}
{case value="3"}Portal{/case}
{/switch}
</td>
<td>
{switch name="vo.status"}
{case value="0"}<span class="layui-badge layui-bg-gray">待分配</span>{/case}
{case value="1"}<span class="layui-badge layui-bg-blue">进行中</span>{/case}
{case value="2"}<span class="layui-badge">已结束</span>{/case}
{/switch}
</td>
<td>
{if condition="$vo.rating"}
<span style="color: #FFB800;">{$vo.rating}星</span>
{else/}
-
{/if}
</td>
<td>{$vo.create_time|date='Y-m-d H:i:s',###}</td>
<td>{if condition="$vo.end_time"}{$vo.end_time|date='Y-m-d H:i:s',###}{else/}-{/if}</td>
<td class="td-manage">
<a title="查看详情" onclick="x_admin_show('会话详情','/chat/detail?session_id={$vo.id}',900,600)" href="javascript:;">
<i class="layui-icon">&#xe63c;</i>
</a>
</td>
</tr>
{/volist}
</tbody>
</table>
<div class="page">
{$list->render()}
</div>
</div>
<script>
layui.use(['laydate', 'form'], function(){
var laydate = layui.laydate;
var form = layui.form;
laydate.render({
elem: '#startDate',
type: 'date'
});
laydate.render({
elem: '#endDate',
type: 'date'
});
form.render();
});
</script>
</body>
</html>
@@ -0,0 +1,70 @@
{include file="public/header" /}
<body>
<div class="x-body">
<form class="layui-form" method="post">
<div class="layui-form-item">
<label class="layui-form-label">分类</label>
<div class="layui-input-block">
<input type="text" name="category" value="{$info.category|default=''}"
placeholder="可选,如:常见问题、充值相关等" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="x-red">*</span>标题</label>
<div class="layui-input-block">
<input type="text" name="title" required lay-verify="required"
value="{$info.title|default=''}" placeholder="请输入标题" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label"><span class="x-red">*</span>内容</label>
<div class="layui-input-block">
<textarea name="content" required lay-verify="required"
placeholder="请输入回复内容" class="layui-textarea">{$info.content|default=''}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input type="number" name="sort" value="{$info.sort|default='0'}"
placeholder="数字越小越靠前" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="1" title="启用"
{if condition="!isset($info['status']) || $info['status'] == 1"}checked{/if}>
<input type="radio" name="status" value="0" title="禁用"
{if condition="isset($info['status']) && $info['status'] == 0"}checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<button class="layui-btn" lay-submit lay-filter="add">提交</button>
</div>
</form>
</div>
<script>
layui.use(['form', 'layer'], function(){
var form = layui.form;
var layer = layui.layer;
form.on('submit(add)', function(data){
$.post('', data.field, function(res){
if(res.code == 0 || res.code == 1){
layer.alert(res.msg || '操作成功', {icon: 1}, function(){
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
parent.location.reload();
});
} else {
layer.alert(res.msg, {icon: 2});
}
});
return false;
});
});
</script>
</body>
</html>
@@ -0,0 +1,134 @@
{include file="public/header" /}
<body>
<div class="x-nav">
<span class="layui-breadcrumb">
<a href="">首页</a>
<a><cite>快捷回复管理</cite></a>
</span>
<a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right" href="javascript:location.replace(location.href);" title="刷新">
<i class="layui-icon" style="line-height:30px">ဂ</i></a>
</div>
<div class="x-body">
<div class="layui-row">
<form class="layui-form layui-col-md12 x-so" method="get">
<div class="layui-input-inline">
<select name="category">
<option value="">全部分类</option>
{volist name="categories" id="cat"}
<option value="{$cat}" {if condition="isset($get['category']) && $get['category'] == $cat"}selected{/if}>{$cat}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline">
<select name="status">
<option value="">全部状态</option>
<option value="1" {if condition="isset($get['status']) && $get['status'] == '1'"}selected{/if}>启用</option>
<option value="0" {if condition="isset($get['status']) && $get['status'] == '0'"}selected{/if}>禁用</option>
</select>
</div>
<button class="layui-btn" type="submit"><i class="layui-icon">&#xe615;</i></button>
</form>
</div>
<xblock>
<button class="layui-btn" onclick="x_admin_show('添加快捷回复','/chat_quick_reply/add',600,400)">
<i class="layui-icon"></i>添加
</button>
</xblock>
<table class="layui-table">
<thead>
<tr>
<th>ID</th>
<th>分类</th>
<th>标题</th>
<th>内容</th>
<th>排序</th>
<th>状态</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{volist name="list" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{$vo.category|default='无'}</td>
<td>{$vo.title}</td>
<td style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;" title="{$vo.content}">{$vo.content}</td>
<td>
<input type="text" class="layui-input" value="{$vo.sort}"
onchange="updateSort({$vo.id}, this.value)"
style="width: 60px; display: inline-block;">
</td>
<td>
<input type="checkbox" name="status" lay-skin="switch" lay-text="启用|禁用"
{eq name="vo.status" value="1"}checked{/eq}
onchange="updateStatus({$vo.id}, this.checked ? 1 : 0)">
</td>
<td>{$vo.create_time|date='Y-m-d H:i:s',###}</td>
<td class="td-manage">
<a title="编辑" onclick="x_admin_show('编辑','/chat_quick_reply/edit?id={$vo.id}',600,400)" href="javascript:;">
<i class="layui-icon">&#xe642;</i>
</a>
<a title="删除" onclick="member_del(this,'{$vo.id}')" href="javascript:;">
<i class="layui-icon">&#xe640;</i>
</a>
</td>
</tr>
{/volist}
</tbody>
</table>
<div class="page">
{$list->render()}
</div>
</div>
<script>
layui.use(['form', 'layer'], function(){
var form = layui.form;
var layer = layui.layer;
form.render();
});
// 删除
function member_del(obj, id){
layer.confirm('确认要删除吗?', function(index){
$.ajax({
url: '/chat_quick_reply/del',
type: 'POST',
data: {id: id},
success: function(res){
if(res.code == 0){
$(obj).parents("tr").remove();
layer.msg('删除成功', {icon: 1, time: 1000});
} else {
layer.msg(res.msg, {icon: 2, time: 1000});
}
}
});
});
}
// 更新状态
function updateStatus(id, status){
$.post('/chat_quick_reply/status', {id: id, status: status}, function(res){
if(res.code == 0){
layer.msg('操作成功', {icon: 1, time: 1000});
} else {
layer.msg(res.msg, {icon: 2, time: 1000});
}
});
}
// 更新排序
function updateSort(id, sort){
$.post('/chat_quick_reply/sort', {id: id, sort: sort}, function(res){
if(res.code == 0){
layer.msg('操作成功', {icon: 1, time: 1000});
} else {
layer.msg(res.msg, {icon: 2, time: 1000});
}
});
}
</script>
</body>
</html>
+11
View File
@@ -122,6 +122,17 @@
<li><a _href="/Tip/optimum"><i class="iconfont">&#59130;</i><cite>今日最佳记录</cite></a></li>
</ul>
</li>
<li>
<a href="javascript:;">
<cite class="main-nav">客服管理</cite>
<i class="iconfont nav_right">&#xe697;</i>
</a>
<ul class="sub-menu">
<li><a _href="/chat/index"><i class="iconfont">&#xe63a;</i><cite>客服工作台</cite></a></li>
<li><a _href="/chat/record"><i class="iconfont">&#xe756;</i><cite>聊天记录查询</cite></a></li>
<li><a _href="/chat_quick_reply/index"><i class="iconfont">&#xe705;</i><cite>快捷回复管理</cite></a></li>
</ul>
</li>
</div>
<div id="configure_list" style="display: none;">
<li class="open">