mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-08-27 14:13:40 +08:00
fix(menu): fix externalLink not work
This commit is contained in:
@@ -3,6 +3,7 @@ import type { MenuModule, Menu, AppRouteRecordRaw } from '/@/router/types';
|
|||||||
|
|
||||||
import { findPath, forEach, treeMap, treeToList } from '/@/utils/helper/treeHelper';
|
import { findPath, forEach, treeMap, treeToList } from '/@/utils/helper/treeHelper';
|
||||||
import { cloneDeep } from 'lodash-es';
|
import { cloneDeep } from 'lodash-es';
|
||||||
|
import { isUrl } from '/@/utils/is';
|
||||||
|
|
||||||
export function getAllParentPath(treeData: any[], path: string) {
|
export function getAllParentPath(treeData: any[], path: string) {
|
||||||
const menuList = findPath(treeData, (n) => n.path === path) as Menu[];
|
const menuList = findPath(treeData, (n) => n.path === path) as Menu[];
|
||||||
@@ -39,7 +40,7 @@ export function transformMenuModule(menuModule: MenuModule): Menu {
|
|||||||
|
|
||||||
const menuList = [menu];
|
const menuList = [menu];
|
||||||
forEach(menuList, (m) => {
|
forEach(menuList, (m) => {
|
||||||
joinParentPath(menuList, m);
|
!isUrl(m.path) && joinParentPath(menuList, m);
|
||||||
});
|
});
|
||||||
return menuList[0];
|
return menuList[0];
|
||||||
}
|
}
|
||||||
@@ -58,7 +59,8 @@ export function transformRouteToMenu(routeModList: AppRouteModule[]) {
|
|||||||
return treeMap(routeList, {
|
return treeMap(routeList, {
|
||||||
conversion: (node: AppRouteRecordRaw) => {
|
conversion: (node: AppRouteRecordRaw) => {
|
||||||
const { meta: { title, icon } = {} } = node;
|
const { meta: { title, icon } = {} } = node;
|
||||||
joinParentPath(routeList, node);
|
|
||||||
|
!isUrl(node.path) && joinParentPath(routeList, node);
|
||||||
return {
|
return {
|
||||||
name: title,
|
name: title,
|
||||||
icon,
|
icon,
|
||||||
|
@@ -89,12 +89,17 @@ export async function getFlatChildrenMenus(children: Menu[]) {
|
|||||||
function basicFilter(routes: RouteRecordNormalized[]) {
|
function basicFilter(routes: RouteRecordNormalized[]) {
|
||||||
return (menu: Menu) => {
|
return (menu: Menu) => {
|
||||||
const matchRoute = routes.find((route) => {
|
const matchRoute = routes.find((route) => {
|
||||||
|
if (route.meta.externalLink) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (route.meta) {
|
if (route.meta) {
|
||||||
if (route.meta.carryParam) {
|
if (route.meta.carryParam) {
|
||||||
return pathToRegexp(route.path).test(menu.path);
|
return pathToRegexp(route.path).test(menu.path);
|
||||||
}
|
}
|
||||||
if (route.meta.ignoreAuth) return false;
|
if (route.meta.ignoreAuth) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return route.path === menu.path;
|
return route.path === menu.path;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ const menu: MenuModule = {
|
|||||||
name: 'routes.demo.iframe.doc',
|
name: 'routes.demo.iframe.doc',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'docExternal',
|
path: 'https://vvbin.cn/doc-next/',
|
||||||
name: 'routes.demo.iframe.docExternal',
|
name: 'routes.demo.iframe.docExternal',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@@ -33,11 +33,11 @@ const iframe: AppRouteModule = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'docExternal',
|
path: 'https://vvbin.cn/doc-next/',
|
||||||
name: 'DocExternal',
|
name: 'DocExternal',
|
||||||
component: IFrame,
|
component: IFrame,
|
||||||
meta: {
|
meta: {
|
||||||
externalLink: 'https://vvbin.cn/doc-next/',
|
externalLink: true,
|
||||||
title: 'routes.demo.iframe.docExternal',
|
title: 'routes.demo.iframe.docExternal',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
3
src/router/types.d.ts
vendored
3
src/router/types.d.ts
vendored
@@ -17,7 +17,7 @@ export interface RouteMeta {
|
|||||||
// Jump address
|
// Jump address
|
||||||
frameSrc?: string;
|
frameSrc?: string;
|
||||||
// Outer link jump address
|
// Outer link jump address
|
||||||
externalLink?: string;
|
externalLink?: boolean;
|
||||||
|
|
||||||
// current page transition
|
// current page transition
|
||||||
transitionName?: string;
|
transitionName?: string;
|
||||||
@@ -28,6 +28,7 @@ export interface RouteMeta {
|
|||||||
// Carrying parameters
|
// Carrying parameters
|
||||||
carryParam?: boolean;
|
carryParam?: boolean;
|
||||||
|
|
||||||
|
// Used internally to mark single-level menus
|
||||||
single?: boolean;
|
single?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user