vue3后台管理系统实现动态侧边导航菜单管理(ElementPlus组件)

在这里插入图片描述

记住 一级(el-sub-menu)的都是只是展示的 点击跳转的都是一级下的子级(el-menu-item)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

完整展示
在这里插入图片描述

1:在登陆功能进行登陆 获取menu列表
注册路由表的时候 把文件进行创建好 因为注册的方法需要获取这个路径
整个router下的main product等等都要创建

在这里插入图片描述
在这里插入图片描述

//1:发送你的用户名和密码获取token和用户信息**
//2:拿着token获取菜单列表接口 (我的项目封装的axios  ,这里演示的话就写这么个意思 知道就行)**const userMenuData=await axios.get('xxxx'{'token':'xxxxx'}) //3:保存在 vuex中//4:把菜单权限注入到路由表内const  mapMenusToRouters=(userMenus: any[])=> {console.log(userMenus, 'userMenus')// type==1说明有二级 type==2 就是二级// 保存处理好的路由。const routes: RouteRecordRaw[] = [];// 获取所有的路由文件const allRoutes: RouteRecordRaw[] = [];// 1先查询路由目录文件 获取main下的ts文件 const routeFiles = require.context('../router/main', true, /\.ts/)// 2  获取keys()  引入文件routeFiles.keys().forEach(key => {// 3切割文件./  .ts  const route = require('../router/main' + key.split('.')[1])// 4  把文件追加到数组 allRoutes中allRoutes.push(route.default)});const _recurseGetRoute = (menus: any[]) => {for (const menu of menus) {if (menu.type == 1) {_recurseGetRoute(menu.children ?? [])} else {// type==2  没有了子集const route = allRoutes.find((route) => {return route.path == menu.url})if (route) {routes.push(route)} }}}  _recurseGetRoute(userMenus)if (routes) {return routes} else {return []}}//记得 import {useStore}  from 'store';const store = useStore(); const userMenu = computed(() => {return store.state.login.userMenus;});  //调用函数进行处理
const routes = mapMenusToRouters(userMenus)//放在router.ts的main 下的children中=========>路由表注册完毕
routes.forEach((key: RouteRecordRaw) => router.addRoute('main', key)  )

2:侧边菜单界面

<template><div class="nav-menu"><div class="logo"><img class="img" src="~@/assets/img/logo.svg" alt="logo" /><span class="title" >vue3+ts</span></div><el-menu:default-active="dafaultValue"background-color="#0c2135"text-color="#b7bdc3":collapse="isCollapse"active-text-color="#0a60bd"class="el-menu-vertical"><template v-for="item in userMenu" :key="item.id"><template v-if="item.type == 1"><el-sub-menu :index="item.id + ''"><template #title><el-icon><Platform /></el-icon><span>{{ item.name }}</span></template><template v-for="subItem in item.children" :key="subItem.id"><el-menu-item:index="subItem.id + ''"@click="handleMenuItemClick(subItem)"><template #title><el-icon><Platform /></el-icon><span>{{ subItem.name }}</span></template></el-menu-item></template></el-sub-menu></template><template v-else-if="item.type === 2"><el-menu-item :index="item.id + ''"><span>{{ item.name }}</span></el-menu-item></template></template></el-menu></div>
</template>
<script setup lang="ts">
import { useRouter, useRoute } from "vue-router";import { useStore } from "@/store/index";//1:vuex获取菜单列表   const store = useStore(); const userMenu = computed(() => {return store.state.login.userMenus;}); //2:点击el-menu-item上的按钮跳转的函数const router = useRouter();const handleMenuItemClick = (item: any) => {// item.url不存在就跳转到自己定义的界面 比如404 (/not-found)router.push({ path: item.url ?? "/not-found" });
};
//3:  el-sub-menu上有一个属性是dafaultValue
//  意思是默认选择的路由菜单 不能写死 不然我刷新的时候 就不能显示当前的选中菜单,而是选中写死的菜单
//  比如 我写死的dafaultValue是用户管理,当前点击菜单管理进行刷新数据的时候 他会跑到用户管理里面 这是错误的const pathMapToMenus = (userMenu: any[], currentPath: string): any => {for (const menu of userMenu) {// 如果type==1  那么就是含有二级if (menu.type == 1) {console.log(menu)// 调用函数本身 把结果返回给我const findMenu = pathMapToMenu(menu.children ?? [], currentPath)if (findMenu) {return findMenu}// 如果type==2    那么直接判断后把结果返回给我} else if (menu.type == 2 && currentPath == menu.url) {console.log(menu, '2')return menu}}
}const route = useRoute();const currentPath = route.path;const menu = pathMapToMenu(userMenu.value, currentPath);const dafaultValue = ref(menu.id + "");
</script>

以上把侧边菜单展示实现了,, 但是实现跳转的话 路由表必须有相对应的路由

router/index.ts

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
import { accountLoginRequest, RequestUserInfoByid, RequestUserMenusByRoleId } from '@/service/login/login'; 
const routes: Array<RouteRecordRaw> = [{path: '/',redirect: '/main'},{path: '/login',name: 'login', component: () => import(/* webpackChunkName: "about" */ '../views/login/login.vue')},{path: '/main',name: 'main', redirect:'/main/system/user',component: () => import(/* webpackChunkName: "about" */ '../views/main/main.vue'),children:[]},{//404请求不存在的路径path: '/:pathMatch(.*)*',component: () => import('@/views/not-found/not-found.vue')}
]const router = createRouter({history: createWebHashHistory(),routes
})
// 导航守卫
router.beforeEach((to) => {if (to.path !== '/login') {const token = window.localStorage.getItem('token')if (!token) {return '/login'}  } 
})
console.log(router, 'router')
export default router

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

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

相关文章

k8s1.18.20通过cert-manager、kubed实现三个月免费证书自动续签

k8s1.18.20通过cert-manager、kubed实现三个月免费证书自动续签 一、cert-manager部署 参考&#xff1a;k8s1.18.20:cert-manager 1.8 安装部署 二、申请免费证书-letsencrypt 2.1、创建ClusterIssuer 向letsencrypt申请三个月免费证书 [rootk8s-node ~]# cat clusteriss…

Redis 从入门到精通【进阶篇】之Lua脚本详解

文章目录 0. 前言1. Redis Lua脚本简介1.1 Lua脚本介绍Lua语言概述&#xff1a;Lua脚本的特点&#xff1a; 1.2 Redis中为何选择LuaLua与Redis的结合优势Lua脚本在Redis中的应用场景 2. Redis Lua脚本的执行流程1. 加载脚本&#xff1a;1.1 脚本缓存机制&#xff1a;1.2 脚本加…

从MVC跨越到DDD微服务架构是如何演进的

微服务架构演进 领域模型中对象的层次从内到外依次是&#xff1a;值对象、实体、聚合和限界上下文。 实体或值对象的简单变更&#xff0c;一般不会让领域模型和微服务发生大变。但聚合的重组或拆分却可以。因为聚合内业务功能内聚&#xff0c;能独立完成特定业务。那聚合的重组…

TortoiseGit 入门指南12:创建标签

前面的文章不止一次的提到过 标签 &#xff08;Tag&#xff09;&#xff0c;我们在《TortoiseGit 入门指南08&#xff1a;浏览引用以及在引用间切换》一文中知道&#xff0c;标签 是一种 引用&#xff1b;还知道每个提交都对应着一个 SHA-1 值&#xff0c;而引用就是 SHA-1 的一…

什么是Java中的异常链,如何使用异常链来处理异常信息?

Java中的异常链是一种用于处理异常的技术&#xff0c;它允许您在捕获一个异常时继续向上查找引发该异常的异常。这可以帮助您更好地理解和管理异常&#xff0c;并使您的代码更加健壮和可靠。 想象一下&#xff0c;你在处理一个大型的、复杂的程序&#xff0c;它包含许多不同的…

麒麟系统设置nginx开机启动

1.创建nginx.service文件 vim /lib/systemd/system/nginx.service 文件内容&#xff1a; [Unit] Descriptionnginx service Afternetwork.target [Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/usr/local/…

算法刷题Day 43 最后一块石头的重量II+目标和+一和零

Day 43 动态规划 1049. 最后一块石头的重量II 注意第二个for循环那里不要漏了等于号 class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum accumulate(stones.begin(), stones.end(), 0);int target sum / 2;vector<int> dp(ta…

WPF ListBoxItem DataTempldate command绑定无效解决

出错代码&#xff1a; <TextBlockGrid.Row"1"Margin"16,0,16,8"VerticalAlignment"Center"Foreground"{DynamicResource MaterialDesignBodyLight}"Text"{Binding Password}"TextWrapping"Wrap"><materi…

pyqt中有connect用法的控件

在PyQt中&#xff0c;以下控件可以使用connect方法进行信号与槽的连接&#xff1a; QPushButton&#xff1a;连接点击按钮的信号clickedQAction&#xff1a;连接菜单项或工具栏按钮的信号triggeredQComboBox&#xff1a;连接选择项发生改变的信号currentIndexChangedQLineEdit…

使用Audition进行音频算法验证与设计实验方法

+v hezkz17进数字音频系统研究开发交流答疑 一 音频算法验证与设计三种方法 (1)Audition (2)matlab (3)嵌入式DSP开发平台 二 Audition 软件如何进行音频算法验证实验?  要在Audition软件中进行音频算法验证实验,可以按照以下步骤进行操作: 1 导入音频文件:打…

Redis常见须知

介绍一下redis数据库 Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符…

15 - 信号处理设计模式

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. Linux应用程序安全性讨论1.1 问题1.2 不同场景1.2.1 场景一&#xff1a;不需要处理信号1.2.2 场景二&#xff1a;需要处理信号 2. 场景…

一文读懂Mysql 优化之order by【百万乃至千万数据查询优化推荐】

一文读懂Mysql 优化之order by 驱动表与被驱动表概念复合索引的三大原则排序方式对比索引排序驱动表排序临时表排序排序算法驱动表与被驱动表概念 当使用left join时,左表是驱动表,右表是被驱动表当使用right join时,右表是驱动表,左表是被驱动表当使用join(inner join) …

python_day11_pymysql

SQL基础语法回忆 show DATABASES;use world;-- SELECT DATABASES();show TABLES;CREATE TABLE Student(id int,name VARCHAR(10),age int,gender VARCHAR(5&#xff09; );删除表 # 删除表 DROP TABLE Student;插入操作 insert into student(id) VALUES(1),(2),(3);insert i…

STM32使用高级定时器输出互补pwm波

STM32使用高级定时器输出互补pwm波 前言硬件和软件cubemx新建工程打开Debug模式配置时钟源六大时钟的作用选择Crystal/Ceramic Resonator&#xff0c;即使用外部晶振作为HSE的时钟源。 配置时钟配置高级定时器TIM8和通用定时器TIM3这里大概解释一下配置pwm输出用到的几个参数我…

【解决】 Android Studio Failed to find configured root that contains

问题出现 尝试将拍摄的图像存储至手机自定义的存储空间&#xff0c;不料却一直报错&#xff0c;主要问题是在使用 FileProvider 从文件路径中获取 Uri 时出现异常。 相关代码 报错区域的文件路径相关的代码 主要是在 File imageDir new File(getExternalCacheDir(), “Galler…

【Nginx08】Nginx学习:HTTP核心模块(五)长连接与连接处理

Nginx学习&#xff1a;HTTP核心模块&#xff08;五&#xff09;长连接与连接处理 HTTP 基础知识大家掌握的怎么样呀&#xff1f;对于长连接这一块的内容应该也不是什么新鲜东西了吧。毕竟 HTTP1.1 都已经发布这么久了。今天主要来看的就是长连接相关的配置&#xff0c;另外还会…

ylb-接口4投资排行榜

总览&#xff1a; 1、使用Redis存储投资信息 2、Redis常量类 在common模块constants包&#xff0c;创建一个Redis常量类&#xff08;RedisKey&#xff09;&#xff1a; package com.bjpowernode.common.constants;public class RedisKey {/*投资排行榜*/public static fin…

Qt5.15.2安装

解释一下 Qt 的版本号 比如 5.15.2 是完整的 Qt 版本号&#xff0c;第一个数字 5 是大版本号&#xff08;major&#xff09;&#xff0c;第二个数字 15 是小版本号&#xff08;minor&#xff09;&#xff0c;第三个数字 2 是补丁号&#xff08;patch&#xff09;。 只要前面两个…

oracle 如何连同空表一起导出成dmp的方法

1、oracle导出dmp文件的时候&#xff0c;经常会出现一些空表&#xff0c;没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口&#xff0c;把查询结果的sql&#…