diff --git a/README.md b/README.md index 2d378da54..367e37f5e 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,91 @@ # RailwaySystem 智慧培训系统 -RailwaySystem 是一套面向铁路职工与业务学员的一站式智慧培训管理系统。系统基于 Spring Boot 2.5、若依(RuoYi-Vue)底座、Vue 2.6 与国产人大金仓(KingbaseES)数据库构建,全面覆盖从学员档案、师资管理、开班排课、报到考勤、宿舍分配、门禁授权到动态考核与综合画像的全流程业务闭环。 +> **当前交付候选版本 (Final Candidate)**:`5a49b2e2988bf23ca2a70568264c05b24dfda1b6` +> **远程基线分支**:`origin/feat/cicd-pipeline` +> **自动化测试覆盖**:后端单元与契约测试 154/154 PASS,核心业务主链集成用例 6/6 PASS,Kingbase 物理断言 11/11 PASS,端到端浏览器真实验收 PASS (0 阻断 / 0 异常 / Swagger 连通)。 --- -## 📚 文档中心快速导航 +## 📖 项目简介 -本项目文档实行**业务需求与技术架构分层治理**: - -| 文档中心 | 目录入口 | 核心重点内容 | 适用角色 | -| :--- | :--- | :--- | :--- | -| **业务与产品需求中心** | [doc/README.md](doc/README.md) | ★★★ [PRD V1.0 业务需求基线](doc/RailwaySystem%20智慧培训系统一期%20PRD%20V1.0.md)(正式冻结基线,32章全景规范)、原始甲供资料、历史版本演进 | 产品经理、业务方、测试、全栈开发 | -| **技术架构与系统审计中心** | [docs/README.md](docs/README.md) | ★★★ [Phase 0 真实基线与审计总结](docs/codebase-audit/17_phase0_summary.md)、18 篇全景代码与数据库实测快照报告 | 架构师、后端研发、前端研发、DBA | +RailwaySystem 是一套专为铁路职工与业务学员量身打造的一站式智慧培训管理系统。系统基于 Spring Boot 2.5、若依(RuoYi-Vue)企业级底座、Vue 2.6 前端框架以及国产人大金仓(KingbaseES)高安全数据库构建。系统全面贯穿从基础教务资源维护、开班计划编排、学员批量建档、现场开班报到、课次冲突检测、多模式考勤打卡、自动结训归档到多维学情画像与综合分析的全业务生命周期。 --- -## 🛠 技术栈 +## 🛠 技术架构栈 - **后端架构**:Java 8+ / Spring Boot 2.5 / Spring Security / MyBatis / PageHelper / RuoYi-Vue + - **核心培训业务模块**:`ruoyi-train`(独立封装教务、排课、考勤、计划、住宿等完整业务域逻辑与应用服务) + - **系统管理与支撑底座**:`ruoyi-system`、`ruoyi-framework`、`ruoyi-common`、`ruoyi-admin` - **前端架构**:Vue 2.6 / Vue Router / Vuex / Element UI / Axios / ECharts -- **数据库底座**:国产人大金仓 **KingbaseES V009R003C018**(MySQL 兼容模式,JDBC 驱动 8.6.0) -- **缓存与会话**:Redis 6+ + - **交互工程**:`build_ui`(当前 Final Candidate 实际构建和部署使用的 Vue 前端工程) + - **历史资产**:`RuoYi-Vue/ruoyi-ui`(若依原始/历史前端资产,不作为当前 Final Browser Acceptance 主构建源) +- **数据存储与持久化**: + - **国产主库**:人大金仓 **KingbaseES V009R003C018**(MySQL 兼容模式,驱动版本 `com.kingbase:kingbase8:8.6.0`) + - **缓存与会话**:Redis 6+(支持密码预检与分布式缓存) +- **发布与数据库增量 (Release DB Delta)**: + - 当前增量版本:`CURRENT_RELEASE_DB_DELTA = 3`(包括 `001_sys_oper_log_cost_time.sql`、`002_legacy_analytics_permissions.sql`、`003_report_attendance_action_permissions.sql`) + +--- + +## 🔄 核心业务闭环主链 + +系统严格遵循业务不变量与领域模型设计,构建了从教务准备到结业归档的标准业务闭环: + +```mermaid +flowchart TD + A["基础资源准备
(教师/学员/课程/教室/场地/宿舍)"] --> B["培训计划 (Plan)
创建开班计划 · 0:草稿"] + B --> C["本期课程 (PlanCourse)
绑定课程、教师与学时"] + C --> D["参训学员 (Enrollment)
名单批量导入 · 0:待报到"] + D --> E["开班发布 (Plan Publish)
锁定计划配置 · 1:进行中"] + + E --> F1["现场报到 (Report)
人脸/刷卡/扫码核验
状态更新为 1:已报到"] + E --> F2["课次排课 (Scheduling)
四维时段冲突预检
(教师/教室/场地/本班)"] + + F1 --> G["课次考勤 (Attendance)
签到/签退打卡,教师代签与请假修正留痕"] + F2 --> G + + G --> H["培训结训 (Completion)
计划置为 2:已结束,在读学员批量联动为 4:已完成"] + H --> I["学情分析 (Analytics - Read Only)
报到统计、考勤汇总、学习时长与综合能力画像"] +``` +*(注:学员宿舍安排作为生活保障支线,电子班牌作为现场多媒体与打卡硬件设备支撑)* + +--- + +## 🧭 文档中心导航 + +本项目采用**人类可读文档层(Human Documentation Layer)与技术契约事实源(Contract Sources)分层治理**: + +| 入口推荐 | 文档位置 | 说明与适用对象 | +| :--- | :--- | :--- | +| 🌟 **视觉化展示门户 (推荐首先访问)** | [docs/visual/index.html](docs/visual/index.html) | **纯静态可离线浏览**。面向评审专家、客户与业务方的交互式展示门户,含业务流程拓扑、系统架构图、14 大模块导览与质量看板。 | +| 📚 **人类操作手册与架构白皮书** | [docs/handbook/](docs/handbook/) | 面向项目经理、开发与测试人员的系统级手册(涵盖项目总览、业务流程、架构设计、数据模型、模块指南与部署运维)。 | +| 📑 **综合验收与测试报告** | [docs/reports/](docs/reports/) | 包含自动化集成测试报告、发版说明 (Release Notes) 与浏览器端到端验收记录。 | +| 📋 **业务需求基线中心** | [doc/README.md](doc/README.md) | ★★★ [PRD V1.0 业务需求基线](doc/RailwaySystem%20智慧培训系统一期%20PRD%20V1.0.md)(正式冻结基线,32章全景规范)、原始甲供资料、历史版本演进。 | +| 🔒 **冻结技术契约 (Source of Truth)** | [docs/api-v2/](docs/api-v2/)
[docs/database-v2/](docs/database-v2/) | 开发与 Agent 技术事实源。包含冻结的 REST API 契约、DTO/VO 字典、21 张物理表字段规范与权限错误码。 | +| 📋 **技术文档全景索引** | [docs/README.md](docs/README.md) | 技术文档中心主索引,提供面向不同角色(业务/研发/测试/历史审计)的精确导读。 | --- ## 🚀 快速启动指南 -### 1. 运行前置条件 - -1. **Java**:JDK 8、11 或 17+ -2. **Node.js**:Node 16+(系统已兼容适配 Node 22/OpenSSL 3.x) -3. **Redis**:本地启动 Redis 服务(默认端口 `6379`,无密码) -4. **网络/跳板机**:数据库部署在内网(`192.168.139.218:4321`),通过 Tailscale 跳板机节点 `100.70.157.41`(账号 `wzb`)建立端口转发隧道。 - -### 2. 一键启动(推荐) - -项目根目录下已提供一键启动脚本 [start-local.sh](start-local.sh): +### 1. 环境准备 +- **JDK**:Java 8、11 或 17+ +- **Node.js**:Node 16+(已兼容 Node 22 与 OpenSSL 3.x) +- **Redis**:本地启动 Redis 6+ 服务(默认端口 `6379`,无密码) +- **数据库**:KingbaseES 8.6.0(通过跳板机隧道转发 `127.0.0.1:4321` 直连) +### 2. 一键本地启动(开发模式) +项目根目录下提供了全自动化本地启动脚本 [start-local.sh](start-local.sh): ```bash -cd /Users/wzb/Desktop/项目/RailwaySystem ./start-local.sh ``` - -脚本将自动执行: -- 检查并唤醒本地 Redis; -- 检查并建立针对 Kingbase 数据库的跳板机 SSH 端口转发(`127.0.0.1:4321`); -- 清理历史冲突端口,启动 Spring Boot 后端(端口 `8090`); -- 启动前端开发服务器(端口 `8080`)。 +该脚本将自动唤醒本地 Redis、建立 Kingbase SSH 隧道、启动 Spring Boot 后端(端口 `8090`)以及启动前端工程(端口 `8080`)。 ### 3. 系统默认访问入口 - -- **前端应用界面**:[http://localhost:8080](http://localhost:8080) -- **后端接口服务**:[http://localhost:8090](http://localhost:8090) -- **默认管理员账号**:`admin` -- **默认密码**:`admin123` +- **前端系统界面**:[http://localhost:8080](http://localhost:8080)(本地开发) / `http://192.168.139.230:8082`(生产部署环境) +- **后端 API 服务**:[http://localhost:8090](http://localhost:8090)(本地开发) / `http://192.168.139.230:8092`(生产部署环境) +- **初始管理账号**:`admin` / `admin123` --- @@ -73,8 +105,16 @@ RailwaySystem/ │ ├── src/api/ # 前端 Axios 接口层(含 train 培训业务接口) │ ├── src/views/train/ # 培训业务页面视图(学员、排课、宿舍、考勤等) │ └── package.json # 前端依赖与 Webpack 构建配置 +├── deploy/ # 生产部署、平滑重启脚本与 Nginx 示例配置 ├── doc/ # 业务与产品需求中心(PRD V1.0、原始资料与归档) -└── docs/ # 技术架构、发布门禁与代码审计中心(包含 V2 架构、API/DB 规范与验收证据) +├── docs/ # 技术架构、发布门禁、Human Documentation 与代码审计中心 +│ ├── visual/ # 视觉化交互展示门户(8 篇可离线全景架构与流程展示) +│ ├── handbook/ # 人类操作白皮书与开发指南(01~09 全景手册) +│ ├── reports/ # 验收测试报告与发版说明 +│ ├── _meta/ # 发布准备度、门禁清单与最终浏览器验收证据 +│ ├── api-v2/ # REST API 契约与 DTO/VO 字典 +│ └── database-v2/ # 数据库 V2 物理模型与迁移断言 +└── scripts/ # 驱动预检与质量断言脚本 ``` --- diff --git a/docs/README.md b/docs/README.md index eb6ff3eb5..2abadb2eb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,66 +1,117 @@ -# RailwaySystem 技术架构与代码审计中心(docs) +# RailwaySystem 文档中心总导航 -> **说明**:本目录为 RailwaySystem 智慧培训系统的技术架构设计、代码审计、数据库实测核验及运行环境全景知识库。 -> -> **业务基线指针**:所有技术方案与数据库重构均服务于业务需求,业务判断请严格参阅 [doc/RailwaySystem 智慧培训系统一期 PRD V1.0.md](file:///Users/wzb/Desktop/项目/RailwaySystem/doc/RailwaySystem 智慧培训系统一期 PRD V1.0.md) 以及 [doc/README.md](file:///Users/wzb/Desktop/项目/RailwaySystem/doc/README.md)。 +> **当前工程基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) +> **数据库增量版本**:`CURRENT_RELEASE_DB_DELTA = 3` (增量迁移 `001_sys_oper_log_cost_time.sql`、`002_legacy_analytics_permissions.sql`、`003_report_attendance_action_permissions.sql` 已就绪;`007_dicts.sql` 明确严禁执行) +> **质量状态速览**:后端单元测试与契约测试 154 PASS,核心场景集成 6/6 PASS,110 次真实 HTTP 请求零 500 错误,Kingbase 物理断言 11/11 PASS,端到端浏览器自动化真实验收全量 PASS(Console 0 阻断,Swagger UI 正常连通)。 --- -## 核心技术现状速览(Phase 0 审计结论) +## 🧭 角色化阅读路线 -1. **工程架构**:前后端分离架构,后端基于 Spring Boot 2.5 + 若依 (RuoYi-Vue) 单体增强,前端基于 Vue 2.6 + Element UI。 -2. **数据库底座**:国产人大金仓 **KingbaseES V009R003C018**(JDBC 驱动 8.6.0,`database_mode=mysql`)。通过跳板机隧道(`127.0.0.1:4321` -> `192.168.139.218:4321`)直连生产实例。 -3. **数据库实测**:14 张培训业务表全部就绪,除 `train_teacher` 含有 1 条真实教师记录外,其余 13 张表数据量为 0,具备低包袱重构升级条件。 -4. **接口连通性**:已针对 Controller 增加路由别名,涵盖培训管理 14 组业务接口的探测全部达到 HTTP 200 连通。 -5. **系统启动**:已在工程根目录提供一键启动脚本 [start-local.sh](file:///Users/wzb/Desktop/项目/RailwaySystem/start-local.sh),集成跳板机隧道打通、本地 Redis 唤醒、Mac 端口清理与前后端一键并发启动。 +为了帮助不同背景的读者快速找到权威资料,本文档中心提供以下角色导航路径: + +```mermaid +graph TD + Entry["RailwaySystem 访问入口选择"] + + subgraph R1["评审 / 领导 / 汇报"] + V["离线交互门户
visual/index.html"] + H1["项目全景总览
handbook/01"] + end + + subgraph R2["业务 / 教务员"] + H2["业务主链规范
handbook/02"] + H5["14大业务模块指南
handbook/05"] + PRD["业务需求PRD
../doc/README.md"] + end + + subgraph R3["开发 / 架构师"] + H3["系统架构设计
handbook/03"] + H4["数据模型总览
handbook/04"] + H6["API与权限清单
handbook/06"] + API["API V2 事实源
api-v2/"] + end + + subgraph R4["测试 / 交付团队"] + H7["质量保障报告
handbook/07"] + TR["综合测试报告
reports/final-test-report.md"] + BR["浏览器验收报告
reports/browser-acceptance-report.md"] + DEP["部署与发版说明
reports/release-notes.md"] + end + + Entry --> R1 + Entry --> R2 + Entry --> R3 + Entry --> R4 +``` --- -## 代码与数据全景审计报告清单(`codebase-audit/`) +### A. 第一次阅读(推荐入口) -本目录下的 [codebase-audit/](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/) 包含完整的 19 篇技术审计报告,记录了对工程现状、源码实现、数据库实际 schema 与权限体系的详尽核验: - -### 1. 核心综述与基线标准 - -- [18_phase05_runtime_fix.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/18_phase05_runtime_fix.md) —— ★★★ **Phase 0.5 基础运行修复与端到端验证审计报告(Kingbase schema与生成器适配)** -- [17_phase0_summary.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/17_phase0_summary.md) —— ★★★ **Phase 0 工程与数据库真实基线总结(进入下一阶段前必读)** -- [11_executive_summary.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/11_executive_summary.md) —— 全景代码审计执行摘要 -- [12_baseline_classification.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/12_baseline_classification.md) —— 真实代码基线与工程资产可信度分级 -- [00_project_overview.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/00_project_overview.md) —— 项目整体技术概况与组件关系 -- [01_project_tree.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/01_project_tree.md) —— 项目工程目录结构全貌 - -### 2. 数据库与数据建模实测 - -- [13_live_database_snapshot.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/13_live_database_snapshot.md) —— 实时 KingbaseES 数据库实例只读核验快照 -- [14_database_code_diff.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/14_database_code_diff.md) —— 实时数据库与当前代码及 PRD V1.0 业务对象的差异比对 -- [16_kingbase_readonly_compatibility.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/16_kingbase_readonly_compatibility.md) —— KingbaseES MySQL 模式兼容性实测报告 -- [03_database_current_state.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/03_database_current_state.md) —— 数据库静态结构与设计状态分析 - -### 3. 后端服务与 API 盘点 - -- [04_api_inventory.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/04_api_inventory.md) —— 后端 Controller 接口现状盘点与路由清单 -- [02_training_modules_inventory.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/02_training_modules_inventory.md) —— 培训业务模块 Java 代码资产详尽盘点 -- [09_reusable_ruoyi_capabilities.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/09_reusable_ruoyi_capabilities.md) —— 若依(RuoYi)底座可复用框架能力分析 - -### 4. 前端组件与页面现状 - -- [05_frontend_inventory.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/05_frontend_inventory.md) —— 前端 Vue 页面、路由及 API 请求层盘点 - -### 5. 安全、权限与运行配置 - -- [15_live_permission_snapshot.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/15_live_permission_snapshot.md) —— 生产菜单、角色、权限关系实时状态核验 -- [06_security_and_permissions.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/06_security_and_permissions.md) —— 权限体系与若依安全拦截机制分析 -- [07_runtime_and_environment.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/07_runtime_and_environment.md) —— 运行环境依赖、配置项与本地部署条件 -- [08_git_status.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/08_git_status.md) —— Git 提交历史与版本分支演化 - -### 6. 业务与技术差距分析 - -- [10_gap_and_conflict_analysis.md](file:///Users/wzb/Desktop/项目/RailwaySystem/docs/codebase-audit/10_gap_and_conflict_analysis.md) —— 现状与预期目标的差距与冲突分析 +如果您是**第一次接触本项目**,或者需要向老师、主管、客户汇报系统成果: +* 🌟 **强力推荐直达离线交互门户**:[visual/index.html](visual/index.html) + * **特点**:无需启动后端服务或数据库,双击即可在任意现代浏览器中离线打开。 + * **内容**:提供深色工业风大屏质感,涵盖系统业务主链 SVG 交互拓扑、系统六层分层架构图、14 大核心业务模块互动矩阵、核心指标 KPI 仪表盘与发版准备度看板。 +* 📖 **快速阅读项目总览白皮书**:[handbook/01-project-overview.md](handbook/01-project-overview.md) + * 专为人类读者编写,通俗阐述系统解决的教务痛点、服务对象、关键特性与一期交付边界。 --- -## 关联子模块技术文档 +### B. 业务人员与教务管理路径 -- Kingbase 兼容模式专题核验: - - [kingbase_compatibility_audit.md](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/docs/kingbase_compatibility_audit.md) - - [kingbase_fact_check.md](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/docs/kingbase_fact_check.md) +关注业务流程、业务规则、状态流转与功能说明的读者,请查阅: +1. [handbook/02-business-process.md](handbook/02-business-process.md) —— **核心业务全流程与状态机规范**(开班计划、报到核验、四维排课冲突预检、考勤打卡与结训联动)。 +2. [handbook/05-module-guide.md](handbook/05-module-guide.md) —— **14 大业务模块详细指南**(教师、学员、课程、教室、场地、宿舍、开班、报到、排课、考勤、班牌、统计等)。 +3. [../doc/README.md (业务需求中心与 PRD V1.0)](../doc/README.md) —— **业务需求最高事实源**(包含正式冻结的 PRD V1.0 原文与原始资料索引)。 + +--- + +### C. 开发人员与架构师路径 + +参与系统编码、功能扩展与架构审计的研发人员,请查阅: +1. [handbook/03-system-architecture.md](handbook/03-system-architecture.md) —— **系统技术架构设计**(Spring Boot 2.5 + 若依增强单体、`ruoyi-train` 核心模块、Kingbase 兼容适配模式)。 +2. [handbook/04-data-model-overview.md](handbook/04-data-model-overview.md) —— **数据模型总览**(核心实体关系与关键表结构设计)。 +3. [handbook/06-api-and-permission-overview.md](handbook/06-api-and-permission-overview.md) —— **API 与权限体系速览**(核心操作端点、RBAC 菜单权限与专用业务 Action)。 +4. [handbook/08-deployment-and-release.md](handbook/08-deployment-and-release.md) —— **部署与运维手册**(本地快速启动与生产多环境部署要求)。 +5. [handbook/deployment/kingbase-jdbc-provisioning.md](handbook/deployment/kingbase-jdbc-provisioning.md) —— **Kingbase JDBC 8.6.0 依赖供应指南**。 + +--- + +### D. 测试与质量验收路径 + +负责功能验收、回归测试与质量审计的人员,请查阅: +1. [reports/final-test-report.md](reports/final-test-report.md) —— **Final Candidate 自动化测试与场景集成最终报告**(154 单元测试 + 6 大场景全 PASS 证据)。 +2. [reports/browser-acceptance-report.md](reports/browser-acceptance-report.md) —— **端到端浏览器自动化验收报告**(真实环境验收通过:**PASS**,0 阻断,Swagger 连通)。 +3. [reports/release-notes.md](reports/release-notes.md) —— **发版说明与变更记录**。 +4. [_meta/core-business-test-matrix.md](_meta/core-business-test-matrix.md) —— **核心业务场景集成自动化测试矩阵**。 + +--- + +### E. Agent 与技术契约事实源(Contract Sources) + +本目录下的底层契约目录为系统自动代码生成、契约测试和 Agent 审计的**最高技术事实源(Source of Truth)**,已正式冻结,保持原路径不移动: +1. [api-v2/](api-v2/) —— **API V2 契约体系**: + - `00_readme.md`:API 体系总览与 REST 规范 + - `01_api_design_principles.md` ~ `05_module_d_score_learning_statistics_api.md`:各业务域端点定义 + - `06_dto_vo_catalog.md`:DTO/VO 字段定义字典 + - `08_transaction_and_invariants.md`:强事务与 6 大跨表业务不变量 + - `10_permission_and_error_codes.md`:权限字符串与 40001~50001 业务错误码字典 +2. [database-v2/](database-v2/) —— **数据库 V2 物理迁移与表结构事实源**: + - `01_table_inventory.md`:21 张物理表字段、约束、主外键最终定义 + - `05_execution_contract.md`:数据库物理迁移执行契约与验证门禁 +3. [issues-v1/](issues-v1/) —— **任务分解与验收条件**: + - `02_p0_issue_backlog.md`:P0 核心任务与 AC 验收条件定义 + - `06_acceptance_matrix.md`:AC 验收标准对应自动化用例矩阵 +4. [development/](development/) —— 各 Issue 实施过程记录与验收报告。 +5. [_meta/documentation-audit.md](_meta/documentation-audit.md) —— D.0 文档现状审计与资产盘点报告。 + +--- + +### F. 历史过程资料归档(Historical Snapshots) + +> ⚠️ **重要提示**:以下目录记录的是项目研发演进早期的阶段性快照或原始素材,**仅作为工程审计与技术溯源参考,不代表当前 Final Candidate 的代码与数据库现状**: +* [codebase-audit/](codebase-audit/):**Phase 0 历史代码审计快照**(基于历史 Commit `e12eda05`,记录了重构前旧单体结构与旧 14 张表实测状态,已被 Database V2 与 API V2 替代)。 +* [../doc/raw_materials/](../doc/raw_materials/):早期甲供原始需求与数据表草案。 +* [../doc/archive/](../doc/archive/):一期 PRD V0.9、早期决策与假设讨论稿。 +* [../doc/wxy_doc/](../doc/wxy_doc/):早期技术原型与开发说明书草案。 diff --git a/docs/_meta/documentation-audit.md b/docs/_meta/documentation-audit.md new file mode 100644 index 000000000..ee80d1e56 --- /dev/null +++ b/docs/_meta/documentation-audit.md @@ -0,0 +1,79 @@ +# RailwaySystem 文档现状审计与资产盘点报告 (Documentation Audit) + +> **文档定位**:正式归档 D.0 Documentation Current-State Audit 审计事实、文档分类、重复集群与未来归档治理建议。 +> **基线版本**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) +> **审计原则**:本轮只读取并形成审计建议,**绝对不物理搬迁、不重命名底层契约目录**。 + +--- + +## 1. docs 目录盘点与结构统计 + +经对工程当前 HEAD 进行全面只读扫描: +* **`docs/` 目录内 Markdown 文档总数**:**70 份**(加根目录与 `doc/` 历史中心共 85 份)。 +* **目录分布明细**: + * `docs/README.md` (1 篇) + * `docs/_meta/` (2 篇:核心场景测试矩阵与分析模块适配审计) + * `docs/api-v2/` (14 篇:00~13 冻结的 API REST 契约、DTO/VO、权限与错误码) + * `docs/database-v2/` (14 篇:00~13 21张物理表清单、迁移计划、Gate验证记录) + * `docs/issues-v1/` (10 篇:00~09 Wave 波次编排、P0 Issue 待办、AC 验收矩阵) + * `docs/development/` (8 篇:各 Issue 实施与 Smoke 验证记录) + * `docs/generator-v2/` (1 篇:Kingbase 序列识别补丁说明) + * `docs/handbook/deployment/` (1 篇:Kingbase JDBC 驱动供应指南) + * `docs/codebase-audit/` (19 篇:00~18 历史 Phase 0 代码与数据库实测快照) + +--- + +## 2. 文档分类与成熟度分布 + +对现有文档按业务性质进行深度分类统计: + +| 文档分类类型 | 数量 | 典型代表文件与说明 | +| :--- | :---: | :--- | +| **A. HUMAN_READABLE** | 3 篇 | 根目录 `README.md`、`doc/README.md`、`doc/PRD V1.0.md`(面向人类与评审)。 | +| **B. AGENT_TECHNICAL** | 28 篇 | `issues-v1/` 波次分配、`api-v2/` 服务边界与设计原则、`generator-v2/` 补丁。 | +| **C. CONTRACT_SOURCE** | 16 篇 | **技术最高事实源**:`api-v2/` 接口定义、`database-v2/01_table_inventory.md`、`PRD V1.0`。 | +| **D. TEST_EVIDENCE** | 16 篇 | `_meta/core-business-test-matrix.md`、`database-v2/` 门禁报告、`development/issue-*` 报告。 | +| **E. RELEASE_DEPLOYMENT**| 4 篇 | `kingbase-jdbc-provisioning.md`、`database-v2/02_migration_plan.md` 等。 | +| **F. HISTORICAL** | 28 篇 | `codebase-audit/` 全套 19 篇、`doc/raw_materials/`、`doc/archive/`。 | +| **G. DUPLICATE** | 5组集群 | 涉及 15+ 篇文档(详见第 4 节)。 | +| **H. STALE (过时内容)** | 22 篇 | 旧 `docs/README.md`、`codebase-audit/` 19 篇、早期未采纳草案。 | +| **I. UNKNOWN** | 0 篇 | 经过逐行读取,全部文档的来历与用途均已明确,无未知孤儿文档。 | + +--- + +## 3. 旧入口与信息架构缺陷诊断 + +1. **入口断头路**:旧版 `docs/README.md` 仅列出了 `codebase-audit/`,使新人误以为旧代码就是当前状态,后续完成的 `api-v2`、`database-v2` 等核心技术资产完全隐形。 +2. **同名目录混淆**:根目录下同时存在 `doc/` 和 `docs/`,缺乏上层导航协调。 +3. **技术文档机翻味过重**:大量的 Gate 验证记录与 Issue 过程文档充斥着 Agent 执行日志格式,人类可读性较差。 + +--- + +## 4. 五大重复集群与 Source of Truth 认定 (Duplication Clusters) + +| 重复集群主题 | 涉及文档清单 | 认定的权威事实源 (Source of Truth) | +| :--- | :--- | :--- | +| **Cluster 1:数据库 V2 表结构与字段** | • `doc/RailwaySystem 数据库 V2 字段设计...`
• `docs/database-v2/01_table_inventory.md`
• `docs/api-v2/06_dto_vo_catalog.md` | **[docs/database-v2/01_table_inventory.md](../database-v2/01_table_inventory.md)**
*(物理建表以当前 V2 SQL 为准)* | +| **Cluster 2:P0 业务规则与验收标准** | • `docs/issues-v1/02_p0_issue_backlog.md`
• `docs/issues-v1/06_acceptance_matrix.md`
• `docs/development/issue-*.md` | **[docs/issues-v1/02_p0_issue_backlog.md](../issues-v1/02_p0_issue_backlog.md)** 与 **[docs/issues-v1/06_acceptance_matrix.md](../issues-v1/06_acceptance_matrix.md)** | +| **Cluster 3:本地启动与环境搭建** | • `README.md`
• `docs/codebase-audit/07_runtime_and_environment.md`
• `docs/database-v2/00_readme.md` | 根目录 **[README.md](../../README.md)** | +| **Cluster 4:权限字符与错误码** | • `docs/api-v2/10_permission_and_error_codes.md`
• `docs/issues-v1/02_p0_issue_backlog.md` | **[docs/api-v2/10_permission_and_error_codes.md](../api-v2/10_permission_and_error_codes.md)** | +| **Cluster 5:排课冲突预检规则** | • `docs/api-v2/03_module_b_plan_enrollment_schedule_api.md`
• `docs/issues-v1/02_p0_issue_backlog.md` | **[docs/api-v2/03_module_b_plan_enrollment_schedule_api.md](../api-v2/03_module_b_plan_enrollment_schedule_api.md)** | + +--- + +## 5. 历史目录界定与未来归档建议 + +为保证 CI/CD 与自动化工具链路不被破坏,**本轮严禁执行物理文件迁移**。未来版本建议做如下轻量归档: +1. **明确 Historical 标记**: + - 将 `docs/codebase-audit/`(19 篇)在索引中统一声明为“Phase 0 历史代码快照”,防止新同学误读。 + - 将 `doc/raw_materials/` 与 `doc/archive/` 保持在历史资料区。 +2. **禁止擅自替代冻结契约**: + - 严禁创建 `03_contracts/` 目录强行替代原有的 `api-v2/` 和 `database-v2/`,新增的 Human Handbook 必须建立在现有契约之上。 + +--- + +## 6. 技术参考链接 (Technical References) + +* 文档中心总导航:[docs/README.md](../README.md) +* 人类操作手册:[docs/handbook/01-project-overview.md](../handbook/01-project-overview.md) +* 核心测试矩阵:[docs/_meta/core-business-test-matrix.md](core-business-test-matrix.md) diff --git a/docs/handbook/01-project-overview.md b/docs/handbook/01-project-overview.md new file mode 100644 index 000000000..a01c581ef --- /dev/null +++ b/docs/handbook/01-project-overview.md @@ -0,0 +1,107 @@ +# 01. RailwaySystem 项目全景总览 + +> **文档定位**:面向评审专家、业务主管、系统管理员及新入职人员的业务与系统总览手册。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 系统建设背景与解决的问题 + +铁路运输体系对从业人员的专业技能、作业标准与应急处置能力有着极其严苛的要求,常态化、规范化的职工培训是保障铁路行车安全的基石。然而,在传统的铁路职工培训与教务管理实践中,普遍存在以下业务痛点: + +1. **教务协同链条割裂**:开班计划、学员名单、师资配置、教室安排分散在不同表格或独立系统中,排课冲突(如同一名教师或教室在同一时间被多班复用)频发,依赖人工协调效率低下。 +2. **学员档案与敏感信息保护不足**:学员来自全国各铁路局集团公司,身份证号、手机号等关键个人隐私直接明文存储,存在合规与信息安全泄露隐患。 +3. **现场考勤与打卡真实性难以保证**:以往多采用纸质签到或事后手工补录,存在代签、漏签问题;同时,缺乏针对具体课次(上午/下午不同课程)的精准到课统计。 +4. **后勤保障与教务脱钩**:学员集中面授期间的宿舍分配往往滞后,男女混住风险、床位超额入住等情况难以在教务源头进行有效拦截。 +5. **学情考核与画像不够多维**:传统的固定单一分数无法真实衡量学员在理论考试、实操演练、课堂出勤及自学时长等维度的综合素质。 + +**RailwaySystem 智慧培训系统**正是为了解决上述问题而研发的一体化数字化教务中枢,旨在打造一个规范、高效、安全、智能的铁路全生命周期培训管理平台。 + +--- + +## 2. 核心用户角色与使用场景 + +系统围绕铁路职工培训的实际业务场景,为四类典型用户提供针对性服务: + +| 用户角色 | 核心使用场景 | 核心关注价值 | +| :--- | :--- | :--- | +| **教务管理员 (Admin)** | 编制年度/月度培训班计划、批量导入参训学员名单、调度教室与实训场地、统筹宿舍分配、监控全校开班运行状态。 | 全局资源统筹无冲突、批量操作高效、敏感数据安全合规。 | +| **授课教师 (Teacher)** | 查看个人授课日程表、查看本堂课应到/实到学员花名册、现场核验与代签补卡、登记课后学员考核成绩。 | 课表清晰直观、打卡操作便捷、考勤修正留痕可追溯。 | +| **参训学员 (Student)** | 凭身份证/人脸/动态码完成开班现场报到、按课次完成出勤打卡、查询个人住宿房间、查阅培训课程得分与学时。 | 报到极速通行、个人信息受保护、培训档案清晰透明。 | +| **管理决策者 (Leader)** | 查阅各期培训班综合报表、出勤率合格率分布、职工学时积累与多维能力画像,为岗位评定与人才选拔提供数据支撑。 | 数据真实权威、多维画像全面、决策有据可依。 | + +--- + +## 3. 系统核心业务模块布局 + +系统在一期建设中构建了覆盖全业务流程的 14 大核心功能模块: + +```mermaid +graph TD + subgraph M1["基础资源主数据"] + T["教师档案管理"] + S["学员主数据建档"] + C["培训课程资源库"] + CR["理论教室信息"] + TS["实训演练基地"] + end + + subgraph M2["教务与计划管理"] + P["开班计划编制"] + PC["本期课程绑定"] + E["参训名单导入"] + L["课次编排排课"] + SC["四维冲突智能预检"] + end + + subgraph M3["现场执行与后勤"] + R["开班现场报到 (人脸/刷卡/扫码)"] + A["课次考勤打卡 (签到/签退/修正)"] + D["宿舍楼栋与床位分配 (防混住)"] + B["电子班牌物联终端展示"] + end + + subgraph M4["考核分析与成果"] + AN["报到/考勤统计分析"] + DU["学习时长精准累计"] + PT["学员多维能力画像"] + end + + M1 --> M2 + M2 --> M3 + M3 --> M4 +``` + +--- + +## 4. 一期核心成果与交付边界 + +截至当前 **Final Candidate** 基线,系统已达成以下建设成果: + +1. **业务闭环 100% 贯通**:从教务准备、开班发布、现场报到、智能排课、课堂考勤、计划结训到学情分析,全流程 10 个正式业务环节实现数据无缝流转与状态联动。 +2. **跨表业务不变量强管控**: + - **学员敏感数据防护**:学员身份证号在数据库落库时采用不可逆散列 + 安全加密存储,界面与接口统一进行掩码脱敏(仅显示后 4 位)。 + - **四维排课防冲突算法**:教师时段冲突、教室占用冲突、实训场地占用冲突及同一班级课次重叠在编排时实时预检,确保教学资源不出现撞车。 + - **严格宿舍防混住校验**:男性学员严禁分入女寝,女性学员严禁分入男寝,且严格受限于房间核定容纳人数。 + - **结训联动流转**:培训计划完结时,一键自动批量将班级在读学员状态联动更新为“已完成”,杜绝人工遗漏。 +3. **国产化适配与平滑升级**: + - 全面完成国产人大金仓数据库(KingbaseES V009R003C018)的生产级适配与 21 张物理表重构。 + - 建立了严谨的发布增量迁移机制(`CURRENT_RELEASE_DB_DELTA = 3`),确保数据迁移的安全可控。 + +--- + +## 5. 关键系统特性 + +* **严密的权限安全体系**:基于 RBAC 标准模型,对数据查询、导出、报到确认及考勤调整等敏感操作进行细粒度权限控制,所有人工代签与状态修正强制写入审计流水留痕。 +* **高鲁棒性的业务接口**:全系统定义了统一的业务错误码体系(40001~50001),杜绝系统级 500 异常直接暴露给前端用户,提供友好的业务提示。 +* **工业级自动化质量门禁**:后端测试套件(154 项单元与契约测试、6 大场景核心闭环测试)全部通过,真实 API 请求 0 报错,数据库无脏数据残留。 + +--- + +## 6. 技术参考链接 (Technical References) + +* 业务需求最高基线:[业务需求中心与 PRD V1.0](../../doc/README.md) +* 系统业务全流程与状态机:[02-business-process.md](02-business-process.md) +* 系统技术架构设计:[03-system-architecture.md](03-system-architecture.md) +* 核心 API 契约总览:[docs/api-v2/00_readme.md](../api-v2/00_readme.md) +* 数据库物理模型清单:[docs/database-v2/01_table_inventory.md](../database-v2/01_table_inventory.md) diff --git a/docs/handbook/02-business-process.md b/docs/handbook/02-business-process.md new file mode 100644 index 000000000..40476bc10 --- /dev/null +++ b/docs/handbook/02-business-process.md @@ -0,0 +1,173 @@ +# 02. RailwaySystem 业务全流程与状态机规范 + +> **文档定位**:详细阐述 RailwaySystem 智慧培训系统一期的业务流转闭环、核心业务规则、状态机生命周期及分层控制机制。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 一期业务全景主链与支线 + +系统在一期实现中,建立了清晰的“准备阶段 → 编排阶段 → 执行阶段 → 结业归档”业务闭环: + +```mermaid +flowchart TD + subgraph S1["一、资源准备阶段"] + A["基础主数据录入
(教师档案、学员建档、课程库录入、教室与实训场地、宿舍就绪)"] + end + + subgraph S2["二、计划与编排阶段"] + B["创建培训计划 (Plan)
状态: 0:草稿"] + B1["绑定本期课程 (PlanCourse)
配置教师与学时"] + B2["录入参训学员 (Enrollment)
状态: 0:待报到"] + C["发布培训计划 (Plan Publish)
状态流转: 1:进行中"] + B --> B1 + B --> B2 + B1 --> C + B2 --> C + end + + subgraph S3["三、培训执行阶段"] + D1["开班报到环节 (Report)
人脸/刷卡/扫码核验
状态: 0:待报到 → 1:已报到"] + D2["课次排课环节 (Scheduling)
四维时段防重叠预检
(教师/教室/场地/本班)"] + E["课次考勤环节 (Attendance)
学员打卡 / 教师代签修正 (manual_flag=1)
考勤结论: 0缺勤 / 1正常 / 2迟到 / 3早退 / 4请假"] + D1 --> E + D2 --> E + end + + subgraph S4["四、结训与分析阶段"] + F["培训结训流转 (Completion)
计划状态: 2:已结束
正常在读学员自动联动: 4:已完成 (退训保护)"] + G["多维学情分析 (Analytics - Read Only)
报到统计 / 考勤分析 / 学时统计 / 学员画像"] + F --> G + end + + A --> B + C --> D1 + C --> D2 + E --> F +``` + +### 辅助支线与硬件支撑 +* **生活后勤支线 (Accommodation)**:在学员名单录入后至现场报到前,管理员依据参训人员的住宿需求(`accommodationRequired=1`),按照严格性别隔离策略分配宿舍床位,并可触发门禁授权。 +* **教学硬件支撑 (Electronic Board)**:电子班牌安装于理论教室或实训场地,作为现场多媒体终端,动态展示教室日程、授课教师、课次信息,并支持学员刷卡/人脸交互。 + +--- + +## 2. 核心状态机生命周期规范 + +### 2.1 参训档案状态机 (`Enrollment Status`) +参训记录(`train_enrollment`)记录学员在特定培训班中的履历状态,其合法值域严格定义为 **0 ~ 4**: + +```mermaid +stateDiagram-v2 + [*] --> 待报到 : 名单导入 (0) + 待报到 --> 已报到 : 现场核验通过 (1) + 待报到 --> 请假 : 人工请假 (2) + 待报到 --> 退训 : 退训登记 (3) + 已报到 --> 请假 : 人工请假 (2) + 已报到 --> 退训 : 退训登记 (3) + 已报到 --> 已完成 : 结训批量联动 (4) + 请假 --> 已报到 : 销假复课 (1) + 退训 --> [*] : 永久排除联动 + 已完成 --> [*] : 结业归档 +``` + +| 状态码 | 状态名称 | 业务含义 | 触发时机与流转说明 | +| :---: | :--- | :--- | :--- | +| **0** | **待报到** | 学员已被录入开班名单,等待开班现场核验 | 批量导入或手工新增学员入班时的初始状态。 | +| **1** | **已报到** | 学员已到校并在现场核验身份成功 | 执行开班报到动作(人脸/刷卡/二维码/人工)后更新。 | +| **2** | **请假** | 学员因特殊情况无法全程到课或中途请假 | 管理员在参训名单中人工调整学员状态。 | +| **3** | **退训** | 学员因故中途退出本期培训 | 管理员操作退训,该学员将被排除在结训联动更新之外。 | +| **4** | **已完成** | 学员顺利修完本期培训,达到结训要求 | 培训计划结训(`completePlan`)时,系统自动联动批量更新。 | + +### 2.2 课次考勤状态机 (`Attendance Status`) +课次考勤记录(`train_student_checkin`)记录学员在具体某节课上的考勤结论,其合法值域严格定义为 **0 ~ 4**: + +| 状态码 | 状态名称 | 业务判定标准与规则 | +| :---: | :--- | :--- | +| **0** | **缺勤** | 课次已结束,学员既无打卡流水,亦无请假备案(系统默认或代签缺勤)。 | +| **1** | **正常** | 在规定宽限时间内完成签到,并在课次结束后准时完成签退。 | +| **2** | **迟到** | 签到时间晚于课次开始时间与系统设定的宽限期。 | +| **3** | **早退** | 签退时间早于课次法定结束时间。 | +| **4** | **请假** | 针对本堂课次提交了有效公假/病假申请,或由授课教师代签标注为请假。 | + +> ⚠️ **禁令与口径红线**: +> 1. 严禁出现 `attendance_status = 5`(已证实为早期文档误将若依字典排序序号 `dict_sort=5` 当作字典取值)。 +> 2. 严禁使用旧材料中的 `4 = 缺勤`(当前正式标准中 `0 = 缺勤`,`4 = 请假`)。 +> 3. 严禁在报到表中使用旧的 `report_status`(报到状态统一归口至 `train_enrollment.enrollment_status`,报到流水只记录身份核验结果 `verify_result`)。 + +### 2.3 报到核验方式 (`Report Way`) +现场报到动作记录(`train_class_report`)中支持的核验方式包括: +* `1`:**人脸识别**(通过智能平板/闸机比对学员底库照片) +* `2`:**身份证刷卡**(读取实体二代身份证或员工卡) +* `3`:**二维码核验**(学员手机出示动态身份凭证核销) +* `4`:**人工录入**(由管理员或班主任核验纸质凭证后人工确认) + +--- + +## 3. 排课编排与智能冲突检测机制 (Scheduling) + +排课模块在编排具体课次(`train_lesson`)时,引入了实时四维防重叠检测算法,在业务上明确区分为**软警告 (Warning Conflict)** 与 **硬阻断 (Hard Block)**: + +### 3.1 四维检测范围 +1. **教师时间重叠**:同一教师在同一时间段内,严禁在不同培训班同时授课。 +2. **理论教室占用**:同一间教室在同一时间段内,严禁被两个不同课次同时占用。 +3. **实训场地占用**:同一个实训演练场地在同一时段内,严禁排入重叠的实操课程。 +4. **本班自身课次重叠**:同一个培训班内部,课次起止时间不允许自身交叉重叠。 + +### 3.2 冲突级别与处理策略 +* **软警告冲突 (Warning Conflict)**: + - 当检测到潜在的时间安排冲突(如跨班共享场地预警或紧凑排期),前端预检接口将返回详细冲突说明与冲突列表。 + - **业务处理原则**:前端向操作员弹出确认对话框: + - 若用户点击“取消”:不向服务器发送保存请求,排课操作中止; + - 若用户核实无误点击“确认继续”:向服务器发送标准的保存请求,正常落库保存。 + - **接口规范**:正式排课接口**禁止任何 `force`、`ignoreConflict` 或 `overrideConflict` 传参**,后端始终执行确定性的安全校验。 + - **浏览器真实交互验收事实**: + - **Warning Cancel 验证**:触发冲突警告弹窗后点击取消,不产生网络保存,实测 **PASS**; + - **Warning Confirm/Save 验证**:触发冲突警告弹窗后点击确认继续,标准 POST 成功落库保存,实测 **PASS**; + - **Lesson Detail GET 调用事实**:排课流程中 `Lesson detail GET: NOT CALLED`(课表采用聚合查询,无需高频单个课次明细往返)。 +* **硬阻断规则 (Hard Block - 绝对禁止保存)**: + - 起止时间非法(如开始时间晚于或等于结束时间); + - 培训班计划已锁定或已结训(禁止在已封账计划中变更课次); + - 理论教室与实训场地二者均未选,或二者同时被选中(必须严格二选一 XOR 互斥); + - 课次绑定的课程不属于当前开班计划(杜绝错链); + - 课次已有学员产生出勤打卡流水(杜绝课后篡改排课时间或删除课次)。 + +--- + +## 4. 报到与考勤的分层架构设计 + +在系统实现中,报到与考勤严格遵循“**只读分析查询 (Read-Only Analytics)**”与“**专用业务动作 (Write Actions)**”的分离原则: + +### 4.1 开班报到分层与术语规范 +1. **术语与界面标签一致性区分**: + - **UI 菜单标签 (`UI_MENU_LABEL`)**:前端侧边栏菜单当前显示为 **“开班签到”**(位于【统计分析】目录下,对应数据库 `sys_menu.menu_name = '开班签到'`); + - **业务术语与契约 (`BUSINESS_TERM`)**:在业务模型、应用服务(`EnrollmentAppService.confirmReport`)与冻结契约中,标准业务术语统一为 **“开班报到 / Report Confirm”**。文档与汇报中保持此明确区分,系统不随意修改 UI 既有菜单。 +2. **报到分析与流水查询 (`/train/report`)**: + - 定位:**只读查询与数据导出 (Read-Only Analytics)**。 + - 展现:开班签到全局列表、按班级检索报到记录、导出 Excel 报表。在真实浏览器验收中验证为 **PASS / Read Only**。 +3. **现场报到确认动作 (`confirmReport`)**: + - 定位:**专用业务操作 (Write Action)**。 + - UI 入口:位于【开班计划管理】页面中,进入具体班级的【参训人员列表 (EnrollmentPanel)】,点击单条学员的【报到】操作按钮。 + - 实测验证:端到端真实调用 `POST /train/enrollments/{enrollmentId}/report`,返回 200 OK,学员状态由 `0:待报到` 成功更新为 `1:已报到`(**PASS**)。 + +### 4.2 课程考勤分层与设备路由 +1. **考勤分析与统计看板 (`/train/checkin`)**: + - 定位:**只读全局看板与历史数据分析 (Read-Only Analytics)**。 + - 展现:历史打卡明细检索、按学员/课次查询考勤结论、导出出勤报表。浏览器验收实测为 **PASS / Read Only**。 +2. **考勤打卡与调整动作 (Attendance Actions)**: + - 定位:**面向课堂现场与授课教师的专用高安全 Action 接口**。 + - 接口包括: + - `POST /train/lessons/{lessonId}/attendance/checkin`(学员签到/签退打卡) + - `POST /train/lessons/{lessonId}/attendance/adjust`(教师代签与请假修正,强制打上 `manual_flag = 1` 审计标记) + - **界面客观说明**:在当前的桌面后台管理大页面中,考勤以花名册展示为主;现场签到主要面向移动扫码终端、班牌设备接口及教师工作台,当前正式后台大页面并未冗余放置打卡模拟按钮。 +3. **电子班牌前端路由事实 (`BOARD_FRONTEND_ROUTE`)**: + - 在真实浏览器验收中,电子班牌前端页面路由为 **`/equip/board`**(挂载于“教学设施 (equip)”目录下的“电子班牌 (board)”页面,组件为 `train/board`),后端接口路由保持为 `/train/board`。浏览器验收实测为 **PASS**。 + +--- + +## 5. 技术参考链接 (Technical References) + +* 核心服务与事务边界定义:[docs/api-v2/08_transaction_and_invariants.md](../api-v2/08_transaction_and_invariants.md) +* 核心业务主链集成测试矩阵:[docs/_meta/core-business-test-matrix.md](../_meta/core-business-test-matrix.md) +* 模块指南与用户角色:[05-module-guide.md](05-module-guide.md) +* 质量保障与验收报告:[07-testing-and-acceptance.md](07-testing-and-acceptance.md) diff --git a/docs/handbook/03-system-architecture.md b/docs/handbook/03-system-architecture.md new file mode 100644 index 000000000..a8e3987b3 --- /dev/null +++ b/docs/handbook/03-system-architecture.md @@ -0,0 +1,100 @@ +# 03. RailwaySystem 系统架构设计 + +> **文档定位**:阐述 RailwaySystem 的整体软件技术架构、系统分层设计、模块交互拓扑及国产化底座适配机制。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 整体架构与技术选型 + +RailwaySystem 采用现代企业级“前后端分离”单体增强架构,在兼顾交付敏捷性与开发效率的同时,针对铁路行业高安全、国产化底座的要求进行了深度加固: + +```mermaid +graph TD + subgraph UI["前端展示层 (build_ui)"] + Vue["Vue 2.6 + Element UI + Axios + Vue Router + Vuex + ECharts"] + end + + subgraph Admin["API 网关与接入层 (ruoyi-admin)"] + Ctrl["Spring MVC 控制器 / Token 鉴权 / 日志切面 / 全局异常捕获映射 / Swagger UI"] + end + + subgraph Train["培训核心业务层 (ruoyi-train)"] + S1["PlanAppService (开班计划)"] + S2["EnrollmentAppService (名单/报到)"] + S3["SchedulingAppService (排课四维预检)"] + S4["AttendanceAppService (考勤打卡/代签)"] + S5["基础资源服务 (教师/学员/场地/宿舍)"] + end + + subgraph Base["系统支撑底座 (ruoyi-system / framework / common)"] + RBAC["用户与角色权限 (RBAC)"] + Menu["系统菜单 (sys_menu)"] + Log["操作日志 (sys_oper_log)"] + Dict["字典配置 (sys_dict_data)"] + end + + subgraph Persistence["数据持久层 (MyBatis / PageHelper)"] + Mapper["XML 动态 SQL 映射器"] + Domain["领域实体 (Domain Entities)"] + end + + subgraph Storage["国产高安全主库 (KingbaseES V9)"] + KB[("人大金仓数据库 (MySQL兼容模式)
21张物理表 / BIGINT IDENTITY 序列 / 强约束与索引")] + end + + UI -->|HTTP / RESTful JSON| Admin + Admin --> Train + Admin --> Base + Train --> Persistence + Base --> Persistence + Persistence -->|JDBC 8.6.0| Storage +``` + +--- + +## 2. 核心模块解耦:`ruoyi-train` 业务域划分 + +为了彻底解决传统若依架构中业务代码与系统基础代码杂糅的问题,项目进行了模块级重构,将所有铁路培训业务彻底独立为 **`ruoyi-train`** Maven 子模块: + +| 模块名称 | 职责定位 | 包含的核心能力与服务 | +| :--- | :--- | :--- | +| **`ruoyi-train`** | **培训业务核心领域** | 1. 教学资源(教师、学员、课程、教室、场地、宿舍、班牌);
2. 开班计划与课程绑定(`PlanAppService`, `TrainPlanCourseService`);
3. 学员参训档案与报到流水(`EnrollmentAppService`);
4. 课次排课与四维防重叠检测(`SchedulingAppService`);
5. 课次打卡与教师代签(`AttendanceAppService`)。 | +| **`ruoyi-admin`** | **Web 交互与接口暴露** | 声明 RESTful 控制器(Controller)、Swagger 注解、请求入参校验及权限注解 `@ss.hasPermi`。 | +| **`ruoyi-framework`**| **底层工程基础设施** | Spring Security 拦截器、JWT 令牌校验机制、Druid 数据源监控配置。 | +| **`ruoyi-system`** | **通用权限与元数据底座** | 用户、角色、系统菜单(`sys_menu`)、字典数据(`sys_dict_data`)的底层管理。 | +| **`ruoyi-common`** | **通用工具与异常常量** | 基础实体基类、业务状态枚举、统一响应对象 `AjaxResult`。 | + +--- + +## 3. 国产数据库适配:人大金仓 KingbaseES + +系统底层数据库运行于国产人大金仓 **KingbaseES V009R003C018** 之上,采用 `database_mode=mysql` 兼容模式: + +1. **驱动治理与供应规范**: + - 采用官方商用驱动 `com.kingbase:kingbase8:8.6.0`。 + - 驱动 JAR 文件通过受控构建脚本预检并置入 Maven 本地仓库,规避二进制污染与许可证风险。 +2. **主键生成策略适配**: + - 传统若依在 MySQL 下依赖 `AUTO_INCREMENT`。在 Kingbase 适配中,全量 21 张表升级为统一的 `BIGINT IDENTITY` 自增序列或应用层 32 位 UUID,并定制了代码生成器自增识别补丁。 +3. **高安全与事务隔离**: + - 全面支持事务隔离级别,在结训联动(`completePlan`)等关键业务场景中保证强事务一致性,任何异常即刻全量回滚。 + +--- + +## 4. 关键架构设计原则 + +1. **确定性安全校验**: + - 跨表核心规则由后端领域服务与数据库物理约束双重守门,杜绝前端单边绕过。 +2. **敏感信息脱敏与散列存盘**: + - 学员身份证等关键数据进行哈希散列与密文存盘,对外接口响应强制执行末4位掩码数据脱敏。 +3. **只读分析模型与写操作严格隔离**: + - 报表导出、打卡历史检索采用只读聚合映射(Read Model);报到核验、考勤打卡、代签修正走独立写操作(Write Action)管道,实现读写职责清晰分离。 + +--- + +## 5. 技术参考链接 (Technical References) + +* 核心服务边界划分:[docs/api-v2/07_service_boundary.md](../api-v2/07_service_boundary.md) +* 事务边界与不变量:[docs/api-v2/08_transaction_and_invariants.md](../api-v2/08_transaction_and_invariants.md) +* 数据库物理模型事实源:[docs/database-v2/01_table_inventory.md](../database-v2/01_table_inventory.md) +* Kingbase 驱动供应指南:[deployment/kingbase-jdbc-provisioning.md](deployment/kingbase-jdbc-provisioning.md) diff --git a/docs/handbook/04-data-model-overview.md b/docs/handbook/04-data-model-overview.md new file mode 100644 index 000000000..253d1025e --- /dev/null +++ b/docs/handbook/04-data-model-overview.md @@ -0,0 +1,79 @@ +# 04. RailwaySystem 数据模型总览 + +> **文档定位**:面向技术人员与数据管理者的领域数据模型概览,重点梳理 10 大核心业务实体及其关联关系。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 核心实体领域关系拓扑 + +系统底层数据模型围绕“**开班计划**”为核心驱动中枢,建立了学员、课程、师资与空间资源的网状关联模型: + +```mermaid +graph TD + Plan["开班计划 (train_class_plan)
主键: plan_id (UUID 32位)"] + Course["标准课程库 (train_course)
主键: c_id (自增序列)"] + PlanCourse["本期课程绑定 (train_plan_course)
主键: plan_course_id (自增序列)"] + Student["学员主档 (train_student)
主键: s_id (UUID 32位)"] + Enrollment["参训档案 (train_enrollment)
主键: enrollment_id (自增序列)"] + Lesson["排课课次 (train_lesson)
主键: lesson_id (自增序列)"] + Classroom["理论教室 (train_classroom_info)
主键: class_room_id (UUID 32位)"] + Site["实训场地 (train_training_site)
主键: site_id (UUID 32位)"] + Board["电子班牌 (train_electronic_board)
主键: board_id (UUID 32位)"] + Report["现场报到流水 (train_class_report)
主键: report_id (自增序列)"] + Checkin["课次考勤打卡 (train_student_checkin)
主键: checkin_id (自增序列)"] + + Plan -->|1:N 课程绑定| PlanCourse + Course -->|1:N 课程实例| PlanCourse + Plan -->|1:N 班级档案| Enrollment + Student -->|1:N 参训履历| Enrollment + PlanCourse -->|1:N 安排课次| Lesson + Plan -->|1:N 课表从属| Lesson + + Enrollment -->|1:N 核验流水| Report + Enrollment -->|1:N 课堂考勤| Checkin + Lesson -->|1:N 考勤记录| Checkin + + Classroom -.->|XOR 互斥场地| Lesson + Site -.->|XOR 互斥场地| Lesson + Classroom -->|1:N 设备绑定| Board +``` + +--- + +## 2. 十大核心业务实体职责说明 + +| 核心实体表名 | 对应领域概念 | 核心业务主键 | 核心职责与外键关联 | +| :--- | :--- | :--- | :--- | +| **`train_class_plan`** | 开班计划 | `plan_id` (UUID 32位) | 承载培训班全生命周期(名称、起止日期、计划状态、报到截止时间、核定人数)。 | +| **`train_course`** | 标准课程库 | `c_id` (自增序列) | 培训课程标准资产库(课程编码、课程名、建议课时、状态)。 | +| **`train_plan_course`** | 本期课程绑定 | `plan_course_id` (自增序列) | 记录特定开班计划选用的课程,外键关联 `plan_id` 与 `c_id`,并绑定授课教师 `t_id`。 | +| **`train_student`** | 学员主数据档案 | `s_id` (UUID 32位) | 学员基础档案,含脱敏姓名、散列与加密存储的身份证号、联系电话及单位名称。 | +| **`train_enrollment`** | 参训履历档案 | `enrollment_id` (自增序列) | 记录学员参与特定培训班的报名档案,外键关联 `plan_id` 与 `student_id`,维护参训状态。 | +| **`train_lesson`** | 具体课次安排 | `lesson_id` (自增序列) | 记录排课课次,外键关联 `plan_id`、`plan_course_id`、`t_id` 及场地(教室或实训场地互斥)。 | +| **`train_classroom_info`**| 理论教室 | `class_room_id` (UUID 32位)| 教学空间实体,定义容纳人数、多媒体配置及可用状态。 | +| **`train_training_site`** | 实训演练基地 | `site_id` (UUID 32位) | 室外或专业实操演练基地,外键关联课次,与教室互斥。 | +| **`train_class_report`** | 现场开班报到流水 | `report_id` (自增序列) | 记录学员现场报到核验事件,外键关联 `enrollment_id`,记录核验方式与时间。 | +| **`train_student_checkin`**| 课次考勤打卡记录 | `checkin_id` (自增序列) | 唯一约束 `UNIQUE(enrollment_id, lesson_id)`,记录打卡时间、考勤状态及人工修正标志。 | +| **`train_electronic_board`**| 电子班牌物联终端 | `board_id` (UUID 32位) | 外键关联 `class_room_id`,记录设备序列号 `board_sn`、IP 地址及通信端点。 | + +--- + +## 3. 关键物理约束与完整性保证 + +1. **唯一性约束防重叠**: + - 同一培训班内同一学员只能有一条有效档案:`uq_train_enrollment(plan_id, student_id)`。 + - 同一学员在同一课次只能产生一条考勤结论:`uq_train_student_checkin(enrollment_id, lesson_id)`。 + - 电子班牌硬件序列号全局唯一:`uq_train_electronic_board_sn(board_sn)`。 +2. **空间场地 XOR 互斥**: + - 课次表(`train_lesson`)中通过数据库检查约束 `chk_lesson_venue` 强制保证理论教室 `class_room_id` 与实训场地 `site_id` 必须二选一填报,杜绝孤立课次或双重占用。 +3. **时间逻辑有效性约束**: + - 课次起止时间强制满足 `lesson_end_time > lesson_start_time`。 + +--- + +## 4. 全量物理表事实源链接 + +关于系统全部 21 张物理表的完整字段清单、数据类型、索引策略与外键级联定义,请直接查阅冻结事实源: +* 📚 **[docs/database-v2/01_table_inventory.md](../database-v2/01_table_inventory.md)**(21 张物理表全景字段字典) +* 📑 **[docs/database-v2/03_constraint_index_review.md](../database-v2/03_constraint_index_review.md)**(数据库约束与索引优化审查) diff --git a/docs/handbook/05-module-guide.md b/docs/handbook/05-module-guide.md new file mode 100644 index 000000000..7b2a490fe --- /dev/null +++ b/docs/handbook/05-module-guide.md @@ -0,0 +1,159 @@ +# 05. RailwaySystem 14 大核心业务模块详细指南 + +> **文档定位**:从人类视角系统化解析系统的 14 大业务功能模块,涵盖模块定位、主要用户、核心能力与业务规则。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 基础资源域模块 + +### 1.1 Teacher (教师档案管理) +* **业务定位**:全校师资人才库与授课教师资质管理中枢。 +* **主要用户**:教务管理员。 +* **主要功能**:教师基础档案维护(工号、姓名、职称、联系电话、所属单位、擅长专业领域)。 +* **关键规则**:教师联系电话(`t_phone`)全局唯一;已排入课次的教师在授课周期内禁止物理删除。 +* **关联模块**:为开班课程绑定(PlanCourse)与课次排课(Scheduling)提供师资实体。 +* **实测验收状态**:**IMPLEMENTED / Teacher PASS**(浏览器端到端表单录入、手机号重复校验与列表渲染全部通过)。 + +### 1.2 Student (学员主数据档案) +* **业务定位**:参训职工统一身份与成长履历主数据中心。 +* **主要用户**:教务管理员、人事培训主管。 +* **主要功能**:学员建档、信息检索、所属铁路局与站段维护、敏感信息脱敏与哈希存储。 +* **关键规则**:身份证号执行安全哈希与密文存储,界面与接口脱敏只显后 4 位;停用状态的学员(`status=0`)禁止编入任何开班计划。 +* **关联模块**:为参训名单录入(Enrollment)提供学员主档。 +* **实测验收状态**:**IMPLEMENTED / Student PASS**(建档正常、末4位脱敏掩码生效、页面与表单校验通过)。 + +### 1.3 Course (培训标准课程库) +* **业务定位**:铁路标准化教学大纲与课程资产管理。 +* **主要用户**:教务规划人员。 +* **主要功能**:课程新建、课程编码维护、标准课时设定、课程状态启用/停用。 +* **关键规则**:课程编码(`c_code`)全局唯一;启用状态的课程才允许被开班计划引用。 +* **关联模块**:为计划课程配置(PlanCourse)提供标准课程源。 +* **实测验收状态**:**IMPLEMENTED / Course PASS**。 + +### 1.4 Classroom (理论教室管理) +* **业务定位**:教学楼宇内的实体理论教室与多媒体研讨室统筹。 +* **主要用户**:后勤与教务调度员。 +* **主要功能**:教室编号、标准座位容纳量、安装多媒体设备标注、使用状态流转。 +* **关键规则**:核定容纳量用于排课时的班级规模预警;每个教室可物理挂接 0 到 N 台电子班牌。 +* **关联模块**:为排课(Scheduling)提供理论场地,与电子班牌(Board)形成 1:N 映射。 +* **实测验收状态**:**IMPLEMENTED / Classroom PASS**(教室增删改查与容量维护通过)。 + +### 1.5 Site (实训演练基地) +* **业务定位**:机车检修、调度沙盘、铁道信号等室外/特种实操基地。 +* **主要用户**:实训指导员、教务调度员。 +* **主要功能**:演练场地登记、实操工位核定、场地状态维护。 +* **关键规则**:排课时与理论教室互斥二选一,同一时段同一场地禁止两个班级并发占用。 +* **关联模块**:为排课(Scheduling)提供实操场地资源。 +* **实测验收状态**:**IMPLEMENTED / Site PASS**(场地维护与互斥排课约束通过)。 + +### 1.6 Dormitory (宿舍房间与门禁) +* **业务定位**:学员集中面授期间的生活后勤与宿位资源保障。 +* **主要用户**:宿舍管理员、教务后勤人员。 +* **主要功能**:楼宇房间登记、核定床位数、房间性别属性(男寝/女寝/混合)设定、门禁授权同步。 +* **关键规则**:严格性别隔离(男学员严禁分入女寝,女学员严禁分入男寝);严禁超额入住。 +* **关联模块**:与学员参训档案(Enrollment)关联,根据学员住宿需求提供宿位分配支撑。 +* **实测验收状态**:**IMPLEMENTED / Dormitory PASS**。 + +--- + +## 2. 教务编排域模块 + +### 2.1 Plan (开班计划管理) +* **业务定位**:整个培训业务的大脑中枢,驱动培训生命周期的全流程流转。 +* **主要用户**:培训主管、班主任、教务管理员。 +* **主要功能**:开班计划拟定、周期设定、报到截止时限配置、发布开班、一键结训流转。 +* **关键规则**:计划生命周期状态机(0草稿 -> 1进行中 -> 2已结束);发布后锁定核心信息;结训时强事务批量联动更新学员履历为“已完成”。 +* **关联模块**:核心枢纽,聚合 PlanCourse、Enrollment、Lesson 等一切教务活动。 +* **实测验收状态**:**IMPLEMENTED / Plan PASS**(32位UUID主键生成、初始0:草稿、发布与结训流转正常)。 + +### 2.2 PlanCourse (计划本期课程绑定) +* **业务定位**:开班计划的具体教学方案,解决一期多门课程与师资配置问题。 +* **主要用户**:教务管理员。 +* **主要功能**:向培训班添加课程、指定授课教师、配置本班专属考核要求与学时。 +* **关键规则**:同一计划内同一课程不允许重复绑定。 +* **关联模块**:上接 Plan 与 Course,下为 Lesson 排课提供课程教师关联基准。 +* **实测验收状态**:**IMPLEMENTED / PlanCourse PASS**(课程绑定、教师关联及学时自动联动通过)。 + +### 2.3 Enrollment (参训人员名单管理) +* **业务定位**:学员与具体培训班的正式参训契约与学籍管理。 +* **主要用户**:班主任、教务管理员。 +* **主要功能**:批量导入学员名单、单条增删、指定住宿需求、维护参训状态。 +* **关键规则**:同一学员不可重复报名同一班级;招生人数受限于计划容量上限;状态支持 0待报到、1已报到、2请假、3退训、4已完成。 +* **关联模块**:连接 Student 与 Plan,是开班报到与课次考勤的核心主表。 +* **实测验收状态**:**IMPLEMENTED / Enrollment PASS**(名单导入、容量拦截、初始待报到通过)。 + +### 2.4 Scheduling (课次编排与冲突检测) +* **业务定位**:教务日历化排课引擎,保障教学资源高效有序运转。 +* **主要用户**:排课调度员、教师。 +* **主要功能**:编排具体课次(日期、起止时段)、选择教室/场地、时段失焦四维冲突实时预检。 +* **关键规则**:严格区分 Warning 与 Hard Block;警告级别若用户确认则允许落库保存,接口禁止任何 `force/override` 参数;起止时间与二选一场地属于硬阻断。 +* **关联模块**:依赖 PlanCourse、Classroom、Site,为 Attendance 考勤打卡提供课次载体。 +* **实测验收状态**:**IMPLEMENTED / Scheduling PASS** + - Warning Cancel = `PASS` + - Warning Confirm/Save = `PASS` + - 接口合规:严格禁止且未出现 `force` / `ignoreConflict` / `overrideConflict` 旁路参数 + - 课次详情查询:`Lesson detail GET: NOT CALLED`(规范约定无需调用) + +--- + +## 3. 现场执行与硬件支撑模块 + +### 3.1 Report (开班报到 / 界面标签: 开班签到) +* **业务定位**:学员报到第一现场的身份快速核验与通道管理。 +* **主要用户**:现场接待员、报到学员。 +* **界面与术语区分**:前端菜单显示为 **“开班签到”** (`UI_MENU_LABEL = 开班签到`),业务模型与动作定义统一为 **“开班报到 / Report Confirm”** (`BUSINESS_TERM = 开班报到`)。 +* **主要功能**:支持人脸识别、身份证刷卡、二维码与人工核验;记录报到时间与核验结论。 +* **关键规则**:报到成功强事务联动参训档案流转为“已报到”;分层设计(查询导出与专用报到 Action 解耦)。 +* **实测验收状态**:**IMPLEMENTED / PASS**(已在真实浏览器环境验证 `POST /train/enrollments/{id}/report` 200 OK,状态由待报到流转为已报到)。 + +### 3.2 Attendance (课次考勤打卡) +* **业务定位**:课堂出勤精细化管理,真实记录每堂课的出勤状况。 +* **主要用户**:授课教师、参训学员。 +* **主要功能**:支持签到打卡、签退打卡、任课教师课堂代签与事假修正。 +* **关键规则**:考勤状态严格规范为 0缺勤、1正常、2迟到、3早退、4请假;教师代签与修正强制标记 `manual_flag=1` 留痕;已有出勤记录的课次锁定禁止篡改时间。 +* **当前状态**:**IMPLEMENTED / PASS**(全局考勤分析为只读模型,专用 Action 契约完备)。 + +### 3.3 Board (电子班牌物联终端) +* **业务定位**:教室内智能多媒体终端,实现日程轮播与打卡通信。 +* **主要用户**:教室学员、现场巡考人员。 +* **前端正式路由**:**`/equip/board`** (`BOARD_FRONTEND_ROUTE = /equip/board`,位于教学设施目录下,后端 API 保持为 `/train/board`)。 +* **主要功能**:班牌设备注册、序列号登记、绑定安装教室、心跳与在线状态维护。 +* **关键规则**:后端自动生成 UUID 标识;设备在线状态由通信更新,禁止人工在表单篡改;逻辑软删除保护。 +* **关联模块**:外键绑定 Classroom 教室实体。 +* **实测验收状态**:**IMPLEMENTED / PASS**(浏览器实际访问 `/equip/board` 正常加载渲染,增删改查闭环)。 + +--- + +## 4. 学情分析域模块 + +### 4.1 Analytics (学情综合分析与画像) +* **业务定位**:多维度教务数据沉淀与大数据智能画像中枢。 +* **主要用户**:培训管理者、教务处领导。 +* **包含能力**: + 1. **开班报到统计 (Report Analytics)**:全局报到记录检索与导出; + 2. **课次考勤分析 (Attendance Checkin Analytics)**:出勤明细分析与缺勤统计; + 3. **自主学习时长统计 (Duration Analytics)**:综合学时与系统课时完成度累计; + 4. **学员综合能力画像 (Student Portrait)**:学员雷达图、技能标签与成长轨迹。 +* **当前交付状态客观说明**: + - **V2 Read Model 架构**:四大只读数据分析模型与前端界面已全部完成(**IMPLEMENTED**),并通过了权限对齐(`002_legacy_analytics_permissions.sql`); + - **高级跨期多维聚合计分 (Advanced Aggregation)**:属于二期深度分析规划(**NOT IN CURRENT CORE ACCEPTANCE**),核心验收以当前 V2 只读分析与报表导出为准。 +* **实测验收状态**: + - 报到统计 (Report Analytics):`PASS / Read Only` + - 考勤分析 (Checkin Analytics):`PASS / Read Only` + - 学时统计 (Duration):`PASS / Read Only` + - 学员画像 (Portrait):`PASS / Read Only` +* **系统工具与审计事实**: + - 操作日志 (OperLog):`PASS` + - 系统工具正常可见:表单构建、代码生成、系统接口(Swagger UI 连通) + - 角色分配机制:`RBAC_ROLE_ASSIGNMENT: ENVIRONMENT_CONFIGURATION` + - 验收数据保留策略:`Browser acceptance created/changed data: KEEP_FOR_AUDIT`(文档阶段严格保留用于审计回溯,不予清理) + +--- + +## 5. 技术参考链接 (Technical References) + +* 业务需求最高基线:[业务需求中心与 PRD V1.0](../../doc/README.md) +* 核心业务主链规范:[02-business-process.md](02-business-process.md) +* API 端点清单:[06-api-and-permission-overview.md](06-api-and-permission-overview.md) +* 自动化测试验证矩阵:[07-testing-and-acceptance.md](07-testing-and-acceptance.md) diff --git a/docs/handbook/06-api-and-permission-overview.md b/docs/handbook/06-api-and-permission-overview.md new file mode 100644 index 000000000..1c9ec6913 --- /dev/null +++ b/docs/handbook/06-api-and-permission-overview.md @@ -0,0 +1,77 @@ +# 06. RailwaySystem API 与权限体系总览 + +> **文档定位**:面向前端开发、集成团队及安全审计人员,系统梳理核心业务 API 契约、专用写操作(Write Actions)及 RBAC 权限体系。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 核心业务 API 端点分组 + +系统提供遵循 RESTful 规范的标准化 API 接口体系,统一由 `ruoyi-admin` 暴露,业务逻辑封装于 `ruoyi-train`。各业务域核心端点如下: + +### 1.1 基础教务资源接口 +* **教师管理**:`GET /train/teacher/list`, `POST /train/teacher`, `PUT /train/teacher`, `DELETE /train/teacher/{ids}` +* **学员主档**:`GET /train/student/list`, `POST /train/student`, `PUT /train/student`, `GET /train/student/{id}` (敏感信息脱敏) +* **课程资源**:`GET /train/course/list`, `POST /train/course`, `PUT /train/course` +* **教学空间**:`GET /train/classroom/list`, `POST /train/classroom`, `GET /train/training-site/list`, `POST /train/training-site` +* **宿舍生活**:`GET /train/dormitory/list`, `POST /train/dormitory`, `GET /train/dormitory/{id}/occupants` (住户查询) +* **电子班牌**:`GET /train/board/list`, `POST /train/board`, `PUT /train/board`, `DELETE /train/board/{id}` (后端 API 路径为 `/train/board`,对应前端页面路由为 `/equip/board`) + +### 1.2 开班计划与排课编排接口 +* **开班计划**: + * `POST /train/plans` —— 创建开班计划(状态置为 0:草稿) + * `GET /train/plans/{id}` —— 查询开班计划详情 + * `POST /train/plans/{id}/complete` —— **一键结训强事务操作**(计划状态更新为 2,联动更新在读学员参训状态为 4) +* **本期课程**:`POST /train/plans/{id}/courses`, `GET /train/plans/{id}/courses` +* **学员报名**:`POST /train/plans/{id}/enrollments` (名单录入), `PUT /train/enrollments/{id}/status` (状态调整) +* **课次编排**: + * `POST /train/lessons/check-conflict` —— **四维排课冲突实时预检**(失焦调用,返回 `LessonConflictVO`) + * `POST /train/plans/{id}/lessons` —— 新增课次(标准 POST 保存,严格禁止 `force` / `ignoreConflict` / `overrideConflict` 旁路参数;排课流程中 `Lesson detail GET: NOT CALLED`) + * `GET /train/plans/{id}/timetable` —— 培训班可视化课表视图 + +### 1.3 系统管理与在线接口工具 +* **系统接口 (Swagger UI)**: + * 真实系统入口:`系统工具 → 系统接口` + * 接口健康状况:Swagger UI 正常渲染,`v3/api-docs = 200`,`swagger-resources = 200`,无 502 坏网关,无死链 +* **系统工具其他可见项**:表单构建、代码生成正常可见可用 + +--- + +## 2. 专用写操作 (Core Write Actions) + +针对现场高频、高安全核验的业务场景,系统设计了专用的写操作端点: + +| 业务动作 | HTTP 动词与 URL 路径 | 核心业务行为与事务约束 | 所需安全权限 | +| :--- | :--- | :--- | :--- | +| **开班现场报到** | `POST /train/plans/{planId}/enrollments/{enrollmentId}/report`
*(或 `/train/enrollments/{enrollmentId}/report`)* | 核验报到时效,写入报到流水 `train_class_report`,联动将参训档案 `enrollment_status` 置为 1 (已报到)。 | `train:report:confirm` | +| **课次签到打卡** | `POST /train/lessons/{lessonId}/attendance/checkin`
*(或 `/train/attendance/sign-in`)* | 记录学员课次签到时间戳,校验是否超出允许时段,生成或更新考勤结论。 | `train:attendance:checkin` | +| **课次签退打卡** | `POST /train/attendance/sign-out` | 记录学员法定签退时间戳,结合签到时间自动核算考勤最终结论(正常/早退)。 | `train:attendance:checkin` | +| **教师代签/请假修正**| `POST /train/lessons/{lessonId}/attendance/adjust`
*(或 `PUT /train/attendance/{checkinId}`)* | 教师或管理员人工修正考勤结论(0~4),强制将 `manual_flag` 置为 1 留痕存盘。 | `train:attendance:edit` | + +--- + +## 3. RBAC 权限体系与菜单治理 + +系统全面对齐若依标准的“用户—角色—菜单”基于角色的访问控制(RBAC)架构: + +### 3.1 核心业务权限标识符 +* 报到模块:`train:report:list` (查询), `train:report:export` (导出), `train:report:confirm` (现场确认) +* 考勤模块:`train:attendance:list` (查询), `train:attendance:export` (导出), `train:attendance:checkin` (打卡), `train:attendance:edit` (代签调整) +* 学时分析:`train:learning:list`, `train:learning:export` +* 学员画像:`train:portrait:query`, `train:portrait:export` + +### 3.2 发布增量 003 权限补齐机制 +在最新的数据库迁移脚本 `003_report_attendance_action_permissions.sql` 中: +1. **菜单项创建**:脚本自动向 `public.sys_menu` 表中注入了 `train:report:confirm` (ID: 2181)、`train:attendance:checkin` (ID: 2182) 与 `train:attendance:edit` (ID: 2183) 三项按钮级权限记录; +2. **角色绑定规范说明**: + - `003` 脚本只负责在数据库中安全声明这三项可授权的原子能力项; + - **角色与菜单的绑定(`sys_role_menu`)属于环境运行时配置(ENVIRONMENT_CONFIGURATION)**,管理员可根据各局各院校的实际管理制度,在前端【系统管理 -> 角色管理】中将上述权限灵活分配给“班主任”、“任课教师”或“考勤监督员”等业务角色。 + +--- + +## 4. 技术参考链接 (Technical References) + +* API V2 契约总纲:[docs/api-v2/00_readme.md](../api-v2/00_readme.md) +* 全量 DTO/VO 字典:[docs/api-v2/06_dto_vo_catalog.md](../api-v2/06_dto_vo_catalog.md) +* 权限与全量错误码定义:[docs/api-v2/10_permission_and_error_codes.md](../api-v2/10_permission_and_error_codes.md) +* 报到与考勤权限迁移验证:[docs/reports/release-notes.md](../reports/release-notes.md) diff --git a/docs/handbook/07-testing-and-acceptance.md b/docs/handbook/07-testing-and-acceptance.md new file mode 100644 index 000000000..7800acec5 --- /dev/null +++ b/docs/handbook/07-testing-and-acceptance.md @@ -0,0 +1,89 @@ +# 07. RailwaySystem 质量保障与自动化测试报告 + +> **文档定位**:面向质量审计人员、技术评测专家及交付团队的系统化测试与验收报告。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 质量保障体系全景 + +RailwaySystem 建立了多层次的自动化测试与质量防护网络,确保从底层数据模型、服务契约、端到端接口到真实物理数据库的全链路正确性: + +```mermaid +graph TD + L1["端到端浏览器验收 (E2E)
Playwright 真实 UI 验收 · 0 阻断 / 0 个 500 · PASS"] + L2["核心业务场景集成 Gate (Scenario)
6 大场景真实 HTTP 110 次请求全链路闭环 · PASS"] + L3["应用服务与契约测试 (Unit / Contract)
154 项测试用例全覆盖 · 业务不变量与状态机转换 · PASS"] + L4["数据库物理断言与清理门禁 (DB Gate)
11 项 Kingbase 物理表断言 · 0 脏数据残留 · PASS"] + + L4 --> L3 + L3 --> L2 + L2 --> L1 +``` + +--- + +## 2. 核心测试指标汇总看板 + +| 验证维度 | 衡量指标 | 目标要求 | 实测结果 | 门禁结论 | +| :--- | :--- | :---: | :---: | :---: | +| **后端单元与契约测试** | Maven Test Suite 执行用例数 | 100% 通过 | **154 / 154 PASS** | ✅ **通过** | +| **核心业务场景集成** | 真实业务链路场景套件 (Scenarios) | 全部通过 | **6 / 6 PASS** | ✅ **通过** | +| **真实 HTTP 接口探测**| 实际发起网络交互请求总数 | 覆盖主链路 | **110 次** | ✅ **就绪** | +| **服务端异常率** | HTTP 500 系统内部崩溃错误数 | 严格为 0 | **0 异常** | ✅ **通过** | +| **Kingbase 物理数据断言**| 数据库真实记录状态与约束断言 | 100% 一致 | **11 / 11 PASS** | ✅ **通过** | +| **环境清理与残留检验**| 测试数据回滚与物理删除验证 | 零残留 | **Cleaned (Residue: 0)**| ✅ **通过** | +| **端到端浏览器验收** | Playwright 真实交互验收套件 | 全流程通行 | **PASS** *(0 阻断 / 0 个 500)* | ✅ **通过** | +| **Swagger 接口文档平台** | 接口定义与 UI 正常加载探测 | 无 502/死链 | **PASS** *(入口: 系统工具→系统接口)* | ✅ **通过** | + +--- + +## 3. 六大核心场景集成测试覆盖 (Scenarios) + +针对铁路教务的最核心闭环,集成测试套件对以下六大关键业务场景进行了真实环境端到端验证: + +1. **基础资源初始化与唯一性校验**: + - 教师档案录入(手机号唯一拦截 `40001`)、学员建档(敏感信息脱敏与哈希存储)、课程库建立与教室/实训场地可用性验证。 +2. **开班计划拟定与课程师资绑定**: + - 创建 32 位 UUID 标识的开班计划(初始强制为 0:草稿)、绑定计划专属课程与授课教师、计划学时自动汇总。 +3. **学员批量报名与容纳上限拦截**: + - 正常学员入班生成参训履历(初始 0:待报到);重复报名强行拦截(`40030 ENROLLMENT_ALREADY_EXISTS`);计划招生超额硬阻断(`40031 ENROLLMENT_CAPACITY_EXCEEDED`);停用学员拒绝报名。 +4. **四维排课防重叠智能检测**: + - 课次编排预检;教师授课时间冲突检测(`40040`);场地与班级课次重叠软警告(Warning 不阻断,用户确认后正常保存);场地 XOR 互斥与起止时间非法硬拦截。 +5. **现场开班报到与多模式核验**: + - 现场身份核验(人脸/刷卡/扫码/人工),写入报到流水,强事务联动参训档案流转为 1:已报到。 +6. **结训联动与历史状态保护**: + - 计划结训触发强事务流转(计划置为 2:已结束);活动在读学员(状态为 0 或 1)自动流转为 4:已完成;历史退训学员(状态为 3)受到严格保护不被误覆盖。 + +--- + +## 4. 浏览器真实验收与 Swagger 验证结果 + +针对 Final Candidate 基线(Tested HEAD: `5a49b2e2988bf23ca2a70568264c05b24dfda1b6`)的端到端真实浏览器验收已全部完成,达成 `FINAL_BROWSER_ACCEPTANCE = PASS`: + +* **Browser 交互状态**:`PASS`(Console blocker: `0`,HTTP 500: `0`) +* **Swagger 接口平台**:`PASS` + - 真实系统入口:`系统工具 → 系统接口` + - Swagger UI:正常加载,`v3/api-docs = 200`,`swagger-resources = 200`,无 502,无死链 +* **主数据模块 (Master Data)**:Teacher PASS、Student PASS、Classroom PASS、Site PASS 均通过 +* **核心业务模块 (Business)**:Plan PASS、PlanCourse PASS、Enrollment PASS 均通过 +* **报到核验 (Report Confirm)**:`PASS`,真实调用 `POST /train/enrollments/{enrollmentId}/report` 返回 200 OK,待报到 → 已报到 +* **排课冲突处理 (Scheduling)**: + - Warning Cancel = `PASS` + - Warning Confirm/Save = `PASS` + - 逻辑中严格禁止且无 `force` / `ignoreConflict` / `overrideConflict` 旁路 + - 课次详情 GET 查询:`Lesson detail GET: NOT CALLED` +* **电子班牌 (Board)**:`PASS`(前端路由:`/equip/board`) +* **统计分析报表 (Analytics)**:Report Analytics、Checkin Analytics、Duration、Portrait 均为 `PASS / Read Only` +* **系统操作日志 (OperLog)**:`PASS` +* **系统工具实际可见**:表单构建、代码生成、系统接口 +* **角色分配管理**:`RBAC_ROLE_ASSIGNMENT: ENVIRONMENT_CONFIGURATION` +* **验收数据审计策略**:`Browser acceptance created/changed data: KEEP_FOR_AUDIT`(文档验收阶段留存用于审计追溯,不执行清理) + +--- + +## 5. 技术参考链接 (Technical References) + +* 核心测试矩阵明细:[docs/_meta/core-business-test-matrix.md](../_meta/core-business-test-matrix.md) +* 最终测试综合报告:[docs/reports/final-test-report.md](../reports/final-test-report.md) +* 浏览器端到端验收进度:[docs/reports/browser-acceptance-report.md](../reports/browser-acceptance-report.md) diff --git a/docs/handbook/08-deployment-and-release.md b/docs/handbook/08-deployment-and-release.md new file mode 100644 index 000000000..75d46001b --- /dev/null +++ b/docs/handbook/08-deployment-and-release.md @@ -0,0 +1,102 @@ +# 08. RailwaySystem 部署与发布指南 + +> **文档定位**:面向运维工程师、发布主管及系统管理员的生产与测试环境部署、数据库迁移及服务维护手册。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 目标运行环境标准 + +系统在多环境部署中遵循标准化的网络拓扑与端口规划: + +```mermaid +flowchart LR + subgraph Clients["客户端层"] + Web["PC 浏览器 (Admin/教师/学员)"] + BoardDev["物联网终端 (电子班牌)"] + end + + subgraph ReverseProxy["反向代理与静态托管 (端口 8082)"] + Nginx["Nginx Web 服务
静态托管 build_ui / SSL 443 / 8082"] + end + + subgraph AppCluster["业务应用服务 (端口 8092)"] + SpringBoot["Spring Boot 容器 (ruoyi-admin)
JVM 4GB+ / 端口 8092"] + end + + subgraph DataTier["国产数据库与缓存层"] + KB[("人大金仓 KingbaseES V9
端口 54321 / 4321")] + Redis[("Redis 缓存服务
端口 6379")] + end + + Web -->|HTTP / HTTPS| Nginx + BoardDev -->|HTTP API| Nginx + Nginx -->|反向代理 /prod-api| SpringBoot + SpringBoot -->|JDBC 8.6.0| KB + SpringBoot -->|Jedis / Lettuce| Redis +``` + +| 组件名称 | 本地开发环境端口 | 集成与验收测试环境端口 | 生产环境建议规范 | +| :--- | :---: | :---: | :--- | +| **后端 API 服务 (Spring Boot)** | `8090` | **`8092`** | 8090~8099 负载均衡集群,JVM 内存建议分配 4GB+ | +| **前端交互应用 (Vue/Nginx)** | `8080` | **`8082`** | Nginx 反向代理(443/80),开启 Gzip 压缩与静态缓存 | +| **KingbaseES 国产主库** | `127.0.0.1:4321` (SSH隧道)| 直连实例 `54321` / `4321` | 国产人大金仓数据库实例,标准单主库配置 | +| **Redis 缓存服务** | `6379` (无密码) | `6379` (带密码预检) | 标准 Redis 缓存服务,用于 Token 校验与验证码防重放 | + +--- + +## 2. 发布增量迁移规范 (Release DB Delta) + +在系统从初始 V2 物理结构演进到当前 Final Candidate 的过程中,形成了正式的发布增量迁移序列: + +> **正式发布增量版本**:`CURRENT_RELEASE_DB_DELTA = 3` + +### 2.1 正式 Delta 脚本清单 +1. **Delta 001** —— `RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql` + - 作用:补齐 Kingbase 系统操作日志表中的消耗时间(`cost_time`)统计字段,保障运维监控正常运行。 +2. **Delta 002** —— `RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql` + - 作用:将旧分析模块菜单权限与 V2 契约精准对齐,建立只读报表查询与导出安全屏障。 +3. **Delta 003** —— `RuoYi-Vue/sql/system/kingbase/003_report_attendance_action_permissions.sql` + - 作用:向 `public.sys_menu` 表声明开班现场报到确认(`train:report:confirm`)、课次考勤打卡(`train:attendance:checkin`)与考勤人工修正(`train:attendance:edit`)三项按钮级原子权限。 + +### 2.2 字典初始化红线警示 +* ⚠️ **`007_dicts.sql` 明确执行禁令**: + - **`DO NOT EXECUTE`**:该脚本包含了大量未经环境幂等校验的历史字典初始数据,若盲目物理执行会污染生产 `sys_dict_data` 主键并引发唯一性冲突。在当前发布版本中严格禁止在生产库物理执行! + +--- + +## 3. 标准发布与升级步骤 + +生产升级必须遵循受控操作规程: + +```bash +# 步骤 1:拉取受控发布分支最新代码 +git checkout feat/cicd-pipeline +git pull origin feat/cicd-pipeline + +# 步骤 2:驱动依赖与环境预检 +bash scripts/bootstrap/check-kingbase-jdbc.sh + +# 步骤 3:数据库增量应用 (仅执行当前 Delta 001/002/003) +ksql -U SYSTEM -d training -f RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql +ksql -U SYSTEM -d training -f RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql +ksql -U SYSTEM -d training -f RuoYi-Vue/sql/system/kingbase/003_report_attendance_action_permissions.sql + +# 步骤 4:后端服务编译打包与启动 (8092 目标端口) +mvn clean package -DskipTests +java -Xms2048m -Xmx4096m -jar RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar --server.port=8092 & + +# 步骤 5:前端静态资源编译并由 Nginx 承载 (8082 目标端口) +cd build_ui +npm run build:prod +# 部署至 Nginx html 目录,加载 deploy/nginx.conf.example 配置 +``` + +--- + +## 4. 技术参考链接 (Technical References) + +* Kingbase JDBC 驱动依赖说明:[deployment/kingbase-jdbc-provisioning.md](deployment/kingbase-jdbc-provisioning.md) +* 发版说明与变更记录:[docs/reports/release-notes.md](../reports/release-notes.md) +* 部署验收与就绪报告:[docs/reports/deployment-report.md](../reports/deployment-report.md) +* 数据库物理模型清单:[docs/database-v2/01_table_inventory.md](../database-v2/01_table_inventory.md) diff --git a/docs/handbook/09-current-status.md b/docs/handbook/09-current-status.md new file mode 100644 index 000000000..76d85cb4f --- /dev/null +++ b/docs/handbook/09-current-status.md @@ -0,0 +1,51 @@ +# 09. RailwaySystem 当前系统状态全貌 + +> **文档定位**:面向全员的项目交付状态与版本基线综合看板,透明展示当前工程指标、未决事项与后续演进路线。 +> **当前基线**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) + +--- + +## 1. 核心状态综合看板 (Status Dashboard) + +| 审计维度 | 状态指标 | 当前权威事实 | 阶段状态 | +| :--- | :--- | :--- | :---: | +| **Git 代码基线** | Final Candidate HEAD | `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` | ✅ **已冻结** | +| **代码主干分支** | 远程交付集成分支 | `origin/feat/cicd-pipeline` | ✅ **已同步** | +| **后端单元/契约测试**| Maven 测试套件用例 | **154 / 154 PASS** | ✅ **全通过** | +| **核心业务场景套件**| 真实集成场景用例 | **6 / 6 PASS** | ✅ **全通过** | +| **真实 HTTP 请求验证**| 自动化链路真实网络交互 | **110 次**,0 次 500 内部异常 | ✅ **高稳定** | +| **Kingbase 物理落库断言**| 真实数据库记录完整性验证 | **11 / 11 PASS** | ✅ **全通过** | +| **发布数据库增量**| Release DB Delta 序列 | **CURRENT_RELEASE_DB_DELTA = 3** (`001`, `002`, `003`) | ✅ **已就绪** | +| **环境残留与回滚**| 测试后自动物理清理校验 | **PASS (Residue: 0)** | ✅ **无污染** | +| **端到端浏览器验收**| Playwright 真实 UI 验收 (0 阻断 / 0 个 500) | **FINAL_BROWSER_ACCEPTANCE = PASS** | ✅ **全通过** | +| **Swagger 接口在线探测**| 接口文档服务 (系统工具→系统接口) | **PASS** (v3/api-docs=200, resources=200) | ✅ **已验证** | +| **正式生产部署就绪度**| 线上集群部署验证 | **FORMAL_DEPLOYMENT = PENDING** | ⏳ **待发布** | + +--- + +## 2. 业务功能完备性矩阵速览 + +根据当前代码与测试验证,14 大业务模块实现覆盖情况如下: +* **全面闭环实现 (IMPLEMENTED & VERIFIED PASS)**: + - 基础资源:教师管理 (Teacher PASS)、学员主档 (Student PASS)、标准课程库 (Course PASS)、理论教室 (Classroom PASS)、实训场地 (Site PASS)、宿舍房间 (Dormitory PASS) + - 教务管理:开班计划 (Plan PASS)、本期课程 (PlanCourse PASS)、参训名单 (Enrollment PASS)、排课与冲突预检 (Scheduling PASS,Warning Cancel/Confirm 双通过,无 force/ignoreConflict 旁路) + - 现场执行:开班现场报到 (Report Confirm PASS,状态待报到→已报到)、课次考勤打卡与调整 (Attendance)、电子班牌管理 (Board PASS,前端路由 `/equip/board`) + - 系统运维与审计:操作日志 (OperLog PASS)、系统工具正常可见(表单构建、代码生成、系统接口) +* **只读分析模型已完成 (PARTIAL - V2 Read Model 就绪 & 验证 PASS)**: + - 统计分析 (Analytics):报到统计 (Report Analytics PASS)、考勤明细分析 (Checkin Analytics PASS)、学时完成度 (Duration PASS)、学员多维画像 (Portrait PASS) 的只读查询与数据导出已全部通过(Read Only 验证);高级跨期聚合计分(Advanced Aggregation)明确标记为二期规划,不纳入门禁阻断。 + +--- + +## 3. 下一阶段演进路线图 (Next Steps) + +1. **生产集群环境部署验证**:在目标生产端口(8092/8082)执行预发布部署演练,产出 [docs/reports/deployment-report.md](../reports/deployment-report.md)。 +2. **正式发版与交付**:基于当前稳定的 Final Candidate 生成正式 Release 标签,组织向最终客户及评审专家的成果汇报。 + +--- + +## 4. 技术参考链接 (Technical References) + +* 视觉化展示门户:[docs/visual/index.html](../visual/index.html) +* 最终测试综合报告:[docs/reports/final-test-report.md](../reports/final-test-report.md) +* 发版说明:[docs/reports/release-notes.md](../reports/release-notes.md) +* 架构白皮书:[03-system-architecture.md](03-system-architecture.md) diff --git a/docs/reports/browser-acceptance-report.md b/docs/reports/browser-acceptance-report.md new file mode 100644 index 000000000..b7b33ee67 --- /dev/null +++ b/docs/reports/browser-acceptance-report.md @@ -0,0 +1,107 @@ +# RailwaySystem 端到端浏览器自动化验收报告 + +> **文档定位**:记录基于 Playwright 的真实前端界面全流程交互、端到端用户路径及跨模块联动验收结果。 +> **基线版本**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) +> **执行状态**:✅ **FINAL_BROWSER_ACCEPTANCE = PASS** +> **Swagger 接口平台状态**:✅ **PASS** *(系统工具 → 系统接口,v3/api-docs=200,swagger-resources=200)* +> **HTTP 500 异常**:**0** | **Console 阻断错误**:**0** + +--- + +## 1. 验收测试目标与用例矩阵实测结果 + +本验收套件模拟真实教务员、任课教师及学员在现代浏览器中的实际交互操作,覆盖以下核心验收阶段,全部通过验证: + +```mermaid +flowchart TD + subgraph Phase1["阶段一:系统鉴权与档案"] + TC1["TC-E2E-01: 管理员登录与鉴权 (PASS)"] + TC2["TC-E2E-02: 基础教务档案录入 (PASS)"] + TC1 --> TC2 + end + + subgraph Phase2["阶段二:教务编排与名单"] + TC3["TC-E2E-03: 计划拟定与课程绑定 (PASS)"] + TC4["TC-E2E-04: 名单导入与报到动作 (PASS)"] + TC5["TC-E2E-05: 排课与四维冲突拦截 (PASS)"] + TC2 --> TC3 + TC3 --> TC4 + TC3 --> TC5 + end + + subgraph Phase3["阶段三:现场物联与审计"] + TC6["TC-E2E-06: 考勤花名册与班牌交互 (PASS)"] + TC7["TC-E2E-07: 统计分析与画像只读 (PASS)"] + TC8["TC-E2E-08: 系统工具与操作日志审计 (PASS)"] + TC4 --> TC6 + TC5 --> TC6 + TC6 --> TC7 + TC7 --> TC8 + end +``` + +| 验收阶段编号 | 验收场景与核心交互路径 | 实测结果 | 关键检查点 | +| :---: | :--- | :---: | :--- | +| **TC-E2E-01** | 系统管理与管理员登录流程 (含验证码与菜单权限加载) | ✅ **PASS** | 验证码刷新、Token 存储、`sys_menu` 路由动态加载 | +| **TC-E2E-02** | 基础教务档案录入 (教师/学员/教室/场地表单与列表渲染) | ✅ **PASS** | 教师手机号唯一、学员身份证掩码脱敏(后4位) | +| **TC-E2E-03** | 开班计划拟定与课程师资绑定 (计划生命周期流转) | ✅ **PASS** | 32位UUID主键、初始状态 0:草稿、学时自动联动 | +| **TC-E2E-04** | 参训名单批量导入与报到动作 (Enrollment 面板交互) | ✅ **PASS** | 实际调用 `/report` 接口 200 OK,待报到 → 已报到 | +| **TC-E2E-05** | 可视化课表排课与四维冲突弹窗拦截 (Timetable 交互) | ✅ **PASS** | Warning Cancel/Confirm 均正常,无 force 违规旁路 | +| **TC-E2E-06** | 课次考勤花名册与电子班牌呈现 (Board 交互) | ✅ **PASS** | 前端路由 `/equip/board` 正常渲染,代签 manual_flag | +| **TC-E2E-07** | 统计分析与画像只读报表 (Analytics Read Only 交互) | ✅ **PASS** | 报到、考勤、学时、画像报表只读查询与导出 | +| **TC-E2E-08** | 系统工具与操作日志审计留痕 (OperLog 校验) | ✅ **PASS** | 表单构建、代码生成、系统接口正常可见,日志落库 | + +--- + +## 2. 核心模块真实验收客观记录 + +### 2.1 Swagger 接口平台在线验收 +* **验收结论**:`PASS` +* **真实系统入口**:`系统工具 → 系统接口` +* **接口服务探测**:Swagger UI 正常渲染,`v3/api-docs` 返回 200,`swagger-resources` 返回 200,无 502 坏网关,无死链。 + +### 2.2 基础主数据模块 (Master Data) +* **Teacher**:`PASS`(教师档案增删改查、手机号唯一性校验) +* **Student**:`PASS`(学员建档、脱敏掩码显示、状态正常) +* **Classroom**:`PASS`(理论教室容量、门牌与状态管理) +* **Site**:`PASS`(实训场地类型、容量与占用管理) + +### 2.3 教务核心业务 (Business) +* **Plan**:`PASS`(32位UUID计划拟定、生命周期状态初始为 0:草稿) +* **PlanCourse**:`PASS`(课程绑定、教师关联、学时自动联动计算) +* **Enrollment**:`PASS`(参训入班、容量校验、初始 0:待报到) + +### 2.4 开班报到核验 (Report Confirm) +* **验收结论**:`PASS` +* **实际调用验证**:`POST /train/enrollments/{enrollmentId}/report` 返回 200 OK,学员状态由 `待报到 (0)` 成功流转为 `已报到 (1)`。 +* **术语与界面说明**:前端菜单显示为 `UI_MENU_LABEL = 开班签到`,业务模型与契约术语为 `BUSINESS_TERM = 开班报到`。 + +### 2.5 排课与四维冲突处理 (Scheduling) +* **Warning 取消交互**:`Warning Cancel = PASS`(取消后保持原排课状态不变) +* **Warning 确认保存交互**:`Warning Confirm/Save = PASS`(用户确认后成功入库,未破坏时间唯一性不变量) +* **合规要求**:排课业务逻辑中严格禁止且未出现 `force`、`ignoreConflict`、`overrideConflict` 旁路违规参数。 +* **课次详情查询**:`Lesson detail GET: NOT CALLED`(遵循契约规范,不发起多余查询)。 + +### 2.6 电子班牌 (Board) +* **验收结论**:`PASS` +* **正式前端路由**:`BOARD_FRONTEND_ROUTE = /equip/board`(菜单路径:教学设施 → 电子班牌;后端对应 API 路由为 `/train/board`)。 + +### 2.7 统计分析与学员画像 (Analytics) +* **报到统计 (Report Analytics)**:`PASS / Read Only` +* **考勤统计 (Checkin Analytics)**:`PASS / Read Only` +* **学时完成度 (Duration)**:`PASS / Read Only` +* **学员多维画像 (Portrait)**:`PASS / Read Only` + +### 2.8 运维与系统工具 (OperLog & System Tools) +* **操作日志 (OperLog)**:`PASS`(所有写操作审计日志落库完整) +* **系统工具可见项**:实际可见「表单构建」、「代码生成」、「系统接口」 +* **角色分配管理**:`RBAC_ROLE_ASSIGNMENT: ENVIRONMENT_CONFIGURATION` +* **数据保留策略**:`Browser acceptance created/changed data: KEEP_FOR_AUDIT`(浏览器验收过程中产生及流转的数据全量保留用于审计追溯,文档阶段不执行清理)。 + +--- + +## 4. 技术参考链接 (Technical References) + +* 综合测试报告:[final-test-report.md](final-test-report.md) +* 核心业务测试矩阵:[docs/_meta/core-business-test-matrix.md](../_meta/core-business-test-matrix.md) +* 业务主链规范:[docs/handbook/02-business-process.md](../handbook/02-business-process.md) diff --git a/docs/reports/deployment-report.md b/docs/reports/deployment-report.md new file mode 100644 index 000000000..59ff4428d --- /dev/null +++ b/docs/reports/deployment-report.md @@ -0,0 +1,60 @@ +# RailwaySystem 部署与发布准备度报告 + +> **文档定位**:记录目标环境部署、Nginx 反向代理配置、生产数据库迁移执行状态及服务健康检查结果。 +> **基线版本**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) +> **发布增量基线**:`CURRENT_RELEASE_DB_DELTA = 3` +> **当前部署状态**:⏳ **PENDING** *(等待最终测试门禁收敛后统一执行部署)* + +--- + +## 1. 目标发布环境规格 + +```mermaid +flowchart TD + subgraph Env["生产目标环境 (8092/8082)"] + FE["前端 Web (Nginx 静态托管)
端口 8082
健康检查: HTTP 200"] + BE["后端 API (Spring Boot)
端口 8092
健康检查: GET /login"] + DB[("国产主库 KingbaseES
端口 4321 / 54321
健康检查: Druid连接池")] + RD[("缓存 Redis
端口 6379
健康检查: AUTH & PING")] + + FE -->|/prod-api 代理| BE + BE --> DB + BE --> RD + end +``` + +| 服务组件 | 部署端口 | 运行载体 | 环境健康检查目标 | 准备状态 | +| :--- | :---: | :--- | :--- | :---: | +| **后端 API 服务** | `8092` | Spring Boot 2.5 (JAR) | `GET /login -> HTTP 200` | ⏳ PENDING | +| **前端 Web 交互** | `8082` | Nginx 1.20+ (静态承载) | HTTP 200 访问正常 | ⏳ PENDING | +| **国产主数据库** | `4321` | KingbaseES 8.6.0 | JDBC 连接池探测正常 (Druid) | ✅ 就绪 | +| **会话与缓存服务**| `6379` | Redis 6.2+ | `AUTH & PING -> PONG` | ✅ 就绪 | + +--- + +## 2. 数据库迁移准备度与增量核实 + +1. **增量 Delta 脚本就绪情况**: + - [x] `001_sys_oper_log_cost_time.sql` —— 消耗时间字段补齐(就绪) + - [x] `002_legacy_analytics_permissions.sql` —— 分析权限对齐(就绪) + - [x] `003_report_attendance_action_permissions.sql` —— 报到与考勤写操作权限(就绪) +2. **安全红线核实**: + - 确认生产发布中**严禁执行 `007_dicts.sql`**,避免字典主键唯一性碰撞。 + +--- + +## 3. 部署验证检查清单 (Deployment Checklist) + +* [ ] 后端 JAR 包编译打包无误(`mvn clean package -DskipTests`) +* [ ] 目标端口 `8092` 进程无冲突占用 +* [ ] 前端打包产物构建无报错(`npm run build:prod`) +* [ ] Nginx 反向代理配置加载完成(`/api` 代理至 `8092`) +* [ ] 初始超级管理员账号 `admin` 登录鉴权通过 + +--- + +## 4. 技术参考链接 (Technical References) + +* 部署与发布手册:[docs/handbook/08-deployment-and-release.md](../handbook/08-deployment-and-release.md) +* 发版说明:[release-notes.md](release-notes.md) +* 最终测试综合报告:[final-test-report.md](final-test-report.md) diff --git a/docs/reports/final-test-report.md b/docs/reports/final-test-report.md new file mode 100644 index 000000000..0356f933e --- /dev/null +++ b/docs/reports/final-test-report.md @@ -0,0 +1,68 @@ +# RailwaySystem Final Candidate 综合测试验收报告 + +> **文档定位**:全方位记录当前交付候选版本在单元、契约、场景集成、物理数据库及清理门禁等方面的最终测试验收结果。 +> **基线版本**:Final Candidate `5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) +> **报告生成时间**:2026-09-15 +> **总体验收结论**:✅ **CORE BACKEND & INTEGRATION ACCEPTANCE PASS** + +--- + +## 1. 测试执行概况 + +本轮测试在完全模拟生产的 KingbaseES 国产高安全数据库与真实 Spring Boot 容器环境下执行,涵盖了应用服务单元测试、API 契约测试、跨模块业务场景端到端集成测试及物理落库断言。 + +```mermaid +graph LR + T1["后端单元/契约测试
154/154 PASS"] --> T2["业务场景集成
6/6 PASS"] + T2 --> T3["HTTP API探测
110次 0次500 PASS"] + T3 --> T4["Kingbase物理断言
11/11 PASS"] + T4 --> T5["环境清理门禁
0残留 PASS"] + + style T1 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style T2 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style T3 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style T4 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style T5 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; +``` + +| 测试大项 | 执行用例数 | 通过数 | 失败数 | 结论 | +| :--- | :---: | :---: | :---: | :---: | +| **1. 后端应用服务与契约测试 (Maven)** | 154 | 154 | 0 | ✅ **PASS** | +| **2. 核心业务主链场景套件 (Scenarios)** | 6 | 6 | 0 | ✅ **PASS** | +| **3. 真实网络 HTTP API 探测调用** | 110 | 110 | 0 | ✅ **PASS** | +| **4. 服务端 500 异常捕获率** | - | - | 0 | ✅ **PASS (0 异常)** | +| **5. Kingbase 物理表持久化断言** | 11 | 11 | 0 | ✅ **PASS** | +| **6. 数据物理清理与零残留门禁 (Cleanup)** | - | - | - | ✅ **PASS (Residue: 0)** | + +--- + +## 2. 核心业务场景集成测试明细 (6/6 PASS) + +| 编号 | 测试场景名称 | 涉及核心接口与操作 | 物理数据库断言与验证点 | 实测结果 | +| :---: | :--- | :--- | :--- | :---: | +| **SC-01** | **完整正向业务闭环全链 (Happy Path Full Business Chain)** | `POST /train/teacher`
`POST /train/course`
`POST /train/classroom`
`POST /train/plans`
`POST /train/plans/{id}/courses`
`POST /train/plans/{id}/enrollments`
`POST /train/plans/{id}/lessons`
`GET /train/plans/{id}/timetable`
`POST /train/plans/{id}/complete` | 基础资源就绪 → 拟定32位UUID计划 → 课程与师资绑定 → 学员报名入班(初始0) → 排课课次落库 → 课表聚合查询 → 计划结训联动在读学员状态流转至4且记录complete_time。 | **PASS** | +| **SC-02** | **学员报名异常规则与状态区分 (Enrollment Validation)** | `POST /train/plans/{id}/enrollments`
`PUT /train/enrollments/{id}/status` | 1. 同一计划重复报名触发唯一索引拦截 (`40030`);
2. 招生容量上限超限拦截 (`40031`);
3. 不存在学员与停用学员 (`status=0`) 拒绝入班;
4. 独立维护学员主档状态与班级参训状态。 | **PASS** | +| **SC-03** | **排课预检 Warning 与 Hard Block 硬阻断 (Scheduling)** | `POST /train/lessons/check-conflict`
`POST /train/plans/{id}/lessons` | 1. 教师冲突硬检,教室/场地/班级重叠 Warning 预警且不硬阻断保存;
2. 严格禁止 force/override 参数;
3. 非法起止时间倒挂拦截 (`40010`);
4. 场地 XOR 互斥硬阻断;
5. 已结束计划锁定排课 (`40012`)。 | **PASS** | +| **SC-04** | **电子班牌绑定与课表降级映射 (Electronic Board)** | `POST /train/board`
`GET /train/classroom/{id}`
`GET /train/plans/{id}/timetable`
`DELETE /train/board/{id}` | 1. 自动生成32位UUID主键,默认在线状态 `board_status=0`;
2. 教室详情返回绑定班牌数组 (0/1/N);
3. 课表 `boardSn` 降级规则:0块为null,1块为对应SN,>1块降级为null;
4. 逻辑删除置 `del_flag='2'`。 | **PASS** | +| **SC-05** | **结训生命周期与退训学员保护 (Plan Completion Lifecycle)** | `POST /train/plans/{id}/complete`
`GET /train/plans/{id}`
`GET /train/enrollments/{id}` | 1. 计划状态更新为 `2:已结束`;
2. 本班在读活动学员 (状态0/1) 自动联动更新为 `4:已完成` 且写入 `complete_time`;
3. 历史退训学员 (状态3) 保持不变,杜绝误覆盖。 | **PASS** | +| **SC-06** | **现场报到与课堂考勤完整闭环 (Report & Attendance Lifecycle)** | `POST /train/enrollments/{id}/report`
`POST /train/attendance/sign-in`
`POST /train/attendance/sign-out`
`PUT /train/attendance/{checkinId}` | 1. 报到确认返回 `reportId`,学员状态强事务流转为 `1:已报到` 且写入 `join_time`;
2. 重复报到拦截 (`40050`);
3. 签到签退幂等性防覆盖(保持初次时间);
4. 人工考勤调整自动留痕 `manual_flag=1`。 | **PASS** | + +--- + +## 3. 数据库断言与环境清理验证 + +在场景集成套件执行期间与执行完毕后,执行了针对底层 Kingbase 物理库的直接核查: +1. **落库断言 (11/11 PASS)**: + - 验证了教师主键持久化、学员密文与哈希完整性、开班计划状态标记、参训档案唯一性、课次场地互斥、报到流水完整性、结训联动更新记录数等 11 项关键 SQL 校验,准确率 100%。 +2. **物理清理门禁 (PASS, Residue: 0)**: + - 测试套件在验证完毕后,触发受控清理机制,物理删除全部测试生成的临时学员、课次与开班计划; + - 最终执行扫描确认:**测试产生的数据残留为 0,生产数据库保持完全纯净**。 + +--- + +## 4. 技术参考链接 (Technical References) + +* 核心测试矩阵事实源:[docs/_meta/core-business-test-matrix.md](../_meta/core-business-test-matrix.md) +* 业务流程与状态机:[docs/handbook/02-business-process.md](../handbook/02-business-process.md) +* 浏览器端到端验收报告:[browser-acceptance-report.md](browser-acceptance-report.md) +* 发版说明:[release-notes.md](release-notes.md) diff --git a/docs/reports/release-notes.md b/docs/reports/release-notes.md new file mode 100644 index 000000000..a8671ea92 --- /dev/null +++ b/docs/reports/release-notes.md @@ -0,0 +1,83 @@ +# RailwaySystem v1.0 Final Candidate 发版说明 (Release Notes) + +> **发版版本号**:v1.0.0-final-candidate +> **Git 提交基线**:`5a49b2e2988bf23ca2a70568264c05b24dfda1b6` (`origin/feat/cicd-pipeline`) +> **发布日期**:2026-09-15 +> **发布增量状态**:`CURRENT_RELEASE_DB_DELTA = 3` +> **整体就绪度**:后端核心与场景集成通过(154/154 PASS,6/6 Scenarios PASS);端到端浏览器验收与 Swagger 探测 `PASS`(0 阻断 / 0 个 500);正式部署 `FORMAL_DEPLOYMENT = PENDING`。 + +--- + +## 1. 版本核心特性亮点 + +本版本作为 RailwaySystem 智慧培训系统的首个完整正式交付候选版本,全面实现了从基础资源、开班计划、学员名单、现场报到、智能排课、课堂考勤到结训归档的全流程数字化闭环: + +1. **教务排课四维智能冲突检测**: + - 实现了对授课教师、理论教室、实训演练基地及本班课次的时间重叠实时失焦预检; + - 建立明确的 Warning 机制,警告不阻断正常保存,彻底消除非法 `force/override` 参数。 +2. **敏感个人信息脱敏与散列存储**: + - 全面落地学员二代身份证号的散列索引 + 密文存盘机制,前端全链路脱敏只显后 4 位。 +3. **开班报到与考勤动作正式对齐**: + - 现场报到支持人脸、刷卡、扫码与人工多模式核验,成功后强事务联动参训档案流转为“已报到”; + - 课次考勤支持打卡、任课教师代签与事假人工调整,状态严格统一为 0缺勤、1正常、2迟到、3早退、4请假,代签自动置位 `manual_flag=1`。 +4. **强事务驱动的一键结训联动**: + - 计划结训时自动将班内正常参训在读学员批量更新为“已完成”,并严密保护历史退训学员状态防误覆盖。 +5. **国产人大金仓数据库与架构解耦**: + - 全量 21 张表完成 KingbaseES V9 物理重构与序列自增补丁适配; + - 后端核心业务彻底收敛至独立模块 `ruoyi-train`,实现架构高内聚。 + +--- + +## 2. 数据库增量发布说明 (Database Delta) + +当前版本包含针对底层数据库的 3 个正式发布增量脚本: + +* **Delta 001**:`RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql` + - 修复 Kingbase 操作日志中缺少 `cost_time` 字段的问题。 +* **Delta 002**:`RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql` + - 收敛 Legacy Analytics 接口与 V2 只读契约,补齐报表只读查询与导出权限。 +* **Delta 003**:`RuoYi-Vue/sql/system/kingbase/003_report_attendance_action_permissions.sql` + - 补齐现场开班报到确认(`train:report:confirm`)、课次打卡(`train:attendance:checkin`)与考勤调整(`train:attendance:edit`)三项原子动作权限。 + +> ⚠️ **数据库禁令提醒**: +> `007_dicts.sql` 明确标记为 `DO NOT EXECUTE`,生产环境严禁执行。 + +--- + +## 3. 质量门禁与当前验收状态 + +```mermaid +graph LR + G1["1. 单元与契约测试
154/154 PASS"] --> G2["2. 核心场景集成
6/6 PASS"] + G2 --> G3["3. 物理数据库断言
11/11 PASS (0残留)"] + G3 --> G4["4. 浏览器端到端验收
0阻断 / 0个500 PASS"] + G4 --> G5["5. Swagger接口文档
无502 / 无死链 PASS"] + G5 --> G6["6. 生产集群部署
FORMAL_DEPLOYMENT: PENDING"] + + style G1 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style G2 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style G3 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style G4 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style G5 fill:#1a3a2a,stroke:#52c41a,stroke-width:2px; + style G6 fill:#3a2e1a,stroke:#faad14,stroke-width:2px; +``` + +| 质量验证项 | 当前状态 | 备注说明 | +| :--- | :---: | :--- | +| **后端单元与契约测试 (154 项)** | **PASS** | 154 / 154 全部通过 | +| **核心业务场景集成套件 (6 大场景)** | **PASS** | 6 / 6 全闭环通过 | +| **真实 HTTP 请求链路探测 (110 次)** | **PASS** | 零 500 异常 | +| **Kingbase 物理数据完整性断言 (11 项)**| **PASS** | 11 / 11 吻合 | +| **测试环境物理数据清理 (Residue)** | **PASS** | 0 脏数据残留 (Cleaned) | +| **端到端浏览器自动化验收** | **PASS** | Console 0 阻断,0 个 500 异常 | +| **Swagger 在线文档服务探测** | **PASS** | 真实入口:系统工具→系统接口,UI加载正常 | +| **目标生产环境集群部署** | **PENDING** | 等待生产发布窗口统一执行 | + +--- + +## 4. 技术参考链接 (Technical References) + +* 综合测试报告:[final-test-report.md](final-test-report.md) +* 部署与准备度报告:[deployment-report.md](deployment-report.md) +* 浏览器端到端验收报告:[browser-acceptance-report.md](browser-acceptance-report.md) +* 人类手册:[docs/handbook/01-project-overview.md](../handbook/01-project-overview.md) diff --git a/docs/visual/architecture.html b/docs/visual/architecture.html new file mode 100644 index 000000000..4aa508533 --- /dev/null +++ b/docs/visual/architecture.html @@ -0,0 +1,280 @@ + + + + + + 系统架构与技术栈 - RailwaySystem 铁路智慧培训管理系统 + + + + + + + + + + +
+ +
+
Technical System Architecture
+

分层系统架构与技术栈

+

+ 真实还原系统分层架构拓扑:中心纵向贯穿浏览器前端、API安全鉴权、培训业务领域层、持久层及人大金仓数据库;侧边协同缓存与系统工具,并严格区分当前实现的 Web 班牌与预留的外部硬件适配器。 +

+
+ + +
+
+
+

系统全局分层拓扑与通信边界

+

实线代表已上线的当前实现;虚线代表规划中的预留扩展接口

+
+
+ 当前实现 (IMPLEMENTED) + 预留接口 (RESERVED) +
+
+ +
+ + + + + + + + + + + + + + + + + Browser / Frontend (浏览器客户端) + Vue 2.6 · Element UI · Axios · 路由动态加载 sys_menu · Web 电子班牌路由 (/equip/board) + + + + + HTTP / JSON (RESTful API) + + + + + API & Security (接口网关与安全中枢) + Spring Security 过滤器链 · JWT 无状态令牌解析 · RBAC 角色权限验证 (@PreAuthorize) + 统一异常捕获 (GlobalExceptionHandler) · 身份证脱敏过滤器 (末4位掩码) + + + + + + Redis 缓存支撑 + 端口: 6379 (DB 0) + + • 用户登录 Token 缓存 + • 验证码防重放缓存 + • 权限路由元数据 + + + + + + + + System Tools & 审计 + 系统工具与合规底座 + + • Swagger 接口平台 + • 操作日志 (OperLog) + • 表单构建与代码生成 + + + + + + + + + + + Training Domain (核心教务业务领域层) + + + + 主数据服务 (Master Data) + 教师/学员/课程/教室/场地 + + + + 排课调度引擎 (Scheduling) + 四维预检 / Warning / 场地XOR + + + + 现场执行服务 (Execution) + 报到强事务 / 考勤打卡幂等性 + + + + 结训流转服务 (Completion) + Plan状态流转 / 退训保护不变量 + + + + + + 电子班牌与物联适配 + + + + 当前实现 (CURRENT) + Web 班牌路由 / 降级映射 + + + 预留接口 (RESERVED) + 硬件闸机 / 班牌外部协议 + + + + + + + + + + + Persistence (数据持久层与连接池) + MyBatis 3.5 · PageHelper 分页插件 · Alibaba Druid 数据库连接池 (单主库配置) + + + + + + + + + KingbaseES (生产主库) + KingbaseES V009R003C018 (JDBC依赖 8.6.0) · 物理外键与唯一索引保障 · 21张业务表 + + +
+
+ + +
+
+
+

架构设计原则与关键实现边界

+

明确当前生产可用能力与后续规划接口的边界,坚守工程事实真实性。

+
+
+ +
+
+
+

安全鉴权与敏感数据保护

+ CURRENT +
+

+ 无状态 JWT 机制:采用标准 Bearer Token 进行会话保持,服务端通过 Redis 维护令牌白名单; +
脱敏治理:学员身份证在落库时保存散列与哈希,前端统一返回末4位掩码,杜绝明文传输; +
权限管控:依托 RuoYi 标准注解 @PreAuthorize 实现按钮级权限拦截。 +

+
+ +
+
+

排课预检与强一致性保护

+ CURRENT +
+

+ 四维防重叠预检:将教师时间冲突作为阻断校验,教室/场地/班级重叠作为 Warning 预警由教务员决策; +
零旁路保存:标准 POST 保存禁止 force/override 参数,保障排课合规; +
场地 XOR 互斥:物理保证教室与实训场地二选一,不可并存或两空。 +

+
+ +
+
+

物联网设备与外部适配器边界

+ 区分已实现 vs 预留 +
+

+ 当前实现:提供标准 RESTful API 及 Web 电子班牌路由 /equip/board,课表根据教室班牌数量 (0/1/N) 智能映射 boardSn; +
预留扩展 (RESERVED):物理硬件人脸打卡闸机适配协议、专属嵌入式班牌通讯协议预留接口规范,暂未接入实际物理硬件。 +

+
+
+
+ +
+ + + + + + + diff --git a/docs/visual/assets/docs.css b/docs/visual/assets/docs.css new file mode 100644 index 000000000..45134c51d --- /dev/null +++ b/docs/visual/assets/docs.css @@ -0,0 +1,1039 @@ +/* ============================================================================== + * RailwaySystem - Visual Portal Design System v2.0 + * 风格:现代企业级 · 铁路工业数字化 · 克制 · 高可读性 + * 调色:Deep Navy / Rail Blue / Cyan 点缀 / 浅灰白底色 + * 离线纯静态支持,无任何外部 CDN 依赖 + * ============================================================================== */ + +:root { + /* 调色板 - 铁路工业色系 */ + --navy-950: #090d16; + --navy-900: #0f172a; + --navy-800: #1e293b; + --navy-700: #334155; + --navy-600: #475569; + + --rail-blue-900: #1e3a8a; + --rail-blue-800: #1e40af; + --rail-blue: #1d4ed8; + --rail-blue-light: #3b82f6; + --rail-blue-subtle: #eff6ff; + --rail-blue-border: #bfdbfe; + + --rail-cyan: #0284c7; + --rail-cyan-light: #06b6d4; + --cyan-subtle: #f0f9ff; + --cyan-border: #bae6fd; + + /* 背景系统 */ + --bg-canvas: #f8fafc; + --bg-surface: #ffffff; + --bg-subtle: #f1f5f9; + --bg-muted: #e2e8f0; + + /* 文本系统 */ + --text-primary: #0f172a; + --text-secondary: #334155; + --text-muted: #64748b; + --text-inverse: #ffffff; + + /* 状态颜色 */ + --pass-color: #059669; + --pass-bg: #ecfdf5; + --pass-border: #a7f3d0; + + --pending-color: #d97706; + --pending-bg: #fffbeb; + --pending-border: #fde68a; + + --danger-color: #dc2626; + --danger-bg: #fef2f2; + --danger-border: #fecaca; + + --info-color: #0284c7; + --info-bg: #f0f9ff; + --info-border: #bae6fd; + + /* 边框与阴影 */ + --border-light: #e2e8f0; + --border-medium: #cbd5e1; + --border-strong: #94a3b8; + + --radius-xs: 4px; + --radius-sm: 6px; + --radius-md: 10px; + --radius-lg: 14px; + --radius-full: 9999px; + + --shadow-subtle: 0 1px 2px 0 rgba(15, 23, 42, 0.04); + --shadow-card: 0 1px 3px 0 rgba(15, 23, 42, 0.06), 0 1px 2px -1px rgba(15, 23, 42, 0.04); + --shadow-card-hover: 0 8px 16px -2px rgba(15, 23, 42, 0.08), 0 4px 6px -2px rgba(15, 23, 42, 0.04); + --shadow-drawer: -4px 0 24px rgba(15, 23, 42, 0.12); + --shadow-modal: 0 20px 25px -5px rgba(15, 23, 42, 0.1), 0 8px 10px -6px rgba(15, 23, 42, 0.06); + + /* 排版尺寸 */ + --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, Arial, sans-serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + + --container-max: 1240px; + --prose-max: 780px; +} + +/* Reset & Base */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + font-size: 16px; + scroll-behavior: smooth; +} + +body { + background-color: var(--bg-canvas); + color: var(--text-primary); + font-family: var(--font-sans); + line-height: 1.75; + font-size: 0.95rem; + min-height: 100vh; + display: flex; + flex-direction: column; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + color: var(--rail-blue); + text-decoration: none; + transition: color 0.15s ease; +} + +a:hover { + color: var(--rail-blue-800); +} + +/* 顶部导航栏 (Navbar) */ +.navbar { + background: rgba(255, 255, 255, 0.94); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border-bottom: 1px solid var(--border-light); + position: sticky; + top: 0; + z-index: 100; + padding: 0.65rem 2rem; + display: flex; + justify-content: space-between; + align-items: center; + box-shadow: var(--shadow-subtle); +} + +.nav-brand-wrap { + display: flex; + align-items: center; + gap: 1rem; +} + +.nav-brand { + display: flex; + align-items: center; + gap: 0.75rem; + text-decoration: none; + color: var(--text-primary); +} + +.nav-brand svg { + width: 28px; + height: 28px; + fill: var(--rail-blue); + flex-shrink: 0; +} + +.brand-title { + font-size: 1.15rem; + font-weight: 700; + color: var(--navy-900); + letter-spacing: -0.01em; + display: flex; + align-items: baseline; + gap: 0.4rem; +} + +.brand-sub { + font-size: 0.78rem; + color: var(--text-muted); + font-weight: 500; +} + +.brand-pill { + font-size: 0.72rem; + color: var(--pass-color); + background: var(--pass-bg); + border: 1px solid var(--pass-border); + padding: 2px 8px; + border-radius: var(--radius-full); + font-weight: 600; + display: inline-flex; + align-items: center; + gap: 4px; +} + +.brand-pill::before { + content: ''; + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--pass-color); +} + +.nav-menu { + display: flex; + gap: 0.25rem; + align-items: center; + list-style: none; + flex-wrap: wrap; +} + +.nav-link { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.38rem 0.65rem; + font-size: 0.83rem; + font-weight: 500; + color: var(--text-secondary); + border-radius: var(--radius-sm); + transition: all 0.15s ease; + border: 1px solid transparent; + white-space: nowrap; +} + +.nav-link:hover { + color: var(--rail-blue); + background: var(--bg-subtle); +} + +.nav-link.active { + color: var(--rail-blue); + background: var(--rail-blue-subtle); + border-color: var(--rail-blue-border); + font-weight: 600; +} + +.nav-handbook-link { + font-size: 0.82rem; + color: var(--navy-800); + background: var(--bg-subtle); + border: 1px solid var(--border-light); + padding: 0.38rem 0.65rem; + border-radius: var(--radius-sm); + font-weight: 500; + display: inline-flex; + align-items: center; + gap: 0.2rem; + white-space: nowrap; + transition: all 0.15s ease; +} + +.nav-handbook-link:hover { + background: var(--rail-blue-subtle); + color: var(--rail-blue); + border-color: var(--rail-blue-border); +} + +/* 下拉菜单 (Dropdown) */ +.nav-dropdown { + position: relative; +} + +.dropdown-trigger { + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 0.3rem; + padding: 0.45rem 0.85rem; + font-size: 0.88rem; + font-weight: 500; + color: var(--text-secondary); + border-radius: var(--radius-sm); + border: 1px solid transparent; + background: transparent; +} + +.dropdown-trigger:hover, +.nav-dropdown:hover .dropdown-trigger { + color: var(--rail-blue); + background: var(--bg-subtle); +} + +.dropdown-trigger svg { + width: 14px; + height: 14px; + fill: currentColor; + transition: transform 0.2s ease; +} + +.nav-dropdown:hover .dropdown-trigger svg { + transform: rotate(180deg); +} + +.dropdown-menu { + position: absolute; + top: 100%; + right: 0; + margin-top: 0.35rem; + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + box-shadow: var(--shadow-modal); + min-width: 200px; + padding: 0.4rem 0; + list-style: none; + opacity: 0; + visibility: hidden; + transform: translateY(-6px); + transition: all 0.18s ease; + z-index: 200; +} + +.nav-dropdown:hover .dropdown-menu, +.nav-dropdown:focus-within .dropdown-menu { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +.dropdown-item a { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.55rem 1rem; + font-size: 0.85rem; + color: var(--text-secondary); +} + +.dropdown-item a:hover { + background: var(--rail-blue-subtle); + color: var(--rail-blue); +} + +.dropdown-divider { + height: 1px; + background: var(--border-light); + margin: 0.35rem 0; +} + +.nav-back-link { + font-size: 0.82rem; + color: var(--text-muted); + padding: 0.4rem 0.75rem; + border-radius: var(--radius-sm); + border: 1px solid var(--border-light); + background: var(--bg-surface); +} + +.nav-back-link:hover { + background: var(--bg-subtle); + color: var(--text-primary); +} + +/* 页面主布局 */ +.page-container { + max-width: var(--container-max); + margin: 0 auto; + padding: 2.5rem 1.75rem 4rem; + width: 100%; + flex: 1; +} + +/* 页面 Hero 头部 */ +.page-hero { + margin-bottom: 2.75rem; +} + +.hero-pretitle { + display: inline-flex; + align-items: center; + gap: 0.4rem; + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--rail-blue); + background: var(--rail-blue-subtle); + border: 1px solid var(--rail-blue-border); + padding: 0.25rem 0.75rem; + border-radius: var(--radius-full); + margin-bottom: 0.85rem; +} + +.hero-title-main { + font-size: 2.4rem; + font-weight: 700; + line-height: 1.25; + color: var(--navy-900); + letter-spacing: -0.02em; + margin-bottom: 0.75rem; +} + +.hero-lead-text { + font-size: 1.05rem; + line-height: 1.8; + color: var(--text-secondary); + max-width: var(--prose-max); +} + +.hero-meta-bar { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 1.25rem; + margin-top: 1.25rem; + padding-top: 1.25rem; + border-top: 1px solid var(--border-light); + font-size: 0.85rem; + color: var(--text-muted); +} + +.hero-meta-item { + display: inline-flex; + align-items: center; + gap: 0.35rem; +} + +.hero-meta-item strong { + color: var(--text-primary); + font-weight: 600; +} + +/* 状态徽章 (Badge System) - 克制规范 */ +.badge { + display: inline-flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + font-weight: 600; + padding: 0.2rem 0.6rem; + border-radius: var(--radius-full); + line-height: 1.2; + white-space: nowrap; +} + +.badge-pass, .badge-success { + color: var(--pass-color); + background: var(--pass-bg); + border: 1px solid var(--pass-border); +} + +.badge-pending, .badge-warning { + color: var(--pending-color); + background: var(--pending-bg); + border: 1px solid var(--pending-border); +} + +.badge-blocked, .badge-danger { + color: var(--danger-color); + background: var(--danger-bg); + border: 1px solid var(--danger-border); +} + +.badge-info { + color: var(--info-color); + background: var(--info-bg); + border: 1px solid var(--info-border); +} + +.badge-neutral { + color: var(--navy-700); + background: var(--bg-subtle); + border: 1px solid var(--border-light); +} + +.badge-reserved { + color: #6366f1; + background: #eef2ff; + border: 1px solid #c7d2fe; +} + +/* 指标卡片网格 (Dashboard KPI Grid) */ +.kpi-dashboard { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 1rem; + margin-bottom: 2.5rem; +} + +.kpi-card { + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + padding: 1.2rem 1.25rem; + transition: transform 0.15s ease, box-shadow 0.15s ease; + box-shadow: var(--shadow-card); +} + +.kpi-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-card-hover); +} + +.kpi-value { + font-size: 1.85rem; + font-weight: 700; + line-height: 1.2; + color: var(--navy-900); + font-feature-settings: "tnum"; + font-variant-numeric: tabular-nums; + margin-bottom: 0.35rem; +} + +.kpi-card.kpi-pass .kpi-value { + color: var(--pass-color); +} + +.kpi-card.kpi-pending .kpi-value { + color: var(--pending-color); +} + +.kpi-card.kpi-info .kpi-value { + color: var(--rail-blue); +} + +.kpi-label { + font-size: 0.82rem; + color: var(--text-muted); + font-weight: 500; +} + +.kpi-sub { + font-size: 0.72rem; + color: var(--text-muted); + margin-top: 0.35rem; +} + +/* 核心内容分块 (Section Block) */ +.content-section { + margin-bottom: 3.5rem; +} + +.section-header { + margin-bottom: 1.5rem; + display: flex; + justify-content: space-between; + align-items: flex-end; + border-bottom: 1px solid var(--border-light); + padding-bottom: 0.75rem; +} + +.section-title { + font-size: 1.45rem; + font-weight: 700; + color: var(--navy-900); + display: flex; + align-items: center; + gap: 0.6rem; +} + +.section-subtitle { + font-size: 0.88rem; + color: var(--text-muted); + margin-top: 0.25rem; + max-width: var(--prose-max); +} + +/* 卡片系统 (Card Grid) */ +.card-grid-2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; +} + +.card-grid-3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.25rem; +} + +.card-grid-4 { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1.25rem; +} + +@media (max-width: 1100px) { + .card-grid-4 { grid-template-columns: repeat(2, 1fr); } + .card-grid-3 { grid-template-columns: repeat(2, 1fr); } +} + +@media (max-width: 768px) { + .card-grid-2, .card-grid-3, .card-grid-4 { grid-template-columns: 1fr; } + .page-container { padding: 1.5rem 1rem 3rem; } + .navbar { padding: 0.65rem 1rem; } + .hero-title-main { font-size: 1.85rem; } +} + +.standard-card { + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + padding: 1.5rem; + box-shadow: var(--shadow-card); + transition: all 0.2s ease; + display: flex; + flex-direction: column; +} + +.standard-card:hover { + border-color: var(--border-medium); + box-shadow: var(--shadow-card-hover); +} + +.card-top { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 0.85rem; +} + +.card-title-wrap { + display: flex; + align-items: center; + gap: 0.65rem; +} + +.card-icon-box { + width: 36px; + height: 36px; + border-radius: var(--radius-sm); + background: var(--rail-blue-subtle); + color: var(--rail-blue); + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 1.1rem; + flex-shrink: 0; +} + +.card-title { + font-size: 1.08rem; + font-weight: 600; + color: var(--navy-900); +} + +.card-code { + font-family: var(--font-mono); + font-size: 0.76rem; + color: var(--text-muted); +} + +.card-body-text { + font-size: 0.88rem; + color: var(--text-secondary); + line-height: 1.7; + margin-bottom: 1.25rem; + flex: 1; +} + +.card-footer-action { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 1rem; + border-top: 1px solid var(--border-light); + font-size: 0.82rem; +} + +/* 手风琴折叠面板 (Accordion) */ +.accordion-item { + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + margin-bottom: 0.85rem; + overflow: hidden; + transition: border-color 0.15s ease; +} + +.accordion-item:hover { + border-color: var(--border-medium); +} + +.accordion-header { + padding: 1rem 1.35rem; + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; + user-select: none; + background: var(--bg-surface); + transition: background 0.15s ease; +} + +.accordion-header:hover { + background: var(--bg-subtle); +} + +.accordion-title-group { + display: flex; + align-items: center; + gap: 0.85rem; +} + +.accordion-arrow { + width: 18px; + height: 18px; + fill: var(--text-muted); + transition: transform 0.25s ease; +} + +.accordion-item.open .accordion-arrow { + transform: rotate(180deg); +} + +.accordion-body { + display: none; + padding: 1.25rem 1.35rem 1.5rem; + border-top: 1px solid var(--border-light); + background: #fafcff; + font-size: 0.9rem; + line-height: 1.75; + color: var(--text-secondary); +} + +.accordion-item.open .accordion-body { + display: block; +} + +/* 步骤进度条 (Progress Stepper) */ +.stepper-container { + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius-lg); + padding: 2rem 2.25rem; + box-shadow: var(--shadow-card); + margin-bottom: 2rem; +} + +.stepper-list { + display: flex; + flex-direction: column; + gap: 0; + position: relative; +} + +.step-row { + display: flex; + position: relative; + padding-bottom: 2rem; +} + +.step-row:last-child { + padding-bottom: 0; +} + +.step-indicator { + display: flex; + flex-direction: column; + align-items: center; + margin-right: 1.5rem; + position: relative; +} + +.step-circle { + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.85rem; + font-weight: 700; + z-index: 2; + background: var(--bg-surface); + border: 2px solid var(--border-medium); + color: var(--text-muted); +} + +.step-row.done .step-circle { + background: var(--pass-color); + border-color: var(--pass-color); + color: #fff; +} + +.step-row.in-progress .step-circle { + background: var(--rail-blue); + border-color: var(--rail-blue); + color: #fff; + box-shadow: 0 0 0 4px var(--rail-blue-subtle); +} + +.step-row.pending .step-circle { + background: var(--bg-subtle); + border-color: var(--border-medium); + color: var(--text-muted); +} + +.step-line { + position: absolute; + top: 32px; + bottom: 0; + width: 2px; + background: var(--border-light); + z-index: 1; +} + +.step-row:last-child .step-line { + display: none; +} + +.step-row.done .step-line { + background: var(--pass-border); +} + +.step-content { + flex: 1; + padding-top: 0.2rem; +} + +.step-header-line { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.35rem; +} + +.step-name { + font-size: 1.02rem; + font-weight: 600; + color: var(--navy-900); +} + +.step-desc { + font-size: 0.85rem; + color: var(--text-muted); + line-height: 1.6; +} + +/* 抽屉组件 (Drawer) */ +.drawer-backdrop { + position: fixed; + top: 0; left: 0; right: 0; bottom: 0; + background: rgba(15, 23, 42, 0.45); + backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + z-index: 1000; + opacity: 0; + visibility: hidden; + transition: all 0.25s ease; +} + +.drawer-backdrop.active { + opacity: 1; + visibility: visible; +} + +.drawer-panel { + position: fixed; + top: 0; right: 0; bottom: 0; + width: 540px; + max-width: 90vw; + background: var(--bg-surface); + box-shadow: var(--shadow-drawer); + z-index: 1001; + transform: translateX(100%); + transition: transform 0.28s cubic-bezier(0.16, 1, 0.3, 1); + display: flex; + flex-direction: column; +} + +.drawer-backdrop.active .drawer-panel { + transform: translateX(0); +} + +.drawer-header { + padding: 1.35rem 1.75rem; + border-bottom: 1px solid var(--border-light); + display: flex; + justify-content: space-between; + align-items: center; +} + +.drawer-title { + font-size: 1.25rem; + font-weight: 700; + color: var(--navy-900); +} + +.drawer-close { + background: transparent; + border: 0; + font-size: 1.5rem; + line-height: 1; + color: var(--text-muted); + cursor: pointer; + padding: 0.25rem; + border-radius: var(--radius-sm); + transition: color 0.15s ease; +} + +.drawer-close:hover { + color: var(--navy-900); + background: var(--bg-subtle); +} + +.drawer-body { + padding: 1.75rem; + overflow-y: auto; + flex: 1; + font-size: 0.9rem; + line-height: 1.75; + color: var(--text-secondary); +} + +.drawer-section { + margin-bottom: 1.5rem; +} + +.drawer-section-title { + font-size: 0.8rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--navy-700); + margin-bottom: 0.5rem; + border-bottom: 1px dashed var(--border-light); + padding-bottom: 0.25rem; +} + +/* 代码与表格样式 */ +pre, code { + font-family: var(--font-mono); +} + +code { + font-size: 0.85em; + background: var(--bg-subtle); + color: var(--navy-800); + padding: 0.15em 0.4em; + border-radius: var(--radius-xs); + border: 1px solid var(--border-light); +} + +pre { + background: #0f172a; + color: #e2e8f0; + padding: 1rem 1.25rem; + border-radius: var(--radius-md); + overflow-x: auto; + font-size: 0.84rem; + line-height: 1.65; + margin: 0.75rem 0; +} + +pre code { + background: transparent; + color: inherit; + padding: 0; + border: 0; +} + +.data-table-wrap { + width: 100%; + overflow-x: auto; + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + background: var(--bg-surface); + margin: 1rem 0; +} + +.data-table { + width: 100%; + border-collapse: collapse; + font-size: 0.86rem; + text-align: left; +} + +.data-table th { + background: var(--bg-subtle); + color: var(--navy-900); + font-weight: 600; + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-light); + white-space: nowrap; +} + +.data-table td { + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-light); + color: var(--text-secondary); +} + +.data-table tr:last-child td { + border-bottom: 0; +} + +.data-table tr:hover td { + background: #fbfcfe; +} + +/* 按钮规范 */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.45rem; + padding: 0.55rem 1.15rem; + font-size: 0.88rem; + font-weight: 600; + border-radius: var(--radius-sm); + cursor: pointer; + transition: all 0.15s ease; + border: 1px solid transparent; +} + +.btn-primary { + background: var(--rail-blue); + color: #fff; + box-shadow: 0 1px 2px rgba(29, 78, 216, 0.2); +} + +.btn-primary:hover { + background: var(--rail-blue-800); + color: #fff; +} + +.btn-secondary { + background: var(--bg-surface); + border-color: var(--border-medium); + color: var(--text-secondary); +} + +.btn-secondary:hover { + background: var(--bg-subtle); + color: var(--navy-900); + border-color: var(--border-strong); +} + +/* 页脚 */ +.site-footer { + border-top: 1px solid var(--border-light); + background: var(--bg-surface); + padding: 2rem 2rem; + text-align: center; + font-size: 0.84rem; + color: var(--text-muted); + margin-top: auto; +} + +.site-footer p { + line-height: 1.8; +} + +.site-footer a { + color: var(--rail-blue); + text-decoration: underline; + text-underline-offset: 3px; +} diff --git a/docs/visual/assets/docs.js b/docs/visual/assets/docs.js new file mode 100644 index 000000000..270870b75 --- /dev/null +++ b/docs/visual/assets/docs.js @@ -0,0 +1,105 @@ +/** + * RailwaySystem - Visual Portal Common Interactive Engine v2.0 + * 纯静态 · 离线友好 · 零网络 CDN 依赖 + */ + +const GITLAB_DOCS_BASE = "http://192.168.139.218:9980/sict/railwaysystem/-/blob/feat/cicd-pipeline/"; + +document.addEventListener('DOMContentLoaded', () => { + // 1. 导航栏高亮当前页面 + const currentPath = window.location.pathname.split('/').pop() || 'index.html'; + document.querySelectorAll('.nav-link, .dropdown-item a').forEach(link => { + const href = link.getAttribute('href'); + if (href === currentPath || (currentPath === '' && href === 'index.html')) { + link.classList.add('active'); + } + }); + + // 2. 文档跳转拦截与 GitLab 自动重定向保护 + document.querySelectorAll('a').forEach(anchor => { + const href = anchor.getAttribute('href'); + if (href && href.includes('.md')) { + anchor.setAttribute('target', '_blank'); + anchor.setAttribute('rel', 'noopener noreferrer'); + // 如果仍有相对路径,自动转换为 GitLab 远程在线路径 + if (!href.startsWith('http://') && !href.startsWith('https://')) { + let cleanRel = href.replace(/^(\.\.\/)+/, ''); + if (!cleanRel.startsWith('docs/')) { + cleanRel = 'docs/' + cleanRel; + } + anchor.setAttribute('href', GITLAB_DOCS_BASE + cleanRel); + } + } + }); + + // 3. 抽屉 (Drawer) 机制 + const drawerBackdrop = document.getElementById('drawer-backdrop'); + const drawerCloseBtn = document.getElementById('drawer-close-btn'); + + window.openDrawer = function(title, contentHtml) { + const drawerTitle = document.getElementById('drawer-title'); + const drawerBody = document.getElementById('drawer-body'); + if (drawerTitle) drawerTitle.textContent = title; + if (drawerBody) drawerBody.innerHTML = contentHtml; + if (drawerBackdrop) { + drawerBackdrop.classList.add('active'); + document.body.style.overflow = 'hidden'; + } + }; + + window.closeDrawer = function() { + if (drawerBackdrop) { + drawerBackdrop.classList.remove('active'); + document.body.style.overflow = ''; + } + }; + + if (drawerCloseBtn) { + drawerCloseBtn.addEventListener('click', window.closeDrawer); + } + + if (drawerBackdrop) { + drawerBackdrop.addEventListener('click', (e) => { + if (e.target === drawerBackdrop) { + window.closeDrawer(); + } + }); + } + + // ESC 键关闭抽屉或弹窗 + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + window.closeDrawer(); + window.closeModal && window.closeModal(); + } + }); + + // 4. 手风琴折叠面板 (Accordion) + document.querySelectorAll('.accordion-header').forEach(header => { + header.addEventListener('click', () => { + const item = header.closest('.accordion-item'); + if (item) { + item.classList.toggle('open'); + } + }); + }); + + // 5. 选项卡 (Tabs) 切换 + document.querySelectorAll('.tab-trigger').forEach(tab => { + tab.addEventListener('click', () => { + const tabGroup = tab.getAttribute('data-tab-group'); + const targetId = tab.getAttribute('data-target'); + + // 切换触发器状态 + document.querySelectorAll(`.tab-trigger[data-tab-group="${tabGroup}"]`).forEach(t => t.classList.remove('active')); + tab.classList.add('active'); + + // 切换内容面板 + document.querySelectorAll(`.tab-panel[data-tab-group="${tabGroup}"]`).forEach(p => p.style.display = 'none'); + const targetPanel = document.getElementById(targetId); + if (targetPanel) { + targetPanel.style.display = 'block'; + } + }); + }); +}); diff --git a/docs/visual/business-flow.html b/docs/visual/business-flow.html new file mode 100644 index 000000000..a27ff3a24 --- /dev/null +++ b/docs/visual/business-flow.html @@ -0,0 +1,688 @@ + + + + + + 业务全景与状态机 - RailwaySystem 铁路智慧培训管理系统 + + + + + + + + + + +
+ +
+
Business Process Architecture
+

业务全景流程与状态机

+

+ 主视觉聚焦于基础资源编排至结训考核的线性主脉络,解耦呈现后勤住宿支线与电子班牌硬件支撑层。点击任意节点可展开查看其状态机、业务约束与技术契约。 +

+
+ + +
+
+
+

全业务生命周期协同拓扑

+

点击拓扑节点查看抽屉详情,支持键盘 ESC 快速退出

+
+
+ 主干链路 + 住宿支线 + 班牌支撑 +
+
+ +
+ + + + + + + + + + + + + + + + CORE TRAINING LIFECYCLE (核心业务主脉络) + + + LOGISTICS BRANCH (后勤住宿支线) + + + FACILITIES LAYER (电子班牌显示支撑层) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1. 基础资源 + 师资/教室/场地 + + + + + + 2. 开班计划 + 拟定班期/容量 + + + + + + 3. 本期课程 + 师资绑定/学时 + + + + + + 4. 参训人员 + 名单导入/防超限 + + + + + + 5. 排课准备 + 四维预检/XOR互斥 + + + + + + 6. 开班报到 + 现场核验/状态联动 + + + + + + 7. 正式培训 + 课表执行/课次授课 + + + + + + 8. 课程考勤 + 签到签退/留痕修正 + + + + + + 9.结训 + 保护 + + + + + + 后勤住宿准备 (支线) + 住宿标记 · 房间分配 · 入住 + + + + + + 电子班牌终端映射 (支撑层) + UUID主键 · 教室绑定0/1/N · 课表降级 + + +
+
+ + +
+
+
+

业务主链环节与支线速览

+

点击任意卡片即可在右侧展开该环节的角色、规则约束、状态机流转与物理接口。

+
+
+ +
+
+
+ 环节 1 · 主干 + Master Data +
+

基础资源录入与治理

+

建立教师、学员主档、标准化课程、理论教室与演练场地。强校验手机号唯一性与脱敏存储。

+
点击查看规则 →
+
+ +
+
+ 环节 2 · 主干 + Plan Lifecycle +
+

开班计划拟定

+

生成 32 位 UUID 计划,强制初始状态为 0:草稿。校验起止日期有效性与招生容量。

+
点击查看规则 →
+
+ +
+
+ 环节 3 · 主干 + Plan Courses +
+

本期课程与师资绑定

+

建立计划与课程的 N:M 关联,指定主讲教师,系统自动汇总开班总学时并保持数据一致性。

+
点击查看规则 →
+
+ +
+
+ 环节 4 · 主干 + Enrollment Guard +
+

参训人员入班与防超额

+

学员初始参训状态为 0:待报到。严格校验容量上限 (40031) 及重复报名拦截 (40030)。

+
点击查看规则 →
+
+ +
+
+ 环节 5 · 主干 + Scheduling Engine +
+

排课四维冲突预检

+

智能检测教师时段、场地占用与班级重叠。支持 Warning 级别确认保存,硬阻断场地 XOR 互斥。

+
点击查看规则 →
+
+ +
+
+ 环节 6 · 主干 + Report Confirm +
+

现场开班报到确认

+

核验报到时限与资格,强事务联动学员状态至 1:已报到,并记录精确报到时间,防重复报到。

+
点击查看规则 →
+
+ +
+
+ 环节 8 · 主干 + Attendance Actions +
+

课堂考勤打卡与审计

+

签到签退幂等性保证,重复签到签退保留初次时间。人工代签/补签自动记录 manual_flag=1 审计留痕。

+
点击查看规则 →
+
+ +
+
+ 环节 9 · 主干 + Plan Complete +
+

结训流转与退训保护

+

计划流转为 2:已结束,在读活动学员自动批量流转为 4:已完成。历史退训记录严格锁定防破坏。

+
点击查看规则 →
+
+ +
+
+ 支线 · 后勤 + Accommodation +
+

后勤住宿管理支线

+

学员报名时勾选 accommodationRequired 触发宿舍分配,管理房间可用床位与入住注销。

+
点击查看支线 →
+
+ +
+
+ 支撑 · 物联 + Electronic Board +
+

电子班牌显示支撑层

+

教室绑定 0/1/N 班牌关系,课表 timetable 智能降级映射 boardSn,支持逻辑删除保护。

+
点击查看支撑 →
+
+
+
+ +
+ + +
+
+
+

节点详情

+ +
+
+ +
+
+
+ + + + + + + diff --git a/docs/visual/data-model.html b/docs/visual/data-model.html new file mode 100644 index 000000000..069c812f5 --- /dev/null +++ b/docs/visual/data-model.html @@ -0,0 +1,658 @@ + + + + + + 核心数据模型与实体关系 (ER) - RailwaySystem 铁路智慧培训管理系统 + + + + + + + + + + +
+ +
+
Entity Relationship & Persistence
+

核心业务实体关系模型 (ER)

+

+ 聚焦于 10 大核心教务实体的关联拓扑与物理约束。杜绝平铺冗长数据库大表,点击任意实体卡片或图谱节点即可查看物理表名、PK主键生成机制、外键引用与唯一性约束。 +

+
+ + +
+
+
+

10 大核心教务实体关系拓扑

+

点击实体节点展开物理表与约束细节

+
+
+ 1:N 一对多关联 · N:M 多对多关联 · XOR 互斥排他 +
+
+ +
+ + + + + + + + + + + 1:N + + + + 1:N + + + + 1:N + + + + 1:N + + + + 1:N + + + + XOR + + + + XOR + + + + 1:1 + + + + + + + 1:N + + + + + + Plan (培训计划) + PK: plan_id (UUID) + plan_status, recruit_num + + + + + + + PlanCourse (计划课程) + PK: plan_course_id + FK: plan_id, c_id, t_id + + + + + + + Course (课程大纲) + PK: c_id + c_code (UK), c_duration + + + + + + + Student (学员档案) + PK: s_id (UUID) + id_card_last4, status + + + + + + + Enrollment (参训名单) + PK: enrollment_id + UK(plan_id, student_id) + + + + + + + Lesson (排课课次) + PK: lesson_id + venue_type (XOR互斥) + + + + + + + Classroom (理论教室) + PK: class_room_id, capacity + + + + + + + Site (实训场地) + PK: site_id (UUID), capacity + + + + + + + Report (现场报到) + PK: report_id + FK: enrollment_id, time + + + + + + + Checkin (课堂考勤) + PK: checkin_id + FK: enrollment_id, lesson_id + + +
+
+ + +
+
+
+

10 大核心实体物理映射与核心约束

+

点击卡片可快速展开物理表结构、主键生成机制与外键约束详情。

+
+
+ +
+
+
+ 实体 1 + train_class_plan +
+

培训班计划 (ClassPlan)

+

主键为 32 位 UUID,严格维护起止时间窗口与生命周期状态(0草稿/1进行中/2已结束)。

+
查看物理定义 →
+
+ +
+
+ 实体 2 + train_plan_course +
+

计划绑定课程 (PlanCourse)

+

班级与课程 N:M 映射枢纽,关联授课教师,外键依赖计划与课程主表。

+
查看物理定义 →
+
+ +
+
+ 实体 3 + train_course +
+

课程主档 (Course)

+

课程编码全局唯一(c_code),维护理论学时与实操学时,供开班总学时累加。

+
查看物理定义 →
+
+ +
+
+ 实体 4 + train_enrollment +
+

参训报名名单 (Enrollment)

+

物理唯一约束 uk_plan_student 杜绝重复入班,维护学员在班级的参训状态流转。

+
查看物理定义 →
+
+ +
+
+ 实体 5 + train_student +
+

学员基础档案 (Student)

+

32位UUID主键,身份证密文哈希存储与末4位掩码展示,维护学员主档状态(1正常/0停用)。

+
查看物理定义 →
+
+ +
+
+ 实体 6 + train_lesson +
+

排课课次 (Lesson)

+

上课时段与师资配置,严格校验场地 XOR 互斥约束,禁止跨计划绑定课程。

+
查看物理定义 →
+
+ +
+
+ 实体 7 + train_classroom_info +
+

理论教室 (Classroom)

+

主键 class_room_id,维护物理容量上限与可用状态,支撑 0/1/N 电子班牌挂载。

+
查看物理定义 →
+
+ +
+
+ 实体 8 + train_training_site +
+

实训演练场地 (Site)

+

主键 32 位 UUID,维护专业演练场地类型与最大容量,排课中参与场地互斥冲突校验。

+
查看物理定义 →
+
+ +
+
+ 实体 9 + train_class_report +
+

现场开班报到流水 (Report)

+

学员现场核验凭证,外键强关联 enrollment_id,报到成功强事务联动学员参训状态为已报到。

+
查看物理定义 →
+
+ +
+
+ 实体 10 + train_student_checkin +
+

课次考勤打卡 (StudentCheckin)

+

记录学员课次打卡时间,保障签到签退幂等性防覆盖,人工代签自动置 manual_flag=1 审计留痕。

+
查看物理定义 →
+
+
+
+ + +
+
+
+
+ 完整 21 张物理业务表 + 查看系统全量数据表归属与数据库事实源索引 +
+ +
+
+

+ 系统一期由 21 张培训业务表 (train_*) 与 8 张平台底座权限审计表 (sys_*) 构成,表清单契约与 DDL 严格冻结于 docs/database-v2/ 目录下: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表分类物理表清单职责描述事实源文件
基础资料表 (9)train_teacher, train_student, train_course, train_resource, train_course_resource, train_classroom_info, train_training_site, train_electronic_board, train_dormitory_info师资、学员、课程、统一资源、教室、场地、班牌设备、宿舍房间基础信息docs/database-v2/01_table_inventory.md
培训组织表 (4)train_class_plan, train_plan_course, train_enrollment, train_lesson开班计划、课程绑定、参训报名名单、教学活动课次核心教务编排docs/database-v2/01_table_inventory.md
培训执行表 (4)train_accommodation, train_dorm_auth, train_class_report, train_student_checkin学员住宿安排、门禁授权同步、现场报到核验、课次打卡考勤流水docs/database-v2/01_table_inventory.md
培训结果表 (4)train_score_item, train_student_score, train_study_duration, train_student_portrait考核项配置、学员单项成绩、自主学时、学员全期画像评估 (只读模型 PASS)docs/database-v2/01_table_inventory.md
系统底座表 (8)sys_user, sys_role, sys_menu, sys_dept, sys_oper_log, sys_logininfor, sys_dict_type, sys_dict_dataRBAC 鉴权、路由菜单、操作审计日志与系统字典底座docs/database-v2/00_init_ruoyi_sys.sql
+
+
+ 查阅数据库全量设计手册 → +
+
+
+
+ +
+ + +
+
+
+

实体定义

+ +
+
+ +
+
+
+ + + + + + + + diff --git a/docs/visual/deployment.html b/docs/visual/deployment.html new file mode 100644 index 000000000..466d4bdb5 --- /dev/null +++ b/docs/visual/deployment.html @@ -0,0 +1,328 @@ + + + + + + 部署拓扑与发布增量 Delta - RailwaySystem 铁路智慧培训管理系统 + + + + + + + + + + +
+ +
+
Production Deployment & Delta
+

生产部署拓扑与脚本 Delta

+

+ 默认仅呈现生产目标极简标准拓扑链路:User → Frontend (8082) → Backend (8092) → Kingbase / Redis。复杂的开发隧道端口与迁移文件名折叠收录于技术细节中。 +

+
+ + +
+
+ DO NOT EXECUTE 严禁执行 +
+ 历史业务字典脚本 (RuoYi-Vue/sql/train/v2/007_dicts.sql) 本次发布严禁执行! 该脚本作为历史 V2 字典初始化资产存档,当前发布不包含且无需执行。 +
+
+ 仅执行增量 001~003 +
+ + +
+
+
+

生产目标部署标准拓扑 (Production Topology)

+

纯粹生产网络走向,无中间干扰项

+
+ 标准四层链路 +
+ +
+ + + + + + + + + + + 终端客户端浏览器 (Client Browser) + + + + + HTTPS / HTTP (80/443) + + + + + 生产前端静态容器 (Nginx 反向代理) + 目标端口: 8082 · Vue 2.6 SPA 编译产物 + + + + + /prod-api/ 反向代理 + + + + + 生产后端单体服务 (Spring Boot 2.5.15) + 目标端口: 8092 · RuoYi-Vue 业务核心 JAR + + + + + + + + + + KingbaseES (生产主库) + V009R003C018 · 21张业务表 + + + + + + Redis (缓存与会话) + Token 校验 · 验证码防重放 + + +
+
+ + +
+
+
+

发布数据库增量变更 (Release Delta)

+

本次生产升级仅需依次执行 3 个幂等增量脚本,保障历史业务数据零丢失。

+
+ 3 Required Migrations +
+ +
+
+

3 Required Migrations (必须且仅执行)

+ DELTA = 3 +
+

+ 生产环境已具备完整基础 Schema,本次升级严格限定于 3 个增量脚本,顺序执行即可完成日志耗时字段补齐、分析域权限闭环与报到考勤写权限补全: +

+ + +
+
+
+ 001 + 001_sys_oper_log_cost_time.sql (操作日志耗时字段补丁) +
+ +
+
+

作用:为系统操作日志表 sys_oper_log 补齐缺失的 cost_time 耗时字段 (BIGINT DEFAULT 0),对已有存量记录执行补偿归零初始化。

+

执行方式:\i RuoYi-Vue/sql/system/kingbase/001_sys_oper_log_cost_time.sql

+
+
+ +
+
+
+ 002 + 002_legacy_analytics_permissions.sql (分析域菜单与RBAC导出权限闭环) +
+ +
+
+

作用:为培训分析域四大报表页面(Report、Checkin、Duration、Portrait)注入规范的 RBAC 导出权限与按钮(分配 menu_id 2177~2180),并校验父级菜单与防孤儿角色映射。

+

执行方式:\i RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql

+
+
+ +
+
+
+ 003 + 003_report_attendance_action_permissions.sql (报到与考勤动作权限闭环) +
+ +
+
+

作用:补齐现场报到确认 (train:report:confirm 2181)、考勤打卡录入 (train:attendance:checkin 2182) 与状态修改 (train:attendance:edit 2183) 动作权限,确保强写操作受到权限拦截保护。

+

执行方式:\i RuoYi-Vue/sql/system/kingbase/003_report_attendance_action_permissions.sql

+
+
+
+
+ + +
+
+
+

技术底层细节与开发环境映射 (Technical Details)

+

收录研发跳板机隧道、调试端口、心跳探测契约与运维排障细节。

+
+
+ +
+
+
+ 端口与隧道映射 + 查看开发/测试/生产各环境端口配置与真实心跳探测契约 +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
组件名称生产标准端口本地/研发测试端口健康心跳探测规范备注说明
前端 Web 应用80828080 (开发 dev-server)GET / (HTTP 200)Vue 2.6 单页应用,Nginx 反向代理
后端 API 服务80928090 / 8094 (独立实例)GET /login (HTTP 200)Spring Boot JAR,无 actuator 依赖,探测登录接口
KingbaseES 主库物理直连端口127.0.0.1:4321 (SSH隧道)SELECT 1 FROM DUAL通过安全跳板机建立隧道映射进行集成验证
Redis 缓存6379127.0.0.1:6379PING -> PONG存储用户 JWT 令牌与防重放临时验证码
+
+
+
+
+ +
+ + + + + + + diff --git a/docs/visual/favicon.ico b/docs/visual/favicon.ico new file mode 100644 index 000000000..e69de29bb diff --git a/docs/visual/index.html b/docs/visual/index.html new file mode 100644 index 000000000..b1606886b --- /dev/null +++ b/docs/visual/index.html @@ -0,0 +1,601 @@ + + + + + + RailwaySystem 铁路智慧培训管理系统 - 数字化交付门户 + + + + + + + + + + +
+ + +
+
+ 一期核心交付工程 + · + 候选发布版 (Final Candidate) +
+

RailwaySystem 铁路智慧培训管理系统

+

+ 面向铁路培训基地,覆盖培训计划、课程编排、参训管理、现场报到、排课考勤和统计分析的一期智慧培训平台。 +

+ + +
+
+ + Final Candidate 已冻结 +
+
+ + 核心教务闭环全线通过 +
+
+ + 浏览器端到端验收 PASS +
+
+ + 待正式生产部署 (PENDING) +
+
+
+ + +
+
+
+

项目解决什么问题

+

针对铁路职工培训中教务协同、排课冲突防范、报到考勤核验及结训生命周期管理等核心业务场景,提供一整套数字化闭环解决方案。

+
+
+ +
+
+

+ 一期重点解决的管理问题 +

+
    +
  • + 问题 1 +
    基础资源分散孤立:教师资质、学员档案、专用实训场地与理论教室各自维护,无法全局联动。
    +
  • +
  • + 问题 2 +
    教务排课冲突严重:师资时间重叠、教室重复占用无预警,现场调课成本极高。
    +
  • +
  • + 问题 3 +
    现场报到与考勤手工化:纸质签到核验慢,代签漏签难以追溯,无法与学员参训状态强联动。
    +
  • +
  • + 问题 4 +
    培训结训生命周期断层:结训后学员状态需人工逐一变更,历史退训记录容易被批量操作误覆盖。
    +
  • +
+
+ +
+

+ RailwaySystem 本期落地解决方案 +

+
    +
  • + 方案 1 +
    统一主数据与脱敏机制:教室与实训场地二选一互斥建模,学员敏感信息脱敏显示与哈希安全存储。
    +
  • +
  • + 方案 2 +
    四维排课防重叠与冲突预检:教师硬冲突拦截,教室/场地/计划重叠分级 Warning 预警,管理员确认即保存。
    +
  • +
  • + 方案 3 +
    现场报到确认与课次考勤联动:报到动作自动流转学员状态至已报到;课次签到签退幂等性保护,人工修正全程留痕。
    +
  • +
  • + 方案 4 +
    计划一键结训与历史保护机制:强事务批量流转在读学员状态为已完成,精准锁定历史退训学员状态防破坏。
    +
  • +
+
+
+
+ + +
+
+
+

业务生命周期可视化

+

贯穿铁路职工进入培训基地至结训考核离校的全过程,主干链路紧密衔接,支撑后勤与现场设施协同。

+
+ 查看业务全景 → +
+ +
+
+
+ +
+
1
+
基础资源
+
教师/场地/课程
+
+ +
+
2
+
开班计划
+
拟定班期与容量
+
+ +
+
3
+
绑定课程
+
师资与学时配置
+
+ +
+
4
+
学员报名
+
入班与容量防超额
+
+ +
+
5
+
排课与准备
+
防重叠排课/住宿
+
+ +
+
6
+
现场报到
+
核验确认状态流转
+
+ +
+
7
+
教学与考勤
+
签到/班牌呈现
+
+ +
+
8
+
结训联动
+
自动完成/退训保护
+
+ +
+
9
+
统计分析
+
只读查询与画像
+
+
+
+
+ + +
+
+
+

4 大核心能力域

+

清晰划分系统业务职责边界,高内聚低耦合,覆盖资源管理、教务排产、现场执行与分析洞察。

+
+ 查看14大模块 → +
+ +
+ +
+
+
+
资
+
+

培训资源域

+ Master Data +
+
+ IMPLEMENTED +
+

+ 统一维护师资库、学员主档、课程库、理论教室、实训演练基地以及后勤宿舍。提供敏感个人信息脱敏及手机号唯一性强校验。 +

+ +
+ + +
+
+
+
编
+
+

教务编排域

+ Scheduling Core +
+
+ VERIFIED +
+

+ 实现开班计划编制、课程师资绑定、参训名单导入与招生容量硬拦截。搭载智能排课冲突预检机制,支持 Warning 级灵活排考确认。 +

+ +
+ + +
+
+
+
执
+
+

现场执行域

+ Execution & IoT +
+
+ VERIFIED +
+

+ 支撑开班现场报到核验与参训状态流转,处理课堂签到与签退幂等性,提供人工代签留痕审计,并通过 Web 班牌路由呈现课表与状态。 +

+ +
+ + +
+
+
+
析
+
+

数据分析域

+ Analytics & Reports +
+
+ V2 READ MODEL · PASS +
+

+ 聚合生成报到率、考勤打卡统计、学员课时完成度及多维能力画像报表。当前版本提供完整只读与导出能力,保持独立架构隔离。 +

+ +
+
+
+ + +
+
+
+

分层质量防御与全链路验收

+

从离线单元逻辑、跨模块端到端集成、物理数据库落库校验到浏览器真实交互的四级防护体系。

+
+ 查看测试矩阵 → +
+ +
+
+
154 / 154
+
后端单元测试
+
Maven Surefire 全量通过
+
+ +
+
6 / 6
+
核心业务场景套件
+
SC-01 ~ SC-06 闭环通过
+
+ +
+
110
+
真实 HTTP 请求
+
服务端 500 异常 = 0
+
+ +
+
11 / 11
+
物理数据库断言
+
Kingbase 实体完整性校验
+
+ +
+
0
+
浏览器阻断异常
+
控制台 Console Error = 0
+
+
+
+ + +
+
+
+

发布执行状态追踪

+

开发、测试与验证均已圆满收官,当前进入生产部署待执行阶段。

+
+ 查看发布看板 → +
+ +
+
+
Stage 1 · COMPLETED
+
代码与接口开发
+
核心业务与 V2 接口全部冻结完成。
+
+ +
+
Stage 2 · COMPLETED
+
全层级质量验证
+
154个单元测试及6大核心场景门禁均通过。
+
+ +
+
Stage 3 · COMPLETED
+
浏览器端到端验收
+
真实浏览器端到端交互验收通过,无控制台阻断错误。
+
+ +
+
Stage 4 · PENDING
+
正式生产部署
+
执行 001~003 数据库迁移增量脚本与环境烟测。
+
+
+
+ + +
+
+
+

系统详细交付文档导航

+

点击直达对应交付模块,查看架构拓扑、数据实体设计、测试事实与部署细节。

+
+
+ +
+
+

业务主链与状态机 →

+

深入了解培训计划、学员参训、现场报到确认及考勤状态机流转规则与业务硬阻断。

+
+
+

系统架构与技术栈 →

+

查看分层架构图、数据库交互、无状态安全鉴权及外部电子班牌适配器接口设计。

+
+
+

质量门禁与场景测试 →

+

查阅真实 SCENARIO-01~06 自动化集成测试详情、数据库只读断言与浏览器实测证据。

+
+
+
+ +
+ + + + + + + diff --git a/docs/visual/modules.html b/docs/visual/modules.html new file mode 100644 index 000000000..3d00999b0 --- /dev/null +++ b/docs/visual/modules.html @@ -0,0 +1,563 @@ + + + + + + 业务模块清单 (14大模块) - RailwaySystem 铁路智慧培训管理系统 + + + + + + + + + + +
+ +
+
Functional Domain Architecture
+

14 大核心业务模块清单

+

+ 按照能力域严格分为培训资源、教务编排、现场执行与数据分析 4 大分组。默认仅呈现模块标识与一句话作用,点击可展开详细业务规则与物理表。 +

+
+ + +
+
+
+ Domain 1 +

培训资源域 (Master Data)

+

支撑智慧培训基地的基础人、货、场与生活主数据设施。

+
+ 6 模块全部实现 +
+ +
+ +
+
+
+
师
+
+
教师管理
+
Teacher
+
+
+ IMPLEMENTED +
+

维护培训师资档案、所属专业领域、职称与联系方式,支撑课程主讲人指派。

+
+ 查看详细规则与模型 +
+
唯一性规则:教师手机号全局唯一,重复录入强行拦截 (40001)。
+
物理表名:train_teacher (主键 t_id)
+
实测结论:页面访问、列表查询、手机号防重复验证通过。
+
+
+
+ + +
+
+
+
学
+
+
学员档案
+
Student
+
+
+ IMPLEMENTED +
+

统一管理铁路职工参训人员主档,维护所属铁路局、站段、工种及敏感身份证安全脱敏。

+
+ 查看详细规则与模型 +
+
脱敏与安全:身份证散列存盘,对外接口仅返回末4位脱敏掩码,杜绝明文暴露。
+
主档状态:维护 status=1:正常 与 status=0:停用,停用学员严禁报名。
+
物理表名:train_student (主键 s_id 为 32 位 UUID)
+
+
+
+ + +
+
+
+
课
+
+
课程管理
+
Course
+
+
+ IMPLEMENTED +
+

标准化课程库管理,定义课程编码、理论与实操学时、课程类别及教材大纲。

+
+ 查看详细规则与模型 +
+
业务约束:课程编码全局唯一;学时 c_duration 必须大于 0。
+
物理表名:train_course (主键 c_id)
+
实测结论:课程建档、课时汇总与状态维护通过。
+
+
+
+ + +
+
+
+
室
+
+
理论教室
+
Classroom
+
+
+ IMPLEMENTED +
+

管理基地理论教学教室,设定容纳人数、楼层门牌号并关联挂载电子班牌终端。

+
+ 查看详细规则与模型 +
+
容量约束:容量非空且大于 0,作为排课选址基础参考。
+
班牌绑定:支持绑定 0/1/N 块电子班牌,详情接口实时映射。
+
物理表名:train_classroom_info (主键 class_room_id)
+
+
+
+ + +
+
+
+
场
+
+
实训场地
+
Training Site
+
+
+ IMPLEMENTED +
+

管理机务、电务、工务、供电等室外实训演练基地,支持大型特种设备实训排产。

+
+ 查看详细规则与模型 +
+
互斥规则:在排课中与理论教室满足严格 XOR 互斥逻辑。
+
物理表名:train_training_site (主键 site_id 为 32 位 UUID)
+
实测结论:场地创建、容量校验与排课占用预警验证通过。
+
+
+
+ + +
+
+
+
宿
+
+
后勤宿舍
+
Dormitory
+
+
+ IMPLEMENTED +
+

提供基地学员宿舍楼栋、房号与床位分配管理,联动学员报名中的住宿需求。

+
+ 查看详细规则与模型 +
+
业务联动:由报名表 accommodation_required = 1 驱动床位分配。
+
物理表名:train_dormitory_info (主键 dorm_id), train_accommodation
+
实测结论:宿舍主数据维护及入住状态管理正常。
+
+
+
+
+
+ + +
+
+
+ Domain 2 +

教务编排域 (Scheduling Core)

+

负责计划拟定、课程师资绑定、参训名单导入及四维排课防重叠调度。

+
+ 4 模块全部实现 +
+ +
+ +
+
+
+
计
+
+
培训计划
+
Training Plan
+
+
+ IMPLEMENTED +
+

拟定培训班方案,维护班级周期、报到截止日、计划招生人数上限及全生命周期状态流转。

+
+ 查看详细规则与模型 +
+
状态流转:0:草稿 → 1:进行中 → 2:已结束。
+
结训保护:结训时 Plan 置为 2,锁定排课变更,批量完成活动学员。
+
物理表名:train_class_plan (主键 plan_id 32 位 UUID)
+
+
+
+ + +
+
+
+
纲
+
+
计划课程
+
Plan Course
+
+
+ IMPLEMENTED +
+

构建培训计划与课程的关联映射,指派授课教师,自动汇总开班总学时。

+
+ 查看详细规则与模型 +
+
关联一致性:作为排课 Lesson 的外键依赖,禁止跨计划引用。
+
物理表名:train_plan_course (主键 plan_course_id)
+
实测结论:课程批量绑定与学时自动联动通过。
+
+
+
+ + +
+
+
+
名
+
+
参训管理
+
Enrollment
+
+
+ IMPLEMENTED +
+

管理学员入班名单、招生容量防超额守卫,并维护学员在班级的参训状态流转。

+
+ 查看详细规则与模型 +
+
双重硬拦截:重复报名拦截 (40030);招生容量上限拦截 (40031)。
+
参训状态机:0:待报到 → 1:已报到 → 2:请假 → 3:退训 → 4:已完成。
+
物理表名:train_enrollment (主键 enrollment_id)
+
+
+
+ + +
+
+
+
排
+
+
排课调度
+
Scheduling
+
+
+ VERIFIED +
+

编制每日具体课次,集成四维冲突预检机制,输出可视化聚合日课表视图。

+
+ 查看详细规则与模型 +
+
四维冲突预检:教师冲突硬检;教室/场地/班级重叠 Warning 提示并允许确认保存。
+
合规要求:严格禁止任何 force / override 违规旁路参数。
+
物理表名:train_lesson (主键 lesson_id)
+
+
+
+
+
+ + +
+
+
+ Domain 3 +

现场执行域 (Execution & IoT)

+

支撑学员现场核验报到、课堂考勤打卡留痕与电子班牌终端信息交互。

+
+ 3 模块全部通过验证 +
+ +
+ +
+
+
+
到
+
+
开班报到
+
Class Report
+
+
+ VERIFIED +
+

学员到校开班报到身份核验,强事务联动流转报名状态至已报到,防重复报到。

+
+ 查看详细规则与模型 +
+
强事务联动:报到写入 train_class_report,同时联动更新 enrollment_status = 1 且记录 join_time。
+
重复报到防范:已报到学员再次报到触发拦截 (40050)。
+
物理表名:train_class_report (主键 report_id)
+
+
+
+ + +
+
+
+
勤
+
+
课次考勤
+
Attendance
+
+
+ VERIFIED +
+

处理课次签到与签退打卡,保证首次打卡时间幂等性,支持人工代签审计留痕。

+
+ 查看详细规则与模型 +
+
打卡幂等性:重复调用签到或签退时,严格保持首次 signInTime/signOutTime 不变。
+
人工代签留痕:后台调整考勤自动置 manual_flag = 1,记录调整人与备注。
+
物理表名:train_student_checkin (主键 checkin_id)
+
+
+
+ + +
+
+
+
牌
+
+
电子班牌
+
Electronic Board
+
+
+ VERIFIED +
+

管理挂载在教室的电子显示终端,在课表中提供智能降级映射与物联页面呈现。

+
+ 查看详细规则与模型 +
+
课表降级规则:0 块板为 null,恰好 1 块板为对应 SN,>1 块板降级为 null。
+
前端路由:前端正式路由为 /equip/board,对应后端接口 /train/board。
+
物理表名:train_electronic_board (主键 board_id 32 位 UUID)
+
+
+
+
+
+ + +
+
+
+ Domain 4 +

数据分析域 (Analytics & Reports)

+

聚合教务执行过程数据,提供只读统计报表与画像导出,保持架构隔离。

+
+ V2 READ MODEL · PASS +
+ +
+ +
+
+
+
析
+
+
统计分析与报表
+
Analytics
+
+
+ V2 READ MODEL · PASS +
+

涵盖报到率统计、考勤打卡统计、学员课时完成度及综合画像等只读报表展示与数据导出。

+
+ 查看详细规则与模型 +
+
架构隔离:当前版本已完成 V2 Read Model 接入,提供稳定的只读查询与导出能力,保持数据库单向读取。
+
涵盖视图:Report 报到报表、Checkin 考勤报表、Duration 学时统计、Portrait 画像表 4 个视图均通过验收。
+
演进规划:高级画像算法模型与多维统计扩展标为 RESERVED / FUTURE EXTENSION。
+
+
+
+
+
+ +
+ + + + + + + diff --git a/docs/visual/release-status.html b/docs/visual/release-status.html new file mode 100644 index 000000000..3ab29b0cf --- /dev/null +++ b/docs/visual/release-status.html @@ -0,0 +1,290 @@ + + + + + + 发版进度看板与门禁状态 - RailwaySystem 铁路智慧培训管理系统 + + + + + + + + + + +
+ +
+
Delivery Pipeline & Release Stepper
+

发版进度与门禁流水线看板

+

+ 采用清晰直观的发布进度步进器 (Progress Stepper) 替代传统大表格,准确呈现从代码冻结、测试门禁、文档就绪到待执行生产部署的完整阶段状态。 +

+
+ + +
+
+ 交付候选阶段 + Final Candidate 交付版本 +
+
+ 基线 HEAD:5a49b2e2 + 代码冻结:已完成 (FROZEN) + 质量门禁:100% 通过 + 生产部署:待执行 (PENDING) +
+
+ + +
+
+ + +
+
+
✓
+
+
+
+
+
1. 代码与接口契约冻结 (Code Freeze)
+ DONE +
+

+ 后端 ruoyi-train 业务主干、前端 Vue 路由及 docs/api-v2 接口契约全面封版冻结,基线锁定于 commit 5a49b2e2。 +

+
+
+ + +
+
+
✓
+
+
+
+
+
2. 后端单元与契约测试门禁 (Unit & Contract Test)
+ DONE +
+

+ 执行 mvn test 极速离线门禁,154 个测试用例全部一次性通过 (0 Failures, 0 Errors, 0 Skipped)。 +

+
+
+ + +
+
+
✓
+
+
+
+
+
3. 核心业务场景端到端集成测试 (Integration Scenarios)
+ DONE +
+

+ 运行 scripts/qa/core-business-scenario-runner.py,完成 110 次真实 HTTP 请求,SC-01~06 六大场景全部 PASS,HTTP 500 = 0,Kingbase 11项物理断言全部 PASS,自动化残留数据归零 (Residue = 0)。 +

+
+
+ + +
+
+
✓
+
+
+
+
+
4. 浏览器端到端真实交互验收 (Browser Acceptance)
+ DONE +
+

+ 基于真实浏览器端到端实测,覆盖基础主数据录入、排课冲突 Warning 取消与确认保存、报到确认及 Web 班牌路由,控制台阻断错误为 0,实测数据保留供合规审计 (KEEP_FOR_AUDIT)。 +

+
+
+ + +
+
+
✓
+
+
+
+
+
5. 在线接口文档平台集成 (Swagger Platform)
+ DONE +
+

+ 集成入口位于「系统工具 → 系统接口」,v3/api-docs 与 swagger-resources 均正常响应 HTTP 200,支持在线调试。 +

+
+
+ + +
+
+
6
+
+
+
+
+
6. 交付文档体系与可视化门户重构 (Documentation)
+ IN PROGRESS +
+

+ 完成内容事实核准与 8 大可视化 HTML 门户重构,严格消除过度推断与技术扩写,构建离线可用高可读性交付系统。 +

+
+
+ + +
+
+
7
+
+
+
+
+
7. 正式生产环境部署执行 (Formal Deployment)
+ PENDING +
+

+ 在目标生产环境按序执行 3 个增量数据库迁移脚本 (001~003),历史业务字典 007_dicts.sql 严禁执行;启动前端 8082 与后端 8092 生产进程。 +

+
+
+ + +
+
+
8
+
+
+
+
+
8. 生产环境自动化冒烟验证 (Deployment Smoke)
+ PENDING +
+

+ 服务启动后对 GET /login、教师列表与课表查询进行线上存活性健康检查与读写冒烟校验。 +

+
+
+ + +
+
+
9
+
+
+
+
9. 最终交付签收与上线归档 (Final Release)
+ PENDING +
+

+ 完成各方验收签字与资产封存归档,正式进入生产平稳运行维护阶段。 +

+
+
+ +
+
+ + +
+
+
+

阶段交付物与验证报告索引

+

所有阶段均有完整的可追溯报告文件支持,严格保证过程合规。

+
+
+ +
+
+
+

综合测试报告

+ PASS +
+

详细记录 154 个单元用例、6 大场景集成及 11 项物理落库断言的执行结果与证据。

+ 查阅报告 (final-test-report.md) → +
+ +
+
+

浏览器端到端验收报告

+ PASS +
+

记录真实浏览器端到端模拟教务员的全流程交互、表单提交、弹窗确认与控制台检查情况。

+ 查阅报告 (browser-acceptance.md) → +
+ +
+
+

部署与发版说明

+ READY +
+

提供生产环境前置条件预检、3 个必跑数据库增量脚本说明与环境冒烟指南。

+ 查阅发版说明 (release-notes.md) → +
+
+
+ +
+ + + + + + + diff --git a/docs/visual/screenshots/architecture-v2.png b/docs/visual/screenshots/architecture-v2.png new file mode 100644 index 000000000..686eb31f2 Binary files /dev/null and b/docs/visual/screenshots/architecture-v2.png differ diff --git a/docs/visual/screenshots/business-flow-v2.png b/docs/visual/screenshots/business-flow-v2.png new file mode 100644 index 000000000..57a84e66c Binary files /dev/null and b/docs/visual/screenshots/business-flow-v2.png differ diff --git a/docs/visual/screenshots/data-model-v2.png b/docs/visual/screenshots/data-model-v2.png new file mode 100644 index 000000000..e7439a0bf Binary files /dev/null and b/docs/visual/screenshots/data-model-v2.png differ diff --git a/docs/visual/screenshots/deployment-v2.png b/docs/visual/screenshots/deployment-v2.png new file mode 100644 index 000000000..ea8dfa24a Binary files /dev/null and b/docs/visual/screenshots/deployment-v2.png differ diff --git a/docs/visual/screenshots/modules-v2.png b/docs/visual/screenshots/modules-v2.png new file mode 100644 index 000000000..c3c7942ee Binary files /dev/null and b/docs/visual/screenshots/modules-v2.png differ diff --git a/docs/visual/screenshots/portal-home-v2.png b/docs/visual/screenshots/portal-home-v2.png new file mode 100644 index 000000000..1fb200721 Binary files /dev/null and b/docs/visual/screenshots/portal-home-v2.png differ diff --git a/docs/visual/screenshots/release-v2.png b/docs/visual/screenshots/release-v2.png new file mode 100644 index 000000000..ef80df471 Binary files /dev/null and b/docs/visual/screenshots/release-v2.png differ diff --git a/docs/visual/screenshots/testing-v2.png b/docs/visual/screenshots/testing-v2.png new file mode 100644 index 000000000..5ed226b09 Binary files /dev/null and b/docs/visual/screenshots/testing-v2.png differ diff --git a/docs/visual/testing.html b/docs/visual/testing.html new file mode 100644 index 000000000..2e7ba8aa7 --- /dev/null +++ b/docs/visual/testing.html @@ -0,0 +1,636 @@ + + + + + + 质量与验证体系 - RailwaySystem 铁路智慧培训管理系统 + + + + + + + + + + +
+ +
+
Quality Assurance & Verification
+

质量指标与全层级验证矩阵

+

+ 严格基于 scripts/qa/core-business-scenario-runner.py、docs/_meta/core-business-test-matrix.md 及真实浏览器端到端验收报告生成。杜绝任何未经代码或测试证实的扩写。 +

+
+ + +
+
+
154 / 154
+
后端单元与契约测试
+
Maven Surefire · ALL PASS
+
+ +
+
6 / 6
+
核心业务场景套件
+
SC-01 ~ SC-06 全部通过
+
+ +
+
110
+
真实 HTTP API 探测
+
自动化请求全量记录
+
+ +
+
0
+
服务端 500 异常
+
HTTP 500 Count = 0
+
+ +
+
11 / 11
+
Kingbase 持久化断言
+
实体与外键完整性无孤儿
+
+ +
+
PASS
+
浏览器真实 UI 验收
+
Final Browser Acceptance
+
+ +
+
0
+
控制台阻断错误
+
Console Error = 0
+
+
+ + +
+
+
+

分层质量防御金字塔

+

从离线单元逻辑、跨模块端到端集成、物理数据库落库校验到浏览器界面交互的四级防护体系。

+
+
+ +
+
+ +
+
+

第 4 层:真实浏览器端到端验收 (Final Browser Acceptance) PASS

+

真实浏览器端到端交互:登录、表单建档、计划排课、冲突 Warning 弹窗确认、报到确认及 Web 班牌。

+
+ Console Error: 0 +
+ + +
+
+

第 3 层:Kingbase 数据库落库只读断言 (DB Assertions) PASS

+

11 项物理 SQL 只读断言:外键无孤儿记录、场地 XOR 互斥、逻辑删除标志、结训完成时间及退训防破坏保护。

+
+ 11 / 11 PASS +
+ + +
+
+

第 2 层:核心业务场景集成测试 (SC-01 ~ SC-06) PASS

+

Python 自动化套件覆盖正向全链路、报名拦截、排课预检 Warning/Block、班牌降级、结训事务及报到考勤闭环。

+
+ 6 / 6 PASS · 110 Requests +
+ + +
+
+

第 1 层:后端单元与契约测试 (Backend Unit / Contract) PASS

+

Maven Surefire 离线测试集,涵盖状态机流转、排课冲突算法、脱敏工具类与权限注解断言。

+
+ 154 / 154 PASS +
+
+
+
+ + +
+
+
+

核心业务场景集成测试 (SCENARIO-01 ~ SCENARIO-06)

+

严格对齐 scripts/qa/core-business-scenario-runner.py 真实代码逻辑,默认呈现关键结论,点击可查阅详细步骤。

+
+
+ +
+ +
+
+ SCENARIO-01 · PASS + Happy Path +
+

完整正向业务闭环全链

+
    +
  • 基础资源就绪:成功创建 Teacher、Course、Classroom 及 TrainingSite。
  • +
  • 开班排课全链:拟定计划、绑定课程师资、学员入班待报到、课表聚合正常。
  • +
  • 自动结训完成:计划流转至已结束,活动学员自动结训完成并写入 complete_time。
  • +
+
+ 展开 15 步详细交互验证 +
+
· 开班计划采用 32 位 UUID 主键,初始状态为 0:草稿。
+
· Timetable 课表接口准确聚合课程名称、授课教师及场地名。
+
· 调用 POST /train/plans/{id}/complete 强事务批量流转状态。
+
+
+ +
+ + +
+
+ SCENARIO-02 · PASS + Enrollment Rules +
+

学员报名异常规则与状态区分

+
    +
  • 重复报名拦截:同一计划重复报名触发唯一索引,准确返回 40030。
  • +
  • 容量超限拦截:入班人数超过计划 recruit_num 上限时拦截返回 40031。
  • +
  • 状态严格区分:学员主档状态 (正常/停用) 与参训状态机独立解耦流转。
  • +
+
+ 展开异常校验与拦截细节 +
+
· 不存在的非法学员严格拒绝入班。
+
· 停用学员 (status=0) 严禁报名入班。
+
· 参训状态机严格维护 0待报到/1已报到/2请假/3退训/4已完成。
+
+
+ +
+ + +
+
+ SCENARIO-03 · PASS + Scheduling Engine +
+

排课预检 Warning 与 Hard Block 硬阻断

+
    +
  • 四维冲突预检:教师冲突硬阻断;教室/场地/班级重叠返回 Warning 提示。
  • +
  • 非阻断合规:Warning 级别由教务员确认保存,严格禁止 force 旁路参数。
  • +
  • 互斥与锁定:场地 XOR 互斥强校验;已结训计划强阻断变更 (40012)。
  • +
+
+ 展开预检机制与阻断契约 +
+
· 时间倒挂阻断:startTime >= endTime 拦截返回 40010。
+
· 教室与场地同时为空或同时赋值强行拦截,DB 层面 invalid venue XOR = 0。
+
· 已结训计划禁止排课变更,返回 40012: PLAN_LOCKED。
+
+
+ +
+ + +
+
+ SCENARIO-04 · PASS + Electronic Board +
+

电子班牌绑定与课表降级映射

+
    +
  • UUID 主键规范:班牌创建自动生成 32 位 UUID,默认在线状态 0。
  • +
  • 课表降级规则:0 块板为 null,恰好 1 块板返回对应 SN,多块板降级为 null。
  • +
  • 逻辑删除保障:调用删除置 del_flag='2',业务接口隔离且物理数据保留。
  • +
+
+ 展开教室绑定与降级细节 +
+
· 教室详情接口:0 块板返回空数组,1 块板返回长度 1,N 块板返回长度 N。
+
· 课表 boardSn 降级消除多设备展示歧义。
+
· 物理库 SQL 断言确认 del_flag='2' 匹配成功。
+
+
+ +
+ + +
+
+ SCENARIO-05 · PASS + Plan Completion +
+

结训生命周期与退训学员保护

+
    +
  • 计划结训 API:调用结训接口,Plan 状态成功流转为 2:已结束。
  • +
  • 活动学员结训:待报到/已报到学员批量流转为 4:已完成 并记录时间。
  • +
  • 退训学员防覆盖:已退训学员 (status=3) 状态与完成时间受严格保护。
  • +
+
+ 展开核心不变量与事务保障 +
+
· 接口契约:POST /train/plans/{id}/complete 强事务批量更新。
+
· 核心不变量:已退训记录 complete_time 严格保持为 null。
+
· 物理 SQL 断言证实历史退训记录零覆盖、零损坏。
+
+
+ +
+ + +
+
+ SCENARIO-06 · PASS + Report & Attendance +
+

现场报到与课堂考勤完整闭环

+
    +
  • 现场报到确认:调用报到接口返回 reportId,参训状态流转为 1:已报到。
  • +
  • 考勤打卡幂等:首次记录打卡时间,重复签到签退严格保持初次时间不变。
  • +
  • 人工代签留痕:后台调整考勤自动置 manual_flag = 1 留存审计线索。
  • +
+
+ 展开接口与重复拦截细节 +
+
· 报到确认接口:POST /train/enrollments/{id}/report 强事务写入。
+
· 重复报到防范:对已报到学员再次报到触发拦截返回 40050。
+
· 人工考勤接口:PUT /train/attendance/{id} 记录调整人与备注。
+
+
+ +
+
+
+ + +
+
+
+

真实浏览器端到端交互验收 (Final Browser Acceptance)

+

基于真实运行的端到端验收套件客观记录,据实描述界面打开、列表查询、表单验证与接口调用结果。

+
+
+ +
+ +
+
+

基础主数据管理

+ PASS +
+
    +
  • Teacher 教师:页面成功打开、列表查询、手机号唯一性强校验生效。
  • +
  • Student 学员:建档表单校验通过,身份证末4位脱敏掩码展示正常。
  • +
  • Classroom 教室:理论教室容量与状态设置正常渲染。
  • +
  • TrainingSite 场地:实训场地类型与容量管理正常。
  • +
+
+ + +
+
+

核心教务编排交互

+ PASS +
+
    +
  • Plan 培训计划:拟定 32 位 UUID 计划,生命周期初始为草稿。
  • +
  • PlanCourse 课程绑定:课程选择与师资指派正常,总学时联动累加。
  • +
  • Enrollment 学员报名:入班名单展示、招生容量上限校验拦截生效。
  • +
  • Timetable 可视化排课:课表渲染,冲突 Warning 取消/确认入库均正常。
  • +
+
+ + +
+
+

现场执行与系统工具

+ PASS +
+
    +
  • 开班报到确认:前端菜单「开班签到」,实际调用 /report 接口 200 OK,状态由待报到流转为已报到。
  • +
  • 电子班牌终端:前端物联路由 /equip/board 页面正常渲染。
  • +
  • 统计分析 (Analytics):报到、考勤、学时、画像报表只读查询正常。
  • +
  • 系统接口平台 (Swagger):系统工具 → 系统接口 在线渲染,v3/api-docs 返回 200。
  • +
+
+
+
+ + +
+
+
+

测试数据清理与审计口径规范

+

严格区分自动化集成测试与浏览器真实验收的数据保留策略,杜绝将两者混写。

+
+
+ +
+
+
+

自动化集成测试清理 (Integration Cleanup)

+ 0 残留 (Residue = 0) +
+

+ core-business-scenario-runner.py 在测试执行过程中自动记录所创建的精确 ID 资源清单 (created-resources.json)。测试断言结束后,严格按逆序调用解绑与清理机制,实现: +
· 课次、参训名单、电子班牌精确删除; +
· 自动化测试产生的数据残留为 0,保持数据库纯净。 +

+
+ +
+
+

浏览器端到端验收数据 (Browser Acceptance Data)

+ 保留供审计 (KEEP_FOR_AUDIT) +
+

+ 在最终浏览器真实 UI 验收中创建及流转的测试学员、开班计划、报到流水及代签考勤记录,显式全量保留在数据库中,供发布审查、合规抽检及操作日志审计核对,非 0 残留。 +

+
+
+
+ + +
+
+
+

技术底层细节与物理 SQL 断言 (展开查阅)

+

由 DbAssertionChecker 直接在 Kingbase 物理库上执行的只读一致性核查。

+
+
+ +
+
+
+ 11 项 SQL 断言通过 + 查看 Kingbase 物理库只读一致性断言清单 +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
断言项目验证逻辑与 SQL 条件预期值实测结果
duplicate enrollment校验同一计划内是否存在相同学员的重复报名记录0PASS (0)
orphan lesson校验是否存在未关联有效计划课程的孤立课次0PASS (0)
orphan enrollment校验是否存在未关联有效培训计划的孤立报名档案0PASS (0)
invalid venue XOR校验课次中教室与实训场地二选一互斥,严禁同时为空或同时设置0PASS (0)
del_flag = '2'电子班牌逻辑删除后底层标志位规范设置为 '2'MATCHPASS
Plan completion 状态联动结训后学员参训状态正确流转至 4 且 complete_time 真实写入status=4, time!=nullPASS
历史退训保护已退训记录未被结训批量任务修改覆盖,complete_time 保持为 nullstatus=3, time=nullPASS
orphan report校验是否存在未关联有效报名记录的孤立报到流水0PASS (0)
orphan checkin校验是否存在未关联有效课次或报名的孤立考勤打卡0PASS (0)
manual_flag = 1人工修正考勤记录自动置审计标志位 manual_flag = 11PASS (1)
report enrollment status报到流水关联的报名记录状态必须为 1(已报到) 或 4(已结训完成)status IN (1, 4)PASS
+
+
+
+
+ +
+ + + + + + +