permission.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import router from './router'
  2. import store from './store'
  3. import { Message } from 'element-ui'
  4. import NProgress from 'nprogress'
  5. import 'nprogress/nprogress.css'
  6. import { getToken } from '@/utils/auth'
  7. import getPageTitle from '@/utils/get-page-title'
  8. NProgress.configure({ showSpinner: false })
  9. const whiteList = ['/login', '/auth-redirect']
  10. router.beforeEach(async(to, from, next) => {
  11. NProgress.start()
  12. document.title = getPageTitle(to.meta.title)
  13. // 关键修改1:对 getToken() 返回值判空,避免 null 后续被操作
  14. const hasToken = getToken() || ''
  15. if (hasToken) {
  16. if (to.path === '/login') {
  17. next({ path: '/' })
  18. NProgress.done()
  19. } else {
  20. // 关键修改2:对 roles 判空,避免 null 调用 length
  21. const hasRoles = Array.isArray(store.getters.roles) && store.getters.roles.length > 0
  22. if (hasRoles) {
  23. next()
  24. } else {
  25. try {
  26. // 关键修改3:解构时给 roles 赋默认值,避免返回 null
  27. const { roles = [] } = await store.dispatch('user/getInfo')
  28. // 关键修改4:确保 roles 是数组再传入
  29. const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
  30. // 关键修改5:对 accessRoutes 判空,避免 addRoutes 传入 null/undefined
  31. if (Array.isArray(accessRoutes) && accessRoutes.length) {
  32. router.addRoutes(accessRoutes)
  33. }
  34. next({ ...to, replace: true })
  35. } catch (error) {
  36. await store.dispatch('user/resetToken')
  37. Message.error(error || 'Has Error')
  38. next(`/login?redirect=${to.path}`)
  39. NProgress.done()
  40. }
  41. }
  42. }
  43. } else {
  44. if (whiteList.indexOf(to.path) !== -1) {
  45. try {
  46. const loginForm = {
  47. username: 'admin',
  48. password: '123456'
  49. }
  50. // 关键修改6:登录后再次校验 token,避免返回 null
  51. await store.dispatch('user/login', loginForm)
  52. const newToken = getToken()
  53. if (!newToken) {
  54. throw new Error('登录失败:未获取到 token')
  55. }
  56. const redirect = to.query.redirect || '/'
  57. const otherQuery = { ...to.query }
  58. delete otherQuery.redirect
  59. next({ path: redirect, query: otherQuery, replace: true })
  60. } catch (error) {
  61. Message.error(error.message || '登录失败,请重试')
  62. next()
  63. } finally {
  64. NProgress.done()
  65. }
  66. } else {
  67. next(`/login?redirect=${to.path}`)
  68. NProgress.done()
  69. }
  70. }
  71. })
  72. router.afterEach(() => {
  73. NProgress.done()
  74. })