碎碎念:路由原理逻辑图

该篇博客详细阐述了在Vue.js应用中如何利用beforeEach全局守卫进行路由权限管理。包括启动加载进度条、设置页面标题、从Cookie获取Token、判断Token存在与否、动态加载用户角色及权限路由,并在权限不足时进行重定向。此外,还介绍了白名单机制,当访问路径在白名单内时允许直接访问,否则重定向至登录页面。
摘要由CSDN通过智能技术生成

路由原理逻辑

Code

  • beforeEach 全局守卫
router.beforeEach(async(to, from, next) => {
  // 启动进度条
  NProgress.start()
  // 设置页面标题
  document.title = getPageTitle(to.meta.title)
  // 从Cookie 获取Token
  const hasToken = getToken()
  // 判断 Token 是否存在
  if (hasToken) {
    // 如果当前路径为login则 直接重定向至首页
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
    } else {
      // 判断用户的角色 是否存在
      const hasRoles = store.getters.roles && store.getters.roles.length > 0
      // 如果用户角色存在,则直接访问
      if (hasRoles) {
        next()
      } else {
        try {
          // 异步获取用户的角色(dispatch异步)
          // 注意:角色必须是对象数组!例如:['admin']或,['developer','editor']
          const { roles } = await store.dispatch('user/getInfo')
          // 根据用户角色,动态生成路由
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          // 调用 router.addRoutes 动态添加路由
          router.addRoutes(accessRoutes)
          // 使用replace访问路由,不会在history留下记录
          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 {
    // 如果访问的url在白名单中,则直接访问
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      // 如果访问的url不在白名单中,则直接重定向到登陆页面,并将访问的url添加到redirect参数中
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})
router.afterEach(() => {
  // 停止进度条
  NProgress.done()
})

路由原理逻辑图

  • 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值