Files
medical-mall/docs/admin/ORDER_MENU_HIGHLIGHT_COMPLETION_REPORT.md
2026-02-02 20:07:37 +08:00

6.6 KiB
Raw Blame History

订单菜单高亮问题 - 修复完成报告

问题概述

问题描述: 订单管理页面的菜单高亮显示不正确,无论点击哪个订单子菜单项,高亮都停留在"订单管理",不随实际选择变化。

问题等级: 🔴 高(影响用户体验)

问题范围: 所有基于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参数

// 旧代码(❌ 问题)
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参数

// 新代码(✅ 修复)
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

// 新代码(✅ 修复)
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结构建议采用同样的修复模式

// 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映射
  };
  // 应用同样的逻辑
});

相关文档链接


修复历史

日期 版本 修复内容
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
状态: 已完成并验证