Files
railwaysystem/docs/reports/pre-customer-stabilization/20260920/bug-inventory.md
T

81 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 缺陷清单 (Bug Inventory)
本清单记录本次稳定化缺陷清扫期间主动发现的所有系统级缺陷,包含缺陷等级、受影响角色、触发路径、现象描述与处置状态。
---
## 缺陷总览
| 编号 | 缺陷标题 | 严重等级 | 受影响角色 | 触发路径 | 状态 | 关联文件 |
| :---: | :--- | :---: | :---: | :--- | :---: | :--- |
| **BUG-01** | 左侧导航栏出现无标题空白折叠菜单项 | **P1 (阻塞)** | Admin, Teacher, Student | 侧边栏菜单初始化 | **已修复** | `build_ui/src/router/index.js`<br>`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`<br>`/person/teacher`<br>`/student`<br>`/teacher` | **已修复** | `build_ui/src/views/train/student/index.vue`<br>`build_ui/src/views/train/teacher/index.vue`<br>`build_ui/src/views/train/me/student/index.vue`<br>`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`<br>`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` 不为真,于是走入 `<el-submenu>` 分支;由于缺少 `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` 且所有子项均隐藏时,强行渲染了 `<el-submenu>`。用户点击展开后下拉列表为空。
- **修复方案**:
在 `SidebarItem.vue` 中修改判断条件:只有在子节点中实际存在可见项(`hasShowingChildren(item.children)`)且自身具有有效标题时,才允许渲染 `<el-submenu>`;若所有子节点均隐藏且父级不是独立有效页面,直接隐藏该父级目录。
---
### BUG-03:用户管理页面点击“重置”抛出 TypeError 控制台崩溃
- **等级**:P1
- **根因**:
在 `build_ui/src/views/system/user/index.vue` 中,左侧部门树组件 `<el-tree ref="tree">` 此前被 HTML 注释掉,但脚本逻辑中:
- `resetQuery()` 依然硬编码调用 `this.$refs.tree.setCurrentKey(null)`;
- `watch.deptName()` 依然直接调用 `this.$refs.tree.filter(val)`;
导致当用户点击“重置”按钮时,浏览器立即抛出 `TypeError: Cannot read properties of undefined (reading 'setCurrentKey')`。此外,右侧表格列容器使用了 `<el-col :span="20">`,导致页面右侧保留了 1/6 的无效空白区。
- **修复方案**:
1. 在 `resetQuery()` 与 `watch.deptName()` 中对 `this.$refs.tree` 增加严谨的判空保护 (`if (this.$refs.tree) ...`)。
2. 将右侧列容器调整为 `<el-col :span="24">`,使表格和搜索表单全宽饱满展示。
---
### 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`,不影响任何正常业务与界面渲染,标记为非阻塞。