Files
BuYuHouDuan/AdminSrc/AdminHost/wwwroot/admin/dist/views/system/feedbackmanage.html
T
2026-10-12 16:22:04 +08:00

378 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<title>反馈管理</title>
<div class="layui-card layadmin-header">
<div class="layui-breadcrumb" lay-filter="breadcrumb">
<a lay-href="">主页</a>
<a><cite>系统</cite></a>
<a><cite>反馈管理</cite></a>
</div>
</div>
<div class="layui-fluid">
<div class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="layadmin-feedback-formlist">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">用户编号</label>
<div class="layui-input-inline">
<input type="text" name="userNumber" placeholder="请输入" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">用户昵称</label>
<div class="layui-input-inline">
<input type="text" name="userName" 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="type">
<option value="">全部</option>
<option value="1">功能建议</option>
<option value="2">bug反馈</option>
<option value="3">其他问题</option>
<option value="4">充值问题</option>
<option value="5">游戏问题</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">处理状态</label>
<div class="layui-input-inline">
<select name="status">
<option value="">全部</option>
<option value="0">待处理</option>
<option value="1">处理中</option>
<option value="2">已回复</option>
<option value="3">已解决</option>
<option value="4">已关闭</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">时间范围</label>
<div class="layui-input-inline">
<input type="text" name="timeRange" id="timeRange" placeholder="选择时间范围" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layuiadmin-btn-list" lay-submit lay-filter="LAY-feedback-front-search">
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i> 搜索
</button>
<button class="layui-btn layui-btn-primary" lay-filter="LAY-feedback-front-reset">
<i class="layui-icon layui-icon-refresh layuiadmin-button-btn"></i> 重置
</button>
</div>
</div>
</div>
<div class="layui-card">
<div class="layui-card-body">
<table id="LAY-feedback-manage" lay-filter="LAY-feedback-manage"></table>
<script type="text/html" id="table-feedback-toolbar">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm layui-btn-primary" lay-event="refresh">
<i class="layui-icon layui-icon-refresh"></i> 刷新
</button>
</div>
</script>
<script type="text/html" id="table-feedback-bar">
<a class="layui-btn layui-btn-xs" lay-event="detail"><i class="layui-icon layui-icon-about"></i>详情</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="reply"><i class="layui-icon layui-icon-reply-fill"></i>回复</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
</script>
<script type="text/html" id="typeTpl">
{{#
var typeNames = {1:'功能建议',2:'bug反馈',3:'其他问题',4:'充值问题',5:'游戏问题'};
return typeNames[d.type] || '未知';
}}
</script>
<script type="text/html" id="statusTpl">
{{#
var statusMap = {
0:'<span class="layui-badge layui-bg-gray">待处理</span>',
1:'<span class="layui-badge layui-bg-blue">处理中</span>',
2:'<span class="layui-badge layui-bg-green">已回复</span>',
3:'<span class="layui-badge layui-bg-cyan">已解决</span>',
4:'<span class="layui-badge layui-bg-black">已关闭</span>'
};
return statusMap[d.status] || '未知';
}}
</script>
<script type="text/html" id="hasReplyTpl">
{{# if(d.reply && d.reply.length > 0){ }}
<span class="layui-badge layui-bg-green">已回复</span>
{{# } else { }}
<span class="layui-badge layui-bg-gray">未回复</span>
{{# } }}
</script>
</div>
</div>
</div>
<script>
layui.use(['admin', 'table', 'form', 'laydate'], function () {
var $ = layui.$,
admin = layui.admin,
table = layui.table,
form = layui.form,
laydate = layui.laydate,
setter = layui.setter;
// 时间范围选择器
laydate.render({
elem: '#timeRange',
type: 'datetime',
range: '~'
});
form.render(null, 'layadmin-feedback-formlist');
// 监听搜索
form.on('submit(LAY-feedback-front-search)', function (data) {
var field = data.field;
if (field.timeRange) {
var times = field.timeRange.split('~');
field.startTime = new Date(times[0].trim()).getTime();
field.endTime = new Date(times[1].trim()).getTime();
}
delete field.timeRange;
// 转换类型
if (field.type) field.type = parseInt(field.type);
if (field.status) field.status = parseInt(field.status);
table.reload('LAY-feedback-manage', {
where: field,
page: { curr: 1 }
});
});
// 监听重置
form.on('submit(LAY-feedback-front-reset)', function (data) {
$('input[name="userNumber"]').val('');
$('input[name="userName"]').val('');
$('select[name="type"]').val('');
$('select[name="status"]').val('');
$('input[name="timeRange"]').val('');
form.render('select');
table.reload('LAY-feedback-manage', {
where: {},
page: { curr: 1 }
});
});
// 刷新按钮
$('.layui-btn-container').on('click', '[lay-event="refresh"]', function () {
table.reload('LAY-feedback-manage');
});
table.render({
elem: "#LAY-feedback-manage",
url: setter.baseurl + "adminapi/FeedbackManage/List",
method: "post",
contentType: "application/json",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
page: true,
toolbar: '#table-feedback-toolbar',
defaultToolbar: ['filter', 'exports', 'print'],
where: {},
request: {
pageName: 'pageIndex',
limitName: 'pageSize'
},
limit: 10,
cols: [[
{ type: 'checkbox', fixed: 'left' },
{ type: 'numbers', title: '序号', width: 60 },
{ field: "userNumber", title: "用户编号", width: 100 },
{ field: "userName", title: "用户昵称", width: 120 },
{ field: "type", title: "类型", width: 100, templet: '#typeTpl' },
{ field: "title", title: "标题", minWidth: 150 },
{ field: "status", title: "状态", width: 100, templet: '#statusTpl' },
{ field: "reply", title: "回复", width: 100, templet: '#hasReplyTpl' },
{ field: "submitTime", title: "提交时间", width: 160, templet: function(d) {
return formatDateTime(d.submitTime);
}},
{ width: 180, title: "操作", align: "center", fixed: "right", toolbar: "#table-feedback-bar" }
]],
text: "对不起,加载出现异常!",
response: {
statusName: 'code',
statusCode: 0,
msgName: 'info',
countName: 'count',
dataName: 'data'
}
});
// 监听工具条
table.on("tool(LAY-feedback-manage)", function (e) {
var l = e.data;
if ("detail" === e.event) {
showFeedbackDetail(l);
} else if ("reply" === e.event) {
showReplyDialog(l);
} else if ("del" === e.event) {
layer.confirm('确定删除该反馈吗?', function (idx) {
admin.req({
url: setter.baseurl + 'adminapi/FeedbackManage/Delete',
data: { id: l.id },
done: function (res) {
layer.close(idx);
if (res.code === 0) {
layer.msg('删除成功');
table.reload('LAY-feedback-manage');
} else {
layer.msg(res.info || '删除失败');
}
}
});
});
}
});
// 显示反馈详情
function showFeedbackDetail(feedback) {
var typeNames = {1:'功能建议',2:'bug反馈',3:'其他问题',4:'充值问题',5:'游戏问题'};
var statusNames = {0:'待处理',1:'处理中',2:'已回复',3:'已解决',4:'已关闭'};
var content =
'<div style="padding: 20px;">' +
'<fieldset class="layui-elem-field">' +
'<legend>用户信息</legend>' +
'<div class="layui-field-box">' +
'<p><strong>用户编号:</strong>' + (feedback.userNumber || '-') + '</p>' +
'<p><strong>用户昵称:</strong>' + (feedback.userName || '-') + '</p>' +
'<p><strong>联系方式:</strong>' + (feedback.contact || '-') + '</p>' +
'<p><strong>QQ:</strong>' + (feedback.qq || '-') + '</p>' +
'</div>' +
'</fieldset>' +
'<fieldset class="layui-elem-field">' +
'<legend>反馈信息</legend>' +
'<div class="layui-field-box">' +
'<p><strong>类型:</strong>' + (typeNames[feedback.type] || '未知') + '</p>' +
'<p><strong>标题:</strong>' + (feedback.title || '-') + '</p>' +
'<p><strong>内容:</strong></p>' +
'<div style="background:#f5f5f5;padding:10px;border-radius:4px;margin-top:5px;">' + (feedback.content || '-') + '</div>' +
'<p style="margin-top:10px;"><strong>提交时间:</strong>' + formatDateTime(feedback.submitTime) + '</p>' +
'<p><strong>当前状态:</strong>' + (statusNames[feedback.status] || '未知') + '</p>' +
'</div>' +
'</fieldset>';
if (feedback.reply) {
content +=
'<fieldset class="layui-elem-field layui-field-green">' +
'<legend>回复信息</legend>' +
'<div class="layui-field-box">' +
'<p><strong>回复内容:</strong></p>' +
'<div style="background:#f5f5f5;padding:10px;border-radius:4px;margin-top:5px;">' + feedback.reply + '</div>' +
'<p style="margin-top:10px;"><strong>回复时间:</strong>' + formatDateTime(feedback.replyTime) + '</p>' +
'<p><strong>回复人:</strong>' + (feedback.replyAdminName || '-') + '</p>' +
'</div>' +
'</fieldset>';
}
content += '</div>';
layer.open({
type: 1,
title: '反馈详情',
area: ['700px', '600px'],
content: content
});
}
// 显示回复弹窗
function showReplyDialog(feedback) {
var statusNames = {0:'待处理',1:'处理中',2:'已回复',3:'已解决',4:'已关闭'};
layer.open({
type: 1,
title: '回复反馈',
area: ['600px', '450px'],
content: '<div style="padding:20px;">' +
'<form class="layui-form" lay-filter="reply-form">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">当前状态</label>' +
'<div class="layui-input-block">' +
'<select name="status" lay-filter="status-select">' +
'<option value="0" ' + (feedback.status === 0 ? 'selected' : '') + '>待处理</option>' +
'<option value="1" ' + (feedback.status === 1 ? 'selected' : '') + '>处理中</option>' +
'<option value="2" ' + (feedback.status === 2 ? 'selected' : '') + '>已回复</option>' +
'<option value="3" ' + (feedback.status === 3 ? 'selected' : '') + '>已解决</option>' +
'<option value="4" ' + (feedback.status === 4 ? 'selected' : '') + '>已关闭</option>' +
'</select>' +
'</div>' +
'</div>' +
'<div class="layui-form-item layui-form-text">' +
'<label class="layui-form-label">回复内容</label>' +
'<div class="layui-input-block">' +
'<textarea name="reply" placeholder="请输入回复内容" class="layui-textarea" style="min-height:150px;">' + (feedback.reply || '') + '</textarea>' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<div class="layui-input-block">' +
'<button class="layui-btn" lay-submit lay-filter="reply-submit">提交回复</button>' +
'<button type="button" class="layui-btn layui-btn-primary" onclick="layer.closeAll();">取消</button>' +
'</div>' +
'</div>' +
'</form>' +
'</div>',
success: function(layero, index) {
form.render('select', 'reply-form');
form.on('submit(reply-submit)', function(data) {
admin.req({
url: setter.baseurl + 'adminapi/FeedbackManage/Reply',
contentType: 'application/json',
method: 'post',
data: JSON.stringify({
id: feedback.id,
reply: data.field.reply,
status: parseInt(data.field.status)
}),
done: function(res) {
if (res.code === 0) {
layer.close(index);
layer.msg('回复成功');
table.reload('LAY-feedback-manage');
} else {
layer.msg(res.info || '回复失败');
}
}
});
return false;
});
}
});
}
function formatDateTime(date) {
if (!date) return '-';
var d = new Date(date);
var year = d.getFullYear();
var month = ('0' + (d.getMonth() + 1)).slice(-2);
var day = ('0' + d.getDate()).slice(-2);
var hour = ('0' + d.getHours()).slice(-2);
var minute = ('0' + d.getMinutes()).slice(-2);
var second = ('0' + d.getSeconds()).slice(-2);
return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
}
});
</script>