318 lines
15 KiB
HTML
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>
|