permission.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import router from "@/router";
  2. import { useUserStore } from "@/store/modules/user";
  3. import { usePermissionStore } from "@/store/modules/permission";
  4. import NProgress from "@/utils/nprogress";
  5. export function setupPermission() {
  6. // 白名单路由
  7. const whiteList = ["/login", "/demo/hooks"];
  8. router.beforeEach(async (to, from, next) => {
  9. NProgress.start();
  10. const hasToken = localStorage.getItem("token");
  11. if (hasToken) {
  12. if (to.path === "/login") {
  13. // 如果已登录,跳转首页
  14. next({ path: "/" });
  15. NProgress.done();
  16. } else {
  17. const userStore = useUserStore();
  18. // const hasRoles =
  19. // userStore.user.roles && userStore.user.roles.length > 0;
  20. if (userStore.isGetAuth) {
  21. // 未匹配到任何路由,跳转404
  22. if (to.matched.length === 0) {
  23. from.name ? next({ name: from.name }) : next("/404");
  24. } else {
  25. next();
  26. }
  27. } else {
  28. const permissionStore = usePermissionStore();
  29. try {
  30. const { menus } = await userStore.getUserInfo();
  31. const accessRoutes = await permissionStore.generateRoutes(menus);
  32. accessRoutes.forEach((route) => {
  33. router.addRoute(route);
  34. });
  35. next({ ...to, replace: true });
  36. } catch (error) {
  37. console.error("beforeEach error", error);
  38. // 移除 token 并跳转登录页
  39. await userStore.resetToken();
  40. next(`/login?redirect=${to.path}`);
  41. NProgress.done();
  42. }
  43. }
  44. }
  45. } else {
  46. // 未登录可以访问白名单页面
  47. if (whiteList.indexOf(to.path) !== -1) {
  48. next();
  49. } else {
  50. next(`/login?redirect=${to.path}`);
  51. NProgress.done();
  52. }
  53. }
  54. });
  55. router.afterEach(() => {
  56. NProgress.done();
  57. });
  58. }