前端框架 admin vue权限设置

核心代码:

const whistlist=["/login"]
router.beforeEach(async(to,from,next)=>{
    NProgress.start()
    const hastoken=getToken() //从cookie中获取token
    if(hastoken){  //如果有token
        if (to.path === '/login') {
            // if is logged in, redirect to the home page
            next({ path: '/' })
            NProgress.done()
           }else{
            if(store.getters.roles && store.getters.roles.length > 0){//如果权限roles不空
               next()
                }else{  //如果为空   我们去获取用户信息和身份                    
                     let roles_
                     await store.dispatch("get_userinfo").then((roles)=>{// 获取到当前用户的身份 
                        roles_=roles
                     })
                     // 然后拿着身份去筛选路由
                     let accessRoutes
                     await store.dispatch("generateRoutes",roles_).then((result)=>{
                          accessRoutes=result
                     })             
                     router.addRoutes(accessRoutes)
                    // router.options.routes.push(accessRoutes)
                     //next()                 
                    next({ ...to, replace: true })        
                }

            }
   
    }else{// 如果没有token
         
        if(whistlist.indexOf(to.path)!==(-1)){  //如果在白名单中 允许   
            next()  
        }else{
            next("/login")
            NProgress.done()
        }

    }
})

roles是储存用户身份的数组 表示你是管理员 还是超级管理员
generateRoutes是拿着身份去过滤异步的路由 然后返回结果 和原来的路由合并
generateRoutes的函数如下

   generateRoutes(context,roles_){
         let result
          return new Promise((resolve,reject)=>{
              if(roles_==="admin"){//如果是超级管理员 就获取所有的异步路由
                  result=syncrouter
          
              }else{

                result=filter_router(syncrouter,roles_)
              }
              context.commit("SET_ROUTE",result)
              resolve(result)
          })
     }

其中的filter_router是关键 是递归过滤路由 代码如下 syncrouter是我们定义好的异步路由

export function filter_router(syncrouter,roles_){
      let result=[] 
        syncrouter.forEach((value)=>{
        if(value.meta.roles.indexOf(roles_)!==(-1)){ // 如果包含权限
            if(value.children){
                value.children=filter_router(value.children,roles_)
            }
            result.push(value)
          }
       })
      return result
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值