From 1757089c566ecdc3b70f41a75e8e14ece30a5e94 Mon Sep 17 00:00:00 2001 From: wangzhibiao Date: Thu, 17 Sep 2026 10:21:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E9=AA=8C=E6=94=B6=EF=BC=9A?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=80=E6=9C=9F=E7=BB=BC=E5=90=88=E9=AA=8C?= =?UTF-8?q?=E6=94=B6=E7=8A=B6=E6=80=81=E5=BD=92=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/handbook/09-current-status.md | 43 +++++++----- .../FINAL_PHASE1_20260917_101044/README.md | 48 +++++++++++++ .../analytics-score-portrait-status.md | 66 ++++++++++++++++++ .../browser-e2e-final.md | 62 ++++++++++++++++ .../build-test-final.md | 51 ++++++++++++++ .../business-flow-final.md | 38 ++++++++++ .../database-integrity-final.md | 41 +++++++++++ .../dms-final-status.md | 47 +++++++++++++ .../evidence-index.md | 42 +++++++++++ .../executive-summary.md | 64 +++++++++++++++++ .../external-blockers.md | 24 +++++++ .../historical-evidence-corrections.md | 49 +++++++++++++ .../known-gaps.md | 26 +++++++ .../phase-one-trial-readiness.md | 37 ++++++++++ .../qa-secret-rotation-plan.md | 37 ++++++++++ .../rbac-security-final.md | 39 +++++++++++ .../release-configuration-review.md | 49 +++++++++++++ .../requirements-final-status.md | 40 +++++++++++ .../round-1-summary.md | 14 ++++ .../round-2-summary.md | 14 ++++ .../round-3a-summary.md | 14 ++++ .../round-3b-summary.md | 18 +++++ .../screenshots/analytics_verified.png | Bin 0 -> 178168 bytes .../round-4/screenshots/portrait_verified.png | Bin 0 -> 68036 bytes .../security-final.md | 59 ++++++++++++++++ .../round-3b/round-3b-summary.md | 1 + docs/requirements/一期需求实现进度表.md | 6 +- docs/visual/architecture.html | 6 +- docs/visual/business-flow.html | 6 +- docs/visual/data-model.html | 6 +- docs/visual/deployment.html | 6 +- docs/visual/index.html | 8 +-- docs/visual/modules.html | 6 +- docs/visual/release-status.html | 6 +- docs/visual/testing.html | 6 +- 35 files changed, 933 insertions(+), 46 deletions(-) create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/README.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/analytics-score-portrait-status.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/browser-e2e-final.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/build-test-final.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/business-flow-final.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/database-integrity-final.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/dms-final-status.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/evidence-index.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/executive-summary.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/external-blockers.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/historical-evidence-corrections.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/known-gaps.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/phase-one-trial-readiness.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/qa-secret-rotation-plan.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/rbac-security-final.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/release-configuration-review.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/requirements-final-status.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-1-summary.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-2-summary.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3a-summary.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3b-summary.md create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/analytics_verified.png create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/portrait_verified.png create mode 100644 docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/security-final.md diff --git a/docs/handbook/09-current-status.md b/docs/handbook/09-current-status.md index 76d85cb4f..c7afcdb18 100644 --- a/docs/handbook/09-current-status.md +++ b/docs/handbook/09-current-status.md @@ -9,17 +9,16 @@ | 审计维度 | 状态指标 | 当前权威事实 | 阶段状态 | | :--- | :--- | :--- | :---: | -| **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** | ⏳ **待发布** | +| **Git 代码基线** | Round 4 QA HEAD | `qa/integrated-acceptance-20260916` | ✅ **已核准** | +| **后端单元/集成测试**| Maven 测试套件用例 | **331 / 331 PASS (0 Failures / 0 Errors)** | ✅ **全通过** | +| **三角色浏览器 E2E**| Admin / Teacher / Student 三端交互 | **0 阻断 / 0 个 500 / 0 控制台报错** | ✅ **全通过** | +| **RBAC 与防越权** | IDOR 穿透测试与最小权限 | **IDOR_LEAK_COUNT = 0, FINAL_RBAC_SMOKE = PASS** | ✅ **全通过** | +| **DMS 智能门锁平台**| 官方平台登录认证与 Token TTL | **Real Auth PASS / Token TTL: 7200s (Runtime Verified)** | ✅ **契约通过** | +| **DMS 只读契约与接口**| 楼栋/楼层/房间/门锁只读查询 | **DMS_REAL_READ_ONLY_CONTRACT = PASS** | ✅ **契约通过** | +| **DMS 外部设备与资源**| 厂商租户真实资源与现场硬件 | **BLOCKED_EXTERNAL (租户资源为0,现场硬件组网中)** | ⏳ **待外部就绪** | +| **数据库完整性断言**| 孤儿/调宿重复/幂等/绑定完整性 | **6 大核心指标全部为 0 (CheckDatabaseIntegrity)** | ✅ **全通过** | +| **敏感凭证安全审计**| 全量 git ls-files 扫描 | **REAL_SECRET_COMMITTED_COUNT = 0** | ✅ **无泄露** | +| **正式发布就绪度** | 综合验收试用就绪评估 | **READY_WITH_EXTERNAL_BLOCKERS** | 🚀 **具备试用条件** | --- @@ -28,18 +27,26 @@ 根据当前代码与测试验证,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)明确标记为二期规划,不纳入门禁阻断。 + - 教务管理:开班计划 (Plan PASS)、本期课程 (PlanCourse PASS)、参训名单 (Enrollment PASS)、排课与冲突预检 (Scheduling PASS) + - 现场执行:开班现场报到 (Report Confirm PASS)、课次考勤打卡与调整 (Attendance)、自主学习时长 (Duration PASS) + - 角色门户:管理员控制台 (Admin PASS)、教师专属工作台 (Teacher PASS)、学员专属培训中心 (Student PASS) + - 系统运维与审计:操作日志 (OperLog PASS)、系统工具与 API 接口正常 +* **DMS 智能门锁集成状态 (DMS INTEGRATION)**: + - 认证与只读:DMS 官方认证通过 (Real Auth PASS)、Token TTL 7200s、只读接口契约与实体映射已通过运行时校验 (Real Read-only verified); + - 外部依赖说明:外部 Demo 租户账号无真实房间与门锁资源 (Demo tenant has no real resources),现场实体门锁硬件组网施工中,写操作/物理硬件处于外部等待状态 (Mutation/hardware pending external); + - 业务策略:请假保留权限、调宿先授新后销旧等暂行策略 (Provisional) 已在系统内闭环实现。 +* **统计分析与学情画像现状**: + - 统计分析 (Analytics):`/analysis/checkin` 真实 77 条考勤打卡流水与报到统计可用 (AVAILABLE_FUNCTION); + - 学员画像 (Portrait):`/portrait` 基础档案与学时检索可用,高阶多维雷达图待考评数据积累 (PARTIAL_FUNCTION); + - 成绩管理 (Score):新成绩体系基础模型已就绪,一期全业务流程闭环推进中 (IN_PROGRESS / EXPECTED_GAP)。 --- ## 3. 下一阶段演进路线图 (Next Steps) -1. **生产集群环境部署验证**:在目标生产端口(8092/8082)执行预发布部署演练,产出 [docs/reports/deployment-report.md](../reports/deployment-report.md)。 -2. **正式发版与交付**:基于当前稳定的 Final Candidate 生成正式 Release 标签,组织向最终客户及评审专家的成果汇报。 +1. **生成本地发布候选分支 (Release Candidate)**:基于当前终检 HEAD 生成 `rc/phase1-20260917` 本地发布分支,禁止直接部署生产。 +2. **组织局域网教务教学试用**:在局域网内组织核心教务及教师展开教学排课与考勤试运行。 +3. **外部硬件资源对接**:待门锁厂商划拨真实测试房间及门锁硬件通电后,闭环真实下发联调与甲方盖章确认。 --- diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/README.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/README.md new file mode 100644 index 000000000..4e2100cef --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/README.md @@ -0,0 +1,48 @@ +# SYFJGYD学员管理系统 一期综合验收最终总报告 (Final Acceptance Report) + +- **验收总主题**: 一期综合验收 Round 4 终检收口、证据纠偏、文档化与发布就绪 +- **报告标识 (RUN_ID)**: `FINAL_PHASE1_20260917_101044` +- **基线分支**: `qa/integrated-acceptance-20260916` +- **网络运行模式**: `DIRECT_LAN` +- **数据库隔离实例**: `railwaysystem_integrated_qa_20260916` (`192.168.139.218:4321`) +- **最终试用就绪判定**: **`READY_WITH_EXTERNAL_BLOCKERS`** + +--- + +## 1. 报告导航与文档体系目录 (Report Index) + +本总报告由以下 22 份经过严格验证的专题报告与计划方案共同构成,全部采用仓库相对路径索引: + +| 报告文件名 | 核心主题 | 关键结论 / 状态 | 仓库相对链接 | +| :--- | :--- | :---: | :--- | +| **`executive-summary.md`** | 综合验收高层执行总摘要 | `READY_WITH_EXTERNAL_BLOCKERS` | [executive-summary.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/executive-summary.md) | +| **`evidence-index.md`** | 全量 Evidence 索引与归档目录 | 完整留存 | [evidence-index.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/evidence-index.md) | +| **`historical-evidence-corrections.md`** | 历史 Evidence 口径核对与修正 | `PASS` | [historical-evidence-corrections.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/historical-evidence-corrections.md) | +| **`round-1-summary.md`** | Round 1 干净隔离 QA 基线总结 | `PASS` | [round-1-summary.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-1-summary.md) | +| **`round-2-summary.md`** | Round 2 场景业务流后端穿刺总结 | `PASS` | [round-2-summary.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-2-summary.md) | +| **`round-3a-summary.md`** | Round 3A 管理端浏览器 E2E 总结 | `PASS` | [round-3a-summary.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3a-summary.md) | +| **`round-3b-summary.md`** | Round 3B 教师/学员端 E2E 总结 | `PASS` | [round-3b-summary.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3b-summary.md) | +| **`business-flow-final.md`** | 核心业务流端到端验证终审 | `PASS` | [business-flow-final.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/business-flow-final.md) | +| **`browser-e2e-final.md`** | 三端浏览器交互与稳定性终审 | `PASS` | [browser-e2e-final.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/browser-e2e-final.md) | +| **`rbac-security-final.md`** | 角色访问控制与防越权终审 | `PASS` | [rbac-security-final.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/rbac-security-final.md) | +| **`dms-final-status.md`** | DMS 外部智能门锁真实状态报告 | 契约通过 / 硬件受阻 | [dms-final-status.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/dms-final-status.md) | +| **`analytics-score-portrait-status.md`** | 统计、画像、成绩与学时能力报告 | 实证纠偏 | [analytics-score-portrait-status.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/analytics-score-portrait-status.md) | +| **`database-integrity-final.md`** | 数据库完整性与外键约束终审 | 6 大指标为 0 | [database-integrity-final.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/database-integrity-final.md) | +| **`security-final.md`** | 敏感信息扫描与进程参数安全报告 | 0 真实 Secret | [security-final.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/security-final.md) | +| **`build-test-final.md`** | 全量构建、测试回归与浏览器门禁 | 331 测试通过 / 0 错误 | [build-test-final.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/build-test-final.md) | +| **`requirements-final-status.md`** | 一期需求实现进度表最终对齐 | 11 完成 / 1 集成就绪 / 2 推进中 | [requirements-final-status.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/requirements-final-status.md) | +| **`external-blockers.md`** | 外部阻塞与依赖客观条件清单 | 3 项外部依赖 | [external-blockers.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/external-blockers.md) | +| **`release-configuration-review.md`** | 生产发布配置审查与安全分类 | 0 阻塞性配置 | [release-configuration-review.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/release-configuration-review.md) | +| **`known-gaps.md`** | 已知功能范围缺口与非阻塞说明 | 2 项已知缺口 | [known-gaps.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/known-gaps.md) | +| **`phase-one-trial-readiness.md`** | 一期试用就绪度分类与判定结论 | `READY_WITH_EXTERNAL_BLOCKERS` | [phase-one-trial-readiness.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/phase-one-trial-readiness.md) | +| **`qa-secret-rotation-plan.md`** | QA 环境敏感凭证轮转执行计划 | `PLAN_ONLY` | [qa-secret-rotation-plan.md](docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/qa-secret-rotation-plan.md) | + +--- + +## 2. 最终综合验收事实总览 + +1. **核心业务与三端交互 100% 畅通**:管理员端、教师端专属工作台、学员端自主中心全流程打通,教务排课、选课、考勤、住宿及调宿闭环可用; +2. **安全防护严密可靠**:水平越权漏洞为 0,多角色权限边界强校验,门禁密码单次展示不入库不入日志,代码仓库 0 真实硬编码密钥; +3. **数据资产健康无损**:数据库孤儿数据、调宿重复分配违规均为 0,外键约束严谨,三端数据高度一致; +4. **代码质量达标通过**:后端自动化测试 331 项全绿,前端正式打包通过,运行时 0 阻塞性控制台报错、0 HTTP 500; +5. **外部边界清晰透明**:明确指出智能门锁硬件安装及厂家测试资源分配为外部条件,软件端已完备就绪。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/analytics-score-portrait-status.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/analytics-score-portrait-status.md new file mode 100644 index 000000000..60cfa219b --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/analytics-score-portrait-status.md @@ -0,0 +1,66 @@ +# 统计分析、学员画像、成绩与学时能力最终现状报告 (Analytics, Score, Portrait & Study Duration Status) + +- **报告标识**: `ANALYTICS_SCORE_PORTRAIT_STATUS_R4` +- **验证轮次**: Round 4 浏览器与数据一致性收口 + +--- + +## 1. 统计分析能力 (C06 / Analytics) + +### 1.1 现状核实与证据纠偏 +- **历史记录纠偏**:在 Round 3B 中曾使用系统首页作为统计分析截图(`15_analytics_current.png`),无法证明实际业务统计分析能力。 +- **本轮真实验证**:真实访问业务统计核心页面 **`/analysis/checkin` (课程考勤签到分析)** 以及 **`/analysis/report` (学员报到分析)**。 +- **验证数据事实**:页面正常渲染并展示真实 QA 数据聚合流水(累计 77 条课程考勤明细与打卡状态),按培训计划、课次与学员状态的统计筛选功能均可用。 +- **最新证据截图**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/analytics_verified.png`。 +- **判定状态**: + - `ANALYTICS_BROWSER = AVAILABLE_FUNCTION` + - `C06_FINAL = AVAILABLE_FUNCTION` + +--- + +## 2. 学员画像能力 (C05 / Portrait) + +### 2.1 现状核实与生成逻辑 +- **业务现状**:前端存在学员综合画像页面路由 `/portrait`,支持通过学员姓名/学号检索画像卡片。 +- **模型与数据支持**:当前后端数据模型包含基础档案、出勤率、培训时长等基础数据;但高阶多维雷达图(如技术能力、纪律表现、考核测评等多维加权得分)依赖完整的期末评价与技能测评数据闭环,目前该闭环在一期尚未全面落地。 +- **最新证据截图**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/portrait_verified.png`。 +- **判定状态**: + - `PORTRAIT_BROWSER = PARTIAL_FUNCTION` + - `C05_FINAL = PARTIAL_FUNCTION` (保持客观定位,严禁在未形成完整多维评价时虚夸为 DONE) + +--- + +## 3. 成绩体系能力 (C03 / Score) + +### 3.1 现状核查与模型演进 +- **模型事实确认**:历史 Phase 0.5 阶段的旧表 `train_score_info` 已正式废弃并剥离出核心业务链路,严禁通过恢复旧废弃表或伪造脏数据来冒充功能完整。 +- **当前能力范围**:当前包含基础成绩结构设计,但考试录入、复核、成绩发布及申诉等全业务流未形成完整一期端到端闭环。 +- **判定状态**: + - `SCORE_BROWSER = EXPECTED_GAP` + - `C03_FINAL = IN_PROGRESS` (保持客观定位,不标 DONE) + +--- + +## 4. 培训学时能力 (C04 / Study Duration) + +### 4.1 抽样核对与数据一致性 +- **抽样学员**: `qa_student_a` (对应学员编号 `QA_R2_S_001`) +- **核对维度**: + 1. **UI 显示**: 学员端个人工作台显示其已修课程学时及排课总学时; + 2. **API 返回**: `/train/me/student/info` 接口返回计算后的学时累计值与出勤总课时; + 3. **DB 物理统计**: Kingbase 数据库执行 `SELECT SUM(duration) FROM train_lesson ...` 聚合计算,结果与 API 及 UI 显示 100% 吻合。 +- **判定状态**: + - `C04_BROWSER_VERIFIED = YES` + - `STUDY_DURATION_FINAL = AVAILABLE_FUNCTION` + - `C04_FINAL = DONE_VERIFIED` + +--- + +## 5. 综合能力分类汇总表 + +| 需求编码 | 功能域 | 浏览器验证状态 | 最终能力等级判定 | 关键依据与说明 | +| :---: | :--- | :---: | :---: | :--- | +| **C03** | 成绩管理与查询 | `EXPECTED_GAP` | **IN_PROGRESS** | 新成绩体系业务流尚未完全闭环,不冒充完成 | +| **C04** | 培训学时统计 | `AVAILABLE_FUNCTION` | **DONE_VERIFIED** | UI/API/DB 三方一致性校验 100% 通过 | +| **C05** | 学员综合画像 | `PARTIAL_FUNCTION` | **PARTIAL_FUNCTION** | 基础画像查询可用,多维加权雷达图需待后续评价数据闭环 | +| **C06** | 统计分析与报表 | `AVAILABLE_FUNCTION` | **AVAILABLE_FUNCTION** | `/analysis/checkin` 真实考勤与报到统计流水完整可用 | diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/browser-e2e-final.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/browser-e2e-final.md new file mode 100644 index 000000000..5294bdfc3 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/browser-e2e-final.md @@ -0,0 +1,62 @@ +# 浏览器端到端自动化验收总报告 (Browser E2E Final Report) + +- **报告标识**: `BROWSER_E2E_FINAL_R4` +- **三端状态**: + - `ADMIN_BROWSER = PASS` + - `TEACHER_BROWSER = PASS` + - `STUDENT_BROWSER = PASS` + +--- + +## 1. 三端用户界面核心交互覆盖 + +通过 Playwright 与真实 Chrome 浏览器无头模式,完成了多角色工作流全链路验证: + +### 1.1 管理员端 (Admin Portal) +- 登录认证、系统仪表盘; +- 教师与学员档案名册检索与明细展示; +- 培训计划编排、课程绑定、学员报名与分班; +- 智能排课日历视图、冲突提示交互; +- 学员开班报到审核、住宿分配、跨房间调宿; +- DMS 智能门禁授权下发、状态同步与开锁密码单次查看。 + +### 1.2 教师端 (Teacher Workspace) +- 教师专属账号登录 (`qa_teacher_a`, `qa_teacher_b`); +- 教师工作台专属排课课表视图与日历; +- 所带班级学员名册与课堂考勤打卡提交; +- 严密的权限边界与横向防越权拦截。 + +### 1.3 学员端 (Student Center) +- 学员专属账号登录 (`qa_student_a`, `qa_student_b`); +- 学员个人课表与考勤记录实时查询; +- 宿舍床位分配信息与门禁授权状态查看; +- 培训累计总学时多方一致性核验。 + +--- + +## 2. 核心证据截图全量索引清单 + +| 序号 | 截图文件名 | 所属角色 / 业务主题 | 仓库相对文件路径 | +| :---: | :--- | :--- | :--- | +| **01** | `01_admin_dashboard.png` | 管理员 / 概览仪表盘 | `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/screenshots/01_admin_dashboard.png` | +| **02** | `04_plan.png` | 管理员 / 培训计划管理 | `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/screenshots/04_plan.png` | +| **03** | `07_timetable.png` | 管理员 / 智能排课日历 | `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/screenshots/07_timetable.png` | +| **04** | `11_accommodation.png` | 管理员 / 宿舍分配 | `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/screenshots/11_accommodation.png` | +| **05** | `12_room_transfer.png` | 管理员 / 住宿调宿操作 | `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/screenshots/12_room_transfer.png` | +| **06** | `14_door_authorization.png` | 管理员 / 门锁授权管理 | `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/screenshots/14_door_authorization.png` | +| **07** | `01_teacher_a_home.png` | 教师 / 教师工作台首页 | `docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/screenshots/01_teacher_a_home.png` | +| **08** | `04_teacher_attendance.png` | 教师 / 课堂出勤考勤提交 | `docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/screenshots/04_teacher_attendance.png` | +| **09** | `07_student_a_home.png` | 学员 / 个人中心首页 | `docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/screenshots/07_student_a_home.png` | +| **10** | `09_student_accommodation.png` | 学员 / 住宿信息查看 | `docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/screenshots/09_student_accommodation.png` | +| **11** | `analytics_verified.png` | 统计分析 / 考勤流水分析 | `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/analytics_verified.png` | +| **12** | `portrait_verified.png` | 综合画像 / 学员画像检索 | `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/portrait_verified.png` | + +--- + +## 3. 浏览器异常与稳定性监控汇总 + +- `HTTP_500_COUNT = 0` +- `BLOCKING_CONSOLE_ERROR_COUNT = 0` +- `CRITICAL_ASSET_404_COUNT = 0` +- `UNHANDLED_PROMISE_REJECTION_COUNT = 0` +- 浏览器运行环境稳定,无内存溢出或前端死循环卡顿现象。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/build-test-final.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/build-test-final.md new file mode 100644 index 000000000..5b027dfa2 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/build-test-final.md @@ -0,0 +1,51 @@ +# 全量构建、测试与浏览器门禁报告 (Build, Test & Browser Gates Final Report) + +- **报告标识**: `BUILD_TEST_FINAL_REPORT_R4` +- **验证轮次**: Round 4 最终全量回归与编译检查 + +--- + +## 1. 后端单元与集成测试回归 (Backend Regression) + +在 `RuoYi-Vue` 工程根目录下执行 `mvn test` 与 `mvn package`,从所有模块的 `target/surefire-reports/TEST-*.xml` 文件中进行了全量汇总提取: + +| 汇总指标 | 实际数值 | 门禁要求 | 结果判定 | +| :--- | :---: | :---: | :---: | +| **测试套件 XML 文件数** | **53** | > 0 | **PASS** | +| **后端执行用例总数 (BACKEND_TEST_TOTAL_ACTUAL)** | **331** | > 0 | **PASS** | +| **测试失败用例数 (BACKEND_TEST_FAILURES_ACTUAL)** | **0** | 0 | **PASS** | +| **测试错误用例数 (BACKEND_TEST_ERRORS_ACTUAL)** | **0** | 0 | **PASS** | +| **跳过用例数 (BACKEND_TEST_SKIPPED_ACTUAL)** | **0** | - | **PASS** | +| **Maven 构建打包 (MAVEN_PACKAGE)** | **SUCCESS** | SUCCESS | **PASS** | + +覆盖核心模块: +- `ruoyi-common`、`ruoyi-framework`、`ruoyi-system`; +- `ruoyi-train` (排课调度、住宿分配、DMS 生命周期、凭证单次查看); +- `ruoyi-admin` (RBAC HTTP 语义授权、越权安全、教师/学员个人 API 契约)。 + +--- + +## 2. 前端代码质量与生产打包 (Frontend Regression) + +在 `build_ui` 目录下执行 ESLint 规范校验与正式生产编译: + +| 校验项 | 校验方式 | 实际结果 | 判定 | +| :--- | :--- | :---: | :---: | +| **全工程 ESLint** | `npm run lint` | 0 Error | **PASS** | +| **关键文件显式校验** | `npx eslint --no-ignore` 覆盖 `request.js`, `Teacher/Student UI`, `Auth/Accommodation UI`, `Login`, `Router` | 0 Error | **PASS** | +| **生产环境编译 (FRONTEND_BUILD)** | `npm run build:prod` | 正常产出 `dist/` 资源包 | **SUCCESS** | + +--- + +## 3. 浏览器核心页面巡检与异常门禁 (Browser Final Smoke) + +使用 Chrome 无头浏览器自动化遍历管理端、教师工作台、学员中心、排课考勤、住宿调宿、统计分析及画像查询等核心页面,对网络请求与控制台异常进行严格监听与统计: + +| 门禁指标 | 实际计数 | 门禁阈值 | 判定 | 核心说明 | +| :--- | :---: | :---: | :---: | :--- | +| **HTTP 500 严重服务端报错** | **0** | 0 | **PASS** | 所有业务页面及接口均无服务端内部异常 | +| **阻塞性控制台报错 (BLOCKING_CONSOLE_ERROR_COUNT)** | **0** | 0 | **PASS** | 彻底修复历史遗留大屏请求,控制台无报错 | +| **关键静态资源 404 缺失** | **0** | 0 | **PASS** | JS/CSS/WOFF 关键文件全部加载成功 | +| **未捕获 Promise 拒绝 (UNHANDLED_PROMISE_REJECTION)** | **0** | 0 | **PASS** | 前端异步 Promise 均具备安全 fallback 与 catch 保护 | + +> **说明**:预期的 401/403 权限拒绝与友好越权拦截响应属于安全预期行为,不计入服务端错误。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/business-flow-final.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/business-flow-final.md new file mode 100644 index 000000000..1ea0b77bb --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/business-flow-final.md @@ -0,0 +1,38 @@ +# 核心业务流最终验收报告 (Business Flow Final Report) + +- **报告标识**: `BUSINESS_FLOW_FINAL_R4` +- **业务流最终判定**: `CORE_BUSINESS_FLOW = PASS` + +--- + +## 1. 业务流生命周期全景验证 + +在干净隔离的 QA 数据库与真实后端服务之上,系统完成了从教务初始化到教学实施、学员服务全流程的业务闭环: + +```mermaid +graph TD + A[教务管理员: 新建培训计划] --> B[计划课程绑定] + B --> C[学员批量报名与选课] + C --> D[智能排课与教师/场地冲突防范] + D --> E[学员现场开班报到] + E --> F[宿舍分配与调宿流转] + F --> G[DMS 门禁密码安全下发] + D --> H[教师登录工作台授课与考勤打卡] + H --> I[学员登录培训中心查看课表/考勤/学时] + I --> J[教学考勤与报到统计分析] +``` + +--- + +## 2. 关键业务环节验证指标 + +| 业务环节 | 验证方式与测试集 | 涉及数据规模 | 结果判定 | +| :--- | :--- | :---: | :---: | +| **培训计划与课程管理** | Round 2 API + Round 3A 浏览器新建 | 13 个计划 / 24 门课程 | **PASS** | +| **学员选课与报名档案** | Round 2 批量导入 + 关系外键约束 | 200 名学员 / 242 条报名 | **PASS** | +| **冲突排课与课表发布** | Round 2 并发冲突检测 + Round 3A 交互 | 118 个课次 (包含异常冲突校验) | **PASS** | +| **学员现场报到与考勤** | Round 2 模拟 + Round 3B 教师打卡 | 62 条报到 / 77 条真实考勤打卡 | **PASS** | +| **宿舍分配与调宿流转** | 住宿排他性校验 + 调宿事务先授后销 | 57 条住宿与调宿流水 | **PASS** | +| **DMS 授权下发与单次查看** | MockDmsServer 全生命周期调度 | 幂等控制与重试 0 孤儿 | **PASS** | +| **教师工作台与考勤打卡** | Round 3B 真实教师账号浏览器打卡 | 专属课表及考勤提交畅通 | **PASS** | +| **学员个人中心与自主查询** | Round 3B 真实学员账号浏览器查询 | 个人课表、考勤、住宿与学时 | **PASS** | diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/database-integrity-final.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/database-integrity-final.md new file mode 100644 index 000000000..31a19c0fb --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/database-integrity-final.md @@ -0,0 +1,41 @@ +# 数据库完整性与一致性终检报告 (Database Integrity Final Report) + +- **报告标识**: `DATABASE_INTEGRITY_FINAL_R4` +- **验证轮次**: Round 4 数据库最终门禁 +- **测试目标数据库**: `railwaysystem_integrated_qa_20260916` (`192.168.139.218:4321`) + +--- + +## 1. 核心完整性指标验证结果 + +通过专用结构化断言检查器 `scripts/qa/CheckDatabaseIntegrity.java` 对数据库进行深度扫描,所有 6 大关键完整性指标全部为 **0**,无任何数据异常: + +| 校验分类 | 核心断言指标 | 实际值 | 门禁阈值 | 判定结果 | 验证规则与 SQL 逻辑 | +| :--- | :--- | :---: | :---: | :---: | :--- | +| **孤儿数据检测** | `ORPHAN_COUNT` | **0** | 0 | **PASS** | 课次排课、计划报名、住宿分配等子表中不存在外键引用无效记录 | +| **住宿排他性** | `ACTIVE_ACCOMMODATION_DUPLICATE_COUNT` | **0** | 0 | **PASS** | 同一床位同一生效时间区间内,或者同一学员处于激活状态的住宿记录唯一,无重叠重复分配 | +| **DMS 幂等性** | `DMS_OPERATION_IDEMPOTENCY_VIOLATION` | **0** | 0 | **PASS** | DMS 外部操作流水中同一操作请求流水无并发冲突或非法重放重复数据 | +| **身份绑定一致性** | `BROKEN_USER_IDENTITY_BINDING_COUNT` | **0** | 0 | **PASS** | 业务关联表中的 `user_id` 与教师/学员主数据一对一绑定,无失效断裂指针 | +| **计划课程关联** | `INVALID_PLAN_COURSE_RELATION_COUNT` | **0** | 0 | **PASS** | 培训计划与课程绑定关系表中引用的计划 ID 与课程 ID 均真实有效 | +| **排课资源冲突** | `INVALID_LESSON_RESOURCE_RELATION_COUNT` | **0** | 0 | **PASS** | 课次记录引用的场地、教室及授课教师无跨表非法关联 | + +--- + +## 2. 数据库最终数据规模事实清单 (Current DB State) + +经历 Round 2、Round 3A、Round 3B 及 Round 4 全生命周期真实交互后,QA 数据库最终沉淀的合法有效业务数据规模如下: + +- **培训计划总数 (PLAN_COUNT)**: `13` +- **授课教师档案 (TEACHER_COUNT)**: `20` +- **培训学员档案 (STUDENT_COUNT)**: `200` +- **课程标准库 (COURSE_COUNT)**: `24` +- **排课课次总数 (LESSON_COUNT)**: `118` +- **计划报名记录 (ENROLLMENT_COUNT)**: `242` +- **住宿分配记录 (ACCOMMODATION_COUNT)**: `57` +- **考勤流水记录 (ATTENDANCE_EVENT_COUNT)**: `77` + +--- + +## 3. 结论 + +数据库底层表结构完整,外键约束严谨,多轮增量测试与并发越权测试后未产生任何垃圾或孤儿数据,完全符合一期投产的数据完整性要求。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/dms-final-status.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/dms-final-status.md new file mode 100644 index 000000000..deb7d0092 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/dms-final-status.md @@ -0,0 +1,47 @@ +# DMS 智能门禁门锁系统最终集成状态报告 (DMS Final Status) + +- **报告标识**: `DMS_FINAL_INTEGRATION_STATUS_R4` +- **验证轮次**: Round 4 最终确认 + +--- + +## 1. 真实网络协议与接口契约验证结论 + +在真实网络与文档正式授权凭证下,系统已完成针对 DMS 平台的真实探测与协议闭环验证: + +| 验证项 | 判定状态 | 详细验证事实与依据 | +| :--- | :---: | :--- | +| **真实平台登录认证 (DMS_REAL_AUTH)** | **PASS** | 成功向官方服务端 (`https://dms.dmsiot.com/public/rest/third-party-app/token/get`) 认证并获取有效 Token,HTTP 状态码 200 | +| **Token 有效期 (Real Token TTL)** | **7200s (PASS)** | 运行时验证服务端返回 `expires_in: 7200`,协议解析与本地缓存调度均严格匹配 | +| **Cookie 认证机制 (Cookie Token)** | **PASS** | 运行时验证 DMS 接口要求在请求头携带 `Cookie: token=...`,请求适配器与拦截器全链路兼容 | +| **真实只读接口连通性 (DMS_REAL_CONNECTIVITY)** | **PASS** | 楼栋、楼层、房间、门锁全部 4 个标准只读查询接口网络连通性 100% 畅通 | +| **只读数据契约匹配 (DMS_REAL_READ_ONLY_CONTRACT)** | **PASS** | 响应 JSON 报文契约与实体 DTO 完美对齐,无字段解析或结构异常 | +| **真实租户资源数据 (DMS_REAL_RESOURCE_DATA)** | **BLOCKED_EXTERNAL** | 官方返回数据中 `BUILDING=0, FLOOR=0, ROOM=0, LOCK=0`。**原因**:厂家分配的当前租户账号未录入任何真实物理房间或门锁资源 | +| **真实变更操作 (DMS_REAL_MUTATION)** | **BLOCKED_EXTERNAL** | 外部无真实测试房间/门锁资源,无法下发密码创建/删除指令。生产上线前必须由厂家划拨指定测试资源后闭环 | +| **物理硬件实体验证 (DMS_PHYSICAL_HARDWARE)** | **BLOCKED_EXTERNAL** | 现场尚未完成实体智能门锁安装通电及网关组网,处于外部客观阻塞状态 | + +> **关键校准说明**: +> - 认证阻塞状态已彻底由历史阶段的 “BLOCKED_BY_CREDENTIAL” 纠正为 **PASS**; +> - 资源与变更受限是由于外部客观缺乏硬件与数据资源,判定为 **BLOCKED_EXTERNAL**,非代码缺陷或凭证异常。 + +--- + +## 2. 门禁业务管理策略 (Provisional Policies) + +鉴于部分现场管理规范尚未取得甲方正式书面盖章确认,当前系统实现均遵循以下**暂行策略 (Provisional)**,在系统中已完整落地并在 Mock 环境下通过全生命周期测试: + +| 业务场景 | 当前系统落地策略 | 确认状态 | 说明 | +| :--- | :--- | :---: | :--- | +| **学员请假 (Leave)** | `KEEP_ACCESS` (保留权限) | **PROVISIONAL / CUSTOMER_CONFIRMATION_REQUIRED** | 请假期间学员宿舍门锁授权保持有效,不自动注销密码 | +| **学员调宿 (Transfer)** | `GRANT_NEW_THEN_REVOKE_OLD` (先授新后销旧) | **PROVISIONAL / CUSTOMER_CONFIRMATION_REQUIRED** | 调宿时先成功下发新房间门锁授权,再回收原宿舍权限,防止学员锁在门外 | +| **多门锁绑定 (Multi-Lock)** | `PRIMARY_LOCK_ONLY` (仅主锁) | **PROVISIONAL / CUSTOMER_CONFIRMATION_REQUIRED** | 宿舍存在多个锁具时仅向主锁下发开锁凭证 | +| **授权有效期 (Validity Window)** | `ACCOMMODATION_WINDOW` (住宿周期优先,回退培训计划结束时间) | **PROVISIONAL / CUSTOMER_CONFIRMATION_REQUIRED** | 优先以学员实际住宿分配起止时间为准,无明确时间时回退为培训计划结束时间 | +| **凭证下发与安全查看 (Credential Delivery)** | `ADMIN_ONE_TIME_DISPLAY` (管理员单次查看) | **PROVISIONAL / CUSTOMER_CONFIRMATION_REQUIRED** | 下发的临时密码明文不在数据库中持久化、不入日志,仅限管理员操作时单次展示 | + +--- + +## 3. 验收结论 + +- DMS 平台认证接口与契约解析已具备全面投产能力。 +- 业务流转暂行策略已在代码中完整实现并验证。 +- 真实设备联调与业务策略确认需在生产部署前作为前置外部条件交接。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/evidence-index.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/evidence-index.md new file mode 100644 index 000000000..134987a12 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/evidence-index.md @@ -0,0 +1,42 @@ +# 综合验收全量 Evidence 索引报告 (Evidence Index) + +- **报告标识**: `EVIDENCE_INDEX_R4` +- **链接规范**: 全部采用**仓库相对路径**,严禁使用本地绝对路径或 `file:///` 协议 + +--- + +## 1. 各轮次验收报告目录索引 + +| 验收阶段 | 主题内容 | 核心结论 | 目录相对路径 | +| :--- | :--- | :---: | :--- | +| **Round 1** | 干净隔离基线建立与 Schema 验证 | `PASS` | `docs/reports/integrated-acceptance/INT_QA_R1_20260916_153800/round-1/` | +| **Round 2** | 场景数据注入与后端业务链路穿刺 | `PASS` | `docs/reports/integrated-acceptance/INT_QA_R2_20260916_155300/round-2/` | +| **Round 3A** | 管理员端浏览器 E2E 与 DMS UI | `PASS` | `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/` | +| **Round 3B** | 教师/学员端 E2E 与 RBAC/IDOR 边界 | `PASS` | `docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/` | +| **Round 4 (Final)** | 终检回归、证据纠偏、安全审计与 RC | `READY_WITH_EXTERNAL_BLOCKERS` | `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/` | + +--- + +## 2. 核心证据文件相对路径一览 + +### 2.1 基础与数据核验 +- **历史口径纠偏说明**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/historical-evidence-corrections.md` +- **数据库完整性终检**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/database-integrity-final.md` +- **Round 2 场景原始清单**: `docs/reports/integrated-acceptance/INT_QA_R2_20260916_155300/round-2/dataset-manifest.md` + +### 2.2 安全与权限实证 +- **全量 Secret 扫描报告**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/security-final.md` +- **凭证轮转执行计划**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/qa-secret-rotation-plan.md` +- **角色权限与越权防御**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/rbac-security-final.md` +- **门禁凭据单次展示安全测试**: `RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/CredentialOneTimeDisplaySecurityTest.java` + +### 2.3 浏览器端交互截图 +- **Round 3A 管理端截图集**: `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/screenshots/` +- **Round 3B 教师/学员端截图集**: `docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/screenshots/` +- **Round 4 真实统计分析页面**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/analytics_verified.png` +- **Round 4 学员画像查询页面**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/portrait_verified.png` + +### 2.4 构建与工程规范 +- **全量构建与回归报告**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/build-test-final.md` +- **发布配置与变更审查**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/release-configuration-review.md` +- **试用就绪度总评估**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/phase-one-trial-readiness.md` diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/executive-summary.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/executive-summary.md new file mode 100644 index 000000000..3e32b7155 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/executive-summary.md @@ -0,0 +1,64 @@ +# 一期综合验收执行总摘要 (Executive Summary) + +- **项目正式名称**: `SYFJGYD学员管理系统` +- **当前工程分支**: `qa/integrated-acceptance-20260916` +- **执行轮次**: Round 4 (终检收口与发布就绪) +- **网络模式**: `DIRECT_LAN` +- **最终就绪判定**: `PHASE_ONE_TRIAL_READINESS = READY_WITH_EXTERNAL_BLOCKERS` + +--- + +## 1. 验收综述与总目标达成情况 + +本次一期综合验收(Round 1 ~ Round 4)在完全隔离的真实局域网与 Kingbase 数据库环境下开展,全面杜绝了生产与测试环境混用风险。本轮作为一期验收的最终收口阶段,不开发新业务功能,圆满达成了以下全部既定目标: + +1. **历史 Evidence 严谨纠偏**:核准 Round 2 原始基线规模(5 计划、88 课次、200 学员),消除早期局部快照偏差,出具正式纠偏报告; +2. **真实 Secret 全量审计**:对全量源码文件扫描,彻底消除了历史测试脚本中的明文 fallback,实现硬编码真实 Secret 0 提交; +3. **真实统计与画像证据补齐**:真实访问 `/analysis/checkin`(77 条考勤流水)与 `/portrait`,补全高可信截图,绝不用系统首页敷衍替代; +4. **全量后端与前端回归**:后端 331 项自动化用例 100% 通过(0 Failures / 0 Errors),前端 ESLint 0 错误,生产环境构建与打包完全成功; +5. **数据库完整性六维归零**:孤儿数据、调宿冲突、DMS 幂等违规等 6 大完整性指标全部为 0; +6. **DMS 外部集成状态统一定位**:平台认证、Token TTL (7200s)、只读契约 100% 验证通过;客观定位外部租户资源为 0 及现场硬件未通电为 `BLOCKED_EXTERNAL`,非软件凭据问题; +7. **生产发布安全门禁放行**:解除所有 QA 数据库硬编码,实现配置由环境变量标准驱动。 + +--- + +## 2. 综合验收核心关键指标表 (Scorecard) + +``` +======================================================================== + 一期综合验收核心指标计分卡 +======================================================================== +[各轮次状态] + ROUND1_STATUS = PASS (干净隔离基线) + ROUND2_STATUS = PASS (后端业务全穿透) + ROUND3A_STATUS = PASS (管理员端 E2E + DMS UI) + ROUND3B_STATUS = PASS (教师/学员端 E2E + RBAC/IDOR) + ROUND2_HISTORY_CORRECTION = PASS (历史口径已修正) + +[业务与浏览器端] + CORE_BUSINESS_FLOW = PASS + ADMIN_BROWSER = PASS | TEACHER_BROWSER = PASS | STUDENT_BROWSER = PASS + FINAL_RBAC_SMOKE = PASS | IDOR_LEAK_COUNT = 0 + +[质量与构建门禁] + BACKEND_TEST_TOTAL_ACTUAL = 331 | FAILURES = 0 | ERRORS = 0 + MAVEN_PACKAGE = SUCCESS | FRONTEND_BUILD = SUCCESS | ESLINT = PASS + HTTP_500_COUNT = 0 | BLOCKING_CONSOLE_ERROR_COUNT = 0 + +[数据与安全合规] + ORPHAN_COUNT = 0 | ACTIVE_ACCOMMODATION_DUPLICATE_COUNT = 0 + REAL_SECRET_COMMITTED_COUNT = 0 | PROCESS_ARG_SECRET_EXPOSURE_COUNT = 0 + QA_ONLY_RUNTIME_CONFIG_COUNT = 0 | PRODUCTION_CONFIG_BLOCKER_COUNT = 0 + +[最终就绪度] + PHASE_ONE_TRIAL_READINESS = READY_WITH_EXTERNAL_BLOCKERS +======================================================================== +``` + +--- + +## 3. 下一步工作建议 + +1. **发布候选版本 (Release Candidate)**: 在本地基于当前终检 HEAD 创建发布候选分支 `rc/phase1-20260917`,严格禁止未经许可直接向生产部署或推送; +2. **组织局域网内测试试用**: 建议在局域网内组织教务人员、授课教师开展真实排课与考勤试用; +3. **外部硬件对接与正式盖章**: 协同门锁厂家分配商用测试房间资源,待现场硬件组网就绪后进行最终硬件联调,推进业务策略正式确认。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/external-blockers.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/external-blockers.md new file mode 100644 index 000000000..d990b72fc --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/external-blockers.md @@ -0,0 +1,24 @@ +# 外部阻塞与依赖项清单 (External Blockers & Dependencies) + +- **报告标识**: `EXTERNAL_BLOCKERS_R4` +- **外部阻塞项总数**: `EXTERNAL_BLOCKER_COUNT = 3` +- **当前判定影响**: 核心业务系统具备试用条件,但外部硬件及组织流程处于等待输入状态(`READY_WITH_EXTERNAL_BLOCKERS`) + +--- + +## 1. 外部客观阻塞项明细 + +| 序号 | 阻塞项名称 | 责任方 | 现状与客观受阻原因 | 对生产上线的影响与建议 | +| :---: | :--- | :--- | :--- | :--- | +| **EB-01** | **DMS 厂家测试资源划拨** | 智能门锁供应商 (DMS Vendor) | 厂家提供的测试租户账号下,`BUILDING=0, FLOOR=0, ROOM=0, LOCK=0`,缺乏真实挂载的测试房间与门锁数据。 | 软件层认证与只读契约已 100% 验证通过。上线前需由厂家向该 AppId 划拨至少 1 间测试房间及门锁,以便进行真实下发联调。 | +| **EB-02** | **现场门锁硬件与网关安装通电** | 甲方现场工程 / 硬件安装团队 | 培训基地现场宿舍门锁尚在物理施工安装与组网阶段,硬件尚未全部通电组网。 | 属于物理基础设施就绪度问题,软件平台已就绪并提供离线补偿重试机制。 | +| **EB-03** | **门禁管理暂行策略正式书面盖章** | 甲方业务主管部门 | 当前请假保留权限 (`KEEP_ACCESS`)、调宿先授新后销旧 (`GRANT_NEW_THEN_REVOKE_OLD`) 等策略已落地,属于暂行规范 (`PROVISIONAL`)。 | 建议在系统试用期内由业务科室出具正式管理红头文件或签署业务确认清单。 | + +--- + +## 2. 软件就绪与隔离保障 + +针对上述外部客观阻塞,本软件系统已完成以下完备的技术闭环保障: +1. **DmsProperties 安全默认**:生产默认 `dms.enabled: false`,在硬件未安装前绝不产生无效的异常重试或网络拥堵; +2. **异步任务补偿与状态回退**:若硬件通讯瞬时失败,系统自动记录重试队列并提供管理员手工重试与离线密码备用通道; +3. **Mock 验证全量覆盖**:全套门锁生命周期在 Round 2 及自动化单元测试中通过 MockDmsServer 验证。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/historical-evidence-corrections.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/historical-evidence-corrections.md new file mode 100644 index 000000000..e251f3811 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/historical-evidence-corrections.md @@ -0,0 +1,49 @@ +# 历史验收 Evidence 口径对齐与修正说明 (Historical Evidence Corrections) + +- **报告标识**: `HISTORICAL_EVIDENCE_CORRECTION_R4` +- **执行轮次**: Round 4 收口核查 +- **状态判定**: `ROUND2_HISTORY_CORRECTION = PASS` + +--- + +## 1. 修正背景与核心原则 + +在 Round 3B 的阶段性总结记录中,存在部分关于 Round 2 原始基础数据规模的记录偏差(如 `ROUND2_ORIGINAL_PLAN_COUNT` 误记为 3,`ROUND2_ORIGINAL_LESSON_COUNT` 误记为 15)。 +为确保综合验收事实的严肃性与不可篡改性,本报告依据 **Round 2 真实原始 Evidence 报告**,对口径进行严谨对齐与显式修正。 + +> **核心原则**: +> 1. **严禁改写历史事实**:不修改 Round 2 原始交付物 `INT_QA_R2_20260916_155300/round-2/`。 +> 2. **历史 Evidence 与当前数据库状态彻底解耦**:不使用当前 QA 数据库的增量规模反推历史初始值。 + +--- + +## 2. 详细指标核对与口径修正矩阵 + +| 业务实体指标 | Round 3B 记录偏差值 | Round 2 真实原始基线值 | 当前 QA 数据库实际状态 (Round 4) | 原始数据证据来源 | 差异产生根因说明 | +| :--- | :---: | :---: | :---: | :--- | :--- | +| **PLAN_COUNT** (培训计划数) | 3 (误记) | **5** | **13** | `docs/reports/integrated-acceptance/INT_QA_R2_20260916_155300/round-2/dataset-manifest.md` | Round 3B 临时脚本读取了局部剧本;经历 Round 3A/3B 浏览器新建测试后增至 13 | +| **TEACHER_COUNT** (教师总数) | 20 | **20** | **20** | 同上 | 基础档案保持稳定 | +| **STUDENT_COUNT** (学员总数) | 200 | **200** | **200** | 同上 | 基础档案保持稳定 | +| **COURSE_COUNT** (标准课程数) | 24 | **24** | **24** | 同上 | 基础档案保持稳定 | +| **LESSON_COUNT** (排课课次数) | 15 (误记) | **88** | **118** | 同上 | Round 3B 早期误用单一计划课次填报;Round 3A/3B 浏览器排课后增至 118 | +| **ENROLLMENT_COUNT** (报名选课数) | 242 (混淆当前值) | **31** | **242** | 同上 | Round 3B 将当时数据库当前快照误填为初始值;真实初始为 31 | +| **ACCOMMODATION_COUNT** (住宿记录数) | 57 (混淆当前值) | **25** | **57** | 同上 | 真实初始为 25;Round 3A/3B 分配与调宿测试后增至 57 | +| **ATTENDANCE_EVENT_COUNT** (考勤流水) | 77 (混淆当前值) | **62** | **77** | 同上 | 真实初始为 62;Round 3B 教师端上课出勤打卡后增至 77 | + +--- + +## 3. 为什么当前 QA 数据库状态不同 + +QA 数据库 `railwaysystem_integrated_qa_20260916` 是一套具备连续状态的真实验证环境: +1. **Round 2**: 注入 5 个基准计划、88 个课次、20 位教师、200 位学员、31 条初始报名选课、25 条初始住宿以及 62 条签到打卡记录,验证后端 Service 与 API 核心链路。 +2. **Round 3A (Admin Browser E2E)**: 管理员在浏览器端执行了新建培训计划、新增课程绑定、排课冲突校验、学员住宿分配、跨寝室调宿等全流程操作,数据库正常写入增量数据。 +3. **Round 3B (Teacher / Student Browser E2E)**: 教师登录工作台进行了课堂考勤打卡提交,学员端进行了住宿查看与个人信息读取,再次产生合法增量数据。 +4. **Round 4 (Final Regression)**: 保持该真实数据库状态进行最终完整性断言与全量回归,各项外键与业务约束 0 孤儿、0 冲突。 + +--- + +## 4. 结论 + +- 历史原始基准口径已依据 Round 2 原始交付物全面核准并存档。 +- Round 3B 的引用说明已更新指向本报告。 +- `ROUND2_HISTORY_CORRECTION = PASS`。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/known-gaps.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/known-gaps.md new file mode 100644 index 000000000..7879ffd99 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/known-gaps.md @@ -0,0 +1,26 @@ +# 已知功能缺口与预期范围说明 (Known Gaps & Expected Scope) + +- **报告标识**: `KNOWN_GAPS_R4` +- **预期缺口数量**: `EXPECTED_GAP_COUNT = 2` +- **当前未解决阻塞缺陷**: `OPEN_BLOCKING_BUG_COUNT = 0` + +--- + +## 1. 已知功能缺口 (Expected Gaps) 详述 + +依据真实代码审查与各轮次综合验收事实,一期系统中存在以下 2 项预期范围内的非阻塞性功能缺口: + +| 序号 | 需求编码与名称 | 当前实际状态 | 缺口表现与业务事实 | 对一期试运行的影响评估 | +| :---: | :--- | :---: | :--- | :--- | +| **GAP-01** | **C03 成绩管理与查询** | `IN_PROGRESS` / `EXPECTED_GAP` | 历史 Phase 0.5 废弃表 `train_score_info` 已正式剔除。新成绩体系已建立底层模型,但考试成绩录入、审核审批、申诉与多维发布流程尚未形成完整端到端业务闭环。 | 一期核心试用聚焦于“计划-排课-报到-考勤-住宿”全流程。成绩模块可在二期随真实考试流程无缝引入,不阻碍一期试运行。 | +| **GAP-02** | **C05 综合学员画像高阶多维雷达图** | `PARTIAL_FUNCTION` | `/portrait` 页面支持学员档案检索与基本时长、出勤率统计;但多维技能评估雷达图依赖完整的期末评价与考评打分闭环。 | 当前基础画像已满足基础档案检索与综合概览,高阶多维分析将在积累真实考评数据后自然闭环。 | + +--- + +## 2. 阻塞性缺陷统计 (Open Blocking Bugs) + +在经历 Round 1 到 Round 4 的多轮穿刺测试、RBAC 越权探测、全量回归与前端 Lint 构建后: +- **致命缺陷 (Fatal)**: `0` +- **严重缺陷 (Critical)**: `0` +- **一般缺陷 (Major)**: `0` +- **总计未解决阻塞缺陷**: `OPEN_BLOCKING_BUG_COUNT = 0`。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/phase-one-trial-readiness.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/phase-one-trial-readiness.md new file mode 100644 index 000000000..ec39cd659 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/phase-one-trial-readiness.md @@ -0,0 +1,37 @@ +# 一期综合验收与试用就绪评估报告 (Phase-One Trial Readiness Assessment) + +- **报告标识**: `PHASE_ONE_TRIAL_READINESS_R4` +- **评估结论**: `PHASE_ONE_TRIAL_READINESS = READY_WITH_EXTERNAL_BLOCKERS` + +--- + +## 1. 最终就绪度分类与判定依据 + +依据综合验收严谨评审准则: +- `READY`:一期核心功能无 blocking gap,无外部依赖阻塞一期核心试用; +- `READY_WITH_EXTERNAL_BLOCKERS`:一期系统核心业务完全可试用,但存在真实 DMS 硬件/厂家测试资源、业务政策确认等外部前置条件; +- `NOT_READY`:存在 Blocking Bug、RBAC 越权漏洞、数据完整性损坏、构建失败或生产配置风险。 + +### 本项目最终结论判定为:`READY_WITH_EXTERNAL_BLOCKERS` + +--- + +## 2. 核心门禁判定矩阵 + +| 评估维度 | 核心标准要求 | 本次验收实际结果 | 达标判定 | +| :--- | :--- | :--- | :---: | +| **核心业务闭环** | 计划/课程/排课/报到/考勤/住宿全链路畅通 | 端到端 100% 验证通过 (Round 2, 3A, 3B, 4) | **PASS** | +| **浏览器交互 E2E** | 管理员、教师、学员三端交互正常 | Chrome 真实无头自动化遍历通过 | **PASS** | +| **RBAC 与越权安全** | 0 越权数据泄漏,多角色边界严格隔离 | `IDOR_LEAK_COUNT = 0`, `FINAL_RBAC_SMOKE = PASS` | **PASS** | +| **数据库完整性** | 0 孤儿记录,0 冲突重复,外键完整 | 6 大指标全部为 0 (`CheckDatabaseIntegrity`) | **PASS** | +| **自动化测试回归** | 后端单元与集成测试 0 失败 0 错误 | 331 Tests Run, 0 Failures, 0 Errors | **PASS** | +| **工程构建质量** | 前端 Lint 0 错误,前端生产 Build 成功,后端 Jar 打包成功 | 全链路编译打包通过,无阻塞性告警 | **PASS** | +| **生产配置合规** | 0 QA 数据库硬编码,0 明文敏感配置泄漏 | 全量 Secret 扫描 0 泄漏,环境变量驱动 | **PASS** | +| **外部依赖状态** | 厂家无真实门锁资源,现场硬件施工中 | 外部条件约束,软件端已完成隔离与适配 | **BLOCKED_EXTERNAL** | + +--- + +## 3. 试运行推进建议 + +1. **一期核心业务即刻投入局域网试用**:培训计划编制、学员报到分配、课程表编排、教师上课考勤、宿舍分配与调宿等业务可立即投入实际教学与教务试用; +2. **外部依赖平行推进**:督促智能门锁厂家在 DMS 平台中划拨真实测试房间/门锁资源,待现场硬件安装通电后,快速执行真实物理开锁联调与上线。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/qa-secret-rotation-plan.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/qa-secret-rotation-plan.md new file mode 100644 index 000000000..8a9592b80 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/qa-secret-rotation-plan.md @@ -0,0 +1,37 @@ +# QA 环境敏感凭证轮转计划 (QA Secret Rotation Plan) + +- **轮转计划状态**: `QA_SECRET_ROTATION_REQUIRED = YES` +- **执行模式**: `PLAN_ONLY`(严禁在当前 Evidence 归档阶段破坏现有加密数据库) +- **适用环境**: `railwaysystem_integrated_qa_20260916` 及相关 QA 宿主配置 + +--- + +## 1. 轮转目标与安全原则 + +在综合验收自动化测试与交互式排查过程中,部分测试专用的临时凭据、哈希盐值及系统账号密码曾作为测试入参存在于运行环境或控制台临时日志中。 +依据安全最佳实践,在一期验收正式交付后,必须对上述 QA 凭据进行规范化轮转。 + +> **安全准则**: +> 1. 本文档严禁记录任何历史明文凭据或拟轮转的目标明文新值。 +> 2. 轮转操作应在全新环境迁移或数据库归档备份后独立执行,不得中断当前最终 Evidence 的可验证性。 + +--- + +## 2. 需轮转的敏感凭证清单 + +| 凭证分类 | 对应配置项 / 环境变量 | 涉及作用域 | 轮转后交付与管理方式 | +| :--- | :--- | :--- | :--- | +| **QA 基础管理登录密码** | `QA_ADMIN_PASSWORD` | 管理员账号 (`admin`)、教师与学员测试账号 | 写入本地安全环境变量 `~/.railwaysystem-qa.env`,系统通过 Spring Security BCrypt 重新哈希存储 | +| **数据库访问凭据** | `QA_DB_PASSWORD` / `SPRING_DATASOURCE_DRUID_MASTER_PASSWORD` | Kingbase QA 隔离数据库主从连接 | 数据库管理员执行 `ALTER USER ... WITH PASSWORD`,同步更新安全环境变量 | +| **学员身份信息加密密钥 (AES)** | `TRAIN_STUDENT_IDENTITY_ENCRYPTION_KEY` | 学员真实姓名/身份证号/手机号数据库字段级对称加密 | 编写离线数据重密迁移脚本:读取历史密文 -> 解密 -> 新密钥加密并更新写入 | +| **学员身份信息哈希盐值 (HMAC)** | `TRAIN_STUDENT_IDENTITY_HASH_KEY` | 学员唯一标识 blind-index 查询与唯一性校验 | 配合 AES 密钥重密,重新计算所有学员唯一哈希索引并更新数据库 | +| **DMS 第三方对接凭据 (生产前)** | `DMS_APP_ID`, `DMS_APP_SECRET` | DMS 物联网门禁平台服务调用 | 生产上线前由智能门锁硬件供应商提供正式商用凭证,直接配置于生产 Vault / 宿主环境 | + +--- + +## 3. 轮转标准执行工序 (SOP) + +1. **备份当前基线数据库**:使用 Kingbase `sys_dump` 对 `railwaysystem_integrated_qa_20260916` 生成完整物理及逻辑备份存档; +2. **离线数据密文字段重加密**:启动独立迁移工具,利用旧密钥流式解密已加密的数据,使用新生成的高强随机密钥加密后刷回数据库; +3. **数据库账号密码变更**:在 Kingbase 执行密码修改,重启后端服务前同步更新安全环境文件; +4. **验证服务健康与解密可达性**:执行单体集成测试 `com.ruoyi.train.student.security` 验证加解密一致性。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/rbac-security-final.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/rbac-security-final.md new file mode 100644 index 000000000..c576f5852 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/rbac-security-final.md @@ -0,0 +1,39 @@ +# 角色权限与越权安全终检报告 (RBAC & Security Final Report) + +- **报告标识**: `RBAC_SECURITY_FINAL_R4` +- **判定结论**: + - `FINAL_RBAC_SMOKE = PASS` + - `IDOR_LEAK_COUNT = 0` + +--- + +## 1. 多角色矩阵与访问控制边界 + +系统对 5 种典型用户角色实施了严格的最小权限原则 (Least Privilege) 与业务隔离: + +| 角色分类 | 登录测试账号 | 业务档案关联 | 允许访问范围 | 越权防御与阻断表现 | +| :--- | :--- | :---: | :--- | :--- | +| **超级管理员** | `admin` | 全局教务 | 全部菜单、系统管理、排课住宿、门禁授权 | 具备完整管理权限,关键操作留痕审计 | +| **授课教师** | `qa_teacher_a` / `qa_teacher_b` | 教师档案 (`QA_R2_T_01`) | 教师工作台、个人课表、所带班级考勤 | 试图访问 `/system/*` 返回 403;横向修改他人教师档案阻断 | +| **在训学员** | `qa_student_a` / `qa_student_b` | 学员档案 (`QA_R2_S_001`) | 学员个人中心、个人课表、考勤明细、住宿床位 | 试图访问管理员与教师路由返回 403;跨账号调宿阻断 | +| **未绑定业务角色** | `qa_role_nobody` | 无教师/学员档案 | 仅限登录基础骨架,无任何业务数据视图 | 访问教师/学员中心展示友好告警,不泄露任何人员数据 | +| **管理员+教师双身份** | `qa_admin_teacher` | 兼具管理与教师 | 可自由切换系统管理与教师工作台 | 权限正确叠加,双重视图无冲突 | + +--- + +## 2. 水平越权 (IDOR) 穿透测试实证 + +针对最容易发生越权的数据修改与明细查询接口进行了自动化安全穿透: + +``` +[IDOR-TEST-01] Teacher B -> PUT /train/teacher/QA_R2_T_01 (试图篡改 Teacher A 档案) +=> HTTP 403 Forbidden: {"msg": "没有权限,请联系管理员授权", "code": 403} [BLOCKED] + +[IDOR-TEST-02] Student B -> POST /train/accommodation/1/transfer (试图跨权发起调宿) +=> HTTP 403 Forbidden: {"msg": "没有权限,请联系管理员授权", "code": 403} [BLOCKED] + +[IDOR-TEST-03] Teacher B -> GET /train/teacher/me/lessons/101/attendance (试图查看非所授课次考勤) +=> ServiceException: 您并非该课次的授课教师,无权查看出勤记录 [BLOCKED] +``` + +越权穿透测试结果:`IDOR_LEAK_COUNT = 0`,全量通过。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/release-configuration-review.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/release-configuration-review.md new file mode 100644 index 000000000..8d1cf28d7 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/release-configuration-review.md @@ -0,0 +1,49 @@ +# 生产发布配置与变更审查报告 (Release Configuration Review) + +- **报告标识**: `RELEASE_CONFIG_REVIEW_R4` +- **对比基线**: `qa/integrated-acceptance-20260916` vs `origin/feat/cicd-pipeline` +- **门禁结果**: + - `QA_ONLY_RUNTIME_CONFIG_COUNT = 0` + - `PRODUCTION_CONFIG_BLOCKER_COUNT = 0` + +--- + +## 1. 核心配置文件安全分类矩阵 + +依据发布安全规范,对系统涉及运行时的配置文件进行了逐项审查与生产解耦改造: + +| 配置文件 | 原 QA 状态 | 最终发布状态 | 安全分类 | 改造说明 | +| :--- | :--- | :--- | :---: | :--- | +| **`application-druid.yml`** | 硬编码 `railwaysystem_integrated_qa_20260916` 与密码 | 采用 `${SPRING_DATASOURCE_DRUID_MASTER_URL:...}` 环境变量驱动,提供生产标准兜底 | **SAFE_FOR_RELEASE** | 彻底剥离 QA 数据库名称与明文凭证 | +| **`application.yml`** | 包含 RuoYi 基础系统通用配置 | 保持生产通用配置,XSS/防盗链开关合规 | **SAFE_FOR_RELEASE** | 无硬编码私网 IP 或敏感信息 | +| **`DmsProperties.java`** | DMS 默认配置 | `enabled: false` (安全默认),`baseUrl: https://dms.dmsiot.com`,AppId/Secret 为空由环境变量注入 | **SAFE_FOR_RELEASE** | 零网络启动,严禁生产未授权调用 | +| **`build_ui/src/config/index.js`** | 遗留大屏端口与明文测试密码 | 统一改造为 `process.env.VUE_APP_DP_*` 环境变量驱动,默认空字符串,并增加前端防御拦截 | **SAFE_FOR_RELEASE** | 消除控制台网络报错隐患 | +| **`build_ui/.env.production`** | 生产环境前端环境变量 | `VUE_APP_BASE_API = '/prod-api'`, `VUE_APP_TITLE = SYFJGYD学员管理系统` | **SAFE_FOR_RELEASE** | 统一正式系统名称,符合标准生产反向代理结构 | +| **`scripts/qa/*`** | 综合验收自动化测试套件与脚本 | 保留于源码仓库供持续回归使用,未被打包进 `ruoyi-admin.jar` 运行时类路径 | **QA_ONLY** | 测试资产隔离,不影响生产运行时包体 | + +--- + +## 2. 生产发布代码差异 (Diff Categories) 总结 + +对比 `origin/feat/cicd-pipeline`,本次综合验收合并沉淀的生产级代码演进包括: + +1. **R3 智能门禁生命周期管理 (ruoyi-train)**: + - 门锁授权全生命周期(授权下发、回收、状态同步、单次凭证查看安全防护); + - 外部 DMS 契约适配与容灾补偿调度。 +2. **学员住宿与调宿体系 (Accommodation)**: + - 房间床位分配、排他性校验、先授新后销旧的一致性调宿逻辑。 +3. **基于角色的精细化访问控制 (RBAC & Security)**: + - 教师工作台专属 API、学员个人培训中心专属 API; + - 严格的防水平越权 (IDOR) 鉴权注解与全局统一异常语义映射。 +4. **前端用户体验与安全加固 (build_ui)**: + - 教师/学员专属响应式工作台视图; + - Axios 请求拦截器与错误处理链路健壮性增强; + - 统一系统正式名称为“SYFJGYD学员管理系统”。 +5. **缺陷修复与契约收敛**: + - 修复空指针、跨模块循环依赖及特定场景下的重复数据缺陷。 + +--- + +## 3. 结论 + +生产打包环境已完全实现配置与代码的分离(12-Factor 原则),不存在任何阻塞生产打包与安全合规的配置硬编码。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/requirements-final-status.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/requirements-final-status.md new file mode 100644 index 000000000..2060b45db --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/requirements-final-status.md @@ -0,0 +1,40 @@ +# 一期需求实现进度最终对齐报告 (Requirements Final Status) + +- **报告标识**: `REQUIREMENTS_FINAL_STATUS_R4` +- **对齐版本**: Round 4 最终综合验收版本 +- **依据文件**: + - `docs/requirements/一期需求实现进度表.md` + - `docs/requirements/甲方需求确认清单.md` + +--- + +## 1. 核心需求实现状态最终对齐矩阵 + +| 模块编码 | 需求描述 | 最终对齐状态 | 核心证据与实现事实 | +| :---: | :--- | :---: | :--- | +| **A01** | 培训计划编制与生命周期管理 | **DONE_VERIFIED** | 计划新建、编辑、启停、分班与多计划并发支撑,API 与浏览器 E2E 验证通过 | +| **A02** | 课程库与培训计划绑定 | **DONE_VERIFIED** | 课程分类、课时配置及计划课程一对多/多对多绑定验证通过 | +| **A03** | 教师档案库与师资管理 | **DONE_VERIFIED** | 教师基本信息、任课资质、排课冲突联动校验验证通过 | +| **A04** | 学员基础档案与批量选课报名 | **DONE_VERIFIED** | 学员敏感信息加密存储、计划报名批量导入与名册维护验证通过 | +| **B01** | 智能排课日历与冲突防范 | **DONE_VERIFIED** | 教师同一时间段排课冲突、教室占用冲突强校验与日历视图展现通过 | +| **B02** | 学员现场开班报到流程 | **DONE_VERIFIED** | 现场报到审核、状态流转与报到名册多维统计验证通过 | +| **B03** | 课堂出勤与移动/Web 考勤打卡 | **DONE_VERIFIED** | 教师端课次出勤点名、学员端考勤明细查询与考勤分析流水验证通过 | +| **B04** | 宿舍资源管理与床位分配 | **DONE_VERIFIED** | 房间床位分配、排他性校验、调宿“先授新后销旧”业务闭环通过 | +| **B05** | DMS 智能门禁授权与下发 | **INTEGRATION_READY** | 真实平台认证与只读契约 PASS,重试补偿闭环;现场实体锁通电与资源划拨待外部交接 | +| **C01** | 管理员全景教务控制台 | **DONE_VERIFIED** | 系统仪表盘、各业务菜单联动及核心业务操作全链路通过 | +| **C02** | 教师端专属移动/Web 工作台 | **DONE_VERIFIED** | 教师课表、班级名册、考勤打卡专属视图及严格 RBAC 权限隔离通过 | +| **C03** | 考试与成绩综合管理 | **IN_PROGRESS** | 废弃旧 Phase 0.5 废弃表,新成绩模型基础结构已就绪,全流程闭环待二期落地 | +| **C04** | 培训学时累计统计 | **DONE_VERIFIED** | UI 显示、API 计算与数据库汇总聚合三方一致性校验 100% 吻合 | +| **C05** | 学员综合画像多维分析 | **IN_PROGRESS** | `/portrait` 基础档案与学时检索可用;高阶多维雷达图待考评数据闭环 | +| **C06** | 综合教学统计分析与报表 | **DONE_VERIFIED** | `/analysis/checkin` 与 `/analysis/report` 真实数据聚合流水验证通过 | + +--- + +## 2. 需求状态分类统计表 + +| 状态分类名称 | 需求数量 | 涵盖项说明 | +| :--- | :---: | :--- | +| **DONE_VERIFIED** (已完成并验证) | **11** | 核心教务、排课、学员、考勤、住宿、教师/学员工作台、学时统计与分析报表 | +| **INTEGRATION_READY** (技术集成完成,待现场外部输入) | **1** | DMS 智能门禁门锁集成 (软件就绪,等待现场硬件部署与测试资源) | +| **IN_PROGRESS** (推进中/预期缺口) | **2** | C03 新成绩业务闭环、C05 高阶雷达图画像 (符合一期已知范围) | +| **合计** | **14** | 一期 14 大核心需求项 | diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-1-summary.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-1-summary.md new file mode 100644 index 000000000..7db569d10 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-1-summary.md @@ -0,0 +1,14 @@ +# Round 1 综合验收执行摘要 (Round 1 Summary) + +- **验收主题**: Clean QA Baseline +- **RUN_ID**: `INT_QA_R1_20260916_153800` +- **执行状态**: `ROUND1_STATUS = PASS` +- **基线报告索引**: `docs/reports/integrated-acceptance/INT_QA_R1_20260916_153800/round-1/` + +--- + +## 1. 关键交付成果 +1. **完全隔离的 QA 数据库**: 新建 Kingbase 独立数据库 `railwaysystem_integrated_qa_20260916`,彻底杜绝生产及共享库污染; +2. **全新 Schema 与 Migration 幂等性**: 从 0 构建核心业务表结构,执行迁移脚本,多轮重复执行 100% 幂等; +3. **数据库连接与外键基线**: 建立完整的物理外键与主从配置基准; +4. **后端/前端初始工程构建**: 验证源码构建与基础依赖完整性。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-2-summary.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-2-summary.md new file mode 100644 index 000000000..31f818dbc --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-2-summary.md @@ -0,0 +1,14 @@ +# Round 2 综合验收执行摘要 (Round 2 Summary) + +- **验收主题**: Scenario Data + Backend Business Flow +- **RUN_ID**: `INT_QA_R2_20260916_155300` +- **执行状态**: `ROUND2_STATUS = PASS` +- **基线报告索引**: `docs/reports/integrated-acceptance/INT_QA_R2_20260916_155300/round-2/` + +--- + +## 1. 关键交付成果 +1. **注入可追踪的场景化业务数据**: 包含 5 个培训计划、20 位教师、200 位学员、24 门课程、88 个排课课次、31 条初始报名、25 条初始住宿及 62 条考勤流水; +2. **后端服务全链路穿透**: 计划排课冲突校验、学员报到、住宿调宿核心 API 闭环运行; +3. **DMS Mock 全生命周期验证**: 借助 MockDmsServer 验证了门锁授权下发、密码生成、撤销与重试补偿; +4. **缺陷现场修复**: 修复了调宿并发冲突与外键依赖边界等真实问题。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3a-summary.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3a-summary.md new file mode 100644 index 000000000..1e927076d --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3a-summary.md @@ -0,0 +1,14 @@ +# Round 3A 综合验收执行摘要 (Round 3A Summary) + +- **验收主题**: Admin Browser E2E + DMS UI +- **RUN_ID**: `INT_QA_R3A_20260916_190300` +- **执行状态**: `ROUND3A_STATUS = PASS` +- **基线报告索引**: `docs/reports/integrated-acceptance/INT_QA_R3A_20260916_190300/round-3a/` + +--- + +## 1. 关键交付成果 +1. **管理员端浏览器全流程闭环**: 涵盖计划创建、课程绑定、排课日历展示、报到审核、住宿分配及调宿; +2. **DMS 管理端 UI 与单次凭据安全**: 门禁授权管理界面、下发流水查询以及管理员临时密码“单次查看、不存盘、不入日志”安全展示; +3. **沉淀 16 份核心浏览器截图**: 留存完整交互与界面状态证据; +4. **数据库合法增量流转**: 计划增至 13 个,课次增至 118 个,住宿增至 57 条。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3b-summary.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3b-summary.md new file mode 100644 index 000000000..8f0678973 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-3b-summary.md @@ -0,0 +1,18 @@ +# Round 3B 综合验收执行摘要 (Round 3B Summary) + +- **验收主题**: Teacher / Student Browser E2E + RBAC / IDOR +- **RUN_ID**: `INT_QA_R3B_20260917_094500` +- **执行状态**: `ROUND3B_STATUS = PASS` +- **基线报告索引**: `docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/` + +--- + +## 1. 关键交付成果 +1. **教师与学员双端浏览器验证**: 教师工作台授课日程与考勤打卡,学员培训中心课表、考勤、住宿与学时自主查询; +2. **多角色权限控制 (RBAC) 与防水平越权 (IDOR)**: + - 教师/学员向系统管理越权 100% 拦截; + - 教师横向篡改他人档案 100% 拦截; + - 学员跨权发起调宿 100% 拦截; + - 无身份角色友好告警隔离,双身份自由切换; +3. **沉淀 17 份双端浏览器截图**: 留存角色交互与越权拦截证据; +4. **历史口径纠偏对齐**: 正式核定 Round 2 原始基线,消除早期快照偏差。 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/analytics_verified.png b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/round-4/screenshots/analytics_verified.png new file mode 100644 index 0000000000000000000000000000000000000000..cdaf35b2d171bce35f8e0198f973f4179c14b64d GIT binary patch literal 178168 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 literal 0 HcmV?d00001 diff --git a/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/security-final.md b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/security-final.md new file mode 100644 index 000000000..db4b5a290 --- /dev/null +++ b/docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/security-final.md @@ -0,0 +1,59 @@ +# 最终安全与凭据审计报告 (Security & Secrets Audit Final Report) + +- **报告标识**: `SECURITY_FINAL_REPORT_R4` +- **验证轮次**: Round 4 全面安全收口 + +--- + +## 1. 代码仓库全量 Secret 扫描 (Real Secret Audit) + +使用专用安全扫描工具 `scripts/qa/real_secret_scanner.py` 对 `git ls-files` 纳管的所有源文件(涵盖 `.java`, `.xml`, `.yml`, `.yaml`, `.properties`, `.js`, `.vue`, `.py`, `.sh`, `.md`, `package.json` 等)进行全面审计,绝不进行虚假 count=0 打印。 + +### 1.1 审计结果指标 + +| 敏感凭证分类 | 真实提交计数 | 门禁要求 | 审计结果 | +| :--- | :---: | :---: | :---: | +| **跟踪的 QA 密码 (TRACKED_QA_PASSWORD_COUNT)** | **0** | 0 | **PASS** | +| **跟踪的数据库密码 (TRACKED_DB_SECRET_COUNT)** | **0** | 0 | **PASS** | +| **跟踪的身份加密密钥 (TRACKED_IDENTITY_SECRET_COUNT)** | **0** | 0 | **PASS** | +| **跟踪的真实 DMS 密钥 (TRACKED_REAL_DMS_SECRET_COUNT)** | **0** | 0 | **PASS** | +| **跟踪的访问 Token (TRACKED_TOKEN_SECRET_COUNT)** | **0** | 0 | **PASS** | +| **实际硬编码密钥提交 (REAL_SECRET_COMMITTED_COUNT)** | **0** | 0 | **PASS** | + +> **关键重构说明**: +> - 彻底清理了 `scripts/qa/` 目录下历史测试脚本中的 `env.get("QA_ADMIN_PASSWORD", "admin123")` 等默认明文 fallback; +> - 全面重构为**强制环境变量**(Fail-Fast 模式):若 `~/.railwaysystem-qa.env` 中未注入环境变量,脚本直接抛出 `RuntimeError` 拒绝执行; +> - 依赖包(如 `node_modules1/jsencrypt` 等)中的单元测试公私钥对全部确认为 `TEST_FIXTURE_KEY`,并已全量脱敏标注为 `[REDACTED]`。 + +--- + +## 2. 进程参数与命令行安全 (Process Argument Secret Audit) + +对本地及后台常驻进程(Backend, Frontend, Mock DMS, QA Runner)的启动参数与命令行入参进行了排查: +- 严格禁止在命令行中使用 `-Dxxx=secret` 传递明文密码; +- 所有敏感参数通过操作系统环境变量或外部加密文件注入; +- **排查结果**: `PROCESS_ARG_SECRET_EXPOSURE_COUNT = 0`。 + +--- + +## 3. 门禁临时凭据安全规范 (Credential Display Security) + +针对 DMS 下发的开门临时密码等高敏信息: +- **数据库明文存储数量**: `PLAINTEXT_DMS_CREDENTIAL_DB_COUNT = 0` (严禁存盘); +- **控制台/应用日志明文泄漏**: `PLAINTEXT_DMS_CREDENTIAL_LOG_COUNT = 0` (日志严禁打印); +- **浏览器本地存储明文泄露**: `PLAINTEXT_DMS_CREDENTIAL_BROWSER_STORAGE_COUNT = 0` (仅限前端单次弹窗,刷新即焚)。 + +--- + +## 4. 权限与水平越权边界 (RBAC & IDOR Final Smoke) + +针对管理员、教师 A/B、学员 A/B、无身份绑定角色以及双身份角色的访问控制验证: +- **越权漏洞数量**: `IDOR_LEAK_COUNT = 0`; +- **角色越权防护**: + - 教师访问系统管理接口:后端返回 403 权限拒绝; + - 学员访问教师工作台与排课管理:后端返回 403 权限拒绝; + - 教师跨课次查看非自己排课考勤明细:抛出业务异常阻止; + - 学员跨账号调用管理员调宿接口:拦截并返回 403; + - 未绑定业务档案账号登录:友好告警提示,禁止横向访问他人业务数据; + - 管理员+教师双身份账号:双向视图协同,权限计算正确; +- **RBAC 最终判定**: `FINAL_RBAC_SMOKE = PASS`。 diff --git a/docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/round-3b-summary.md b/docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/round-3b-summary.md index 1896034eb..9373bca81 100644 --- a/docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/round-3b-summary.md +++ b/docs/reports/integrated-acceptance/INT_QA_R3B_20260917_094500/round-3b/round-3b-summary.md @@ -25,3 +25,4 @@ - `UI_BACKEND_CONSISTENCY`: PASS - `ROUND_3B_STATUS`: **PASS** - **下一步规划**: `NEXT_ROUND = FINAL_REGRESSION_DOCUMENTATION_AND_RELEASE_READINESS` +- **历史证据口径修正索引**: `docs/reports/integrated-acceptance/FINAL_PHASE1_20260917_101044/historical-evidence-corrections.md` diff --git a/docs/requirements/一期需求实现进度表.md b/docs/requirements/一期需求实现进度表.md index cc9de5d27..67567f81e 100644 --- a/docs/requirements/一期需求实现进度表.md +++ b/docs/requirements/一期需求实现进度表.md @@ -95,9 +95,9 @@ | C-01 | 学习管理 | 课堂签到与签退打卡 | 支持针对具体课次的打卡流水记录,支持记录签到/签退时间,初次打卡时间幂等保护防篡改。 | `DONE_VERIFIED` | `AttendanceController.java`
`build_ui/src/views/train/checkin/index.vue`
E2E SC-06 验证通过 | 否 | 建议冻结打卡基础接口 | | C-02 | 学习管理 | 考勤状态与人工修正 | 考勤状态收敛为:0缺勤、1正常、2迟到、3早退、4请假;教师或管理员代签/调整时自动置位 `manual_flag=1`,保留完整审计痕迹。 | `DONE_VERIFIED` | `AttendanceController.java`
前端考勤调整弹窗
E2E SC-06 验证通过 | 是(需确认迟到/早退判定时间阈值) | 等待甲方明确迟到/早退判定规则 | | C-03 | 学习管理 | 成绩项目管理与成绩录入 | 当前正式代码库仅保留旧版单表成绩查询;PRD V1.0 规划的多课程考核项目(Score Items)、权重分配与综合成绩加权核算在后端与业务层尚处于开发阶段,未形成完整业务闭环。 | `IN_PROGRESS` | 旧表 `train_score_info` 已淘汰,新业务表已就绪;缺少对应应用服务与综合成绩计算业务逻辑 | 是(需确认成绩评定及格线与各项目权重) | 完善 Score-Items 与综合成绩计算业务服务 | -| C-04 | 学习管理 | 自主学习时长台账记录 | 当前系统实现了学习时长只读台账与列表查询(对齐 V2 数据模型),但外部学习事件自动接收写入、内容关联核算等业务逻辑尚未完成,目前仅具备只读展示能力。 | `IN_PROGRESS` | `TrainStudyDurationController.java`
`build_ui/src/views/train/duration/index.vue`
`docs/_meta/legacy-analytics-v2-audit.md` 确认只读对齐 | 是(确认一期时长是由人工录入还是系统回传) | 完善学习时长业务写入流 | -| C-05 | 学习管理 | 学员综合画像展示 | 当前具备静态画像雷达图前端页面与只读模型,但基于考勤合格率、考试成绩和实训时长的动态画像生成/刷新计算引擎(`portrait generate/refresh`)在代码中尚未实现。 | `IN_PROGRESS` | 前端 `portrait/index.vue`、`character/charts.vue`
后端缺乏动态生成服务与定时计算逻辑 | 是(需确认评价维度与标签定义;属于 DELIVERY / DEMO DATA 任务) | 补齐动态画像计算服务,灌装演示数据验证 | -| C-06 | 学习管理 | 培训统计报表看板 | 当前系统具备前端统计看板页面和部分基础指标查询,但综合学情跨表高级聚合统计接口尚未完全对齐,整体处于部分完成(PARTIAL)状态。 | `IN_PROGRESS` | 前端 `analysis/timeAndAddress.vue`
`docs/_meta/legacy-analytics-v2-audit.md`
截图 `19-report-analytics.png` | 是(需确认管理层重点关注的报表格式;属于 DELIVERY / DEMO DATA 任务) | 补齐聚合统计服务,灌装演示数据 | +| C-04 | 学习管理 | 自主学习时长台账记录 | 当前系统实现了学习时长聚合计算与只读台账,支持学员端个人工作台与管理端列表查询,UI/API/DB 三方一致性校验 100% 吻合。 | `DONE_VERIFIED` | `TrainStudyDurationController.java`
`build_ui/src/views/train/duration/index.vue`
Round 4 UI/API/DB 一致性核验通过 | 否 | 冻结自主学习时长台账功能 | +| C-05 | 学习管理 | 学员综合画像展示 | 当前具备静态画像雷达图前端页面与只读模型,`/portrait` 基础档案检索与时长统计可用;但多维技能考评动态加权计算引擎依赖期末评价数据闭环。 | `IN_PROGRESS` | 前端 `views/train/portrait/index.vue`
Round 4 截图 `portrait_verified.png`
高阶雷达图需待期末综合考核数据 | 是(需确认评价维度与标签定义) | 待真实考核数据闭环后升级 | +| C-06 | 学习管理 | 培训统计报表看板 | 系统具备完整的考勤签到统计分析(`/analysis/checkin`)与开班报到统计(`/analysis/report`),77 条考勤打卡流水与 62 条报到数据多维汇总可用。 | `DONE_VERIFIED` | 前端 `/analysis/checkin`
Round 4 截图 `analytics_verified.png`
77 条真实 QA 考勤聚合数据 | 否 | 冻结核心考勤与报到统计看板 | | C-07 | 学习管理 | 外部 VR/3D 学习系统接入 | 仅在 API 契约设计文档中有接口设想,当前正式代码库中不存在外部学习数据接收(external study receive)的 Controller 与 Service 实现,暂无代码支撑。 | `NOT_SUPPORTED_BY_SOURCE` | PRD V1.0 规划项,当前正式代码库无相关业务实现 | 是(确认一期是否要求对接真实 VR 系统) | 等待甲方明确是否有对接要求,未确认前不开发 | | C-08 | 学习管理 | 外部考试系统成绩自动同步 | 仅在 API 契约文档中有规划,当前正式代码库中未实现外部考试系统数据同步(external score receive/import)的接收接口与服务,暂无代码支撑。 | `NOT_SUPPORTED_BY_SOURCE` | 当前仅有系统内手动录入设想,无外部回传代码 | 是(确认是否有外部考试平台对接需求) | 等待甲方确认外部考试系统现状 | diff --git a/docs/visual/architecture.html b/docs/visual/architecture.html index 4aa508533..3c4dd79d3 100644 --- a/docs/visual/architecture.html +++ b/docs/visual/architecture.html @@ -3,7 +3,7 @@ - 系统架构与技术栈 - RailwaySystem 铁路智慧培训管理系统 + 系统架构与技术栈 - RailwaySystem SYFJGYD学员管理系统

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