-- ============================================================ -- 工具列表菜单 + 文本比对页面 -- -- 与「系统管理」同级的顶级菜单,下挂「文本比对」 -- 菜单由 t_sys_permission 表驱动,前端 formatMenuList() 会把 component -- 拼成 import('@/view' + component + '.vue'),因此 component 必须带前导斜杠, -- 且要与 src/view/tools/text-diff.vue 对应 -- -- 幂等:可重复执行,已存在则先清理再插入 -- 执行库:freedom_db -- -- 注意:id 一律由数据库自增分配,不要硬编码。 -- t_sys_permission 自增起点为 1000,且t_sys_role_permission 已单独用到 1005, -- 硬编码 1005/1006 会直接撞主键(实测已踩坑,事务回滚后才改用自增)。 -- ============================================================ -- ---------- 1. 清理历史遗留 ---------- -- 用 JOIN 按 permission_code 精确定位,避免误删他人菜单 DELETE rp FROM `t_sys_role_permission` rp JOIN `t_sys_permission` p ON p.id = rp.permission_id WHERE p.permission_code IN ('tools', 'tools:text-diff'); DELETE FROM `t_sys_permission` WHERE `permission_code` IN ('tools', 'tools:text-diff'); -- ---------- 2. 插入顶级菜单「工具列表」 ---------- -- url 与 component 留空,前端会挂载 Main 布局作为容器 -- icon 必须在 view-design 图标清单内(ios-apps 已从线上 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`) VALUES (0, 'tools', '工具列表', '与系统管理同级的工具集合', 1, 'ios-apps', '', '', 20, 'admin', NOW(), 0); SET @tools_id = LAST_INSERT_ID(); -- ---------- 3. 插入子菜单「文本比对」 ---------- -- component 必须带前导斜杠且与磁盘文件对应:src/view/tools/text-diff.vue INSERT INTO `t_sys_permission` (`parent_id`, `permission_code`, `permission_name`, `permission_desc`, `level`, `icon`, `url`, `component`, `sort`, `create_by`, `create_date`, `del_flag`) VALUES (@tools_id, 'tools:text-diff', '文本比对', '左右文本并排比对,支持字符级高亮、忽略空白与结果导出', 2, 'md-git-compare', '/tools/text-diff', '/tools/text-diff', 1, 'admin', NOW(), 0); SET @diff_id = LAST_INSERT_ID(); -- ---------- 4. 授权给全部有效角色 ---------- -- 不写死 role_id,将来新增角色后重跑本脚本即可自动补齐授权 INSERT INTO `t_sys_role_permission` (`role_id`, `permission_id`, `create_by`, `create_date`) SELECT r.`id`, p.`pid`, 'admin', NOW() FROM `t_sys_role` r CROSS JOIN (SELECT @tools_id AS `pid` UNION ALL SELECT @diff_id) p WHERE r.`del_flag` = 0; -- ---------- 5. 校验 ---------- -- 预期 2 行:工具列表(parent_id=0, level=1) 与 文本比对(parent_id=工具列表id, 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` IN ('tools', 'tools:text-diff') ORDER BY p.`level`, p.`sort`; -- 预期:每个有效角色 2 条关联 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` IN ('tools', 'tools:text-diff') ORDER BY rp.`role_id`, rp.`permission_id`;