Vue3.5 企业级管理系统实战(二十二):动态菜单

在前几篇内容中已完成菜单、角色及菜单权限等相关开发,若要在左侧菜单根据用户角色动态展示菜单,需对 Sidebar 中的相关数据进行修改。鉴于其他相关方法及类型已在前文实现,本文不再重复阐述。

1 修改 Sidebar 组件

在 src/layout/components/Sidebar/index.vue 中修改路由数据来源,更新为动态生成的菜单,代码如下:

//src/layout/components/Sidebar/index.vue
<template><div><!-- 侧边栏Logo组件,根据配置决定是否显示,并响应侧边栏折叠状态 --><logo v-if="sidebarLogo" :collapse="sidebar.opened"></logo><!-- Element UI菜单组件,配置了背景色、文本颜色和激活项颜色 --><el-menuborder-noneclass="sidebar-container-menu":default-active="defaultActive":background-color="variables.menuBg":text-color="variables.menuText":active-text-color="theme":collapse="sidebar.opened"><!-- 动态生成菜单项,menuRoutes包含了所有需要显示的菜单项 --><sidebar-itemv-for="route in menuRoutes":key="route.path":item="route"/><!-- 增加父路径,用于el-menu-item渲染的时候拼接 --></el-menu></div>
</template><script lang="ts" setup>
// 导入应用状态管理相关模块
import { useAppStore } from "@/stores/app";
// 导入样式变量
import variables from "@/style/variables.module.scss";
// 导入设置状态管理
import { useSettingStore } from "@/stores/settings";
// 导入菜单状态管理
import { useMenuStore } from "@/stores/menu";// 获取菜单状态
const meuStore = useMenuStore();// 计算属性:响应式菜单数据,来自状态管理中的权限菜单树
const menuRoutes = computed(() => meuStore.state.authMenuTreeData);// 获取当前路由信息
const route = useRoute();// 获取侧边栏状态(展开/折叠)
const { sidebar } = useAppStore();// 计算属性:当前激活菜单项,默认使用当前路由路径
const defaultActive = computed(() => {// .....return route.path;
});// 获取设置状态
const settingsStore = useSettingStore();
// 计算属性:主题颜色,响应式更新
const theme = computed(() => settingsStore.settings.theme);// 计算属性:侧边栏Logo显示控制,响应式更新
const sidebarLogo = computed(() => settingsStore.settings.sidebarLogo);
</script><style scoped></style>

2 修改 SidebarItem 组件

修改 src/layout/components/Sidebar/SidebarItem.vue 中的路径解析方法,代码如下:

//src/layout/components/Sidebar/SidebarItem.vue
<template><!-- 当菜单项没有设置hidden为true时显示 --><template v-if="!item.meta?.hidden"><!-- 情况1:如果只有一个子菜单且没有设置alwaysShow,直接渲染子菜单项 --><sidebar-item-linkv-if="filteredChildren.length <= 1 && !item.meta?.alwaysShow":to="resolvePath(singleChildRoute.path)"><el-menu-item :index="resolvePath(singleChildRoute.path)"><el-icon v-if="iconName"><!-- 显示菜单项图标 --><svg-icon :icon-name="iconName" /></el-icon><!-- 菜单项标题 --><template #title>{{ singleChildRoute.meta.title }}</template></el-menu-item></sidebar-item-link><!-- 情况2:有多个子菜单或设置了alwaysShow,渲染为下拉菜单 --><el-sub-menu v-else :index="item.path"><template #title><el-icon v-if="iconName"><!-- 父菜单项图标 --><svg-icon :icon-name="iconName" /></el-icon><!-- 父菜单项标题 --><span>{{ item.meta?.title }}</span></template><!-- 递归渲染子菜单项 --><sidebar-itemv-for="child of filteredChildren":key="child.path":item="child"></sidebar-item></el-sub-menu></template>
</template><script lang="ts" setup>
// 导入路径校验工具和菜单项类型定义
import { isExternal } from "@/utils/validate";
import type { ITreeItemDataWithMenuData } from "@/utils/generateTree";// 定义组件props,接收菜单项数据
const { item } = defineProps<{item: ITreeItemDataWithMenuData;
}>();// 计算属性:过滤掉隐藏的子菜单项
const filteredChildren = computed(() =>(item.children || []).filter((child) => !child.meta?.hidden)
);// 计算属性:确定当前要渲染的菜单项
// 如果只有一个子菜单,渲染子菜单;否则渲染当前菜单项
const singleChildRoute = computed(() =>filteredChildren.value.length === 1 ? filteredChildren.value[0] : { ...item }
);// 计算属性:获取菜单项图标
const iconName = computed(() => singleChildRoute.value.meta?.icon);// 路径解析函数:处理菜单项路径
// 外部链接直接返回,内部链接可能需要拼接父路径
const resolvePath = (childPath: string) => {if (isExternal(childPath)) {return childPath;}return childPath;
};
</script>

下一篇将继续探讨 权限指令的实现,敬请期待~ 

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

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

相关文章

014校园管理系统技术解析:构建智慧校园管理平台

校园管理系统技术解析&#xff1a;构建智慧校园管理平台 在教育信息化快速发展的当下&#xff0c;校园管理系统成为提升学校管理效率、优化校园服务的重要工具。该系统集成院校管理、投票管理等多个核心模块&#xff0c;面向管理员、用户和院内管理员三种角色&#xff0c;通过…

创新农业社会化服务 中和农信服务小农户的探索实践

在实现乡村振兴的道路上&#xff0c;如何让现代农业发展成果惠及广大小农户&#xff0c;是一个重要课题。作为国内领先的综合助农机构&#xff0c;中和农信多年来深耕农村市场&#xff0c;在服务小农户方面进行了诸多创新探索&#xff0c;走出了一条具有示范意义的农业社会化服…

6.3 day 35

知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观推理的写法&#xff1a;评估模式 可视化 理解深度学习网络最重要的2点&#xff1a; 1.了解损失如何定…

【如何在IntelliJ IDEA中新建Spring Boot项目(基于JDK 21 + Maven)】

AA. 我的开发环境配置与核心工具链解析 一、开发环境全览 C:\Users\Again>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (build 21.0.112-LTS-29, mixed m…

【C++高级主题】多重继承下的类作用域

目录 一、类作用域与名字查找规则&#xff1a;理解二义性的根源 1.1 类作用域的基本概念 1.2 单继承的名字查找流程 1.3 多重继承的名字查找特殊性 1.4 关键规则&#xff1a;“最近” 作用域优先&#xff0c;但多重继承无 “最近” 二、多重继承二义性的典型类型与代码示…

登录vmware vcenter报vSphere Client service has stopped working错误

一、问题 登录vmware vcenter时发现报vSphere Client service has stopped working错误&#xff0c;导致vcenter控制台进不去 二、解决办法 打开vmware vcenter管理https://vcenterIP:5480&#xff0c;选择VMware vSphere Client&#xff0c;重启该服务后恢复正常。

MySQL关系型数据库学习

学习参考链接&#xff1a;https://www.runoob.com/mysql/mysql-tutorial.html Windows 安装MYSQL服务端的步骤&#xff1a;https://www.runoob.com/w3cnote/windows10-mysql-installer.html 1. 概念学习 MySQL 是一种关联数据库管理系统&#xff0c;关联数据库将数据保存在不…

web攻防之SSTI 注入漏洞

知识简介 &#xff1a; 模版引擎和框架的区别 ssti的中文翻译 &#xff1a; 服务端的模版的注入 模版引擎 &#xff1a;前端的用于装饰优化html的模版 最简单的就是在腾讯会议中的聊天功能 框架 &#xff1a; 这个是一套独立存在的逻辑 如TP他是一个区别于php语法的后端逻辑…

【清晰教程】利用Git工具将本地项目push上传至GitHub仓库中

Git 是一个分布式版本控制系统&#xff0c;由 Linus Torvalds 创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。GitHub 是一个基于 Git 的代码托管平台&#xff0c;提供了额外的协作和社交功能&#xff0c;使项目管理更加高效。它们为项目代码管理、团队协作和持…

极简以太彩光网络解决方案4.0正式发布,“彩光”重构园区网络极简之道

5月28日下午,锐捷网络在京举办以“光,本该如此‘简单’”为主题的发布会,正式发布极简以太彩光网络解决方案4.0。作为“彩光”方案的全新进化版本,极简以太彩光4.0从用户需求出发,聚焦场景洞察,开启了一场从底层基因出发的极简革命,通过架构、部署、运维等多维度的创新升级,以强…

Selenium 中 JavaScript 点击的优势及使用场景

*在 Selenium 自动化测试中&#xff0c;使用 JavaScript 执行点击操作&#xff08;如driver.execute_script("arguments[0].click();", element)&#xff09;相比直接调用element.click()有以下几个主要优势&#xff1a; 1. 绕过元素不可点击的限制 问题场景&#x…

CppCon 2014 学习:Cross platform GUID association with types

类型的 GUID&#xff08;全局唯一标识符&#xff09; 是在 COM 编程&#xff08;Component Object Model&#xff09; 和某些大型 C 架构&#xff08;如 Office、DirectX、跨 DLL 接口&#xff09;中关联类型信息和实现运行时类型识别与动态接口查询的重要机制。 下面我们分层解…

Android 11以上App主动连接WIFI的完整方案

早期Android版本App内连接指定的WIFI还是比较简单的&#xff0c;但是随着Android版本的提升&#xff0c;限制也越来越多。以下是一套完整的Android 11以上的WIFI应用内主动连接方案。 第一步&#xff1a;添加到建议连接&#xff1a; val wifiManager getSystemService(WIFI_…

让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作

让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作 一、AI也能谱出动人的旋律?真不是科幻! 还记得小时候学钢琴时老师的那句经典:“感觉不到情绪的乐句,是没灵魂的。” 当时我一边练琴一边想:要是有个机器能帮我写谱、调性又不跑调就好了! 结果几年后,真被我碰…

机器学习:集成学习概念、分类、随机森林

本文目录&#xff1a; 一、集成学习概念**核心思想&#xff1a;** 二、集成学习分类&#xff08;一&#xff09;Bagging集成&#xff08;二&#xff09;Boosting集成(三&#xff09;两种集成方法对比 三、随机森林 一、集成学习概念 集成学习是一种通过结合多个基学习器&#…

YOLO机械臂丨使用unity搭建仿真环境,YOLO算法识别,Moveit2控制

文章目录 前言搭建开发环境在window中安装Unity创建Docker容器&#xff0c;并安装相关软件运行测试改进添加删除节点前的函数调用 报错❌框选节点的时候报错❌如果无法控制机械臂&#xff0c;查看rviz2的终端&#xff0c;应该会有❌规划路径超出范围 参考 前言 本项目介绍通过…

Docker 插件生态:从网络插件到存储插件的扩展能力解析

Docker 容器技术以其轻量、快速、可移植的特性,迅速成为构建和部署现代应用的核心工具。然而,尽管 Docker Engine 自身功能强大,但在面对多样化的生产环境和复杂业务需求时,仅靠核心功能往往无法满足所有场景。 例如,跨主机的容器网络通信、异构存储系统的持久化数据管理…

飞牛fnNAS使用群辉DSM系统

目录 一、Virtual DSM简介 二、在飞牛NAS中安装 1、激活Docker 2、建立路径 3、创建Compose项目 4、容器启动 (1)构建容器 (2)容器启动 5、查看日志 6、登录DSM地址 7、安装完成 8、安装套件示例 9、远程访问 10、测试 (1)PC浏览器创建笔记 (2)手机创建…

关于FPGA软核的仿真(一)

MicroBlaze是Xilinx专为FPGA设计的软核处理器&#xff0c;其本质是通过FPGA的可编程逻辑资源&#xff08;如查找表LUT、触发器Flip-Flop&#xff09;动态构建的处理器架构&#xff0c;其本质为搭建处理器电路。MicroBlaze上运行嵌入式C代码程序&#xff0c;通过CoreConnect总线…

户外摄像头监控如何兼顾安全实时监控

一、技术手段提升隐私安全性 硬件与功能设计 采用支持隐私保护技术的设备&#xff0c;例如带电子开关的摄像头&#xff08;可远程控制摄像头启闭&#xff09;3&#xff0c;或搭载本地AI算法的设备&#xff0c;仅识别人形、车辆等目标&#xff0c;减少无关信息采集。 使用安全…