Vue3:动态路由+子页面(新增、详情页)动态路由配置(代码全注释)

文章目录

    • 实现思路
    • 调用后端接口获取用户权限
    • 获取页面权限动态绑定到路由对象中
    • 动态添加子页面路由
       

实现思路

   emm,项目中使用动态路由实现根据后端返回的用户详情信息,动态将该用户能够访问的页面信息,动态生成并且绑定到路由对象中。但是后端返回的不包含像是页面详情页,新增页的权限路由,如果前端在路由对象中写死的话,那每次进入页面都得判断是否将进入一个用户没有权限的页面,但是路由中有存在的。所以就想着自己能不能根据后端现有返回的信息,前端自己生成类似详情之类的动态路由。

调用后端接口获取用户页面权限动态绑定到路由对象中

1.获取用户权限

async function getUserAuthority(ids:any) {let userAuthority = nulllet NewList = null//定义请求参数let params = {id:ids,permission_tree:1}//请求用户的信息await get('/system/user/detail',params).then(res=>{if(res.status_code == 200){//userAuthority  存入查询到该用户信息 userAuthority = res.data//模拟该页面是需要跳转其他项目的地址let list =[{id: 119,children:[{id:1191,children:[],parent_id:119,name :'审单管理',slug:'web-system-exchangegoods-management',web_path : `/gongdan`,links:'https://blog.csdn.net/qq_45061461?type=lately'}],slug:'web-system-examineadocument',web_icon:'el-icon-coin',name :'审单管理',web_path: null,},{id: 117,children:[{children:[],id:1171,parent_id:117,slug:'web-system-exchangegoods-management',name :'换货留言列表',web_path : `/gongdan`,links:'https://so.csdn.net/so/search?q=vue3%3Amian,ts%E4%B8%AD%E8%8E%B7%E5%8F%96import.meta.glob&t=&u=&urw='}],slug:'web-system-exchangegoods',web_icon:'el-icon-coin',name :'换货留言列表',web_path: null,}]//将后端返回的用户信息中的权限 和 自己定义的权限对象 合并一起NewList = userAuthority.permissions.concat(list);//将用户的权限信息保存本地中sessionStorage.setItem('NavList',JSON.stringify(NewList))}})return NewList
}

 2.用户登录请求信息 方法我就不写了

//调用定义的获取权限方法
proxy.$PublicAPI.getUserAuthority(list.user_id).then((res) => {//res就是上个方法中返回的权限信息 然后调用将路由添加入路由对象的方法proxy.$PublicAPI.getRouteAddList();//获取默认第一菜单的一个页面的路径进行跳转proxy.$PublicAPI.getOnePagePath();});

3.调用动态追加路由对象的方法

async function getRouteAddList() {<!--定义存放路由信息对象-->let parentRoute = null;<!--判断本地中是否存在权限信息-->if (sessionStorage.getItem('NavList')) {//list是 forEachRout方法返回的数据,将本地权限信息传入,根据信息生成路由对象格式数据let list =  forEachRout() <!--router.getRoutes().find(route => route.name === 'index') 查找路由对象中的路由信息中name名为index的路由对象,name = index的路由对象path指向 index.vue 有显示页面元素的路由视图 <router-view /> -->parentRoute = router.getRoutes().find(route => route.name === 'index');<!--想自己生成的路由对象格式数据 追加到 /index中的chilrend中 -->list.forEach(item => {parentRoute.children.push(item);});<!--将定义好的路由数据格式对象添加到路由对象中-->router.addRoute(parentRoute);}
}

4.设计路由对象格式数据 forEachRout方法

function forEachRout  (){//存放已经设计好的路由对象let list = [] //查找 ../../views/ 文件夹下所有的文件 views文件夹下是我存放的vue文件const module = import.meta.glob("../../views/**");<!-- 获取本地的权限信息 -->let params = JSON.parse(sessionStorage.getItem('NavList'));<!-- 循环遍历权限信息 -->params.forEach(item => {<!-- 判断权限信息中web_path 是否是为string,为string类型就是用户的页面权限 这是后端返回的 -->if (typeof item.web_path === 'string') {<!-- 设计路由对象格式信息 -->let routerChildrenOne = {path: item.web_path,name: `${item.web_path}`,component: module[`../../views${item.web_path}/index.vue`],meta: {title: item.name,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}};<!-- 处理好的路由对象格式信息保存起来,后面存入路由对象中 -->list.push(routerChildrenOne);let butOne = item.slug;routerChildrenOne.meta.buts.push(butOne);} 
<!--  这个else 是判断是否需要跳转外部链接的对象,就是第一个截图中定义的两个权限数据对象 
-->
else {item.children.forEach(Citem => {let routerChildren = { <!-- 判断对象中是否存在 links(跳转链接)属性,为存在的话,那么这个path将和其他同样存在links属性的对象公用一个页面(所有需要跳转外部的菜单都共同跳转这一个页面,所以这里使用了路由传参来确定点击他们不会只获取到最近的一个需要外部跳转的菜单,否则菜单中存在一个以上跳转外部菜单,无论点击哪一个都会跳转同一个外部链接。并菜单包含此path全部高亮),就会存在下方截图的错误-->path:Citem.links ? `${Citem.web_path}/:${Citem.id}` :  Citem.web_path ,name: `${Citem.web_path}`,component: module[`../../views${Citem.web_path}/index.vue`],meta: {title: Citem.name,buts: [],requireAuth: true,keepAlive: true,externallink:Citem.links}};list.push(routerChildren);Citem.children.forEach(C_item_C => {let but = C_item_C.slug;routerChildren.meta.buts.push(but);});});}});//返回定义好的路由格式对象return list
}

所以,在配置路由格式对象中外部跳转链接菜单通过动态路由传参来避免出现这个问题.到此菜单的动态路由已经配置完成。

动态添加子页面路由

但是我在想如果每个页面中都存在类似新增和详情的子页面,但是后端返回的信息中未包含,自己怎么也解决动态生成。于是就回到了,后端目前返回给我的权限信息,还有获取到veiws文件夹中的vue文件。

 1.后端返回的权限

2.veiws文件夹中已经存在的

3.实现,此方法就是 P4代码片段的方法 只不过增加了几个变量和调用了几个方法:

 新增变量名:Eligiblelimitsofauthority  , aa

 新增调用方法的方法名:UpdataRouterList 、GetPossibleDetails 

 已经底部retrun之前的判断对象是否存在component绑定的文件路由属性

function forEachRout  (){//存放已经设计好的路由对象let list = []<!-- 存放可能是新增页面,详情页面 和编辑页面的标识 -->let Eligiblelimitsofauthority = []<!-- 存放可能是新增页面,详情页面 和编辑页面的路由对象>let aa = [] //查找 ../../views/ 文件夹下所有的文件 views文件夹下是我存放的vue文件const module = import.meta.glob("../../views/**");<!-- 获取本地的权限信息 -->let params = JSON.parse(sessionStorage.getItem('NavList'));<!-- 筛选出页面中出现可能是新增、详情或者编辑的信息 --> UpdataRouterList(params,Eligiblelimitsofauthority)<!-- 根据传递过来的可能是详情或者编辑的信息,筛选出存在权限的数据,转换成路由格式对象 -->aa =  GetPossibleDetails(Eligiblelimitsofauthority,params,aa)<!-- 循环遍历权限信息 -->params.forEach(item => {<!-- 判断权限信息中web_path 是否是为string,为string类型就是用户的页面权限 这是后端返回的 -->if (typeof item.web_path === 'string') {<!-- 设计路由对象格式信息 -->let routerChildrenOne = {path: item.web_path,name: `${item.web_path}`,component: module[`../../views${item.web_path}/index.vue`],meta: {title: item.name,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}};<!-- 处理好的路由对象格式信息保存起来,后面存入路由对象中 -- >list.push(routerChildrenOne);let butOne = item.slug;routerChildrenOne.meta.buts.push(butOne);} 
<!--  这个else 是判断是否需要跳转外部链接的对象,就是第一个截图中定义的两个权限数据对象 
-->
else {item.children.forEach(Citem => {let routerChildren = { <!-- 判断对象中是否存在 links(跳转链接)属性,为存在的话,那么这个path将和其他同样存在links属性的对象公用一个页面(所有需要跳转外部的菜单都共同跳转这一个页面,所以这里使用了路由传参来确定点击他们不会只获取到最近的一个需要外部跳转的菜单,否则菜单中存在一个以上跳转外部菜单,无论点击哪一个都会跳转同一个外部链接。并菜单包含此path全部高亮),就会存在下方截图的错误-->path:Citem.links ? `${Citem.web_path}/:${Citem.id}` :  Citem.web_path ,name: `${Citem.web_path}`,component: module[`../../views${Citem.web_path}/index.vue`],meta: {title: Citem.name,buts: [],requireAuth: true,keepAlive: true,externallink:Citem.links}};list.push(routerChildren);Citem.children.forEach(C_item_C => {let but = C_item_C.slug;routerChildren.meta.buts.push(but);});});}});<!-- 判断转换成路由格式数据中component有数据的对象,component不为空的时候就是标识项目中已经创建了这个新增,详情 或编辑的页面-->if(aa){aa.map(item=>{if(item.component != undefined)list.push(item)})}//返回定义好的路由格式对象return list
}

2.UpdataRouterList方法 筛选出页面中出现可能是详情或者编辑的信息

//筛选出页面中出现可能是详情或者编辑的信息
function UpdataRouterList(navlist:any,Eligiblelimitsofauthority:any) {<!-- 循环传过来的本地权限数据对象中包含了 'create','edit' 和 'detail'的标识 -->navlist.map(item=>{if(item.slug.indexOf('create') != -1 || item.slug.indexOf('edit') != -1 || item.slug.indexOf('detail') != -1){<!-- 存入到可能包含新增,详情,编辑的标识数组中 -->Eligiblelimitsofauthority.push(item.slug)}<!-- 判断是否还有子数据,第一次循环的是下拉菜单 第二次循环的是下拉菜单中的点击跳转页面的菜单,第三次循环点击跳转页面的菜单中的 按钮权限,主要是拿到按钮权限菜单  这里是只有二级菜单,所以循环了三次,如果有多级也会一直循环下去,知道children中没有数据-->>if(item.children){UpdataRouterList(item.children,Eligiblelimitsofauthority)}})
}

3.GetPossibleDetails 根据传递过来的信息,筛选出存在权限的数据, 转换成路由信息,因为如果在本地中已经定义了全部的页面新增,详情,编辑等页面,但是咱们还是需要根据后端返回的权限中,判断咱们是否注册该页面的路由。

//根据传递过来的信息,筛选出存在权限的数据, 转换成路由信息 
function GetPossibleDetails(data:object,navlist:object,aa:any,) {<!-- 获取项目中views文件夹下的所有vue文件 -->const module = import.meta.glob("../../views/**");<!-- 遍历本地中的权限数据-->navlist.map(item=>{<!-- 传递过来的可能是 新增,详情,编辑的权限标识 -->data.map(ditem =>{<!-- 判断 item.web_path是否不为空,如果为空的话表明菜单是下拉菜单就不做操作 item.slug :这个菜单的标识 如:web-users 就是表示user(用户)菜单 -->if(item.web_path != null && ditem == `${item.slug}-create` || ditem == `${item.slug}-edit` ||  ditem == `${item.slug}-detail`){<!-- 存放定义的路由数据格式对象 -->let list = {}<!-- 截取item.we_path 菜单路径处理后的值,如:/user 我拿取user 后面作为/veiws/user,匹配views下的user文件夹 所以这里获取的是该菜单存放的文件夹名称 -->let path  = ''if(item.web_path != null){<!-- 截取文件夹名称 -->path = item.web_path.slice(item.web_path.lastIndexOf('/') + 1 , item.web_path.length)<!-- ditem是方法接收传递过来可能是新增,编辑,详情的权限标识数组,判断最后的-符号的后面是 'create':新增 ,'edit' :编辑 'detail':详情 -->switch ( ditem.slice(ditem.lastIndexOf('-') + 1 , ditem.length)) {case 'create'://如果是新增list = {//定义新增页面跳转的路由路径,如: path是截取到的文件名:user  那就path最后就是 :/usercreatepath: '/'+path + 'create',name: `${path}create`,<!-- 匹配本地vue文件中是否包含 module:views下所有的vue文件,path:文件夹名称,item.web_path:vue文件名称 -->component: module[`../../views/${path}${item.web_path}create.vue`],meta: {title: '新建' + item.name ,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}}break;case 'edit':console.log('item-edit',item);list = {path: '/'+path + 'edit',name: `${path}edit`,component: module[`../../views/${path}${item.web_path}edit.vue`],meta: {title: item.name  + '编辑' ,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}}break;case 'detail':list = {path: '/'+path + 'detail',name: `${path}detail`,component: module[`../../views/${path}${item.web_path}detail.vue`],meta: {title:  item.name + '详情'  ,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}}break;}}aa.push(list)}})<!-- 判断菜单中的chidren是否存在数据,如果没有存在就表明是一级点击跳转菜单,parent_id :0 表示的是菜单 -->if(item.children && item.parent_id == 0){GetPossibleDetails( data,item.children,aa)}})return aa
}

小结

1.最后添加到路由对象中的数据,最后一个对象就是新增的动态子页面路由

项目文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何从清空的回收站中恢复已删除的Excel文件?

“嗨&#xff0c;几天前我删除了很多没有备份的Excel文件。回收站已清空。当我意识到我犯了一个大错误时&#xff0c;所有的Excel文件都消失了&#xff0c;回收站里什么都没有。清空回收站后是否可以恢复已删除的 Excel 文件&#xff1f; 回收站是一种工具&#xff0c;可让您在…

LeetCode 343. 整数拆分 (dp动态规划)

343. 整数拆分 力扣题目链接(opens new window) 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 …

【openlayers系统学习】4.2Mapbox 样式渲染图层

二、Mapbox 样式渲染图层 显然我们目前的地图需要一些样式。 VectorTile​ 图层的样式与 Vector​ 图层的样式工作方式完全相同。那里描述的样式在这里也适用。 对于这样的地图&#xff0c;创建数据驱动的样式&#xff08;对矢量图层操作&#xff09;非常简单。但矢量切片也用…

单兵组网设备+指挥中心:集群系统技术详解

一、单兵设备功能特点 单兵组网设备是现代通信技术的重要成果&#xff0c;旨在为单个作战或工作单元提供高效的通信和数据传输能力。其主要功能特点包括&#xff1a; 1. 便携性&#xff1a;设备轻巧&#xff0c;便于单兵携带和使用&#xff0c;适应各种复杂环境。 2. 通信能…

简述vue-router 组件复用导致路由参数失效怎么办

当使用Vue Router时&#xff0c;组件复用可能会导致路由参数失效的问题。为了解决这个问题&#xff0c;我们可以采取以下策略&#xff1a; 1. 监听路由变化 在Vue组件中&#xff0c;我们可以使用watch属性来监听$route对象的变化。当路由发生变化时&#xff0c;如果目标组件是…

第 8 章 机器人实体导航实现_路径规划(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 9.3.5 导航实现05_路径规划 路径规划仍然使用 navigation 功能包集中的 move_base 功能包。 5.1编写launch文…

PHP之fastadmin系统配置分组增加配置和使用

目录 一、实现功能&#xff1a;fasttadmin实现添加系统配置分组和添加参数、使用 二、添加分组 三、配置分组参数 四、最终存储位置 五、获取配置参数 一、实现功能&#xff1a;fasttadmin实现添加系统配置分组和添加参数、使用 二、添加分组 在字典配置中找到分组对应键值…

linux系统——top资源管理器

在linux系统中&#xff0c;有类似于windows系统中的资源管理器&#xff0c;top用于实时的监控系统的任务执行状态以及硬件配置信息 在linux中&#xff0c;输入top命令&#xff0c;可以进入相应界面&#xff0c;在此界面可以使用一些指令进行操作 如&#xff0c;输入z 可以改变…

终端安全管理系统、天锐DLP(数据泄露防护系统)| 数据透明加密保护,防止外泄!

终端作为企业员工日常办公、数据处理和信息交流的关键工具&#xff0c;承载着企业运营的核心信息资产。一旦终端安全受到威胁&#xff0c;企业的敏感数据将面临泄露风险&#xff0c;业务流程可能遭受中断&#xff0c;甚至整个企业的运营稳定性都会受到严重影响。 因此&#xff…

【EVI】Hume AI 初探

写在前面的话 Hume AI宣布已在B轮融资中筹集5000万美元&#xff0c;由前Google DeepMind研究员Alan Cowen创立并担任CEO。该AI模型专注于理解人类情感&#xff0c;并发布了「共情语音界面」演示&#xff0c;通过语音对话实现互动。从 Hume AI 官网展示的信息&#xff0c;EVI 能…

计算机视觉与深度学习实战:以Python为工具,基于深度学习的汽车目标检测

随着人工智能技术的飞速发展,计算机视觉与深度学习已经成为当今科技领域的热点。其中,汽车目标检测作为自动驾驶、智能交通等系统的核心技术,受到了广泛关注。本文将以Python为工具,探讨基于深度学习的汽车目标检测方法及其实战应用。 一、计算机视觉与深度学习基础 计算机…

力扣刷题--747. 至少是其他数字两倍的最大数【简单】

题目描述 给你一个整数数组 nums &#xff0c;其中总是存在 唯一的 一个最大整数 。 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是&#xff0c;则返回 最大元素的下标 &#xff0c;否则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;n…

Python-opencv通过距离变换提取图像骨骼

文章目录 距离变换distanceTransform函数 距离变换 如果把二值图像理解成地形&#xff0c;黑色表示海洋&#xff0c;白色表示陆地&#xff0c;那么陆地上任意一点&#xff0c;到海洋都有一个最近的距离&#xff0c;如下图所示&#xff0c;对于左侧二值图像来说&#xff0c;【d…

Gitee的原理及应用详解(三)

本系列文章简介&#xff1a; Gitee是一款开源的代码托管平台&#xff0c;是国内最大的代码托管平台之一。它基于Git版本控制系统&#xff0c;提供了代码托管、项目管理、协作开发、代码审查等功能&#xff0c;方便团队协作和项目管理。Gitee的出现&#xff0c;在国内的开发者社…

漂流瓶挂机项目,聊天脚本赚钱新玩法,号称单机30-50+ (教程+软件)

一、项目简介&#xff1a; 漂流瓶挂机项目主要是通过使用探遇漂流瓶、音麦漂流瓶等聊天软件&#xff0c;为用户提供一个聊天赚钱的平台。男性用户需要充值后才能发送消息&#xff0c;而女性用户则可以通过接收消息赚取分红。男性用户发送给女性用户的消息费用大约在.1-.2元之间…

VScode中对git的学习笔记

1.git是什么&#xff1f; Git是一个功能强大的分布式版本控制系统&#xff0c;由Linux内核的创始人Linus Torvalds在2005年创建。它以其速度、数据完整性和支持大型项目的能力而闻名&#xff0c;被广泛应用于软件开发中。Git允许开发者在本地机器上拥有完整的代码库副本&#x…

读书笔记分享

1.苏格拉底只在需要的时候才索取&#xff0c;那样便能以最少的物质满足自身的要求。他认为每个人都天生体质脆弱&#xff0c;只有在贫乏的环境中才会锻炼地强壮起来。生活中的大多数人认为&#xff0c;奢华才是幸福的生活。无休止的物质积聚&#xff0c;让人们每天生活在一个内…

2024-05-27 blue-vh-问题点

摘要: 2024-05-27 思考-日记-问题点 问题点: 一. 同步接口的并发问题 接口调用是在客户端的的上下文&#xff0c;无论是线程&#xff0c;协程&#xff0c;是在客户端的执行上下文里面同步的话&#xff0c;是同步客户端的调用接口的上下文&#xff0c;阻塞的是客户端的上下文&a…

SashulinMessageBroker:在消息流中调用C++ DLL

一、背景 在现实应用中&#xff0c;算法、核心逻辑为了追求快速高效的运行速度&#xff0c;很多人都采用C来编写&#xff0c;并打包成动态库供外部使用。SMB针对这种应用场景&#xff0c;提供了DLL组件&#xff0c;实现在消息流中对DLL的动态调用。下实例讲解如何实现DLL as S…

多旋翼+发电机:国债应急系留照明无人机技术详解

多旋翼发电机技术的应急系留照明无人机是一种集成了先进飞行技术、发电技术和照明技术的无人机系统。这种无人机具有高度的灵活性、移动性和适应性&#xff0c;能够在各种复杂环境下迅速部署&#xff0c;为夜间搜救、救援等应急任务提供高效、可靠的照明支持。 无人机参数&…