Spaces:
Sleeping
Sleeping
| import router from "@/router"; | |
| import { useUserStore, usePermissionStore } from "@/store"; | |
| import NProgress from "@/utils/nprogress"; | |
| import { RouteRecordRaw } from "vue-router"; | |
| export function setupPermission() { | |
| // 白名单路由 | |
| const whiteList = ["/login"]; | |
| router.beforeEach(async (to, from, next) => { | |
| NProgress.start(); | |
| const hasToken = localStorage.getItem("accessToken"); | |
| if (hasToken) { | |
| if (to.path === "/login") { | |
| // 如果已登录,跳转首页 | |
| next({ path: "/" }); | |
| NProgress.done(); | |
| } else { | |
| const userStore = useUserStore(); | |
| const hasRoles = | |
| userStore.user.roles && userStore.user.roles.length > 0; | |
| if (hasRoles) { | |
| // 未匹配到任何路由,跳转404 | |
| if (to.matched.length === 0) { | |
| from.name ? next({ name: from.name }) : next("/404"); | |
| } else { | |
| next(); | |
| } | |
| } else { | |
| const permissionStore = usePermissionStore(); | |
| try { | |
| const { roles } = await userStore.getUserInfo(); | |
| const accessRoutes = await permissionStore.generateRoutes(roles); | |
| accessRoutes.forEach((route: RouteRecordRaw) => { | |
| router.addRoute(route); | |
| }); | |
| next({ ...to, replace: true }); | |
| } catch (error) { | |
| // 移除 token 并跳转登录页 | |
| await userStore.resetToken(); | |
| next(`/login?redirect=${to.path}`); | |
| NProgress.done(); | |
| } | |
| } | |
| } | |
| } else { | |
| // 未登录可以访问白名单页面 | |
| if (whiteList.indexOf(to.path) !== -1) { | |
| next(); | |
| } else { | |
| next(`/login?redirect=${to.path}`); | |
| NProgress.done(); | |
| } | |
| } | |
| }); | |
| router.afterEach(() => { | |
| NProgress.done(); | |
| }); | |
| } | |