vue-router 权限控制的示例代码


Posted in Javascript onSeptember 21, 2017

最近搭建了公司的后台管理系统, 而且系统还比较庞大, 要实现以下几点:

  • 菜单权限, 根据不同权限显示不同的菜单
  • 操作权限, 比如有些账号没有新增权限, 有些没有修改或者删除权限
  • 数据权限, 比如统计概况, 普通管理员不能看到公司营业概况,但能看到自己所属区域的概况
  • 显示权限, 比如列表, 运营能看到那一列的签约金额,但市场不能看到签约金额这一列

到目前为止还在构建中, 已经解决菜单权限和操作权限。

菜单权限:

最开始的时候也是按照楼上给出的方法,本地先配置一套路由,然后登陆成功后会从服务器返回一个菜单列表,然后在beforeEach里面把返回的菜单列表和本地配置的路由进行对比, 如果存在则有权限访问。 做了几天发现很难用, 本地得配置一整套路由,还得做几个页面来把这些路由信息写入到服务器,这样来进行权限分配, 当你的权限菜单比较多的时候, 像我们这个后台,光公司内部权限就有好几套, 还有代理商、商家权限等等, 不同的菜单可能会超过几百个, 这样配置太累了,还容易出错。

最后的解决思路是完全不在本地做任何路由配置, 登录页面单独弄,不放到vue组件里面, 登录成功后从后台抓取菜单列表, 因为现在是已经登录成功了,所以抓取的就是拥有全新的菜单。 抓取成功后在配置到路由里面,然后实例化vue , 这样就避免了本地配置一套路由了,完全是服务器上面配置路由。

这样解决的难点只有一个,那就是路由需要对应的组件,所以我们将所有组件存放到一个对象里面, 服务器的返回的菜单列表里面,会有一个字段配置组件名, 在抓取成功后生成路由配置的时候就使用 router[menuName]就能直接加载到这个组件,非常方便。

main.js代码片段:

// 实例化Login类并初始化
 new Login(function (err, data) {
  if (err) {
   // 登录出错
  } else {
   // 登录成功
   init(data);
  }
 }).init();

const init = function (data) {
 // 先配置路由信息
 // componentConfigs 是本地的组件配置
 let routers = assignRouter(data.menus, componentConfigs);
 // 实例化路由
 router = new Router({routes: routers});
 // 再实例化vue
 new Vue({
  el: '#app',
  store,
  router,
  nprogress,
  ...App
 });
};

componentConfigs.js 代码片段:

export default {
 Common: {
  Admin: require('../../vue/pages/common/Admin'),
  Index: require('../../vue/pages/common/Index'),
  UpdatePassword: r => require.ensure([], () => r(require('../../vue/pages/users/UpdatePassword')), 'users')
 }
}

服务器返回的菜单json:

其中meta 字段里面是当前路由里的操作权限

[{
      "path": "\/admin\/index",
      "name": "\u9996\u9875",
      "component": "Common.Index",
      "display": true,
      "icon": "icon-home"
    }, {
      "path": "\/admin\/updatePassword",
      "name": "\u4fee\u6539\u5bc6\u7801",
      "component": "Common.UpdatePassword",
      "display": false
    }, {
      "path": "\/admin\/commodity",
      "name": "\u5546\u54c1\u7ba1\u7406",
      "component": "Content",
      "display": true,
      "icon": "icon-class",
      "children": [{
        "path": "\/admin\/commodity\/publicWarehouse",
        "name": "\u516c\u5171\u5e93\u7ba1\u7406",
        "component": "Commodity.PublicWarehouse",
        "display": true,
        "meta": {"handleAuth": {"add": true, "edit": false, "del": true}}
      }, {
        "path": "\/admin\/commodity\/businessesWarehouse",
        "name": "\u5546\u5bb6\u5e93\u7ba1\u7406",
        "component": "Commodity.BusinessesWarehouse",
        "display": true,
        "meta": {"handleAuth": {"add": true, "edit": false, "del": true}}
      }]
    }]

菜单的权限大概就是这样, 至于操作权限, 思路是这样的: 写一个鉴权的vue插件, 然后所有的操作独立放到methods里面; 然后所有的操作 @click里面调用鉴权函数, $auth('add', arg1, arg2, ...argN) ; $auth里面判断this.$route.meta 里是否有权限进行这个操作, 如果有则调用 this[authName].apply(null, arg);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery toggle使用分析
Nov 16 Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
创建自己的jquery表格插件
Nov 25 Javascript
jquery ajax双击div可直接修改div中的内容
Mar 04 Javascript
jQuery对table表格进行增删改查
Dec 22 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
Apr 13 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 Javascript
值得收藏的八个常用的js正则表达式
Oct 19 Javascript
微信小程序实现订单倒计时
Nov 01 Javascript
react router 4.0以上的路由应用详解
Sep 21 #Javascript
详解10分钟学会vue滚动行为
Sep 21 #Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
Sep 21 #jQuery
JavaScript实现简单生成随机颜色的方法
Sep 21 #Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 #Javascript
shiro授权的实现原理
Sep 21 #Javascript
AngularJS 的$timeout服务示例代码
Sep 21 #Javascript
You might like
php+mysql实现无限级分类
2015/11/11 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python实现图片变亮或者变暗的方法
2015/06/01 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
理解Python中的绝对路径和相对路径
2017/08/30 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
python 如何设置守护进程
2020/10/29 Python
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
应届电子商务毕业自荐书范文
2014/02/11 职场文书
前处理班长职位说明书
2014/03/01 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
英文自荐信常用句子
2014/03/26 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
优秀班组长事迹
2014/05/31 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
2014年采购部工作总结
2014/11/20 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
MySQL数据库完全卸载的方法
2022/03/03 MySQL