记录当前Git开发基线、Kingbase真实表结构、培训数据与权限状态。 补充数据库与代码差异、只读兼容性验证及PRD V1.0核心对象映射,未包含业务代码或数据库修改。
13 KiB
RailwaySystem Phase 0 工程与数据库真实基线总结
业务判断最高依据:
doc/RailwaySystem 智慧培训系统一期 PRD V1.0.md。旧数据库设计、V0.9、详细开发说明、HTML 原型和既有生成模型仅作为现状证据;与 V1.0 冲突时,以 V1.0 为准。
1. 当前可以作为正式开发基线的是哪个代码状态?
当前可识别的提交基线是:
- branch:
main; - HEAD:
e12eda059679b89eb5d09215ffe1ce7132f161f2; - 最新提交:
docs(prd): 发布RailwaySystem智慧培训系统一期PRD V1.0正式业务基线; - 该提交已经包含成绩、宿舍、教室接口别名、本地启动脚本、Node 22 适配、Kingbase 本地连接适配和 PRD V1.0。
当前工作树不能整体直接称为一个新的正式提交基线:其中有一组未提交的旧材料移动,即 doc/ 下3个旧文件表现为已跟踪删除,doc/wxy_doc/ 下对应材料表现为未跟踪文件;doc/wxy_doc/readme.md 明确标注这些资料暂不使用。除此之外,核验开始时没有未提交的 Java、Vue、API、SQL 或运行配置代码。
因此,继续开发应以 e12eda0 的代码内容和 PRD V1.0 为起点;开始数据库 V2 工作前,还应先决定是否正式接纳这组旧文档归档变化。本次新增的 12—17 报告是审计产物,没有提交。
2. 14张培训表实际存在多少张?
14张全部存在于 public schema,数据库中也没有第15张 train_% 表。
实际数据量:
train_teacher:1行;- 其余13张培训表:均为0行。
所有表均有主键;6张数字主键表使用 bigint GENERATED BY DEFAULT AS IDENTITY,8张字符串主键表没有数据库默认生成器。数据库还存在24个培训表外键、7组业务唯一约束和9个更新时间触发器。
3. 实际表结构和当前代码差异有哪些?
从“数据库字段是否能被当前生成代码映射”看,14个 Mapper XML 的 resultMap 字段数与实际表字段数一致,实际157个字段均能在当前 Mapper 中找到映射,Entity 的 String、Date、Long、BigDecimal 类型也基本兼容。
主要差异和风险是:
- 旧设计文档中的
t_id、s_id是varchar(20),实际为varchar(32);DATETIME落为 timestamp,TINYINT落为 smallint,6个INT AUTO_INCREMENT落为 bigint identity。 - 实际数据库比旧设计文档多出外键、唯一约束和更新时间触发器,迁移时不能只按 Markdown 字段表重建。
- 多个 Java 日期字段使用
@JsonFormat(pattern = "yyyy-MM-dd"),数据库能够保存时分秒,但接口序列化可能只暴露日期。 - 当前代码与现有表结构相互匹配,不代表满足 PRD V1.0。
train_class_plan.c_id/t_id、无参训关系、无课次、住宿与授权耦合、签到无lesson_id、成绩固定三列,均与正式业务对象冲突。 - 当前训练表 DDL 没有形成仓库内可追溯的初始化/迁移来源,现有数据库约束和触发器只能从实例读取。
详见 13_live_database_snapshot.md 和 14_database_code_diff.md。
4. 当前数据库是否真正使用Kingbase?
是。通过现有数据源配置和项目已有 JDBC 驱动成功建立只读连接,实测信息为:
- KingbaseES V009R003C018;
- database:
training; - schema:
public; - 当前用户:
kingbase; database_mode=mysql;- Maven 驱动依赖版本:8.6.0。
当前数据源通过既有的本地 127.0.0.1:4321 SSH/Tailscale 隧道连接。简单 SELECT 正常。整个核验事务为只读并已回滚关闭,没有修改数据库。
5. 当前Kingbase兼容模式能支持多少现有MySQL语法?
本次指定且可安全执行的语法探测全部通过:
date_format;ifnull;find_in_set;current_database();sysdate();LIMIT ... OFFSET ...;- MySQL 风格
LIMIT offset,row_count; SELECT 1 FROM dual;- 反引号标识符。
当前 PageHelper helperDialect=mysql 的分页尾句具备语法基础,identity 和 JDBC generated keys 的元数据条件也满足。由于本阶段禁止写入,真实 INSERT 生成键回填和完整 PageHelper 请求链仍无法只读确认。
同时已经确认两个比单项语法更严重的应用级问题:
- 代码生成器用
table_schema=current_database(),当前 database 为training、schema 为public,所以生成器按现有 SQL 查到0张表、0个字段。 - Kingbase 的
sys_catalog存在sys_user、sys_role、sys_config系统视图;当前搜索顺序优先于public。若依 Mapper 使用未限定 schema 的表名时会命中系统视图并因字段不匹配失败。
因此结论是“列出的 MySQL 语法在当前实例中全部可用”,不能表述为“项目已经完成 Kingbase 适配”。
6. 培训菜单是否真实存在?
真实存在。public.sys_menu 中有23条培训相关菜单记录:6个目录、17个组件页面,ID 范围为2154—2176。17个 component 均能在前端找到对应 Vue 页面。
但这些记录存在关键缺口:
- 全部
perms为空; - 没有培训按钮权限记录;
- 没有 plan-course、参训关系、课次/课表、床位/住宿安排、独立门禁授权、成绩项目/权重和培训班工作台页面;
- 前端按钮主要使用
train:*,Controller 主要使用system:*,数据库菜单没有对应权限字符串。
所以“菜单数据存在”和“培训权限链路可用”是两个不同结论。
7. 普通角色权限是否可能正常工作?
按当前实时数据,不能认为普通角色权限可以正常工作:
public.sys_role为0行,没有培训角色。public.sys_user_role有20行,其中18行找不到对应应用用户,20行全部找不到对应应用角色。public.sys_role_menu有170行,全部找不到对应应用角色,另有9行找不到菜单。- 培训菜单
perms全为空,前端和后端权限字符串也不一致。 - 未限定的核心
sys_user、sys_role、sys_config查询会命中 Kingbase 系统视图,登录、角色和配置查询本身存在阻塞。
若依已有 RBAC、菜单、按钮、数据权限和日志框架仍值得复用,但当前数据库权限数据及 schema 解析必须先核实和修复,不能据此新造一套账号权限系统。本阶段没有修改任何 sys_* 表。
8. 哪些问题必须在数据库V2以前处理?
- 固定正式代码基线,并决定当前旧文档归档移动是否进入后续提交,避免 V2 设计建立在不清晰工作树上。
- 明确若依
sys_*应用表的 schema 访问方式,解决与 Kingbase 系统视图的名称冲突;在解决前,登录和权限核验不具备可靠基础。 - 查明
sys_role为空及用户—角色—菜单关系大量孤儿的来源,制定非破坏性恢复或迁移方案;不能直接改sys_*表试错。 - 建立可审查、可版本化的数据库结构来源,完整保留实际外键、唯一约束、identity 和触发器信息。
- 按 PRD V1.0 先确认开班计划—课程、参训关系和课次三个核心关系,再决定当前 CRUD 的字段去留。
- 确认床位、住宿安排和门禁授权的业务边界,避免延续当前住宿事实与设备授权耦合。
- 确认成绩项目/权重与参训学员得分的迁移边界,停止把固定三列当成最终成绩模型。
- 统一数据库菜单、前端
v-hasPermi和 Controller@PreAuthorize的权限命名,并补齐按钮权限设计。 - 明确字符串业务主键、identity 主键和 MyBatis 生成键的统一策略,并用后续可回滚集成环境验证真实写链路。
- 明确时间字段是否需要时分秒,避免数据库 timestamp 与 Java
yyyy-MM-dd输出之间继续产生语义差异。 - 在学员 V2 模型中确定身份证等敏感字段的可逆加密、脱敏展示和访问权限方案。
- 修正代码生成器对 database/schema 的错误假设后,再把它作为 V2 代码生成依据。
9. 哪些现有数据必须迁移/保留?
当前培训业务只有 train_teacher 的1行真实数据需要明确保留和迁移;其他13张培训表为空,没有成绩、签到、住宿、报到或画像历史业务数据。
仍需保留或纳入迁移评估的非业务明细包括:
- 23条培训菜单的层级、名称、component 和排序,可作为 V1.0 菜单迁移底稿;
sys_user_role、sys_role_menu的现有记录需要先确认来源,虽然当前为孤儿关系,也不应直接删除;- 14张表的实际约束、identity、sequence 和触发器定义;
- 唯一一条教师记录的标识、业务字段及审计时间。
由于其他培训表均为空,以下业务模型的数据迁移成本当前较低:
train_class_plan.c_id/t_id转向开班计划—课程及课次关系;- 重复的
student_id + plan_id转向正式参训关系; - 签到转向
lesson_id; - 宿舍/授权拆分;
- 固定三列成绩转向成绩项目和学员得分。
“数据为空”只降低历史数据迁移风险,不降低代码、接口、菜单和约束迁移工作量。
10. 哪些现有CRUD值得继续复用?
可优先复用业务外壳
- 教师、学员、课程、教室、实训场地:列表、分页、表单校验、导入导出、权限注解和基础 Mapper 结构可继续作为实现底稿。
- 电子班牌:设备资源 CRUD 外壳可保留,但与班级、教室、课次的关系需按 V1.0 重新确认。
- 开班计划、报到、学习时长、简单画像:页面和接口骨架可复用,领域字段及关联对象需要调整。
只能部分复用
- 宿舍房间:资源维护部分可复用,必须补足床位对象;
- 宿舍授权:现有 CRUD 可作为历史字段和设备接入参考,不能继续同时承担住宿安排与门禁授权;
- 签到:采集来源、时间和状态字段有参考价值,关联主线需要从 plan/course/time 转向参训关系与课次;
- 成绩:导入来源、录入人、录入时间等审计能力可参考,固定三列成绩及当前唯一约束不能作为最终模型。
不应按现状继续扩展
- 遗留的
person、character、analysis、weather等页面没有形成 PRD V1.0 核心业务链,不应被当作领域模型依据。 - 现有代码没有课程版本/审批、复杂画像规则和自动结业引擎,这些缺失不构成一期阻塞。
11. 哪些表可以原地改造,哪些领域明显需要新增表?
本节仅作领域级初步分类,不确定最终表名、字段、主键、外键或迁移 DDL。
可保留主体并调整关联或字段
train_teacher、train_student、train_course;train_class_plan的计划主体;train_classroom_info、train_training_site;train_electronic_board;train_class_report、train_student_checkin、train_study_duration、train_student_portrait。
明显需要拆分或由新模型承接
train_dormitory_info目前只有房间层级,床位需要成为独立正式对象;train_dorm_auth同时承载住宿事实和授权事实,需要由住宿安排与门禁授权分别表达;train_score_info固定三列成绩不符合 V1.0,应由成绩项目/权重与参训学员得分模型承接。
PRD V1.0已经明确、当前缺失的正式关系或对象
- 开班计划—课程关系;
- 参训关系;
- 课次;
- 教学资源及课程资源关系;
- 床位;
- 住宿安排;
- 独立门禁授权;
- 成绩项目及权重;
- 参训学员按成绩项目的得分。
最终哪些对象使用新表、关系表或原表改造,应在数据库 V2 评审中确定。
12. 当前14张培训表与 PRD V1.0 核心对象的映射
| 当前表 | PRD V1.0对应对象 | 判断 |
|---|---|---|
train_teacher |
教师 | 修改 |
train_student |
学员 | 修改 |
train_course |
课程 | 修改 |
train_class_plan |
开班计划 | 修改 |
train_dormitory_info |
宿舍资源、房间、床位 | 拆分 |
train_dorm_auth |
住宿安排、门禁授权 | 拆分 |
train_classroom_info |
教室 | 原样保留 |
train_training_site |
实训场地 | 原样保留 |
train_class_report |
报到 | 修改 |
train_electronic_board |
电子班牌 | 修改 |
train_student_checkin |
课次考勤 | 修改 |
train_score_info |
成绩项目、权重、参训学员得分 | 被新模型替代 |
train_study_duration |
学习记录/学习时长 | 修改 |
train_student_portrait |
基础指标、简单标签、雷达图 | 修改 |
这里的“原样保留”表示其资源主体可以继续作为 V2 基础,不代表无需增加审计字段、关联表或约束;“修改、拆分、被新模型替代”也只是 Phase 0 初判,不构成最终数据库 V2 设计。