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 isPrototypeOf和hasOwnProperty使用区别
Mar 04 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
Apr 15 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
Dec 27 Javascript
当前流行的JavaScript代码风格指南
Sep 10 Javascript
Javascript基础教程之break和continue语句
Jan 18 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 Javascript
JS库中的Particles.js在vue上的运用案例分析
Sep 13 Javascript
手写简单的jQuery雪花飘落效果实例
Apr 22 jQuery
Node.js操作系统OS模块用法分析
Jan 04 Javascript
js实现图片局部放大效果详解
Mar 18 Javascript
webpack-mvc 传统多页面组件化开发详解
May 07 Javascript
vue-iview动态新增和删除的方法
Jun 17 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
第十节--抽象方法和抽象类
2006/11/16 PHP
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
Python字符串转换成浮点数函数分享
2015/07/24 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
python中什么是面向对象
2020/06/11 Python
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
PHP面试题大全
2015/10/16 面试题
早餐连锁店计划书
2014/01/08 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
公司开会通知
2015/04/20 职场文书
讲座通知范文
2015/04/23 职场文书
小学生表扬稿范文
2015/05/05 职场文书
爱国主义电影观后感
2015/06/18 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL