fix: 修复管理端动态菜单视图路径拼接错误 #40

Closed
opened 2026-08-24 10:27:42 +08:00 by ila · 0 comments
Owner

基本信息

  • 类型:缺陷
  • 所属 Epic:#3
  • 所属 MVP / 版本:#35(MVP-2 开发环境阻塞缺陷)
  • 阶段:已完成

依赖与并行

  • 前置工单:#39(Supervisor 环境已可复现)
  • 是否允许与前置工单并行:是
  • 原因:本缺陷只修复 admin-ui 菜单组件路径解析,不改变 Supervisor 配置。

子项目影响

  • 仅影响的子项目 / 交付单元:admin-ui
  • 是否跨子项目:否
  • 是否修改共享接口或契约:否
  • 各子项目需要执行的验证:admin-ui 单元测试、生产构建和实际浏览器菜单回归。

原始需求

  • 来源:用户对话
  • 提出时间:2026-08-24
  • 关键原话或脱敏摘要:进入管理端后,点击左侧导航模块均提示无法找到 @/viewschorus/... 模块,要求建立缺陷工单并修复。

要解决什么

复现:登录管理端,点击任一 Chorus 左侧导航模块。实际结果:运行时提示无法找到 @/viewschorus/providers/index.vue 等模块。期望结果:所有已配置 Chorus 菜单均能加载对应 src/views/chorus/ 页面且无运行时错误。

根因:数据库菜单组件值为 chorus/providers/index 等无前导斜杠路径;loadView 生成的 require.context key 缨少 ./,动态 import 路径也缺少 views/ 之间的斜杠。

做什么 / 不做什么

  • 做:规范化菜单组件路径;兼容带和不带前导斜杠的值;修正上下文键和动态 import 路径;补充回归测试;逐项验证现有 Chorus 菜单。
  • 不做:不修改数据库菜单、API、权限、页面布局、Supervisor 配置或业务功能。

已确认方案

将传入组件值转换为无前导斜杠的相对路径,由纯函数生成 ./<path>.vue 上下文键;动态 import 使用 @/views/<path>.vue。对无前导斜杠和带前导斜杠两种输入建立测试。

预计修改文件:

  • admin-ui/src/store/modules/permission.js
  • admin-ui/src/store/modules/route-view.js(纯路径辅助函数)
  • admin-ui/tests/unit/store/route-view.spec.js

需求变化记录

无。

设计与原型门禁

  • 修改类型:恢复既有行为的 Bug
  • 所需设计证据:运行时报错和现有菜单/视图路径
  • 可编辑设计源链接、版本或事实来源:现有 admin-ui 和数据库菜单配置
  • 本地 HTML 审核快照路径和版本:不适用
  • 本地浏览方式和资源完整性检查:登录后逐项点击 Chorus 侧栏菜单
  • 版本、revision 或确认日期:2026-08-24
  • 状态:已确认
  • 确认人、确认时间和覆盖范围:用户,2026-08-24,路径兼容、测试和菜单回归
  • 无需 UI 原型或无需任何原型的原因:恢复已确认的既有导航行为,不改变结构或交互。

文档影响

  • 不影响长期文档,原因:仅修复前端内部组件路径拼接,启动方式、配置、接口和业务规则均未改变。

交付文档影响

  • 无交付文档影响,原因:恢复既有导航行为,不改变用户操作方式。

验收标准

  • 无前导斜杠的 Chorus 菜单组件值能加载正确 Vue 页面。
  • 带前导斜杠的兼容路径仍能加载正确 Vue 页面。
  • Provider、模型、路由、模板、生成记录、用户和健康状态菜单均无 Cannot find module 或运行时错误。
  • admin-ui 单元测试和生产构建通过。

验证方式

  • pnpm --dir admin-ui test:unit -- --runInBand
  • pnpm --dir admin-ui build:prod
  • 当前 Supervisor 环境登录管理端并逐项点击七个 Chorus 菜单,监听浏览器 pageerror 和错误覆盖层。

风险和回退

风险:路径规范化可能影响旧的带前导斜杠菜单值。通过两种格式测试和实际菜单回归控制。回退方式:回退本工单独立提交。

实施结果

  • 提交:1d7d9fb
  • 修复:菜单组件值先移除前导斜杠,再生成 ./<path>.vue 的 webpack 上下文键和 @/views/<path>.vue 的兜底路径。
  • 测试:针对性路径测试 5/5;admin-ui 完整单元测试 40/40;受影响文件 ESLint 0 错误;生产构建完成。
  • 运行验证:Supervisor 三个 Chorus 实例均为 Running;9528 返回 HTTP 200;当前开发 bundle 包含七个 Chorus 页面模块,viewschorus 错误字符串为 0。
  • 已知构建警告:项目既有 Sass legacy API、代码生成页 codemirror 导入和包体积警告,本工单未引入。
  • 未验证:当前没有可连接的交互式浏览器实例,未自动执行登录后逐项点击;该项保留给人工验收。
  • 文档:无长期文档和交付文档影响。
  • Wiki 归档:Task-40-修复管理端动态菜单视图路径,revision 13bceadad9193ce217ee9363eea60beaa642b0d4。

验收失败与继续修复(2026-08-24)

  • 现象:访问管理端时报 Cannot read properties of undefined (reading 'getters')。
  • 根因:src/store/index.js 使用 require.context('./modules', true, /\.js$/) 自动注册所有模块;纯辅助文件 route-view.js 没有 Vuex default 导出,被注册为 undefined。
  • 已确认修正:把辅助函数移到 src/utils/route-view.js,更新引用与测试,并验证 Store 初始化和实际运行包。
  • 不变范围:不修改 Vuex 自动注册机制、数据库菜单、接口、权限、页面布局或 Supervisor 配置。

继续修复结果(2026-08-24)

  • 修正提交:ba9e6ad。
  • 调整:将 route-view.js 从 src/store/modules/ 移到 src/utils/,生产引用和测试引用同步更新;Vuex 自动注册逻辑保持不变。
  • 结构验证:src/store/modules/ 现有 7 个 .js 文件均有 Vuex default 导出,缺失数为 0。
  • 测试:路径测试 5/5,完整前端单测 40/40,受影响文件 ESLint 0 错误,生产构建完成。
  • 运行验证:重启 chorus-admin-ui 后状态为 Running;9528 页面成功完成 DOM 挂载,getters 运行时错误为 0。DOM 测试唯一提示为测试环境未实现 window.scrollTo,与本缺陷无关。
  • 待人工验收:浏览器刷新管理端并逐项点击七个 Chorus 菜单。
  • 修正后 Wiki 归档 revision:f812ccc19ee5be5a25502923b1b556897eb1bd5。

用户验收

  • 用户验收通过(2026-08-24)。
  • 最终 Wiki 归档 revision:710258b8a686b1afdf52895f1a7d994af96a56fe。
  • 实现提交:1d7d9fb、ba9e6ad,均已推送至 origin/main。
## 基本信息 - 类型:缺陷 - 所属 Epic:#3 - 所属 MVP / 版本:#35(MVP-2 开发环境阻塞缺陷) - 阶段:已完成 ## 依赖与并行 - 前置工单:#39(Supervisor 环境已可复现) - 是否允许与前置工单并行:是 - 原因:本缺陷只修复 admin-ui 菜单组件路径解析,不改变 Supervisor 配置。 ## 子项目影响 - 仅影响的子项目 / 交付单元:admin-ui - 是否跨子项目:否 - 是否修改共享接口或契约:否 - 各子项目需要执行的验证:admin-ui 单元测试、生产构建和实际浏览器菜单回归。 ## 原始需求 - 来源:用户对话 - 提出时间:2026-08-24 - 关键原话或脱敏摘要:进入管理端后,点击左侧导航模块均提示无法找到 `@/viewschorus/...` 模块,要求建立缺陷工单并修复。 ## 要解决什么 复现:登录管理端,点击任一 Chorus 左侧导航模块。实际结果:运行时提示无法找到 `@/viewschorus/providers/index.vue` 等模块。期望结果:所有已配置 Chorus 菜单均能加载对应 `src/views/chorus/` 页面且无运行时错误。 根因:数据库菜单组件值为 `chorus/providers/index` 等无前导斜杠路径;`loadView` 生成的 require.context key 缨少 `./`,动态 import 路径也缺少 `views/` 之间的斜杠。 ## 做什么 / 不做什么 - 做:规范化菜单组件路径;兼容带和不带前导斜杠的值;修正上下文键和动态 import 路径;补充回归测试;逐项验证现有 Chorus 菜单。 - 不做:不修改数据库菜单、API、权限、页面布局、Supervisor 配置或业务功能。 ## 已确认方案 将传入组件值转换为无前导斜杠的相对路径,由纯函数生成 `./<path>.vue` 上下文键;动态 import 使用 `@/views/<path>.vue`。对无前导斜杠和带前导斜杠两种输入建立测试。 预计修改文件: - `admin-ui/src/store/modules/permission.js` - `admin-ui/src/store/modules/route-view.js`(纯路径辅助函数) - `admin-ui/tests/unit/store/route-view.spec.js` ## 需求变化记录 无。 ## 设计与原型门禁 - 修改类型:恢复既有行为的 Bug - 所需设计证据:运行时报错和现有菜单/视图路径 - 可编辑设计源链接、版本或事实来源:现有 admin-ui 和数据库菜单配置 - 本地 HTML 审核快照路径和版本:不适用 - 本地浏览方式和资源完整性检查:登录后逐项点击 Chorus 侧栏菜单 - 版本、revision 或确认日期:2026-08-24 - 状态:已确认 - 确认人、确认时间和覆盖范围:用户,2026-08-24,路径兼容、测试和菜单回归 - 无需 UI 原型或无需任何原型的原因:恢复已确认的既有导航行为,不改变结构或交互。 ## 文档影响 - [x] 不影响长期文档,原因:仅修复前端内部组件路径拼接,启动方式、配置、接口和业务规则均未改变。 ## 交付文档影响 - [x] 无交付文档影响,原因:恢复既有导航行为,不改变用户操作方式。 ## 验收标准 - [x] 无前导斜杠的 Chorus 菜单组件值能加载正确 Vue 页面。 - [x] 带前导斜杠的兼容路径仍能加载正确 Vue 页面。 - [x] Provider、模型、路由、模板、生成记录、用户和健康状态菜单均无 `Cannot find module` 或运行时错误。 - [x] admin-ui 单元测试和生产构建通过。 ## 验证方式 - `pnpm --dir admin-ui test:unit -- --runInBand` - `pnpm --dir admin-ui build:prod` - 当前 Supervisor 环境登录管理端并逐项点击七个 Chorus 菜单,监听浏览器 pageerror 和错误覆盖层。 ## 风险和回退 风险:路径规范化可能影响旧的带前导斜杠菜单值。通过两种格式测试和实际菜单回归控制。回退方式:回退本工单独立提交。 ## 实施结果 - 提交:`1d7d9fb` - 修复:菜单组件值先移除前导斜杠,再生成 `./<path>.vue` 的 webpack 上下文键和 `@/views/<path>.vue` 的兜底路径。 - 测试:针对性路径测试 5/5;admin-ui 完整单元测试 40/40;受影响文件 ESLint 0 错误;生产构建完成。 - 运行验证:Supervisor 三个 Chorus 实例均为 Running;9528 返回 HTTP 200;当前开发 bundle 包含七个 Chorus 页面模块,`viewschorus` 错误字符串为 0。 - 已知构建警告:项目既有 Sass legacy API、代码生成页 codemirror 导入和包体积警告,本工单未引入。 - 未验证:当前没有可连接的交互式浏览器实例,未自动执行登录后逐项点击;该项保留给人工验收。 - 文档:无长期文档和交付文档影响。 - Wiki 归档:[Task-40-修复管理端动态菜单视图路径](https://git.ilapage.cn/OPC/chorus/wiki/Task-40-%E4%BF%AE%E5%A4%8D%E7%AE%A1%E7%90%86%E7%AB%AF%E5%8A%A8%E6%80%81%E8%8F%9C%E5%8D%95%E8%A7%86%E5%9B%BE%E8%B7%AF%E5%BE%84.-),revision 13bceadad9193ce217ee9363eea60beaa642b0d4。 ## 验收失败与继续修复(2026-08-24) - 现象:访问管理端时报 `Cannot read properties of undefined (reading 'getters')`。 - 根因:`src/store/index.js` 使用 `require.context('./modules', true, /\.js$/)` 自动注册所有模块;纯辅助文件 `route-view.js` 没有 Vuex `default` 导出,被注册为 `undefined`。 - 已确认修正:把辅助函数移到 `src/utils/route-view.js`,更新引用与测试,并验证 Store 初始化和实际运行包。 - 不变范围:不修改 Vuex 自动注册机制、数据库菜单、接口、权限、页面布局或 Supervisor 配置。 ## 继续修复结果(2026-08-24) - 修正提交:`ba9e6ad`。 - 调整:将 `route-view.js` 从 `src/store/modules/` 移到 `src/utils/`,生产引用和测试引用同步更新;Vuex 自动注册逻辑保持不变。 - 结构验证:`src/store/modules/` 现有 7 个 `.js` 文件均有 Vuex `default` 导出,缺失数为 0。 - 测试:路径测试 5/5,完整前端单测 40/40,受影响文件 ESLint 0 错误,生产构建完成。 - 运行验证:重启 `chorus-admin-ui` 后状态为 Running;9528 页面成功完成 DOM 挂载,`getters` 运行时错误为 0。DOM 测试唯一提示为测试环境未实现 `window.scrollTo`,与本缺陷无关。 - 待人工验收:浏览器刷新管理端并逐项点击七个 Chorus 菜单。 - 修正后 Wiki 归档 revision:f812ccc19ee5be5a25502923b1b556897eb1bd5。 ## 用户验收 - 用户验收通过(2026-08-24)。 - 最终 Wiki 归档 revision:`710258b8a686b1afdf52895f1a7d994af96a56fe`。 - 实现提交:`1d7d9fb`、`ba9e6ad`,均已推送至 `origin/main`。
ila closed this issue 2026-08-24 11:20:46 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#40