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 相关文章推荐
为指定元素增加样式的js代码
Dec 09 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
Javascript异步编程模型Promise模式详细介绍
May 08 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
JavaScript严格模式详解
Nov 18 Javascript
JavaScript基础知识之方法汇总结
Jan 24 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
Dec 03 Javascript
详解webpack+angular2开发环境搭建
Jun 28 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
js注册时输入合法性验证方法
Oct 21 Javascript
浅析vue中的MVVM实现原理
Mar 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新手上路(五)
2006/10/09 PHP
PHP 程序员应该使用的10个组件
2009/10/31 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
Javascript的this详解
2019/03/23 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
python自动化测试实例解析
2014/09/28 Python
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Python3的socket使用方法详解
2020/02/18 Python
python新手学习可变和不可变对象
2020/06/11 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
pytorch中index_select()的用法详解
2021/01/06 Python
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
保险公司晨会主持词
2014/03/22 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB