7.1 KiB
7.1 KiB
缺陷清单 (Bug Inventory)
本清单记录本次稳定化缺陷清扫期间主动发现的所有系统级缺陷,包含缺陷等级、受影响角色、触发路径、现象描述与处置状态。
缺陷总览
| 编号 | 缺陷标题 | 严重等级 | 受影响角色 | 触发路径 | 状态 | 关联文件 |
|---|---|---|---|---|---|---|
| BUG-01 | 左侧导航栏出现无标题空白折叠菜单项 | P1 (阻塞) | Admin, Teacher, Student | 侧边栏菜单初始化 | 已修复 | build_ui/src/router/index.jsbuild_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.vuebuild_ui/src/views/train/teacher/index.vuebuild_ui/src/views/train/me/student/index.vuebuild_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.vuebuild_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 甚至点击菜单进入管理端的门禁授权,构成越权隐患。 - 修复方案:
- 在
router/index.js中为/train明确配置hidden: true。 - 在
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 的无效空白区。
- 修复方案:
- 在
resetQuery()与watch.deptName()中对this.$refs.tree增加严谨的判空保护 (if (this.$refs.tree) ...)。 - 将右侧列容器调整为
<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,导致状态全部显示为“未知”,且开班与结训日期列呈现空白。 - 修复方案:
- 状态列优先取值
scope.row.planStatus != null ? scope.row.planStatus : scope.row.status; - 日期列兼容
startDate || startTime、endDate || endTime,并通过parseTime标准格式化; formatPlanStatusText扩充对字符串键及取消状态(0: 未开班, 1: 培训中, 2: 已结训, 3: 已取消)的完备支持。
- 状态列优先取值
BUG-06:页面加载时请求默认头像产生 404 网络警告
- 等级:P3
- 根因:
若依默认系统用户若未上传过自定义头像,其数据库字段可能为空或保留相对路径
/profile/avatar/...,导致浏览器发起一个指向缺失资源的 GET 请求而返回 404。 - 处置方案:
Navbar 组件已内置
@error="handleAvatarError"机制回退至内置静态资源profile.jpg,不影响任何正常业务与界面渲染,标记为非阻塞。