修改河南项目的管理后台ui
This commit is contained in:
@@ -160,6 +160,133 @@ SELECT COUNT(*) FROM sys_role_menu WHERE menu_id=3208;
|
||||
2. 水位从 0 起步。`enabled=true` 时前几件货会落在收紧档(水位低 → 随机数高),属预期行为;
|
||||
需要立刻放水用后台「奖池水位 → 注水」。
|
||||
|
||||
## 管理后台按钮级权限补全:`sys_menu` 补 24 行 `F`(按钮)记录
|
||||
|
||||
**背景**:后台按钮的显隐走前端 `v-hasPermi`(`ruoyi-ui/src/directive/permission/hasPermi.js`),
|
||||
接口放行走后端 `@PreAuthorize("@ss.hasPermi('...')")`,**两边比对的是同一个 `sys_menu.perms`**
|
||||
(超管 `user_id=1` 拿 `*:*:*`,其他人拿「已授权菜单行的 `perms` 去重集合」,见
|
||||
`ruoyi-framework/.../SysPermissionService.java:55`)。
|
||||
|
||||
历史遗留:**从 `menu_id` 31xx 段开始,新增页面只建了 `C` 行、没建 `F` 行**
|
||||
(`F` 行分布:1000 段 61 行、2000 段 18 行、3100 段仅 9 行、3200+ 段 0 行)。
|
||||
后果是这些页面的按钮在角色授权树里**根本勾不到** ⇒ 除超管外谁都看不见;
|
||||
更严重的是部分 **列表/查询接口也会 403**,页面进去是空的。
|
||||
|
||||
盘点结果:代码在用、但 `sys_menu` 未登记的权限串共 **43 个**。其中 **23 个属于 4 个无菜单入口的孤儿页面**
|
||||
(`ttOrnaments/boxOpenChance`、`ttBonus/firstRecharge`、`ttWelfare/monthlyRecharges`、`ttReplacementRecord/index`
|
||||
—— 已核实无菜单、无组件引用、无路由、无接口复用方,**不可达,本期不动**);
|
||||
**其余 20 个 + 复用组补 4 行 = 24 行**,本次补齐。
|
||||
|
||||
> 为什么 `menu_id` 用 `3209~3232`:`MAX(menu_id)=3208`(麻将胡了 3200~3207、幸运升级 3208),按顺序往后取。
|
||||
|
||||
**本次数据库变更 3 处**(2026-09-27 已在库 `henan` 执行):
|
||||
|
||||
| 对象 | 变更 | 说明 |
|
||||
|---|---|---|
|
||||
| `sys_menu` | 新增 **24 行** | `menu_id=3209~3232`,`menu_type='F'`,挂到 6 个 C 行下(2035/2038/2086/2092/2123/3118)|
|
||||
| `sys_menu` | 修正 **3 行** | `menu_id=3160~3162` 的 `parent_id`:`3156`(目录 `M`「流水抽奖」)→ `3157`(页面 `C`「抽奖活动」)。**同属 F 行挂载错误**,不改的话勾「抽奖活动」联动带不到这 3 个按钮 |
|
||||
| `sys_role_menu` | 新增 **24 行** | 把上述 F 行补授权给「**已授权其父 C 行**」的角色(动态 SQL,执行时按实际授权现状生成)。执行时这些父 C 行**仅 `role_id=104`(测试人员)**已授权 ⇒ 24 行全落给 104(`sys_role_menu` 总行数 222 → 246)|
|
||||
|
||||
> 关于 `3160~3162`:这三个串(`system:turnoverLottery:add/edit/remove`)**当前代码里无人使用**
|
||||
> (`turnoverLottery/list.vue` 的新增/修改/删除按钮没写 `v-hasPermi`,后端也没有对应 `@PreAuthorize`),
|
||||
> 所以本次修正只是把菜单树层级摆正、消除「F 行挂在目录下」的隐患,不影响线上行为。
|
||||
> 若将来给该页面补按钮权限,直接复用这三个串即可。
|
||||
|
||||
**变更 SQL**:
|
||||
|
||||
```sql
|
||||
/* ---- 1. 24 行按钮权限(F)---- */
|
||||
INSERT INTO `sys_menu`
|
||||
(`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`,
|
||||
`menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||
VALUES
|
||||
/* 奖池详情(ttRoll/prizedetail)—— 该页「删除」按钮历史上绑的就是 admin:prize:edit */
|
||||
(3209, '修改奖池', 2038, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:prize:edit', '#', 'admin', NOW(), '', NULL, '奖池详情·修改'),
|
||||
/* CDK管理(ttRedPack/index)—— 整套新增,此前 0 行 F */
|
||||
(3210, '新增红包', 2086, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'skinsback:ttRedPack:add', '#', 'admin', NOW(), '', NULL, 'CDK管理·新增'),
|
||||
(3211, '删除红包', 2086, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'skinsback:ttRedPack:remove', '#', 'admin', NOW(), '', NULL, 'CDK管理·删除'),
|
||||
(3212, '修改红包', 2086, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'skinsback:ttRedPack:edit', '#', 'admin', NOW(), '', NULL, 'CDK管理·修改'),
|
||||
(3213, '导出红包', 2086, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'skinsback:ttRedPack:export', '#', 'admin', NOW(), '', NULL, 'CDK管理·导出'),
|
||||
(3214, '红包查询', 2086, 5, '', NULL, NULL, 1, 0, 'F', '0', '0', 'skinsback:ttRedPack:query', '#', 'admin', NOW(), '', NULL, 'CDK管理·详情'),
|
||||
(3215, '红包列表', 2086, 6, '', NULL, NULL, 1, 0, 'F', '0', '0', 'skinsback:ttRedPack:list', '#', 'admin', NOW(), '', NULL, 'CDK管理·列表接口'),
|
||||
(3216, '红包全部列表', 2086, 7, '', NULL, NULL, 1, 0, 'F', '0', '0', 'skinsback:ttRedPack:listAll', '#', 'admin', NOW(), '', NULL, 'CDK管理·不分页列表接口'),
|
||||
/* 对战排行榜奖励(ttFight/fightRankingReward)—— 此前 0 行 F */
|
||||
(3217, '新增奖励', 2092, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:reward:add', '#', 'admin', NOW(), '', NULL, '对战排行榜奖励·生成'),
|
||||
(3218, '删除奖励', 2092, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:reward:remove', '#', 'admin', NOW(), '', NULL, '对战排行榜奖励·清空'),
|
||||
(3219, '修改奖励', 2092, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:reward:edit', '#', 'admin', NOW(), '', NULL, '对战排行榜奖励·修改'),
|
||||
(3220, '奖励查询', 2092, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:reward:query', '#', 'admin', NOW(), '', NULL, '对战排行榜奖励·详情'),
|
||||
(3221, '奖励列表', 2092, 5, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:reward:list', '#', 'admin', NOW(), '', NULL, '对战排行榜奖励·列表接口'),
|
||||
/* 机器人对战配置(ttFight/robotFightConfig)—— 该 C 行下原有 4 行(3119~3122),价格配置这套是漏的,故 order 从 5 起 */
|
||||
(3222, '新增价格配置', 3118, 5, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:robotFightPriceConfig:add', '#', 'admin', NOW(), '', NULL, '机器人对战配置·价格配置新增'),
|
||||
(3223, '删除价格配置', 3118, 6, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:robotFightPriceConfig:remove', '#', 'admin', NOW(), '', NULL, '机器人对战配置·价格配置删除'),
|
||||
(3224, '修改价格配置', 3118, 7, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:robotFightPriceConfig:edit', '#', 'admin', NOW(), '', NULL, '机器人对战配置·价格配置修改'),
|
||||
(3225, '价格配置查询', 3118, 8, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:robotFightPriceConfig:query', '#', 'admin', NOW(), '', NULL, '机器人对战配置·价格配置详情'),
|
||||
(3226, '价格配置列表', 3118, 9, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:robotFightPriceConfig:list', '#', 'admin', NOW(), '', NULL, '机器人对战配置·价格配置列表接口'),
|
||||
/* 货币列表(ttRechargeList/index)—— 该页只有详情接口校验;列表接口本身无 @PreAuthorize */
|
||||
(3227, '货币查询', 2035, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:rechargeList:query', '#', 'admin', NOW(), '', NULL, '货币列表·详情'),
|
||||
/* 机器人对战分组宝箱(ttFight/robotFightGroupBox)
|
||||
⚠️ 复用组:该页前端按钮用 admin:box:{add,edit,remove}、后端接口用 admin:box:{list,query},
|
||||
而这 4 个串原先只挂在 2019「宝箱列表」下 —— 父子联动带不过来,
|
||||
所以必须在 2123 下再挂一遍,才能做到「勾这一个页面 = 该页完整可用」。*/
|
||||
(3228, '新增分组宝箱', 2123, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:box:add', '#', 'admin', NOW(), '', NULL, '机器人对战分组宝箱·新增(与 2020 同 perms,刻意重复)'),
|
||||
(3229, '删除分组宝箱', 2123, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:box:remove', '#', 'admin', NOW(), '', NULL, '机器人对战分组宝箱·删除(与 2021 同 perms,刻意重复)'),
|
||||
(3230, '修改分组宝箱', 2123, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:box:edit', '#', 'admin', NOW(), '', NULL, '机器人对战分组宝箱·修改(与 2022 同 perms,刻意重复)'),
|
||||
(3231, '分组宝箱查询', 2123, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:box:query', '#', 'admin', NOW(), '', NULL, '机器人对战分组宝箱·详情接口'),
|
||||
(3232, '分组宝箱列表', 2123, 5, '', NULL, NULL, 1, 0, 'F', '0', '0', 'admin:box:list', '#', 'admin', NOW(), '', NULL, '机器人对战分组宝箱·列表接口(与 2019/3139 同 perms,刻意重复)');
|
||||
|
||||
/* ---- 2. 授权补齐:把新 F 行补给「已授权其父 C 行」的角色 ----
|
||||
动态写法的好处:不依赖执行时刻的角色授权现状,也不用在角色界面逐个重存。
|
||||
注意:只补 F 行;C 行(页面本身)是否可见仍由业务在「角色管理」里决定。*/
|
||||
INSERT INTO `sys_role_menu` (`role_id`, `menu_id`)
|
||||
SELECT DISTINCT `rm`.`role_id`, `f`.`menu_id`
|
||||
FROM `sys_menu` `f`
|
||||
JOIN `sys_role_menu` `rm` ON `rm`.`menu_id` = `f`.`parent_id`
|
||||
WHERE `f`.`menu_id` BETWEEN 3209 AND 3232
|
||||
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` `x`
|
||||
WHERE `x`.`role_id` = `rm`.`role_id` AND `x`.`menu_id` = `f`.`menu_id`);
|
||||
|
||||
/* ---- 3. 修正 3 行挂错父节点的 F(3160~3162:目录 3156 → 页面 3157)---- */
|
||||
UPDATE `sys_menu`
|
||||
SET `parent_id` = 3157
|
||||
WHERE `menu_id` BETWEEN 3160 AND 3162
|
||||
AND `menu_type` = 'F'
|
||||
AND `parent_id` = 3156;
|
||||
```
|
||||
|
||||
**验证**:
|
||||
|
||||
```sql
|
||||
-- ① 24 行 F 都进去了、且 perms 无重复录入
|
||||
SELECT COUNT(*) FROM sys_menu WHERE menu_id BETWEEN 3209 AND 3232 AND menu_type='F'; -- 期望 24
|
||||
SELECT perms, COUNT(*) FROM sys_menu WHERE menu_id BETWEEN 3209 AND 3232
|
||||
GROUP BY perms HAVING COUNT(*) > 1; -- 期望 0 行(2123 组与 2019 组不同 id,不算重复)
|
||||
|
||||
-- ② 全库 F 行的 parent 必须是指向 C 行的 menu_id(防挂错;本次修掉了 3160~3162 这组)
|
||||
SELECT f.menu_id, f.menu_name, f.perms, f.parent_id, p.menu_type
|
||||
FROM sys_menu f LEFT JOIN sys_menu p ON p.menu_id = f.parent_id
|
||||
WHERE f.menu_type = 'F' AND (p.menu_id IS NULL OR p.menu_type <> 'C'); -- 期望 0 行
|
||||
|
||||
-- ③ 授权补齐后:每个新 F 行,其父 C 行的每个授权角色都应能查到
|
||||
SELECT f.menu_id, f.perms, rm.role_id
|
||||
FROM sys_menu f
|
||||
JOIN sys_role_menu rm ON rm.menu_id = f.parent_id
|
||||
WHERE f.menu_id BETWEEN 3209 AND 3232
|
||||
AND NOT EXISTS (SELECT 1 FROM sys_role_menu x
|
||||
WHERE x.role_id = rm.role_id AND x.menu_id = f.menu_id); -- 期望 0 行
|
||||
|
||||
-- ④ 端到端:模拟某角色的 perms 集合,确认缺串已消失
|
||||
SELECT DISTINCT m.perms FROM sys_menu m
|
||||
JOIN sys_role_menu rm ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = <角色ID> AND m.perms IS NOT NULL AND m.perms <> '';
|
||||
```
|
||||
|
||||
**代码侧配套(非 SQL)**:新增 `.workbuddy/verify-perms.cjs`,做「代码在用的权限串 ↔ `sys_menu.perms`」双向差集,
|
||||
防止后续新增页面再次只建 C 行、漏建 F 行。跑法见脚本头部注释。
|
||||
|
||||
**注意:权限生效需要用户重新登录**(`permissions` 是登录时从 `/getInfo` 拉取的,存在前端 store 里,不会热更新)。
|
||||
|
||||
---
|
||||
|
||||
-----------------------对战接口优化--------------------------
|
||||
|
||||
SHOW INDEX FROM tt_fight;
|
||||
|
||||
Reference in New Issue
Block a user