之前写了一篇 《vue 按钮级别权限控制实现》,里面介绍了前端页面对于按钮权限的控制,这一篇来说说前端页面对于菜单权限的控制。

前端菜单权限,就是根据用户的权限不同控制菜单的显示隐藏,不同的场景,实现的方式也有所不同。

一、前端控制路由

前端配置好一套通用路由表一套动态路由表,然后获取用户权限数据,根据权限数据对比动态路由表,生成具有用户权限的新路由表,然后使用 router.addRoutes方法将新路由表动态挂载到 router 上,最后根据路由表渲染菜单。

实现如下:
1、在 route.js 里面配置通用的路由(404,login 等)。

import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
const router = new Router({mode: 'hash',routes:[{path:'/',redirect:'/login'},{path:'/login',name:'login',component: () => import('../view/login')},{path:'/404',name:'404',component: () => import('../view/404')}]
})
export default router;

2、新建一个 routerList.js 文件,里面配置好动态路由表;通过 isShow 字段控制菜单的显示隐藏。

const routerList = [{path:'/',name:'home',component: () => import('../view/index.vue'),meta:{title:'Home'},children:[{path:'menu1',name:'menu1',isShow:true,component: () => import('../view/menu1.vue'),meta:{title:'菜单1',icon:'el-icon-info'}},{path:'menu2',name:'menu2',isShow:true,component: () => import('../view/menu2.vue'),meta:{title:'菜单2',icon:'el-icon-info'}},{path:'menu3',name:'menu3',isShow:true,component: () => import('../view/menu3.vue'),meta:{title:'菜单3',icon:'el-icon-info'}}] }
]

3、获取接口返回权限数据。

//以数组为例
['menu1','menu3']

4、根据这个数组来处理已有的动态路由表,将数组里没有的菜单对应动态路由表里的路由的 isShow 属性值改为 false;生成的新路由表保存到 vuex 和 localStorage 里面。

const routerList = [{path:'/',name:'home',component: () => import('../view/index.vue'),meta:{title:'Home'},children:[{path:'menu1',name:'menu1',isShow:true,component: () => import('../view/menu1.vue'),meta:{title:'菜单1',icon:'el-icon-info'}},{path:'menu2',name:'menu2',isShow:false,component: () => import('../view/menu2.vue'),meta:{title:'菜单2',icon:'el-icon-info'}},{path:'menu3',name:'menu3',isShow:true,component: () => import('../view/menu3.vue'),meta:{title:'菜单3',icon:'el-icon-info'}}]    }
]

4、在 App.vue 文件的 created 生命周期使用 addRouters 方法将通过权限数据处理过的最新路由表加入到 router 里面去。

//处理好数据之后
this.$router.options.routes = routerList;
this.$router.addRoutes(routerList);

5、在路由切换时,通过路由守卫判断当前将要跳转的页面是否有权限,有正常跳转,没有则跳转到 404 页面。

router.beforeEach((to, from, next) => {if (to.path === '/login') {next();} else if (to.path === '/404') {next();} else {let resstr = ['menu1','menu3'];if (resstr != 'null' && resstr != undefined) {let hasPermiss = resstr.find(item => {return item.includes(to.path.split('/')[to.path.split('/').length-1]);})if (hasPermiss) {next();} else {next({path: '/404'});}}}
})

6、在菜单页面,使用 this.$router.options.routers 来获取最新路由对象,通过 v-for 循环渲染菜单栏,isShow 属性值为 false 的菜单不显示。

二、后端控制路由

路由表由后端维护好,通过接口前端拿到数据,然后使用 addRoutes方法添加到 router,最后根据路由表渲染菜单。

实现如下:
1、在 route.js 里面配置通用的路由(404,login 等)。

import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
const router = new Router({mode: 'hash',routes:[{path:'/',redirect:'/login'},{path:'/login',name:'login',component: () => import('../view/login')},{path:'/404',name:'404',component: () => import('../view/404')}]
})
export default router;

2、接口获取动态路由信息(与后端同时约定好数据的格式),这个时候只需要返回该用户有权限的路由表即可。

{    code:200message:'查询成功'success:truedata: {router: [{path: "/",component: "index",name: "home",meta: {title: "Home"},children: [{path: "menu1",name: "menu1",component: "menu1",meta: {title: "菜单1",icon: "el-icon-info"}}]}]}
}

3、这里 component 是一个字符串,需要转换成路径,然后将处理好的数据保存到 vuex 和 localStorage 里面。

 function filterRouter(routers) { // 遍历后台传来的路由字符串,转换为组件对象const accessedRouters = routers.filter(route => {if (route.component) {route.component = _import(route.component)}if (route.children && route.children.length) {route.children = filterRouter(route.children)}return true})return accessedRouters}function _import (file) {return () => import('../views/' + file)
}

4、在 App.vue 文件的 created 生命周期使用 addRoutes方法将通过权限数据处理过的最新路由表加入到 router 里面去。

//处理好数据之后
this.$router.options.routes = routerList;
this.$router.addRoutes(routerList);

5、在菜单页面,使用 this.$router.options.routers 来获取最新路由对象,通过 v-for 循环渲染菜单栏。

建议:处理好的路由表存到 localStorage 里的时候最好加密处理,防止用户通过本地修改。

vue 菜单级别权限控制实现相关推荐

  1. 如何用 Vue 实现前端权限控制

    本文来自作者 雅X共赏 在 GitChat 上分享 「如何用 Vue 实现前端权限控制(路由权限 + 视图权限 + 请求权限)」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 为什么做前端 ...

  2. vue实现角色权限控制

    一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单中的页面是否能被访问 页面中的按钮 ...

  3. SQL Server 2016 行级别权限控制

    背景 假如我们有关键数据存储在一个表里面,比如人员表中包含员工.部门和薪水信息.只允许用户访问各自部门的信息,但是不能访问其他部门.一般我们都是在程序端实现这个功能,而在sqlserver2016以后 ...

  4. vue实现路由权限控制

    我们后管理项目中经常需要对路由权限进行判定,不同的身份可以访问不同的路由. 实现的大体思路很简单,将路由分为基本路由和用户路由,基本路由所有用户均可访问,用户路由是当前用户能够访问的独有的路由. 我们 ...

  5. 方法级别权限控制-基本介绍与JSR250注解使用

    服务器端方法级权限控制 在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制.Spring Security在方法的权限控制上支持三种类型的注解,JSR-250注解.@S ...

  6. Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制

    思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...

  7. vue实现页面权限显示_vue实现菜单权限控制

    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题.当然解决问题的方法无非两种--前端控制和后端控制.我们公司这边的产品迭代速度较快,所以我们是从前端控制路由迭代到后端控制路由.下面我会分别介绍这 ...

  8. shiro 方法级别细粒度权限控制_Shiro的认证和权限控制

    从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别-细粒度 - 页 ...

  9. 3YAdmin-专注通用权限控制与表单的后台管理系统模板

    3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及 ...

最新文章

  1. 深度学习--TensorFlow(8)CNN卷积神经网络理论(计算机视觉)
  2. 这可能是 π 被黑得最惨的一次
  3. 内存文件系统——sysfs
  4. STM32F4_LCD12864并行驱动
  5. Linux信号 四 异步等待信号与同步等待信号接口
  6. lightning接口_苹果手机接口未来将和安卓手机统一——欧盟通过正式决议
  7. Java黑皮书课后题第8章:*8.25(马尔可夫矩阵)一个n*n的矩阵,如果每个元素都是正数,并且每列的元素的和为1,则成为正马尔可夫矩阵。编写下面的方法来检测矩阵是否是马尔可夫矩阵
  8. 命令行中只用scala来运行一个spark应用
  9. 微信小程序设置底部导航栏目方法
  10. 前端技巧之苹果官网效果分析
  11. 缓存击穿、缓存失效及热点key的解决方案
  12. eBPF 学习路径总结
  13. 记一次route配置不起作用的问题解决过程
  14. 使用curl与wget发送get与post请求
  15. python快速排序的原理_理解快速排序算法
  16. Revit中视图隐藏部分轴号字符及控制视图类别【隐藏/显示】
  17. RN上使用react-native-video视频播放器插件
  18. 视频播放设计测试用例
  19. 各宽带接入服务商简称整理
  20. BI技巧丨近两年及当年月份数据汇总

热门文章

  1. Spring5(从头到尾)笔记总结
  2. 17年前的非典,让阿里迅速崛起!马云:它不是你的机会,而是你的责任!
  3. ubuntu 中使用Docker 安装Tyk3.0.0
  4. python的ws库功能,实时获取服务器ws协议返回的数据
  5. 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(四)
  6. api.now is not a function
  7. 史上首次商业太空旅游,到底有没有进太空?
  8. SPI 通信原理详述
  9. java实现网上支付_java编写一个网上支付系统界面
  10. Doctype的作用是什么?