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,一经查实,立即删除!

相关文章

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 的一…

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. 场景…

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输出用到的几个参数我…

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&#…

GSV6201替代方案|CS5466设计资料|CS5466原理图|typec转HDMI_8k方案芯片

GSV6201是一款高性能、低功耗、高性能的&#xff0c;USB Type-C备用模式显示端口1.4至HDMI 2.1转换器。通过集成增强型微控制器&#xff0c;GSV6201创造了一个经济高效的解决方案提供了上市时间优势。显示端口接收机支持高达32.4Gbps&#xff08;HBR3&#xff0c;4通道&#xf…

uniapp和uview组件实现下拉触底刷新列表

下面是一个在UniApp中使用uView组件实现下拉触底刷新列表的示例&#xff0c;并使用Axios来请求分页数据列表&#xff1a; 首先&#xff0c;确保你已经在UniApp项目中添加了uView组件库。你可以在项目根目录执行以下命令安装它们&#xff1a; npm install uview-ui或者使用 Hb…

曲师大2023大一新生排位赛-D.Factor题解

D.Factor 题目描述 你有一个集合 &#xff0c;和具有 个正整数的数组 . 最初&#xff0c;集合 为空&#xff08;不包含任一元素&#xff09;。你将按照以下方式填充集合 : 以此枚举数组 a 中的每个元素。对于数组中的第 i 个元素 &#xff0c;生成 ​ 的因子集合 ​。如果…

使用对象解构赋值,将对象的某些属性赋值给另一个对象

在处理接口返回的数据时&#xff0c;我需要将接口返回的数据&#xff08;对象&#xff09;的某些属性用另一个对象进行接收&#xff0c;学习对象解构赋值之前&#xff0c;我一直使用的都是最笨的方法&#xff1a; this.formData.projectId res.data.projectId this.formData.…

idea中常用的快捷键

快捷键: 1.快速生成main方法 main/psvm public static void main(String[] args) {} 2.快速复制当前行的代码: ctrld 3.快速捕获异常: altctrlt 4.快速打印结果: sout/soutv System.out.println(s); System.out.println("s " s); 5.自动生成对象的返回值…

【运维工程师学习六】LAM部署搭建个人Discuz论坛

【运维工程师学习六】LAM部署搭建个人Discuz论坛 1、先卸载Mariadb再安装Mysql2、MySQL官网rpm包下载3、在rpm包路径下安装 YUM Repo 文件4、更新软件仓库本地数据库信息5、开始部署——php的安装6、搜索yum包7、开始部署——配置apache以支持php&#xff08;1&#xff09;配置…

GitHub上整理的一些实用的工具

1. Visual Studio Code 简称VScode&#xff0c;是一个轻量且强大的跨平台开源代码编辑器&#xff08;IDE&#xff09;&#xff0c;支持Windows&#xff0c;OS X和Linux。内置JavaScript、TypeScript和Node.js支持&#xff0c;而且拥有丰富的插件生态系统&#xff0c;可通过安装…

SylixOS下SSH和SFTP连接

简要 基于网络的连接&#xff08;telnet&#xff0c;ftp&#xff09;方便高效&#xff0c;但其是基于明文的通信&#xff0c;容易被窃取、篡改和攻击&#xff0c;存在网络安全问题&#xff0c;尤其在进行远程访问时&#xff0c;穿过复杂未知的公网环境非常危险&#xff0c;为此…

ELK-日志服务【es-安装使用】

目录 【1】安装-配置elasticsearch&#xff08;01、02、03相同&#xff09; 端口 【2】安装-配置-启动-Kibana 【3】浏览器访问测试&#xff08;10.0.0.21:5601&#xff09; 【4】使用kibana创建、更新、删除es索引、文档 【5】组es集群&#xff08;投票选举机制&#xf…

【多线程】(六)Java并发编程深度解析:常见锁策略、CAS、synchronized原理、线程安全集合类和死锁详解

文章目录 一、常见锁策略1.1 乐观锁和悲观锁1.2 读写锁1.3 重量级锁和轻量级锁1.4 自旋锁1.5 公平锁和非公平锁1.6 可重入锁和不可重入锁 二、CAS2.1 什么是CAS2.2 CAS的实现原理2.3 CAS应用2.4 ABA问题 三、synchronized原理3.1 synchronized锁的特点3.2 加锁工作过程3.3 锁消…