feat: 路由树排序

This commit is contained in:
wang_fan_w 2024-08-24 17:08:57 +08:00
parent 5d452d78ee
commit d42685be06
3 changed files with 40 additions and 9 deletions

View File

@ -20,21 +20,20 @@ export async function initSetRouter() {
// 初始化路由渲染loading
loadingPage.start();
const store = useRoutesListStore(pinia);
// 根据角色权限过滤树
// 根据角色权限过滤树并将其排序
const originTree: RouteRecordRaw[] = deepClone(dynamicRoutes);
let filteredTree = filterByRole(originTree[0].children);
let filteredTree = treeSort(filterByRole(originTree[0].children));
await store.setRouteTree(filteredTree);
// 根据树生成一维路由数组
const flattenedArray = linearArray(filteredTree);
// 设置完整的路由,二维路由顶层路由 + 二级的一维路由
const twoStoryTree = originTree.map(item => {
// 设置完整的路由,二维路由顶层路由 + 二级的一维路由
const addBeforeTree = originTree.map(item => {
if (flattenedArray.length > 0) item.redirect = flattenedArray[0].path;
item.children = flattenedArray;
return item;
});
// 动态添加路由
twoStoryTree.forEach((route: any) => router.addRoute(route));
addBeforeTree.forEach((route: RouteRecordRaw) => router.addRoute(route));
// 设置一维路由
setRouting(flattenedArray);
}
@ -78,6 +77,37 @@ export const filterByRole = (tree: any) => {
});
};
/**
*
* 1
* 2children则递归排序
* @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

View File

@ -90,7 +90,6 @@ export const dynamicRoutes: RouteRecordRaw[] = [
}
]
},
{
path: "/table-management",
name: "table-management",
@ -122,7 +121,7 @@ export const dynamicRoutes: RouteRecordRaw[] = [
iframe: false,
roles: ["admin"],
icon: "icon-menu",
sort: 1
sort: 2
}
},
{
@ -139,7 +138,7 @@ export const dynamicRoutes: RouteRecordRaw[] = [
iframe: false,
roles: ["admin"],
icon: "icon-menu",
sort: 2
sort: 1
}
}
]

View File

@ -12,6 +12,7 @@ declare namespace Menu {
interface MetaType {
title: string;
hide: boolean;
disable: boolean;
keepAlive: boolean;
affix: boolean;
link?: string;
@ -19,6 +20,7 @@ declare namespace Menu {
roles: Array<string>;
icon?: string;
svgIcon?: string;
sort?: number;
}
}
/* tabs菜单 */