删除了多余的菜单数据的步骤,减少性能开销,优化初始化速度。 (#4012)

* types(logic): 减少冗沉,用了泛型

* perf(router): 删除了多余的菜单数据的步骤,减少性能开销,优化初始化速度。

删除了每次刷新页面都会获取静态菜单数据的操作,改为在角色权限控制时才进行数据获取。

此更改优化了应用的初始化速度,减少了不必要的性能开销,并且确保获取静态菜单数据时不会污染路由数据。

这样可以确保其他地方更清晰地跟踪路由数据

---------

Co-authored-by: zach.zqy <bianzhixiaoyuan@163.com>
This commit is contained in:
coderPeng3yang 2024-08-06 18:36:18 +08:00 committed by GitHub
parent 7b6531a309
commit 4aac1c388c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 27 additions and 23 deletions

View File

@ -1,5 +1,5 @@
import { AppRouteModule } from '@/router/types'; import { AppRouteModule } from '@/router/types';
import type { MenuModule, Menu, AppRouteRecordRaw } from '@/router/types'; import type { Menu, AppRouteRecordRaw } from '@/router/types';
import { findPath, treeMap } from '@/utils/helper/treeHelper'; import { findPath, treeMap } from '@/utils/helper/treeHelper';
import { cloneDeep } from 'lodash-es'; import { cloneDeep } from 'lodash-es';
import { isHttpUrl } from '@/utils/is'; import { isHttpUrl } from '@/utils/is';
@ -30,13 +30,12 @@ function joinParentPath(menus: Menu[], parentPath = '') {
} }
} }
} }
// 菜单路径处理
// Parsing the menu module export function transformMenuModules(routeModList: Menu[]) {
export function transformMenuModule(menuModule: MenuModule): Menu { const cloneMenuModules = cloneDeep(routeModList);
const menuList = [menuModule]; // 路径处理
joinParentPath(cloneMenuModules);
joinParentPath(menuList); return cloneMenuModules;
return menuList[0];
} }
// 将路由转换成菜单 // 将路由转换成菜单

View File

@ -3,7 +3,7 @@ import type { RouteRecordNormalized } from 'vue-router';
import { useAppStoreWithOut } from '@/store/modules/app'; import { useAppStoreWithOut } from '@/store/modules/app';
import { usePermissionStore } from '@/store/modules/permission'; import { usePermissionStore } from '@/store/modules/permission';
import { transformMenuModule, getAllParentPath } from '@/router/helper/menuHelper'; import { getAllParentPath } from '@/router/helper/menuHelper';
import { filter } from '@/utils/helper/treeHelper'; import { filter } from '@/utils/helper/treeHelper';
import { isHttpUrl } from '@/utils/is'; import { isHttpUrl } from '@/utils/is';
import { router } from '@/router'; import { router } from '@/router';
@ -12,7 +12,7 @@ import { pathToRegexp } from 'path-to-regexp';
const modules = import.meta.glob('../routes/modules/**/*.ts', { eager: true }); const modules = import.meta.glob('../routes/modules/**/*.ts', { eager: true });
const menuModules: MenuModule[] = []; export const menuModules: MenuModule[] = [];
Object.keys(modules).forEach((key) => { Object.keys(modules).forEach((key) => {
const mod = (modules as Recordable)[key].default || {}; const mod = (modules as Recordable)[key].default || {};
@ -40,17 +40,6 @@ const isRoleMode = () => {
return getPermissionMode() === PermissionModeEnum.ROLE; return getPermissionMode() === PermissionModeEnum.ROLE;
}; };
const staticMenus: Menu[] = [];
(() => {
menuModules.sort((a, b) => {
return (a.orderNo || 0) - (b.orderNo || 0);
});
for (const menu of menuModules) {
staticMenus.push(transformMenuModule(menu));
}
})();
async function getAsyncMenus() { async function getAsyncMenus() {
const permissionStore = usePermissionStore(); const permissionStore = usePermissionStore();
//递归过滤所有隐藏的菜单 //递归过滤所有隐藏的菜单
@ -69,7 +58,7 @@ async function getAsyncMenus() {
if (isRouteMappingMode()) { if (isRouteMappingMode()) {
return menuFilter(permissionStore.getFrontMenuList); return menuFilter(permissionStore.getFrontMenuList);
} }
return staticMenus; return permissionStore.getStaticMenuList;
} }
export const getMenus = async (): Promise<Menu[]> => { export const getMenus = async (): Promise<Menu[]> => {

View File

@ -7,13 +7,14 @@ import { useUserStore } from './user';
import { useAppStoreWithOut } from './app'; import { useAppStoreWithOut } from './app';
import { toRaw } from 'vue'; import { toRaw } from 'vue';
import { transformObjToRoute, flatMultiLevelRoutes } from '@/router/helper/routeHelper'; import { transformObjToRoute, flatMultiLevelRoutes } from '@/router/helper/routeHelper';
import { transformRouteToMenu } from '@/router/helper/menuHelper'; import { transformRouteToMenu, transformMenuModules } from '@/router/helper/menuHelper';
import projectSetting from '@/settings/projectSetting'; import projectSetting from '@/settings/projectSetting';
import { PermissionModeEnum } from '@/enums/appEnum'; import { PermissionModeEnum } from '@/enums/appEnum';
import { asyncRoutes } from '@/router/routes'; import { asyncRoutes } from '@/router/routes';
import { menuModules } from '@/router/menus';
import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic'; import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic';
import { filter } from '@/utils/helper/treeHelper'; import { filter } from '@/utils/helper/treeHelper';
@ -39,6 +40,7 @@ interface PermissionState {
backMenuList: Menu[]; backMenuList: Menu[];
// 菜单列表 // 菜单列表
frontMenuList: Menu[]; frontMenuList: Menu[];
staticMenuList: Menu[];
} }
export const usePermissionStore = defineStore({ export const usePermissionStore = defineStore({
@ -58,6 +60,7 @@ export const usePermissionStore = defineStore({
// menu List // menu List
// 菜单列表 // 菜单列表
frontMenuList: [], frontMenuList: [],
staticMenuList: [],
}), }),
getters: { getters: {
getPermCodeList(state): string[] | number[] { getPermCodeList(state): string[] | number[] {
@ -69,6 +72,9 @@ export const usePermissionStore = defineStore({
getFrontMenuList(state): Menu[] { getFrontMenuList(state): Menu[] {
return state.frontMenuList; return state.frontMenuList;
}, },
getStaticMenuList(state): Menu[] {
return state.staticMenuList;
},
getLastBuildMenuTime(state): number { getLastBuildMenuTime(state): number {
return state.lastBuildMenuTime; return state.lastBuildMenuTime;
}, },
@ -90,6 +96,10 @@ export const usePermissionStore = defineStore({
this.frontMenuList = list; this.frontMenuList = list;
}, },
setStaticMenuList(list: Menu[]) {
this.staticMenuList = list;
},
setLastBuildMenuTime() { setLastBuildMenuTime() {
this.lastBuildMenuTime = new Date().getTime(); this.lastBuildMenuTime = new Date().getTime();
}, },
@ -171,6 +181,12 @@ export const usePermissionStore = defineStore({
switch (permissionMode) { switch (permissionMode) {
// 角色权限 // 角色权限
case PermissionModeEnum.ROLE: case PermissionModeEnum.ROLE:
const staticMenuList = transformMenuModules(menuModules);
staticMenuList.sort((a, b) => {
return (a.orderNo || 0) - (b.orderNo || 0);
});
// 设置菜单列表
this.setStaticMenuList(staticMenuList);
// 对非一级路由进行过滤 // 对非一级路由进行过滤
routes = filter(asyncRoutes, routeFilter); routes = filter(asyncRoutes, routeFilter);
// 对一级路由根据角色权限过滤 // 对一级路由根据角色权限过滤