permission.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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, getShopId } from './utils/auth'
  13. import config from './config'
  14. // NProgress配置
  15. NProgress.configure({ showSpinner: false })
  16. var shopId = getShopId();
  17. const loginPath = PageEnum.LOGIN
  18. const defaultPath = PageEnum.INDEX
  19. // 免登录白名单
  20. const whiteList: string[] = [PageEnum.LOGIN, PageEnum.ERROR_403]
  21. // 检测店铺ID变化并刷新页面的函数
  22. function checkShopIdChange() {
  23. const currentShopId = getShopId();
  24. if (shopId !== currentShopId && currentShopId && shopId) {
  25. console.log('检测到店铺ID变化:', shopId, '->', currentShopId);
  26. shopId = currentShopId;
  27. // 刷新页面以更新数据
  28. window.location.reload();
  29. return true;
  30. }
  31. return false;
  32. }
  33. router.beforeEach(async (to, from, next) => {
  34. // 开始 Progress Bar
  35. NProgress.start()
  36. // 检测店铺ID变化
  37. if (checkShopIdChange()) {
  38. return; // 如果检测到变化并刷新页面,直接返回
  39. }
  40. document.title = to.meta.title ?? config.title
  41. const userStore = useUserStore()
  42. const tabsStore = useTabsStore()
  43. console.warn("***userStore***",shopId,userStore.token,to.path)
  44. if (whiteList.includes(to.path)) {
  45. // 在免登录白名单,直接进入
  46. next()
  47. } else if (userStore.token) {
  48. // 获取用户信息
  49. const hasGetUserInfo = Object.keys(userStore.userInfo).length !== 0
  50. if (hasGetUserInfo) {
  51. if (to.path === loginPath) {
  52. next({ path: defaultPath })
  53. } else {
  54. next()
  55. }
  56. } else {
  57. try {
  58. await userStore.getUserInfo()
  59. await userStore.getMenu()
  60. const routes = userStore.routes
  61. // 找到第一个有效路由
  62. const routeName = findFirstValidRoute(routes)
  63. // 没有有效路由跳转到403页面
  64. if (!routeName) {
  65. clearAuthInfo()
  66. next(PageEnum.LOGIN)
  67. return
  68. }
  69. tabsStore.setRouteName(routeName!)
  70. INDEX_ROUTE.redirect = { name: routeName }
  71. // 动态添加index路由
  72. router.addRoute(INDEX_ROUTE)
  73. routes.forEach((route: any) => {
  74. // https 则不插入
  75. if (isExternal(route.path)) {
  76. return
  77. }
  78. if (!route.children) {
  79. router.addRoute(INDEX_ROUTE_NAME, route)
  80. return
  81. }
  82. // 动态添加可访问路由表
  83. router.addRoute(route)
  84. })
  85. console.warn("***userStore1***",to.path)
  86. next({ ...to, replace: true })
  87. } catch (err) {
  88. console.warn("***userStore2***",err)
  89. clearAuthInfo()
  90. next(PageEnum.ERROR_403)
  91. // window.close();
  92. // next({ path: loginPath, query: { redirect: to.fullPath } })
  93. }
  94. }
  95. } else {
  96. console.warn("***userStore-没有token***")
  97. // next(PageEnum.ERROR_403)
  98. next({ path: loginPath, query: { redirect: to.fullPath } })
  99. }
  100. })
  101. router.afterEach(() => {
  102. NProgress.done()
  103. })