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

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>