vue系列之动态路由详解【原创】


Posted in Javascript onSeptember 10, 2017

开题

最近用vue来构建了一个小项目,由于项目是以iframe的形式嵌套在别的项目中的,所以对于登录的验证就比较的麻烦,索性后端大佬们基于现在的问题提出了解决的方案,在看到他们的解决方案之前,我先画了一个比较标准的单系统的解决方案。

本文目录:

一: 设想
二: 讨论
三:实现
四:总结

一: 设想

vue系列之动态路由详解【原创】

简单解释下上图就是:

首先前端从cookie获取token,如果没有token就跳转到登录页面登录,登录验证之后生成token存在数据库中并返回给前端;前端将这个token保存下来,为了让在浏览器新的tab页时不需要登录,我们前端需要将这个token保存到cookie之中。

如果用户已经有了token,那么再验证是否有用户信息,如果没有去请求用户信息的接口,后台读取用户的基本信息返回给前端,前端根据后台返回的用户权限生成固定的路由表用于页面拦截。

在用户token和权限都有的情况下,进入自己权限内的页面并且携带token访问后台进行交互。

用户在退出时,请求后台接口,清除token数据。

二: 讨论

由于公司的项目更加的复杂,属于基于原来的系统开发新的系统模块,但是这些模块又为了以后主体功能的更新下次迭代需要保持相对的独立性,预计以后的老系统只起一个用户中心的功能,所以现在是基于实现单点登录的能力去迭代更新现在的新的项目。

今天上午对于登录的实现进行了相关讨论,由于公司项目保密考虑只是单单做相关的介绍:

现有的老项目将慢慢向用户中心转换,而以前的新项目需要去这个用户中心获取登录信息。具体的实现是:

登录新项目b.exaplem.com通过session检测到未登录时(这里说下新的项目和老项目在同一个一级域名下),跳转到a.exaplem.com?returnUrl='b.exaplem.com',在a.exaplem.com下成功登录后生成一个ticket给到b.exaplem.com,b.exaplem.com将这个ticket存在session里面来保持登录状态。

因为现在基本上是先登录a.exaplem.com然后再去登录b.exaplem.com,所以当我们第一次进入b.exaplem.com系统时,b.exaplem.com会向a.exaplem.com系统发送请求来获取ticket,并且生成session来维持登录状态。

三:实现

当时想通过引入vuex并通过cookie来保存token的状态,但是由于现在的项目还是后端以session的形式来维持用户的登录状态所以还是没有引入vuex。

基本实现如下:

main.js增加引入的permission.js文件如下:

import Vue from 'vue'
import router from './router'
import { asyncRouterMap, constantRouterMap } from './router'
 
function hasPermission(roles, route) { //
 if (route.meta && route.meta.role) {
  return roles.some(role => role === route.meta.role)
 } else {
  return true
 }
}

function filterAsyncRouter(asyncRouterMap, roles) {

 const accessedRouters = asyncRouterMap.filter(route => {
  if (hasPermission(roles, route)) {
   if (route.children && route.children.length) {
    route.children = filterAsyncRouter(route.children, roles)
   }
   return true
  }
  return false
 })

 return accessedRouters
}

// 加载页面之前
router.beforeEach((to, from, next) => {
 NProgress.start() // 开启Progress
 if (to.path == '/ContractAduit/Error') {
  next()
 } else if (!Vue.prototype.hasRoute) {

  Vue.prototype.$ajax.get(Vue.prototype.$api.getModuleHost("用户信息接口地址"), {})
   .then(data => {
    if (data.code == 1000) {
     let menus = data.menu
     let roles = menus.map((menu, index) => {
      return parseInt(menu.url);
     })
     const accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
     router.addRoutes(accessedRouters)
     Vue.prototype.userInfo = {
      id: data.id,
      realname: data.realname
     }
     Vue.prototype.hasRoute = true;
     next({...to })
    } else {
     router.push({ name: 'ErrorPageRouter' });
    }
   })
   .catch(err => console.log(err))
 } else {
  next()
 }
});

route.js文件如下:

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export const constantRouterMap = [{
  path: '/404',
  name: 'NoFoundPagetRouter',
  component: require('../views/404.page'),
  meta: {
   title: '404',
  }
 },
 {
  path: '/ContractAduit/NoAccess',
  name: 'NoAccessPageRouter',
  component: require('../views/no-access.page'),
  meta: {
   title: '无权限',
  }
 },
 {
  path: '/ContractAduit/Error',
  name: 'ErrorPageRouter',
  component: require('../views/error.page'),
  meta: {
   title: '内部错误',
  }
 }
]

export default new Router({
 mode: 'history',
 routes: constantRouterMap
})

export const asyncRouterMap = [{ 
  path: '/ContractAduit/Supplier/List',
  name: 'SupplierListPageRouter',
  component: require('../views/supplier/supplier-list.page.vue'),
  meta: {
   title: '某某列表页',
   role: 10001
  }
 },
 ...
 {
  path: '/',
  redirect: '/ContractAduit/Supplier/List',
  hidden: true,
  meta: {
   title: '某某列表页',
   role: 10001
  }
 }, {
  path: '*',
  redirect: '/404',
  hidden: true
 }
]

因为没有引入vuex所以需要在VUE构造函数的原型对象上声明变量来判断是否已经拉取了用户的基本信息,因为我们后端的权限是配置的页面级权限(即不是按照角色来安排哪个前端页面来可访问,而是根据后台返回的页面代码来判断哪个前端页面可访问)。

四:总结

因为我们的项目不可能达到千篇一律的情况,选择适合自己项目的解决方案才是最重要的,不要为了用某个技术而去用某个技术。

以上这篇vue系列之动态路由详解【原创】就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解决 FireFox 下[使用event很麻烦] 的问题.
Aug 22 Javascript
javascript编程起步(第二课)
Feb 27 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
Oct 20 Javascript
javascript scrollTop正解使用方法
Nov 14 Javascript
全面了解构造函数继承关键apply call
Jul 26 Javascript
AngularJs+Bootstrap实现漂亮的计算器
Aug 10 Javascript
20170918 前端开发周报之JS前端开发必看
Sep 18 Javascript
element-ui 表格实现单元格可编辑的示例
Feb 26 Javascript
vue 中引用gojs绘制E-R图的方法示例
Aug 24 Javascript
Node.js console控制台简单用法分析
Jan 04 Javascript
教你完全理解ReentrantLock重入锁
Jun 03 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
Nov 01 jQuery
cocos creator Touch事件应用(触控选择多个子节点的实例)
Sep 10 #Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
Sep 10 #Javascript
js 发布订阅模式的实例讲解
Sep 10 #Javascript
node.js 发布订阅模式的实例
Sep 10 #Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 #Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 #Javascript
基于AngularJS的简单使用详解
Sep 10 #Javascript
You might like
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
让PHP支持页面回退的两种方法
2008/01/10 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
一个加载js文件的小脚本
2007/06/28 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
pytorch对可变长度序列的处理方法详解
2018/12/08 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
利用python爬取有道词典的方法
2020/12/08 Python
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
学生会主席就职演讲稿
2014/01/14 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
SpringBoot详解执行过程
2022/07/15 Java/Android