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