permission.js 2.8 KB

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