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

7.1 KiB
Raw Blame History

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