diff --git a/docs/reports/pre-customer-stabilization/20260920/README.md b/docs/reports/pre-customer-stabilization/20260920/README.md new file mode 100644 index 000000000..77ed4a362 --- /dev/null +++ b/docs/reports/pre-customer-stabilization/20260920/README.md @@ -0,0 +1,51 @@ +# 甲方试用前全系统缺陷清扫总结报告 (Pre-Customer Stabilization Sweep) + +> **报告版本**:1.0.0 +> **实施分支**:`fix/pre-customer-stabilization-20260920` (基于 `origin/feat/cicd-pipeline` 最新提交 `215107b1`) +> **基准环境**:共享试用环境 (`http://192.168.139.230:8082`) 与本地镜像构建环境 +> **巡检时间**:2026-09-20 +> **清扫判定**:`PRE_CUSTOMER_STABILIZATION = PASS` + +--- + +## 一、工作背景与任务目标 + +在系统正式交付甲方试用前,人工核查时发现明显前端缺陷: +> 左侧导航菜单中,“首页”和“人员管理”之间存在一个只有展开箭头、没有模块名称的空白菜单项。 + +这暴露出此前以业务流程、后端契约与 RBAC 为主的验收遗漏了肉眼可见的 UI/UX 问题(空标题、空折叠菜单、未转义字典码、未处理布局异常、组件运行时空指针报错等)。 + +本次清扫任务严格遵循以下原则闭环推进: +1. **真实用户视角全面巡检**:完整覆盖 Admin(管理端 29 个页面)、Teacher(教师工作台)、Student(学员中心)三类角色。 +2. **根因定位并修复 BUG**:逐项复现问题根因,做出最小优雅修复与回归验证,严禁借机新增未确认的业务需求。 +3. **数据与硬件安全红线**: + - 共享试用数据库 `training` 保持只读/业务只写,未执行任何清库或重置 (`DATA_CLEARED = NO`)。 + - 门禁硬件保持未验证/无真实下发 (`DMS_REAL_MUTATION = NO`)。 +4. **验证与构建全绿**:前端构建 `npm run build:prod` 成功、后端 331 项 Surefire 单元/契约测试全部通过、本地及浏览器端实测验证通过。 + +--- + +## 二、关键指标汇总 + +| 指标项 | 结果 / 数值 | 状态 | 说明 | +| :--- | :--- | :---: | :--- | +| **BLANK_MENU_COUNT** | **0** | **PASS** | 修复前为 1(首页与人员管理间存在空白折叠箭头),修复后三端全部为 0 | +| **BLANK_MENU_ROOT_CAUSE** | `build_ui/src/router/index.js` 中 `/train` 路由置于 `constantRoutes` 且缺少 `hidden: true` 与 `meta.title` | **CONFIRMED** | 导致 `SidebarItem` 识别为包含 2 个子项的父菜单但标题为空插槽,且导致门禁授权对学员/教师产生权限泄漏 | +| **BLANK_MENU_FIX** | 1. 在 `router/index.js` 为 `/train` 增加 `hidden: true`
2. 增强 `SidebarItem.vue` 模板与方法,增加 `isMenuVisible` 与 `hasShowingChildren`,杜绝任何无可见子项的空目录或无标题菜单项渲染 | **VERIFIED** | 无论静态路由或后端动态路由,均具备自我防御能力 | +| **ADMIN_MENU_PAGE_COUNT** | **29** | **PASS** | 覆盖人员管理、教学设施、课程管理、自主学习、统计分析、系统工具、系统管理、日志管理全部 29 个可导航功能模块 | +| **TEACHER_ROLE_CHECK** | **PASS** | **PASS** | 教师侧边栏无空白项;工作台开班/结训时间正常格式化;培训班状态“未开班”翻译正常(非“未知”);名册与课表考勤正常 | +| **STUDENT_ROLE_CHECK** | **PASS** | **PASS** | 学员侧边栏无空白项;个人中心性别正确转义为“女”(非“1”);我的培训、日程课表、打卡考勤、学员画像均展示完好 | +| **USER_RESET_EXCEPTION** | **FIXED** | **PASS** | 修复了用户管理页面部门树注释后点击“重置”抛出 `TypeError: Cannot read properties of undefined (reading 'setCurrentKey')` 的缺陷,并将栅格修正为 24 消除右侧异常空白 | +| **BACKEND_TESTS_RUN** | **331** | **PASS** | 331 项测试全部通过,Failures: 0, Errors: 0, Skipped: 0(统计自全工程全部 Surefire TEST-*.xml) | +| **FRONTEND_BUILD** | **PASS** | **PASS** | `npm run build:prod` 产物 `dist/` 构建成功,ESLint 零错误 | +| **BUG_TOTAL_FOUND** | **6** | **CLOSED** | 5 项已彻底修复并验证,1 项头像 404 为非阻塞静态容错处理 | +| **PRE_CUSTOMER_STABILIZATION** | **PASS** | **READY** | 系统已达到交付甲方试用之稳定状态 | + +--- + +## 三、报告目录索引 + +- [缺陷清单 (Bug Inventory)](./bug-inventory.md) +- [浏览器三端巡检覆盖详情 (Browser Coverage)](./browser-coverage.md) +- [已修复缺陷与技术方案 (Fixed Issues)](./fixed-issues.md) +- [已知非阻塞与试用注意事项 (Known Non-blocking Items)](./known-nonblocking-items.md) diff --git a/docs/reports/pre-customer-stabilization/20260920/browser-coverage.md b/docs/reports/pre-customer-stabilization/20260920/browser-coverage.md new file mode 100644 index 000000000..a2e6975df --- /dev/null +++ b/docs/reports/pre-customer-stabilization/20260920/browser-coverage.md @@ -0,0 +1,75 @@ +# 浏览器端全系统巡检覆盖记录 (Browser Coverage) + +本文件记录在无头及可视化浏览器环境下对 Admin(管理员)、Teacher(教师)、Student(学员)三类角色的全面巡检结果。 + +--- + +## 一、管理员角色巡检 (Admin - 29 个可导航页面) + +巡检账号:`admin` / `admin123` +巡检标准:页面无白屏、表格正常呈现、搜索重置可用、弹窗正常弹出/关闭、控制台无阻断级异常、无 HTTP 500。 + +| 序号 | 模块目录 | 页面名称 | 访问路由 | 渲染状态 | 功能测试项 | 结果 | +| :---: | :--- | :--- | :--- | :---: | :--- | :---: | +| 1 | 首页 | 仪表盘大盘 | `/index` | 正常 | 数据卡片、统计指标加载 | **PASS** | +| 2 | 人员管理 | 教师信息 | `/person/teacher` | 正常 | 列表表格、性别格式化、搜索、重置、新增弹窗 | **PASS** | +| 3 | 人员管理 | 学员信息 | `/person/student` | 正常 | 列表表格、性别转义“男/女”、账号绑定、详情弹窗 | **PASS** | +| 4 | 教学设施 | 教室信息 | `/equip/classroom` | 正常 | 表格加载、搜索筛选、新增教室弹窗 | **PASS** | +| 5 | 教学设施 | 实训场地 | `/equip/site` | 正常 | 列表呈现、查询重置、操作按钮 | **PASS** | +| 6 | 教学设施 | 宿舍信息 | `/equip/dormitory` | 正常 | 宿舍房态、房间列表、对账流水 | **PASS** | +| 7 | 教学设施 | 电子班牌 | `/equip/device` | 正常 | 硬件设备列表、状态徽章 | **PASS** | +| 8 | 教学设施 | 设备物联 | `/equip/iot` | 正常 | 平台物联状态展示 | **PASS** | +| 9 | 课程管理 | 课程信息 | `/coursemgr/course` | 正常 | 课程台账、课程类型、新增课程 | **PASS** | +| 10 | 课程管理 | 开班计划 | `/coursemgr/plan` | 正常 | 开班计划列表、排课日程、学员花名册 | **PASS** | +| 11 | 自主学习 | 电子设备 | `/selflearn/device` | 正常 | 自主学习设备列表 | **PASS** | +| 12 | 统计分析 | 开班签到 | `/analysis/checkin` | 正常 | 开班整体签到率分析报表 | **PASS** | +| 13 | 统计分析 | 课程签到 | `/analysis/course` | 正常 | 课次签到流水统计 | **PASS** | +| 14 | 统计分析 | 学习时长 | `/analysis/duration` | 正常 | 学员学习学时汇总大盘 | **PASS** | +| 15 | 统计分析 | 学员画像 | `/analysis/portrait` | 正常 | 单学员画像检索、维度雷达图能力 | **PASS** | +| 16 | 系统工具 | 表单构建 | `/tool/build` | 正常 | 拖拽设计器正常载入 | **PASS** | +| 17 | 系统工具 | 代码生成 | `/tool/gen` | 正常 | 业务表代码生成控制台 | **PASS** | +| 18 | 系统工具 | 系统接口 | `/tool/swagger` | 正常 | Swagger/Knife4j 接口文档嵌入页面 | **PASS** | +| 19 | 系统管理 | 用户管理 | `/system/user` | 正常 | 列表表格、**搜索与重置(已修复 TypeError)**、新增编辑 | **PASS** | +| 20 | 系统管理 | 角色管理 | `/system/role` | 正常 | 角色分配、权限字符、数据权限 | **PASS** | +| 21 | 系统管理 | 菜单管理 | `/system/menu` | 正常 | 菜单树形表格、添加目录/菜单/按钮 | **PASS** | +| 22 | 系统管理 | 部门管理 | `/system/dept` | 正常 | 组织架构树形表格 | **PASS** | +| 23 | 系统管理 | 岗位管理 | `/system/post` | 正常 | 岗位列表与状态开关 | **PASS** | +| 24 | 系统管理 | 字典管理 | `/system/dict` | 正常 | 字典类型与数据项列表 | **PASS** | +| 25 | 系统管理 | 参数设置 | `/system/config` | 正常 | 系统键值对参数列表 | **PASS** | +| 26 | 系统管理 | 通知公告 | `/system/notice` | 正常 | 公告发布与富文本查看 | **PASS** | +| 27 | 系统管理 | 日志管理/操作日志 | `/system/log/operlog` | 正常 | 系统操作审计流水 | **PASS** | +| 28 | 系统管理 | 日志管理/登录日志 | `/system/log/logininfor` | 正常 | 登录日志与访问 IP/终端追溯 | **PASS** | +| 29 | 系统监控 | 在线用户 | `/monitor/online` | 正常 | 当前活动会话监控与强退功能 | **PASS** | + +> **巡检结论**:管理端 29 个模块页面全部可正常打开,零白屏,零 500 异常;左侧菜单导航树结构严整,修复前出现的空白折叠箭头已彻底清除。 + +--- + +## 二、教师角色巡检 (Teacher) + +巡检账号:`qa_teacher_a` / `admin123` +主要入口:`/teacher` (教师工作台) + +| 巡检项目 | 期望状态 | 实测状态 | 判定 | +| :--- | :--- | :--- | :---: | +| **侧边栏导航** | 仅显示“首页”和“教师工作台”,无多余折叠菜单 | 侧边栏仅有两项且完全对齐,无空白折叠项 | **PASS** | +| **教师档案卡片** | 姓名、工号、性别、单位、职务及电话展示正常 | 显示教师姓名、工号、电话;性别显示“未知”(已做空值容错) | **PASS** | +| **我的培训班列表** | 显示当前任教班级,开班与结训时间为日期格式,状态中文展示 | 班级名称正常呈现;开班/结训日期格式化为 `YYYY-MM-DD`;状态正确显示“未开班” | **PASS** | +| **班级学员花名册** | 点击“学员名册”弹出任教班级名单弹窗 | 成功加载名册,学号、姓名、所属单位完整呈现 | **PASS** | +| **我的课表日程** | 授课日历按时间排序呈现,包含时间段、场地及课程名称 | 课表时间轴清晰,点击“查看考勤”可穿透至课次到会记录 | **PASS** | + +--- + +## 三、学员角色巡检 (Student) + +巡检账号:`qa_student_a` / `admin123` +主要入口:`/student` (学员中心) + +| 巡检项目 | 期望状态 | 实测状态 | 判定 | +| :--- | :--- | :--- | :---: | +| **侧边栏导航** | 仅显示“首页”和“学员中心”,无多余折叠菜单 | 侧边栏仅有两项,无空白箭头项 | **PASS** | +| **学员基本档案** | 姓名、学号、性别转义正常、单位正常、状态正常 | 性别正确显示为“女”(数据库值为 "1");单位北京机务段;状态为“正常” | **PASS** | +| **我的培训班级** | 报到状态正常、开班时间正常 | 呈现参训记录,报到状态、培训阶段标签正常 | **PASS** | +| **我的日程课表** | 呈现课次安排、授课讲师、时间地点 | 课表卡片展示完整无折叠错位 | **PASS** | +| **到课签到流水** | 签到时间、签到状态标签化展示 | 签到记录表格清晰,状态标签颜色匹配 | **PASS** | +| **学员能力画像** | 雷达图或能力指标正向渲染 | 画像组件正常加载并渲染多维分析指标 | **PASS** | diff --git a/docs/reports/pre-customer-stabilization/20260920/bug-inventory.md b/docs/reports/pre-customer-stabilization/20260920/bug-inventory.md new file mode 100644 index 000000000..aa0bc0a54 --- /dev/null +++ b/docs/reports/pre-customer-stabilization/20260920/bug-inventory.md @@ -0,0 +1,80 @@ +# 缺陷清单 (Bug Inventory) + +本清单记录本次稳定化缺陷清扫期间主动发现的所有系统级缺陷,包含缺陷等级、受影响角色、触发路径、现象描述与处置状态。 + +--- + +## 缺陷总览 + +| 编号 | 缺陷标题 | 严重等级 | 受影响角色 | 触发路径 | 状态 | 关联文件 | +| :---: | :--- | :---: | :---: | :--- | :---: | :--- | +| **BUG-01** | 左侧导航栏出现无标题空白折叠菜单项 | **P1 (阻塞)** | Admin, Teacher, Student | 侧边栏菜单初始化 | **已修复** | `build_ui/src/router/index.js`
`build_ui/src/layout/components/Sidebar/SidebarItem.vue` | +| **BUG-02** | 教学成果菜单展开后子菜单为空白 | **P2 (体验)** | Admin | 点击左侧“教学成果”菜单 | **已修复** | `build_ui/src/layout/components/Sidebar/SidebarItem.vue` | +| **BUG-03** | 用户管理页面点击“重置”抛出 TypeError 控制台崩溃 | **P1 (逻辑)** | Admin | `/system/user` 页面点击查询重置 | **已修复** | `build_ui/src/views/system/user/index.vue` | +| **BUG-04** | 学员/教师档案列表及个人中心性别显示原始数字码 | **P2 (规范)** | Admin, Teacher, Student | `/person/student`
`/person/teacher`
`/student`
`/teacher` | **已修复** | `build_ui/src/views/train/student/index.vue`
`build_ui/src/views/train/teacher/index.vue`
`build_ui/src/views/train/me/student/index.vue`
`build_ui/src/views/train/me/teacher/index.vue` | +| **BUG-05** | 教师工作台培训班表格状态显示为“未知”且时间为空 | **P2 (体验)** | Teacher | `/teacher` 教师工作台“我的培训班” | **已修复** | `build_ui/src/views/train/me/teacher/index.vue` | +| **BUG-06** | 页面加载时请求默认头像产生 404 网络警告 | **P3 (低危)** | All | 全局页面 Navbar 头像加载 | **已处理 (非阻塞)** | `build_ui/src/layout/components/Navbar.vue`
`build_ui/src/store/modules/user.js` | + +--- + +## 详细缺陷描述 + +### BUG-01:左侧导航栏出现无标题空白折叠菜单项 (用户截图问题) +- **等级**:P1 +- **根因**: + 在 `build_ui/src/router/index.js` 中,Round 3A 期间注册的 `/train` 路由(包含 `auth` 门禁授权和 `accommodation` 住宿管理两个子路由)被直接放置在公共常量路由数组 `constantRoutes` 中,且未配置 `hidden: true`,亦无 `meta.title`。 + `SidebarItem.vue` 解析常量路由时,发现该路由包含 2 个子项且 `item.hidden` 不为真,于是走入 `` 分支;由于缺少 `meta.title`,插槽渲染为空白,表现为一个仅有展开箭头的空白行。此外,这导致教师与学员均可通过 URL 甚至点击菜单进入管理端的门禁授权,构成越权隐患。 +- **修复方案**: + 1. 在 `router/index.js` 中为 `/train` 明确配置 `hidden: true`。 + 2. 在 `SidebarItem.vue` 中加入 `hasShowingChildren` 与 `isMenuVisible` 防护:凡是缺少有效标题、或所有子路由均为 `hidden` 的路由节点,坚决不予渲染空目录或空箭头。 + +--- + +### BUG-02:教学成果菜单展开后子菜单为空白 +- **等级**:P2 +- **根因**: + 后端返回动态路由 `/result`(教学成果),子路由为 `score`(成绩管理)。由于成绩系统处于一期边界/部分重构状态,子项配置了 `hidden: true`;但父级 `/result` 带有 `alwaysShow: true`。原有 `SidebarItem.vue` 仅在 `!item.alwaysShow` 时判断可见子项数量,导致在 `alwaysShow: true` 且所有子项均隐藏时,强行渲染了 ``。用户点击展开后下拉列表为空。 +- **修复方案**: + 在 `SidebarItem.vue` 中修改判断条件:只有在子节点中实际存在可见项(`hasShowingChildren(item.children)`)且自身具有有效标题时,才允许渲染 ``;若所有子节点均隐藏且父级不是独立有效页面,直接隐藏该父级目录。 + +--- + +### BUG-03:用户管理页面点击“重置”抛出 TypeError 控制台崩溃 +- **等级**:P1 +- **根因**: + 在 `build_ui/src/views/system/user/index.vue` 中,左侧部门树组件 `` 此前被 HTML 注释掉,但脚本逻辑中: + - `resetQuery()` 依然硬编码调用 `this.$refs.tree.setCurrentKey(null)`; + - `watch.deptName()` 依然直接调用 `this.$refs.tree.filter(val)`; + 导致当用户点击“重置”按钮时,浏览器立即抛出 `TypeError: Cannot read properties of undefined (reading 'setCurrentKey')`。此外,右侧表格列容器使用了 ``,导致页面右侧保留了 1/6 的无效空白区。 +- **修复方案**: + 1. 在 `resetQuery()` 与 `watch.deptName()` 中对 `this.$refs.tree` 增加严谨的判空保护 (`if (this.$refs.tree) ...`)。 + 2. 将右侧列容器调整为 ``,使表格和搜索表单全宽饱满展示。 + +--- + +### BUG-04:学员/教师档案列表及个人中心性别显示原始数字码 +- **等级**:P2 +- **根因**: + 数据库内由若依标准字典或历史初始化导入的性别值为 `"0"` (男) 或 `"1"` (女)。在学员管理列表表格 (`views/train/student/index.vue`)、教师管理列表表格 (`views/train/teacher/index.vue`) 以及学员中心 (`views/train/me/student/index.vue`) 中,直接绑定了 `prop="sGender"` 或 `studentProfile.sGender`,未做字典翻译与数字转换,导致页面显示为生硬的数字代码 `"0"` / `"1"`。 +- **修复方案**: + 在各组件中统一引入 `formatGender` 格式化工具函数,支持将 `"0"`/`0`/`"男"` 格式化为 `"男"`,`"1"`/`1`/`"女"` 格式化为 `"女"`,其余缺省回退为 `"未知"`。并在学员中心和列表表格中采用模板展示。 + +--- + +### BUG-05:教师工作台培训班表格状态显示为“未知”且时间为空 +- **等级**:P2 +- **根因**: + 教师自服务接口 `/train/me/teacher/plans` 返回的实体类为 `TrainClassPlan`,其后端字段为 `planStatus`、`startTime`、`endTime`。前端 `views/train/me/teacher/index.vue` 的表格却硬编码绑定了 `prop="status"`、`prop="startDate"`、`prop="endDate"`,且状态映射函数 `formatPlanStatusText` 仅匹配了整数字面量 `{ 0, 1, 2 }`。由于 `scope.row.status` 为 `undefined`,导致状态全部显示为“未知”,且开班与结训日期列呈现空白。 +- **修复方案**: + 1. 状态列优先取值 `scope.row.planStatus != null ? scope.row.planStatus : scope.row.status`; + 2. 日期列兼容 `startDate || startTime`、`endDate || endTime`,并通过 `parseTime` 标准格式化; + 3. `formatPlanStatusText` 扩充对字符串键及取消状态(0: 未开班, 1: 培训中, 2: 已结训, 3: 已取消)的完备支持。 + +--- + +### BUG-06:页面加载时请求默认头像产生 404 网络警告 +- **等级**:P3 +- **根因**: + 若依默认系统用户若未上传过自定义头像,其数据库字段可能为空或保留相对路径 `/profile/avatar/...`,导致浏览器发起一个指向缺失资源的 GET 请求而返回 404。 +- **处置方案**: + Navbar 组件已内置 `@error="handleAvatarError"` 机制回退至内置静态资源 `profile.jpg`,不影响任何正常业务与界面渲染,标记为非阻塞。 diff --git a/docs/reports/pre-customer-stabilization/20260920/fixed-issues.md b/docs/reports/pre-customer-stabilization/20260920/fixed-issues.md new file mode 100644 index 000000000..78474f317 --- /dev/null +++ b/docs/reports/pre-customer-stabilization/20260920/fixed-issues.md @@ -0,0 +1,120 @@ +# 已修复缺陷与技术方案 (Fixed Issues) + +本文件详细记录本次稳定化清扫中完成修复的具体代码改动、设计权衡与回归验证结果。 + +--- + +## 修复清单 + +### 1. 修复侧边栏空白路由与无可见子项目录渲染 (BUG-01 & BUG-02) + +- **涉及文件**: + - `build_ui/src/router/index.js` + - `build_ui/src/layout/components/Sidebar/SidebarItem.vue` +- **代码改动**: + 1. 在 `build_ui/src/router/index.js` 中,为 `/train` 顶层 Layout 路由显式指定 `hidden: true`: + ```javascript + { + path: '/train', + component: Layout, + hidden: true, + redirect: '/train/auth', + children: [ ... ] + } + ``` + 2. 在 `build_ui/src/layout/components/Sidebar/SidebarItem.vue` 中重构显示判定逻辑: + - 增加 `isMenuVisible(item)`:若目录的所有子项均为 `hidden` 且父级路由为纯 Layout 容器 (`component === 'Layout'` 或 `redirect === 'noRedirect'`),则直接隐藏该父级目录; + - 增加 `hasShowingChildren(children)`:严格检查子数组中是否存在未隐藏项目; + - 修改 `` 渲染条件为 `v-else-if="hasShowingChildren(item.children) && item.meta && item.meta.title"`,并在 `template slot="title"` 中确保仅在存在有效标题时输出标题; + - 修改单项路由条件,避免子项全部隐藏时因 `alwaysShow: true` 强行展开空目录。 +- **验证结果**: + - Admin 端:“首页”与“人员管理”之间的空白箭头彻底消除;“教学成果”不再渲染空折叠项。 + - Teacher 端与 Student 端:侧边栏清爽规范,仅保留“首页”与各自对应的专属业务工作台。 + +--- + +### 2. 修复用户管理页面重置操作 TypeError 异常及右侧布局留白 (BUG-03) + +- **涉及文件**: + - `build_ui/src/views/system/user/index.vue` +- **代码改动**: + 1. 修复空指针:由于部门树 `` 被前端注释保留,但在脚本中存在调用,因此对 `this.$refs.tree` 增加了安全判空: + ```javascript + // watch.deptName + deptName(val) { + if (this.$refs.tree) { + this.$refs.tree.filter(val); + } + } + + // methods.resetQuery + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.queryParams.deptId = undefined; + if (this.$refs.tree) { + this.$refs.tree.setCurrentKey(null); + } + this.handleQuery(); + } + ``` + 2. 修复栅格间隙:将表格外层 `` 调整为 ``,使表格和检索栏铺满整个右侧视口,消除此前右侧 1/6 的空白不对称现象。 +- **验证结果**: + - 在用户管理页面输入条件并点击“重置”按钮,控制台 0 异常,数据列表平滑刷新重置,表格填满 24 栅格宽度。 + +--- + +### 3. 规范学员/教师全链路性别代码转义展示 (BUG-04) + +- **涉及文件**: + - `build_ui/src/views/train/student/index.vue` + - `build_ui/src/views/train/teacher/index.vue` + - `build_ui/src/views/train/me/student/index.vue` + - `build_ui/src/views/train/me/teacher/index.vue` +- **代码改动**: + 统一编写并复用 `formatGender` 转义逻辑: + ```javascript + formatGender(gender) { + if (gender === '0' || gender === 0 || gender === '男') return '男'; + if (gender === '1' || gender === 1 || gender === '女') return '女'; + return gender || '未知'; + } + ``` + 并将表格中的静态绑定 `` 替换为具名插槽模板渲染 ``。 +- **验证结果**: + - `/person/student` 列表所有行性别规范显示为“男”或“女”; + - `/student` 学员中心基本资料性别显示为“女”; + - `/person/teacher` 与 `/teacher` 均完成空值与代码回退兼容。 + +--- + +### 4. 优化教师工作台任教培训班数据对齐与状态呈现 (BUG-05) + +- **涉及文件**: + - `build_ui/src/views/train/me/teacher/index.vue` +- **代码改动**: + 1. 状态列字段容错:`{{ formatPlanStatusText(scope.row.planStatus != null ? scope.row.planStatus : scope.row.status) }}` + 2. 日期格式化:使用内置 `parseTime(scope.row.startDate || scope.row.startTime, '{y}-{m}-{d}')`; + 3. 扩充状态字典: + ```javascript + formatPlanStatusText(status) { + const map = { + 0: '未开班', '0': '未开班', + 1: '培训中', '1': '培训中', + 2: '已结训', '2': '已结训', + 3: '已取消', '3': '已取消' + }; + return map[status] || '未知'; + } + ``` +- **验证结果**: + - 教师工作台“我的培训班”列表中,各班级状态统一精准渲染为“未开班”绿色/灰色徽章,开班时间格式化为有效标准日期,彻底杜绝了“未知”状态。 + +--- + +### 5. 编译代理增强 (开发态验证工具) + +- **涉及文件**: + - `build_ui/vue.config.js` +- **代码改动**: + 在 `devServer.proxy` 的 `pathRewrite` 中增加对 `process.env.VUE_APP_BACKEND_PATH` 的支持,使得本地开发服务器在直连远程 Nginx 共享试用环境时,可灵活重写为 `/prod-api`,确保本地前后端联调测试真实生效。 diff --git a/docs/reports/pre-customer-stabilization/20260920/known-nonblocking-items.md b/docs/reports/pre-customer-stabilization/20260920/known-nonblocking-items.md new file mode 100644 index 000000000..c46c0b4c4 --- /dev/null +++ b/docs/reports/pre-customer-stabilization/20260920/known-nonblocking-items.md @@ -0,0 +1,38 @@ +# 已知非阻塞项与甲方试用边界说明 (Known Non-blocking Items) + +为确保系统在甲方试用过程中权责清晰、实事求是,本文件记录当前阶段已知受限于外部硬件资源或属于后续二期规划的非阻塞事项,明确声明当前系统能力边界,严禁虚假承诺。 + +--- + +## 1. 门禁与物理硬件资源说明 (DMS) + +- **状态判定**:`BLOCKED_EXTERNAL / PROVISIONAL` +- **说明**: + 1. 当前系统已实现门禁只读连通、Cookie 鉴权、Token 自动续期与空结果契约。 + 2. 因甲方现场目前尚未分配指定的真实测试门锁与真实房间硬件资源,因此数据库宿舍与门锁的物理行级映射、真实开锁指令下发与物理硬件状态反馈保持为外部阻塞状态。 + 3. 系统已在安全策略上严格禁止未经授权执行物理 Mutation,试用期间门禁模块主要用于展示对账台账架构与授权流水机制。 + +--- + +## 2. 成绩管理模块边界说明 (C03 教学成果) + +- **状态判定**:`PARTIAL_FUNCTION / IN_PROGRESS` +- **说明**: + 1. 一期需求范围主要聚焦于学员主档、教学排课、打卡考勤与大盘画像。 + 2. 成绩综合算法、多维度考核成绩矩阵录入与批量评分闭环(C03)为独立演进模块。在当前菜单体系中,“教学成果/成绩管理”被配置为按权限受控,未向普通试用用户开放空操作入口,避免产生误解或空提交。 + +--- + +## 3. 页面静态资源 404 容错机制 + +- **状态判定**:`NON_BLOCKING_EXPECTED` +- **说明**: + 初始预置的系统管理员账号在无自定义头像文件时,其相对路径引发的单次静态资源 404 会被前端 Vue 的 `@error` 兜底事件平滑捕获并自动回退到内置的矢量默认头像,不影响页面逻辑与任何功能操作。 + +--- + +## 4. 共享试用数据库保护 + +- **状态判定**:`DATA_PROTECTED` +- **说明**: + 共享试用数据库 `training` 已经历前期多轮数据提升,积累了完整的机务/电务专业班级、学员名册、排课日程与考勤流水。本次稳定化过程中严格遵守 `DATA_CLEARED = NO`,未执行任何清库、重建表结构或全量覆写操作,试用数据保持连续且完整。