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

532 lines
23 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>出鱼概率配置</title>
</head>
<body>
<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 layui-btn-normal" lay-filter="init-roomfishprobability"><i class="layui-icon layui-icon-refresh"></i> 初始化配置</button>
<button class="layui-btn layui-btn-sm" lay-filter="save-roomfishprobability"><i class="layui-icon layui-icon-ok"></i> 保存配置</button>
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="reload-roomfishprobability"><i class="layui-icon layui-icon-refresh"></i> 刷新</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="saveSection('RoomFishProbabilityList')"><i class="layui-icon layui-icon-export"></i> 保存到初始化文件</button>
</div>
</div>
<div class="layui-card-body">
<div class="layui-row">
<div class="layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">游戏类型选择</div>
<div class="layui-card-body">
<div class="layui-btn-container" id="game-type-btns">
<button class="layui-btn layui-btn-sm layui-btn-primary" data-type="1">风雷之渊</button>
<button class="layui-btn layui-btn-sm" data-type="2">永夜尸城</button>
<button class="layui-btn layui-btn-sm" data-type="4">星际迷航</button>
<button class="layui-btn layui-btn-sm" data-type="5">黑神话悟空</button>
</div>
</div>
</div>
<div class="layui-card" style="margin-top: 15px;">
<div class="layui-card-header">房间等级筛选</div>
<div class="layui-card-body">
<div class="layui-btn-container" id="room-level-btns">
<button class="layui-btn layui-btn-sm" data-level="all">全部房间</button>
<button class="layui-btn layui-btn-sm layui-btn-primary" data-level="1">初级房间</button>
<button class="layui-btn layui-btn-sm layui-btn-primary" data-level="2">中级房间</button>
<button class="layui-btn layui-btn-sm layui-btn-primary" data-level="3">高级房间</button>
</div>
</div>
</div>
</div>
<div class="layui-col-md9">
<table id="table-roomfishprobability" lay-filter="table-roomfishprobability"></table>
</div>
</div>
</div>
</div>
</div>
<script type="text/html" id="toolbar-roomfishprobability">
<div class="layui-btn-container">
</div>
</script>
<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>
</script>
<script type="text/html" id="tpl-type">
{{# var typeMap = {1:'鱼',2:'鱼阵'}; }}
{{= typeMap[d.type] || '未知(' + d.type + ')' }}
</script>
<script type="text/html" id="tpl-fishType">
{{# var typeMap = {0:'不限',1:'普通鱼',2:'Boss鱼',3:'黄金鱼',4:'特殊鱼',5:'特殊Boss'}; }}
{{= typeMap[d.fishType] || '未知(' + d.fishType + ')' }}
</script>
<script>
layui.use(['admin', 'table', 'form', 'layer'], function () {
if (window._roomFishProbabilityInitialized) return;
window._roomFishProbabilityInitialized = true;
var $ = layui.$,
admin = layui.admin,
table = layui.table,
form = layui.form,
layer = layui.layer,
setter = layui.setter;
var TABLE_ID = 'table-roomfishprobability';
var gameConfig = null;
var probabilityCache = [];
var currentGameType = 1;
var currentRoomLevel = 'all';
var tableRendered = false;
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);
// 格式化 range 字段用于显示
function formatRange(val) {
if (Array.isArray(val)) return val.join('-');
if (val !== undefined && val !== null) return String(val);
return '';
}
// 从任意值解析为数组
function parseIntOrDefault(val, defaultValue) {
var parsed = parseInt(val);
return Number.isNaN(parsed) ? defaultValue : parsed;
}
function parseRange(val, defaultMin, defaultMax) {
if (Array.isArray(val) && val.length >= 2) {
return [parseIntOrDefault(val[0], defaultMin), parseIntOrDefault(val[1], defaultMax)];
}
if (typeof val === 'string' && val.indexOf('-') > -1) {
var parts = val.split('-');
return [parseIntOrDefault(parts[0], defaultMin), parseIntOrDefault(parts[1], defaultMax)];
}
return [defaultMin, defaultMax];
}
function loadConfig() {
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig",
done: function (res) {
if (res.code === 0 && res.data) {
gameConfig = res.data;
buildFishNameMap();
switchGameType(currentGameType);
}
}
});
}
var fishNameMap = {};
var fishArrayNameMap = {};
function buildFishNameMap() {
if (!gameConfig) return;
fishNameMap = {};
fishArrayNameMap = {};
var fishConfigs = gameConfig.fishTypeConfigs || [];
fishConfigs.forEach(function(f) {
fishNameMap[f.fishNumber] = f.fishName || f.fishNumber;
});
var fishArrayConfigs = gameConfig.fishArrayConfigs || [];
fishArrayConfigs.forEach(function(f) {
fishArrayNameMap[f.fishArrayNumber] = f.name || f.fishArrayNumber;
});
}
function switchGameType(gameType) {
currentGameType = gameType;
$('#game-type-btns .layui-btn').removeClass('layui-btn-primary');
$('#game-type-btns .layui-btn[data-type="' + gameType + '"]').addClass('layui-btn-primary');
var roomFishConfig = null;
if (gameConfig && gameConfig.roomFishConfigs) {
roomFishConfig = gameConfig.roomFishConfigs.find(function(r) {
var gt = r.gameType !== undefined ? r.gameType : r.GameType;
return gt === gameType;
});
}
// 深拷贝,切断与 gameConfig 的引用关系
probabilityCache = roomFishConfig
? JSON.parse(JSON.stringify(roomFishConfig.roomFishProbabilityList || roomFishConfig.RoomFishProbabilityList || []))
: [];
// 确保所有 range 字段都是数组,并给每条数据加唯一标识
probabilityCache.forEach(function(item, index) {
item.firstFishCountRange = parseRange(item.firstFishCountRange || item.FirstFishCountRange, 1, 5);
item.timeRange = parseRange(item.timeRange || item.TimeRange, 5, 10);
item.countRange = parseRange(item.countRange || item.CountRange, 5, 10);
item.maxCountRange = parseRange(item.maxCountRange || item.MaxCountRange, 10, 20);
// 给每条数据添加唯一标识(用于编辑时精确匹配)
if (!item._uid) {
item._uid = 'prob_' + Date.now() + '_' + index;
}
});
renderTable();
}
function renderTable() {
var filteredData = probabilityCache;
if (currentRoomLevel !== 'all') {
var levelNum = parseInt(currentRoomLevel);
filteredData = probabilityCache.filter(function(item) {
return item.roomLevel === levelNum;
});
}
var cols = [[
{ type: 'checkbox', fixed: 'left' },
{ field: "roomLevel", title: "房间等级", width: 100 },
{ field: "type", title: "类型", width: 80, templet: '#tpl-type' },
{ field: "fishType", title: "鱼类型", width: 100, templet: '#tpl-fishType' },
{ field: "firstFishCountRange", title: "首次出鱼数量", width: 140, templet: function(d) { return formatRange(d.firstFishCountRange); } },
{ field: "timeRange", title: "出鱼时间频率(秒)", width: 170, templet: function(d) { return formatRange(d.timeRange); } },
{ field: "countRange", title: "出鱼数量频率", width: 140, templet: function(d) { return formatRange(d.countRange); } },
{ field: "maxCountRange", title: "场内允许数量", width: 140, templet: function(d) { return formatRange(d.maxCountRange); } },
{ title: "操作", width: 150, fixed: 'right', toolbar: '#table-operate' }
]];
if (tableRendered) {
table.reload(TABLE_ID, {
data: JSON.parse(JSON.stringify(filteredData)),
cols: cols
});
} else {
table.render({
id: TABLE_ID,
elem: '#' + TABLE_ID,
data: JSON.parse(JSON.stringify(filteredData)),
cols: cols,
toolbar: '#toolbar-roomfishprobability',
defaultToolbar: ['filter', 'exports', 'print']
});
tableRendered = true;
}
}
function saveConfig() {
if (!gameConfig) return;
if (!gameConfig.roomFishConfigs) gameConfig.roomFishConfigs = [];
var roomFishConfig = gameConfig.roomFishConfigs.find(function(r) {
return r.gameType === currentGameType;
});
if (!roomFishConfig) {
roomFishConfig = { gameType: currentGameType, roomFishProbabilityList: [] };
gameConfig.roomFishConfigs.push(roomFishConfig);
}
// 深拷贝写入,防止引用污染
roomFishConfig.roomFishProbabilityList = JSON.parse(JSON.stringify(probabilityCache));
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 || '保存失败');
}
}
});
}
function initConfig() {
layer.confirm('确定要初始化全部配置数据吗?此操作将清空现有数据!', function(idx) {
layer.close(idx);
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig/InitSection/RoomFishProbabilityList",
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('初始化成功');
loadConfig();
} else {
layer.msg(res.info || '初始化失败');
}
}
});
});
}
$(document).on('click', '[lay-filter="init-roomfishprobability"]', function() {
if (window.parent && window.parent.$ && window.parent.layer) {
window.parent.$('.layui-layer-shade').remove();
window.parent.layer.closeAll();
}
initConfig();
});
$(document).on('click', '[lay-filter="reload-roomfishprobability"]', function() {
loadConfig();
layer.msg('刷新成功');
});
$(document).on('click', '[lay-filter="save-roomfishprobability"]', function() {
if (window.parent && window.parent.$ && window.parent.layer) {
window.parent.$('.layui-layer-shade').remove();
window.parent.layer.closeAll();
}
saveConfig();
});
$('#game-type-btns').off().on('click', '.layui-btn', function() {
var gameType = parseInt($(this).data('type'));
switchGameType(gameType);
});
$('#room-level-btns').off().on('click', '.layui-btn', function() {
var level = $(this).data('level');
switchRoomLevel(level);
});
function switchRoomLevel(level) {
currentRoomLevel = level;
$('#room-level-btns .layui-btn').removeClass('layui-btn-primary');
if (level === 'all') {
$('#room-level-btns .layui-btn[data-level="all"]').addClass('layui-btn-primary');
} else {
$('#room-level-btns .layui-btn[data-level="' + level + '"]').addClass('layui-btn-primary');
}
renderTable();
}
table.on('tool(' + TABLE_ID + ')', function(obj) {
if (obj.event === 'edit') {
// 使用唯一标识匹配,而不是行号(行号在分页/筛选后会不准)
var data = null;
if (obj.data._uid) {
// 优先通过唯一ID匹配
data = probabilityCache.find(function(item) { return item._uid === obj.data._uid; });
}
if (!data) {
// 兜底:通过字段组合匹配
var roomLevel = obj.data.roomLevel;
var type = obj.data.type;
var fishType = obj.data.fishType;
data = probabilityCache.find(function(item) {
return item.roomLevel === roomLevel && item.type === type && item.fishType === fishType;
});
}
if (!data) data = obj.data;
showEditDialog(data);
}
});
function showEditDialog(data) {
var d = JSON.parse(JSON.stringify(data));
// 统一解析 range 为数组
d.firstFishCountRange = parseRange(d.firstFishCountRange, 1, 5);
d.timeRange = parseRange(d.timeRange, 5, 10);
d.countRange = parseRange(d.countRange, 5, 10);
d.maxCountRange = parseRange(d.maxCountRange, 10, 20);
var html = '<form class="layui-form" lay-filter="probability-form" style="padding:20px;">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">房间等级</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="roomLevel" value="' + (d.roomLevel || 1) + '" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">类型</label>' +
'<div class="layui-input-inline">' +
'<select name="type">' +
'<option value="1" ' + (d.type === 1 ? 'selected' : '') + '>鱼</option>' +
'<option value="2" ' + (d.type === 2 ? 'selected' : '') + '>鱼阵</option>' +
'</select>' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">鱼类型</label>' +
'<div class="layui-input-inline">' +
'<select name="fishType">' +
'<option value="0" ' + (d.fishType === 0 ? 'selected' : '') + '>不限</option>' +
'<option value="1" ' + (d.fishType === 1 ? 'selected' : '') + '>普通鱼</option>' +
'<option value="2" ' + (d.fishType === 2 ? 'selected' : '') + '>Boss鱼</option>' +
'<option value="3" ' + (d.fishType === 3 ? 'selected' : '') + '>黄金鱼</option>' +
'<option value="4" ' + (d.fishType === 4 ? 'selected' : '') + '>特殊鱼</option>' +
'<option value="5" ' + (d.fishType === 5 ? 'selected' : '') + '>特殊Boss</option>' +
'</select>' +
'</div>' +
'<div class="layui-form-mid">鱼阵时此参数无效</div>' +
'</div>' +
'<fieldset class="layui-elem-field">' +
'<legend>首次出鱼数量区间</legend>' +
'<div class="layui-form-item">' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最小值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="firstFishCountMin" value="' + d.firstFishCountRange[0] + '" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最大值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="firstFishCountMax" value="' + d.firstFishCountRange[1] + '" class="layui-input">' +
'</div>' +
'</div>' +
'</div>' +
'</fieldset>' +
'<fieldset class="layui-elem-field">' +
'<legend>出鱼时间频率区间(秒)</legend>' +
'<div class="layui-form-item">' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最小值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="timeRangeMin" value="' + d.timeRange[0] + '" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最大值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="timeRangeMax" value="' + d.timeRange[1] + '" class="layui-input">' +
'</div>' +
'</div>' +
'</div>' +
'</fieldset>' +
'<fieldset class="layui-elem-field">' +
'<legend>出鱼数量频率区间</legend>' +
'<div class="layui-form-item">' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最小值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="countRangeMin" value="' + d.countRange[0] + '" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最大值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="countRangeMax" value="' + d.countRange[1] + '" class="layui-input">' +
'</div>' +
'</div>' +
'</div>' +
'</fieldset>' +
'<fieldset class="layui-elem-field">' +
'<legend>场内允许数量区间</legend>' +
'<div class="layui-form-item">' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最小值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="maxCountRangeMin" value="' + d.maxCountRange[0] + '" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-inline">' +
'<label class="layui-form-label">最大值</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="maxCountRangeMax" value="' + d.maxCountRange[1] + '" class="layui-input">' +
'</div>' +
'</div>' +
'</div>' +
'</fieldset>' +
'<div class="layui-form-item">' +
'<div class="layui-input-block">' +
'<button class="layui-btn" lay-submit lay-filter="probability-save">保存</button>' +
'<button type="button" class="layui-btn layui-btn-primary" id="probability-cancel">取消</button>' +
'</div>' +
'</div>' +
'</form>';
layer.open({
type: 1,
title: '编辑出鱼概率配置',
area: ['600px', '550px'],
content: html,
success: function(layero) {
form.render();
form.on('submit(probability-save)', function(formData) {
var newData = {
roomLevel: parseIntOrDefault(formData.field.roomLevel, 1),
type: parseIntOrDefault(formData.field.type, 1),
fishType: parseIntOrDefault(formData.field.fishType, 0),
firstFishCountRange: [
parseIntOrDefault(formData.field.firstFishCountMin, 1),
parseIntOrDefault(formData.field.firstFishCountMax, 5)
],
timeRange: [
parseIntOrDefault(formData.field.timeRangeMin, 5),
parseIntOrDefault(formData.field.timeRangeMax, 10)
],
countRange: [
parseIntOrDefault(formData.field.countRangeMin, 5),
parseIntOrDefault(formData.field.countRangeMax, 10)
],
maxCountRange: [
parseIntOrDefault(formData.field.maxCountRangeMin, 10),
parseIntOrDefault(formData.field.maxCountRangeMax, 20)
]
};
// 通过 roomLevel + type + fishType 匹配找到对应行并更新
var found = false;
for (var i = 0; i < probabilityCache.length; i++) {
if (probabilityCache[i].roomLevel === data.roomLevel &&
probabilityCache[i].type === data.type &&
probabilityCache[i].fishType === data.fishType) {
probabilityCache[i] = newData;
found = true;
break;
}
}
if (!found) {
probabilityCache.push(newData);
}
layer.closeAll();
renderTable();
layer.msg('保存成功');
return false;
});
$('#probability-cancel').off().on('click', function() {
layer.closeAll();
});
}
});
}
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?'保存成功':'保存失败'))}})}
loadConfig();
});
</script>
</body>
</html>