详解基于vue-router的动态权限控制实现方案


Posted in Javascript onSeptember 28, 2017

使用vue开发带权限管理系统,尤其是采用了vue-router做路由,很多人都遇到的一个问题就是如何动态加载路由path对应的component。

典型的应用场景就是:前端菜单不静态的写在vue程序里,而是要从后台程序和数据库返回的菜单来动态加载到vue应用中。

网上很多问权限的问题,但几乎找不到很好的解决答案,在很长一段时间里,非常打击使用vue技术栈开发的信心。最有质量的一篇文章是:https://3water.com/article/124801.htm

但作者并没有完全解决这个问题,还留有几个问题是:

1)登录之后跳转到首页,此时路由已经是加载完成的了不能更改,菜单可以显示但是没有路由。

2)前端应用人为刷新网页路由产生某些问题。

本文即在这篇文章的基础上对这两个问题解决,以使其完整。

前提是认真拜读上面提到的那篇文章,下面直接用代码说话:

问题1的解决思路:

登录之后跳转到首页,router是vue应用的router 引入进登录方法,在登录之后跳转之前对router进行改变,改变要点1是精确赋值到router的routes具体地方,比如我这里是routes[0]的子路由,2是用addRoutes函数使其生效。

登录功能的js

export const login = ({commit}, data) => { Service.post('/login', Qs.stringify(data))
  .then(res => {
   const success = Object.is(res.statusText, 'OK') && Object.is(res.data.code, '0')
   if (success) {
    var menus = generateMenus(res.data.menus)
    window.sessionStorage.routes = JSON.stringify(menus)
    if (menuModule.state.items.length <= 0) { // 避免注销后在不刷新页面的情况下再登录重复加载路由
     commit(types.ADD_MENU, menus)
     // 动态加载路由关键2行
     router.options.routes[0].children.push(...generateRoutesFromMenu(menuModule.state.items))
     router.addRoutes(router.options.routes)
    }
    window.sessionStorage.loginName = data.loginName
    router.push({path: '/'})
   } else {
    commit('loginErr', res.data.msg)
   }
  })
}


function generateRoutesFromMenu (menu = [], routes = []) {
 for (let i = 0, l = menu.length; i < l; i++) {
  let item = menu[i]
  if (item.path) {
   routes.push(item)
  }
  if (!item.component) {
   item.component = resolve => require([`views/` + item.component + `.vue`], resolve)
   generateRoutesFromMenu(item.children, routes)
  }
 }
 return routes
}

问题2的解决思路:

是不在主app里引入实例化vue-router的js,而是直接在app里实例化router,目的就是网页刷新的时候每次都确保生成动态的router。

app.js部分代码:

Vue.use(Router)
let menus = window.sessionStorage.routes //登录成功返回的菜单
if (menus) {
 let items = JSON.parse(menus)
 store.commit(ADD_MENU, items)
}

const router = new Router({
 mode: 'hash',
 linkActiveClass: 'is-active',
 scrollBehavior: () => ({ y: 0 }),
 routes: [
  {
   name: 'Main',
   path: '/',
   component: require('views/Main.vue'),
   children: [ //动态路由之所以作为Main的子路由是基于:登录之后跳转到Main主页,该主页是类似于frame的页面加载框架,只有将动态路由作为Main的子路由才能确保其他页面显示到Main框架内。
    ...generateRoutesFromMenu(menuModule.state.items)
   ]
  },
  {
   name: 'Login',
   path: '/login',
   component: require('views/Login.vue')
  }
 ]
})

function generateRoutesFromMenu (menu = [], routes = []) {
 for (let i = 0, l = menu.length; i < l; i++) {
  let item = menu[i]
  if (item.path) {
   routes.push(item)
  }
  if (!item.component) {
   item.component = resolve => require([`views/` + item.component + `.vue`], resolve)
   generateRoutesFromMenu(item.children, routes)
  }
 }
 return routes
}

另附menu items代码

const state = {
 items: [ // 什么菜单都不定义,完全由后端返回
 ]
}
const mutations = {
 [types.ADD_MENU] (state, menuItems) {
  if (menuItems.length > 0) {
   menuItems.map(function (item) {
    item.children.map(function (child) {
     child.component = lazyLoading(child.component)
    })
   })
   state.items.push(...menuItems)
  }
 },

lazyloding

export default (name, index = false) => () => import(`views/${name}${index ? '/index' : ''}.vue`)

git代码暂不能全部公开,有问题可留言。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
firefox中JS读取XML文件
Dec 21 Javascript
页面使用密码保护代码
Apr 10 Javascript
jQuery extend 的简单实例
Sep 18 Javascript
Jquery插件easyUi表单验证提交(示例代码)
Dec 30 Javascript
jquery实现页面图片等比例放大缩小功能
Feb 12 Javascript
jquery实现右键菜单插件
Mar 29 Javascript
javascript禁止访客复制网页内容的实现代码
Aug 05 Javascript
jQuery+css实现炫目的动态块漂移效果
Jan 28 Javascript
angular或者js怎么确定选中ul中的哪几个li
Aug 16 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
Aug 18 Javascript
Vue 组件参数校验与非props特性的方法
Feb 12 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
Sep 25 Javascript
node.js学习之断言assert的使用示例
Sep 28 #Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
Sep 28 #Javascript
node.js学习之事件模块Events的使用示例
Sep 28 #Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 #Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
Sep 28 #Javascript
jquery实现左右轮播图效果
Sep 28 #jQuery
bootstrap table实现点击翻页功能 可记录上下页选中的行
Sep 28 #Javascript
You might like
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
二招解决php乱码问题
2012/03/25 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
Python实现注册登录系统
2017/08/08 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
Python控制台实现交互式环境执行
2020/06/09 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
.NET概念性的面试题
2012/02/29 面试题
外贸采购员求职的自我评价
2013/11/26 职场文书
应届医学毕业生求职信分享
2013/12/02 职场文书
车贷收入证明范本
2014/01/09 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript