From b61b0ce25fdcbaf29ca64cbcc467e12faa947625 Mon Sep 17 00:00:00 2001 From: Soybean Date: Sat, 22 Jan 2022 16:14:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(projects):=20=E4=BF=AE=E5=A4=8D=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=AE=88=E5=8D=AB=E7=9A=84=E5=8A=A8=E6=80=81=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/guard/dynamic.ts | 46 ++++++++++++++++++++++++++++++++++ src/router/guard/index.ts | 4 +-- src/router/guard/permission.ts | 38 +++++++++------------------- 3 files changed, 60 insertions(+), 28 deletions(-) create mode 100644 src/router/guard/dynamic.ts diff --git a/src/router/guard/dynamic.ts b/src/router/guard/dynamic.ts new file mode 100644 index 00000000..5ac73c6c --- /dev/null +++ b/src/router/guard/dynamic.ts @@ -0,0 +1,46 @@ +import type { Router, RouteLocationNormalized, NavigationGuardNext } from 'vue-router'; +import { routeName } from '@/router'; +import { useRouteStore } from '@/store'; +import { getToken } from '@/utils'; + +/** + * 动态路由 + */ +export async function createDynamicRouteGuard( + to: RouteLocationNormalized, + _from: RouteLocationNormalized, + next: NavigationGuardNext, + router: Router +) { + const route = useRouteStore(); + const isLogin = Boolean(getToken()); + + // 初始化动态路由 + if (!route.isAddedDynamicRoute) { + // 未登录情况下直接回到登录页,登录成功后再加载动态路由 + if (!isLogin) { + if (to.name === routeName('login')) { + next(); + } else { + const redirect = to.fullPath; + next({ name: routeName('login'), query: { redirect } }); + } + return false; + } + + await route.initDynamicRoute(router); + + if (to.name === routeName('not-found-page')) { + // 动态路由没有加载导致被not-found-page路由捕获,等待动态路由加载好了,回到之前的路由 + next({ path: to.fullPath, replace: true, query: to.query }); + return false; + } + // 动态路由已经加载,仍然未找到,重定向到not-found + if (to.name === routeName('not-found-page')) { + next({ name: routeName('not-found'), replace: true }); + return false; + } + } + + return true; +} diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts index 4834b4ed..174227b6 100644 --- a/src/router/guard/index.ts +++ b/src/router/guard/index.ts @@ -1,6 +1,6 @@ import type { Router } from 'vue-router'; import { useTitle } from '@vueuse/core'; -import { handlePagePermission } from './permission'; +import { createPermissionGuard } from './permission'; /** * 路由守卫函数 @@ -11,7 +11,7 @@ export function createRouterGuard(router: Router) { // 开始 loadingBar window.$loadingBar?.start(); // 页面跳转权限处理 - await handlePagePermission(to, from, next, router); + await createPermissionGuard(to, from, next, router); }); router.afterEach(to => { // 设置document title diff --git a/src/router/guard/permission.ts b/src/router/guard/permission.ts index 97764a50..8105c1ee 100644 --- a/src/router/guard/permission.ts +++ b/src/router/guard/permission.ts @@ -1,39 +1,19 @@ import type { Router, RouteLocationNormalized, NavigationGuardNext } from 'vue-router'; import { routeName } from '@/router'; -import { useAuthStore, useRouteStore } from '@/store'; +import { useAuthStore } from '@/store'; import { exeStrategyActions, getToken } from '@/utils'; +import { createDynamicRouteGuard } from './dynamic'; /** 处理路由页面的权限 */ -export async function handlePagePermission( +export async function createPermissionGuard( to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext, router: Router ) { - const auth = useAuthStore(); - const route = useRouteStore(); - - const isLogin = Boolean(getToken()); - const permissions = to.meta.permissions || []; - const needLogin = Boolean(to.meta?.requiresAuth) || Boolean(permissions.length); - const hasPermission = !permissions.length || permissions.includes(auth.userInfo.userRole); - - // 初始化动态路由 - if (!route.isAddedDynamicRoute) { - await route.initDynamicRoute(router); - - if (to.name === routeName('not-found-page')) { - // 动态路由没有加载导致被not-found-page路由捕获,等待动态路由加载好了,回到之前的路由 - next({ path: to.fullPath, replace: true, query: to.query }); - return; - } - } - - // 动态路由已经加载,仍然未找到,重定向到not-found - if (to.name === routeName('not-found-page')) { - next({ name: routeName('not-found'), replace: true }); - return; - } + // 动态路由 + const permission = await createDynamicRouteGuard(to, from, next, router); + if (!permission) return; // 外链路由, 从新标签打开,返回上一个路由 if (to.meta.href) { @@ -42,6 +22,12 @@ export async function handlePagePermission( return; } + const auth = useAuthStore(); + const isLogin = Boolean(getToken()); + const permissions = to.meta.permissions || []; + const needLogin = Boolean(to.meta?.requiresAuth) || Boolean(permissions.length); + const hasPermission = !permissions.length || permissions.includes(auth.userInfo.userRole); + const actions: Common.StrategyAction[] = [ // 已登录状态跳转登录页,跳转至首页 [