From b87301e89d2f60363785c28c9d35f25a23a2c92d Mon Sep 17 00:00:00 2001 From: zzh <1368735060@qq.com> Date: Thu, 9 Jul 2026 15:34:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8C=89=E8=BD=A8=E8=BF=B9=E6=96=B0?= =?UTF-8?q?=E6=89=8B=E6=8C=87=E5=BC=95=E6=A8=A1=E5=BC=8F=E8=A1=A5=E9=BD=90?= =?UTF-8?q?=E8=AE=A2=E5=8D=95/=E6=B8=A0=E9=81=93=E6=8C=87=E5=BC=95?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E4=B8=8E=E8=B7=AF=E7=94=B1=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit generate-menu-excel、vite dev SPA 白名单、top-nav path 映射与 locale 区分同名「新手指引」。 Co-authored-by: Cursor --- generate-menu-excel.js | 22 ++++++++++++++++++++++ src/components/top-nav/index.vue | 20 +++++++++++++++++--- src/utils/menu-icon.ts | 11 +++++++++++ vite.config.ts | 2 ++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/generate-menu-excel.js b/generate-menu-excel.js index f7462f2..6d3d38e 100644 --- a/generate-menu-excel.js +++ b/generate-menu-excel.js @@ -304,6 +304,17 @@ const menuData = [ hideInMenu: false, }, // 二级菜单 - 订单 + { + level: 2, + name: '新手指引', + permissionCode: 'Order', + route: '/order/guide', + component: 'views/order/orderGuide/index', + icon: 'icon-book', + order: 0, + hideInMenu: false, + parentRoute: '/order', + }, { level: 2, name: '我要查价', @@ -361,6 +372,17 @@ const menuData = [ hideInMenu: false, }, // 二级菜单 - 渠道 + { + level: 2, + name: '新手指引', + permissionCode: 'Channel', + route: '/channel/guide', + component: 'views/channel/channelGuide/index', + icon: 'icon-book', + order: 0, + hideInMenu: false, + parentRoute: '/channel', + }, { level: 2, name: '销售产品', diff --git a/src/components/top-nav/index.vue b/src/components/top-nav/index.vue index fc08fb5..56cdf3d 100644 --- a/src/components/top-nav/index.vue +++ b/src/components/top-nav/index.vue @@ -32,7 +32,7 @@ - {{ formatMenuTitle(menuItem.name || menuItem.meta?.title) }} + {{ formatMenuTitle(menuItem.name || menuItem.meta?.title, menuItem.path || menuItem.route) }} @@ -169,7 +169,7 @@ import { useHiprintClientState, } from '@/utils/hiprint/hiprintClientState'; import { getMapIdFromAccessToken } from '@/utils/jwt'; -import { getSubMenuIcon } from '@/utils/menu-icon'; +import { getSubMenuIcon, PATH_TO_LOCALE_KEY } from '@/utils/menu-icon'; import { canAccessCustomerPortalRoute } from '@/utils/login-portal'; import { resolveCurrentCustomer } from '@/api/customer/resolve'; import { CUSTOMER_BALANCE_CHANGED_EVENT } from '@/api/customer/accountFlow'; @@ -405,6 +405,9 @@ const belongTopMenu = computed(() => { return ''; }); +// 路径 → locale(同名菜单如「新手指引」须按 path 区分) +const pathToLocaleKeyMap = PATH_TO_LOCALE_KEY; + // 中文菜单名称到 locale key 的映射表 const menuNameToLocaleKeyMap: Record = { '首页': 'menu.home', @@ -483,8 +486,12 @@ const menuNameToLocaleKeyMap: Record = { }; // 格式化菜单标题 -const formatMenuTitle = (title?: string) => { +const formatMenuTitle = (title?: string, path?: string) => { if (!title) return ''; + const routePath = path?.trim(); + if (routePath && pathToLocaleKeyMap[routePath]) { + return t(pathToLocaleKeyMap[routePath]) || title; + } // 如果是 locale key,直接翻译 if (title.startsWith('menu.')) { return t(title) || title; @@ -576,7 +583,14 @@ const pathToRouteNameMap: Record = { '/channel/weightRounding': 'WeightRounding', '/channel/autoTrigger': 'AutoTrigger', '/channel/issueTemplate': 'IssueTemplate', + '/channel/guide': 'ChannelGuide', + '/order/guide': 'OrderGuide', + '/order/priceCheck': 'PriceCheck', + '/order/placeOrder': 'PlaceOrder', + '/order/myOrders': 'MyOrders', + '/order/batchJobs': 'OrderBatchJobs', // Track 相关路由 + '/track/guide': 'TrackGuide', '/track/order': 'TrackOrder', '/track/warningOrder': 'TrackWarningOrder', '/track/state': 'TrackState', diff --git a/src/utils/menu-icon.ts b/src/utils/menu-icon.ts index 537abdf..798f44d 100644 --- a/src/utils/menu-icon.ts +++ b/src/utils/menu-icon.ts @@ -104,6 +104,13 @@ export function resolveArcoIcon(icon?: string | null): Component | null { return (Icons as Record)[pascal] ?? null } +/** 同名菜单(如「新手指引」)按 path 区分 locale */ +export const PATH_TO_LOCALE_KEY: Record = { + '/track/guide': 'menu.track.trackGuide', + '/order/guide': 'menu.order.orderGuide', + '/channel/guide': 'menu.channel.channelGuide', +} + type MenuIconItem = { name?: string path?: string @@ -118,6 +125,10 @@ function resolveLocaleKey( menuItem: MenuIconItem, nameToLocaleKeyMap?: Record, ): string | undefined { + const routePath = (menuItem.path || menuItem.route || '').trim() + if (routePath && PATH_TO_LOCALE_KEY[routePath]) { + return PATH_TO_LOCALE_KEY[routePath] + } const title = menuItem.name || menuItem.meta?.title || '' if (!title) return undefined if (title.startsWith('menu.')) return title diff --git a/vite.config.ts b/vite.config.ts index 6009681..7dc8112 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -258,7 +258,9 @@ export default defineConfig(({ mode }) => { '/channel/autoTrigger', '/channel/issueTemplate', '/channel/labelDesign', + '/channel/guide', // Order 相关前端路由 + '/order/guide', '/order/priceCheck', '/order/placeOrder', '/order/myOrders',