permission.ts 2.1 KB

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