-- ---------------------------- -- 平台后台菜单重建(按业务菜单原型) -- -- 目标库为业务库 hugray(与 sys_menu 同库)。 -- 本脚本执行"完全替换":删除 ruoyi 原生导航菜单,只保留原型中的 6 组。 -- -- 号段取 2200~2250(页面用 2200~2224,按钮用 2225 起):现有最大 menu_id 为 2106(account 号段), -- 此段与之不冲突。**新增菜单/按钮一律用本区间内的空号**——区间外的号会被第 1 节的 NOT IN 清理掉, -- 而第 2 节只重建 2200~2250、第 4 节也只给这段授权,落到区间外等于重跑即丢。 -- 区间上界是「被重建成什么」的唯一开关:加号必须同步改第 2/4 节的两条 BETWEEN(见下)。 -- -- 【为什么保留 15 条按钮权限】 -- 下列三个页面复用既有组件,其内部按钮依赖原权限标识(v-hasPermi), -- 若一并删除,非 admin 角色进页面后按钮会全部消失: -- 员工管理 -> system/user/index 依赖 system:user:* -- 角色管理 -> system/role/index 依赖 system:role:* -- 操作记录 -> monitor/operlog/index 依赖 system:operlog:* -- 脚本保留 menu_id 1000~1011、1039~1041 这 15 条 F 记录, -- 并把父菜单改挂到对应的新菜单下。 -- -- 【菜单与按钮一律留在 2200~2250 内】 -- 用户列表(2201)的 5 条按钮建在 2230~2234、主体认证审核(2202)的 2 条建在 2240~2241、 -- 注销申请审核(2203)的 2 条建在 2242~2243、城市公司档案(2204)的 3 条建在 2235~2237、 -- 城市管理(2224)的 4 条建在 2225~2228、服务商列表(2244)的 3 条建在 2245~2247、 -- 协议配置(2219)的 2 条建在 2248~2249、平台设置(2220)的 1 条建在 2250。 -- -- 注意 2200~2250 里剩下的空号(2229、2238、2239)是**故意留的**:2229 是城市管理与用户列表之间 -- 的间隔,2238~2239 留给用户列表后续可能补的按钮(见第 3 节的注释)。新模块请**往后追加**, -- 不要去填空号——填空号会让「同一父菜单的按钮连号」这个读法失效,也让上面的登记表失去意义。 -- -- 号段一改,只有**两处 BETWEEN 是承重的**:第 2 节的两条 DELETE 与第 4 节的授权 INSERT。 -- 漏改第 2 节会撞主键:第 1 节不删号段内的行,第 3 节的 INSERT 就会 Duplicate entry。 -- 漏改第 4 节则只是新菜单不给普通角色授权(admin 走 selectMenuTreeAll,不受影响), -- 表现为非 admin 账号看不到新菜单/按钮,重跑补上即可。 -- -- 第 1 节那两个 NOT IN 白名单**不要加新号**:它们只负责保住 15 条原生按钮, -- 2200~2250 的行本来就由第 2 节删、第 3 节建。把新号加进白名单是把「重建」变成「保留」, -- 万一第 2 节上界没跟着改就直接撞主键冲突——不加更宽容。 -- -- 【super admin 无需授权】 -- SysMenuServiceImpl 对 admin 走 selectMenuTreeAll() 全量返回,与 sys_role_menu 无关。 -- 脚本末尾为普通角色(role_id = 2)补了新菜单授权,保持其"能看到菜单"的原有行为, -- 不需要可整段删掉。 -- -- 可重复执行。 -- ---------------------------- USE `hugray`; -- ---------- 1. 删除原生导航菜单,保留 15 条按钮权限 ---------- DELETE FROM `sys_role_menu` WHERE `menu_id` NOT IN (1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1039, 1040, 1041, 2230, 2231, 2232, 2233, 2234, 2240, 2241, 2242, 2243); DELETE FROM `sys_menu` WHERE `menu_id` NOT IN (1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1039, 1040, 1041, 2230, 2231, 2232, 2233, 2234, 2240, 2241, 2242, 2243); -- 保留的按钮权限改挂到新菜单下(幂等) UPDATE `sys_menu` SET `parent_id` = 2222 WHERE `menu_id` BETWEEN 1000 AND 1006; -- 用户* -> 员工管理 UPDATE `sys_menu` SET `parent_id` = 2221 WHERE `menu_id` BETWEEN 1007 AND 1011; -- 角色* -> 角色管理 UPDATE `sys_menu` SET `parent_id` = 2223 WHERE `menu_id` IN (1039, 1040, 1041); -- 操作* -> 操作记录 -- ---------- 2. 重建本号段(保证可重复执行) ---------- DELETE FROM `sys_role_menu` WHERE `menu_id` BETWEEN 2200 AND 2250; DELETE FROM `sys_menu` WHERE `menu_id` BETWEEN 2200 AND 2250; -- ---------- 3. 插入导航菜单 ---------- -- 首页不在本表中:前端 index 为常量路由(constantRoutes),无需落库。 INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES -- ========== 用户与组织 ========== (2200, '用户与组织', 0, 1, 'member', NULL, NULL, '', 1, 0, 'M', '0', '0', '', 'user', 'admin', sysdate(), '', NULL, ''), (2201, '用户列表', 2200, 1, 'user', 'member/user/index', NULL, '', 1, 0, 'C', '0', '0', 'member:user:list', '#', 'admin', sysdate(), '', NULL, ''), (2202, '主体认证审核', 2200, 2, 'certification', 'member/certification/index', NULL, '', 1, 0, 'C', '0', '0', 'member:certification:list', '#', 'admin', sysdate(), '', NULL, ''), (2203, '注销申请审核', 2200, 3, 'cancel', 'member/cancel/index', NULL, '', 1, 0, 'C', '0', '0', 'member:cancel:list', '#', 'admin', sysdate(), '', NULL, ''), (2204, '城市公司档案', 2200, 4, 'company', 'member/company/index', NULL, '', 1, 0, 'C', '0', '0', 'member:company:list', '#', 'admin', sysdate(), '', NULL, ''), -- 城市管理挂 2200 下而不是 2204 下:RuoYi 的 buildMenus 只对 M(目录)展开 children, -- C 类型带子菜单不会出现在侧边栏,挂在 2204 下等于建了也点不进去。 -- 入口另有城市公司档案列表页的「城市管理」按钮(跳 /member/city)。 (2224, '城市管理', 2200, 5, 'city', 'member/city/index', NULL, '', 1, 0, 'C', '0', '0', 'member:city:list', '#', 'admin', sysdate(), '', NULL, ''), (2244, '服务商列表', 2200, 6, 'provider', 'member/provider/index', NULL, '', 1, 0, 'C', '0', '0', 'member:provider:list', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 商品与内容 ========== (2205, '商品与内容', 0, 2, 'product', NULL, NULL, '', 1, 0, 'M', '0', '0', '', 'shopping', 'admin', sysdate(), '', NULL, ''), (2206, '商品与套餐', 2205, 1, 'package', 'product/package/index', NULL, '', 1, 0, 'C', '0', '0', 'product:package:list', '#', 'admin', sysdate(), '', NULL, ''), (2207, '首页内容', 2205, 2, 'content', 'product/content/index', NULL, '', 1, 0, 'C', '0', '0', 'product:content:list', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 交易履约 ========== (2208, '交易履约', 0, 3, 'trade', NULL, NULL, '', 1, 0, 'M', '0', '0', '', 'form', 'admin', sysdate(), '', NULL, ''), (2209, '订单列表', 2208, 1, 'order', 'trade/order/index', NULL, '', 1, 0, 'C', '0', '0', 'trade:order:list', '#', 'admin', sysdate(), '', NULL, ''), (2210, '发货任务', 2208, 2, 'delivery', 'trade/delivery/index', NULL, '', 1, 0, 'C', '0', '0', 'trade:delivery:list', '#', 'admin', sysdate(), '', NULL, ''), (2211, '售后列表', 2208, 3, 'aftersale', 'trade/aftersale/index', NULL, '', 1, 0, 'C', '0', '0', 'trade:aftersale:list', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 库存与收支 ========== (2212, '库存与收支', 0, 4, 'stock', NULL, NULL, '', 1, 0, 'M', '0', '0', '', 'money', 'admin', sysdate(), '', NULL, ''), (2213, '虚拟库存台账', 2212, 1, 'ledger', 'stock/ledger/index', NULL, '', 1, 0, 'C', '0', '0', 'stock:ledger:list', '#', 'admin', sysdate(), '', NULL, ''), (2214, '收支与模拟结算', 2212, 2, 'settlement', 'stock/settlement/index', NULL, '', 1, 0, 'C', '0', '0', 'stock:settlement:list', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 等级与规则 ========== (2215, '等级与规则', 0, 5, 'grade', NULL, NULL, '', 1, 0, 'M', '0', '0', '', 'star', 'admin', sysdate(), '', NULL, ''), (2216, '等级配置', 2215, 1, 'config', 'grade/config/index', NULL, '', 1, 0, 'C', '0', '0', 'grade:config:list', '#', 'admin', sysdate(), '', NULL, ''), (2217, '升级审核', 2215, 2, 'audit', 'grade/audit/index', NULL, '', 1, 0, 'C', '0', '0', 'grade:audit:list', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 系统管理 ========== -- 后三项复用既有组件,不新写页面 (2218, '系统管理', 0, 6, 'system', NULL, NULL, '', 1, 0, 'M', '0', '0', '', 'system', 'admin', sysdate(), '', NULL, ''), (2219, '协议配置', 2218, 1, 'agreement', 'system/agreement/index', NULL, '', 1, 0, 'C', '0', '0', 'system:agreement:list', '#', 'admin', sysdate(), '', NULL, ''), (2220, '平台设置', 2218, 2, 'platform', 'system/platform/index', NULL, '', 1, 0, 'C', '0', '0', 'system:platform:list', '#', 'admin', sysdate(), '', NULL, ''), (2221, '角色管理', 2218, 3, 'role', 'system/role/index', NULL, '', 1, 0, 'C', '0', '0', 'system:role:list', '#', 'admin', sysdate(), '', NULL, '复用既有页面'), (2222, '员工管理', 2218, 4, 'staff', 'system/user/index', NULL, '', 1, 0, 'C', '0', '0', 'system:user:list', '#', 'admin', sysdate(), '', NULL, '复用既有页面'), (2223, '操作记录', 2218, 5, 'operlog', 'monitor/operlog/index', NULL, '', 1, 0, 'C', '0', '0', 'system:operlog:list', '#', 'admin', sysdate(), '', NULL, '复用既有页面'), -- ========== 用户列表的按钮权限(F) ========== -- 后端 AccountUserController 的 @RequiresPermissions 已统一为 member:user:*, -- 权限集由 sys_menu.perms 经 sys_role_menu 聚合而来,故按钮必须落库, -- 否则非 admin 角色能打开页面却调不通接口(403)。 -- list 权限无需在此建按钮:它已写在 2201 这条 C 类型菜单的 perms 上。 -- F 记录的 path/component 无意义,统一空串(对齐 1000~1011 的既有格式)。 (2230, '会员查询', 2201, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:user:query', '#', 'admin', sysdate(), '', NULL, ''), (2231, '会员新增', 2201, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:user:add', '#', 'admin', sysdate(), '', NULL, ''), (2232, '会员修改', 2201, 3, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:user:edit', '#', 'admin', sysdate(), '', NULL, ''), (2233, '会员删除', 2201, 4, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:user:remove', '#', 'admin', sysdate(), '', NULL, ''), (2234, '会员导出', 2201, 5, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:user:export', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 主体认证审核的按钮权限(F) ========== -- 审核页只有「查看」和「通过/驳回」,没有增删改,故只建 query + audit 两个权限。 -- 号段跳开 2235~2239:给用户列表后续可能补的按钮留空隙,避免重排既有 menu_id -- (2235~2237 在后续的城市公司档案模块被占用,见下)。 (2240, '认证查询', 2202, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:certification:query', '#', 'admin', sysdate(), '', NULL, ''), (2241, '认证审核', 2202, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:certification:audit', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 注销申请审核的按钮权限(F) ========== -- 同认证审核:只有「查看」和「通过/驳回」,故只需 query + audit 两个权限。 -- 号段接在认证审核之后(2242~2243),保持「同父菜单的按钮连号」的读法。 (2242, '注销查询', 2203, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:cancel:query', '#', 'admin', sysdate(), '', NULL, ''), (2243, '注销审核', 2203, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:cancel:audit', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 城市公司档案的按钮权限(F) ========== -- 原型操作列只有「查看」「禁用」,再加列表顶部「新增」,故需要 query/add/edit 三个; -- 「禁用」复用 edit(与会员列表同一取舍:状态切换不单开权限)。 (2235, '档案查询', 2204, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:company:query', '#', 'admin', sysdate(), '', NULL, ''), (2236, '档案新增', 2204, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:company:add', '#', 'admin', sysdate(), '', NULL, ''), (2237, '档案修改', 2204, 3, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:company:edit', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 城市管理的按钮权限(F) ========== -- 城市管理页可增删改,「禁用」复用 edit。options(下拉数据源)不落 perms: -- 它由四个模块共用,走 @RequiresPermissions 的 Logical.OR,不适合钉在某一条按钮上。 (2225, '城市查询', 2224, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:city:query', '#', 'admin', sysdate(), '', NULL, ''), (2226, '城市新增', 2224, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:city:add', '#', 'admin', sysdate(), '', NULL, ''), (2227, '城市修改', 2224, 3, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:city:edit', '#', 'admin', sysdate(), '', NULL, ''), (2228, '城市删除', 2224, 4, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:city:remove', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 服务商列表的按钮权限(F) ========== -- 原型操作列只有「查看」「禁用」,再加列表顶部「新增」,故需要 query/add/edit 三个; -- 「禁用/启用」复用 edit(与会员列表、城市公司档案同一个取舍:状态切换不单开权限)。 -- 详情页是「直接可编辑」,查看与修改共用同一个 perms:member:provider:query 打开页面, -- 提交时才走 edit —— 与城市公司档案的双态页面同一套权限划分。 (2245, '服务商查询', 2244, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:provider:query', '#', 'admin', sysdate(), '', NULL, ''), (2246, '服务商新增', 2244, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:provider:add', '#', 'admin', sysdate(), '', NULL, ''), (2247, '服务商修改', 2244, 3, '', '', NULL, '', 1, 0, 'F', '0', '0', 'member:provider:edit', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 协议配置的按钮权限(F) ========== -- 列表只有「查看」,顶部「新发布」与详情页「发布新版本」是同一个动作(都是插一条新版本), -- 故只需 query + add 两个权限:**没有 edit/remove** —— 版本行一经发布不可改、不可删, -- 列表里的「当前版本/历史版本」是查出来的,不是谁切出来的,所以也不需要额外的状态权限。 -- 菜单名与 2219 保持「协议配置」(与菜单结构原型一致)。 (2248, '协议查询', 2219, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'system:agreement:query', '#', 'admin', sysdate(), '', NULL, ''), (2249, '协议发布', 2219, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'system:agreement:add', '#', 'admin', sysdate(), '', NULL, ''), -- ========== 平台设置的按钮权限(F) ========== -- 只有一条 edit:这一页是「一份设置表单 + 保存」,读那一行就是打开页面本身, -- 而 list 权限已经写在 2220 这条 C 类型菜单的 perms 上,故读接口复用它、不再另建查询按钮。 -- 没有 add/remove:全表只有一行(见 hugray_platform_setting_20261013.sql),保存即覆盖, -- 既不会多出第二行,也不提供删除。 (2250, '平台设置修改', 2220, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'system:platform:edit', '#', 'admin', sysdate(), '', NULL, ''); -- ---------- 4. 普通角色授权(不需要可删) ---------- -- 原库中 role_id = 2 持有一份近乎全量的菜单授权,此处保持等价行为。 INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) SELECT 2, `menu_id` FROM `sys_menu` WHERE `menu_id` BETWEEN 2200 AND 2250; -- ---------- 5. 结果核对 ---------- SELECT `menu_id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `icon`, `order_num` FROM `sys_menu` ORDER BY IF(`parent_id` = 0, `menu_id`, `parent_id`), `order_num`, `menu_id`;