添加项目文件。
This commit is contained in:
@@ -0,0 +1,313 @@
|
||||
<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-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="table-bot" lay-filter="table-bot"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 头像预览列模板 -->
|
||||
<script type="text/html" id="tpl-avatar">
|
||||
{{# if(d.avatar){ }}
|
||||
<img src="{{d.avatar}}" style="width:40px;height:40px;border-radius:50%;object-fit:cover;vertical-align:middle;" onerror="this.src='../../../images/face/0.png'">
|
||||
{{# } else { }}
|
||||
<span style="color:#aaa;">无</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="toolbar-bot">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm" lay-filter="add-bot"><i class="layui-icon layui-icon-add-1"></i> 添加机器人</button>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="reload-bot"><i class="layui-icon layui-icon-refresh"></i> 刷新</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="bot-bar">
|
||||
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
|
||||
<!-- 添加/编辑弹窗内嵌表单(隐藏,动态使用) -->
|
||||
<div id="bot-form-tpl" style="display:none;">
|
||||
<div style="padding:24px 20px 10px;">
|
||||
<form class="layui-form" id="bot-edit-form">
|
||||
<input type="hidden" name="id" id="bot-id">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">昵称 <span style="color:red">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" id="bot-name" class="layui-input" placeholder="请输入机器人昵称" lay-verify="required">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">头像</label>
|
||||
<div class="layui-input-block">
|
||||
<div style="display:flex;align-items:center;gap:12px;">
|
||||
<!-- 预览框 -->
|
||||
<div id="avatar-preview-wrap" style="width:64px;height:64px;border:1px dashed #ccc;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#f8f8f8;flex-shrink:0;">
|
||||
<img id="avatar-preview" src="" style="width:100%;height:100%;object-fit:cover;display:none;" onerror="this.style.display='none';document.getElementById('avatar-placeholder').style.display='flex';">
|
||||
<span id="avatar-placeholder" style="font-size:12px;color:#aaa;text-align:center;display:flex;">点击上传</span>
|
||||
</div>
|
||||
<!-- 上传按钮 -->
|
||||
<div>
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="btn-upload-avatar">
|
||||
<i class="layui-icon layui-icon-upload"></i> 上传图片
|
||||
</button>
|
||||
<input type="file" id="avatar-file-input" accept="image/*" style="display:none;">
|
||||
<div style="margin-top:6px;font-size:12px;color:#999;">支持 jpg/png/gif,建议正方形,≤2MB</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- URL 输入框(上传后自动填充,也可手动填写) -->
|
||||
<input type="text" name="avatar" id="bot-avatar" class="layui-input" placeholder="头像URL(上传后自动填充,或直接粘贴URL)" style="margin-top:10px;">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['admin', 'table', 'form', 'layer', 'upload'], function () {
|
||||
var $ = layui.$,
|
||||
admin = layui.admin,
|
||||
table = layui.table,
|
||||
form = layui.form,
|
||||
layer = layui.layer,
|
||||
upload = layui.upload,
|
||||
setter = layui.setter;
|
||||
|
||||
setTimeout(function() {
|
||||
if (window.parent && window.parent.$ && window.parent.layer) {
|
||||
window.parent.$('.layui-layer-shade').remove();
|
||||
window.parent.layer.closeAll();
|
||||
}
|
||||
$('.layui-layer-shade').remove();
|
||||
layer.closeAll();
|
||||
}, 100);
|
||||
|
||||
function loadData() {
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/BotConfig/GetAll",
|
||||
done: function (res) {
|
||||
if (res.code === 0) {
|
||||
table.reload('table-bot', { data: res.data || [] });
|
||||
} else {
|
||||
layer.msg(res.info || '加载失败');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
table.render({
|
||||
elem: '#table-bot',
|
||||
url: setter.baseurl + 'adminapi/BotConfig/GetAll',
|
||||
method: 'get',
|
||||
page: false,
|
||||
cols: [[
|
||||
{ type: 'numbers', title: '序号', width: 60 },
|
||||
{ field: "avatar", title: "头像", width: 80, templet: '#tpl-avatar', align: 'center' },
|
||||
{ field: "name", title: "昵称", minWidth: 200 },
|
||||
{ field: "avatar", title: "头像URL", minWidth: 280 },
|
||||
{ title: "操作", width: 150, fixed: 'right', toolbar: '#bot-bar' }
|
||||
]],
|
||||
toolbar: '#toolbar-bot',
|
||||
defaultToolbar: ['filter', 'exports', 'print']
|
||||
});
|
||||
|
||||
$(document).on('click', '[lay-filter="add-bot"]', function () {
|
||||
showEditDialog(null, true);
|
||||
});
|
||||
|
||||
$(document).on('click', '[lay-filter="reload-bot"]', function () {
|
||||
loadData();
|
||||
layer.msg('刷新成功');
|
||||
});
|
||||
|
||||
table.on('tool(table-bot)', function (obj) {
|
||||
if (obj.event === 'del') {
|
||||
layer.confirm('确定删除「' + obj.data.name + '」吗?', function (idx) {
|
||||
admin.req({
|
||||
method: "post",
|
||||
url: setter.baseurl + "adminapi/BotConfig/Delete?id=" + encodeURIComponent(obj.data.id || obj.data.Id || ''),
|
||||
done: function (res) {
|
||||
if (res.code === 0) {
|
||||
obj.del();
|
||||
layer.msg('删除成功');
|
||||
} else {
|
||||
layer.msg(res.info || '删除失败');
|
||||
}
|
||||
}
|
||||
});
|
||||
layer.close(idx);
|
||||
});
|
||||
} else if (obj.event === 'edit') {
|
||||
showEditDialog(obj.data, false);
|
||||
}
|
||||
});
|
||||
|
||||
// =========== 上传逻辑 ===========
|
||||
var currentLayer = null; // 当前弹窗 DOM 引用
|
||||
|
||||
// 判断是否后台相对路径,自动补全当前域名
|
||||
function fixUrl(path) {
|
||||
if (!path) return '';
|
||||
// 已是完整URL直接返回
|
||||
if (/^https?:\/\//i.test(path)) return path;
|
||||
// 相对路径补全域名
|
||||
if (path.indexOf('/') === 0) {
|
||||
return window.location.origin + path;
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
function initUpload(layero) {
|
||||
currentLayer = layero;
|
||||
|
||||
// 点击上传按钮触发文件选择
|
||||
layero.find('#btn-upload-avatar').off('click').on('click', function () {
|
||||
$('#avatar-file-input').val('').trigger('click');
|
||||
});
|
||||
|
||||
// 文件选择后立即上传
|
||||
$('#avatar-file-input').off('change').on('change', function () {
|
||||
var file = this.files[0];
|
||||
if (!file) return;
|
||||
|
||||
// 大小校验 2MB
|
||||
if (file.size > 2 * 1024 * 1024) {
|
||||
layer.msg('图片大小不能超过 2MB');
|
||||
return;
|
||||
}
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('file', file);
|
||||
|
||||
// 显示上传中状态
|
||||
var loadIdx = layer.load(2, { shade: [0.3, '#fff'] });
|
||||
|
||||
$.ajax({
|
||||
url: setter.baseurl + 'adminapi/ImageUpload/upload/temp',
|
||||
type: 'POST',
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
headers: {
|
||||
'Authorization': 'Bearer ' + (setter.token || layui.data(setter.tableName || 'layuiAdmin')[setter.tokenName || 'token'] || '')
|
||||
},
|
||||
success: function (res) {
|
||||
layer.close(loadIdx);
|
||||
if (res.code === 0 && res.data && res.data.path) {
|
||||
// 后台返回相对路径,自动拼接当前域名
|
||||
var url = fixUrl(res.data.path);
|
||||
// 填充弹窗内 URL 输入框
|
||||
currentLayer.find('#bot-avatar').val(url);
|
||||
// 更新弹窗内预览
|
||||
setAvatarPreview(url);
|
||||
layer.msg('上传成功');
|
||||
} else {
|
||||
layer.msg(res.info || res.msg || '上传失败');
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
layer.close(loadIdx);
|
||||
layer.msg('上传请求失败,请稍后重试');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// URL 输入框变化时同步预览
|
||||
layero.find('#bot-avatar').off('input').on('input', function () {
|
||||
setAvatarPreview($(this).val().trim());
|
||||
});
|
||||
}
|
||||
|
||||
function setAvatarPreview(url) {
|
||||
if (!currentLayer) return;
|
||||
if (url) {
|
||||
currentLayer.find('#avatar-preview').attr('src', url).show();
|
||||
currentLayer.find('#avatar-placeholder').hide();
|
||||
} else {
|
||||
currentLayer.find('#avatar-preview').attr('src', '').hide();
|
||||
currentLayer.find('#avatar-placeholder').show();
|
||||
}
|
||||
}
|
||||
|
||||
// =========== 弹窗 ===========
|
||||
function showEditDialog(data, isAdd) {
|
||||
var title = isAdd ? '添加机器人' : '编辑机器人';
|
||||
var formHtml = $('#bot-form-tpl').html();
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: title,
|
||||
area: ['520px', '380px'],
|
||||
content: formHtml,
|
||||
btn: ['保存', '取消'],
|
||||
shadeClose: true,
|
||||
success: function (layero) {
|
||||
form.render();
|
||||
|
||||
// 回填数据
|
||||
if (data) {
|
||||
layero.find('#bot-id').val(data.id || '');
|
||||
layero.find('#bot-name').val(data.name || '');
|
||||
layero.find('#bot-avatar').val(data.avatar || '');
|
||||
setAvatarPreview(data.avatar || '');
|
||||
} else {
|
||||
layero.find('#bot-id').val('');
|
||||
layero.find('#bot-name').val('');
|
||||
layero.find('#bot-avatar').val('');
|
||||
setAvatarPreview('');
|
||||
}
|
||||
|
||||
// 初始化上传事件(传入弹窗DOM引用)
|
||||
initUpload(layero);
|
||||
},
|
||||
yes: function (idx, layero) {
|
||||
var name = layero.find('#bot-name').val().trim();
|
||||
var avatar = layero.find('#bot-avatar').val().trim();
|
||||
var id = layero.find('#bot-id').val();
|
||||
|
||||
if (!name) {
|
||||
layer.msg('昵称不能为空');
|
||||
return;
|
||||
}
|
||||
|
||||
var url, sendData;
|
||||
if (isAdd) {
|
||||
url = setter.baseurl + 'adminapi/BotConfig/Add';
|
||||
sendData = { name: name, avatar: avatar };
|
||||
} else {
|
||||
url = setter.baseurl + 'adminapi/BotConfig/Update';
|
||||
sendData = { id: id, name: name, avatar: avatar };
|
||||
}
|
||||
|
||||
admin.req({
|
||||
method: "post",
|
||||
contentType: "application/json;charset=UTF-8",
|
||||
url: url,
|
||||
data: JSON.stringify(sendData),
|
||||
done: function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.close(idx);
|
||||
layer.msg(isAdd ? '添加成功' : '更新成功');
|
||||
loadData();
|
||||
} else {
|
||||
layer.msg(res.info || '操作失败');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user