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 相关文章推荐
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
Oct 21 Javascript
javascript正则表达式之search()用法实例
Jan 19 Javascript
浅析Node.js的Stream模块中的Readable对象
Jul 29 Javascript
Javascript使用post方法提交数据实例
Aug 03 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
JS实现复制功能
Mar 01 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
小程序文字跑马灯效果
Dec 28 Javascript
js实现移动端吸顶效果
Jan 08 Javascript
浅谈VUE中演示v-for为什么要加key
Jan 16 Javascript
JavaScript 常见的继承方式汇总
Sep 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
PHP二维数组的去重问题解析
2011/07/17 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
js实现微信聊天界面
2020/08/09 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
Python实现批量修改文件名实例
2015/07/08 Python
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
python正则实现提取电话功能
2018/02/24 Python
python实现textrank关键词提取
2018/06/22 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
销售自我评价
2013/10/22 职场文书
网络编辑职责
2014/03/01 职场文书
征婚广告词
2014/03/17 职场文书
颁奖典礼主持词
2014/03/25 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
会计求职自荐信
2014/06/20 职场文书
励志演讲稿300字
2014/08/21 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
工作自我评价范文
2015/03/05 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
Python实现机器学习算法的分类
2021/06/03 Python