其余文件

This commit is contained in:
2026-04-14 17:46:22 +08:00
parent 294b68fe37
commit 3691f4db22
1343 changed files with 189847 additions and 0 deletions

View File

@ -0,0 +1,99 @@
{layout name="layout2" /}
<style>
.input-inline-width {
width: 250px;
}
</style>
<div class="layui-card layui-form">
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">管理员:</label>
<div class="layui-inline">
<button class="layui-btn layui-btn-sm layui-bg-blue" id="show-admin">选择管理员</button>
</div>
<div class="layui-inline">
<span id="admin_selected"></span>
</div>
<input type="hidden" name="admin_id" id="admin_id">
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服头像:</label>
<div class="layui-input-block">
<div class="like-upload-image" switch-tab="0" lay-verType="tips">
<div class="upload-image-elem"><a class="add-upload-image"> + 添加</a></div>
</div>
<div class="layui-form-mid layui-word-aux">建议尺寸500*500像</div>
</div>
</div>
<div class="layui-form-item">
<label for="nickname" class="layui-form-label">客服昵称:</label>
<div class="layui-input-inline input-inline-width">
<input type="text" id="nickname" name="nickname" lay-verify="required" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline input-inline-width">
<input type="number" name="sort" autocomplete="off" class="layui-input" value="1">
<label class="layui-form-mid layui-word-aux">排序值越小越靠前默认值为1</label>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态:</label>
<div class="layui-input-block">
<input type="checkbox" name="disable" lay-skin="switch" lay-text="开启|关闭" checked>
</div>
<label class="layui-form-mid layui-word-aux">客服账号状态,默认开启,关闭后禁止登录客服工作台</label>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="addSubmit" id="addSubmit" value="确认">
</div>
</div>
</div>
<script>
layui.config({
version: "{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['form'], function () {
var form = layui.form;
$('#show-admin').click(function () {
layer.open({
type: 2
, title: "选择管理员"
, content: "{:url('kefu.kefu/adminLists')}"
, area: ["90%", "90%"]
, btn: ["确定", "取消"]
, yes: function (index, layero) {
var iframeWindow = window["layui-layer-iframe" + index];
let admin_selected = iframeWindow.admin_selected();
$('#admin_selected').html(admin_selected.name + '(' + admin_selected.account + ')');
$('#admin_id').val(admin_selected.id);
layer.close(index);
}
});
return false;
});
like.delUpload();
$(document).on("click", ".add-upload-image", function () {
like.imageUpload({
limit: 1,
field: "avatar",
that: $(this),
content: '/shop/file/lists?type=10',
});
});
});
</script>

View File

@ -0,0 +1,90 @@
{layout name="layout1" /}
<div class="wrapper">
<div class="layui-card">
<!--表格-->
<div class="layui-card-body">
<!--搜索区域-->
<div class="layui-form">
<div class="layui-inline">
<label class="layui-form-label">名称</label>
<div class="layui-input-inline">
<input type="text" name="name" id="name" placeholder="请输入" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">角色</label>
<div class="layui-input-inline">
<select name="role_id" id="role_id">
<option value="">所有</option>
{volist name="role_lists" id="vo"}
<option value="{$vo.id}">{$vo.name}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layui-btn-primary layui-bg-blue" lay-submit lay-filter="search">搜索</button>
<button class="layui-btn layui-btn-primary" lay-submit lay-filter="reset">重置</button>
</div>
</div>
<!--数据表格-->
<table id="like-table-lists" lay-filter="like-table-lists"></table>
<!--自定义模板-->
<script type="text/html" id="buttonTpl">
{{# if(d.disable == 1){ }}
<button class="layui-btn layui-btn-danger layui-btn-xs layui-bg-red">禁用</button>
{{# } else { }}
<button class="layui-btn layui-btn-xs layui-btn-primary">启用</button>
{{# } }}
</script>
</div>
</div>
</div>
<script>
layui.use(['table', 'form'], function () {
let form = layui.form
, table = layui.table;
//监听搜索
form.on('submit(search)', function (data) {
var field = data.field;
//执行重载
table.reload('like-table-lists', {
where: field,
page: {curr: 1}
});
});
// 获取选中的用户信息
window.admin_selected = function admin_selected () {
var checkStatus = table.checkStatus('like-table-lists');
return checkStatus.data[0]; //获取选中行的数据
}
//清空查询
form.on('submit(reset)', function () {
$('#name').val('');
$('#role_id').val('all');
form.render('select');
//刷新列表
table.reload('like-table-lists', {
where: [], page: {curr: 1}
});
});
// 数据表格渲染
like.tableLists("#like-table-lists", '{:url("kefu.kefu/adminLists")}', [
{type: 'radio'}
, {field: 'account', title: '账号'}
, {field: 'name', title: '名称'}
, {field: 'role', title: '角色'}
, {field: 'disable', title: '状态', templet: '#buttonTpl', minWidth: 40, align: 'center'}
]);
});
</script>

View File

@ -0,0 +1,111 @@
{layout name="layout2" /}
<style>
.input-inline-width {
width: 250px;
}
</style>
<div class="layui-card layui-form">
<div class="layui-card-body">
<input type="hidden" name="id" id="{$detail.id}">
<div class="layui-form-item">
<label class="layui-form-label">管理员:</label>
<div class="layui-input-block">
<div>{$detail.name}({$detail.account})</div>
<div class="layui-form-mid layui-word-aux">管理员账号密码可用于登录客服工作台</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服头像:</label>
<div class="layui-input-block">
<div class="like-upload-image">
{if $detail.avatar}
<div class="upload-image-div">
<img src="{$detail.avatar}" alt="img">
<input type="hidden" name="avatar" value="{$detail.avatar}">
<div class="del-upload-btn">x</div>
</div>
<div class="upload-image-elem" style="display:none;"><a class="add-upload-image"> + 添加图片</a></div>
{else}
<div class="upload-image-elem"><a class="add-upload-image"> + 添加图片</a></div>
{/if}
</div>
<div class="layui-form-mid layui-word-aux">建议尺寸500*500像</div>
</div>
</div>
<div class="layui-form-item">
<label for="nickname" class="layui-form-label">客服昵称:</label>
<div class="layui-input-block input-inline-width">
<input type="text" id="nickname" name="nickname" lay-verify="required" autocomplete="off"
class="layui-input" value="{$detail.nickname}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block input-inline-width">
<input type="number" name="sort" autocomplete="off" class="layui-input" value="{$detail.sort}">
<label class="layui-form-mid layui-word-aux">排序值越小越靠前默认值为1</label>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态:</label>
<div class="layui-input-block">
<input type="checkbox" name="disable" lay-skin="switch" lay-text="开启|关闭"
{if condition="$detail.disable eq 0" }checked{/if}>
</div>
<label class="layui-form-mid layui-word-aux">客服账号状态,默认开启,关闭后禁止登录客服工作台</label>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="addSubmit" id="addSubmit" value="确认">
</div>
</div>
</div>
<script>
layui.config({
version: "{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['form'], function () {
var form = layui.form;
$('#show-admin').click(function () {
layer.open({
type: 2
, title: "选择管理员"
, content: "{:url('kefu.kefu/adminLists')}"
, area: ["90%", "90%"]
, btn: ["确定", "取消"]
, yes: function (index, layero) {
var iframeWindow = window["layui-layer-iframe" + index];
let admin_selected = iframeWindow.admin_selected();
$('#admin_selected').html(admin_selected.name + '(' + admin_selected.account + ')');
$('#admin_id').val(admin_selected.id);
layer.close(index);
}
});
return false;
});
like.delUpload();
$(document).on("click", ".add-upload-image", function () {
like.imageUpload({
limit: 1,
field: "avatar",
that: $(this),
content: '/shop/file/lists?type=10',
});
});
});
</script>

View File

@ -0,0 +1,180 @@
{layout name="layout1" /}
<div class="wrapper">
<div class="layui-card">
<!-- 操作提示 -->
<div class="layui-card-body">
<div class="layui-collapse" style="border:1px dashed #c4c4c4">
<div class="layui-colla-item">
<h2 class="layui-colla-title like-layui-colla-title">操作提示</h2>
<div class="layui-colla-content layui-show">
<p>*添加在线客服。</p>
</div>
</div>
</div>
</div>
<!-- 主体区域 -->
<div class="layui-card-body">
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm layEvent" lay-event="add">新增客服</button>
<table id="like-table-lists" lay-filter="like-table-lists"></table>
<script type="text/html" id="table-image">
{{# if(d.avatar){ }}
<img src="{{d.avatar}}" class="image-show" alt="图" style="width:30px;height:30px;">
{{# } }}
</script>
<script type="text/html" id="table-operation">
<a class="layui-btn layui-btn-normal layui-btn-sm" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-normal layui-btn-sm" lay-event="workbench">工作台</a>
<a class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del">删除</a>
</script>
<script type="text/html" id="statusTpl">
<input type="checkbox" lay-filter="switch-disable" data-id={{d.id}} lay-skin="switch"
lay-text="开启|关闭" {{# if(d.disable==0){ }} checked {{# } }}/>
</script>
</div>
</div>
</div>
<script>
layui.use(["table", "form"], function () {
var table = layui.table;
var form = layui.form;
like.tableLists("#like-table-lists", "{:url()}", [
{field: "id", width: 60, title: "ID"}
, {field: "avatar", align: "center", title: "客服头像", templet: "#table-image"}
, {field: "account", align: "center", title: "客服账号"}
, {field: "nickname", align: "center", title: "客服昵称"}
, {field: "sort", width: 60, align: "center", title: "排序"}
, {field: "disable", align: "center", title: "状态", templet: "#statusTpl"}
, {field: "create_time", align: "center", title: "创建时间"}
, {title: "操作", width: 250, align: "center", fixed: "right", toolbar: "#table-operation"}
]);
var active = {
add: function () {
layer.open({
type: 2
, title: "新增客服"
, content: "{:url('kefu.Kefu/add')}"
, area: ["90%", "90%"]
, btn: ["确定", "取消"]
, yes: function (index, layero) {
var iframeWindow = window["layui-layer-iframe" + index];
var submit = layero.find("iframe").contents().find("#addSubmit");
iframeWindow.layui.form.on("submit(addSubmit)", function (data) {
like.ajax({
url: "{:url('kefu.Kefu/add')}",
data: data.field,
type: "POST",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg);
layer.close(index);
table.reload("like-table-lists", {
where: {},
page: {cur: 1}
});
}
}
});
});
submit.trigger("click");
}
});
},
edit: function (obj) {
layer.open({
type: 2
, title: "编辑客服"
, content: "{:url('kefu.Kefu/edit')}?id=" + obj.data.id
, area: ["90%", "90%"]
, btn: ["确定", "取消"]
, yes: function (index, layero) {
var iframeWindow = window["layui-layer-iframe" + index];
var submit = layero.find("iframe").contents().find("#addSubmit");
iframeWindow.layui.form.on("submit(addSubmit)", function (data) {
data.field['id'] = obj.data.id;
like.ajax({
url: "{:url('kefu.Kefu/edit')}",
data: data.field,
type: "POST",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg);
layer.close(index);
table.reload("like-table-lists", {
where: {},
page: {cur: 1}
});
}
}
});
});
submit.trigger("click");
}
});
},
del: function (obj) {
layer.confirm("确定删除客服:" + obj.data.nickname, function (index) {
like.ajax({
url: "{:url('kefu.Kefu/del')}",
data: {id: obj.data.id},
type: "POST",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg);
layer.close(index);
obj.del();
}
}
});
layer.close(index);
})
},
workbench: function (obj) {
like.ajax({
url: '{:url("kefu.Kefu/login")}',
type: 'post',
data: {'id': obj.data.id},
success: function(res) {
if(res.code == 1) {
window.parent.open(res.data.url);
}
}
});
},
};
like.eventClick(active);
// 图片放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src, 400);
});
// 状态切换
form.on('switch(switch-disable)', function (obj) {
var kefu_id = obj.elem.attributes['data-id'].nodeValue;
var disable = 1;
if (obj.elem.checked) {
disable = 0;
}
var data = {disable: disable, id: kefu_id};
like.ajax({
url: '{:url("kefu.kefu/status")}',
data: data,
type: "post",
success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {offset: '15px', icon: 1, time: 1000});
}
}
});
});
})
</script>

View File

@ -0,0 +1,50 @@
{layout name="layout2" /}
<style>
.input-inline-width {
width: 200px;
}
.input-block-width {
width: 350px;
}
</style>
<div class="layui-card layui-form">
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">话术标题:</label>
<div class="layui-input-inline">
<input type="text" name="title" autocomplete="off" class="layui-input" lay-verify="required" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">话术内容:</label>
<div class="layui-input-block input-block-width">
<textarea placeholder="请输入内容" name="content" class="layui-textarea" cols="50" rows="10"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block input-inline-width">
<input type="number" name="sort" autocomplete="off" class="layui-input" value="1" min="0">
<label class="layui-form-mid layui-word-aux">排序值越小越靠前默认值为1</label>
</div>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="addSubmit" id="addSubmit" value="确认">
</div>
</div>
</div>
<script>
layui.config({
version: "{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['form'], function () {
var form = layui.form;
});
</script>

View File

@ -0,0 +1,51 @@
{layout name="layout2" /}
<style>
.input-inline-width {
width: 200px;
}
.input-block-width {
width: 350px;
}
</style>
<div class="layui-card layui-form">
<div class="layui-card-body">
<input type="hidden" name="id" value="{$detail.id}">
<div class="layui-form-item">
<label class="layui-form-label">话术标题:</label>
<div class="layui-input-inline">
<input type="text" name="title" value="{$detail.title}" autocomplete="off" class="layui-input" lay-verify="required" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">话术内容:</label>
<div class="layui-input-block input-block-width">
<textarea placeholder="请输入内容"name="content" class="layui-textarea" cols="50" rows="10">{$detail.content}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block input-inline-width">
<input type="number" name="sort" value="{$detail.sort}" autocomplete="off" class="layui-input" value="1" min="0">
<label class="layui-form-mid layui-word-aux">排序值越小越靠前默认值为1</label>
</div>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="editSubmit" id="editSubmit" value="确认">
</div>
</div>
</div>
<script>
layui.config({
version: "{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['form'], function () {
var form = layui.form;
});
</script>

View File

@ -0,0 +1,139 @@
{layout name="layout1" /}
<div class="wrapper">
<div class="layui-card">
<!-- 操作提示 -->
<div class="layui-card-body">
<div class="layui-collapse" style="border:1px dashed #c4c4c4">
<div class="layui-colla-item">
<h2 class="layui-colla-title like-layui-colla-title">操作提示</h2>
<div class="layui-colla-content layui-show">
<p>*添加在线客服语术。方便客服快捷回复</p>
</div>
</div>
</div>
</div>
<!-- 主体区域 -->
<div class="layui-card-body">
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm layEvent" lay-event="add">新增话术</button>
<table id="like-table-lists" lay-filter="like-table-lists"></table>
<script type="text/html" id="table-operation">
<a class="layui-btn layui-btn-normal layui-btn-sm" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del">删除</a>
</script>
<script type="text/html" id="statusTpl">
<input type="checkbox" lay-filter="switch-disable" data-id={{d.id}} lay-skin="switch"
lay-text="开启|关闭" {{# if(d.disable==1){ }} checked {{# } }}/>
</script>
</div>
</div>
</div>
<script>
layui.use(["table", "form"], function () {
var table = layui.table;
var form = layui.form;
like.tableLists("#like-table-lists", "{:url()}", [
{field: "id", width: 60, title: "ID"}
, {field: "title", align: "center", title: "标题"}
, {field: "content", align: "center", title: "内容"}
, {field: "sort", align: "center", title: "排序"}
, {field: "create_time", align: "center", title: "创建时间"}
, {title: "操作", align: "center", fixed: "right", toolbar: "#table-operation"}
]);
var active = {
add: function () {
layer.open({
type: 2
, title: "新增话术"
, content: "{:url('kefu.KefuLang/add')}"
, area: ["90%", "90%"]
, btn: ["确定", "取消"]
, yes: function (index, layero) {
var iframeWindow = window["layui-layer-iframe" + index];
var submit = layero.find("iframe").contents().find("#addSubmit");
iframeWindow.layui.form.on("submit(addSubmit)", function (data) {
like.ajax({
url: "{:url('kefu.KefuLang/add')}",
data: data.field,
type: "POST",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg);
layer.close(index);
table.reload("like-table-lists", {
where: {},
page: {cur: 1}
});
}
}
});
});
submit.trigger("click");
}
});
},
edit: function (obj) {
layer.open({
type: 2
, title: "编辑话术"
, content: "{:url('kefu.KefuLang/edit')}?id=" + obj.data.id
, area: ["90%", "90%"]
, btn: ["确定", "取消"]
, yes: function (index, layero) {
var iframeWindow = window["layui-layer-iframe" + index];
var submit = layero.find("iframe").contents().find("#editSubmit");
iframeWindow.layui.form.on("submit(editSubmit)", function (data) {
data.field['id'] = obj.data.id;
like.ajax({
url: "{:url('kefu.KefuLang/edit')}",
data: data.field,
type: "POST",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg);
layer.close(index);
table.reload("like-table-lists", {
where: {},
page: {cur: 1}
});
}
}
});
});
submit.trigger("click");
}
});
},
del: function (obj) {
layer.confirm("确定删除话术:" + obj.data.title, function (index) {
like.ajax({
url: "{:url('kefu.KefuLang/del')}",
data: {id: obj.data.id},
type: "POST",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg);
layer.close(index);
obj.del();
table.reload("like-table-lists", {
where: {},
page: {cur: 1}
});
}
}
});
layer.close(index);
})
}
};
like.eventClick(active);
})
</script>