Vue后台管理系统权限动态路由,根据不同用户渲染不同的路由

Vue后台管理系统权限动态路由

该项目搭建的框架使用的是vue+ant-pro,这里说一下大概思路和流程
**1.首先路由的地方应该分为两块,一块是不需要权限就可以直接登录看到的(看具体需求,也可以一快),一块是需要动态加载的路由信息集合
在这里插入图片描述
**
动态路由里面的meta属性里面需要一个字段用来放权限(和登录是后台返回的权限key一样)
在这里插入图片描述
然后的思路是登录的时候后台会根据这个账号返回他对应的权限信息,返回权限路由/或者权限key然后拿到这一组权限id和我们的动态路由去做筛选,赛选出对应的路由,然后把这路由添加到vue里面

1.建立一个js(这个js需要放到main.js进行引入)
permission.js
在这里插入图片描述
获取用户信息的函数:
在这里插入图片描述

在钩子函数里面
在这里插入图片描述

**处理函数方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后只需要把过滤好的路由信息放入vue里面
在这里插入图片描述


可拷贝的代码块:👇


permission.js 钩子函数里面代码

router.beforeEach((to, from, next) => {
  NProgress.start() // start progress bar
  to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title} - ${domTitle}`))
  if (Vue.ls.get(ACCESS_TOKEN)) {
    /* has token */
    if (to.path === '/user/login') {
      next({ path: defaultRoutePath })
      NProgress.done()
    } else {
      if (store.getters.roles.length === 0) {
        store
          .dispatch('GetInfo')
          .then(res => {
            console.log(res,'获取用户信息')
            const roles = res.result && res.result.role
            // 进行过滤筛选
            store.dispatch('GenerateRoutes', { roles }).then(() => {
              // 根据roles权限生成可访问的路由表
              // 动态添加可访问路由表
              console.log(roles,'roles')//权限路由permissionList包含key
              console.log(store,'store.getter.addrouter')
              console.log(store.getters.addRouters,'store.getter.addrouter')
              router.addRoutes(store.getters.addRouters)
              // 请求带有 redirect 重定向时,登录自动重定向到该地址
              const redirect = decodeURIComponent(from.query.redirect || to.path)
              if (to.path === redirect) {
                // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
                next({ ...to, replace: true })
              } else {
                // 跳转到目的路由
                next({ path: redirect })
              }
            })
          })
          .catch(() => {
            notification.error({
              message: '错误',
              description: '请求用户信息失败,请重试'
            })
            store.dispatch('Logout').then(() => {
              next({ path: '/user/login', query: { redirect: to.fullPath } })
            })
          })
      } else {
        next()
      }
    }
  } else {
    if (whiteList.includes(to.name)) {
      // 在免登录白名单,直接进入
      next()
    } else {
      next({ path: '/user/login', query: { redirect: to.fullPath } })
      NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
    }
  }
})

获取用户信息代码块

 // 获取用户信息
    GetInfo({ commit }) {
      return new Promise((resolve, reject) => {
        getInfo().then(response => {
          const result = response.result
console.log(result,'result')
          if (result.role && result.role.permissions.length > 0) {
            const role = result.role
            role.permissions = result.role.permissions
            role.permissions.map(per => {
              if (per.actionEntitySet != null && per.actionEntitySet.length > 0) {
                const action = per.actionEntitySet.map(action => { return action.action })
                per.actionList = action
              }
            })
            role.permissionList = role.permissions.map(permission => { return permission.permissionId })
            //role.permissionList.push('myviews')
            commit('SET_ROLES', result.role)
            commit('SET_INFO', result)
          } else {
            reject(new Error('getInfo: roles must be a non-null array!'))
          }
          commit('SET_NAME', { name: result.name, welcome: welcome() })
          commit('SET_AVATAR', result.avatar)

          resolve(response)
        }).catch(error => {
          reject(error)
        })
      })
    },

vuex里面的过滤操作代码块

 GenerateRoutes ({ commit }, data) {//data为permission.js传过来的roles
      console.log(data,'筛选函数')
      return new Promise(resolve => {
        const { roles } = data
        console.log(data) 
        console.log('data')
        const accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
        commit('SET_ROUTERS', accessedRouters)
        resolve()
      })
    }
  }



// 过滤函数
function filterAsyncRouter (routerMap, roles) {
  const accessedRouters = routerMap.filter(route => {
    if (hasPermission(roles.permissionList, route)) {
      if (route.children && route.children.length) {
        route.children = filterAsyncRouter(route.children, roles)
      }
      return true
    }
    return false
  })
  return accessedRouters
}




function hasPermission (permission, route) {
  if (route.meta && route.meta.permission) {
    let flag = false
    for (let i = 0, len = permission.length; i < len; i++) {
      flag = route.meta.permission.includes(permission[i])
      if (flag) {
        return true
      }
    }
    return false
  }
  return true
}

**

上述代码自行复制可以按照自己项目中的逻辑需求进行更改。有兴趣的可以去了解Ant

**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值