添加项目文件。

This commit is contained in:
2026-10-12 16:22:04 +08:00
parent 7c68a0ca0a
commit aad11be43d
1000 changed files with 120807 additions and 0 deletions
@@ -0,0 +1,715 @@
<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-form layui-card-header layuiadmin-card-header-auto" lay-filter="layadmin-beautifulnumber-formlist">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">靓号</label>
<div class="layui-input-block">
<input type="text" name="numberSearch" placeholder="靓号搜索" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">等级</label>
<div class="layui-input-block">
<select name="level">
<option value="">全部</option>
<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-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<select name="status">
<option value="">全部</option>
<option value="0">未售</option>
<option value="1">已售</option>
<option value="2">冻结</option>
<option value="3">普通号</option>
</select>
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layuiadmin-btn-beautifulnumber" lay-submit lay-filter="LAY-beautifulnumber-front-search">
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i> 搜索
</button>
<button class="layui-btn layui-btn-primary" lay-filter="LAY-beautifulnumber-front-reset">
<i class="layui-icon layui-icon-refresh layuiadmin-button-btn"></i> 重置
</button>
</div>
</div>
</div>
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-btn-group">
<button class="layui-btn layui-btn-sm" lay-event="addNumber">
<i class="layui-icon layui-icon-add-circle"></i> 添加靓号
</button>
<button class="layui-btn layui-btn-sm" lay-event="batchAddNumbers">
<i class="layui-icon layui-icon-add-circle"></i> 批量添加
</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="initRules">
<i class="layui-icon layui-icon-refresh"></i> 初始化规则
</button>
<button class="layui-btn layui-btn-sm" lay-event="initNumbers">
<i class="layui-icon layui-icon-refresh"></i> 根据规则生成靓号
</button>
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-event="refresh">
<i class="layui-icon layui-icon-refresh"></i> 刷新
</button>
</div>
<br><br>
<table id="LAY-beautifulnumber-back-manage" lay-filter="LAY-beautifulnumber-back-manage"></table>
<script type="text/html" id="table-beautifulnumber-admin">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="give"><i class="layui-icon layui-icon-gift"></i>赠送</a>
<!--<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-xs" lay-event="editPrice"><i class="layui-icon layui-icon-edit"></i>改价</a>
{{# if(d.status === 0){ }}
<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="freeze"><i class="layui-icon layui-icon-close"></i>冻结</a>
{{# } else if(d.status === 2){ }}
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="unfreeze"><i class="layui-icon layui-icon-ok"></i>解冻</a>
{{# } }}
{{# if(d.status !== 3){ }}
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="setNormal"><i class="layui-icon layui-icon-set"></i>普通号</a>
{{# } }}
{{# if(d.status !== 1){ }}
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
{{# } }}
</script>
</div>
</div>
</div>
<script>
layui.use(['admin', 'table', 'form'], function () {
var i = (layui.$, layui.admin),
$ = layui.$,
admin = layui.admin,
view = layui.view,
table = layui.table,
setter = layui.setter,
form = layui.form;
form.render(null, 'layadmin-beautifulnumber-formlist');
//监听搜索
form.on('submit(LAY-beautifulnumber-front-search)', function (data) {
var field = data.field;
// 转换状态为数字
if (field.status) {
field.status = parseInt(field.status);
}
//执行重载
table.reload('LAY-beautifulnumber-back-manage', {
where: field,
page: { curr: 1 }
});
});
// 监听重置
$('.layui-btn-group').on('click', '[lay-event="refresh"]', function () {
table.reload('LAY-beautifulnumber-back-manage');
});
// 添加单个靓号
$('.layui-btn-group').on('click', '[lay-event="addNumber"]', function () {
var content =
'<form class="layui-form" style="padding: 20px;" lay-filter="layuiadmin-form-add-number">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">靓号</label>' +
'<div class="layui-input-block">' +
'<input type="text" name="number" class="layui-input" placeholder="输入靓号" required>' +
'</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" 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" 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-number-submit">添加</button>' +
'</div>' +
'</div>' +
'</form>';
layer.open({
type: 1,
title: '添加靓号',
area: ['600px', '450px'],
content: content
});
layui.form.render();
layui.form.on('submit(LAY-add-number-submit)', function(dataField) {
var param = {
number: dataField.field.number,
level: dataField.field.level,
price: parseInt(dataField.field.price) || 0
};
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
url: setter.baseurl + "adminapi/BeautifulNumber/add-number",
data: JSON.stringify(param),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.closeAll();
layer.msg('添加成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '添加失败');
}
}
});
return false;
});
});
// 批量添加靓号
$('.layui-btn-group').on('click', '[lay-event="batchAddNumbers"]', function () {
var content =
'<form class="layui-form" style="padding: 20px;" lay-filter="layuiadmin-form-batch-add">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">靓号列表</label>' +
'<div class="layui-input-block">' +
'<textarea name="numbers" class="layui-textarea" placeholder="每行一个号码" style="height: 200px;" required></textarea>' +
'<div style="color:#999;font-size:12px;margin-top:5px;">每行输入一个靓号,系统会自动过滤已存在的号码</div>' +
'</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" 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" placeholder="金币数量" value="0">' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<div class="layui-input-block">' +
'<button class="layui-btn" lay-submit lay-filter="LAY-batch-add-submit">批量添加</button>' +
'</div>' +
'</div>' +
'</form>';
layer.open({
type: 1,
title: '批量添加靓号',
area: ['500px', '500px'],
content: content
});
layui.form.render();
layui.form.on('submit(LAY-batch-add-submit)', function(dataField) {
var numbersText = dataField.field.numbers.trim();
if (!numbersText) {
layer.msg('请输入靓号列表');
return false;
}
var numbers = numbersText.split('\n').map(function(n) { return n.trim(); }).filter(function(n) { return n; });
var param = {
numbers: numbers,
level: dataField.field.level,
price: parseInt(dataField.field.price) || 0
};
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
url: setter.baseurl + "adminapi/BeautifulNumber/batch-add-numbers",
data: JSON.stringify(param),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.closeAll();
layer.msg(res.data ? res.data.message : '添加成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '添加失败');
}
}
});
return false;
});
});
// 监听初始化规则
$('.layui-btn-group').on('click', '[lay-event="initRules"]', function () {
layer.confirm("确定初始化靓号规则吗?", function (idx) {
admin.req({
method: "post",
url: setter.baseurl + "adminapi/BeautifulNumber/init-rules",
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('初始化成功');
} else {
layer.msg(res.info || '初始化失败');
}
layer.close(idx);
}
})
})
});
// 监听根据规则生成靓号
$('.layui-btn-group').on('click', '[lay-event="initNumbers"]', function () {
layer.confirm("确定根据规则生成靓号吗?已售出的靓号不会被删除,未售出的靓号将按规则重新生成。", function (idx) {
admin.req({
method: "post",
url: setter.baseurl + "adminapi/BeautifulNumber/init-numbers",
done: function (res) {
layer.close(idx);
if (res.code === 0 || res.code === 200) {
layer.msg(res.info || '初始化成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '初始化失败');
}
}
})
})
});
table.render({
elem: "#LAY-beautifulnumber-back-manage",
url: setter.baseurl + "adminapi/BeautifulNumber/list",
method: "get",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
page: true,
where: {},
request: {
pageName: 'page',
limitName: 'size'
},
limit: 10,
cols: [[
{ type: 'checkbox', fixed: 'left' },
{ field: "number", title: "靓号", width: 150 },
{ field: "ruleName", title: "规则", width: 120 },
{
field: "level", title: "等级", width: 80,
templet: function (d) {
var colors = { 'S': '#ff4d4f', 'A': '#faad14', 'B': '#722ed1', 'C': '#1890ff', 'D': '#8c8c8c' };
return '<span style="color:' + (colors[d.level] || '#8c8c8c') + ';font-weight:bold;">' + d.level + '</span>';
}
},
{ field: "price", title: "价格", width: 120, templet: function (d) { return formatNumber(d.price); } },
{
field: "status", title: "状态", width: 100,
templet: function (d) {
var statusMap = { 0: '<span class="layui-badge">未售</span>', 1: '<span class="layui-badge layui-bg-green">已售</span>', 2: '<span class="layui-badge layui-bg-orange">冻结</span>', 3: '<span class="layui-badge layui-bg-gray">普通号</span>' };
return statusMap[d.status] || '-';
}
},
{
field: "saleTime", title: "售出时间", width: 160,
templet: function (d) {
return d.saleTime ? formatTimestamp(d.saleTime) : '-';
}
},
{ field: "userId", title: "购买者ID", width: 150 },
{ width: 450, title: "操作", align: "center", fixed: "right", toolbar: "#table-beautifulnumber-admin" }
]],
text: "对不起,加载出现异常!",
response: {
statusName: 'code',
statusCode: 0,
msgName: 'info',
countName: 'count',
dataName: 'data'
}
});
table.on("tool(LAY-beautifulnumber-back-manage)", function (e) {
var l = e.data;
if ("del" === e.event) {
layer.confirm("确定删除此靓号么?", function (i) {
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
url: setter.baseurl + "adminapi/BeautifulNumber/delete",
data: JSON.stringify({ id: l.id }),
done: function (res) {
if (res.code === 0 || res.code === 200) {
e.del(), layer.close(i);
layer.msg('删除成功');
} else {
layer.msg(res.info || '删除失败');
}
}
})
})
}
if ("editPrice" === e.event) {
i.popup({
title: "修改价格",
area: ["400px", "200px"],
id: "LAY-popup-edit-price",
success: function (div, idx) {
$(div).html(
'<form class="layui-form" style="padding: 20px;" lay-filter="layadmin-form-edit-price">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">靓号</label>' +
'<div class="layui-input-block">' +
'<input type="text" class="layui-input" value="' + (l.number || '') + '" disabled>' +
'</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="' + (l.price || 0) + '" required>' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<div class="layui-input-block">' +
'<button class="layui-btn" lay-submit lay-filter="LAY-edit-price-submit">修改</button>' +
'</div>' +
'</div>' +
'</form>'
);
form.render(null, "layadmin-form-edit-price");
form.on("submit(LAY-edit-price-submit)", function (data) {
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
url: setter.baseurl + "adminapi/BeautifulNumber/update-price",
data: JSON.stringify({ id: l.id, price: parseInt(data.field.price) }),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.close(idx);
layer.msg('修改成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '修改失败');
}
}
})
return false;
});
}
})
}
if ("freeze" === e.event) {
layer.confirm("确定冻结此靓号么?", function (i) {
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
url: setter.baseurl + "adminapi/BeautifulNumber/freeze",
data: JSON.stringify({ id: l.id }),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('冻结成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '冻结失败');
}
layer.close(i);
}
})
})
}
if ("unfreeze" === e.event) {
layer.confirm("确定解冻此靓号么?", function (i) {
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
url: setter.baseurl + "adminapi/BeautifulNumber/unfreeze",
data: JSON.stringify({ id: l.id }),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('解冻成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '解冻失败');
}
layer.close(i);
}
})
})
}
if ("setNormal" === e.event) {
layer.confirm("确定将此靓号设为普通号么?", function (i) {
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
url: setter.baseurl + "adminapi/BeautifulNumber/set-normal",
data: JSON.stringify({ id: l.id }),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('设置成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '设置失败');
}
layer.close(i);
}
})
})
}
if ("give" === e.event) {
i.popup({
title: "赠送靓号给用户",
area: ["600px", "380px"],
id: "LAY-popup-give-number",
success: function (div, idx) {
$(div).html(
'<div style="padding:20px;">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label" style="width:70px;">靓号</label>' +
'<div class="layui-input-block" style="left:90px;">' +
'<span class="layui-badge layui-bg-blue" style="padding:6px 15px;font-size:14px;">' + (l.number || '') + '</span>' +
'</div>' +
'</div>' +
'<div class="layui-form-item" style="margin-bottom:5px;">' +
'<label class="layui-form-label" style="width:70px;">选择用户</label>' +
'<div class="layui-input-block" style="left:90px;position:relative;">' +
'<input type="text" id="user-search-input" class="layui-input" style="padding-right:35px;" placeholder="输入用户名、昵称、用户编号或手机号搜索">' +
'<i class="layui-icon layui-icon-loading layui-anim layui-anim-loop" id="search-loading" style="position:absolute;right:10px;top:10px;display:none;"></i>' +
'</div>' +
'</div>' +
'<div id="user-dropdown" class="user-dropdown-list" style="display:none;position:absolute;left:90px;width:calc(100% - 90px);max-height:250px;overflow-y:auto;background:#fff;border:1px solid #e6e6e6;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.1);z-index:99999;"></div>' +
'<div style="margin-top:10px;color:#999;font-size:12px;margin-left:70px;">提示:可按用户名、昵称、用户编号、手机号进行模糊搜索</div>' +
'<div id="selected-user-info" style="margin-top:15px;padding:15px;background:#e8f4ff;border-radius:6px;border:1px solid #b8d6f0;display:none;margin-left:70px;">' +
'<div style="display:flex;align-items:center;justify-content:space-between;">' +
'<div>' +
'<span style="color:#666;">已选择用户:</span>' +
'<span id="selected-user-text" style="color:#1e88e5;font-weight:bold;font-size:15px;"></span>' +
'</div>' +
'<button type="button" class="layui-btn layui-btn-sm layui-btn-danger" id="btn-clear-user"><i class="layui-icon layui-icon-close"></i> 清除</button>' +
'</div>' +
'</div>' +
'<div style="margin-top:20px;text-align:center;">' +
'<button type="button" class="layui-btn layui-btn-primary layui-btn-sm" id="btn-cancel-give" style="margin-right:15px;">取消</button>' +
'<button type="button" class="layui-btn layui-btn-sm" id="btn-confirm-give"><i class="layui-icon layui-icon-ok"></i> 确认赠送</button>' +
'</div>' +
'</div>'
);
var selectedUser = null;
var searchTimer = null;
var $dropdown = $('#user-dropdown');
var $input = $('#user-search-input');
function renderDropdown(users) {
if (!users || users.length === 0) {
$dropdown.html('<div style="padding:15px;color:#999;text-align:center;">未找到匹配的用户</div>').show();
return;
}
var html = '';
users.forEach(function(user) {
var number = user.baseInfo ? user.baseInfo.number : '';
var name = user.baseInfo ? user.baseInfo.userName : '';
var mobile = user.baseInfo ? user.baseInfo.mobile : '';
html += '<div class="user-dropdown-item" data-id="' + user.id + '" data-number="' + number + '" data-name="' + name + '" data-mobile="' + mobile + '" style="padding:12px 15px;cursor:pointer;border-bottom:1px solid #f0f0f0;">' +
'<div style="display:flex;justify-content:space-between;align-items:center;">' +
'<div><span style="font-weight:bold;color:#333;font-size:14px;">' + name + '</span> <span style="color:#666;font-size:12px;">[' + number + ']</span></div>' +
(mobile ? '<span style="color:#999;font-size:12px;">' + mobile + '</span>' : '<span style="color:#999;font-size:12px;">无手机号</span>') +
'</div></div>';
});
$dropdown.html(html).show();
}
function searchUsers(keyword) {
if (!keyword || keyword.length < 1) {
$dropdown.hide();
return;
}
$('#search-loading').show();
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
url: setter.baseurl + "adminapi/AdminUser/GetUserList",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
data: JSON.stringify({ keyWord: keyword, pageIndex: 1, pageSize: 20 }),
done: function (res) {
$('#search-loading').hide();
if (res.data && res.data.length > 0) {
renderDropdown(res.data);
} else {
renderDropdown([]);
}
},
fail: function() {
$('#search-loading').hide();
renderDropdown([]);
}
});
}
$input.on('input', function() {
var keyword = $(this).val().trim();
clearTimeout(searchTimer);
if (keyword.length < 1) {
$dropdown.hide();
return;
}
searchTimer = setTimeout(function() {
searchUsers(keyword);
}, 300);
});
$input.on('focus', function() {
var keyword = $(this).val().trim();
if (keyword.length >= 1 && $dropdown.find('.user-dropdown-item').length > 0) {
$dropdown.show();
}
});
$(document).off('click', '.user-dropdown-item').on('click', '.user-dropdown-item', function() {
var userId = $(this).data('id');
var userNumber = $(this).data('number');
var userName = $(this).data('name');
var userMobile = $(this).data('mobile');
selectedUser = { id: userId, number: userNumber, name: userName, mobile: userMobile };
$input.val(name + ' [' + userNumber + ']' + (userMobile ? ' ' + userMobile : ''));
$dropdown.hide();
$('#selected-user-text').text(userName + ' [' + userNumber + ']' + (userMobile ? ' ' + userMobile : ''));
$('#selected-user-info').show();
});
$(document).on('click', function(e) {
if (!$(e.target).closest('#user-search-input, #user-dropdown').length) {
$dropdown.hide();
}
});
$('#btn-clear-user').on('click', function() {
selectedUser = null;
$input.val('').focus();
$('#selected-user-info').hide();
});
$('#btn-cancel-give').on('click', function() {
layer.close(idx);
});
$('#btn-confirm-give').on('click', function() {
if (!selectedUser) {
layer.msg('请先选择用户');
return;
}
admin.req({
method: "post",
contentType: "application/json;charset=UTF-8",
headers: {
'token': layui.data(setter.tableName)[setter.request.tokenName]
},
url: setter.baseurl + "adminapi/BeautifulNumber/give-to-user",
data: JSON.stringify({ number: l.number, userId: selectedUser.id }),
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.close(idx);
layer.msg('赠送成功');
table.reload("LAY-beautifulnumber-back-manage");
} else {
layer.msg(res.info || '赠送失败');
}
}
});
});
}
})
}
});
// 数字格式化
function formatNumber(num) {
if (!num) return '0';
return num.toString().replace(/\B(?=(\d{4})+(?!\d))/g, ",");
}
// 时间戳格式化
function formatTimestamp(timestamp, format = 'yyyy-MM-dd hh:mm:ss') {
if (!timestamp) return '-';
const date = new Date(timestamp * 1000);
const o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
};
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
for (const k in o) {
if (new RegExp('(' + k + ')').test(format)) {
format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
}
}
return format;
}
// e("beautifulnumber", {})
});
</script>
@@ -0,0 +1,520 @@
<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>