feat: 公共表更名 common/member 前缀 + 插件命令自动加载 + 版本 1.1.1
- 18 张公共表更名(addon/attachment/configure/links/spider_log/spider_stat/sms/notice/ad/task/prop/medal/help/card -> common_*,member_wallets->member_wallet,score_rule/score_log -> member_*,addon_config->common_addonconf),模型全部对齐新表名,Db 直引用清零 - Attachment 模型补 表名绑定,修复富文本上传查 wxapp_attachment 1146 隐患 - install.sql + 迁移 SQL:backend_admin/backend_role delete_at 默认 0,修复软删除(NULL != 0)误过滤导致后台菜单为空 - AppService::boot() 支持插件 info.php 声明 commands 自动注册插件命令(psr-4 自动加载,坏类名自动跳过) - 各插件(haonav/mqttbroker/wxchat/articles/blog/forum 等)字段与配置同步调整 - 框架版本 1.1.0 -> 1.1.1
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* @Author: YwxApp <ywx@ywxapp.cn>
|
||||
* @Description: 前台主导航菜单管理(后台)
|
||||
* @Description: 前台主导航菜单管理(后台,treeTable 树形表格)
|
||||
*/
|
||||
layui.define(['http', 'auth', 'table', 'treeTable'], function (exports) {
|
||||
var $ = layui.$,
|
||||
table = layui.table,
|
||||
treeTable = layui.treeTable,
|
||||
form = layui.form,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl,
|
||||
@@ -13,38 +13,47 @@ layui.define(['http', 'auth', 'table', 'treeTable'], function (exports) {
|
||||
|
||||
auth.init((layui.data('backend').permission) || []);
|
||||
|
||||
// 两级树拍平成单表,子项缩进展示
|
||||
function flatTree(list, level) {
|
||||
var rows = [];
|
||||
layui.each(list || [], function (i, item) {
|
||||
item._level = level;
|
||||
item._title = (level > 0 ? ' ├ ' : '') + item.title;
|
||||
rows.push(item);
|
||||
if (item.child && item.child.length) {
|
||||
rows = rows.concat(flatTree(item.child, level + 1));
|
||||
}
|
||||
});
|
||||
return rows;
|
||||
}
|
||||
|
||||
var dataTable = table.render({
|
||||
// 树形表格:数据为扁平 pid 列表(isSimpleData),pid=0 为根自动建树
|
||||
treeTable.render({
|
||||
elem: '#dataTable',
|
||||
url: 'index',
|
||||
page: false,
|
||||
parseData: function (res) {
|
||||
return { code: res.code === 0 ? 0 : 1, msg: res.msg || '', count: res.count || 0, data: res.data || [] };
|
||||
},
|
||||
tree: {
|
||||
customName: {
|
||||
children: 'children',
|
||||
isParent: 'is_parent',
|
||||
name: 'title',
|
||||
id: 'id',
|
||||
pid: 'pid',
|
||||
icon: 'icon'
|
||||
},
|
||||
data: { isSimpleData: true, rootPid: 0 },
|
||||
view: {},
|
||||
async: {},
|
||||
callback: {}
|
||||
},
|
||||
height: 'full-100',
|
||||
toolbar: '#tableBar',
|
||||
cols: [[
|
||||
{ field: 'id', title: 'ID', width: 70, align: 'center' },
|
||||
{ field: 'title', title: '菜单名称', minWidth: 180, templet: function (d) { return d._title || d.title; } },
|
||||
{ field: 'parent_id', title: '层级', width: 90, align: 'center', templet: '#parentTpl' },
|
||||
{ type: 'checkbox', fixed: 'left' },
|
||||
{ field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left', align: 'center' },
|
||||
{ field: 'title', title: '菜单名称', minWidth: 200, fixed: 'left' },
|
||||
{
|
||||
field: 'app', title: '所属应用', width: 110, align: 'center', templet: function (d) {
|
||||
if (!d.app) return '<span class="layui-badge layui-bg-green">前台</span>';
|
||||
if (d.app === 'member') return '<span class="layui-badge layui-bg-blue">会员</span>';
|
||||
if (d.app === 'backend') return '<span class="layui-badge layui-bg-orange">后台</span>';
|
||||
return '<span class="layui-badge layui-bg-black">' + d.app + '</span>';
|
||||
}
|
||||
},
|
||||
{ field: 'url', title: '链接', minWidth: 200 },
|
||||
{ field: 'sort', title: '排序', width: 80, align: 'center' },
|
||||
{ field: 'status', title: '状态', width: 110, align: 'center', templet: '#statusTpl' },
|
||||
{ title: '操作', width: 200, align: 'center', toolbar: '#dataBar', fixed: 'right' }
|
||||
{ field: 'sort', title: '排序', width: 80, sort: true, align: 'center' },
|
||||
{ field: 'status', title: '状态', width: 96, align: 'center', templet: '#statusTpl' },
|
||||
{ fixed: 'right', title: '操作', width: 200, align: 'center', toolbar: '#dataBar' }
|
||||
]],
|
||||
response: { statusCode: 0 },
|
||||
parseData: function (res) {
|
||||
return { code: res.code, msg: res.msg, count: res.count || 0, data: flatTree(res.data, 0) };
|
||||
},
|
||||
page: false,
|
||||
done: function () {
|
||||
auth.render();
|
||||
}
|
||||
@@ -55,50 +64,71 @@ layui.define(['http', 'auth', 'table', 'treeTable'], function (exports) {
|
||||
var id = obj.value;
|
||||
var status = obj.elem.checked ? 1 : 0;
|
||||
http.post('status', { id: id, status: status }).then(function (res) {
|
||||
if (res.code !== 0) { layer.msg(res.msg || '操作失败'); dataTable.reload(); }
|
||||
if (res.code !== 0) {
|
||||
layer.msg(res.msg || '操作失败');
|
||||
obj.elem.checked = !obj.elem.checked;
|
||||
form.render('checkbox');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 工具条(新建)
|
||||
table.on('toolbar(dataTable)', function (obj) {
|
||||
if (obj.event === 'dataCreate') { openForm({}); }
|
||||
// 搜索 / 重置
|
||||
form.on('submit(data-search-btn)', function (obj) {
|
||||
treeTable.reload('dataTable', { where: { title: obj.field.title || '' } }, true);
|
||||
return false;
|
||||
});
|
||||
$('#btn-reset').on('click', function () {
|
||||
$('.layui-form[lay-filter="search-form"] input[name="title"]').val('');
|
||||
treeTable.reload('dataTable', { where: {} }, true);
|
||||
});
|
||||
|
||||
// 行操作
|
||||
table.on('tool(dataTable)', function (obj) {
|
||||
var d = obj.data;
|
||||
if (obj.event === 'update') { openForm(d); }
|
||||
else if (obj.event === 'addChild') { openForm({ parent_id: d.id }); }
|
||||
else if (obj.event === 'delete') {
|
||||
layer.confirm('确定删除该菜单吗?', function (idx) {
|
||||
http.delete('delete', { id: d.id }).then(function (res) {
|
||||
if (res.code === 0) { layer.close(idx); dataTable.reload(); }
|
||||
else { layer.msg(res.msg || '操作失败'); }
|
||||
});
|
||||
});
|
||||
// 工具条(新建 / 批量删除)
|
||||
treeTable.on('toolbar(dataTable)', function (obj) {
|
||||
if (obj.event === 'dataCreate') {
|
||||
openForm({});
|
||||
} else if (obj.event === 'dataDelete') {
|
||||
var checkStatus = treeTable.checkStatus('dataTable');
|
||||
delRows((checkStatus.data || []).map(function (item) { return item.id; }));
|
||||
}
|
||||
});
|
||||
|
||||
// 表单弹窗:拉取一级菜单作为父级选项
|
||||
// 行操作
|
||||
treeTable.on('tool(dataTable)', function (obj) {
|
||||
var d = obj.data;
|
||||
if (obj.event === 'update') { openForm(d); }
|
||||
else if (obj.event === 'create') { openForm({ parent_id: d.id }); }
|
||||
else if (obj.event === 'delete') { delRows([d.id]); }
|
||||
});
|
||||
|
||||
// 删除(单条或批量)
|
||||
function delRows(ids) {
|
||||
if (!ids || !ids.length) return layer.msg('请选择要删除的项');
|
||||
layer.confirm('确定删除选中的 ' + ids.length + ' 项吗?', function (idx) {
|
||||
http.delete('delete', { ids: ids.join(',') }).then(function (res) {
|
||||
if (res.code === 0) { layer.close(idx); treeTable.reload('dataTable', {}, true); }
|
||||
else { layer.msg(res.msg || '操作失败'); }
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 表单抽屉:拉取一级菜单作为父级选项
|
||||
function openForm(data) {
|
||||
http.get('index').then(function (res) {
|
||||
var parents = [];
|
||||
layui.each((res.data || []), function (i, p) {
|
||||
if (p.parent_id == 0) parents.push(p);
|
||||
if (p.pid == 0) parents.push(p);
|
||||
});
|
||||
var html = laytpl($('#dataFormTpl').html()).render($.extend({ parents: parents }, data));
|
||||
var html = laytpl($('#dataFormTpl').html()).render($.extend({ parents: parents, plugins: window.navPlugins || [] }, data));
|
||||
layer.open({
|
||||
type: 1, title: data.id ? '编辑菜单' : '新建菜单',
|
||||
area: ['480px', 'auto'], content: html,
|
||||
btn: ['保存', '取消'],
|
||||
type: 1, title: data.id ? '编辑菜单' : (data.parent_id ? '添加子菜单' : '新建菜单'),
|
||||
area: ['520px', '98%'], offset: 'r', anim: 'slideLeft', shade: 0.1, shadeClose: true,
|
||||
btnAlign: 'l', btn: ['保存', '取消'], content: html,
|
||||
success: function () { form.render(); },
|
||||
yes: function (idx, layero) {
|
||||
var field = form.val('wxapp-form-submit') || {};
|
||||
// 用表单序列化兜底
|
||||
var fd = {};
|
||||
$(layero).find('form').serializeArray().map(function (x) { fd[x.name] = x.value; });
|
||||
http.post(data.id ? 'update' : 'save', fd).then(function (r) {
|
||||
if (r.code === 0) { layer.close(idx); dataTable.reload(); }
|
||||
if (r.code === 0) { layer.close(idx); treeTable.reload('dataTable', {}, true); }
|
||||
else { layer.msg(r.msg || '操作失败'); }
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user