permission.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * 权限控制
  3. */
  4. import NProgress from 'nprogress'
  5. import router, { findFirstValidRoute } from './router'
  6. import 'nprogress/nprogress.css'
  7. import { isExternal } from './utils/validate'
  8. import useUserStore from './stores/modules/user'
  9. import { INDEX_ROUTE, INDEX_ROUTE_NAME } from './router/routes'
  10. import { PageEnum } from './enums/pageEnum'
  11. import useTabsStore from './stores/modules/multipleTabs'
  12. import { clearAuthInfo } from './utils/auth'
  13. import config from './config'
  14. // NProgress配置
  15. NProgress.configure({ showSpinner: false })
  16. const loginPath = PageEnum.LOGIN
  17. const defaultPath = PageEnum.INDEX
  18. // 免登录白名单
  19. const whiteList: string[] = [PageEnum.LOGIN, PageEnum.ERROR_403]
  20. router.beforeEach(async (to, from, next) => {
  21. // 开始 Progress Bar
  22. NProgress.start()
  23. document.title = to.meta.title ?? config.title
  24. const userStore = useUserStore()
  25. const tabsStore = useTabsStore()
  26. console.warn("***userStore***",userStore.token,to.path)
  27. if (whiteList.includes(to.path)) {
  28. // 在免登录白名单,直接进入
  29. next()
  30. } else if (userStore.token) {
  31. // 获取用户信息
  32. const hasGetUserInfo = Object.keys(userStore.userInfo).length !== 0
  33. if (hasGetUserInfo) {
  34. if (to.path === loginPath) {
  35. next({ path: defaultPath })
  36. } else {
  37. next()
  38. }
  39. } else {
  40. try {
  41. await userStore.getUserInfo()
  42. await userStore.getMenu()
  43. const routes = userStore.routes
  44. // 找到第一个有效路由
  45. const routeName = findFirstValidRoute(routes)
  46. // 没有有效路由跳转到403页面
  47. if (!routeName) {
  48. clearAuthInfo()
  49. next(PageEnum.ERROR_403)
  50. return
  51. }
  52. tabsStore.setRouteName(routeName!)
  53. INDEX_ROUTE.redirect = { name: routeName }
  54. // 动态添加index路由
  55. router.addRoute(INDEX_ROUTE)
  56. routes.forEach((route: any) => {
  57. // https 则不插入
  58. if (isExternal(route.path)) {
  59. return
  60. }
  61. if (!route.children) {
  62. router.addRoute(INDEX_ROUTE_NAME, route)
  63. return
  64. }
  65. // 动态添加可访问路由表
  66. router.addRoute(route)
  67. })
  68. console.warn("***userStore1***",to.path)
  69. next({ ...to, replace: true })
  70. } catch (err) {
  71. console.warn("***userStore2***",err)
  72. clearAuthInfo()
  73. next(PageEnum.ERROR_403)
  74. // window.close();
  75. // next({ path: loginPath, query: { redirect: to.fullPath } })
  76. }
  77. }
  78. } else {
  79. console.warn("***userStore-没有token***")
  80. next(PageEnum.ERROR_403)
  81. // next({ path: loginPath, query: { redirect: to.fullPath } })
  82. }
  83. })
  84. router.afterEach(() => {
  85. NProgress.done()
  86. })