使用vue-next-admin框架后台修改动态路由

vue-next-admin框架是一个基于 Vue 3 和 Vite 构建的后台管理系统框架。它采用了最新的前端技术栈,旨在提供一个高效、灵活、现代化的管理后台解决方案。该框架主要用于构建功能丰富且易于定制的管理后台应用,适合各种中大型项目。
 

其主要特点包括:

  1. Vue 3 和 Composition API:使用 Vue 3 的新特性,如 Composition API,提高了代码的可读性和可维护性。
  2. Vite 构建工具:使用 Vite 作为构建工具,提供更快的热重载速度和更优化的构建性能。
  3. 现代化的前端技术栈:包括 Vue Router、Vuex(或 Pinia)、Element Plus(或其他 UI 组件库),以及 TypeScript 支持。
  4. 高度可定制的界面和功能:支持多种主题切换、权限管理、动态路由、国际化等功能,方便开发人员根据需求进行二次开发和定制。
  5. 响应式设计:适应不同屏幕尺寸和设备,提升用户体验。

总的来说,Vue Next Admin 是一个功能强大、灵活、易于扩展的后台管理框架,适合用来开发现代化的后台管理系统。


Vue 动态路由的实现思路主要依赖于 Vue Router,动态路由允许根据用户的权限、角色、页面状态或其他因素动态地生成或改变路由配置。

今天我们要使用vue-next-admin框架通过后端动态的修改路由。


步骤如下:


1.首先,路由在src/router文件夹中。在router文件夹中有四个文件

backEnd.ts是后台控制路由的文件,我们需要使用后台控制时,需要修改里面的内容。
frontEnd.ts 是前端控制路由的文件。
index.ts 文件中,告诉我们需要后端控制路由时:isRequestRoutes 为 true
而修改isRequestRoutes的文件在src/stores/themeConfig

而修改isRequestRoutes的文件在src/stores/themeConfig文件夹中。
需要找到isRequestRoutes改为true。


route.ts 这个是路由文件,不管是后端还是前端控制,只要是需要出现的页面,都需要在这个页面进行注册。
现在我们就可以后端的控制路由。


2. 现在需要修改backEnd.ts文件中的内容。
 
获取路由菜单。


1.需要先给前端的数据关了,然后自己添加
 
2.我们需要转换数据格式,将一维数据转换为多维数据。
 3.数据转换完成后,需要对比路由

 backEnd.ts页面代码如下:

import { RouteRecordRaw } from 'vue-router';
import { storeToRefs } from 'pinia';
import pinia from '/@/stores/index';
import { useUserInfo } from '/@/stores/userInfo';
import { useRequestOldRoutes } from '/@/stores/requestOldRoutes';
import { Session } from '/@/utils/storage';
import { NextLoading } from '/@/utils/loading';
import { dynamicRoutes, notFoundAndNoPower } from '/@/router/route';
import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index';
import { useRoutesList } from '/@/stores/routesList';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { useMenuApi } from '/@/api/menu/index';
// import { console } from 'node:inspector';// 后端控制路由// 引入 api 请求接口
const menuApi = useMenuApi();/*** 获取目录下的 .vue、.tsx 全部文件* @method import.meta.glob* @link 参考:https://cn.vitejs.dev/guide/features.html#json*/
const layouModules: any = import.meta.glob('../layout/routerView/*.{vue,tsx}');
const viewsModules: any = import.meta.glob('../views/**/*.{vue,tsx}');
const dynamicViewsModules: Record<string, Function> = Object.assign({}, { ...layouModules }, { ...viewsModules });/*** 后端控制路由:初始化方法,防止刷新时路由丢失* @method NextLoading 界面 loading 动画开始执行* @method useUserInfo().setUserInfos() 触发初始化用户信息 pinia* @method useRequestOldRoutes().setRequestOldRoutes() 存储接口原始路由(未处理component),根据需求选择使用* @method setAddRoute 添加动态路由* @method setFilterMenuAndCacheTagsViewRoutes 设置路由到 pinia routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组*/
export async function initBackEndControlRoutes() {// 界面 loading 动画开始执行if (window.nextLoading === undefined) NextLoading.start();// 无 token 停止执行下一步if (!Session.get('token')) return false;// 触发初始化用户信息 pinia// https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HPawait useUserInfo().setUserInfos();// 获取路由菜单数据const res = await getBackEndControlRoutes();console.log(backendRoutes(arrayToTree(res.data), dynamicRoutes[0].children));// return;if (res.code === 0) {// 存储接口原始路由(未处理component),根据需求选择使用useRequestOldRoutes().setRequestOldRoutes(JSON.parse(JSON.stringify(res.data)));// 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由dynamicRoutes[0].children = backendRoutes(arrayToTree(res.data), dynamicRoutes[0].children);// 添加动态路由await setAddRoute();}// 无登录权限时,添加判断// https://gitee.com/lyt-top/vue-next-admin/issues/I64HVOif (res.data.length <= 0) return Promise.resolve(true);await setFilterMenuAndCacheTagsViewRoutes();NextLoading.done();
}// 对比路由
// routes 后端返回
//  dynamic 前端路由
function backendRoutes(routes, dynamic) {// 将dynamic转换为Map 以提高查找的效率const dynamicMap = new Map(dynamic.map((v) => [v.path, v]));const filteredRoutes = [];routes.forEach((item) => {const route = dynamicMap.get(item.path);if (route) {route.meta.title = item.title;route.meta.icon = item.icon;if (item.children && item.children.length > 0) {route.children = backendRoutes(item.children, route.children);}filteredRoutes.push(route);} else {console.warn('路由未定义:' + item.path);}});return filteredRoutes;
}
// 一维转树形
function arrayToTree(items) {// 存储最终的树形结构const result = [];// 用于快速查找节点const map = [];// 首先将所有节点放在map中,以id为键,值为节点items.forEach((item) => {map[item.id] = { ...item, children: [] };});// 然后遍历map,将子节点放在对应的父节点的children数组中items.forEach((item) => {if (item.pid === null || item.pid === 0 || item.pid === undefined) {// 如果父节点为0,则将当前节点放在result中result.push(map[item.id]);} else {// 否则,找到父节点并添加到当前节点的children数组中if (map[item.pid]) {map[item.pid].children.push(map[item.id]);}}});return result;
}
/*** 设置路由到 pinia routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组* @description 用于左侧菜单、横向菜单的显示* @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)*/
export async function setFilterMenuAndCacheTagsViewRoutes() {const storesRoutesList = useRoutesList(pinia);storesRoutesList.setRoutesList(dynamicRoutes[0].children as any);setCacheTagsViewRoutes();
}/*** 缓存多级嵌套数组处理后的一维数组* @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)*/
export function setCacheTagsViewRoutes() {const storesTagsView = useTagsViewRoutes(pinia);storesTagsView.setTagsViewRoutes(formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes))[0].children);
}/*** 处理路由格式及添加捕获所有路由或 404 Not found 路由* @description 替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由* @returns 返回替换后的路由数组*/
export function setFilterRouteEnd() {let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes));// notFoundAndNoPower 防止 404、401 不在 layout 布局中,不设置的话,404、401 界面将全屏显示// 关联问题 No match found for location with path 'xxx'filterRouteEnd[0].children = [...filterRouteEnd[0].children, ...notFoundAndNoPower];return filterRouteEnd;
}/*** 添加动态路由* @method router.addRoute* @description 此处循环为 dynamicRoutes(/@/router/route)第一个顶级 children 的路由一维数组,非多级嵌套* @link 参考:https://next.router.vuejs.org/zh/api/#addroute*/
export async function setAddRoute() {await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {router.addRoute(route);});
}/*** 请求后端路由菜单接口* @description isRequestRoutes 为 true,则开启后端控制路由* @returns 返回后端路由菜单数据*/
export function getBackEndControlRoutes() {let list = JSON.parse(localStorage.getItem('menus') || '[]');return {code: 0,type: 'adminMenu',data: list,};
}/*** 重新请求后端路由菜单接口* @description 用于菜单管理界面刷新菜单(未进行测试)* @description 路径:/src/views/system/menu/component/addMenu.vue*/
export async function setBackEndControlRefreshRoutes() {await getBackEndControlRoutes();
}/*** 后端路由 component 转换* @param routes 后端返回的路由表数组* @returns 返回处理成函数后的 component*/
export function backEndComponent(routes: any) {if (!routes) return;return routes.map((item: any) => {if (item.component) item.component = dynamicImport(dynamicViewsModules, item.component as string);item.children && backEndComponent(item.children);return item;});
}/*** 后端路由 component 转换函数* @param dynamicViewsModules 获取目录下的 .vue、.tsx 全部文件* @param component 当前要处理项 component* @returns 返回处理成函数后的 component*/
export function dynamicImport(dynamicViewsModules: Record<string, Function>, component: string) {const keys = Object.keys(dynamicViewsModules);const matchKeys = keys.filter((key) => {const k = key.replace(/..\/views|../, '');return k.startsWith(`${component}`) || k.startsWith(`/${component}`);});if (matchKeys?.length === 1) {const matchKey = matchKeys[0];return dynamicViewsModules[matchKey];}if (matchKeys?.length > 1) {return false;}
}

现在,后端动态路由修改完成。大家可以自己手动尝试一次。

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

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

相关文章

qiankun+vite+vue3

基座与子应用代码示例 本示例中,基座为Vue3,子应用也是Vue3,由于qiankun不支持Vite构建的项目,这里还要引入 vite-plugin-qiankun 插件 基座(主应用) 加载qiankun依赖 npm i qiankun -S qiankun配置(src/qiankun) src/qiankun/config.ts export default {subApp…

深度学习中Batch Normalization(BN)原理、作用浅析

最近做剪枝学习&#xff0c;其中一种是基于BN层的γ作为缩放因子进行剪枝的&#xff0c;那么我想搞懂BN的工作原理更好的理解网络、剪枝等&#xff0c;所以有了该文。 首先先说BN的作用在详细拆解&#xff0c;理解。以知乎一条高赞评论说明BN层到底在干什么。 Batch Norm 为什…

Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式 1.1、概念 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、 regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff0…

【16届蓝桥杯寒假刷题营】第1期DAY5

5.依依的询问最小值 - 蓝桥云课 问题描述 依依有个长度为 n 的序列 a&#xff0c;下标从 1 开始。 她有 m 次查询操作&#xff0c;每次她会查询下标区间在 [li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a&#xff0c;使得这 m 次查询的总和最小。 求你求出 m 次…

机器学习10-解读CNN代码Pytorch版

机器学习10-解读CNN代码Pytorch版 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习10-解读CNN代码Pytorch版1-核心逻辑脉络2-参考网址3-解读CNN代码Pytorch版本1-MNIST数据集读取2-CNN网络的定义1-无注释版…

【机器学习实战中阶】使用SARIMAX,ARIMA预测比特币价格,时间序列预测

数据集说明 比特币价格预测&#xff08;轻量级CSV&#xff09;关于数据集 致谢 这些数据来自CoinMarketCap&#xff0c;并且可以免费使用该数据。 https://coinmarketcap.com/ 数据集:链接: 价格预测器 源代码与数据集 算法说明 SARIMAX&#xff08;Seasonal AutoRegressive …

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1.标准版)

问题 项目里使用了 AzureBlob 存储了用户上传的各种资源文件&#xff0c;近期 AzureBlob 的流量费用增长很快&#xff0c;想通过分析Blob的日志&#xff0c;获取一些可用的信息&#xff0c;所以有了这个需求&#xff1a;将存储账户的日志&#xff08;读写&#xff0c;审计&…

【Red Hat8】:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…

Redis的Windows版本安装以及可视化工具

文章目录 redis安装redis安装包下载解压文件夹启动redis服务Redis路径配置环境变量打开redis客户端进行连接基础操作测试 redis可视化工具下载Redis Desktop Manager redis安装 redis安装包下载 windows版本readis下载&#xff1a;Releases tporadowski/redis 解压文件夹 我…

汽车钥匙发展史

介绍 最近在研究UWB数字钥匙的过程中&#xff0c;了解到汽车钥匙在短短的100多年以来的发展历程&#xff0c;让我不禁感慨科技的发展速度&#xff0c;本文主要介绍汽车发展过程中&#xff0c;车钥匙形态变化的历程及技术原理。 总体概述&#xff0c;汽车钥匙的发展&#xff0…

react install

react 安装 React 是一个用于构建用户界面的 JavaScript 库。以下是安装 React 的步骤&#xff1a; 使用 Create React App Create React App 是一个官方支持的命令行工具&#xff0c;用于快速搭建 React 应用。 安装 Node.js 和 npm 确保你的计算机上安装了 Node.js 和 npm…

Ubuntu如何安装redis服务?

环境&#xff1a; Ubuntu22.04 WSL2 问题描述&#xff1a; 如何安装redis服务&#xff1f; 解决方案&#xff1a; 1.在 Linux 上&#xff08;如 Ubuntu/Debian&#xff09;安装 1.通过包管理工具安装 Redis 服务器&#xff1a; sudo apt update sudo apt install redis…

element el-table合并单元格

合并 表格el-table添加方法:span-method"” <el-table v-loading"listLoading" :data"SHlist" ref"tableList" element-loading-text"Loading" border fit highlight-current-row :header-cell-style"headClass" …

【BUUCTF】[GXYCTF2019]BabySQli

进入页面如下 尝试万能密码注入 显示这个&#xff08;qyq&#xff09; 用burp suite抓包试试 发现注释处是某种编码像是base编码格式 MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 可以使用下面这个网页在线工具很方便…

R语言基础| 回归分析

写在前面 R语言拥有丰富的数据处理、统计分析和机器学习工具包&#xff0c;涵盖了从简单的描述统计到复杂的模型建立的各个方面。再加上数据的处理可以完美的衔接后续的可视化&#xff0c;这使得它成为处理各种类型和规模的数据集的理想选择。回归分析是统计学中一种用于探究自…

高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计

三、CentralCache&#xff08;中心缓存&#xff09;_内存设计 &#xff08;一&#xff09;Span的创建 // 页编号类型&#xff0c;32位下是4byte类型&#xff0c;64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…

【云网】云网络基础概念(华为云)

云网络基础概念&#xff08;华为云&#xff09; 一、虚拟网络 1、VPC概念 华为云提供的虚拟网络环境的基础单元是虚拟私有云&#xff08;Virtual Private Cloud&#xff09;。 VPC和传统的物理三层网络类似,也包括路由器、子网、子网网关、IP地址等传统概念。 典型组网逻辑…

WPF2-在xaml为对象的属性赋值

1. AttributeValue方式 1.1. 简单属性赋值1.2. 对象属性赋值 2. 属性标签的方式给属性赋值3. 标签扩展 (Markup Extensions) 3.1. StaticResource3.2. Binding 3.2.1. 普通 Binding3.2.2. ElementName Binding3.2.3. RelativeSource Binding3.2.4. StaticResource Binding (带参…

【经验分享】ARM Linux-RT内核实时系统性能评估工具

【经验分享】ARM Linux-RT内核实时系统性能评估工具 前言下载和编译方法常用工具介绍总结 前言 最近在研究Linux-RT实时系统&#xff0c;介绍下常用的实时系统的性能评估工具。 下载和编译方法 用git下载 git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.…

基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践

在现代 Web 开发中&#xff0c;前后端分离的架构已经成为主流。本文将分享如何使用 Spring Boot 和 Vue.js构建一个全栈购物平台&#xff0c;涵盖从后端 API 开发到前端页面实现的完整流程。 1. 技术栈介绍 后端技术栈 JDK 1.8&#xff1a;稳定且广泛使用的 Java 版本。 Spring…