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 @@
@@ -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',