permission.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import router from "./router";
  2. import { ElMessage } from "element-plus";
  3. import NProgress from "nprogress";
  4. import "nprogress/nprogress.css";
  5. import { getToken } from "/src/utils/auth";
  6. import { isHttp } from "/src/utils/validate";
  7. import { isRelogin } from "/src/utils/request";
  8. import useUserStore from "/src/store/modules/user";
  9. import useSettingsStore from "/src/store/modules/settings";
  10. import usePermissionStore from "/src/store/modules/permission";
  11. import axios from "axios";
  12. NProgress.configure({ showSpinner: false });
  13. const whiteList = ["/login", "/register"];
  14. const checkVersion = async () => {
  15. const url = `/version.json?t=${Date.now()}`;
  16. let res = null;
  17. try {
  18. res = await axios.get(url);
  19. } catch (err) {
  20. console.error("checkVersion error: ", err);
  21. }
  22. let version = null;
  23. if (res) {
  24. version = res.data.version;
  25. }
  26. const localVersion = localStorage.getItem("sd_web_version");
  27. if (version && localVersion && JSON.parse(localVersion).version && JSON.parse(localVersion).version !== version) {
  28. localStorage.setItem("sd_web_version", JSON.stringify({ version: version }));
  29. window.location.reload();
  30. } else {
  31. localStorage.setItem("sd_web_version", JSON.stringify({ version: version }));
  32. }
  33. };
  34. const isRefresh = import.meta.env.VITE_REFRESH;
  35. router.beforeEach((to, from, next) => {
  36. // 检测版本更新;
  37. if (from.path !== "/" && isRefresh === "true") {
  38. checkVersion();
  39. }
  40. NProgress.start();
  41. if (getToken()) {
  42. to.meta.title && useSettingsStore().setTitle(to.meta.title);
  43. /* has token*/
  44. if (to.path === "/login") {
  45. next({ path: "/" });
  46. NProgress.done();
  47. } else {
  48. if (useUserStore().roles.length === 0) {
  49. isRelogin.show = true;
  50. // 判断当前用户是否已拉取完user_info信息
  51. useUserStore()
  52. .getInfo()
  53. .then(() => {
  54. isRelogin.show = false;
  55. usePermissionStore()
  56. .generateRoutes()
  57. .then((accessRoutes) => {
  58. // 根据roles权限生成可访问的路由表
  59. accessRoutes.forEach((route) => {
  60. if (!isHttp(route.path)) {
  61. router.addRoute(route); // 动态添加可访问路由表
  62. }
  63. });
  64. next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
  65. });
  66. })
  67. .catch((err) => {
  68. useUserStore()
  69. .logOut()
  70. .then(() => {
  71. ElMessage.error(err);
  72. next({ path: "/" });
  73. });
  74. });
  75. } else {
  76. next();
  77. }
  78. }
  79. } else {
  80. // 没有token
  81. if (whiteList.indexOf(to.path) !== -1) {
  82. // 在免登录白名单,直接进入
  83. next();
  84. } else {
  85. next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
  86. NProgress.done();
  87. }
  88. }
  89. });
  90. router.afterEach(() => {
  91. NProgress.done();
  92. });