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 相关文章推荐
javascript 多级checkbox选择效果
Aug 20 Javascript
javascript一些实用技巧小结
Mar 18 Javascript
javascript loadScript异步加载脚本示例讲解
Nov 14 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
Dec 18 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
May 17 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
Nov 09 Javascript
javascript数据类型详解
Feb 07 Javascript
jquery获取链接地址和跳转详解(推荐)
Aug 15 jQuery
在vue组件中使用axios的方法
Mar 16 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
对VUE中的对象添加属性
Sep 18 Javascript
原理深度解析Vue的响应式更新比React快
Apr 04 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 获取百度的热词数据的代码
2012/02/18 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
php while循环得到循环次数
2013/10/26 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
Python类的基础入门知识
2008/11/24 Python
Python多线程编程简单介绍
2015/04/13 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
python实现kMeans算法
2017/12/21 Python
详解python之协程gevent模块
2018/06/14 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
python实现同一局域网下传输图片
2020/03/20 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
护士自荐信
2013/10/25 职场文书
中专生学习生活的自我评价分享
2013/10/27 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
房产分割协议书范文
2014/11/21 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书