vue动态路由效果
vue框架安装文档安装 | vue-next-adminhttps://lyt-top.github.io/vue-next-admin-doc-preview/home/install/一动态路由修改1. 配置代理路径vite.config.ts修改修改其proxy代理25到38行左右根据接口不同其代理名称不同server: { host: 0.0.0.0, port: env.VITE_PORT as unknown as number, open: JSON.parse(env.VITE_OPEN), hmr: true, proxy: { /pc: { target: 接口地址, changeOrigin: true, }, }, },2. 修改响应式拦截效果位置src/utils/request.ts38行左右修改将if (res.code res.code ! 0) { 修改成 if (res.code ! undefined res.code ! 0 res.code ! 1) {service.interceptors.response.use( (response) { // 对响应数据做点什么 const res response.data; if (res.code ! undefined res.code ! 0 res.code ! 1) { // token 过期或者账号已在别处登录 if (res.code 401 || res.code 4001) { Session.clear(); // 清除浏览器全部临时缓存 window.location.href /; // 去登录页 ElMessageBox.alert(你已被登出请重新登录, 提示, {}) .then(() {}) .catch(() {}); } return Promise.reject(service.interceptors.response); } else { return res; } }, (error) { // 对响应错误做点什么 if (error.message.indexOf(timeout) ! -1) { ElMessage.error(网络超时); } else if (error.message Network Error) { ElMessage.error(网络连接错误); } else { if (error.response.data) ElMessage.error(error.response.statusText); else ElMessage.error(接口路径找不到); } return Promise.reject(error); } );3. 修改请求接口位置src/api/login/index.ts修改将signIn中的url改成登录接口路径4. 在登录页中请求登录接口位置src/views/login/component/account.vue修改1. 引入登录接口import { useLoginApi } from //api/login/index;2. 声明变量 const loginApi useLoginApi();3. 请求接口// 登录 const onSignIn async () { state.loading.signIn true; try { // 1、调用登录接口参数username、password const res await loginApi.signIn({ username: state.ruleForm.userName, password: state.ruleForm.password, }); // 2、接口成功标志 code 1或200 if (res.code ! 1 res.code ! 200) { ElMessage.error(res.msg || 登录失败); return; } // 3、存储 token 到浏览器缓存必须用 Session.set模板路由守卫 / request 拦截器都用 Session.get(token) 读 Cookie存 localStorage 读不到会导致路由初始化失败、加载动画卡死 Session.set(token, res.data.token); // 4、存储用户信息接口 userinfo 需转成模板所需的 userInfos 结构供 /src/stores/userInfo.ts 使用 Session.set(userInfo, { userName: res.data.userinfo.username, photo: res.data.userinfo.avatar ? 地址${res.data.userinfo.avatar} : , time: new Date().getTime(), roles: res.data.userinfo.role_id 1 ? [admin] : [common], authBtnList: [btn.add, btn.del, btn.edit, btn.link], }); // 5、存储后端菜单数据供后端控制路由 isRequestRoutestrue 时使用 Session.set(menuList, res.data.menus); // 6、初始化路由 if (!themeConfig.value.isRequestRoutes) { // 前端控制路由2、请注意执行顺序 const isNoPower await initFrontEndControlRoutes(); signInSuccess(isNoPower); } else { // 后端控制路由isRequestRoutes 为 true则开启后端控制路由 // 添加完动态路由再进行 router 跳转否则可能报错 No match found for location with path / const isNoPower await initBackEndControlRoutes(); // 执行完 initBackEndControlRoutes再执行 signInSuccess signInSuccess(isNoPower); } } catch (error) { // 请求失败request.ts 拦截器已弹出错误提示 } finally { state.loading.signIn false; } };4. 开启动态路由位置 src/stores/themeConfig.ts修改将 isRequestRoutes: false,改为 isRequestRoutes: true,134行左右并在最后的setThemeConfig中加上 this.themeConfig.isRequestRoutes true;5. 菜单数据渲染到左侧菜单栏中位置: src/router/backEnd.ts修改删除 import { useMenuApi } from //api/menu/index;和const menuApi useMenuApi();动态路由请求效果。并修改以下内容92到118行左右/** * 添加动态路由 * 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); }); } // 有子菜单的父级菜单统一使用子路由出口组件 const parentComponent /layout/routerView/parent; // 无对应页面的菜单统一指向 404 const noPageComponent /error/404; // 模块加载时快照 route.ts 中 dynamicRoutes.children 定义的业务路由。 // 后续 dynamicRoutes[0].children 会被接口菜单覆盖但此快照始终保留 route.ts 的原始定义 const staticRouteList dynamicRoutes[0].children || []; /** * 获取路由菜单 * description 菜单数据在登录接口返回时已存入 Session(menuList)此处读取并转换为路由所需格式 * returns 返回 { data: 嵌套路由菜单 } */ export function getBackEndControlRoutes() { const menus Session.get(menuList) || []; const tree formatBackMenu(menus); return Promise.resolve({ data: tree }); } /** * 从 route.ts 的 dynamicRoutes.children 中提取 path → 路由配置 * 供接口菜单匹配页面组件只需在 route.ts 的 dynamicRoutes.children 中定义业务页面路由 * 即可实现「点击接口返回的树形菜单 → 显示对应页面」未在 route.ts 中定义 path 的菜单进入 404 */ const getStaticRouteMap () { const routeMap new Mapstring, any(); staticRouteList.forEach((r: any) { routeMap.set(r.path.replace(/^\//, ), r); }); return routeMap; }; /** * 将接口返回的扁平菜单pid 关联转成嵌套树并补全路由所需字段 * param menus 接口返回的 menus 数组 * returns 嵌套路由菜单数组 */ export function formatBackMenu(menus: any) { const map new Mapnumber, any(); menus.forEach((m: any) { map.set(m.id, { ...m, component: , meta: { title: m.title, icon: m.icon, isKeepAlive: true }, children: [] as any[], }); }); // 构建 route.ts 业务路由的 path → 路由 查找表 const routeMap getStaticRouteMap(); const tree: any[] []; map.forEach((item) { if (item.pid 0 || !map.has(item.pid)) { tree.push(item); } else { map.get(item.pid).children.push(item); } }); // 递归拼接完整 path、生成唯一 name、补 component / redirect const setTree (list: any[], parentPath: string) { list.forEach((item) { item.path ${parentPath}/${item.path.replace(/^\//, )}; item.name ${item.path.replace(/[^a-zA-Z0-9]/g, )}_${item.id}; if (item.children.length 0) { item.component parentComponent; // 先递归拼接子菜单完整 path再取其第一个作为父级默认跳转 setTree(item.children, item.path); item.redirect item.children[0].path; } else { // 从 route.ts 的 dynamicRoutes.children 中按 path 匹配页面组件 const matched routeMap.get(item.path.replace(/^\//, )); if (matched) { item.component matched.component; // 合并 route.ts 中定义的路由 metatitle/icon 等接口菜单数据优先 item.meta { ...item.meta, ...(matched.meta || {}) }; } else { item.component noPageComponent; } } }); }; setTree(tree, ); return tree; }6. 修改路由页面无用页面路径位置 src/router/route.ts修改完整页面内容如下若要添加页面需要在export const dynamicRoutes: ArrayRouteRecordRaw [ 内容中的children中进行修改import { RouteRecordRaw } from vue-router; // 扩展 RouteMeta 接口 declare module vue-router { interface RouteMeta { title?: string; isLink?: string; isHide?: boolean; isKeepAlive?: boolean; isAffix?: boolean; isIframe?: boolean; roles?: string[]; icon?: string; } } /** * 定义动态路由 */ export const dynamicRoutes: ArrayRouteRecordRaw [ { path: /, name: /, component: () import(//layout/index.vue), redirect: /home, meta: { isKeepAlive: true, }, children: [ // 首页 { path: /home, name: home, component: () import(//views/home/index.vue), meta: { title: 首页, icon: iconfont icon-barcode-qr, isKeepAlive: true, }, }, // 创业/就业 { path: /article, name: article, // 根据图1路径 src/views/chart/index.vue 进行引入 component: () import(//views/chart/index.vue), meta: { title: 创业/就业, icon: iconfont icon-gerenzhongxin, isKeepAlive: true, roles: [admin, common], }, }, ], }, ]; /** * 定义404、401界面 */ export const notFoundAndNoPower [ { path: /:path(.*)*, name: notFound, component: () import(//views/error/404.vue), meta: { title: message.staticRoutes.notFound, isHide: true, }, }, { path: /401, name: noPower, component: () import(//views/error/401.vue), meta: { title: message.staticRoutes.noPower, isHide: true, }, }, ]; /** * 定义静态路由默认路由 */ export const staticRoutes: ArrayRouteRecordRaw [ { path: /login, name: login, component: () import(//views/login/index.vue), meta: { title: 登录, }, }, ];二 其他内容修改1. 去除水印效果位置src/stores/themeConfig.ts修改 isWartermark的true改为false105行左右若修改完后还是有水印给其加上强制去除水印的效果在setThemeConfig中加上 this.themeConfig.isWartermark false;2. 关闭赞助商位置src/App.vue修改删除Sponsors /第8行和const Sponsors defineAsyncComponent(() import(//layout/sponsors/index.vue));29行内容

相关新闻

基于python的语音标注及审核系统1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于python的语音标注及审核系统1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于python的语音标注及审核系统1(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 一、商品介绍 二、技术介绍 技术栈:B/S 结构、Django 框架、MySQL 数据库、python 语言 三、功能介绍 数据集管理功能描述:为语音工作人…

2026/10/10 7:18:53 阅读更多 →
软考 系统架构设计师历年真题集萃(318)—— 2026年5月系统架构设计师真题11

软考 系统架构设计师历年真题集萃(318)—— 2026年5月系统架构设计师真题11

接前一篇文章:软考 系统架构设计师历年真题集萃(317)—— 2026年5月系统架构设计师真题10 第631题 中断相关操作,( )不是由操作系统完成的。 A. 提供中断服务 B. 保存被中断程序的断点 C. 初始化中断向量表 D. 保存通用寄存器 正确答案:B。 试题解析: 处理流程 …

2026/10/9 16:35:14 阅读更多 →
Ryujinx Switch模拟器完全指南:PC上免费畅玩4300+款Switch游戏

Ryujinx Switch模拟器完全指南:PC上免费畅玩4300+款Switch游戏

Ryujinx Switch模拟器完全指南:PC上免费畅玩4300款Switch游戏 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想要在电脑上体验《塞尔达传说:旷野之息》的壮丽世…

2026/9/29 14:04:52 阅读更多 →

最新新闻

Lua语言从入门到实战:语法、元表与避坑指南

Lua语言从入门到实战:语法、元表与避坑指南

Lua是我见过脾气最好的一门脚本语言。它不是那种一上来就让你背一大堆设计模式的“重型框架”,也没有复杂的编译链路——一个解释器加标准库,加起来也就几百KB,往宿主程序里一嵌,说跑就跑。不管你是写游戏的、调嵌入式设备的、还是…

2026/10/10 8:01:35 阅读更多 →
二叉树层序遍历C语言实现:队列与BFS实战详解

二叉树层序遍历C语言实现:队列与BFS实战详解

数据结构学到二叉树,你八成会先被前序、中序、后序遍历折腾一轮。等终于分清了“根左右”、“左根右”、“左右根”,实验报告或者考研复习题里往往又冒出来一个“层序遍历”。我第一次写层序遍历时,第一反应是:好嘛,又…

2026/10/10 8:01:35 阅读更多 →
DeepSeek本地部署与API接入:Ollama、ChatBox、Cherry Studio全流程

DeepSeek本地部署与API接入:Ollama、ChatBox、Cherry Studio全流程

简介:面向有一定技术背景、希望在本地完成大模型私有化部署的开发者和研发团队,教程以DeepSeek R1本地部署为起点,带读者走通Ollama环境搭建、多尺寸模型选择与运行、API密钥配置,以及通过Cherry Studio构建企业级私有知识库的完整…

2026/10/10 8:01:35 阅读更多 →
Spring Bean 生命周期、作用域与三级缓存:从入门到源码原理

Spring Bean 生命周期、作用域与三级缓存:从入门到源码原理

Spring 的 Bean 这一个主题,说难不难,说简单也真的不简单。很多人用 Spring 用了一两年,Autowired和Service用得飞起,但一旦面试官问"Bean 的生命周期是怎样的""三级缓存到底是怎么解决循环依赖的"&#xff0…

2026/10/10 8:01:35 阅读更多 →
Elasticsearch核心原理与生产环境集群部署实践指南

Elasticsearch核心原理与生产环境集群部署实践指南

搜索引擎选型这件事,这几年我前前后后接触了不少团队。很多团队一上来就拍板用 Elasticsearch(以下简称 ES),不管什么数据都往里面塞,结果集群跑得歪歪扭扭,不是堆内存溢出就是分片分配失败。反过来说&…

2026/10/10 8:01:35 阅读更多 →
PBR、MQC与策略路由的关系解析:从概念到实战

PBR、MQC与策略路由的关系解析:从概念到实战

1. 这三个词放在一起,不是巧合——PBR、MQC与策略路由的本质关联你有没有在配置某台设备时,看到文档里同时出现“PBR”“MQC”“策略路由”这几个词,却越看越糊涂?明明都是“按规则转发流量”,为什么需要三套术语&…

2026/10/10 8:00:34 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →