这段代码是一个 Vue.js 的路由守卫配置。让我逐行解释给你:
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 })
这几行代码分别导入了路由实例 router
、状态管理仓库 store
,以及一些需要的依赖库(如 Element UI、NProgress)。另外还导入了一些工具函数,包括从 @/utils/auth
中获取 token 的函数和从 @/utils/get-page-title
中获取页面标题的函数。最后配置了 NProgress 插件。
const whiteList = ['/login']
定义了一个白名单数组,里面存放不需要进行登录验证的页面路径。
router.beforeEach(async(to, from, next) => {
NProgress.start()
document.title = getPageTitle(to.meta.title)
const hasToken = getToken()
if (hasToken) {
// 已登录
if (to.path === '/login') {
// 如果已经登录并且目标页面是登录页,则重定向到首页
next({ path: '/' })
NProgress.done()
} else {
// 加载菜单
const hasMenus = store.getters.user_menus && store.getters.user_menus.length > 0
if (hasMenus) {
// 如果已经加载过菜单,则直接进入下一个路由
const hasAddRoutes = store.getters.permission_add_routes && store.getters.permission_add_routes.length > 0
if (hasAddRoutes) {
next()
} else {
// 如果没有加载过动态路由,则调用生成路由的 action 进行加载,并添加到路由实例中
const accessRoutes = await store.dispatch('permission/generateRoutes')
router.addRoutes(accessRoutes)
next({ ...to, replace: true })
}
} else {
// 如果还未加载菜单,则先请求用户信息和菜单,然后再进行路由加载
try {
await store.dispatch('user/getInfo')
const accessRoutes = await store.dispatch('permission/generateRoutes')
router.addRoutes(accessRoutes)
next({ ...to, replace: true })
} catch (error) {
// 请求失败则重置 token,显示错误提示,并跳转到登录页
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
}
} else {
// 未登录
if (whiteList.indexOf(to.path) !== -1) {
// 如果目标页面在白名单内,则直接进入下一个路由
next()
} else {
// 否则跳转到登录页,并带上目标路径作为参数,以便登录成功后重定向回来
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
})
router.afterEach(() => {
NProgress.done()
})
这部分代码定义了全局前置守卫和全局后置守卫。在全局前置守卫中,通过 router.beforeEach
方法注册一个函数,在路由切换之前会执行这个函数。
首先使用 NProgress.start()
开始进度条动画,并根据当前页面的 meta 标签设置文档标题。
然后通过 getToken()
函数获取当前用户是否已登录,如果有 token,则认为用户已登录,进入相关逻辑;否则认为用户未登录,执行相应逻辑。
如果用户已登录并且目标页面是登录页,则重定向到首页。如果已经加载过菜单,则直接进入下一个路由;否则请求用户信息和菜单,并生成动态路由配置,然后添加到路由实例中。
如果请求失败,则重置 token、显示错误提示,并跳转到登录页。
如果用户未登录,并且目标页面在白名单内,则直接进入下一个路由;否则跳转到登录页,并带上目标路径作为参数。
在全局后置守卫中,通过 router.afterEach
方法注册一个函数,在每次路由切换完成后执行该函数。其中使用 NProgress.done()
结束进度条动画。
内容由零声教学AI助手提供,问题来源于学员提问