ZBLOG

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-ti...

这段代码是一个 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=17865

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?