feat: 路由树排序
This commit is contained in:
parent
5d452d78ee
commit
d42685be06
@ -20,21 +20,20 @@ export async function initSetRouter() {
|
|||||||
// 初始化路由,渲染loading
|
// 初始化路由,渲染loading
|
||||||
loadingPage.start();
|
loadingPage.start();
|
||||||
const store = useRoutesListStore(pinia);
|
const store = useRoutesListStore(pinia);
|
||||||
// 根据角色权限过滤树
|
// 根据角色权限过滤树并将其排序
|
||||||
const originTree: RouteRecordRaw[] = deepClone(dynamicRoutes);
|
const originTree: RouteRecordRaw[] = deepClone(dynamicRoutes);
|
||||||
let filteredTree = filterByRole(originTree[0].children);
|
let filteredTree = treeSort(filterByRole(originTree[0].children));
|
||||||
await store.setRouteTree(filteredTree);
|
await store.setRouteTree(filteredTree);
|
||||||
// 根据树生成一维路由数组
|
// 根据树生成一维路由数组
|
||||||
const flattenedArray = linearArray(filteredTree);
|
const flattenedArray = linearArray(filteredTree);
|
||||||
// 设置完整的路由,二维路由,顶层路由 + 二级的一维路由
|
// 设置完整的路由,二维路由:顶层路由 + 二级的一维路由
|
||||||
const twoStoryTree = originTree.map(item => {
|
const addBeforeTree = originTree.map(item => {
|
||||||
if (flattenedArray.length > 0) item.redirect = flattenedArray[0].path;
|
if (flattenedArray.length > 0) item.redirect = flattenedArray[0].path;
|
||||||
item.children = flattenedArray;
|
item.children = flattenedArray;
|
||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
|
|
||||||
// 动态添加路由
|
// 动态添加路由
|
||||||
twoStoryTree.forEach((route: any) => router.addRoute(route));
|
addBeforeTree.forEach((route: RouteRecordRaw) => router.addRoute(route));
|
||||||
// 设置一维路由
|
// 设置一维路由
|
||||||
setRouting(flattenedArray);
|
setRouting(flattenedArray);
|
||||||
}
|
}
|
||||||
@ -78,6 +77,37 @@ export const filterByRole = (tree: any) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由树递归排序
|
||||||
|
* 1、先给当前层排序
|
||||||
|
* 2、若当前层有children则递归排序
|
||||||
|
* @param {array} tree 根据角色权限过滤后的路由树
|
||||||
|
* @returns 返回排序之后的树
|
||||||
|
*/
|
||||||
|
export const treeSort = (tree: Menu.MenuOptions[]) => {
|
||||||
|
if (!tree || tree.length == 0) return [];
|
||||||
|
tree.sort((a: Menu.MenuOptions, b: Menu.MenuOptions) => {
|
||||||
|
// a和b都是undefined则相等
|
||||||
|
if (a.meta.sort != 0 && !a.meta.sort && b.meta.sort != 0 && !b.meta.sort) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// a是undefined则a被排在b之后
|
||||||
|
if (a.meta.sort != 0 && !a.meta.sort) return 1;
|
||||||
|
// b是undefined则b被排在a之后
|
||||||
|
if (b.meta.sort != 0 && !b.meta.sort) return -1;
|
||||||
|
return a.meta.sort - b.meta.sort;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 深层递归
|
||||||
|
let sortAfter = tree.map((item: any) => {
|
||||||
|
if (item?.children?.length > 0) {
|
||||||
|
item.children = treeSort(item.children);
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
return sortAfter;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验该角色是否有路由权限
|
* 校验该角色是否有路由权限
|
||||||
* @param {array} roles 路由的角色权限
|
* @param {array} roles 路由的角色权限
|
||||||
|
|||||||
@ -90,7 +90,6 @@ export const dynamicRoutes: RouteRecordRaw[] = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
path: "/table-management",
|
path: "/table-management",
|
||||||
name: "table-management",
|
name: "table-management",
|
||||||
@ -122,7 +121,7 @@ export const dynamicRoutes: RouteRecordRaw[] = [
|
|||||||
iframe: false,
|
iframe: false,
|
||||||
roles: ["admin"],
|
roles: ["admin"],
|
||||||
icon: "icon-menu",
|
icon: "icon-menu",
|
||||||
sort: 1
|
sort: 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -139,7 +138,7 @@ export const dynamicRoutes: RouteRecordRaw[] = [
|
|||||||
iframe: false,
|
iframe: false,
|
||||||
roles: ["admin"],
|
roles: ["admin"],
|
||||||
icon: "icon-menu",
|
icon: "icon-menu",
|
||||||
sort: 2
|
sort: 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
2
src/typings/global.d.ts
vendored
2
src/typings/global.d.ts
vendored
@ -12,6 +12,7 @@ declare namespace Menu {
|
|||||||
interface MetaType {
|
interface MetaType {
|
||||||
title: string;
|
title: string;
|
||||||
hide: boolean;
|
hide: boolean;
|
||||||
|
disable: boolean;
|
||||||
keepAlive: boolean;
|
keepAlive: boolean;
|
||||||
affix: boolean;
|
affix: boolean;
|
||||||
link?: string;
|
link?: string;
|
||||||
@ -19,6 +20,7 @@ declare namespace Menu {
|
|||||||
roles: Array<string>;
|
roles: Array<string>;
|
||||||
icon?: string;
|
icon?: string;
|
||||||
svgIcon?: string;
|
svgIcon?: string;
|
||||||
|
sort?: number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* tabs菜单 */
|
/* tabs菜单 */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user