Vue3ElementPlus实现权限管理系统(三):路由动态加载及菜单侧边栏

在菜单权限管理开发中,通常需要根据后端返回的菜单列表递归渲染左侧菜单栏以及动态加载路由,这样可以确保用户无法访问没有权限的菜单。为了实现这个功能,我们需要进行以下步骤:

接下看下如何实现动态加载路由与菜单

开始之前我们先安装全局状态管理pinia

然后main.ts中引入,同时将element-plus的Icon全局注册(这里后续就能直接使用图标了)

import{createApp}from'vue';importAppfrom'./App.vue';importrouterfrom'./router';importElementPlusfrom'element-plus';import'element-plus/dist/index.css';import{createPinia}from'pinia';import'./index.css';import*asElementPlusIconsVuefrom'@element-plus/icons-vue';constapp=createApp(App);//将element-plus的图标注册到appfor(const[key,component]ofObject.entries(ElementPlusIconsVue)){app.component(key,component);}constpinia=createPinia();app.use(ElementPlus);app.use(router);app.use(pinia);//等待路由初始化完成后再挂载,确保守卫beforeach可以使用piniaawaitrouter.isReady();app.mount('#app');布局看一下页面布局,分为顶部导航栏(navbar)+左侧菜单栏(sidebar)+主要内容(appmain)

项目新建layout文件夹来存放布局组件

在index.vue引入它们

import{SideBar,AppMain,NavBar}from'./components/index.ts';其中AppMain/index.vue

这里加了动画与组件缓存,后续会根据后端返回的catch字段进行缓存控制

在api/menu/index.ts中配置调用获取路由及权限的接口

这里什么都不用传

新建store/index.ts目录用来存放全局数据,菜单列表数据,权限列表数据,以及是否折叠菜单等等,同时调用getInfo接口获取数据

import{defineStore}from'pinia';import{getInfo}from'../api/menu/index';import{AppStoreState}from'./types';exportdefaultdefineStore('appStore',{state:():AppStoreState=>{return{menuList:[],isCollapse:false,permissions:[],};},actions:{asyncgetInfo(){const{data}=awaitgetInfo({});this.menuList=data.routers;this.permissions=data.permissions;},},});其中AppStoreState

我们可以通过router.addRoute方式动态添加子路由,这里我们需要根据后端返回的组件component字段来创建目录,比如system/role/index就在views目录下新建system/role/index.vue

同样的

这些用于后续测试

添加之前需要将后端返回的菜单列表数据转换为符合Vue路由的格式,因为后端返回的组件路径是个字符串,VueRouter的component是不能直接使用的,这里我们在utils文件夹新建filterRouters.ts,

//匹配views里面所有的.vue文件constmodules=import.meta.glob('../views/**/*.vue');//将本地的路由与后端返回的路由进行匹配exportconstloadView=(view:any)=>{letres;for(constpathinmodules){constdir=path.split('views/')[1].split('.vue')[0];if(dir===view){res=()=>modules[path]();}}returnres;};exportconstfilterRoute=(data:any)=>{data.forEach((item:any)=>{if(item.children.length>0){deleteitem.component;filterRoute(item.children);}else{item.component=loadView(item.component);//item.redirect='/404';}});returndata;};然后再新建hooks/useHandleRouter.ts,进行动态添加路由的逻辑

最后在router/index引入使用,同时添加一个/404的路由,当用户访问的路由不存在时,会跳转到/404路由

import{createRouter,createWebHashHistory,RouteRecordRaw}from'vue-router';import{useHandleRouter}from'@/hooks/useHandleRouter';exportconstroutes:RouteRecordRaw[]=[{path:'/',name:'Index',redirect:'/index',component:()=>import(/*webpackChunkName:'index'*/'@/layout/index.vue'),children:[{path:'/index',component:()=>import('@/views/index.vue'),name:'Home',meta:{title:'首页'},},],},{path:'/login',name:'Login',component:()=>import(/*webpackChunkName:'login'*/'@/views/login/index.vue'),},{path:'/:pathMatch(.*)*',component:()=>import('@/views/error/404.vue'),},];constrouter=createRouter({history:createWebHashHistory(),scrollBehavior(_to,_from,savedPosition){if(savedPosition){returnsavedPosition;}else{return{top:0};}},routes,});useHandleRouter(router);exportdefaultrouter;到这里我们便完成了路由的动态加载

接下来我们来完成菜单侧边栏(SideBar)部分,这里我们使用element-plus中的菜单组件el-menu,然后通过判断后端返回的路由类型是菜单还是目录来分别使用el-menu-item和el-menu-sub。

新建layout/SideBar/index.vue来编写侧边栏的代码

其中SideBarItem组件用于判断路由类型是菜单还是目录,然后渲染对应的组件。

除此之外,SideBarItem组件中引入了自身SideBarItem实现了组件的递归,这样就可以保证无论菜单层级多少都可以对应展示

THE END
1.Sider:ChatGPT侧边栏下面是详细信息: 1并排使用:通过 Sider 的 ChatGPT 侧边栏,你可以在任何标签页上调出 ChatGPT,无需来回切换标签。这就是轻松实现多任务处理。 2 AI 游乐场:我们支持所有大牌——ChatGPT、o1、o1-mini、GPT-4、GPT-4o、GPT-4o mini、Claude 3.5 Sonnet 和 Google Gemihttps://microsoftedge.microsoft.com/addons/detail/sider-chatgpt%E4%BE%A7%E8%BE%B9%E6%A0%8F-vision/dhoenijjpgpeimemopealfcbiecgceod?eqid=87e53e130001ab1400000006646df06c
2.侧边栏布局和响应式布局的对比(SemiDesign)侧边栏布局: 通常将页面分为侧边栏(Sider)和主要内容区域(Content)。 侧边栏通常用于导航、菜单或其他辅助功能,而主要内容区域用于展示核心内容。 在你的代码中,Silider组件就是一个典型的侧边栏布局,侧边栏固定在左侧,右侧是 Header、Content 和 Footer。 https://blog.csdn.net/2202_75695913/article/details/145327361
3.SideBarPlus相似应用下载SideBar Plus 44 次下载 暂无 好评率 0 人评论 SideBar Plus最新版截图 # SideBar Plus最新版 SideBar Plus是一款侧边栏工具,支持多种特性定制。支持多项边栏工具功能,除此之外,还能够自己添加操作应用以及看天气等众多强大的功能,给用户带来方便快捷的使用愉悦感。只有当你体验到时你才会感觉到他的强大之处! https://www.wandoujia.com/apps/6570572
4.sidebar是什么意思sidebar的中文翻译音标读音用法例句1.Remove TheSidebar移除侧边栏 2.ToggleSidebar隐藏;显示侧边栏;框架转换;显示 3.SecondaryBar &SideBar额外的快捷栏;分外的快捷栏 4.SidebarGadget边栏小工具;边栏小东西 5.sidebarpro专业版;侧边栏专业版;侧边栏;侧边工具条 6.SideBarPlus侧边栏;侧边栏增强版;侧边栏增强汉化版 https://danci.gei6.com/sidebar__c8hkehmb.html
5.ElemenPlus实现侧边菜单栏伸缩mob6454cc620c34的技术博客ElemenPlus 实现侧边菜单栏伸缩 内容提要: 动态路由实现逻辑、sidebar侧边栏和面包屑导航。 动态路由 在vue-element-admin的基础上进行二次开发。 动态路由生成逻辑如下图: vue-element-admin 将路由分为:constantRoutes 和 asyncRoutes 用户登录系统时,会动态生成路由,其中 constantRoutes 必然包含,asyncRoutes 会进行https://blog.51cto.com/u_16099169/12109272
6.如何将文档上传到ChatGPTBing_AI_Sidebar">使用 ChatGPT 支持的 Bing AI 侧边栏分析文档 微软在 Edge 浏览器上添加了由 ChatGPT 支持的 Bing 侧边栏,使其在很长一段时间后得到了急需的刷新。这解锁了许多 Edge 浏览器功能,包括直接在浏览器中扫描任何文档的能力。 您无需单独将文件上传到任何网站。您只需在 Edge 浏览器中打开该文件https://m.10100.com/article/23553
7.侧边栏chatgpt,书签,应用程序等SideBarr的前10名好处包括一个强大的侧边栏, 功能,一个快速查找窗口,可让您快速访问选定文本的定义,一个支持所有流行搜索引擎的增强搜索页面,支持SINDBARR -CHATGPT 3.5 API键或GPT -4的Plus用户(新!), 支持黑暗或光模式,一个提供降压渲染,代码突出显示的响应页面,以及停止生成响应或将其复制到剪贴板的能力,许多https://www.chajianxw.com/product-tool/37046.html
8.vite+vue3+Ts+element侧边菜单栏开发 我们之前讲权限的地方已经给大家看过了返回的菜单数据,并封装成了树形结构,所以我们这里菜单就根据保存的菜单数据渲染菜单就可以了。 我们在按照以下层级创建侧边栏需要用到的组件 layout -> components -> Sidebar -> index.vue , SidebarItem.vue, SidebarMenu.vue https://cloud.tencent.com/developer/article/2276062
9.取消标题栏自定义切换成侧边栏,并增加懒路由节省内存·Luan一款Go Wails实现的GUI工具,功能涵盖网站扫描、端口扫描、企业信息收集、子域名暴破、空间引擎搜索、CDN识别等 - 取消标题栏自定义切换成侧边栏,并增加懒路由节省内存 · Luan-CC-DD/Slack@2648acahttps://github.com/Luan-CC-DD/Slack/commit/2648aca9d2659116a3af494dc7de7b83a9944002
10.Shopify侧边栏一级目录标题点击直接进入分类功能介绍:手机端侧边栏导航,含有二级目录的一级标题点击左侧标题处可直接进入对应collection页面,点击右侧+处,可打开二级目录。 打开shopify后台 -- 依次点击Online Store--Actions--Edit Code--搜索并打开sidebar-menu.liquid-- 将目标代码全选替换掉文件中原有代码即可。 https://www.jianshu.com/p/4602a457b781
11.Vue3elementPlus图标和自定义侧边栏图标侧边栏自定义图标的应用 vite+vue3+ts中使用自定义图标 使用elementPlus图标 在项目中引入 npminstall@element-plus/icons-vue import'element-plus/dist/index.css' import*asElementPlusIconsVuefrom'@element-plus/icons-vue' // 图标 for(const[key, component]ofObject.entries(ElementPlusIconsVue)) { https://www.freesion.com/article/73042627581/