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

发布时间 - 2026-01-11 03:11:04    点击率:

开题

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

本文目录:

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

一: 设想

简单解释下上图就是:

首先前端从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系列之动态路由详解【原创】就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# vue动态路由  # 讲解vue-router之什么是动态路由  # vue 实现动态路由的方法  # vue实现动态路由详细  # 手把手教你vue实现动态路由  # vue实现动态路由的方法及路由原理解析  # vue实现动态路由的详细代码示例  # 后端  # 给大家  # 如果没有  # 单点  # 跳转到  # 他们的  # 迭代  # 才是  # 不需要  # 最重要  # 提出了  # 而去  # 希望能  # 我先  # 再去  # 当我们  # 这篇  # 已经有了  # 能达到  # 数据库中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 海南网站制作公司有哪些,海口网是哪家的?  如何快速重置建站主机并恢复默认配置?  如何用IIS7快速搭建并优化网站站点?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何在搬瓦工VPS快速搭建网站?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  如何在宝塔面板创建新站点?  EditPlus 正则表达式 实战(3)  Laravel如何使用模型观察者?(Observer代码示例)  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何快速搭建高效WAP手机网站吸引移动用户?  javascript读取文本节点方法小结  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  北京企业网站设计制作公司,北京铁路集团官方网站?  公司门户网站制作流程,华为官网怎么做?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  如何在橙子建站上传落地页?操作指南详解  Android滚轮选择时间控件使用详解  Java类加载基本过程详细介绍  b2c电商网站制作流程,b2c水平综合的电商平台?  中山网站推广排名,中山信息港登录入口?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  网站制作免费,什么网站能看正片电影?  Python3.6正式版新特性预览  深圳网站制作的公司有哪些,dido官方网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  免费网站制作appp,免费制作app哪个平台好?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  WordPress 子目录安装中正确处理脚本路径的完整指南  Bootstrap整体框架之JavaScript插件架构  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  如何用5美元大硬盘VPS安全高效搭建个人网站?  iOS中将个别页面强制横屏其他页面竖屏  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  zabbix利用python脚本发送报警邮件的方法  音响网站制作视频教程,隆霸音响官方网站?  如何构建满足综合性能需求的优质建站方案?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel如何创建自定义Facades?(详细步骤)  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  西安专业网站制作公司有哪些,陕西省建行官方网站?