From bcb97a6c49dddcf6ca93c2281a744379243b30dc Mon Sep 17 00:00:00 2001 From: Chill Fish Date: Tue, 19 Sep 2023 10:11:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BD=BF=20router/permission=20?= =?UTF-8?q?=E6=9B=B4=E6=98=93=E8=AF=BB=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/permission.ts | 85 ++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/src/router/permission.ts b/src/router/permission.ts index abc54893..aeba45c9 100644 --- a/src/router/permission.ts +++ b/src/router/permission.ts @@ -19,55 +19,54 @@ router.beforeEach(async (to, _from, next) => { NProgress.start() const userStore = useUserStoreHook() const permissionStore = usePermissionStoreHook() - // 判断该用户是否登录 - if (getToken()) { - if (to.path === "/login") { - // 如果已经登录,并准备进入 Login 页面,则重定向到主页 - next({ path: "/" }) - NProgress.done() - } else { - // 检查用户是否已获得其权限角色 - if (userStore.roles.length === 0) { - try { - if (routeSettings.async) { - // 注意:角色必须是一个数组! 例如: ['admin'] 或 ['developer', 'editor'] - await userStore.getInfo() - const roles = userStore.roles - // 根据角色生成可访问的 Routes(可访问路由 = 常驻路由 + 有访问权限的动态路由) - permissionStore.setRoutes(roles) - } else { - // 没有开启动态路由功能,则启用默认角色 - userStore.setRoles(routeSettings.defaultRoles) - permissionStore.setRoutes(routeSettings.defaultRoles) - } - // 将'有访问权限的动态路由' 添加到 Router 中 - permissionStore.dynamicRoutes.forEach((route) => { - router.addRoute(route) - }) - // 确保添加路由已完成 - // 设置 replace: true, 因此导航将不会留下历史记录 - next({ ...to, replace: true }) - } catch (err: any) { - // 过程中发生任何错误,都直接重置 Token,并重定向到登录页面 - userStore.resetToken() - ElMessage.error(err.message || "路由守卫过程发生错误") - next("/login") - NProgress.done() - } - } else { - next() - } - } - } else { - // 如果没有 Token + const token = getToken() + + // 判断该用户是否已经登录 + if (!token) { + // 如果在免登录的白名单中,则直接进入 if (isWhiteList(to)) { - // 如果在免登录的白名单中,则直接进入 next() } else { // 其他没有访问权限的页面将被重定向到登录页面 - next("/login") NProgress.done() + next("/login") + } + return + } + + // 如果已经登录,并准备进入 Login 页面,则重定向到主页 + if (to.path === "/login") { + NProgress.done() + return next({ path: "/" }) + } + + // 如果用户已经获得其权限角色 + if (userStore.roles.length !== 0) return next() + + // 否则要重新获取权限角色 + try { + if (routeSettings.async) { + // 注意:角色必须是一个数组! 例如: ['admin'] 或 ['developer', 'editor'] + await userStore.getInfo() + const roles = userStore.roles + // 根据角色生成可访问的 Routes(可访问路由 = 常驻路由 + 有访问权限的动态路由) + permissionStore.setRoutes(roles) + } else { + // 没有开启动态路由功能,则启用默认角色 + userStore.setRoles(routeSettings.defaultRoles) + permissionStore.setRoutes(routeSettings.defaultRoles) } + // 将'有访问权限的动态路由' 添加到 Router 中 + permissionStore.dynamicRoutes.forEach((route) => router.addRoute(route)) + // 确保添加路由已完成 + // 设置 replace: true, 因此导航将不会留下历史记录 + next({ ...to, replace: true }) + } catch (err: any) { + // 过程中发生任何错误,都直接重置 Token,并重定向到登录页面 + userStore.resetToken() + ElMessage.error(err.message || "路由守卫过程发生错误") + NProgress.done() + next("/login") } })