本篇内容介绍了“vue权限控制与管理的实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、 菜单权限菜单权限:控制用户在系统中能够看到哪些菜单项
菜单权限指的就是后台系统中的左侧的菜单栏,前端可以根据后端接口返回的权限数据结合element-ui菜单组件循环拼接而成即可,有什么权限就展示什么菜单
通过vuex+持久化插件(本地存储)解决刷新页面菜单栏不显示问题
实现退出登录功能时,通过clear()
方法清除本地数据,跳转后通过window.location.reload()
刷新当前页面,可实现清除vuex数据的操作
菜单权限:控制用户在系统中能够看到哪些菜单项
菜单权限指的就是后台系统中的左侧的菜单栏,前端可以根据后端接口返回的权限数据结合element-ui菜单组件循环拼接而成即可,有什么权限就展示什么菜单
通过vuex+持久化插件(本地存储)解决刷新页面菜单栏不显示问题
实现退出登录功能时,通过clear()
方法清除本地数据,跳转后通过window.location.reload()
刷新当前页面,可实现清除vuex数据的操作
二、 路由权限路由权限为了防止用户恶意通过在地址栏输入地址发生强行跳转,可以通过动态路由对用户权限做出相关限制,有权限则跳转,无权限则跳转404页面
路由权限的方法需要在两个时机调用initDynamicRoutes
,分别是登录成功时和页面创建时,否则动态路由为默认值,刷新无法访问
import Vue from 'vue'import VueRouter from 'vue-router'import Layout from '@/layout'import store from '@/store'Vue.use(VueRouter)// 动态路由规则const tableRule = { path: '/table', name: 'table', component: () => import('@/views/table/index.vue')}const imageRule = { path: '/image', name: 'image', component: () => import('@/views/image')}const userRule = { path: '/users', name: 'users', component: () => import('@/views/users')}// 路由规则和字符串的映射关系const ruleMapping = { table: tableRule, users: userRule, image: imageRule}//静态路由const routes = [ { path: '/login', // name: 'login', // 这里如果有name 控制台会提示 component: () => import('@/views/login') }, { path: '/', component: Layout, children: [ { path: '', // name: 'home', component: () => import('@/views/home') }, { path: '/chart', component: () => import('@/views/chart') } ] }]const router = new VueRouter({ routes})//路由权限:用户登录后接口返回,存储到本地缓存const rightList = [ { id: 1, authName: "基本页面", icon: "el-icon-connection", children: [ { id: 11, authName: "表格页面", icon: "el-icon-s-grid", path: "table", rights: ["view", "edit", "add", "delete"] }, { id: 12, authName: "素材页面", icon: "el-icon-s-marketing", path: "image", rights: ["view", "edit", "add", "delete"] } ] }, { id: 2, authName: "用户权限", icon: "el-icon-set-up", children: [ { id: 21, authName: "权限页面", icon: "el-icon-s-custom", path: "users", rights: ["view", "edit", "add", "delete"] } ] }];//在登录(login.vue)、页面刷新(App.vue)的时候,调用initDynamicRoutesexport function initDynamicRoutes () { // 根据二级权限 对路由规则进行动态的添加 const currentRoutes = router.options.routes rightList.forEach(item => { // 如果是没有子路由的话 就直接添加进去 如果有子路由的话就进入二级权限遍历 if (item.path) { const temp = ruleMapping[item.path] // 路由规则中添加元数据meta temp.meta = item.rights currentRoutes[1].children.push(temp) } item.children.forEach(item => { // item 二级权限 const temp = ruleMapping[item.path] // 路由规则中添加元数据meta,用于按钮权限控制 temp.meta = item.rights currentRoutes[1].children.push(temp) }) }) // 添加路由规则 router.addRoutes(currentRoutes)}export default router
路由权限为了防止用户恶意通过在地址栏输入地址发生强行跳转,可以通过动态路由对用户权限做出相关限制,有权限则跳转,无权限则跳转404页面
路由权限的方法需要在两个时机调用initDynamicRoutes
,分别是登录成功时和页面创建时,否则动态路由为默认值,刷新无法访问
import Vue from 'vue'import VueRouter from 'vue-router'import Layout from '@/layout'import store from '@/store'Vue.use(VueRouter)// 动态路由规则const tableRule = { path: '/table', name: 'table', component: () => import('@/views/table/index.vue')}const imageRule = { path: '/image', name: 'image', component: () => import('@/views/image')}const userRule = { path: '/users', name: 'users', component: () => import('@/views/users')}// 路由规则和字符串的映射关系const ruleMapping = { table: tableRule, users: userRule, image: imageRule}//静态路由const routes = [ { path: '/login', // name: 'login', // 这里如果有name 控制台会提示 component: () => import('@/views/login') }, { path: '/', component: Layout, children: [ { path: '', // name: 'home', component: () => import('@/views/home') }, { path: '/chart', component: () => import('@/views/chart') } ] }]const router = new VueRouter({ routes})//路由权限:用户登录后接口返回,存储到本地缓存const rightList = [ { id: 1, authName: "基本页面", icon: "el-icon-connection", children: [ { id: 11, authName: "表格页面", icon: "el-icon-s-grid", path: "table", rights: ["view", "edit", "add", "delete"] }, { id: 12, authName: "素材页面", icon: "el-icon-s-marketing", path: "image", rights: ["view", "edit", "add", "delete"] } ] }, { id: 2, authName: "用户权限", icon: "el-icon-set-up", children: [ { id: 21, authName: "权限页面", icon: "el-icon-s-custom", path: "users", rights: ["view", "edit", "add", "delete"] } ] }];//在登录(login.vue)、页面刷新(App.vue)的时候,调用initDynamicRoutesexport function initDynamicRoutes () { // 根据二级权限 对路由规则进行动态的添加 const currentRoutes = router.options.routes rightList.forEach(item => { // 如果是没有子路由的话 就直接添加进去 如果有子路由的话就进入二级权限遍历 if (item.path) { const temp = ruleMapping[item.path] // 路由规则中添加元数据meta temp.meta = item.rights currentRoutes[1].children.push(temp) } item.children.forEach(item => { // item 二级权限 const temp = ruleMapping[item.path] // 路由规则中添加元数据meta,用于按钮权限控制 temp.meta = item.rights currentRoutes[1].children.push(temp) }) }) // 添加路由规则 router.addRoutes(currentRoutes)}export default router
三、 按钮权限所谓的按钮权限是指在某个菜单的界面中,我们需要根据后端返回的该角色当前操作模块中对应的按钮权限数据,展示出可进行操作的按钮,比如删除,修改,增加等按钮.
如果要实现按钮的权限控制,我们需要使用vue的自定义指令去实现: 首先需要创建一个按钮权限控制的指令,我们定义这个指令的名称为: v-permission
在这个指令的内部获取到当前用户的按钮权限(vuex|本地缓存中)数据
在通过binding.value
获取到自定义制定属性值的数据
判断从vuex|本地缓存
中获取到的按钮权限数据是否包含了自定义指令包含的权限
如果不包含,我们在设置el.style.display = “none”
,或者使用el.parentNode.removeChild(el)
删除当前 按钮元素
<el-button v-permission="[$route.path, 'add']">添加</el-button>directives: { // 检测全选的指令 permission: { // 绑定此指令的标签插入到dom节点触发 inserted(el, bind) { // el:绑定该指令标签 // bind:对象格式 当前绑定指令标签上的数据情况 // 获取按钮上的value值,就是用户当前要使用的权限和请求的路由地址 let value = bind.value//['/user','add'] //模拟后端返回的当前角色对应的权限 let rules = { '/menu': ['add', 'edit'], "/user": [ 'edit', 'remove'], "/goods": ['add'] } // 根据访问的路由地址获取该模块的操作权限 let allow = rules[value[0]] // 检测当前操作是否合法 if (!allow.includes(value[1])) { // 不合法隐藏操作按钮 el.style = "display:none" } } } }
所谓的按钮权限是指在某个菜单的界面中,我们需要根据后端返回的该角色当前操作模块中对应的按钮权限数据,展示出可进行操作的按钮,比如删除,修改,增加等按钮.
如果要实现按钮的权限控制,我们需要使用vue的自定义指令去实现: 首先需要创建一个按钮权限控制的指令,我们定义这个指令的名称为:
v-permission
在这个指令的内部获取到当前用户的按钮权限(vuex|本地缓存中)数据
在通过
binding.value
获取到自定义制定属性值的数据
判断从
vuex|本地缓存
中获取到的按钮权限数据是否包含了自定义指令包含的权限
如果不包含,我们在设置
el.style.display = “none”
,或者使用el.parentNode.removeChild(el)
删除当前 按钮元素
<el-button v-permission="[$route.path, 'add']">添加</el-button>directives: { // 检测全选的指令 permission: { // 绑定此指令的标签插入到dom节点触发 inserted(el, bind) { // el:绑定该指令标签 // bind:对象格式 当前绑定指令标签上的数据情况 // 获取按钮上的value值,就是用户当前要使用的权限和请求的路由地址 let value = bind.value//['/user','add'] //模拟后端返回的当前角色对应的权限 let rules = { '/menu': ['add', 'edit'], "/user": [ 'edit', 'remove'], "/goods": ['add'] } // 根据访问的路由地址获取该模块的操作权限 let allow = rules[value[0]] // 检测当前操作是否合法 if (!allow.includes(value[1])) { // 不合法隐藏操作按钮 el.style = "display:none" } } } }
四 、 数据权限数据权限
就是不同的角色用户看到的表格数据是不一样的
比如张三是项目经理就可以看到某一个业务表格中的所有数据和字段信息
李四是普通员工只能看到表格中自己的数据
代码实现: 前端在请求头统一封装,携带用户信息,最后由后端检测该用户权限解析返回对应的数据即可;
import axios from 'axios'import router from '@/router'const request = axios.create()// 映射const actionMapping = { get: 'view', post: 'add', put: 'edit', delete: 'delete'}// request.defaults.baseURL = 'http://127.0.0.1:7001' // 注释掉之后调的接口将是Mock数据// 请求拦截器request.interceptors.request.use(req => { // console.log(req.url) // console.log(req.method) if (req.url !== '/login' && req.url !== '/roles') { // 不是登录的请求 也不是获取权限的请求 则在请求头中加入token 不知道如何使用Mock来验证请求头中的token 故此处注释 // req.headers.Authorization = sessionStorage.getItem('token') const action = actionMapping[req.method] // 判断非权限范围内的请求 // console.log(router) const currentRight = router.currentRoute.meta // console.log(currentRight) if (currentRight && currentRight.indexOf(action) === -1) { // 没有权限 alert('没有权限') return Promise.reject(new Error('没有权限')) } } return req})export default request
数据权限
就是不同的角色用户看到的表格数据是不一样的
比如张三是项目经理就可以看到某一个业务表格中的所有数据和字段信息
李四是普通员工只能看到表格中自己的数据
代码实现: 前端在请求头统一封装,携带用户信息,最后由后端检测该用户权限解析返回对应的数据即可;
import axios from 'axios'import router from '@/router'const request = axios.create()// 映射const actionMapping = { get: 'view', post: 'add', put: 'edit', delete: 'delete'}// request.defaults.baseURL = 'http://127.0.0.1:7001' // 注释掉之后调的接口将是Mock数据// 请求拦截器request.interceptors.request.use(req => { // console.log(req.url) // console.log(req.method) if (req.url !== '/login' && req.url !== '/roles') { // 不是登录的请求 也不是获取权限的请求 则在请求头中加入token 不知道如何使用Mock来验证请求头中的token 故此处注释 // req.headers.Authorization = sessionStorage.getItem('token') const action = actionMapping[req.method] // 判断非权限范围内的请求 // console.log(router) const currentRight = router.currentRoute.meta // console.log(currentRight) if (currentRight && currentRight.indexOf(action) === -1) { // 没有权限 alert('没有权限') return Promise.reject(new Error('没有权限')) } } return req})export default request
“vue权限控制与管理的实现方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!