385 lines
18 KiB
HTML
385 lines
18 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-body" style="padding:10px 10px 0 10px;">
|
||
|
|
<div class="layui-btn-container" id="game-type-btns">
|
||
|
|
<button class="layui-btn layui-btn-sm layui-btn-primary" data-type="0">全部游戏</button>
|
||
|
|
<button class="layui-btn layui-btn-sm" data-type="1">风雷之渊</button>
|
||
|
|
<button class="layui-btn layui-btn-sm" data-type="2">永夜尸城</button>
|
||
|
|
<button class="layui-btn layui-btn-sm" data-type="3">黑化悟空</button>
|
||
|
|
<button class="layui-btn layui-btn-sm" data-type="4">星际迷航</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<div class="layui-card-body" style="padding-top:10px;">
|
||
|
|
<table id="table-fisharray" lay-filter="table-fisharray"></table>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<script type="text/html" id="toolbar-fisharray">
|
||
|
|
<div class="layui-btn-container">
|
||
|
|
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-filter="init-fisharray"><i class="layui-icon layui-icon-refresh"></i> 初始化配置</button>
|
||
|
|
<button class="layui-btn layui-btn-sm" lay-filter="save-fisharray"><i class="layui-icon layui-icon-ok"></i> 保存配置</button>
|
||
|
|
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="reload-fisharray"><i class="layui-icon layui-icon-refresh"></i> 刷新</button>
|
||
|
|
<button class="layui-btn layui-btn-sm" lay-filter="add-fisharray">添加</button>
|
||
|
|
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-filter="batchdel-fisharray">批量删除</button>
|
||
|
|
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="saveSection('FishArrayConfigs')"><i class="layui-icon layui-icon-export"></i> 保存到初始化文件</button>
|
||
|
|
</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>
|
||
|
|
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
layui.use(['admin', 'table', 'form'], function () {
|
||
|
|
var $ = layui.$,
|
||
|
|
admin = layui.admin,
|
||
|
|
table = layui.table,
|
||
|
|
form = layui.form,
|
||
|
|
setter = layui.setter;
|
||
|
|
|
||
|
|
var gameConfig = null;
|
||
|
|
var currentGameType = 0;
|
||
|
|
var fishList = [];
|
||
|
|
var bossFishList = [];
|
||
|
|
|
||
|
|
function loadConfig() {
|
||
|
|
admin.req({
|
||
|
|
method: "get",
|
||
|
|
url: setter.baseurl + "adminapi/GameConfig",
|
||
|
|
done: function (res) {
|
||
|
|
if (res.code === 0 && res.data) {
|
||
|
|
gameConfig = res.data;
|
||
|
|
var fishConfigs = gameConfig.fishTypeConfigs || [];
|
||
|
|
fishList = fishConfigs.filter(function(f) { return f.fishType === 1 || f.fishType === 3; });
|
||
|
|
bossFishList = fishConfigs.filter(function(f) { return f.fishType === 2 || f.fishType === 5; });
|
||
|
|
renderTable();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function getArrayForGameType(gameType) {
|
||
|
|
var allArrays = (gameConfig ? gameConfig.fishArrayConfigs : []) || [];
|
||
|
|
if (gameType === 0) return allArrays;
|
||
|
|
|
||
|
|
var prefix = '';
|
||
|
|
switch (gameType) {
|
||
|
|
case 1: prefix = '32'; break; // 风雷之渊
|
||
|
|
case 2: prefix = '33'; break; // 永夜尸城
|
||
|
|
case 3: prefix = '31'; break; // 黑化悟空
|
||
|
|
case 4: prefix = '30'; break; // 星际迷航
|
||
|
|
default: return allArrays;
|
||
|
|
}
|
||
|
|
|
||
|
|
return allArrays.filter(function(f) {
|
||
|
|
var numStr = String(f.fishArrayNumber || '');
|
||
|
|
return numStr.indexOf(prefix) === 0;
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
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');
|
||
|
|
renderTable();
|
||
|
|
}
|
||
|
|
|
||
|
|
function formatList(list) {
|
||
|
|
if (!list) return '';
|
||
|
|
if (Array.isArray(list)) return list.join(',');
|
||
|
|
return String(list);
|
||
|
|
}
|
||
|
|
|
||
|
|
function parseList(str) {
|
||
|
|
if (!str) return [];
|
||
|
|
if (Array.isArray(str)) return str;
|
||
|
|
if (typeof str === 'string') {
|
||
|
|
return str.split(',').map(function(x) { return parseInt(x.trim()); }).filter(function(x) { return !isNaN(x); });
|
||
|
|
}
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
|
||
|
|
// 删除鱼阵时同步移除房间出鱼配置中的鱼阵引用(type=2)。
|
||
|
|
function removeFishArrayReferences(arrayNumbers) {
|
||
|
|
var deleted = new Set((arrayNumbers || []).map(function(x) { return String(x); }));
|
||
|
|
var roomConfigs = gameConfig && gameConfig.roomFishConfigs;
|
||
|
|
if (!deleted.size || !roomConfigs) return;
|
||
|
|
|
||
|
|
var configs = Array.isArray(roomConfigs) ? roomConfigs : [roomConfigs];
|
||
|
|
configs.forEach(function(roomConfig) {
|
||
|
|
if (!roomConfig) return;
|
||
|
|
['normalFishList', 'roomFishLevelList'].forEach(function(field) {
|
||
|
|
if (!Array.isArray(roomConfig[field])) return;
|
||
|
|
roomConfig[field] = roomConfig[field].filter(function(item) {
|
||
|
|
return !item || Number(item.type) !== 2 || !deleted.has(String(item.fishNumber));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
var tableInitialized = false;
|
||
|
|
|
||
|
|
function renderTable() {
|
||
|
|
var tableData = getArrayForGameType(currentGameType);
|
||
|
|
if (tableInitialized) {
|
||
|
|
table.reload('table-fisharray', { data: tableData });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
tableInitialized = true;
|
||
|
|
table.render({
|
||
|
|
elem: '#table-fisharray',
|
||
|
|
data: tableData,
|
||
|
|
cols: [[
|
||
|
|
{ type: 'checkbox', fixed: 'left' },
|
||
|
|
{ field: "fishArrayNumber", title: "鱼阵编号", width: 100 },
|
||
|
|
{ field: "name", title: "名称", width: 120 },
|
||
|
|
{ field: "fishNumber", title: "普通鱼编号", width: 100 },
|
||
|
|
{ field: "fishCount", title: "普通鱼数量", width: 100 },
|
||
|
|
{ field: "bossFishNumber", title: "Boss鱼编号", width: 100 },
|
||
|
|
{ field: "boosCount", title: "Boss数量", width: 90 },
|
||
|
|
{ field: "arrayNumber", title: "阵型编号", width: 100 },
|
||
|
|
{
|
||
|
|
field: "generateFrequency", title: "生成频率(影响阵容间距)", width: 100, templet: function(d) {
|
||
|
|
return d.generateFrequency || 0.2;
|
||
|
|
}},
|
||
|
|
{ title: "操作", width: 150, fixed: 'right', toolbar: '#table-operate' }
|
||
|
|
]],
|
||
|
|
toolbar: '#toolbar-fisharray',
|
||
|
|
defaultToolbar: ['filter', 'exports', 'print']
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 游戏类型切换
|
||
|
|
$('#game-type-btns').off().on('click', '.layui-btn', function() {
|
||
|
|
var gameType = parseInt($(this).data('type'));
|
||
|
|
switchGameType(gameType);
|
||
|
|
});
|
||
|
|
|
||
|
|
function initConfig() {
|
||
|
|
layer.confirm('确定要初始化全部配置数据吗?此操作将清空现有数据!', function(idx) {
|
||
|
|
layer.close(idx);
|
||
|
|
admin.req({
|
||
|
|
method: "get",
|
||
|
|
url: setter.baseurl + "adminapi/GameConfig/InitSection/FishArrayConfigs",
|
||
|
|
done: function (res) {
|
||
|
|
if (res.code === 0 || res.code === 200) {
|
||
|
|
layer.msg('初始化成功');
|
||
|
|
loadConfig();
|
||
|
|
} else {
|
||
|
|
layer.msg(res.info || '初始化失败');
|
||
|
|
}
|
||
|
|
},
|
||
|
|
fail: function(res) {
|
||
|
|
layer.msg(res.info || '初始化失败');
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
$(document).on('click', '[lay-filter="init-fisharray"]', 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-fisharray"]', function() {
|
||
|
|
loadConfig();
|
||
|
|
layer.msg('刷新成功');
|
||
|
|
});
|
||
|
|
|
||
|
|
$(document).on('click', '[lay-filter="save-fisharray"]', function() {
|
||
|
|
if (window.parent && window.parent.$ && window.parent.layer) {
|
||
|
|
window.parent.$('.layui-layer-shade').remove();
|
||
|
|
window.parent.layer.closeAll();
|
||
|
|
}
|
||
|
|
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 || '保存失败');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
table.on('tool(table-fisharray)', function(obj) {
|
||
|
|
var data = obj.data;
|
||
|
|
var trIndex = gameConfig.fishArrayConfigs.findIndex(function(x) { return x.fishArrayNumber === data.fishArrayNumber; });
|
||
|
|
if (obj.event === 'edit') {
|
||
|
|
showEditDialog(data, false, trIndex);
|
||
|
|
} else if (obj.event === 'del') {
|
||
|
|
layer.confirm('确定删除该配置吗?', function(idx) {
|
||
|
|
if (trIndex > -1) {
|
||
|
|
gameConfig.fishArrayConfigs.splice(trIndex, 1);
|
||
|
|
removeFishArrayReferences([data.fishArrayNumber]);
|
||
|
|
}
|
||
|
|
obj.del();
|
||
|
|
layer.close(idx);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
function showAddDialog() {
|
||
|
|
if (!gameConfig.fishArrayConfigs) gameConfig.fishArrayConfigs = [];
|
||
|
|
var newData = {
|
||
|
|
fishArrayNumber: '',
|
||
|
|
name: '',
|
||
|
|
fishNumber: '',
|
||
|
|
fishCount: 0,
|
||
|
|
bossFishNumber: '',
|
||
|
|
boosCount: 0,
|
||
|
|
arrayNumber: '',
|
||
|
|
generateFrequency: 0.2
|
||
|
|
};
|
||
|
|
showEditDialog(newData, true, -1);
|
||
|
|
}
|
||
|
|
|
||
|
|
$(document).on('click', '[lay-filter="add-fisharray"]', function() {
|
||
|
|
showAddDialog();
|
||
|
|
});
|
||
|
|
|
||
|
|
$(document).on('click', '[lay-filter="batchdel-fisharray"]', function() {
|
||
|
|
var checkStatus = table.checkStatus('table-fisharray');
|
||
|
|
var checkData = checkStatus.data;
|
||
|
|
if (checkData.length === 0) {
|
||
|
|
return layer.msg('请选择要删除的数据');
|
||
|
|
}
|
||
|
|
layer.confirm('确定删除选中的 ' + checkData.length + ' 条数据吗?', function(idx) {
|
||
|
|
var ids = checkData.map(function(item) { return item.fishArrayNumber; });
|
||
|
|
gameConfig.fishArrayConfigs = gameConfig.fishArrayConfigs.filter(function(item) {
|
||
|
|
return !ids.includes(item.fishArrayNumber);
|
||
|
|
});
|
||
|
|
removeFishArrayReferences(ids);
|
||
|
|
renderTable();
|
||
|
|
layer.close(idx);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
function showEditDialog(data, isAdd, itemIndex) {
|
||
|
|
var dialogTitle = isAdd ? '添加鱼阵' : '编辑鱼阵';
|
||
|
|
var fishOptions = '<option value="">请选择</option>';
|
||
|
|
fishList.forEach(function(f) {
|
||
|
|
fishOptions += '<option value="' + f.fishNumber + '"' + (data.fishNumber === f.fishNumber ? ' selected' : '') + '>' + f.fishNumber + ' - ' + f.fishName + '</option>';
|
||
|
|
});
|
||
|
|
|
||
|
|
var bossOptions = '<option value="">请选择</option>';
|
||
|
|
bossFishList.forEach(function(f) {
|
||
|
|
bossOptions += '<option value="' + f.fishNumber + '"' + (data.bossFishNumber === f.fishNumber ? ' selected' : '') + '>' + f.fishNumber + ' - ' + f.fishName + '</option>';
|
||
|
|
});
|
||
|
|
|
||
|
|
var html = '<div class="edit-dialog" style="padding:20px;">' +
|
||
|
|
'<form class="layui-form">' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">鱼阵编号</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<input type="text" name="fishArrayNumber" value="' + (data.fishArrayNumber || '') + '" class="layui-input">' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">名称</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<input type="text" name="name" value="' + (data.name || '') + '" class="layui-input">' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">普通鱼编号</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<select name="fishNumber" lay-search="true">' + fishOptions + '</select>' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">普通鱼数量</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<input type="number" name="fishCount" value="' + (data.fishCount || 0) + '" class="layui-input">' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">Boss鱼编号</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<select name="bossFishNumber" lay-search="true">' + bossOptions + '</select>' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">Boss数量</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<input type="number" name="boosCount" value="' + (data.boosCount || 0) + '" class="layui-input">' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">阵型编号</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<input type="text" name="arrayNumber" value="' + (data.arrayNumber || '') + '" class="layui-input">' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'<div class="layui-form-item">' +
|
||
|
|
'<label class="layui-form-label">生成频率</label>' +
|
||
|
|
'<div class="layui-input-block">' +
|
||
|
|
'<input type="number" name="generateFrequency" value="' + (data.generateFrequency || 0.2) + '" step="0.01" class="layui-input" placeholder="如: 0.2">' +
|
||
|
|
'</div>' +
|
||
|
|
'</div>' +
|
||
|
|
'</form>' +
|
||
|
|
'</div>';
|
||
|
|
|
||
|
|
layer.open({
|
||
|
|
type: 1,
|
||
|
|
title: dialogTitle,
|
||
|
|
area: ['600px', '600px'],
|
||
|
|
content: html,
|
||
|
|
btn: ['保存', '取消'],
|
||
|
|
shadeClose: true,
|
||
|
|
success: function(layero) {
|
||
|
|
form.render('select');
|
||
|
|
},
|
||
|
|
yes: function(index, layero) {
|
||
|
|
var updatedItem = {
|
||
|
|
fishArrayNumber: layero.find('input[name="fishArrayNumber"]').val(),
|
||
|
|
name: layero.find('input[name="name"]').val(),
|
||
|
|
fishNumber: layero.find('select[name="fishNumber"]').val(),
|
||
|
|
fishCount: parseInt(layero.find('input[name="fishCount"]').val()) || 0,
|
||
|
|
bossFishNumber: layero.find('select[name="bossFishNumber"]').val(),
|
||
|
|
boosCount: parseInt(layero.find('input[name="boosCount"]').val()) || 0,
|
||
|
|
arrayNumber: layero.find('input[name="arrayNumber"]').val(),
|
||
|
|
generateFrequency: parseFloat(layero.find('input[name="generateFrequency"]').val()) || 0.2
|
||
|
|
};
|
||
|
|
if (isAdd) {
|
||
|
|
gameConfig.fishArrayConfigs.unshift(updatedItem);
|
||
|
|
} else {
|
||
|
|
if (itemIndex >= 0 && itemIndex < gameConfig.fishArrayConfigs.length) {
|
||
|
|
gameConfig.fishArrayConfigs[itemIndex] = updatedItem;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
layer.close(index);
|
||
|
|
table.reload('table-fisharray', {
|
||
|
|
data: getArrayForGameType(currentGameType)
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
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>
|