647 lines
38 KiB
HTML
647 lines
38 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>
|
|||
|
|
<div class="layui-card-body">
|
|||
|
|
<form class="layui-form" lay-filter="bo-form">
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">是否开启</label>
|
|||
|
|
<div class="layui-input-inline">
|
|||
|
|
<input type="checkbox" name="isOpen" lay-skin="switch" lay-text="开启|关闭">
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">结束时间</label>
|
|||
|
|
<div class="layui-input-inline">
|
|||
|
|
<input type="text" name="endTime" id="endTime" class="layui-input" placeholder="选择日期时间">
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">规则描述</label>
|
|||
|
|
<div class="layui-input-inline" style="width:400px;">
|
|||
|
|
<input type="text" name="ruleDesc" class="layui-input" placeholder="规则描述">
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">购买描述</label>
|
|||
|
|
<div class="layui-input-inline" style="width:400px;">
|
|||
|
|
<input type="text" name="buyDesc" class="layui-input" placeholder="购买描述">
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">进阶描述</label>
|
|||
|
|
<div class="layui-input-inline" style="width:400px;">
|
|||
|
|
<input type="text" name="advanceGiftDesc" class="layui-input" placeholder="进阶奖励描述">
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<div class="layui-input-block">
|
|||
|
|
<button class="layui-btn" lay-submit lay-filter="save-base">保存基础配置</button>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</form>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="layui-card">
|
|||
|
|
<div class="layui-card-header">等级配置</div>
|
|||
|
|
<div class="layui-card-body">
|
|||
|
|
<div class="layui-btn-container" style="margin-bottom:10px;">
|
|||
|
|
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-filter="init-level"><i class="layui-icon layui-icon-refresh"></i> 初始化</button>
|
|||
|
|
<button class="layui-btn layui-btn-sm" lay-filter="add-level"><i class="layui-icon layui-icon-add-1"></i> 添加等级</button>
|
|||
|
|
<button class="layui-btn layui-btn-sm" lay-filter="save-levels"><i class="layui-icon layui-icon-ok"></i> 保存</button>
|
|||
|
|
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="saveAct('BattleOrderConfig')"><i class="layui-icon layui-icon-export"></i> 保存到初始化文件</button>
|
|||
|
|
</div>
|
|||
|
|
<table id="table-level" lay-filter="table-level"></table>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="layui-card">
|
|||
|
|
<div class="layui-card-header">进阶配置</div>
|
|||
|
|
<div class="layui-card-body">
|
|||
|
|
<div class="layui-btn-container" style="margin-bottom:10px;">
|
|||
|
|
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-filter="init-advance"><i class="layui-icon layui-icon-refresh"></i> 初始化</button>
|
|||
|
|
<button class="layui-btn layui-btn-sm" lay-filter="add-advance"><i class="layui-icon layui-icon-add-1"></i> 添加进阶</button>
|
|||
|
|
<button class="layui-btn layui-btn-sm" lay-filter="save-advances"><i class="layui-icon layui-icon-ok"></i> 保存</button>
|
|||
|
|
</div>
|
|||
|
|
<table id="table-advance" lay-filter="table-advance"></table>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<script type="text/html" id="bar-level">
|
|||
|
|
<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>
|
|||
|
|
|
|||
|
|
<script type="text/html" id="bar-advance">
|
|||
|
|
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
|
|||
|
|
<a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="reward">奖励</a>
|
|||
|
|
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<script type="text/html" id="tpl-payType">
|
|||
|
|
{{# var m = {1:'金币',2:'钻石',3:'现金'}; }}
|
|||
|
|
{{= m[d.payType] || '金币' }}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<script type="text/html" id="tpl-advance-type">
|
|||
|
|
{{# var m = {1:'豪华',2:'至尊',3:'豪华+至尊'}; }}
|
|||
|
|
{{= m[d.type] || '豪华' }}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<script type="text/html" id="reward-dialog-tpl">
|
|||
|
|
<div class="reward-tabs" style="padding:10px;">
|
|||
|
|
<div class="layui-tab" lay-filter="reward-tab">
|
|||
|
|
<ul class="layui-tab-title">
|
|||
|
|
<li class="layui-this">普通奖励</li>
|
|||
|
|
<li>豪华奖励</li>
|
|||
|
|
<li>至尊奖励</li>
|
|||
|
|
</ul>
|
|||
|
|
<div class="layui-tab-content" style="height:480px;">
|
|||
|
|
<div class="layui-tab-item layui-show" data-key="normalGiftList"></div>
|
|||
|
|
<div class="layui-tab-item" data-key="luxuryGiftList"></div>
|
|||
|
|
<div class="layui-tab-item" data-key="supremeGiftList"></div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<script type="text/html" id="gift-editor-tpl">
|
|||
|
|
<div class="gift-container">
|
|||
|
|
<div class="gift-left">
|
|||
|
|
<div class="gift-toolbar">
|
|||
|
|
<button class="layui-btn layui-btn-sm" id="btn-add-gift"><i class="layui-icon layui-icon-add-1"></i> 新增</button>
|
|||
|
|
<button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete-gift"><i class="layui-icon layui-icon-delete"></i> 删除</button>
|
|||
|
|
</div>
|
|||
|
|
<div class="gift-table-wrap"><table id="table-gift-list"></table></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="gift-right">
|
|||
|
|
<h4>礼包项详情</h4>
|
|||
|
|
<div class="layui-form">
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">类型</label>
|
|||
|
|
<div class="layui-input-block">
|
|||
|
|
<select id="giftType" lay-filter="giftType">
|
|||
|
|
<option value="1">金币</option>
|
|||
|
|
<option value="2">钻石</option>
|
|||
|
|
<option value="3">道具</option>
|
|||
|
|
</select>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">数量</label>
|
|||
|
|
<div class="layui-input-block"><input type="number" id="giftCount" class="layui-input" placeholder="数量"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">随机</label>
|
|||
|
|
<div class="layui-input-block"><input type="checkbox" id="giftIsRandom" lay-skin="switch" lay-text="是|否"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">最小值</label>
|
|||
|
|
<div class="layui-input-block"><input type="number" id="giftMinCount" class="layui-input" placeholder="最小值"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item">
|
|||
|
|
<label class="layui-form-label">最大值</label>
|
|||
|
|
<div class="layui-input-block"><input type="number" id="giftMaxCount" class="layui-input" placeholder="最大值"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item gift-prop-select" style="display:none;">
|
|||
|
|
<label class="layui-form-label">道具编号</label>
|
|||
|
|
<div class="layui-input-block"><input type="text" id="giftProductNumber" class="layui-input" placeholder="输入道具编号"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="layui-form-item" style="margin-top:10px;">
|
|||
|
|
<button class="layui-btn layui-btn-normal" id="btn-save-gift" style="width:100%;">保存</button>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
layui.use(['admin', 'table', 'form', 'layer', 'laydate', 'element', 'upload'], function () {
|
|||
|
|
var $ = layui.$, admin = layui.admin, table = layui.table, form = layui.form,
|
|||
|
|
layer = layui.layer, laydate = layui.laydate, setter = layui.setter, element = layui.element, upload = layui.upload;
|
|||
|
|
|
|||
|
|
var activityConfig = null;
|
|||
|
|
var rewardCtx = null; // { giftList, title }
|
|||
|
|
|
|||
|
|
setTimeout(function() {
|
|||
|
|
$('.layui-layer-shade').remove(); layer.closeAll();
|
|||
|
|
}, 100);
|
|||
|
|
|
|||
|
|
laydate.render({ elem: '#endTime', type: 'datetime' });
|
|||
|
|
|
|||
|
|
function loadConfig() {
|
|||
|
|
admin.req({ method: 'get', url: setter.baseurl + 'adminapi/ActivityConfig/Get',
|
|||
|
|
done: function(r2) {
|
|||
|
|
activityConfig = (r2.code === 0 && r2.data) ? r2.data : { battleOrderConfig: {} };
|
|||
|
|
initForm();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function bo() {
|
|||
|
|
if (!activityConfig.battleOrderConfig) activityConfig.battleOrderConfig = {};
|
|||
|
|
return activityConfig.battleOrderConfig;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function initForm() {
|
|||
|
|
var b = bo();
|
|||
|
|
$('input[name="isOpen"]').prop('checked', b.isOpen);
|
|||
|
|
$('input[name="endTime"]').val(b.endTime ? new Date(b.endTime * 1000).toLocaleString() : '');
|
|||
|
|
$('input[name="ruleDesc"]').val(b.ruleDesc || '');
|
|||
|
|
$('input[name="buyDesc"]').val(b.buyDesc || '');
|
|||
|
|
$('input[name="advanceGiftDesc"]').val(b.advanceGiftDesc || '');
|
|||
|
|
form.render();
|
|||
|
|
renderLevelTable();
|
|||
|
|
renderAdvanceTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function save(msg) {
|
|||
|
|
admin.req({
|
|||
|
|
method: 'post', contentType: 'application/json;charset=UTF-8',
|
|||
|
|
url: setter.baseurl + 'adminapi/ActivityConfig/UpdateBattleOrder',
|
|||
|
|
data: JSON.stringify(activityConfig.battleOrderConfig),
|
|||
|
|
done: function(r) {
|
|||
|
|
r.code === 0 ? (layer.msg(msg || '保存成功'), loadConfig()) : layer.msg(r.info || '保存失败');
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
form.on('submit(save-base)', function(d) {
|
|||
|
|
var b = bo();
|
|||
|
|
b.isOpen = d.field.isOpen === 'on';
|
|||
|
|
b.ruleDesc = d.field.ruleDesc || '';
|
|||
|
|
b.buyDesc = d.field.buyDesc || '';
|
|||
|
|
b.advanceGiftDesc = d.field.advanceGiftDesc || '';
|
|||
|
|
if (d.field.endTime) b.endTime = Math.floor(new Date(d.field.endTime).getTime() / 1000);
|
|||
|
|
save('保存成功'); return false;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// ==================== 等级表格 ====================
|
|||
|
|
function renderLevelTable() {
|
|||
|
|
var levels = bo().levelConfig || [];
|
|||
|
|
table.render({ elem: '#table-level', data: levels, page: true,
|
|||
|
|
cols: [[
|
|||
|
|
{ type: 'numbers', title: '序号', width: 60 },
|
|||
|
|
{ field: 'level', title: '等级', width: 70, sort: true },
|
|||
|
|
{ field: 'exp', title: '升级经验', width: 90 },
|
|||
|
|
{ title: '普通奖励', width: 90, templet: function(d) { return (d.normalGiftList||[]).length + '项'; } },
|
|||
|
|
{ title: '豪华奖励', width: 90, templet: function(d) { return (d.luxuryGiftList||[]).length + '项'; } },
|
|||
|
|
{ title: '至尊奖励', width: 90, templet: function(d) { return (d.supremeGiftList||[]).length + '项'; } },
|
|||
|
|
{ field: 'payType', title: '付费', width: 70, templet: '#tpl-payType' },
|
|||
|
|
{ field: 'payCount', title: '费用', width: 80 },
|
|||
|
|
{ title: '操作', width: 200, fixed: 'right', toolbar: '#bar-level' }
|
|||
|
|
]]
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==================== 进阶表格 ====================
|
|||
|
|
function renderAdvanceTable() {
|
|||
|
|
var list = bo().advanceGift || [];
|
|||
|
|
table.render({ elem: '#table-advance', data: list, page: false,
|
|||
|
|
cols: [[
|
|||
|
|
{ type: 'numbers', title: '序号', width: 60 },
|
|||
|
|
{ field: 'type', title: '类型', width: 80, templet: '#tpl-advance-type' },
|
|||
|
|
{ field: 'name', title: '名称', width: 120 },
|
|||
|
|
{ field: 'count', title: '数量', width: 80 },
|
|||
|
|
{ field: 'payType', title: '付费', width: 70, templet: '#tpl-payType' },
|
|||
|
|
{ field: 'payCount', title: '费用', width: 80 },
|
|||
|
|
{ title: '奖励', width: 80, templet: function(d) { return (d.giftList||[]).length + '项'; } },
|
|||
|
|
{ title: '操作', width: 180, fixed: 'right', toolbar: '#bar-advance' }
|
|||
|
|
]]
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==================== 等级 CRUD ====================
|
|||
|
|
function showLevelEdit(data, isAdd) {
|
|||
|
|
var readonly = isAdd ? '' : 'readonly';
|
|||
|
|
var html = '<div style="padding:15px;"><form class="layui-form">' +
|
|||
|
|
'<div class="layui-row"><div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">等级</label><div class="layui-input-block"><input type="number" id="dlg-level" value="'+(data.level||'')+'" class="layui-input" '+readonly+'></div></div></div>' +
|
|||
|
|
'<div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">升级经验</label><div class="layui-input-block"><input type="number" id="dlg-exp" value="'+(data.exp||0)+'" class="layui-input"></div></div></div></div>' +
|
|||
|
|
'<div class="layui-row"><div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">付费类型</label><div class="layui-input-block"><select id="dlg-payType"><option value="1"'+(data.payType===1?' selected':'')+'>金币</option><option value="2"'+(data.payType===2?' selected':'')+'>钻石</option><option value="3"'+(data.payType===3?' selected':'')+'>现金</option></select></div></div></div>' +
|
|||
|
|
'<div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">付费金额</label><div class="layui-input-block"><input type="number" id="dlg-payCount" value="'+(data.payCount||0)+'" class="layui-input"></div></div></div></div>' +
|
|||
|
|
'<div style="margin-top:10px;border-top:1px solid #eee;padding-top:10px;"><div class="layui-tab" lay-filter="dlg-reward-tab"><ul class="layui-tab-title"><li class="layui-this">普通奖励</li><li>豪华奖励</li><li>至尊奖励</li></ul>' +
|
|||
|
|
'<div class="layui-tab-content" style="height:300px;padding:5px 0;">' +
|
|||
|
|
'<div class="layui-tab-item layui-show"><div class="inplace-gift" data-key="normalGiftList"></div></div>' +
|
|||
|
|
'<div class="layui-tab-item"><div class="inplace-gift" data-key="luxuryGiftList"></div></div>' +
|
|||
|
|
'<div class="layui-tab-item"><div class="inplace-gift" data-key="supremeGiftList"></div></div>' +
|
|||
|
|
'</div></div></div></form></div>';
|
|||
|
|
layer.open({ type:1, title:isAdd?'添加等级':'编辑等级', area:['850px','580px'], content:html, btn:['保存','取消'],
|
|||
|
|
success:function(l){
|
|||
|
|
form.render('select');
|
|||
|
|
element.render('tab');
|
|||
|
|
var keys = ['normalGiftList','luxuryGiftList','supremeGiftList'];
|
|||
|
|
var tgt = {};
|
|||
|
|
keys.forEach(function(k){ tgt[k] = data[k] || []; });
|
|||
|
|
renderInplaceGift(l.find('.inplace-gift[data-key="normalGiftList"]'), tgt.normalGiftList);
|
|||
|
|
element.on('tab(dlg-reward-tab)', function(o){
|
|||
|
|
var k = keys[o.index];
|
|||
|
|
var ph = l.find('.inplace-gift[data-key="'+k+'"]');
|
|||
|
|
if (ph.is(':empty')) renderInplaceGift(ph, tgt[k]);
|
|||
|
|
});
|
|||
|
|
window._dlgGiftData = tgt;
|
|||
|
|
},
|
|||
|
|
yes:function(idx,l){
|
|||
|
|
var tgt = window._dlgGiftData || {};
|
|||
|
|
var item = {
|
|||
|
|
level: parseInt(l.find('#dlg-level').val()) || data.level,
|
|||
|
|
exp: parseInt(l.find('#dlg-exp').val()) || 0,
|
|||
|
|
normalGiftList: tgt.normalGiftList || [],
|
|||
|
|
luxuryGiftList: tgt.luxuryGiftList || [],
|
|||
|
|
supremeGiftList: tgt.supremeGiftList || [],
|
|||
|
|
payType: parseInt(l.find('#dlg-payType').val()) || 1,
|
|||
|
|
payCount: parseInt(l.find('#dlg-payCount').val()) || 0
|
|||
|
|
};
|
|||
|
|
var b = bo();
|
|||
|
|
if (!b.levelConfig) b.levelConfig = [];
|
|||
|
|
if (isAdd) {
|
|||
|
|
if (b.levelConfig.some(function(x) { return x.level === item.level; }))
|
|||
|
|
{ layer.msg('等级已存在'); return; }
|
|||
|
|
b.levelConfig.push(item);
|
|||
|
|
} else {
|
|||
|
|
var i = b.levelConfig.findIndex(function(x) { return x.level === data.level; });
|
|||
|
|
if (i > -1) b.levelConfig[i] = item;
|
|||
|
|
}
|
|||
|
|
delete window._dlgGiftData;
|
|||
|
|
layer.close(idx); save(isAdd?'添加成功':'保存成功');
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function renderInplaceGift(container, giftList) {
|
|||
|
|
if (!giftList) giftList = [];
|
|||
|
|
var html = '<div style="margin-bottom:8px;"><button class="layui-btn layui-btn-xs layui-btn-normal btn-ip-add"><i class="layui-icon layui-icon-add-1"></i> 新增奖励项</button></div>' +
|
|||
|
|
'<table class="ip-gift-table"><thead><tr><th style="width:60px">类型</th><th style="width:60px">数量</th><th style="width:60px">最小值</th><th style="width:60px">最大值</th><th style="width:60px">随机</th><th style="width:100px">道具ID</th><th style="width:60px">操作</th></tr></thead><tbody></tbody></table>';
|
|||
|
|
container.html(html);
|
|||
|
|
var tbody = container.find('tbody');
|
|||
|
|
function renderRows(){
|
|||
|
|
tbody.empty();
|
|||
|
|
giftList.forEach(function(g,idx){
|
|||
|
|
var typeMap = {1:'金币',2:'钻石',3:'道具'};
|
|||
|
|
var tr = $('<tr><td>'+ (typeMap[g.type]||'金币') +'</td><td>'+ (g.count||0) +'</td><td>'+ (g.minCount||0) +'</td><td>'+ (g.maxCount||0) +'</td><td>'+ (g.isRandom?'是':'否') +'</td><td>'+ (g.otherId||'') +'</td><td><button class="layui-btn layui-btn-xs btn-ip-edit" data-idx="'+idx+'">编辑</button><button class="layui-btn layui-btn-xs layui-btn-danger btn-ip-del" data-idx="'+idx+'">删除</button></td></tr>');
|
|||
|
|
tbody.append(tr);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
renderRows();
|
|||
|
|
container.find('.btn-ip-add').off('click').on('click', function(){
|
|||
|
|
giftList.push({type:1,count:100,isRandom:false,minCount:0,maxCount:0,otherId:''});
|
|||
|
|
renderRows();
|
|||
|
|
});
|
|||
|
|
container.off('click','.btn-ip-del').on('click','.btn-ip-del', function(){
|
|||
|
|
var idx = parseInt($(this).data('idx'));
|
|||
|
|
giftList.splice(idx,1);
|
|||
|
|
renderRows();
|
|||
|
|
});
|
|||
|
|
container.off('click','.btn-ip-edit').on('click','.btn-ip-edit', function(){
|
|||
|
|
var idx = parseInt($(this).data('idx'));
|
|||
|
|
var g = giftList[idx];
|
|||
|
|
if (!g) return;
|
|||
|
|
var ehtml = '<div style="padding:15px;"><form class="layui-form"><div class="layui-form-item"><label class="layui-form-label">类型</label><div class="layui-input-block"><select id="ip-type"><option value="1"'+(g.type===1?' selected':'')+'>金币</option><option value="2"'+(g.type===2?' selected':'')+'>钻石</option><option value="3"'+(g.type===3?' selected':'')+'>道具</option></select></div></div>' +
|
|||
|
|
'<div class="layui-form-item"><label class="layui-form-label">数量</label><div class="layui-input-block"><input type="number" id="ip-count" value="'+(g.count||0)+'" class="layui-input"></div></div>' +
|
|||
|
|
'<div class="layui-form-item"><label class="layui-form-label">随机</label><div class="layui-input-block"><input type="checkbox" id="ip-random" lay-skin="switch" lay-text="是|否"'+(g.isRandom?' checked':'')+'></div></div>' +
|
|||
|
|
'<div class="layui-form-item"><label class="layui-form-label">最小值</label><div class="layui-input-block"><input type="number" id="ip-min" value="'+(g.minCount||0)+'" class="layui-input"></div></div>' +
|
|||
|
|
'<div class="layui-form-item"><label class="layui-form-label">最大值</label><div class="layui-input-block"><input type="number" id="ip-max" value="'+(g.maxCount||0)+'" class="layui-input"></div></div>' +
|
|||
|
|
'<div class="layui-form-item gift-prop-select" style="'+(g.type===3?'':'display:none;')+'"><label class="layui-form-label">道具编号</label><div class="layui-input-block"><input type="text" id="ip-oid" class="layui-input" value="'+(g.otherId||'')+'" placeholder="输入道具编号"></div></div></form></div>';
|
|||
|
|
layer.open({type:1,title:'编辑奖励项',area:['420px','420px'],content:ehtml,btn:['保存','取消'],
|
|||
|
|
success:function(el){ form.render(); form.on('select(ip-type)', function(o){ el.find('.gift-prop-select').toggle(o.value==='3'); }); },
|
|||
|
|
yes:function(ei,el){
|
|||
|
|
var t = parseInt(el.find('#ip-type').val())||1;
|
|||
|
|
var propNum = t===3 ? (el.find('#ip-oid').val()||'') : '';
|
|||
|
|
giftList[idx] = {
|
|||
|
|
type:t, count: parseInt(el.find('#ip-count').val())||0,
|
|||
|
|
isRandom: el.find('#ip-random')[0].checked,
|
|||
|
|
minCount: parseInt(el.find('#ip-min').val())||0,
|
|||
|
|
maxCount: parseInt(el.find('#ip-max').val())||0,
|
|||
|
|
otherId: propNum
|
|||
|
|
};
|
|||
|
|
layer.close(ei);
|
|||
|
|
renderRows();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==================== 进阶 CRUD ====================
|
|||
|
|
function showAdvanceEdit(data, isAdd) {
|
|||
|
|
var readonly = isAdd ? '' : 'readonly';
|
|||
|
|
var html = '<div style="padding:20px;"><form class="layui-form">' +
|
|||
|
|
'<div class="layui-row"><div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">类型</label><div class="layui-input-block"><select id="dlg-type" '+readonly+'><option value="1"'+(data.type===1?' selected':'')+'>豪华</option><option value="2"'+(data.type===2?' selected':'')+'>至尊</option><option value="3"'+(data.type===3?' selected':'')+'>豪华+至尊</option></select></div></div></div>' +
|
|||
|
|
'<div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">名称</label><div class="layui-input-block"><input type="text" id="dlg-name" value="'+(data.name||'')+'" class="layui-input"></div></div></div></div>' +
|
|||
|
|
'<div class="layui-row"><div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">奖励数量</label><div class="layui-input-block"><input type="number" id="dlg-count" value="'+(data.count||0)+'" class="layui-input"></div></div></div>' +
|
|||
|
|
'<div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">图片</label><div class="layui-input-block" style="display:flex;"><input type="text" id="dlg-image" value="'+(data.imageUrl||'')+'" class="layui-input" placeholder="图片URL" style="flex:1;margin-right:5px;"><button type="button" id="btn-upload-advance-img" class="layui-btn layui-btn-sm"><i class="layui-icon layui-icon-upload"></i></button></div></div></div></div>' +
|
|||
|
|
'<div class="layui-row"><div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">付费类型</label><div class="layui-input-block"><select id="dlg-payType"><option value="1"'+(data.payType===1?' selected':'')+'>金币</option><option value="2"'+(data.payType===2?' selected':'')+'>钻石</option><option value="3"'+(data.payType===3?' selected':'')+'>现金</option></select></div></div></div>' +
|
|||
|
|
'<div class="layui-col-md6"><div class="layui-form-item"><label class="layui-form-label">付费金额</label><div class="layui-input-block"><input type="number" id="dlg-payCount" value="'+(data.payCount||0)+'" class="layui-input"></div></div></div></div>' +
|
|||
|
|
'</form></div>';
|
|||
|
|
layer.open({ type:1, title:isAdd?'添加进阶':'编辑进阶', area:['550px','380px'], content:html, btn:['保存','取消'],
|
|||
|
|
success:function(l){
|
|||
|
|
form.render('select');
|
|||
|
|
layui.upload.render({
|
|||
|
|
elem: l.find('#btn-upload-advance-img'),
|
|||
|
|
url: (layui.setter.baseurl||'/')+'adminapi/ImageUpload/upload/temp',
|
|||
|
|
done: function(r) {
|
|||
|
|
if (r.code === 0) l.find('#dlg-image').val(r.data.path);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
yes:function(idx,l){
|
|||
|
|
var item = {
|
|||
|
|
type: parseInt(l.find('#dlg-type').val()) || 1,
|
|||
|
|
name: l.find('#dlg-name').val() || '',
|
|||
|
|
count: parseInt(l.find('#dlg-count').val()) || 0,
|
|||
|
|
imageUrl: l.find('#dlg-image').val() || '',
|
|||
|
|
payType: parseInt(l.find('#dlg-payType').val()) || 1,
|
|||
|
|
payCount: parseInt(l.find('#dlg-payCount').val()) || 0,
|
|||
|
|
giftList: data.giftList || []
|
|||
|
|
};
|
|||
|
|
var b = bo();
|
|||
|
|
if (!b.advanceGift) b.advanceGift = [];
|
|||
|
|
if (isAdd) {
|
|||
|
|
if (b.advanceGift.some(function(x) { return x.type === item.type; }))
|
|||
|
|
{ layer.msg('类型已存在'); return; }
|
|||
|
|
b.advanceGift.push(item);
|
|||
|
|
} else {
|
|||
|
|
var i = b.advanceGift.findIndex(function(x) { return x.type === data.type; });
|
|||
|
|
if (i > -1) b.advanceGift[i] = item;
|
|||
|
|
}
|
|||
|
|
layer.close(idx); save(isAdd?'添加成功':'保存成功');
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==================== 奖励编辑弹窗(三层tab,与奖池页面一致) ====================
|
|||
|
|
function showRewardDialog(title, levelData) {
|
|||
|
|
rewardCtx = { normal: levelData.normalGiftList || [], luxury: levelData.luxuryGiftList || [], supreme: levelData.supremeGiftList || [] };
|
|||
|
|
var html = '<div class="reward-tabs" style="padding:10px;"><div class="layui-tab" lay-filter="reward-tab">' +
|
|||
|
|
'<ul class="layui-tab-title"><li class="layui-this">普通奖励</li><li>豪华奖励</li><li>至尊奖励</li></ul>' +
|
|||
|
|
'<div class="layui-tab-content" style="height:480px;">' +
|
|||
|
|
'<div class="layui-tab-item layui-show"><div class="gift-placeholder" data-key="normalGiftList"></div></div>' +
|
|||
|
|
'<div class="layui-tab-item"><div class="gift-placeholder" data-key="luxuryGiftList"></div></div>' +
|
|||
|
|
'<div class="layui-tab-item"><div class="gift-placeholder" data-key="supremeGiftList"></div></div>' +
|
|||
|
|
'</div></div></div>';
|
|||
|
|
|
|||
|
|
layer.open({
|
|||
|
|
type: 1, title: title, area: ['1000px', '620px'],
|
|||
|
|
content: html, shade: 0.1, shadeClose: true,
|
|||
|
|
success: function(layero) {
|
|||
|
|
// 初始化第一个tab的编辑器
|
|||
|
|
initGiftEditor(layero, rewardCtx.normal);
|
|||
|
|
// tab切换时重新初始化编辑器
|
|||
|
|
form.on('tab(reward-tab)', function(o) {
|
|||
|
|
var key = o.index === 0 ? 'normalGiftList' : o.index === 1 ? 'luxuryGiftList' : 'supremeGiftList';
|
|||
|
|
var list = rewardCtx[key];
|
|||
|
|
var ph = layero.find('.gift-placeholder[data-key="' + key + '"]');
|
|||
|
|
ph.html($('#gift-editor-tpl').html());
|
|||
|
|
var propOpts = '<option value="">请选择道具</option>';
|
|||
|
|
propList.forEach(function(p) { propOpts += '<option value="'+p.number+'">'+p.number+' - '+p.name+'</option>'; });
|
|||
|
|
ph.find('#giftProductNumber').html(propOpts);
|
|||
|
|
form.render();
|
|||
|
|
bindGiftEvents(ph, list);
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
end: function() { renderLevelTable(); renderAdvanceTable(); }
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function initGiftEditor(layero, giftList) {
|
|||
|
|
var ph = layero.find('.gift-placeholder[data-key="normalGiftList"]');
|
|||
|
|
ph.html($('#gift-editor-tpl').html());
|
|||
|
|
var propOpts = '<option value="">请选择道具</option>';
|
|||
|
|
propList.forEach(function(p) { propOpts += '<option value="'+p.number+'">'+p.number+' - '+p.name+'</option>'; });
|
|||
|
|
ph.find('#giftProductNumber').html(propOpts);
|
|||
|
|
form.render();
|
|||
|
|
bindGiftEvents(ph, giftList);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function bindGiftEvents(container, giftList) {
|
|||
|
|
var $c = $(container);
|
|||
|
|
currentGiftIndex = -1;
|
|||
|
|
renderGiftTable($c, giftList);
|
|||
|
|
|
|||
|
|
$c.find('#btn-add-gift').on('click', function() {
|
|||
|
|
giftList.push({ type:1, count:100, isRandom:false, minCount:0, maxCount:0, otherId:'' });
|
|||
|
|
currentGiftIndex = giftList.length - 1;
|
|||
|
|
renderGiftTable($c, giftList, currentGiftIndex);
|
|||
|
|
loadGiftForm(giftList[giftList.length-1], $c);
|
|||
|
|
});
|
|||
|
|
$c.find('#btn-delete-gift').on('click', function() {
|
|||
|
|
if (currentGiftIndex < 0) return layer.msg('请先选择要删除的项');
|
|||
|
|
giftList.splice(currentGiftIndex, 1);
|
|||
|
|
currentGiftIndex = -1; clearGiftForm($c);
|
|||
|
|
renderGiftTable($c, giftList, -1);
|
|||
|
|
});
|
|||
|
|
$c.find('#btn-save-gift').on('click', function() {
|
|||
|
|
if (currentGiftIndex < 0) return layer.msg('请先选择要编辑的项');
|
|||
|
|
var t = parseInt($c.find('#giftType').val()) || 1;
|
|||
|
|
var oid = t === 3 ? ($c.find('#giftProductNumber').val()||'') : '';
|
|||
|
|
giftList[currentGiftIndex] = {
|
|||
|
|
type: t, count: parseInt($c.find('#giftCount').val()) || 0,
|
|||
|
|
isRandom: $c.find('#giftIsRandom')[0].checked,
|
|||
|
|
minCount: parseInt($c.find('#giftMinCount').val()) || 0,
|
|||
|
|
maxCount: parseInt($c.find('#giftMaxCount').val()) || 0,
|
|||
|
|
otherId: oid
|
|||
|
|
};
|
|||
|
|
renderGiftTable($c, giftList, currentGiftIndex);
|
|||
|
|
layer.msg('保存成功');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
form.on('select(giftType)', function(o) {
|
|||
|
|
$c.find('.gift-prop-select').toggle(o.value === '3');
|
|||
|
|
$c.find('#giftCount').val(0); $c.find('#giftIsRandom')[0].checked = false; form.render('checkbox');
|
|||
|
|
});
|
|||
|
|
$c.find('#giftCount').on('input', function() { $c.find('#giftIsRandom')[0].checked = false; form.render('checkbox'); });
|
|||
|
|
$c.find('#giftIsRandom').on('click', function() {
|
|||
|
|
if (this.checked) setTimeout(function() { $c.find('#giftCount').val(0); }, 10);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var currentGiftIndex = -1;
|
|||
|
|
|
|||
|
|
function renderGiftTable(container, giftList, selectIndex) {
|
|||
|
|
table.render({ elem: container.find('#table-gift-list'), data: giftList, page: false, height: 380,
|
|||
|
|
cols: [[
|
|||
|
|
{ type: 'numbers', title: '序号', width: 60 },
|
|||
|
|
{ field: 'type', title: '类型', width: 80, templet: function(d) { return ({1:'金币',2:'钻石',3:'道具'})[d.type]||'金币'; }},
|
|||
|
|
{ field: 'count', title: '数量', width: 80 },
|
|||
|
|
{ field: 'minCount', title: '最小值', width: 80 },
|
|||
|
|
{ field: 'maxCount', title: '最大值', width: 80 },
|
|||
|
|
{ field: 'isRandom', title: '随机', width: 70, templet: function(d) { return d.isRandom ? '是' : '否'; }},
|
|||
|
|
{ field: 'otherId', title: '道具Id', width: 120 }
|
|||
|
|
]],
|
|||
|
|
done: function() {
|
|||
|
|
if (selectIndex === undefined) selectIndex = giftList.length > 0 ? 0 : -1;
|
|||
|
|
if (selectIndex >= 0 && selectIndex < giftList.length) {
|
|||
|
|
currentGiftIndex = selectIndex;
|
|||
|
|
var tr = container.find('#table-gift-list + .layui-table-view tr[data-index="'+selectIndex+'"]');
|
|||
|
|
if (tr.length) { tr.addClass('layui-table-click'); loadGiftForm(giftList[selectIndex], container); }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
container.find('#table-gift-list + .layui-table-view').off('click').on('click', 'tr[data-index]', function() {
|
|||
|
|
var idx = parseInt($(this).attr('data-index'));
|
|||
|
|
if (idx >= 0 && idx < giftList.length) {
|
|||
|
|
currentGiftIndex = idx;
|
|||
|
|
container.find('tr[data-index]').removeClass('layui-table-click');
|
|||
|
|
$(this).addClass('layui-table-click');
|
|||
|
|
loadGiftForm(giftList[idx], container);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function loadGiftForm(data, container) {
|
|||
|
|
container.find('#giftType').val(data.type || 1);
|
|||
|
|
container.find('#giftCount').val(data.count || 0);
|
|||
|
|
container.find('#giftIsRandom')[0].checked = data.isRandom || false;
|
|||
|
|
container.find('#giftMinCount').val(data.minCount || 0);
|
|||
|
|
container.find('#giftMaxCount').val(data.maxCount || 0);
|
|||
|
|
var oid = data.otherId || '';
|
|||
|
|
container.find('#giftProductNumber').val(oid);
|
|||
|
|
container.find('.gift-prop-select').toggle(data.type === 3);
|
|||
|
|
form.render('checkbox'); form.render('select');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function clearGiftForm(container) {
|
|||
|
|
container.find('#giftType').val('1');
|
|||
|
|
container.find('#giftCount').val('0');
|
|||
|
|
container.find('#giftIsRandom')[0].checked = false;
|
|||
|
|
container.find('#giftMinCount').val('0');
|
|||
|
|
container.find('#giftMaxCount').val('0');
|
|||
|
|
container.find('#giftProductNumber').val('');
|
|||
|
|
container.find('.gift-prop-select').hide();
|
|||
|
|
form.render('checkbox'); form.render('select');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==================== 初始化按钮(从 JSON 还原) ====================
|
|||
|
|
$(document).on('click', '[lay-filter="init-level"],[lay-filter="init-advance"]', function() {
|
|||
|
|
layer.confirm('确定要从配置文件还原战令数据吗?', function(i) {
|
|||
|
|
layer.close(i);
|
|||
|
|
admin.req({
|
|||
|
|
method: 'get',
|
|||
|
|
url: setter.baseurl + 'adminapi/GameConfig/InitActivitySection/BattleOrderConfig',
|
|||
|
|
done: function(r) {
|
|||
|
|
if (r.code === 0 || r.code === 200) {
|
|||
|
|
layer.msg('初始化成功');
|
|||
|
|
loadConfig();
|
|||
|
|
} else {
|
|||
|
|
layer.msg(r.info || '初始化失败');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
$(document).on('click', '[lay-filter="add-level"]', function() {
|
|||
|
|
var b = bo(), levels = b.levelConfig || [];
|
|||
|
|
var max = levels.length ? Math.max.apply(null, levels.map(function(l){return l.level;})) : 0;
|
|||
|
|
showLevelEdit({ level:max+1, exp:(max+1)*100, normalGiftList:[], luxuryGiftList:[], supremeGiftList:[], payType:1, payCount:(max+1)*100 }, true);
|
|||
|
|
});
|
|||
|
|
$(document).on('click', '[lay-filter="add-advance"]', function() {
|
|||
|
|
var b = bo(), list = b.advanceGift || [];
|
|||
|
|
var used = list.map(function(a){return a.type;});
|
|||
|
|
var nt = 1; while (used.indexOf(nt) > -1) nt++;
|
|||
|
|
showAdvanceEdit({ type:nt, name:({1:'豪华',2:'至尊',3:'豪华+至尊'})[nt]||'进阶', count:100, payType:1, payCount:10000, giftList:[] }, true);
|
|||
|
|
});
|
|||
|
|
$(document).on('click', '[lay-filter="save-levels"],[lay-filter="save-advances"]', function() { save('保存成功'); });
|
|||
|
|
|
|||
|
|
// ==================== 表格操作事件 ====================
|
|||
|
|
table.on('tool(table-level)', function(obj) {
|
|||
|
|
var d = obj.data, b = bo(), i = b.levelConfig.findIndex(function(x){return x.level===d.level;});
|
|||
|
|
if (i < 0) return;
|
|||
|
|
if (obj.event === 'del') {
|
|||
|
|
layer.confirm('确定删除等级'+d.level+'?', function(idx) { b.levelConfig.splice(i,1); layer.close(idx); save('删除成功'); });
|
|||
|
|
} else if (obj.event === 'edit') {
|
|||
|
|
showLevelEdit(d, false);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
table.on('tool(table-advance)', function(obj) {
|
|||
|
|
var d = obj.data, b = bo(), i = b.advanceGift.findIndex(function(x){return String(x.type)===String(d.type);});
|
|||
|
|
if (i < 0) return;
|
|||
|
|
if (obj.event === 'del') {
|
|||
|
|
layer.confirm('确定删除进阶'+d.name+'?', function(idx) { b.advanceGift.splice(i,1); layer.close(idx); save('删除成功'); });
|
|||
|
|
} else if (obj.event === 'edit') {
|
|||
|
|
showAdvanceEdit(d);
|
|||
|
|
} else if (obj.event === 'reward') {
|
|||
|
|
if (!b.advanceGift[i].giftList) b.advanceGift[i].giftList = [];
|
|||
|
|
var html = '<div class="gift-placeholder">'+$('#gift-editor-tpl').html()+'</div>';
|
|||
|
|
layer.open({
|
|||
|
|
type:1, title:'进阶 - '+d.name+' 奖励列表', area:['1000px','620px'],
|
|||
|
|
content: html, shade: 0.1, shadeClose: true,
|
|||
|
|
success: function(layero) {
|
|||
|
|
// 奖励类型下拉与道具编号输入是两个不同字段,不能把道具选项塞进类型下拉。
|
|||
|
|
form.render();
|
|||
|
|
bindGiftEvents(layero.find('.gift-placeholder'), b.advanceGift[i].giftList);
|
|||
|
|
},
|
|||
|
|
end: function() { renderLevelTable(); renderAdvanceTable(); }
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
window.saveAct=function(n){layui.admin.req({method:'get',url:(layui.setter.baseurl||'/')+'adminapi/ActivityConfig/SaveSection/'+n,done:function(r){layui.layer.msg(r.info||(r.code===0?'保存成功':'保存失败'))}})}
|
|||
|
|
loadConfig();
|
|||
|
|
});
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style>
|
|||
|
|
.gift-container { display: flex; height: 460px; padding: 10px; }
|
|||
|
|
.gift-left { flex: 1; margin-right: 15px; }
|
|||
|
|
.gift-table-wrap { height: 380px; overflow: auto; }
|
|||
|
|
.gift-right { width: 280px; border-left: 1px solid #e6e6e6; padding-left: 15px; }
|
|||
|
|
.gift-right h4 { margin-bottom: 12px; color: #333; font-size: 15px; padding-bottom: 8px; border-bottom: 1px solid #eee; }
|
|||
|
|
.gift-toolbar { margin-bottom: 8px; }
|
|||
|
|
.gift-toolbar .layui-btn { margin-right: 5px; }
|
|||
|
|
.gift-right .layui-form-item { margin-bottom: 10px; }
|
|||
|
|
.gift-right .layui-form-label { padding: 9px 0; width: 60px; }
|
|||
|
|
.gift-right .layui-input-block { margin-left: 70px; }
|
|||
|
|
.reward-tabs .layui-tab-title { height: 42px; }
|
|||
|
|
.reward-tabs .layui-tab-title li { line-height: 42px; }
|
|||
|
|
.reward-tabs .layui-tab-content { padding: 10px 0; }
|
|||
|
|
</style>
|