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 // 初始化路由渲染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
* 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 * @param {array} roles

View File

@ -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
} }
} }
] ]

View File

@ -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菜单 */