vue 全局路由守卫

vue 项目中经常用到全局守卫,判断是否有token,页面白名单等功能开发,

//注册全局守卫,作用是路由跳转前对路由进行判断,防止未登陆的用户跳转到其他页面去

import NProgress from 'nprogress' // 进度条
import 'nprogress/nprogress.css'
import store from '@/store'
// 在守卫中引入token
import { getQueryString } from '@/utils'
import { getToken, setToken } from '@/utils/auth'
// import { setToken, getToken } from '@/utils/auth'
// 路由白名单
const whiteList = [
  '/login'
  // '/home',
  // '/toLogin',

] // no redirect whitelist

export default router => {
  // 导航守卫,首先获取token,如果有token则判断路由是不是==login,如果在则放行,如果!==login,看看判断Vuex获取用户信息id,如果id为空则获取用户信息,如果id不为空则直接放行,
  // 如果没有token,则判断该路由是不是在白名单内,如果不在则回登录页面。如果在白名单内则直接放行。
  router.beforeEach((to, from, next) => {
    // 显示进度条
    NProgress.start()
    // console.log('路由跳转打印:', to.path)
    // 获取token
    const hasToken = getToken()

    const tempToken = getQueryString('token')
    console.log(tempToken)

    if (to.path === '/home/detail' && tempToken && tempToken.length > 0) {
    
      setToken(tempToken)
      store.dispatch('getInfo').then(() => {
        next()
      })
    } else if (hasToken) {
      // debugger
      // console.log(to.path)
      // 如果在登录页
      if (to.path === '/login') {
        next({ path: '/' })
        // 进度条完成
        NProgress.done()
      } else {
        // 如果不在登录页,判断vueX中的用户id是否为空
     
        if (store.getters.id === null) {
          const data1 = JSON.parse(localStorage.getItem('data'))

          if (data1) {
            store.commit('SET_TOKEN', data1.token)
            store.commit('SET_MOBILE', data1.mobile)
            store.commit('SET_USER_NAME', data1.nickname)
            store.commit('SET_JOBNUMBER', data1.jobNumber)
            store.commit('SET_ID', data1.id)
            store.commit('SET_AVATAR', JSON.parse(sessionStorage.getItem('avatar')))
          }
          // console.log(data1)
          // 如果为空则
          // debugger
          // await store.dispatch('getInfo')
          // next({ …to, replace: true })中的replace: true只是一个设置信息,告诉VUE本次操作后,不能通过浏览器后退按钮,返回前一个路由。
          // 因此next({ …to, replace: true })可以写成next({ …to }),不过你应该不希望用户在addRoutes()还没有完成的时候,可以点击浏览器回退按钮搞事情吧。
          // next({ ...to, replace: true })
          // next({ path: '/' })
          next()
        } else {
          // 如果不为空则放行
          next()
        }
      }
    } else {
      /* has no token*/
      if (whiteList.indexOf(to.path) !== -1) {
        // 如果在白名单内则直接放
        // in the free login whitelist, go directly
        next()
      } else {
        // 没有token,也不在白名单内则回登录页面
        // console.log(3)
        next(`/login?redirect=${to.path}`)
        // next(`/login`)
        // next()
        NProgress.done()
      }
    }
  })
  router.afterEach((to, from) => {
    NProgress.done()
  })
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值