当前位置: 首页 > news >正文

基于vue3异步组件、动态组件、vite批量导入实现路由权限动态管理(非addRoute方案)

开发后台管理系统必备的需求:动态菜单权限管理、或者说路由权限动态管理
原理是通过addRoute实现路由权限控制,一般分为两种:

  1. 后端生成当前用户相应的路由后由前端(用 Vue Router 提供的API)addRoutes 动态加载路由
  2. 前端写好所有的路由,后端返回当前用户的角色,然后根据事先约定好的每个角色拥有哪些路由对角色的路由进行分配

这里就不具体论述了

这里介绍一个个人研究的,在vite+vue3下的动态菜单权限管理实现方案:
这是一个由后端动态菜单控制的解决方案,需要后端传异步组件的路径值
基于异步组件动态组件,而不是addRoute

1.使用vue3和vite语法

defineAsyncComponent是vue3定义异步组件的api
import.meta.glob是vite的批量导入语法

<script>
import { defineAsyncComponent } from "vue"
let modules = import.meta.glob("../dynamicComponent/**/*.vue")

2.管理系统左侧一般是树菜单,右侧是对应菜单内容

第一步肯定是请求后端获取左侧树菜单,点击单个树菜单右侧显示对应菜单内容
在上一步我们已经通过vite批量导入获取dynamicComponent文件夹下所有vue文件信息,在computed里面拼接动态组件路径即可

methods: {/** 获取树菜单数据 */async loadTreeData() {const { data: res } = await http.post("xxx")if (res.code === 0) {this.treedata = res.data}},/** 点击单个树菜单 */handleNodeClick(data) {this.currentNode = data},
 computed: {/** 动态组件 */dynamicComponent() {// 这里是点击树节点后树节点上的数据,vueUrl字段是跟后端沟通后返回的前端项目vue文件路径let filename = this.currentNode.vueUrl  return defineAsyncComponent(modules[`../dynamicComponent/${filename}.vue`])},},

3.动态组件

<div class="container"><div class="tree">...</div><div class="tree-right"><transition name="fade-transform" mode="out-in"><componentv-if="dynamicComponent":is="dynamicComponent"></component></transition></div></div>

可以看到核心代码思路其实是非常简单的,开发右侧内容区域的vue页面只需要放在dynamicComponent文件夹下,跟后端沟通好文件路径传值即可
比如后端传值user/common,对应前端项目vue文件路径是dynamicComponent/user/common.vue

安全性思考

dynamicComponent方案是具备安全性的,因为异步组件和动态组件只能通过后端传值的方式进行vue页面渲染,用户是不能通过路由进行页面访问的
假设网站攻击者可以伪造后端返回结果,那这种情况下当然可以访问到dynamicComponent的页面,但同理,这种也可以访问到addRoute的页面,所以这点上两者安全性是一样的,并且项目开发中一般还会有token请求头,页面数据请求会进行校验,所以综上dynamicComponent解决方案比较addRoute方案并没有安全性问题

http://www.lryc.cn/news/22793.html

相关文章:

  • 带中转hub的卡车无人机车辆路径问题
  • 前端食堂技术周刊第 72 期:Signals 是前端框架的未来、Chrome Headless、ts-reset、magic-regexp、Bun 新文档
  • mysql中用逗号隔开的字段作查询用(find_in_set的使用)
  • Day902.Memory存储引擎 -MySQL实战
  • Linux(Centos)安装RabbitMQ+延时插件+开机自启动
  • 最近是遇到了CKPT(BLOCKED)
  • RabbitMQ死信队列
  • Word控件Spire.Doc 【书签】教程(1):在C#/VB.NET:在 Word 中插入书签
  • 微服务框架-学习笔记
  • 实验心理学笔记01:引论
  • 预备3-如何学习编程
  • 操作系统权限提升(十七)之绕过UAC提权-Windows令牌概述和令牌窃取攻击
  • 【时间之外】系统管人,能行?(冷眼旁观连载之二)
  • 【数据结构必会基础】关于树,你所必须知道的亿些概念
  • 设计模式的应用(已在大型项目中使用)
  • Git的相关用法
  • Linux服务:Nginx反向代理与负载均衡
  • 数据结构与算法——2.算法概述
  • BPMN2.0是什么,BPMN能解决企业流程管理中哪些问题?
  • Java线程池的基本工作原理及案例
  • Stacked hourglass networks for human pose estimation代码学习
  • SpringCloud(五)MQ消息队列
  • SQL语法基础汇总
  • 惠普星14Pro电脑开机不了显示错误代码界面怎么办?
  • 顺序表的构造及功能
  • cesium: 绘制线段(008)
  • HTML、CSS学习笔记4(3D转换、动画)
  • java的分布式锁
  • 17- TensorFlow实现手写数字识别 (tensorflow系列) (项目十七)
  • Polkadot 基础