| | |
| | | import type { Router, RouteRecordRaw } from 'vue-router'; |
| | | |
| | | import { permissionStore } from '/@/store/modules/permission'; |
| | | import { usePermissionStoreWithOut } from '/@/store/modules/permission'; |
| | | |
| | | import { PageEnum } from '/@/enums/pageEnum'; |
| | | import { getToken } from '/@/utils/auth'; |
| | | import { useUserStoreWithOut } from '/@/store/modules/user'; |
| | | |
| | | import { PAGE_NOT_FOUND_ROUTE } from '/@/router/constant'; |
| | | import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic'; |
| | | |
| | | import { RootRoute } from '/@/router/routes'; |
| | | |
| | | const LOGIN_PATH = PageEnum.BASE_LOGIN; |
| | | |
| | | const ROOT_PATH = RootRoute.path; |
| | | |
| | | const whitePathList: PageEnum[] = [LOGIN_PATH]; |
| | | |
| | | export function createPermissionGuard(router: Router) { |
| | | const userStore = useUserStoreWithOut(); |
| | | const permissionStore = usePermissionStoreWithOut(); |
| | | router.beforeEach(async (to, from, next) => { |
| | | // Jump to the 404 page after processing the login |
| | | if (from.path === LOGIN_PATH && to.name === PAGE_NOT_FOUND_ROUTE.name) { |
| | | next(PageEnum.BASE_HOME); |
| | | if ( |
| | | from.path === ROOT_PATH && |
| | | to.path === PageEnum.BASE_HOME && |
| | | userStore.getUserInfo.homePath && |
| | | userStore.getUserInfo.homePath !== PageEnum.BASE_HOME |
| | | ) { |
| | | next(userStore.getUserInfo.homePath); |
| | | return; |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | const token = getToken(); |
| | | const token = userStore.getToken; |
| | | |
| | | // token does not exist |
| | | if (!token) { |
| | | // You can access without permission. You need to set the routing meta.ignoreAuth to true |
| | | if ( |
| | | to.meta.ignoreAuth |
| | | // || to.name === FULL_PAGE_NOT_FOUND_ROUTE.name |
| | | ) { |
| | | if (to.meta.ignoreAuth) { |
| | | next(); |
| | | return; |
| | | } |
| | | |
| | | // redirect login page |
| | | const redirectData: { path: string; replace: boolean; query?: Indexable<string> } = { |
| | | const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = { |
| | | path: LOGIN_PATH, |
| | | replace: true, |
| | | }; |
| | |
| | | next(redirectData); |
| | | return; |
| | | } |
| | | if (permissionStore.getIsDynamicAddedRouteState) { |
| | | |
| | | // Jump to the 404 page after processing the login |
| | | if ( |
| | | from.path === LOGIN_PATH && |
| | | to.name === PAGE_NOT_FOUND_ROUTE.name && |
| | | to.fullPath !== (userStore.getUserInfo.homePath || PageEnum.BASE_HOME) |
| | | ) { |
| | | next(userStore.getUserInfo.homePath || PageEnum.BASE_HOME); |
| | | return; |
| | | } |
| | | |
| | | // get userinfo while last fetch time is empty |
| | | if (userStore.getLastUpdateTime === 0) { |
| | | try { |
| | | await userStore.getUserInfoAction(); |
| | | } catch (err) { |
| | | next(); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | if (permissionStore.getIsDynamicAddedRoute) { |
| | | next(); |
| | | return; |
| | | } |
| | | |
| | | const routes = await permissionStore.buildRoutesAction(); |
| | | |
| | | routes.forEach((route) => { |
| | | router.addRoute((route as unknown) as RouteRecordRaw); |
| | | router.addRoute(route as unknown as RouteRecordRaw); |
| | | }); |
| | | |
| | | const redirectPath = (from.query.redirect || to.path) as string; |
| | | const redirect = decodeURIComponent(redirectPath); |
| | | const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }; |
| | | permissionStore.commitDynamicAddedRouteState(true); |
| | | next(nextData); |
| | | router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); |
| | | |
| | | permissionStore.setDynamicAddedRoute(true); |
| | | |
| | | if (to.name === PAGE_NOT_FOUND_ROUTE.name) { |
| | | // 动态添加路由后,此处应当重定向到fullPath,否则会加载404页面内容 |
| | | next({ path: to.fullPath, replace: true, query: to.query }); |
| | | } else { |
| | | const redirectPath = (from.query.redirect || to.path) as string; |
| | | const redirect = decodeURIComponent(redirectPath); |
| | | const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }; |
| | | next(nextData); |
| | | } |
| | | }); |
| | | } |