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 相关文章推荐
引用外部脚本时script标签关闭的写法
Jan 20 Javascript
jquery选择checked在ie8普通模式下的问题
Feb 12 Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 Javascript
Ext JS动态加载JavaScript创建窗体的方法
Jun 23 Javascript
JavaScript关于提高网站性能的几点建议(一)
Jul 24 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
js弹性势能动画之抛物线运动实例详解
Jul 27 Javascript
JavaScript中Array方法你该知道的正确打开方法
Sep 11 Javascript
angular4强制刷新视图的方法
Oct 09 Javascript
vue配置接口域名方法总结
May 12 Javascript
微信小程序 导入图标实现过程详解
Oct 11 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
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
Smarty3配置及入门语法
2017/02/22 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
vue中使用input[type="file"]实现文件上传功能
2018/09/10 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
Python编程中的文件操作攻略
2015/10/16 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
详解python中的数据类型和控制流
2019/08/08 Python
Python的垃圾回收机制详解
2019/08/28 Python
django数据模型on_delete, db_constraint的使用详解
2019/12/24 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
律师授权委托书范本
2014/10/07 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python