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 相关文章推荐
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
删除javascript所创建子节点的方法
May 21 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
Jul 27 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
Aug 31 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
javascript设计简单的秒表计时器
Sep 05 Javascript
微信小程序链接传参并跳转新页面
Nov 29 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
JS实现的贪吃蛇游戏完整实例
Jan 18 Javascript
JS实现的贪吃蛇游戏案例详解
May 01 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
Feb 07 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/10/09 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
js 开发之autocomplete="off"在chrom中失效的解决办法
2017/09/28 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python获取系统默认字符编码的方法
2015/06/04 Python
python动态网页批量爬取
2016/02/14 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
python简单实现插入排序实例代码
2020/12/16 Python
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
行政部主管岗位职责
2013/12/28 职场文书
室内拓展活动方案
2014/02/13 职场文书
大学信息公开实施方案
2014/03/09 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
主题教育活动总结
2014/05/05 职场文书
表彰大会新闻稿
2015/07/17 职场文书
心理学培训心得体会
2016/01/22 职场文书
导游词之天津盘山
2019/11/01 职场文书
Python基础详解之描述符
2021/04/28 Python
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python