第一种

前端将公共部分的路由直接写在前端代码中,其余部分前端开发完成后,将对应路由复制一份给后端根据权限匹配存储在数据库中,用户登录时,从后端数据库中根据用户权限读取对应路由返回给前端,再添加到前端路由中动态渲染上。 这样操作,需要前后端密切配合,而且页面中的操作级权限不能控制;

第二种

在路由的meta属性中增加 roles字段,用来存储可访问当前路由的权限,在路由全局守卫router.beforeEach中进行拦截处理

//路由信息
routes: [
    {
        path: '/login',
        name: 'login',
        meta: {
            roles: ['admin', 'user']
        },
        component: () => import('../components/Login.vue')
    },
    {
        path: 'home',
        name: 'home',
        meta: {
            roles: ['admin']
        },
        component: () => import('../views/Home.vue')
    },
]

//页面控制
//假设角色有两种:admin 和 user
//这里是从后台获取的用户角色
const role = 'user'
//在进入一个页面前会触发 router.beforeEach 事件
router.beforeEach((to, from, next) => {
    if (to.meta.roles.includes(role)) {
        next()
    } else {
        next({path: '/404'})
    }
})

第三种

//定义指令
// 获取用户角色, 接口返回或者cookie中获取
function getRole() {
  return 'admin'
}
 
// 注册一个全局自定义指令 `v-role`
Vue.directive('role', {
  inserted: (el, binding, vnode) => {
    // 从自定义指令中获取当前指令允许的权限
    let roles = binding.value;
 
    // 获取当前用户权限
    let role = getRole();
 
    // 如果没有权限就移除此节点
    if (!roles.includes(role)) {
      el.parentNode.removeChild(el);
    }
  }
})

//使用示例
<template>
  <div>
    <div v-role="['user', 'admin', 'superAdmin']">user</div>
    <div v-role="['admin', 'superAdmin']">admin</div>
    <div v-role="['superAdmin']">superAdmin</div>
  </div>
</template>
 
Last Updated:
Contributors: pengrengui