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

80 lines
7.1 KiB
Markdown
Raw Normal View History

# 缺陷清单 (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`,不影响任何正常业务与界面渲染,标记为非阻塞。