diff --git a/src/layout/components/Aside.vue b/src/layout/components/Aside.vue index 76702f7..9f1d752 100644 --- a/src/layout/components/Aside.vue +++ b/src/layout/components/Aside.vue @@ -96,7 +96,9 @@ function handleSecondMenuClick(route) { activeSecondMenuName.value = route.name; if(route.meta.openOutside){ console.log('route-------',route) - window.open(route.path); + // window.open(route.path); + const url = route.meta.url || route.path + window.open(url, "_blank") return; } if (route.meta.openNewPage) { diff --git a/src/router/index.ts b/src/router/index.ts index d565c51..225e6dd 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -11,11 +11,26 @@ export function getModulesKey() { return Object.keys(modules).map((item) => item.replace('/src/views/', '').replace('.vue', '')) } +function normalizeUrl(url: string) { + if (/^https?:\/\//i.test(url)) return url + return "https://" + url +} + +function genExternalPath(menu: any) { + return `/external/${menu.id}` +} + + export function createRouteRecord(menus) { return menus.map(menu => { + const isExternal = !!menu.openOutside + console.log("============menu==============") + console.log(menu) const routeRecord: RouteRecordRaw = { - path: menu.paths, - name: Symbol(menu.paths), + // ✅ 外链用站内 path,占位 + path: isExternal ? genExternalPath(menu) : menu.paths, + // ✅ name 用字符串,别用 Symbol + name: isExternal ? `external-${menu.id ?? menu.menuName}` : (menu.name ?? menu.paths), meta: { hidden: !menu.isShow, keepAlive: !!menu.isCache, @@ -23,19 +38,18 @@ export function createRouteRecord(menus) { perms: menu.perms, icon: menu.icon, type: menu.menuType, - openOutside:menu.openOutside, - openNewPage: menu.openNewPage - } + openOutside: menu.openOutside, + openNewPage: menu.openNewPage, + // ✅ 把真正外链放到 meta.url + url: isExternal ? normalizeUrl(menu.paths) : undefined, + }, + // ✅ 外链用一个固定组件 + component: isExternal + ? () => import("@/views/ExternalLink.vue") + : (menu.menuType === MenuEnum.CATALOGUE ? LAYOUT : loadRouteView(menu.component)), } - switch (menu.menuType) { - case MenuEnum.CATALOGUE: - routeRecord.component = LAYOUT - break - case MenuEnum.MENU: - routeRecord.component = loadRouteView(menu.component) - break - } - if (menu.children.length) { + + if (menu.children?.length) { routeRecord.children = createRouteRecord(menu.children) } return routeRecord diff --git a/src/views/ExternalLink.vue b/src/views/ExternalLink.vue new file mode 100644 index 0000000..df35aca --- /dev/null +++ b/src/views/ExternalLink.vue @@ -0,0 +1,21 @@ + + +