diff --git a/public/serverConfig.json b/public/serverConfig.json index b4c0058..3c90bc0 100644 --- a/public/serverConfig.json +++ b/public/serverConfig.json @@ -16,5 +16,6 @@ "EpThemeColor": "#409EFF", "ShowLogo": true, "ShowModel": "smart", - "MenuArrowIconNoTransition": true + "MenuArrowIconNoTransition": true, + "CachingAsyncRoutes": true } diff --git a/src/router/utils.ts b/src/router/utils.ts index 3e32965..ba81ad2 100644 --- a/src/router/utils.ts +++ b/src/router/utils.ts @@ -16,6 +16,7 @@ import { storageSession, isIncludeAllChildren } from "@pureadmin/utils"; +import { getConfig } from "@/config"; import { buildHierarchyTree } from "@/utils/tree"; import { cloneDeep, intersection } from "lodash-unified"; import { sessionKey, type DataInfo } from "@/utils/auth"; @@ -151,41 +152,60 @@ function addPathMatch() { } } +/** 处理动态路由(后端返回的路由) */ +function handleAsyncRoutes(routeList) { + if (routeList.length === 0) { + usePermissionStoreHook().handleWholeMenus(routeList); + } else { + formatFlatteningRoutes(addAsyncRoutes(routeList)).map( + (v: RouteRecordRaw) => { + // 防止重复添加路由 + if ( + router.options.routes[0].children.findIndex( + value => value.path === v.path + ) !== -1 + ) { + return; + } else { + // 切记将路由push到routes后还需要使用addRoute,这样路由才能正常跳转 + router.options.routes[0].children.push(v); + // 最终路由进行升序 + ascending(router.options.routes[0].children); + if (!router.hasRoute(v?.name)) router.addRoute(v); + const flattenRouters: any = router + .getRoutes() + .find(n => n.path === "/"); + router.addRoute(flattenRouters); + } + } + ); + usePermissionStoreHook().handleWholeMenus(routeList); + } + addPathMatch(); +} + /** 初始化路由 */ function initRouter() { return new Promise(resolve => { - getAsyncRoutes().then(({ data }) => { - if (data.length === 0) { - usePermissionStoreHook().handleWholeMenus(data); - resolve(router); + if (getConfig()?.CachingAsyncRoutes) { + // 开启动态路由缓存本地sessionStorage + const key = "async-routes"; + const asyncRouteList = storageSession.getItem(key) as any; + if (asyncRouteList?.length > 0) { + handleAsyncRoutes(asyncRouteList); } else { - formatFlatteningRoutes(addAsyncRoutes(data)).map( - (v: RouteRecordRaw) => { - // 防止重复添加路由 - if ( - router.options.routes[0].children.findIndex( - value => value.path === v.path - ) !== -1 - ) { - return; - } else { - // 切记将路由push到routes后还需要使用addRoute,这样路由才能正常跳转 - router.options.routes[0].children.push(v); - // 最终路由进行升序 - ascending(router.options.routes[0].children); - if (!router.hasRoute(v?.name)) router.addRoute(v); - const flattenRouters: any = router - .getRoutes() - .find(n => n.path === "/"); - router.addRoute(flattenRouters); - } - resolve(router); - } - ); - usePermissionStoreHook().handleWholeMenus(data); + getAsyncRoutes().then(({ data }) => { + handleAsyncRoutes(data); + storageSession.setItem(key, data); + }); } - addPathMatch(); - }); + resolve(router); + } else { + getAsyncRoutes().then(({ data }) => { + handleAsyncRoutes(data); + resolve(router); + }); + } }); } diff --git a/src/utils/auth.ts b/src/utils/auth.ts index 81d6d43..f8e1b70 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -70,7 +70,7 @@ export function setToken(data: DataInfo) { /** 删除`token`以及key值为`user-info`的session信息 */ export function removeToken() { Cookies.remove(TokenKey); - sessionStorage.removeItem(sessionKey); + sessionStorage.clear(); } /** 格式化token(jwt格式) */ diff --git a/src/views/permission/page/index.vue b/src/views/permission/page/index.vue index 1d00bf0..f72074b 100644 --- a/src/views/permission/page/index.vue +++ b/src/views/permission/page/index.vue @@ -33,6 +33,7 @@ function onChange() { .loginByUsername({ username: username.value, password: "admin123" }) .then(res => { if (res.success) { + sessionStorage.removeItem("async-routes"); usePermissionStoreHook().clearAllCachePage(); initRouter(); } diff --git a/types/global.d.ts b/types/global.d.ts index 3d7400d..591ff67 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -95,14 +95,7 @@ declare global { ShowLogo?: boolean; ShowModel?: string; MenuArrowIconNoTransition?: boolean; - MapConfigure?: { - amapKey?: string; - options: { - resizeEnable?: boolean; - center?: number[]; - zoom?: number; - }; - }; + CachingAsyncRoutes?: boolean; } /** @@ -127,14 +120,6 @@ declare global { epThemeColor?: string; showLogo?: boolean; showModel?: string; - mapConfigure?: { - amapKey?: string; - options: { - resizeEnable?: boolean; - center?: number[]; - zoom?: number; - }; - }; username?: string; }