| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import router from './router'
- import store from './store'
- import { Message } from 'element-ui'
- import NProgress from 'nprogress'
- import 'nprogress/nprogress.css'
- import { getToken } from '@/utils/auth'
- import getPageTitle from '@/utils/get-page-title'
- NProgress.configure({ showSpinner: false })
- const whiteList = ['/login', '/auth-redirect']
- router.beforeEach(async(to, from, next) => {
- NProgress.start()
- document.title = getPageTitle(to.meta.title)
- // 关键修改1:对 getToken() 返回值判空,避免 null 后续被操作
- const hasToken = getToken() || ''
- if (hasToken) {
- if (to.path === '/login') {
- next({ path: '/' })
- NProgress.done()
- } else {
- // 关键修改2:对 roles 判空,避免 null 调用 length
- const hasRoles = Array.isArray(store.getters.roles) && store.getters.roles.length > 0
- if (hasRoles) {
- next()
- } else {
- try {
- // 关键修改3:解构时给 roles 赋默认值,避免返回 null
- const { roles = [] } = await store.dispatch('user/getInfo')
- // 关键修改4:确保 roles 是数组再传入
- const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
- // 关键修改5:对 accessRoutes 判空,避免 addRoutes 传入 null/undefined
- if (Array.isArray(accessRoutes) && accessRoutes.length) {
- router.addRoutes(accessRoutes)
- }
- next({ ...to, replace: true })
- } catch (error) {
- await store.dispatch('user/resetToken')
- Message.error(error || 'Has Error')
- next(`/login?redirect=${to.path}`)
- NProgress.done()
- }
- }
- }
- } else {
- if (whiteList.indexOf(to.path) !== -1) {
- try {
- const loginForm = {
- username: 'admin',
- password: '123456'
- }
- // 关键修改6:登录后再次校验 token,避免返回 null
- await store.dispatch('user/login', loginForm)
- const newToken = getToken()
- if (!newToken) {
- throw new Error('登录失败:未获取到 token')
- }
- const redirect = to.query.redirect || '/'
- const otherQuery = { ...to.query }
- delete otherQuery.redirect
- next({ path: redirect, query: otherQuery, replace: true })
- } catch (error) {
- Message.error(error.message || '登录失败,请重试')
- next()
- } finally {
- NProgress.done()
- }
- } else {
- next(`/login?redirect=${to.path}`)
- NProgress.done()
- }
- }
- })
- router.afterEach(() => {
- NProgress.done()
- })
|