Files
BuYuHouDuan/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/sign.html
T

493 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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="sign-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" style="line-height:38px;">
<input type="checkbox" name="cannotInterrupt" lay-skin="switch" lay-text="勾选|未勾选">
</div>
<div class="layui-form-mid layui-word-aux">勾选=漏签不回退(按累计次数循环1~7);未勾选=漏签重置回第1天</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">7 日签到奖励</div>
<div class="layui-card-body">
<table id="table-sign" lay-filter="table-sign"></table>
</div>
</div>
</div>
<script type="text/html" id="toolbar-sign">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-filter="init-sign"><i class="layui-icon layui-icon-refresh"></i> 初始化配置</button>
<button class="layui-btn layui-btn-sm" lay-filter="add-sign"><i class="layui-icon layui-icon-add-1"></i> 添加天数</button>
<button class="layui-btn layui-btn-sm" lay-filter="save-sign"><i class="layui-icon layui-icon-ok"></i> 保存配置</button>
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="reload-sign"><i class="layui-icon layui-icon-refresh"></i> 刷新</button>
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-filter="batchdel-sign">批量删除</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="saveAct('SignActivityConfig')"><i class="layui-icon layui-icon-export"></i> 保存到初始化文件</button>
</div>
</script>
<script type="text/html" id="bar-sign">
<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 type="text/html" id="tpl-icon">
{{# if(d.icon){ }}
<img src="{{d.icon}}" style="width:40px;height:40px;object-fit:cover;cursor:pointer;border-radius:4px;" onclick="previewImage('{{d.icon}}')" alt="图标">
{{# } else { }}
<span style="color:#999;">无图标</span>
{{# } }}
</script>
<style>
.icon-upload-box { position: relative; display: inline-block; }
.icon-upload-box .upload-btn { position: absolute; top: 0; left: 0; width: 80px; height: 80px; opacity: 0; cursor: pointer; }
.icon-upload-preview { width: 80px; height: 80px; border: 1px dashed #ddd; border-radius: 4px; display: flex; align-items: center; justify-content: center; background: #fafafa; cursor: pointer; }
.icon-upload-preview:hover { border-color: #009688; }
.icon-upload-preview img { max-width: 100%; max-height: 100%; }
.icon-upload-preview .placeholder { color: #999; font-size: 12px; text-align: center; }
.gift-list-table { width: 100%; border-collapse: collapse; }
.gift-list-table th, .gift-list-table td { border: 1px solid #e6e6e6; padding: 6px 8px; font-size: 13px; text-align: center; }
.gift-list-table th { background: #fafafa; color: #666; font-weight: normal; }
</style>
<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 activityConfig = null;
var propList = [];
var typeMap = { 1: '金币', 2: '钻石', 3: '道具' };
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 sign() {
if (!activityConfig) activityConfig = {};
if (!activityConfig.signActivityConfig) activityConfig.signActivityConfig = { isOpen: true, cannotInterrupt: false, days: [] };
if (!activityConfig.signActivityConfig.days) activityConfig.signActivityConfig.days = [];
return activityConfig.signActivityConfig;
}
function getPropName(number) {
var p = propList.find(function (x) { return String(x.number) === String(number); });
return p ? (p.number + ' - ' + p.name) : (number || '');
}
function loadConfig() {
admin.req({
method: "get",
url: setter.baseurl + "adminapi/ActivityConfig/Get",
done: function (res) {
activityConfig = (res.code === 0 && res.data) ? res.data : { signActivityConfig: {} };
loadProps();
}
});
}
function loadProps() {
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig",
done: function (res) {
propList = (res.code === 0 && res.data && res.data.propConfig) ? res.data.propConfig : [];
initForm();
},
fail: function () { propList = []; initForm(); }
});
}
function initForm() {
var s = sign();
$('input[name="isOpen"]').prop('checked', !!s.isOpen);
$('input[name="cannotInterrupt"]').prop('checked', !!s.cannotInterrupt);
form.render();
renderTable();
}
function save(msg) {
var s = sign();
s.isOpen = $('input[name="isOpen"]')[0].checked;
s.cannotInterrupt = $('input[name="cannotInterrupt"]')[0].checked;
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
url: setter.baseurl + "adminapi/ActivityConfig/UpdateSign",
data: JSON.stringify(s),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg(msg || '保存成功');
loadConfig();
} else {
layer.msg(res.info || '保存失败');
}
}
});
}
function giftText(list) {
if (!list || !list.length) return '<span style="color:#999;">未配置</span>';
return list.map(function (g) {
var t = g.type || 1;
if (t === 1) return '金币×' + (g.count || 0);
if (t === 2) return '钻石×' + (g.count || 0);
if (t === 3) return '道具 ' + getPropName(g.otherId || '') + '×' + (g.count || 0);
return (typeMap[t] || '未知') + '×' + (g.count || 0);
}).join('、');
}
function renderTable() {
table.render({
elem: '#table-sign',
data: sign().days || [],
page: false,
cols: [[
{ type: 'checkbox', fixed: 'left' },
{ field: "day", title: "第几天", width: 80, sort: true },
{ field: "name", title: "名称", width: 140 },
{ field: "icon", title: "图标", width: 90, templet: '#tpl-icon' },
{ title: "奖励", templet: function (d) { return giftText(d.giftList); } },
{ title: "操作", width: 160, fixed: 'right', toolbar: '#bar-sign' }
]],
toolbar: '#toolbar-sign',
defaultToolbar: ['filter', 'exports', 'print']
});
}
form.on('submit(save-base)', function () { save('保存成功'); return false; });
$(document).on('click', '[lay-filter="reload-sign"]', function () {
loadConfig();
layer.msg('刷新成功');
});
$(document).on('click', '[lay-filter="save-sign"]', function () { save('保存成功'); });
$(document).on('click', '[lay-filter="add-sign"]', function () {
var days = sign().days || [];
var max = days.length ? Math.max.apply(null, days.map(function (d) { return d.day || 0; })) : 0;
showDayEdit({ day: max + 1, name: '第' + (max + 1) + '天', icon: '', giftList: [] }, true, -1);
});
$(document).on('click', '[lay-filter="init-sign"]', function () {
if (window.parent && window.parent.$ && window.parent.layer) {
window.parent.$('.layui-layer-shade').remove();
window.parent.layer.closeAll();
}
layer.confirm('确定要从配置文件还原签到配置吗?', function (idx) {
layer.close(idx);
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig/InitActivitySection/SignActivityConfig",
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 || '初始化失败');
}
});
});
});
window.previewImage = function (url) {
layer.open({
type: 1,
title: '图片预览',
area: ['auto', 'auto'],
shadeClose: true,
content: '<div style="padding:20px;text-align:center;"><img src="' + url + '" style="max-width:400px;max-height:400px;border-radius:8px;"></div>'
});
};
table.on('tool(table-sign)', function (obj) {
var data = obj.data;
var days = sign().days || [];
var idx = days.findIndex(function (x) { return x.day === data.day; });
if (idx < 0) return;
if (obj.event === 'edit') {
showDayEdit(days[idx], false, idx);
} else if (obj.event === 'del') {
layer.confirm('确定删除第' + data.day + '天配置吗?', function (i) {
days.splice(idx, 1);
layer.close(i);
save('删除成功');
});
}
});
$(document).on('click', '[lay-filter="batchdel-sign"]', function () {
var checkData = table.checkStatus('table-sign').data;
if (checkData.length === 0) return layer.msg('请选择要删除的数据');
layer.confirm('确定删除选中 ' + checkData.length + ' 条数据吗?', function (idx) {
var daySet = checkData.map(function (item) { return item.day; });
var s = sign();
s.days = (s.days || []).filter(function (item) { return daySet.indexOf(item.day) < 0; });
layer.close(idx);
save('删除成功');
});
});
// ==================== 天数编辑弹窗(含奖励配置) ====================
function showDayEdit(data, isAdd, rowIndex) {
var imagePreviewHtml = data.icon
? '<img src="' + data.icon + '" style="max-width:100%;max-height:100%;">'
: '<div class="placeholder">点击上传</div>';
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">' +
'<input type="number" name="day" value="' + (data.day || 1) + '" class="layui-input" ' + (isAdd ? '' : 'readonly') + '>' +
'</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">' +
'<div class="icon-upload-box">' +
'<div class="icon-upload-preview" id="iconPreview">' + imagePreviewHtml + '</div>' +
'<input type="file" class="upload-btn" accept="image/*" id="iconUpload">' +
'</div>' +
'<input type="hidden" name="icon" id="iconInput" value="' + (data.icon || '') + '">' +
'<div style="margin-top:8px;color:#999;font-size:12px;">点击图片可预览</div>' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">奖励</label>' +
'<div class="layui-input-block">' +
'<button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="btn-add-gift"><i class="layui-icon layui-icon-add-1"></i> 新增奖励</button>' +
'<table class="gift-list-table" style="margin-top:8px;">' +
'<thead><tr><th style="width:80px;">类型</th><th>道具</th><th style="width:90px;">数量</th><th style="width:120px;">操作</th></tr></thead>' +
'<tbody id="giftTbody"></tbody>' +
'</table>' +
'<div style="color:#999;font-size:12px;margin-top:4px;">类型选“道具”时,可从下拉里选择具体道具(含碎片)并设置数量</div>' +
'</div>' +
'</div>' +
'</form>' +
'</div>';
var giftList = (data.giftList || []).map(function (g) {
return { type: g.type || 1, count: g.count || 0, otherId: g.otherId || '' };
});
layer.open({
type: 1,
title: isAdd ? '添加天数配置' : '编辑天数配置',
area: ['640px', '600px'],
content: html,
btn: ['保存', '取消'],
shadeClose: true,
success: function (layero) {
renderGiftRows(layero, giftList);
var $preview = layero.find('#iconPreview');
var $input = layero.find('#iconInput');
$preview.on('click', function () {
var url = $input.val();
if (url) previewImage(url);
});
layero.find('#iconUpload').on('change', function () {
var file = this.files[0];
if (!file) return;
var formData = new FormData();
formData.append('file', file);
$.ajax({
url: setter.baseurl + 'adminapi/ImageUpload/upload/temp',
type: 'POST',
data: formData,
processData: false,
contentType: false,
headers: { 'token': layui.data(setter.tableName)[setter.request.tokenName] },
success: function (res) {
if (res.code === 0 || res.code === 200) {
var path = res.data.path;
$input.val(path);
$preview.html('<img src="' + path + '" style="max-width:100%;max-height:100%;">');
layer.msg('上传成功');
} else {
layer.msg(res.info || '上传失败');
}
},
error: function () { layer.msg('上传失败'); }
});
});
},
yes: function (index, layero) {
var day = parseInt(layero.find('input[name="day"]').val()) || data.day;
if (day <= 0) { layer.msg('请填写正确的天数'); return; }
var item = {
day: day,
name: layero.find('input[name="name"]').val() || ('第' + day + '天'),
icon: layero.find('input[name="icon"]').val(),
giftList: giftList
};
var s = sign();
if (!s.days) s.days = [];
if (isAdd) {
if (s.days.some(function (x) { return x.day === item.day; })) { layer.msg('该天数已存在'); return; }
s.days.push(item);
} else if (rowIndex > -1) {
s.days[rowIndex] = item;
}
layer.close(index);
save(isAdd ? '添加成功' : '保存成功');
}
});
}
function renderGiftRows(dayLayero, giftList) {
var $tbody = dayLayero.find('#giftTbody');
$tbody.empty();
if (!giftList.length) {
$tbody.append('<tr><td colspan="4" style="color:#999;padding:10px;">暂无奖励,点击“新增奖励”添加</td></tr>');
} else {
giftList.forEach(function (g, i) {
var t = g.type || 1;
var itemName = (t === 3) ? getPropName(g.otherId || '') : '-';
$tbody.append(
'<tr>' +
'<td>' + (typeMap[t] || '金币') + '</td>' +
'<td>' + itemName + '</td>' +
'<td>' + (g.count || 0) + '</td>' +
'<td>' +
'<button type="button" class="layui-btn layui-btn-xs gr-edit" data-i="' + i + '">编辑</button>' +
'<button type="button" class="layui-btn layui-btn-xs layui-btn-danger gr-del" data-i="' + i + '">删除</button>' +
'</td>' +
'</tr>');
});
}
dayLayero.find('#btn-add-gift').off('click').on('click', function () {
showGiftEdit(dayLayero, giftList, -1, true);
});
dayLayero.find('.gr-edit').off('click').on('click', function () {
showGiftEdit(dayLayero, giftList, parseInt($(this).data('i')), false);
});
dayLayero.find('.gr-del').off('click').on('click', function () {
giftList.splice(parseInt($(this).data('i')), 1);
renderGiftRows(dayLayero, giftList);
});
}
function showGiftEdit(dayLayero, giftList, index, isAdd) {
var g = isAdd ? { type: 1, count: 0, otherId: '' } : giftList[index];
var propOpts = '<option value="">请选择道具</option>';
propList.forEach(function (p) {
propOpts += '<option value="' + p.number + '">' + p.number + ' - ' + p.name + '</option>';
});
var html = '<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="giftType"><option value="1">金币</option><option value="2">钻石</option><option value="3">道具</option></select>' +
'</div>' +
'</div>' +
'<div class="layui-form-item gift-prop-item">' +
'<label class="layui-form-label">道具</label>' +
'<div class="layui-input-block">' +
'<select id="giftProp" lay-search>' + propOpts + '</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" value="' + (g.count || 0) + '">' +
'</div>' +
'</div>' +
'</form>' +
'</div>';
layer.open({
type: 1,
title: isAdd ? '新增奖励' : '编辑奖励',
area: ['460px', '360px'],
content: html,
btn: ['确定', '取消'],
shadeClose: true,
success: function (l) {
l.find('#giftType').val(g.type || 1);
l.find('#giftProp').val(g.otherId || '');
form.render('select');
toggleGiftProp(l);
l.find('#giftType').on('change', function () { toggleGiftProp(l); });
},
yes: function (idx, l) {
var t = parseInt(l.find('#giftType').val()) || 1;
var c = parseInt(l.find('#giftCount').val()) || 0;
var oid = t === 3 ? (l.find('#giftProp').val() || '') : '';
if (t === 3 && !oid) { layer.msg('请选择道具'); return; }
var item = { type: t, count: c, otherId: oid };
if (isAdd) giftList.push(item); else giftList[index] = item;
layer.close(idx);
renderGiftRows(dayLayero, giftList);
}
});
}
function toggleGiftProp(l) {
var isProp = (parseInt(l.find('#giftType').val()) || 1) === 3;
l.find('.gift-prop-item').toggle(isProp);
}
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>