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() })