# Phase 0:培训菜单与权限实时快照 > 数据来自 `public.sys_menu`、`public.sys_role`、`public.sys_user_role`、`public.sys_role_menu` 的只读统计,不输出用户身份或密码字段。 ## 1. 培训菜单是否真实存在 是。实时 `public.sys_menu` 中有23条培训相关菜单:6个目录、17个页面菜单。所有记录均为 `visible=0`、`status=0`,路径和组件没有重复。 | ID | 菜单 | 类型 | path | component | perms | | ---: | --- | --- | --- | --- | --- | | 2154 | 教学设施 | 目录 | `equip` | — | 空 | | 2155 | 教师信息 | 页面 | `teacher` | `train/teacher` | 空 | | 2156 | 学员信息 | 页面 | `student` | `train/student` | 空 | | 2157 | 教室信息 | 页面 | `classroom` | `train/classroom` | 空 | | 2158 | 实训场地 | 页面 | `site` | `train/site` | 空 | | 2159 | 人员管理 | 目录 | `person` | — | 空 | | 2160 | 设备物联 | 页面 | `extra` | `train/extra` | 空 | | 2161 | 宿舍信息 | 页面 | `dormitory` | `train/dormitory` | 空 | | 2162 | 课程管理 | 目录 | `coursemgr` | — | 空 | | 2163 | 课程信息 | 页面 | `course` | `train/course` | 空 | | 2164 | 开班计划 | 页面 | `plan` | `train/plan` | 空 | | 2165 | 教学成果 | 目录 | `result` | — | 空 | | 2166 | 成绩信息 | 页面 | `score` | `train/score` | 空 | | 2167 | 自主学习 | 目录 | `self` | — | 空 | | 2168 | 电子设备 | 页面 | `equipment` | `train/equipment` | 空 | | 2169 | 统计分析 | 目录 | `analysis` | — | 空 | | 2170 | 开班签到 | 页面 | `report` | `train/report` | 空 | | 2171 | 课程签到 | 页面 | `checkin` | `train/checkin` | 空 | | 2172 | 学习时长 | 页面 | `duration` | `train/duration` | 空 | | 2173 | 学员画像 | 页面 | `portrait` | `train/portrait` | 空 | | 2174 | 电子班牌 | 页面 | `board` | `train/board` | 空 | | 2175 | 课程成绩 | 页面 | `course-score` | `train/course-score` | 空 | | 2176 | 学员成绩 | 页面 | `student-score` | `train/student-score` | 空 | 17个 component 对应的 Vue文件在 `build_ui/src/views/` 中均存在。因此“菜单记录和页面组件存在”成立。 ## 2. 权限字符串真实状态 - `public.sys_menu` 总计106行,其中79行具有权限字符串。 - 23条培训目录/页面中,具有权限字符串的行数为0。 - 培训区没有按钮类型 `F` 菜单记录。 - 实时库未找到 `train:*`、`system:teacher:*`、`system:student:*`、`system:course:*`、`system:plan:*`、`system:info:*`、`system:report:*`、`system:auth:*`、`system:site:*`、`system:board:*`、`system:checkin:*`、`system:duration:*` 或 `system:portrait:*` 培训权限。 因此数据库虽然能生成菜单路由,却不能向普通角色授予 Controller要求的培训操作权限,也不能满足前端按钮权限指令。 ## 3. 与前端 `v-hasPermi` 的比较 多数生成页面使用: ```text train:teacher:* train:student:* train:course:* train:plan:* train:auth:* train:info:* train:site:* train:report:* train:board:* train:checkin:* train:duration:* train:portrait:* ``` 实时 `sys_menu.perms` 没有这些字符串。宿舍与成绩当前页面没有 `v-hasPermi`按钮控制,但这不等于后端允许访问。 结论:普通用户即使获得页面菜单,生成页面的受控按钮也会因权限集合缺失而隐藏。 ## 4. 与 Controller `@PreAuthorize` 的比较 后端使用 `system:*` 前缀: | 资源 | Controller权限 | | --- | --- | | 教师 | `system:teacher:*` | | 学员 | `system:student:*` | | 课程 | `system:course:*` | | 开班计划 | `system:plan:*` | | 宿舍权限 | `system:auth:*` | | 场地 | `system:site:*` | | 报到 | `system:report:*` | | 班牌 | `system:board:*` | | 签到 | `system:checkin:*` | | 学习时长 | `system:duration:*` | | 画像 | `system:portrait:*` | | 宿舍、教室、成绩 | 共用 `system:info:*` | 实时 `sys_menu` 同样没有这些权限。宿舍、教室、成绩共用 `system:info:*` 还会造成资源授权过宽;它们无法独立控制。 结论:前端、后端、数据库三方权限字符串没有任何一组形成一致闭环。 ## 5. 角色与关系表真实状态 | 项目 | 实际情况 | | --- | --- | | `public.sys_user` | 1个有效应用用户;不输出身份明细 | | `public.sys_role` | 0行 | | 培训角色 | 0个 | | `public.sys_user_role` | 20行;18个用户引用孤儿,20个角色引用全部孤儿 | | `public.sys_role_menu` | 170行;170个角色引用全部孤儿,9个菜单引用孤儿 | | `public.sys_role_dept` | 0行 | 应用用户ID 1存在且有效,若依代码通常对管理员提供通配权限;但当前数据库层还存在下述同名表解析问题,不能据此确认管理员登录路径正常。 ## 6. Kingbase同名系统视图对权限体系的影响 Kingbase的 `sys_catalog` 提供同名 `sys_user`、`sys_role`、`sys_config` 视图,而实际若依表在 `public`。当前schema搜索顺序把 `sys_catalog` 放在 `public` 前。 使用与 Mapper相同的未限定表名进行只读探测时: - `sys_user.user_id` 报字段不存在。 - `sys_role.role_id` 报字段不存在。 - `sys_config.config_id` 报字段不存在。 现有 `SysUserMapper.xml`、`SysRoleMapper.xml`、`SysConfigMapper.xml` 都使用未限定表名。这会影响用户加载、角色加载和系统配置查询,是普通角色权限之外的基础运行阻塞项。 ## 7. PRD V1.0菜单对象缺口 实时菜单仍围绕旧14个CRUD和遗留占位页组织,未发现以下PRD V1.0正式业务页面: - 本期课程/开班课程 - 参训学员关系 - 课次/课程表 - 床位与住宿安排 - 独立门禁授权流程 - 成绩项目与权重 - 培训班工作台 “开班签到”被放在“统计分析”目录下,也不符合PRD V1.0按培训班流程组织页面的建议。以上只记录现状,不在本轮修改菜单。 ## 8. 最终判断 1. 培训菜单记录真实存在,component文件也存在。 2. 当前无法确认用户能正常登录并看到菜单,因为核心若依表存在schema解析冲突。 3. 普通角色权限当前不能正常工作:应用角色为0、关系表有孤儿、培训perms为空、前后端权限字符串不同。 4. 没有发现重复培训path/component;主要问题是权限缺失和 `system:info:*` 过宽。