vue3菜單權限管理實現

前提

你的菜單是根據路由動態生成的,具體可以參考這篇博客對el-menu組件進行遞歸封裝(根據路由配置動態生成)

描述

首先將路由分為常量路由constantRoute(所有用戶都有的路由)和異步路由asyncRoute(需要動態加載的前端路由)
每次進入系統時根據不同的用戶向后端發送請求獲取該用戶的路由權限信息,一般是個數組。

所使用的API

1.動態添加路由api

router.addRoute(parentName: string, route: RouteConfig): () => void

實現的例子

路由配置信息(大概掃一眼就行,就是v-router的配置)

export const constantRoute = [{path: '/login',component: () => import('@/views/login/index.vue'),name: 'login',meta: {title: '登錄',hidden: true,},},{path: '/',component: () => import('@/views/layout/index.vue'),name: 'layout',meta: {title: '',hidden: false,icon: '',},redirect: '/home',children: [{path: '/home',component: () => import('@/views/home/index.vue'),name: 'home',meta: {title: '首頁',hidden: false,icon: 'HomeFilled',},},],},{path: '/screen',component: () => import('@/views/screen/index.vue'),name: 'Screen',meta: {title: '數據大屏',hidden: false,icon: 'DataBoard',},},{path: '/404',component: () => import('@/views/404/index.vue'),name: '404',meta: {title: 'Not Found',hidden: true,},},{path: '/:pathMatch(.*)*',redirect: '404',name: 'Any',meta: {title: 'Not Found',hidden: true,},},
]export const asyncRoute = [{path: '/acl',component: () => import('@/views/layout/index.vue'),name: 'Acl',meta: {title: '權限管理',hidden: false,icon: 'Lock',},redirect: '/acl/user',children: [{path: '/acl/user',component: () => import('@/views/acl/user/index.vue'),name: 'User',meta: {title: '用戶管理',hidden: false,icon: 'User',},},{path: '/acl/role',component: () => import('@/views/acl/role/index.vue'),name: 'Role',meta: {title: '角色管理',hidden: false,icon: 'Avatar',},},{path: '/acl/permission',component: () => import('@/views/acl/permission/index.vue'),name: 'Permission',meta: {title: '菜單管理',hidden: false,icon: 'List',},},],},{path: '/product',component: () => import('@/views/layout/index.vue'),name: 'Product',meta: {title: '商品管理',hidden: false,icon: 'Goods',},redirect: '/product/trademark',children: [{path: '/product/trademark',component: () => import('@/views/product/trademark/index.vue'),name: 'Trademark',meta: {title: '品牌管理',icon: 'ShoppingCart',hidden: false,},},{path: '/product/attr',component: () => import('@/views/product/attr/index.vue'),name: 'Attr',meta: {title: '屬性管理',icon: 'Management',hidden: false,},},{path: '/product/spu',component: () => import('@/views/product/spu/index.vue'),name: 'Spu',meta: {title: 'Spu',icon: 'SetUp',hidden: false,},},{path: '/product/sku',component: () => import('@/views/product/sku/index.vue'),name: 'Sku',meta: {title: 'Sku',icon: 'ScaleToOriginal',hidden: false,},},],},
]
// 計算異步路由信息
function generateRoutes(asyncRoutes: any, filterArr: string[]) {return asyncRoutes.filter((item: any) => {if (filterArr.includes(item.name)) {if (item.children && item.children.length > 0) {item.children = generateRoutes(item.children, filterArr)}return true}})
}
// filterArr 權限信息
const filterArr = ['Acl', 'User', 'Role', 'Product', 'Trademark']
const asyncRoutes = generateRoutes(// 一定要使用深拷貝 用lodash的cloneDeep,不要用JSON的那個cloneDeep(asyncRoute),filterArr,
)
// this.routes主要是側邊導航欄要的信息 可有可無
this.routes = [...constantRoute, ...asyncRoutes,...anyRoute];
// 動態注冊路由
[...asyncRoutes,...anyRoute].forEach((item:any) => {router.addRoute(item)
});

注意:如果出現Vue 路由定義警告Component “default“ in record with path “/“ is a Promise這個問題可以嘗試在路由前置守衛中加入判斷使用next({ ...to })不懂得可以參考這篇

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536795.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Gradle 插件

自定義Gradle插件 - 簡書

小天使的小難題:新生兒疝氣的關注與溫馨呵護

引言: 新生兒疝氣是一種在出生后可能出現的常見情況,雖然通常不會造成長期影響,但對于家長而言,了解如何正確應對新生兒疝氣是至關重要的。本文將深入探討新生兒疝氣的原因、癥狀,以及家長在面對這一問題時應該采取的…

1224. 交換瓶子(藍橋杯/圖論)

題目: 1224. 交換瓶子 - AcWing題庫 輸入樣例1: 5 3 1 2 5 4輸出樣例1: 3輸入樣例2: 5 5 4 3 2 1輸出樣例2: 2 思路:圖論 1.將對應的位置與當前的瓶子序列相連形成環。 2.最少交換次數能形成的最多…

Vue中的事件委托(事件代理)使用方法介紹

事件委托(事件代理) 將原本需要綁定在子元素上的事件監聽器委托在父元素上,讓父元素充當事件監聽的職務。 事件委托是一種利用事件冒泡的特性,在父節點上響應事件,而不是在子節點上響應事件的技術。它能夠改善性能&a…

如何理解JDK、JRE、JVM區別與聯系

摘要:JDK是 Java 語言的軟件開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄,里面有兩個文件夾bin和lib,在這里可以認為bin里的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib合起來就稱為jre。 一、JDK JDK(Ja…

【【迭代16次的CORDIC算法-verilog實現】】

迭代16次的CORDIC算法-verilog實現 -32位迭代16次verilog代碼實現 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …

第十四章Java博客

lambda就是數學中的“λ”的讀音,lambda表達式是基于λ演算而得名的,因為lambda抽象(lambda abstraction)表示一個匿名的函數,于是開發語言也將lambda表達式用來表示匿名函數,也就是沒有函數名字的函數。C#…

maven管理工具使用package打包的時候無法將lib文件夾下的第三方jar包打入,上線打jar包后運行異常問題

問題描述&#xff1a; 調用第三方接口的時候通過手動引入了第三方的兩個jar包到我本項目的lib文件夾下&#xff0c;并在pom文件添加入下配置&#xff1a; <dependency><groupId>cn.xxxx.xxxx.core</groupId><artifactId>xxxx-core</artifactId>…

Spring Boot 中實現跨域的幾種方式

前言 在現代Web應用中&#xff0c;由于安全性和隱私的考慮&#xff0c;瀏覽器限制了從一個域向另一個域發起的跨域HTTP請求。解決這個問題的一種常見方式是實現跨域資源共享&#xff08;CORS&#xff09;。Spring Boot提供了多種方式來處理跨域請求&#xff0c;本文將介紹其中的…

C語言字符串處理提取時間(ffmpeg返回的時間字符串)

【1】需求 需求&#xff1a;有一個 “00:01:33.90” 這樣格式的時間字符串&#xff0c;需要將這個字符串的時間值提取打印出來&#xff08;提取時、分、秒、毫秒&#xff09;。 這個時間字符串從哪里來的&#xff1f; 是ffmpeg返回的時間&#xff0c;也就是視頻的總時間。 下…

vs快捷鍵

ctrlMo 折疊代碼塊 ctrlML 打開代碼塊

電子電器架構(E/E)演化 —— 主流主機廠域集中架構概述

電子電器架構(E/E)演化 —— 主流主機廠域集中架構概述 我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 屏蔽力是信息過載時代一個人的特殊競爭力,任何消耗你的人和事,多看一眼都是你的不對。…

系列七(實戰)、發送 接收單向消息(Java操作RocketMQ)

一、發送 & 接收單向消息 1.1、概述 發送單向消息&#xff0c;適用于發送方不關心或者不在意消息的發送結果&#xff0c;這種方式的吞吐量很大&#xff0c;但是存在消息丟失的風險&#xff0c;對于重要消息要慎用&#xff01;該種方式通常適用于對消息沒有那么嚴格的場景中…

類和對象的創建和實例化

1. 類的概述 1.1 具體示例 類是描述一類事物的特征和行為的統稱&#xff0c;抽象的不存在的&#xff0c;泛指的概念&#xff0c;例如&#xff1a;描述一個人&#xff0c;從外觀上&#xff08;特征&#xff09;和言行舉止&#xff08;行為&#xff09;上進行描述外觀上&#xff…

c 語言學習:輸出階乘的算式

c 語言學習&#xff1a;輸出階乘的算式 代碼 #include "stdio.h"int fact(int num){if (num < 1){printf("1 ");return 1;} else {printf("%d x ",num);return num * fact(num-1);} }int main(){int num 10; // printf("plz inpu…

【華為OD題庫-107】編碼能力提升計劃-java

題目 為了提升軟件編碼能力&#xff0c;小王制定了刷題計劃&#xff0c;他選了題庫中的n道題&#xff0c;編號從0到n-1&#xff0c;并計劃在m天內按照題目編號順序刷完所有的題目(注意&#xff0c;小王不能用多天完成同一題) 在小王刷題計劃中&#xff0c;小王需要用time[i]的時…

老鷹目標檢測數據集VOC格式60張

老鷹是天空中的王者&#xff0c;它們擁有極佳的飛行能力。它們能以驚人的速度在天空中翱翔&#xff0c;尤其擅長高空俯沖捕食。老鷹的視力非常敏銳&#xff0c;能夠準確地發現地面上的獵物&#xff0c;并迅速下落抓取。它們的爪子強而有力&#xff0c;足以擊倒比自己體型龐大的…

云計算與大數據之間的羈絆(期末不掛科版):云計算 | 大數據 | Hadoop | HDFS | MapReduce | Hive | Spark

文章目錄 前言&#xff1a;一、云計算1.1 云計算的基本思想1.2 云計算概述——什么是云計算&#xff1f;1.3 云計算的基本特征1.4 云計算的部署模式1.5 云服務1.6 云計算的關鍵技術——虛擬化技術1.6.1 虛擬化的好處1.6.2 虛擬化技術的應用——12306使用阿里云避免了高峰期的崩…

NAT路由器,將內網ip轉換為外網ip

Network Address Translation&#xff0c;網絡地址翻譯。 概念 NAT就是在局域網內部使用內部地址&#xff0c;而當內部節點要與外部網絡通信時&#xff0c;在網關將內部地址替換為公用地址&#xff0c;從而在外部網關正常使用。 NAT表是轉換的核心 NAT路由器有NAT表&#xf…

0基礎學習VR全景平臺篇第131篇:曝光三要素—光圈

上課&#xff01;全體起立~ 大家好&#xff0c;歡迎觀看蛙色官方系列全景攝影課程&#xff01; 我們經常從電視或書刊上看到這樣的照片&#xff0c;照片的主體清晰&#xff0c;前后鏡朦朧虛化&#xff0c;整體看起來非常的漂亮。那這樣的照片是如何拍出來的呢&#xff1f;他和…