VUE路由权限动态控制

该博客详细介绍了在 Vue 项目中实现路由权限控制的步骤,包括修改全局 `permission.js`、`user.js` 和 `permission.js` 文件。在 `permission.js` 中获取用户信息并动态添加可访问路由,`user.js` 中定义获取用户信息的方法,`permission.js` 中处理权限过滤。通过这些修改,实现了根据用户角色动态生成并过滤路由的权限管理功能。
摘要由CSDN通过智能技术生成

全局permission.js修改

        try {
          // 拿到用户信息
          // 权限配置参数必须为一个数组
          const { perms } = await store.dispatch('user/getInfo')
          
         // generateRoutes取自src/store/perission.js 文件中
          const accessRoutes = await store.dispatch('permission/generateRoutes', perms)

          // 动态添加可访问的路由
          router.addRoutes(accessRoutes)
          
	    	//hack方法以确保addRoutes是完整的
			//设置replace:true,这样导航将不会留下历史记录
          next({ ...to, replace: true })
        } catch (error) {
          // 清空token,跳转登录页面,报出错误
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          next(`/login?redirect=${to.path}`)
          //  完成进度(进度条消失)
          NProgress.done()
        }

src/store/modules/user.js修改

//  拿到用户信息具体方法
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(response => {
        const { data } = response.data
        if (!data) {
          reject('Verification failed, please Login again.')
        }

        const { roles, permissions, user, perms} = data

        // roles must be a non-empty array
        if (!roles || roles.length <= 0) {
          reject('getInfo: roles must be a non-null array!')
        }

        commit('SET_PERMS', perms)
        // commit('SET_AVATAR', user.avatar)
        commit('SET_ROLES', roles)
        commit('SET_PERMISSIONS', permissions)
        commit('SET_USER', user)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },

src/store/modules/perission.js修改

function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {

    // return roles.some(role => route.meta.roles.includes(role))
    return roles.includes(route.meta.roles)
  } else {
    return true
  }
}
 
/**
 * 后台查询的菜单数据拼装成路由格式的数据
 * @param routes
 */
export function generaMenu(routes, data) {
  data.forEach(item => {
    // alert(JSON.stringify(item))
    const menu = {
      path: item.path === '#' ? item.id + '_key' : item.path,
      component: item.component === '#' ? Layout : () => import(`@/views${item.component}`),
      hidden: item.hidden,
      redirect: item.redirect,
      children: [],
      name: 'menu_' + item.id,
      meta: item.meta
      // meta: { title: item.name, id: item.id, roles: ['admin'] }
    }

    if (item.children) {
      generaMenu(menu.children, item.children)
    }
    routes.push(menu)
  })
}
 
/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, perms) {
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(perms, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, perms)
      }
      res.push(tmp)
    }
  })
  return res
}
 
const state = {
  routes: [],
  addRoutes: []
}
 
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}
 
const actions = {
  generateRoutes({commit}, data) {
    return new Promise(resolve => {
      console.log(data);
      const perms = data;
      let accessedRoutes;
      accessedRoutes = filterAsyncRoutes(asyncRoutes, perms);
      // accessedRoutes = accessedRoutes.filter(routes => !routes.children || routes.children.length !== 0)
      commit('SET_ROUTES', accessedRoutes);
      console.log(accessedRoutes);
      resolve(accessedRoutes)
    })
  }
}
 
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值