zoukankan      html  css  js  c++  java
  • Vue登录权限控制-路由守卫

    //NProgress进度条样式,import引入
    //import NProgress from 'nprogress'
    //import 'nprogress/nprogress.css'
    // NProgress Configuration 是否有转圈效果
    //NProgress.configure({ showSpinner: false })  
    
    const AUTH_WHITE_LIST = ['/login', '/401']   //白名单路由
    // 路由处理--登录验证
    router.beforeEach(async(to, from, next) => {
      // 开始进度条
      NProgress.start()
    
      // 设置页面标题
      if (to.matched.length !== 0) {
        document.title = '页面标题' + (to.meta.title === undefined ? '' : ' - ' + to.meta.title)
      }
      // 判断是否登录时,因为页面刷新后内存中还没有token信息,额外从session中判断一次
      if (!AuthUtils.isLogin()) {
        const sessionStore = SessionStorageUtils.getStore()
        store.replaceState(Object.assign({}, store.state, sessionStore))
      }
    
      if (AuthUtils.isLogin()) {
        // 已经登录的,不能跳到登陆页面,跳到首页
        if (to.path === '/login') {
          next({ path: '/' })
          NProgress.done()
        } else {
          if (to.matched.length === 0) { // to.matched.length代表是否匹配到当前要跳转的路由
            next('/404')// 未知页面调错误页
            NProgress.done()
          } else if (to.meta && !AuthUtils.hasAuth(to.meta.auth)) { // 需要验证当前路由否有权限,没有跳404,有就继续走
            next('/404')// 无权限跳404
            NProgress.done()
          } else {
            next()
            NProgress.done()
          }
        }
      } else {
        if (AUTH_WHITE_LIST.indexOf(to.path) !== -1) {  //在白名单中就继续正常走
          next()
        } else if (to.matched.length === 0) {
          next('/401')// 未知页面调错误也
        } else {
          // 没有登陆,不在白名单里,重定向到登陆页
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    })
    
    router.afterEach(() => {   //跳转完成,进度条结束
      // 完成进度条
      NProgress.done()
    })
    

    关键字解释:

    • to.match---》to.matched数组,该数组中保存着匹配到的所有路由信息-------->用to.matched而不直接用to.meta  是因为前者只需要给较高一级的路由添加Auth(权限)即可,其下的所有子路由不必添加。
    • replaceState---》修改了对应的store历史记录,更新store

    Object.assign()

    1. Object.assign()----》将所有可枚举属性的值从一个或多个源对象复制到目标对象,然后返回目标对象
    2. Object.assign()---》是ES6新添加的接口,主要的用途是用来合并多个JavaScript的对象。
    3. Object.assign()-----》接口可以接收多个参数,第一个参数是目标对象,后面的都是源对象,assign方法将多个原对象的属性和方法都合并到了目标对象上面,如果在这个过程中出现同名的属性(方法),后合并的属性(方法)会覆盖之前的同名属性(方法)。
  • 相关阅读:
    时隔 4 年!ElasticJob 3.0.0 发布,王者归来。。
    Git 代码防丢指南,再也不怕丢失代码了!
    排查线上问题必须掌握的 6 个 Linux 命令!
    Leaflet添加图片图层:ImageOverlay
    js图片数据流
    arcgis查找与要素相交的内容 by 空间连接查询
    Leaflet添加图片图层:使用Axios请求arcgis server rest api的exportmap,获取图片并进行显示
    esri-leaflet: unique value renderer唯一值渲染-dynamiclayers参数
    arcgis server缓存切片
    城市给排水法律法规
  • 原文地址:https://www.cnblogs.com/yxkNotes/p/11597505.html
Copyright © 2011-2022 走看看