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

318 lines
15 KiB
HTML

<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-header">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-filter="save-robotkill"><i class="layui-icon layui-icon-ok"></i> 保存配置</button>
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="reload-robotkill"><i class="layui-icon layui-icon-refresh"></i> 刷新</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-filter="add-robotkill"><i class="layui-icon layui-icon-add-1"></i> 添加</button>
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="init-robotkill"><i class="layui-icon layui-icon-refresh"></i> 初始化</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="saveSection('RobotKillConfig')"><i class="layui-icon layui-icon-export"></i> 保存到初始化文件</button>
</div>
</div>
<div class="layui-card-body">
<div class="layui-form" style="padding: 10px 0;">
<div class="layui-inline">
<label class="layui-form-label" style="width:80px;">总开关</label>
<div class="layui-input-inline" style="width:80px;">
<input type="checkbox" id="isEnabled" lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="width:100px;">播报间隔(秒)</label>
<div class="layui-input-inline" style="width:80px;">
<input type="number" id="intervalSeconds" class="layui-input" value="5">
</div>
</div>
</div>
<table id="table-robotkill" lay-filter="table-robotkill"></table>
</div>
</div>
</div>
<script type="text/html" id="table-operate">
<a class="layui-btn layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
</script>
<script type="text/html" id="tpl-gameType">
{{# var map = {1:'风雷之渊',4:'星际迷航',5:'黑神话悟空'}; }}
{{= map[d.gameType] || d.gameName || '未知' }}
</script>
<script type="text/html" id="tpl-level">
{{# var map = {1:'初级场',2:'中级场',3:'高级场'}; }}
{{= map[d.roomLevel] || d.levelName || '未知' }}
</script>
<script>
layui.use(['admin', 'table', 'form', 'layer'], function () {
var $ = layui.$,
admin = layui.admin,
table = layui.table,
form = layui.form,
layer = layui.layer,
setter = layui.setter;
var gameConfig = null;
var GAME_TYPES = [
{ value: 1, name: '风雷之渊' },
{ value: 4, name: '星际迷航' },
{ value: 5, name: '黑神话悟空' }
];
var LEVELS = [
{ value: 1, name: '初级场' },
{ value: 2, name: '中级场' },
{ value: 3, name: '高级场' }
];
var fishOptions = ''; // 鱼种下拉选项
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 loadConfig() {
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig",
done: function (res) {
if (res.code === 0 && res.data) {
gameConfig = res.data;
buildFishOptions();
fillForm();
}
}
});
}
function buildFishOptions() {
fishOptions = '<option value="">-- 选择鱼种 --</option>';
var list = gameConfig.fishTypeConfigs || [];
// 只保留 Boss鱼(2)、特殊鱼(4)、特殊Boss(5)
list = list.filter(function(f) {
var ft = f.fishType || f.fishType || 0;
return ft === 2 || ft === 4 || ft === 5;
});
list.sort(function(a, b) { return (a.fishNumber || '').localeCompare(b.fishNumber || ''); });
list.forEach(function(f) {
fishOptions += '<option value="' + (f.fishNumber || '') + '" data-name="' + (f.fishName || '') + '">' + (f.fishName || '') + ' (' + (f.fishNumber || '') + ')</option>';
});
}
function fillForm() {
if (!gameConfig.robotKillConfig) gameConfig.robotKillConfig = {};
var cfg = gameConfig.robotKillConfig;
$('#isEnabled').prop('checked', cfg.isEnabled === true);
$('#intervalSeconds').val(cfg.intervalSeconds || 5);
form.render();
renderTable();
}
function getScenes() {
if (!gameConfig.robotKillConfig) gameConfig.robotKillConfig = {};
return gameConfig.robotKillConfig.scenes || [];
}
function renderTable() {
var data = getScenes();
table.render({
elem: '#table-robotkill',
data: data,
page: { limit: 50 },
cols: [[
{ type: 'numbers', title: '序号', width: 60 },
{ field: 'gameName', title: '场次', width: 120, templet: '#tpl-gameType' },
{ field: 'levelName', title: '等级', width: 80, templet: '#tpl-level' },
{ field: 'weight', title: '权重', width: 70 },
{ field: 'fishName', title: '鱼种', width: 120, templet: function(d) { return d.fishName || d.fishNumber || '-'; } },
{ field: 'fishNumber', title: '鱼编号', width: 90 },
{ field: 'multiplierMin', title: '倍数Min', width: 90 },
{ field: 'multiplierMax', title: '倍数Max', width: 90 },
{ field: 'jackpotMin', title: '爆奖Min', width: 120 },
{ field: 'jackpotMax', title: '爆奖Max', width: 120 },
{ title: '操作', width: 120, fixed: 'right', toolbar: '#table-operate' }
]],
done: function() { form.render(); }
});
}
$(document).on('click', '[lay-filter="reload-robotkill"]', function () {
loadConfig();
layer.msg('刷新成功');
});
$(document).on('click', '[lay-filter="init-robotkill"]', function () {
layer.confirm('确定要从 gameconfig 初始化机器人击杀播报配置吗?', function (idx) {
layer.close(idx);
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig/InitSection/RobotKillConfig",
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('初始化成功');
loadConfig();
} else {
layer.msg(res.info || '初始化失败');
}
},
fail: function () { layer.msg('初始化失败'); }
});
});
});
$(document).on('click', '[lay-filter="add-robotkill"]', function () {
var scenes = getScenes();
scenes.push({
gameName: '', levelName: '', gameType: 1, roomLevel: 1, weight: 1,
fishName: '', fishNumber: '',
multiplierMin: 500, multiplierMax: 2000,
jackpotMin: 5000000, jackpotMax: 200000000
});
renderTable();
});
var currentEditIndex = -1;
function openEditDialog(data, idx) {
currentEditIndex = idx;
var gtOpts = '';
GAME_TYPES.forEach(function(g) {
gtOpts += '<option value="' + g.value + '"' + (data.gameType === g.value ? ' selected' : '') + '>' + g.name + '</option>';
});
var lvOpts = '';
LEVELS.forEach(function(l) {
lvOpts += '<option value="' + l.value + '"' + (data.roomLevel === l.value ? ' selected' : '') + '>' + l.name + '</option>';
});
var html = '<div style="padding:20px;"><form class="layui-form">' +
'<div class="layui-form-item"><label class="layui-form-label">场次</label><div class="layui-input-block"><select id="edit-gameType">' + gtOpts + '</select></div></div>' +
'<div class="layui-form-item"><label class="layui-form-label">等级</label><div class="layui-input-block"><select id="edit-roomLevel">' + lvOpts + '</select></div></div>' +
'<div class="layui-form-item"><label class="layui-form-label">权重</label><div class="layui-input-block"><input type="number" id="edit-weight" value="' + (data.weight||1) + '" class="layui-input"></div></div>' +
'<div class="layui-form-item"><label class="layui-form-label">鱼种</label><div class="layui-input-block"><select id="edit-fishNumber" lay-search>' + fishOptions + '</select></div></div>' +
'<div class="layui-form-item"><label class="layui-form-label">倍数Min</label><div class="layui-input-block"><input type="number" id="edit-multiplierMin" value="' + (data.multiplierMin||500) + '" class="layui-input"></div></div>' +
'<div class="layui-form-item"><label class="layui-form-label">倍数Max</label><div class="layui-input-block"><input type="number" id="edit-multiplierMax" value="' + (data.multiplierMax||2000) + '" class="layui-input"></div></div>' +
'<div class="layui-form-item"><label class="layui-form-label">爆奖Min</label><div class="layui-input-block"><input type="number" id="edit-jackpotMin" value="' + (data.jackpotMin||5000000) + '" class="layui-input"></div></div>' +
'<div class="layui-form-item"><label class="layui-form-label">爆奖Max</label><div class="layui-input-block"><input type="number" id="edit-jackpotMax" value="' + (data.jackpotMax||200000000) + '" class="layui-input"></div></div>' +
'</form></div>';
layer.open({
type: 1, title: '编辑播报配置', area: ['500px', '500px'],
content: html,
btn: ['保存', '取消'],
success: function(layero) {
// 设置鱼种下拉的选中值
if (data.fishNumber) {
layero.find('#edit-fishNumber').val(data.fishNumber);
}
form.render();
},
yes: function (ei) {
var fishNum = $('#edit-fishNumber').val();
var fishName = '';
if (fishNum) {
var opt = $('#edit-fishNumber option[value="' + fishNum + '"]');
fishName = opt.attr('data-name') || opt.text().split(' (')[0] || '';
}
var update = {
gameType: parseInt($('#edit-gameType').val()) || 1,
roomLevel: parseInt($('#edit-roomLevel').val()) || 1,
weight: parseInt($('#edit-weight').val()) || 1,
fishNumber: fishNum || '',
fishName: fishName,
multiplierMin: parseInt($('#edit-multiplierMin').val()) || 500,
multiplierMax: parseInt($('#edit-multiplierMax').val()) || 2000,
jackpotMin: parseInt($('#edit-jackpotMin').val()) || 5000000,
jackpotMax: parseInt($('#edit-jackpotMax').val()) || 200000000
};
update.gameName = GAME_TYPES.find(function(g) { return g.value === update.gameType; })?.name || '';
update.levelName = LEVELS.find(function(l) { return l.value === update.roomLevel; })?.name || '';
// 写回原始数据
var scenes = getScenes();
if (currentEditIndex >= 0 && currentEditIndex < scenes.length) {
scenes[currentEditIndex] = update;
}
layer.close(ei);
renderTable();
}
});
}
table.on('tool(table-robotkill)', function (obj) {
var data = obj.data;
var scenes = getScenes();
// 通过对比所有字段在原始数组中找真实索引
var realIndex = -1;
for (var i = 0; i < scenes.length; i++) {
if (scenes[i].fishNumber === data.fishNumber &&
scenes[i].gameType === data.gameType &&
scenes[i].roomLevel === data.roomLevel) {
realIndex = i;
break;
}
}
// 如果找不到(新增行无 fishNumber),用行 data-index + 页码计算
if (realIndex < 0) {
var pageIndex = $('.layui-laypage-em').next().length > 0
? parseInt($('.layui-laypage-em').next().text()) || 1
: 1;
var trIdx = obj.tr ? $(obj.tr).data('index') : -1;
if (trIdx < 0) trIdx = $(obj.tr).index();
realIndex = (pageIndex - 1) * 50 + trIdx;
}
if (realIndex < 0 || realIndex >= scenes.length) realIndex = 0;
if (obj.event === 'del') {
layer.confirm('确定要删除该配置吗?', function (idx) {
if (realIndex >= 0 && realIndex < scenes.length) {
scenes.splice(realIndex, 1);
}
layer.close(idx);
renderTable();
});
}
if (obj.event === 'edit') {
openEditDialog(data, realIndex);
}
});
$(document).on('click', '[lay-filter="save-robotkill"]', function () {
if (!gameConfig.robotKillConfig) gameConfig.robotKillConfig = {};
var cfg = gameConfig.robotKillConfig;
cfg.isEnabled = $('#isEnabled').prop('checked');
cfg.intervalSeconds = parseInt($('#intervalSeconds').val()) || 5;
// 数据已直接存储在 gameConfig.robotKillConfig.scenes 中
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
url: setter.baseurl + "adminapi/GameConfig/Update",
data: JSON.stringify(gameConfig),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('保存成功');
loadConfig();
} else {
layer.msg(res.info || '保存失败');
}
}
});
});
loadConfig();
});
</script>
<script>window.saveSection=function(n){layui.admin.req({method:'get',url:(layui.setter.baseurl||'/')+'adminapi/GameConfig/SaveSection/'+n,done:function(r){layui.layer.msg(r.info||(r.code===0?'保存成功':'保存失败'))}})}</script>