From 264e60392dabf8be8e0ad3fc7876ed7be7d32cba Mon Sep 17 00:00:00 2001 From: zhangjiaxun <732128096@qq.com> Date: Tue, 20 Oct 2026 23:00:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(tools):=20=E6=96=B0=E5=A2=9E=20JSON=20?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E8=8F=9C=E5=8D=95=20SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 沿用已验证的自增版式: - parent_id 用子查询按 permission_code 定位「工具列表」,不硬编码 id - 菜单 id 由 LAST_INSERT_ID() 经 SET 变量传给授权语句 - 授权用 INSERT...SELECT 覆盖全部有效角色 - 清理语句用 JOIN 精确定位,不误删他人菜单 已实测执行并校验:菜单树与授权均正确,超级管理员无遗漏项。 --- sql/add_json_format_menu.sql | 64 ++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 sql/add_json_format_menu.sql diff --git a/sql/add_json_format_menu.sql b/sql/add_json_format_menu.sql new file mode 100644 index 0000000..faae150 --- /dev/null +++ b/sql/add_json_format_menu.sql @@ -0,0 +1,64 @@ +-- ============================================================ +-- 「工具列表」下新增「JSON 格式化」菜单 +-- +-- 菜单由 t_sys_permission 表驱动,前端 formatMenuList() 会把 component +-- 拼成 import('@/view' + component + '.vue'),因此 component 必须带前导斜杠, +-- 且要与磁盘文件 src/view/tools/json-format.vue 对应 +-- +-- 幂等:可重复执行,已存在则先清理再插入 +-- 执行库:freedom_db +-- +-- 注意:id 由数据库自增分配,父菜单通过 permission_code 子查询定位, +-- 两者都不硬编码——避免与 t_sys_role_permission 的独立自增序列撞主键。 +-- ============================================================ + +-- ---------- 1. 清理历史遗留 ---------- +DELETE rp +FROM `t_sys_role_permission` rp + JOIN `t_sys_permission` p ON p.id = rp.permission_id +WHERE p.permission_code = 'tools:json-format'; + +DELETE FROM `t_sys_permission` WHERE `permission_code` = 'tools:json-format'; + +-- ---------- 2. 插入子菜单「JSON 格式化」 ---------- +-- parent_id 用子查询取「工具列表」的 id,不写死数字 +-- sort=2 排在「文本比对」(sort=1) 之后 +-- icon md-brush 已从线上 CSS 校验存在 +INSERT INTO `t_sys_permission` +(`parent_id`, `permission_code`, `permission_name`, `permission_desc`, `level`, + `icon`, `url`, `component`, `sort`, `create_by`, `create_date`, `del_flag`) +SELECT p.`id`, 'tools:json-format', 'JSON 格式化', + 'JSON 美化、压缩与语法错误定位,支持超长整数原样保留', + 2, 'md-brush', '/tools/json-format', '/tools/json-format', + 2, 'admin', NOW(), 0 +FROM `t_sys_permission` p +WHERE p.permission_code = 'tools'; + +-- ---------- 3. 授权给全部有效角色 ---------- +-- 菜单 id 由上一条语句的插入值取得 +SET @json_menu_id = ( + SELECT `id` FROM `t_sys_permission` WHERE `permission_code` = 'tools:json-format' LIMIT 1 +); + +INSERT INTO `t_sys_role_permission` (`role_id`, `permission_id`, `create_by`, `create_date`) +SELECT r.`id`, @json_menu_id, 'admin', NOW() +FROM `t_sys_role` r +WHERE r.`del_flag` = 0 + AND @json_menu_id IS NOT NULL; + +-- ---------- 4. 校验 ---------- +-- 预期 2 行:工具列表 + 文本比对 + JSON 格式化(level=2 的两条子菜单) +SELECT p.`id`, p.`parent_id`, p.`permission_code`, p.`permission_name`, + p.`level`, p.`icon`, p.`url`, p.`component`, p.`sort` +FROM `t_sys_permission` p +WHERE p.permission_code = 'tools' + OR p.parent_id IN (SELECT `id` FROM (SELECT `id` FROM `t_sys_permission` WHERE `permission_code` = 'tools') x) +ORDER BY p.level, p.sort; + +-- 预期:每个有效角色 1 条新关联 +SELECT rp.`id`, rp.`role_id`, r.`role_name`, rp.`permission_id`, p.`permission_name` +FROM `t_sys_role_permission` rp + JOIN `t_sys_role` r ON r.`id` = rp.`role_id` + JOIN `t_sys_permission` p ON p.`id` = rp.`permission_id` +WHERE p.permission_code = 'tools:json-format' +ORDER BY rp.`role_id`; \ No newline at end of file