521 lines
21 KiB
HTML
521 lines
21 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-group">
|
|
<button class="layui-btn layui-btn-sm" id="btn-add">
|
|
<i class="layui-icon layui-icon-add-circle"></i> 添加规则
|
|
</button>
|
|
<button class="layui-btn layui-btn-sm" id="btn-save">
|
|
<i class="layui-icon layui-icon-ok"></i> 保存规则
|
|
</button>
|
|
<button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-init">
|
|
<i class="layui-icon layui-icon-refresh"></i> 初始化规则
|
|
</button>
|
|
<button class="layui-btn layui-btn-sm layui-btn-warm" id="btn-reload">
|
|
<i class="layui-icon layui-icon-refresh"></i> 刷新
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div class="layui-card-body">
|
|
<table id="LAY-rules-manage" lay-filter="LAY-rules-manage"></table>
|
|
|
|
<script type="text/html" id="table-rule-admin">
|
|
<a class="layui-btn layui-btn-normal 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="toolbar-rule">
|
|
<div class="layui-btn-container">
|
|
<button class="layui-btn layui-btn-sm" lay-event="add">添加规则</button>
|
|
</div>
|
|
</script>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<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 rules = [];
|
|
|
|
function loadRules() {
|
|
admin.req({
|
|
method: "get",
|
|
url: setter.baseurl + "adminapi/BeautifulNumber/rules",
|
|
done: function (res) {
|
|
if (res.code === 0 && res.data) {
|
|
rules = res.data;
|
|
renderTable();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function renderTable() {
|
|
|
|
|
|
table.render({
|
|
elem: '#LAY-rules-manage',
|
|
data: rules,
|
|
cols: [[
|
|
{ field: "ruleName", title: "规则名称", width: 150, edit: 'text' },
|
|
{ field: "rulePattern", title: "生成模式", width: 150 },
|
|
{ field: "level", title: "等级", width: 70, edit: 'text' },
|
|
{ field: "price", title: "价格(金币)", width: 100, edit: 'text' },
|
|
{ field: "sort", title: "排序", width: 70, edit: 'text' },
|
|
{
|
|
field: "isEnable",
|
|
title: "启用",
|
|
width: 80,
|
|
templet: function(d) {
|
|
return d.isEnable ? '<span class="layui-badge">是</span>' : '<span class="layui-badge layui-bg-gray">否</span>';
|
|
}
|
|
},
|
|
{ width: 250, title: "操作", align: "center", fixed: "right", toolbar: "#table-rule-admin" }
|
|
]],
|
|
toolbar: '#toolbar-rule'
|
|
});
|
|
}
|
|
|
|
$('#btn-reload').on('click', function() {
|
|
loadRules();
|
|
layer.msg('刷新成功');
|
|
});
|
|
|
|
$('#btn-add').on('click', function() {
|
|
showAddDialog();
|
|
});
|
|
|
|
$('#btn-init').on('click', function() {
|
|
layer.confirm('确定初始化靓号规则吗?这将覆盖现有规则!', function(idx) {
|
|
admin.req({
|
|
method: "post",
|
|
url: setter.baseurl + "adminapi/BeautifulNumber/init-rules",
|
|
done: function (res) {
|
|
layer.close(idx);
|
|
if (res.code === 0 || res.code === 200) {
|
|
layer.msg('初始化成功');
|
|
loadRules();
|
|
} else {
|
|
layer.msg(res.info || '初始化失败');
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
$('#btn-save').on('click', function() {
|
|
layer.confirm('确定保存所有规则吗?', function(idx) {
|
|
admin.req({
|
|
method: "post",
|
|
contentType: "application/json;charset=UTF-8",
|
|
url: setter.baseurl + "adminapi/BeautifulNumber/update-rules",
|
|
data: JSON.stringify(rules),
|
|
done: function (res) {
|
|
layer.close(idx);
|
|
if (res.code === 0 || res.code === 200) {
|
|
layer.msg('保存成功');
|
|
loadRules();
|
|
} else {
|
|
layer.msg(res.info || '保存失败');
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
table.on("tool(LAY-rules-manage)", function (obj) {
|
|
var data = obj.data;
|
|
|
|
if ("del" === obj.event) {
|
|
layer.confirm("确定删除此规则么?", function (i) {
|
|
admin.req({
|
|
method: "post",
|
|
contentType: "application/json;charset=UTF-8",
|
|
url: setter.baseurl + "adminapi/BeautifulNumber/delete-rule",
|
|
data: JSON.stringify({ id: data.id }),
|
|
done: function (res) {
|
|
layer.close(i);
|
|
if (res.code === 0 || res.code === 200) {
|
|
layer.msg('删除成功');
|
|
loadRules();
|
|
} else {
|
|
layer.msg(res.info || '删除失败');
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
if ("edit" === obj.event) {
|
|
showEditDialog(data, obj);
|
|
}
|
|
});
|
|
|
|
table.on('toolbar(LAY-rules-manage)', function(obj){
|
|
if(obj.event === 'add'){
|
|
showAddDialog();
|
|
}
|
|
});
|
|
|
|
function showAddDialog() {
|
|
var content =
|
|
'<form class="layui-form" style="padding: 20px;" lay-filter="layuiadmin-form-add-rule">' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">规则名称</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<input type="text" name="ruleName" class="layui-input" placeholder="如:AAAA、ABBB、ABCDEFGH、AAAABBBX">' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">等级</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<select name="level">' +
|
|
'<option value="S">S级</option>' +
|
|
'<option value="A">A级</option>' +
|
|
'<option value="B">B级</option>' +
|
|
'<option value="C">C级</option>' +
|
|
'<option value="D">D级</option>' +
|
|
'</select>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">价格</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<input type="number" name="price" 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" name="sort" class="layui-input" placeholder="数字越小越靠前" value="0">' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<div class="layui-input-block">' +
|
|
'<button class="layui-btn" lay-submit lay-filter="LAY-add-rule-submit">添加</button>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'</form>';
|
|
|
|
layer.open({
|
|
type: 1,
|
|
title: '添加规则',
|
|
area: ['650px', '500px'],
|
|
content: content
|
|
});
|
|
|
|
layui.form.render();
|
|
layui.form.on('submit(LAY-add-rule-submit)', function(dataField) {
|
|
var ruleName = dataField.field.ruleName.toUpperCase().trim();
|
|
if (!ruleName) {
|
|
layer.msg('请输入规则名称');
|
|
return false;
|
|
}
|
|
|
|
var newRule = {
|
|
ruleName: ruleName,
|
|
rulePattern: ruleName,
|
|
level: dataField.field.level,
|
|
price: parseInt(dataField.field.price) || 0,
|
|
sort: parseInt(dataField.field.sort) || 0,
|
|
isEnable: true
|
|
};
|
|
|
|
admin.req({
|
|
method: "post",
|
|
contentType: "application/json;charset=UTF-8",
|
|
url: setter.baseurl + "adminapi/BeautifulNumber/add-rule",
|
|
data: JSON.stringify(newRule),
|
|
done: function (res) {
|
|
layer.closeAll();
|
|
if (res.code === 0 || res.code === 200) {
|
|
layer.msg('添加成功');
|
|
loadRules();
|
|
} else {
|
|
layer.msg(res.info || '添加失败');
|
|
}
|
|
}
|
|
});
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function showEditDialog(data, obj) {
|
|
var level = data.level || 'D';
|
|
var isEnabled = data.isEnable ? 'checked' : '';
|
|
var content =
|
|
'<form class="layui-form" style="padding: 20px;" lay-filter="layuiadmin-form-edit-rule">' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">规则名称</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<input type="text" name="ruleName" class="layui-input" value="' + (data.ruleName || '') + '" placeholder="如:KKKKKKKK KKKKTTTT ABCDEFGH KKKKXXXX">' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">等级</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<select name="level">' +
|
|
'<option value="S" ' + (level === 'S' ? 'selected' : '') + '>S级</option>' +
|
|
'<option value="A" ' + (level === 'A' ? 'selected' : '') + '>A级</option>' +
|
|
'<option value="B" ' + (level === 'B' ? 'selected' : '') + '>B级</option>' +
|
|
'<option value="C" ' + (level === 'C' ? 'selected' : '') + '>C级</option>' +
|
|
'<option value="D" ' + (level === 'D' ? 'selected' : '') + '>D级</option>' +
|
|
'</select>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">价格</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<input type="number" name="price" class="layui-input" value="' + (data.price || 0) + '" placeholder="金币数量">' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">排序</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<input type="number" name="sort" class="layui-input" value="' + (data.sort || 0) + '" placeholder="数字越小越靠前">' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<label class="layui-form-label">启用</label>' +
|
|
'<div class="layui-input-block">' +
|
|
'<input type="checkbox" name="isEnable" lay-skin="switch" lay-text="开启|关闭" ' + isEnabled + '>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="layui-form-item">' +
|
|
'<div class="layui-input-block">' +
|
|
'<button class="layui-btn" lay-submit lay-filter="LAY-edit-rule-submit">保存</button>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'</form>';
|
|
|
|
layer.open({
|
|
type: 1,
|
|
title: '编辑规则',
|
|
area: ['500px', '450px'],
|
|
content: content
|
|
});
|
|
|
|
layui.form.render();
|
|
layui.form.on('submit(LAY-edit-rule-submit)', function(formData) {
|
|
var isEnable = $(formData.form).find('input[name="isEnable"]').prop('checked');
|
|
var ruleName = formData.field.ruleName.toUpperCase().trim();
|
|
|
|
if (!ruleName) {
|
|
layer.msg('请输入规则名称');
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
var updatedRule = {
|
|
id: data.id,
|
|
ruleName: ruleName,
|
|
|
|
level: formData.field.level,
|
|
price: parseInt(formData.field.price) || 0,
|
|
sort: parseInt(formData.field.sort) || 0,
|
|
isEnable: isEnable
|
|
};
|
|
|
|
admin.req({
|
|
method: "post",
|
|
contentType: "application/json;charset=UTF-8",
|
|
url: setter.baseurl + "adminapi/BeautifulNumber/update-rule",
|
|
data: JSON.stringify(updatedRule),
|
|
done: function (res) {
|
|
layer.closeAll();
|
|
if (res.code === 0 || res.code === 200) {
|
|
layer.msg('保存成功');
|
|
loadRules();
|
|
} else {
|
|
layer.msg(res.info || '保存失败');
|
|
}
|
|
}
|
|
});
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function generateRegexPattern(ruleName) {
|
|
if (!ruleName) {
|
|
return { valid: false, message: '请输入规则名称' };
|
|
}
|
|
|
|
ruleName = ruleName.toUpperCase().trim();
|
|
|
|
if (ruleName.length!=8) {
|
|
return { valid: false, message: '规则名称长度必须是8位' };
|
|
}
|
|
|
|
// 检查是否全部是连续字母A-H (如 ABCDEFGH 表示8连号)
|
|
var isAllConsecutive = true;
|
|
var expectedChar = 'A';
|
|
for (var i = 0; i < ruleName.length; i++) {
|
|
if (ruleName[i] !== expectedChar) {
|
|
isAllConsecutive = false;
|
|
break;
|
|
}
|
|
expectedChar = String.fromCharCode(expectedChar.charCodeAt(0) + 1);
|
|
}
|
|
|
|
// 如果是 ABCDEFGH 这种连续字母,表示全部是连续数字
|
|
if (isAllConsecutive) {
|
|
var len = ruleName.length;
|
|
// 生成匹配连续数字的正则: 01234567, 12345678, 23456789
|
|
var patterns = [];
|
|
for (var start = 0; start <= 9 - len; start++) {
|
|
var seq = '';
|
|
for (var k = 0; k < len; k++) {
|
|
seq += (start + k);
|
|
}
|
|
if (patterns.length > 0 && patterns.length < 10) {
|
|
patterns.push(seq);
|
|
}
|
|
}
|
|
if (patterns.length > 0) {
|
|
return {
|
|
valid: true,
|
|
rulePattern: "^(" + patterns.join('|') + ")$"
|
|
};
|
|
}
|
|
}
|
|
|
|
var regex = "^";
|
|
var prevGroup = '';
|
|
|
|
for (var i = 0; i < ruleName.length; i++) {
|
|
var char = ruleName[i];
|
|
|
|
if (char === 'A') {
|
|
if (prevGroup !== 'A') {
|
|
var aLen = 0;
|
|
var j = i;
|
|
while (j < ruleName.length && ruleName[j] === 'A') {
|
|
aLen++;
|
|
j++;
|
|
}
|
|
if (aLen === 1) {
|
|
regex += "(\\d)";
|
|
} else {
|
|
regex += "(\\d)\\1{" + (aLen - 1) + "}";
|
|
}
|
|
prevGroup = 'A';
|
|
}
|
|
} else if (char === 'B') {
|
|
if (prevGroup !== 'B') {
|
|
var bLen = 0;
|
|
var j = i;
|
|
while (j < ruleName.length && ruleName[j] === 'B') {
|
|
bLen++;
|
|
j++;
|
|
}
|
|
regex += "(\\d{" + bLen + "})";
|
|
prevGroup = 'B';
|
|
}
|
|
} else if (char === 'X') {
|
|
regex += "\\d";
|
|
prevGroup = 'X';
|
|
} else if (char >= '0' && char <= '9') {
|
|
regex += char;
|
|
prevGroup = 'N';
|
|
} else if (char >= 'A' && char <= 'H') {
|
|
// C-H 也当作连续数字处理
|
|
if (prevGroup !== 'CONSECUTIVE') {
|
|
var cLen = 0;
|
|
var j = i;
|
|
while (j < ruleName.length) {
|
|
var c = ruleName[j];
|
|
if (c >= 'A' && c <= 'H') {
|
|
cLen++;
|
|
j++;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
regex += "(\\d{" + cLen + "})";
|
|
prevGroup = 'CONSECUTIVE';
|
|
i = j - 1;
|
|
}
|
|
} else {
|
|
return { valid: false, message: '规则名称只能包含A-H、X和数字' };
|
|
}
|
|
}
|
|
|
|
regex += "$";
|
|
|
|
try {
|
|
new RegExp(regex);
|
|
} catch(e) {
|
|
return { valid: false, message: '生成的正则表达式无效: ' + regex };
|
|
}
|
|
|
|
return {
|
|
valid: true,
|
|
rulePattern: regex
|
|
};
|
|
}
|
|
|
|
window.generateRegex = function() {
|
|
var ruleName = $('#ruleNameInput').val().toUpperCase().trim();
|
|
if (ruleName) {
|
|
var result = generateRegexPattern(ruleName);
|
|
if (result.valid) {
|
|
$('#rulePatternInput').val(result.rulePattern);
|
|
}
|
|
} else {
|
|
$('#rulePatternInput').val('');
|
|
}
|
|
};
|
|
|
|
window.generateEditRegex = function() {
|
|
var ruleName = $('#editRuleNameInput').val().toUpperCase().trim();
|
|
if (ruleName) {
|
|
var result = generateRegexPattern(ruleName);
|
|
if (result.valid) {
|
|
$('#editRulePatternInput').val(result.rulePattern);
|
|
}
|
|
} else {
|
|
$('#editRulePatternInput').val('');
|
|
}
|
|
};
|
|
|
|
table.on('edit(LAY-rules-manage)', function(obj){
|
|
var field = obj.field;
|
|
var value = obj.value;
|
|
var data = obj.data;
|
|
|
|
if (!isNaN(value) && value !== '') {
|
|
if (field === 'price' || field === 'sort') {
|
|
data[field] = parseInt(value);
|
|
}
|
|
}
|
|
|
|
if (field === 'ruleName') {
|
|
data.rulePattern = value;
|
|
renderTable();
|
|
}
|
|
|
|
});
|
|
|
|
loadRules();
|
|
});
|
|
</script>
|