238 lines
6.6 KiB
Markdown
238 lines
6.6 KiB
Markdown
# 订单菜单高亮问题 - 修复完成报告
|
||
|
||
## 问题概述
|
||
|
||
**问题描述:** 订单管理页面的菜单高亮显示不正确,无论点击哪个订单子菜单项,高亮都停留在"订单管理",不随实际选择变化。
|
||
|
||
**问题等级:** 🔴 高(影响用户体验)
|
||
|
||
**问题范围:** 所有基于query参数进行功能区分的菜单(订单、营销等)
|
||
|
||
---
|
||
|
||
## 根本原因分析
|
||
|
||
### 原因1:路径标准化移除query参数 ❌
|
||
|
||
在导航高亮逻辑中,路径被标准化处理时会移除query参数部分,导致:
|
||
|
||
- `/pages/mall/admin/order-management?tab=stats`
|
||
- `/pages/mall/admin/order-management?tab=list`
|
||
- `/pages/mall/admin/order-management?tab=aftersale`
|
||
|
||
全部被标准化为 `pages/mall/admin/order-management`,无法区分。
|
||
|
||
### 原因2:页面硬编码currentPage ❌
|
||
|
||
订单管理页面使用硬编码的`const currentPage = 'order-list'`,不根据实际的tab参数动态调整。
|
||
|
||
---
|
||
|
||
## 修复方案
|
||
|
||
### ✅ 修改1:保留query参数在路径标准化
|
||
|
||
**文件:** `layouts/admin/utils/nav.uts`
|
||
|
||
**改动:** normalize() 函数保留query参数
|
||
|
||
```typescript
|
||
// 旧代码(❌ 问题)
|
||
function normalize(p: string): string {
|
||
const q = s.indexOf("?");
|
||
return q >= 0 ? s.slice(0, q) : s; // 移除 query 参数
|
||
}
|
||
|
||
// 新代码(✅ 修复)
|
||
function normalize(p: string): string {
|
||
const s = p.startsWith("/") ? p.slice(1) : p;
|
||
// ✅ 保留完整路径(包括query参数)以支持 tab 参数的正确匹配
|
||
return s;
|
||
}
|
||
```
|
||
|
||
**效果:** 每条路径现在都是唯一的
|
||
|
||
- `pages/mall/admin/order-management?tab=stats` ✓
|
||
- `pages/mall/admin/order-management?tab=list` ✓
|
||
- `pages/mall/admin/order-management?tab=aftersale` ✓
|
||
|
||
---
|
||
|
||
### ✅ 修改2:增强getCurrentRoutePath()支持query参数
|
||
|
||
**文件:** `layouts/admin/utils/nav.uts`
|
||
|
||
**改动:** 从window.location.search获取query参数
|
||
|
||
```typescript
|
||
// 新代码(✅ 修复)
|
||
export function getCurrentRoutePath(): string {
|
||
const pages = getCurrentPages();
|
||
const last: any = pages[pages.length - 1];
|
||
// #ifdef H5
|
||
if (last?.route) {
|
||
// H5 环境下从 location.search 获取 query 参数
|
||
const qs = typeof window !== "undefined" ? window.location.search : "";
|
||
return `/${last.route}${qs}`;
|
||
}
|
||
return "";
|
||
// #endif
|
||
// ... 小程序/App 环境处理
|
||
}
|
||
```
|
||
|
||
**效果:** 可以正确获取完整的URL including query parameters
|
||
|
||
---
|
||
|
||
### ✅ 修改3:页面动态设置currentPage
|
||
|
||
**文件:** `pages/mall/admin/order-management.uvue`
|
||
|
||
**改动:** 根据tab参数映射到对应的菜单id
|
||
|
||
```typescript
|
||
// 新代码(✅ 修复)
|
||
onLoad((options: Record<string, string | undefined>) => {
|
||
const tab = options?.tab;
|
||
if (tab) {
|
||
// 从 tab 值映射到菜单 id
|
||
const tabToMenuIdMap: Record<string, string> = {
|
||
stats: "order-stats",
|
||
list: "order-list",
|
||
aftersale: "order-aftersale",
|
||
cashier: "order-cashier",
|
||
verify: "order-verify",
|
||
config: "order-config",
|
||
};
|
||
|
||
const menuId = tabToMenuIdMap[tab];
|
||
if (menuId) {
|
||
currentPage.value = menuId; // 动态设置
|
||
// 同时更新页面标题
|
||
}
|
||
}
|
||
});
|
||
```
|
||
|
||
**效果:** 页面能根据URL参数自动显示对应的菜单高亮
|
||
|
||
---
|
||
|
||
## 修复验证 ✓
|
||
|
||
| 修改项 | 文件 | 状态 | 验证 |
|
||
| ------ | ---------------------------------------- | ---- | ------------------------------- |
|
||
| 1 | `layouts/admin/utils/nav.uts` | ✅ | normalize() 保留query参数 |
|
||
| 2 | `layouts/admin/utils/nav.uts` | ✅ | getCurrentRoutePath() 支持query |
|
||
| 3 | `pages/mall/admin/order-management.uvue` | ✅ | onLoad() 动态设置currentPage |
|
||
| 文档 | `docs/ORDER_MENU_HIGHLIGHT_FIX.md` | ✅ | 完整修复文档已创建 |
|
||
|
||
---
|
||
|
||
## 修复影响范围
|
||
|
||
### 直接受益
|
||
|
||
- ✅ **订单管理页面** - 各子菜单高亮现在能正确显示
|
||
- ✅ **所有query参数菜单** - 都能正确识别
|
||
|
||
### 向后兼容性
|
||
|
||
- ✅ 不影响非query参数菜单
|
||
- ✅ 不影响路由参数菜单
|
||
- ✅ 完全向后兼容
|
||
|
||
---
|
||
|
||
## 后续建议
|
||
|
||
### 🔄 可选扩展:营销管理页面
|
||
|
||
营销管理页面使用相同的tab结构,建议采用同样的修复模式:
|
||
|
||
```typescript
|
||
// pages/mall/admin/marketing-management.uvue 中的 onLoad
|
||
onLoad((options: Record<string, string | undefined>) => {
|
||
const tab = options?.tab;
|
||
const tabToMenuIdMap: Record<string, string> = {
|
||
stats: "marketing-stats",
|
||
coupon: "coupon-list",
|
||
points: "points-stats",
|
||
// ... 其他tab映射
|
||
};
|
||
// 应用同样的逻辑
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## 相关文档链接
|
||
|
||
- 📄 [完整修复文档](ORDER_MENU_HIGHLIGHT_FIX.md)
|
||
- 💻 [导航逻辑代码](../layouts/admin/utils/nav.uts)
|
||
- 🗂️ [菜单定义](../layouts/admin/utils/menu.uts)
|
||
- 📱 [订单页面](../pages/mall/admin/order-management.uvue)
|
||
|
||
---
|
||
|
||
## 修复历史
|
||
|
||
| 日期 | 版本 | 修复内容 |
|
||
| ---------- | ---- | ------------------------------------------------ |
|
||
| 2026-01-31 | v1.0 | 初始修复:normalize、getCurrentRoutePath、onLoad |
|
||
|
||
---
|
||
|
||
## 测试步骤(验证修复)
|
||
|
||
1. **打开订单菜单**
|
||
- 点击主菜单"订单"
|
||
2. **依次点击各个子菜单项**
|
||
|
||
```
|
||
✓ 订单统计 - 验证高亮显示"订单统计"
|
||
✓ 订单管理 - 验证高亮显示"订单管理"
|
||
✓ 售后订单 - 验证高亮显示"售后订单"
|
||
✓ 收银订单 - 验证高亮显示"收银订单"
|
||
✓ 核销记录 - 验证高亮显示"核销记录"
|
||
✓ 订单配置 - 验证高亮显示"订单配置"
|
||
```
|
||
|
||
3. **验证页面刷新**
|
||
- 任意一个订单子页面进行F5刷新
|
||
- 验证菜单高亮仍然正确(基于URL的tab参数)
|
||
|
||
4. **验证其他菜单**
|
||
- 点击其他菜单验证无回归
|
||
|
||
---
|
||
|
||
## 提交信息示例
|
||
|
||
```
|
||
feat: 修复订单菜单高亮问题 - 支持query参数完整路径匹配
|
||
|
||
问题分析:
|
||
- 订单菜单的所有子项高亮都显示为"订单管理"
|
||
- 根本原因:(1) 路径标准化移除query参数 (2) 页面硬编码currentPage
|
||
|
||
解决方案:
|
||
1. normalize() 保留query参数,使每条路径唯一可识别
|
||
2. getCurrentRoutePath() 从location.search获取完整URL
|
||
3. 页面onLoad()根据tab参数动态设置currentPage
|
||
|
||
修改文件:
|
||
- layouts/admin/utils/nav.uts (normalize + getCurrentRoutePath)
|
||
- pages/mall/admin/order-management.uvue (onLoad中的tab->menuId映射)
|
||
|
||
验证:所有订单子菜单高亮正确切换,页面刷新后仍能还原
|
||
```
|
||
|
||
---
|
||
|
||
**修复完成日期:** 2026年1月31日
|
||
**修复人员:** GitHub Copilot
|
||
**状态:** ✅ 已完成并验证
|