refactor(menu): simplify menu active state synchronization logic

- Streamlined the synchronization of the active menu state by reducing multiple calls to syncMenuActive to a single call within nextTick.
- Added a comment to clarify the rationale behind the change and potential fallback options for synchronization issues.
This commit is contained in:
zhangtao
2026-03-29 20:36:48 +08:00
parent 7081850d46
commit c5ec09f06f
2 changed files with 7 additions and 12 deletions
+5 -4
View File
@@ -11,7 +11,7 @@
| 编号 | 简述 | 说明 | 状态 |
| ------ | ---------------------------------------- | ----------------------------- | -- |
| **1** | 角色授权:动子权限后丢父菜单,入口消失;分配后左侧能显示,点进页面后左侧导航没了 | 保存时补全祖先菜单 id;授权树节点用 `value ?? id` 建父链(`PermissonDrawer`) | **已验证解决** |
| **2** | 多级菜单 1-2-3 / 1-4,选 4 时 2、1 也被选中 | (1)左侧布局根:`menuParentBasePath` 替代 `resolveFullPath(route.path)`;(2)**子级递归**:子 `MenuItem` 的 `base-path` 须为**当前父节点**的完整路径 `resolvePath(item.path)`,不能用 `resolvePath(child.path)`(会跳过中间段,index 与 `route.path` 错位) | **待验证** |
| **2** | 左侧 / 顶部 / 混合三种布局下:兄弟目录同时高亮、或父级不亮、混合布局展开被收起等 | **`MenuItem.menuItemIndex`**:目录(有可见子节点)的 `el-menu` **index** 仅用菜单树 `path.resolve` 结果,禁止对目录用 `router.resolve(name)`(易解析成父级短路径如 `/task`,触发兄弟分支误亮);**叶子** `index` 用 `router.resolve(name).path`,与 `route.path`、`default-active` 同源。**`BasicMenu`**:`default-active` = `meta.activeMenu` 或规范化 `route.path`;去掉 `el-menu` 按 `route.path` 的 **`:key`**(避免每次跳转整表重建);`watch` 仅在 **`nextTick` 内一次** `updateActiveIndex`。**`MixLayout`**:`BasicMenu` 使用 **`:key="mixSideMenuKey"`**,仅切换顶级模块时重建侧栏。父级标题高亮依赖 **Element Plus** `el-sub-menu.is-active`。另:目录 **redirect** 必填见前后端校验(数据规范)。 | **已验证解决** |
| **7** | 混合布局下点「AI 智能助手」会跳到应用管理 | 顶栏当前模块与路由前缀误匹配(如 `/app` 与 `/application`);已用最长前缀匹配修复 | **已验证解决** |
| **8** | 历史对话内容不全(仅首条)、带附件对话异常 | AI 对话/附件链路 BUG | — |
| **14** | 建普通用户分配权限:未全选二级时一级消失,二级变一级 | 与 **#1** 同类;随 **#1** 一并修复与验证 | **已验证解决** |
@@ -57,7 +57,7 @@
## 三、合并与依赖说明
- **#1 + #14**:同一类「权限勾选 ↔ 菜单树」问题;**已验证解决**(前端树 `value`/父链与保存补祖先),后续大改菜单数据结构时可做回归。
- **#7**:与布局/路由强相关;**已验证解决**(混合顶栏最长前缀匹配),可与 **#2** 同属前端「菜单与路由」专项做回归。
- **#7**:与布局/路由强相关;**已验证解决**(混合顶栏最长前缀匹配)。**#2** 已验证解决,三种布局菜单可一起做回归。
- **#15**:涉及多处列表接口,适合单独「分页改造」批次,避免和业务大改混在一起。
- **#9、#5、#4**:组织/岗位/数据权限有产品依赖,宜在方案定稿后再开发。
@@ -78,7 +78,7 @@
1. **#24 登录慢(IP 等)** — 异步、缓存、可配置关闭等。
2. **#15 数据库分页** — 按模块/接口分批改,优先高频列表。
3. **#6 菜单多卡顿** — 前端虚拟列表/懒加载 + 接口按需加载 + 后端必要索引。
4. **#2 菜单多选高亮(左侧导航)** — 未闭环;与 **#7** 顶栏分开排查。
4. ~~**#2 三种布局下菜单高亮与混合侧栏展开**~~ — **已验证解决**(见 BUG 表 **#2** 说明)。
5. **#8 AI 历史与附件** — 独立排 AI 子迭代。
### 第三阶段(规范与国际化)
@@ -110,7 +110,7 @@
## 五、执行建议
- 建议建立 **Issue / 里程碑**:P0(约 1~2 周)→ P1 → P2…,每条拆 **验收标准**。
- **#2**(及 **#1/#14/#7** 菜单相关回归)建议同一人或同一小组连续跟进,避免菜单逻辑反复。
- **#2** 已闭环;**#1/#14/#7** 菜单相关变更仍可打包回归,避免菜单逻辑反复。
- **#15** 建议先列出 **接口清单**(哪些仍是内存分页),按访问量排序改造。
---
@@ -129,5 +129,6 @@
| 2026-03-29 | 混合布局顶栏:点击目录重定向后菜单项 `:focus` 残留似悬浮背景 — `MixTopMenu` 在选中与 `router.push` 后 `blur`;**已验证解决** |
| 2026-03-29 | **#2** 左侧导航:`BasicMenu`/`MenuItem` 路径拼接实验(含 `normalizedLayoutBase` 等)引发回归,**已回退**至仓库原有 `resolveFullPath` + `resolvePath(child.path)` 实现 |
| 2026-03-29 | **#2** 再修:确认根因为「根项 basePath 重复拼段」;仅传布局基准 `normalizedLayoutBase`(空→`/`)+ 子级 `:base-path="resolvePath(item.path)"`,`resolvePath` 规范化并与 `activeMenuPath` 对齐 |
| 2026-03-29 | **#2** 三种布局菜单:**已验证解决**。最终方案:`MenuItem` 目录/叶子分流 index;`BasicMenu` 去 `route.path` 的 `el-menu` key、同步激活仅 `nextTick` 一次;`MixLayout` 侧栏 `mixSideMenuKey`;移除独立 `menu-path.ts`。目录 **redirect** 前后端必填保留。BUG 表、排期第二阶段与合并说明已同步 |