Vue3:動態路由+子頁面(新增、詳情頁)動態路由配置(代碼全注釋)

文章目錄

    • 實現思路
    • 調用后端接口獲取用戶權限
    • 獲取頁面權限動態綁定到路由對象中
    • 動態添加子頁面路由
      ?

實現思路

? ?emm,項目中使用動態路由實現根據后端返回的用戶詳情信息,動態將該用戶能夠訪問的頁面信息,動態生成并且綁定到路由對象中。但是后端返回的不包含像是頁面詳情頁,新增頁的權限路由,如果前端在路由對象中寫死的話,那每次進入頁面都得判斷是否將進入一個用戶沒有權限的頁面,但是路由中有存在的。所以就想著自己能不能根據后端現有返回的信息,前端自己生成類似詳情之類的動態路由。

調用后端接口獲取用戶頁面權限動態綁定到路由對象中

1.獲取用戶權限

async function getUserAuthority(ids:any) {let userAuthority = nulllet NewList = null//定義請求參數let params = {id:ids,permission_tree:1}//請求用戶的信息await get('/system/user/detail',params).then(res=>{if(res.status_code == 200){//userAuthority  存入查詢到該用戶信息 userAuthority = res.data//模擬該頁面是需要跳轉其他項目的地址let list =[{id: 119,children:[{id:1191,children:[],parent_id:119,name :'審單管理',slug:'web-system-exchangegoods-management',web_path : `/gongdan`,links:'https://blog.csdn.net/qq_45061461?type=lately'}],slug:'web-system-examineadocument',web_icon:'el-icon-coin',name :'審單管理',web_path: null,},{id: 117,children:[{children:[],id:1171,parent_id:117,slug:'web-system-exchangegoods-management',name :'換貨留言列表',web_path : `/gongdan`,links:'https://so.csdn.net/so/search?q=vue3%3Amian,ts%E4%B8%AD%E8%8E%B7%E5%8F%96import.meta.glob&t=&u=&urw='}],slug:'web-system-exchangegoods',web_icon:'el-icon-coin',name :'換貨留言列表',web_path: null,}]//將后端返回的用戶信息中的權限 和 自己定義的權限對象 合并一起NewList = userAuthority.permissions.concat(list);//將用戶的權限信息保存本地中sessionStorage.setItem('NavList',JSON.stringify(NewList))}})return NewList
}

?2.用戶登錄請求信息 方法我就不寫了

//調用定義的獲取權限方法
proxy.$PublicAPI.getUserAuthority(list.user_id).then((res) => {//res就是上個方法中返回的權限信息 然后調用將路由添加入路由對象的方法proxy.$PublicAPI.getRouteAddList();//獲取默認第一菜單的一個頁面的路徑進行跳轉proxy.$PublicAPI.getOnePagePath();});

3.調用動態追加路由對象的方法

async function getRouteAddList() {<!--定義存放路由信息對象-->let parentRoute = null;<!--判斷本地中是否存在權限信息-->if (sessionStorage.getItem('NavList')) {//list是 forEachRout方法返回的數據,將本地權限信息傳入,根據信息生成路由對象格式數據let list =  forEachRout() <!--router.getRoutes().find(route => route.name === 'index') 查找路由對象中的路由信息中name名為index的路由對象,name = index的路由對象path指向 index.vue 有顯示頁面元素的路由視圖 <router-view /> -->parentRoute = router.getRoutes().find(route => route.name === 'index');<!--想自己生成的路由對象格式數據 追加到 /index中的chilrend中 -->list.forEach(item => {parentRoute.children.push(item);});<!--將定義好的路由數據格式對象添加到路由對象中-->router.addRoute(parentRoute);}
}

4.設計路由對象格式數據?forEachRout方法

function forEachRout  (){//存放已經設計好的路由對象let list = [] //查找 ../../views/ 文件夾下所有的文件 views文件夾下是我存放的vue文件const module = import.meta.glob("../../views/**");<!-- 獲取本地的權限信息 -->let params = JSON.parse(sessionStorage.getItem('NavList'));<!-- 循環遍歷權限信息 -->params.forEach(item => {<!-- 判斷權限信息中web_path 是否是為string,為string類型就是用戶的頁面權限 這是后端返回的 -->if (typeof item.web_path === 'string') {<!-- 設計路由對象格式信息 -->let routerChildrenOne = {path: item.web_path,name: `${item.web_path}`,component: module[`../../views${item.web_path}/index.vue`],meta: {title: item.name,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}};<!-- 處理好的路由對象格式信息保存起來,后面存入路由對象中 -->list.push(routerChildrenOne);let butOne = item.slug;routerChildrenOne.meta.buts.push(butOne);} 
<!--  這個else 是判斷是否需要跳轉外部鏈接的對象,就是第一個截圖中定義的兩個權限數據對象 
-->
else {item.children.forEach(Citem => {let routerChildren = { <!-- 判斷對象中是否存在 links(跳轉鏈接)屬性,為存在的話,那么這個path將和其他同樣存在links屬性的對象公用一個頁面(所有需要跳轉外部的菜單都共同跳轉這一個頁面,所以這里使用了路由傳參來確定點擊他們不會只獲取到最近的一個需要外部跳轉的菜單,否則菜單中存在一個以上跳轉外部菜單,無論點擊哪一個都會跳轉同一個外部鏈接。并菜單包含此path全部高亮),就會存在下方截圖的錯誤-->path:Citem.links ? `${Citem.web_path}/:${Citem.id}` :  Citem.web_path ,name: `${Citem.web_path}`,component: module[`../../views${Citem.web_path}/index.vue`],meta: {title: Citem.name,buts: [],requireAuth: true,keepAlive: true,externallink:Citem.links}};list.push(routerChildren);Citem.children.forEach(C_item_C => {let but = C_item_C.slug;routerChildren.meta.buts.push(but);});});}});//返回定義好的路由格式對象return list
}

所以,在配置路由格式對象中外部跳轉鏈接菜單通過動態路由傳參來避免出現這個問題.到此菜單的動態路由已經配置完成。

動態添加子頁面路由

但是我在想如果每個頁面中都存在類似新增和詳情的子頁面,但是后端返回的信息中未包含,自己怎么也解決動態生成。于是就回到了,后端目前返回給我的權限信息,還有獲取到veiws文件夾中的vue文件。

?1.后端返回的權限

2.veiws文件夾中已經存在的

3.實現,此方法就是 P4代碼片段的方法 只不過增加了幾個變量和調用了幾個方法:

?新增變量名:Eligiblelimitsofauthority? ,?aa

?新增調用方法的方法名:UpdataRouterList 、GetPossibleDetails?

?已經底部retrun之前的判斷對象是否存在component綁定的文件路由屬性

function forEachRout  (){//存放已經設計好的路由對象let list = []<!-- 存放可能是新增頁面,詳情頁面 和編輯頁面的標識 -->let Eligiblelimitsofauthority = []<!-- 存放可能是新增頁面,詳情頁面 和編輯頁面的路由對象>let aa = [] //查找 ../../views/ 文件夾下所有的文件 views文件夾下是我存放的vue文件const module = import.meta.glob("../../views/**");<!-- 獲取本地的權限信息 -->let params = JSON.parse(sessionStorage.getItem('NavList'));<!-- 篩選出頁面中出現可能是新增、詳情或者編輯的信息 --> UpdataRouterList(params,Eligiblelimitsofauthority)<!-- 根據傳遞過來的可能是詳情或者編輯的信息,篩選出存在權限的數據,轉換成路由格式對象 -->aa =  GetPossibleDetails(Eligiblelimitsofauthority,params,aa)<!-- 循環遍歷權限信息 -->params.forEach(item => {<!-- 判斷權限信息中web_path 是否是為string,為string類型就是用戶的頁面權限 這是后端返回的 -->if (typeof item.web_path === 'string') {<!-- 設計路由對象格式信息 -->let routerChildrenOne = {path: item.web_path,name: `${item.web_path}`,component: module[`../../views${item.web_path}/index.vue`],meta: {title: item.name,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}};<!-- 處理好的路由對象格式信息保存起來,后面存入路由對象中 -- >list.push(routerChildrenOne);let butOne = item.slug;routerChildrenOne.meta.buts.push(butOne);} 
<!--  這個else 是判斷是否需要跳轉外部鏈接的對象,就是第一個截圖中定義的兩個權限數據對象 
-->
else {item.children.forEach(Citem => {let routerChildren = { <!-- 判斷對象中是否存在 links(跳轉鏈接)屬性,為存在的話,那么這個path將和其他同樣存在links屬性的對象公用一個頁面(所有需要跳轉外部的菜單都共同跳轉這一個頁面,所以這里使用了路由傳參來確定點擊他們不會只獲取到最近的一個需要外部跳轉的菜單,否則菜單中存在一個以上跳轉外部菜單,無論點擊哪一個都會跳轉同一個外部鏈接。并菜單包含此path全部高亮),就會存在下方截圖的錯誤-->path:Citem.links ? `${Citem.web_path}/:${Citem.id}` :  Citem.web_path ,name: `${Citem.web_path}`,component: module[`../../views${Citem.web_path}/index.vue`],meta: {title: Citem.name,buts: [],requireAuth: true,keepAlive: true,externallink:Citem.links}};list.push(routerChildren);Citem.children.forEach(C_item_C => {let but = C_item_C.slug;routerChildren.meta.buts.push(but);});});}});<!-- 判斷轉換成路由格式數據中component有數據的對象,component不為空的時候就是標識項目中已經創建了這個新增,詳情 或編輯的頁面-->if(aa){aa.map(item=>{if(item.component != undefined)list.push(item)})}//返回定義好的路由格式對象return list
}

2.UpdataRouterList方法 篩選出頁面中出現可能是詳情或者編輯的信息

//篩選出頁面中出現可能是詳情或者編輯的信息
function UpdataRouterList(navlist:any,Eligiblelimitsofauthority:any) {<!-- 循環傳過來的本地權限數據對象中包含了 'create','edit' 和 'detail'的標識 -->navlist.map(item=>{if(item.slug.indexOf('create') != -1 || item.slug.indexOf('edit') != -1 || item.slug.indexOf('detail') != -1){<!-- 存入到可能包含新增,詳情,編輯的標識數組中 -->Eligiblelimitsofauthority.push(item.slug)}<!-- 判斷是否還有子數據,第一次循環的是下拉菜單 第二次循環的是下拉菜單中的點擊跳轉頁面的菜單,第三次循環點擊跳轉頁面的菜單中的 按鈕權限,主要是拿到按鈕權限菜單  這里是只有二級菜單,所以循環了三次,如果有多級也會一直循環下去,知道children中沒有數據-->>if(item.children){UpdataRouterList(item.children,Eligiblelimitsofauthority)}})
}

3.GetPossibleDetails 根據傳遞過來的信息,篩選出存在權限的數據, 轉換成路由信息,因為如果在本地中已經定義了全部的頁面新增,詳情,編輯等頁面,但是咱們還是需要根據后端返回的權限中,判斷咱們是否注冊該頁面的路由。

//根據傳遞過來的信息,篩選出存在權限的數據, 轉換成路由信息 
function GetPossibleDetails(data:object,navlist:object,aa:any,) {<!-- 獲取項目中views文件夾下的所有vue文件 -->const module = import.meta.glob("../../views/**");<!-- 遍歷本地中的權限數據-->navlist.map(item=>{<!-- 傳遞過來的可能是 新增,詳情,編輯的權限標識 -->data.map(ditem =>{<!-- 判斷 item.web_path是否不為空,如果為空的話表明菜單是下拉菜單就不做操作 item.slug :這個菜單的標識 如:web-users 就是表示user(用戶)菜單 -->if(item.web_path != null && ditem == `${item.slug}-create` || ditem == `${item.slug}-edit` ||  ditem == `${item.slug}-detail`){<!-- 存放定義的路由數據格式對象 -->let list = {}<!-- 截取item.we_path 菜單路徑處理后的值,如:/user 我拿取user 后面作為/veiws/user,匹配views下的user文件夾 所以這里獲取的是該菜單存放的文件夾名稱 -->let path  = ''if(item.web_path != null){<!-- 截取文件夾名稱 -->path = item.web_path.slice(item.web_path.lastIndexOf('/') + 1 , item.web_path.length)<!-- ditem是方法接收傳遞過來可能是新增,編輯,詳情的權限標識數組,判斷最后的-符號的后面是 'create':新增 ,'edit' :編輯 'detail':詳情 -->switch ( ditem.slice(ditem.lastIndexOf('-') + 1 , ditem.length)) {case 'create'://如果是新增list = {//定義新增頁面跳轉的路由路徑,如: path是截取到的文件名:user  那就path最后就是 :/usercreatepath: '/'+path + 'create',name: `${path}create`,<!-- 匹配本地vue文件中是否包含 module:views下所有的vue文件,path:文件夾名稱,item.web_path:vue文件名稱 -->component: module[`../../views/${path}${item.web_path}create.vue`],meta: {title: '新建' + item.name ,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}}break;case 'edit':console.log('item-edit',item);list = {path: '/'+path + 'edit',name: `${path}edit`,component: module[`../../views/${path}${item.web_path}edit.vue`],meta: {title: item.name  + '編輯' ,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}}break;case 'detail':list = {path: '/'+path + 'detail',name: `${path}detail`,component: module[`../../views/${path}${item.web_path}detail.vue`],meta: {title:  item.name + '詳情'  ,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}}break;}}aa.push(list)}})<!-- 判斷菜單中的chidren是否存在數據,如果沒有存在就表明是一級點擊跳轉菜單,parent_id :0 表示的是菜單 -->if(item.children && item.parent_id == 0){GetPossibleDetails( data,item.children,aa)}})return aa
}

小結

1.最后添加到路由對象中的數據,最后一個對象就是新增的動態子頁面路由

項目文件

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

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

相關文章

如何從清空的回收站中恢復已刪除的Excel文件?

“嗨&#xff0c;幾天前我刪除了很多沒有備份的Excel文件。回收站已清空。當我意識到我犯了一個大錯誤時&#xff0c;所有的Excel文件都消失了&#xff0c;回收站里什么都沒有。清空回收站后是否可以恢復已刪除的 Excel 文件&#xff1f; 回收站是一種工具&#xff0c;可讓您在…

LeetCode 343. 整數拆分 (dp動態規劃)

343. 整數拆分 力扣題目鏈接(opens new window) 給定一個正整數 n&#xff0c;將其拆分為至少兩個正整數的和&#xff0c;并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2輸出: 1解釋: 2 1 1, 1 1 1。 示例 2: 輸入: 10輸出: 36解釋: 10 3 …

【openlayers系統學習】4.2Mapbox 樣式渲染圖層

二、Mapbox 樣式渲染圖層 顯然我們目前的地圖需要一些樣式。 VectorTile? 圖層的樣式與 Vector? 圖層的樣式工作方式完全相同。那里描述的樣式在這里也適用。 對于這樣的地圖&#xff0c;創建數據驅動的樣式&#xff08;對矢量圖層操作&#xff09;非常簡單。但矢量切片也用…

單兵組網設備+指揮中心:集群系統技術詳解

一、單兵設備功能特點 單兵組網設備是現代通信技術的重要成果&#xff0c;旨在為單個作戰或工作單元提供高效的通信和數據傳輸能力。其主要功能特點包括&#xff1a; 1. 便攜性&#xff1a;設備輕巧&#xff0c;便于單兵攜帶和使用&#xff0c;適應各種復雜環境。 2. 通信能…

簡述vue-router 組件復用導致路由參數失效怎么辦

當使用Vue Router時&#xff0c;組件復用可能會導致路由參數失效的問題。為了解決這個問題&#xff0c;我們可以采取以下策略&#xff1a; 1. 監聽路由變化 在Vue組件中&#xff0c;我們可以使用watch屬性來監聽$route對象的變化。當路由發生變化時&#xff0c;如果目標組件是…

第 8 章 機器人實體導航實現_路徑規劃(自學二刷筆記)

重要參考&#xff1a; 課程鏈接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 講義鏈接:Introduction Autolabor-ROS機器人入門課程《ROS理論與實踐》零基礎教程 9.3.5 導航實現05_路徑規劃 路徑規劃仍然使用 navigation 功能包集中的 move_base 功能包。 5.1編寫launch文…

PHP之fastadmin系統配置分組增加配置和使用

目錄 一、實現功能&#xff1a;fasttadmin實現添加系統配置分組和添加參數、使用 二、添加分組 三、配置分組參數 四、最終存儲位置 五、獲取配置參數 一、實現功能&#xff1a;fasttadmin實現添加系統配置分組和添加參數、使用 二、添加分組 在字典配置中找到分組對應鍵值…

linux系統——top資源管理器

在linux系統中&#xff0c;有類似于windows系統中的資源管理器&#xff0c;top用于實時的監控系統的任務執行狀態以及硬件配置信息 在linux中&#xff0c;輸入top命令&#xff0c;可以進入相應界面&#xff0c;在此界面可以使用一些指令進行操作 如&#xff0c;輸入z 可以改變…

終端安全管理系統、天銳DLP(數據泄露防護系統)| 數據透明加密保護,防止外泄!

終端作為企業員工日常辦公、數據處理和信息交流的關鍵工具&#xff0c;承載著企業運營的核心信息資產。一旦終端安全受到威脅&#xff0c;企業的敏感數據將面臨泄露風險&#xff0c;業務流程可能遭受中斷&#xff0c;甚至整個企業的運營穩定性都會受到嚴重影響。 因此&#xff…

【EVI】Hume AI 初探

寫在前面的話 Hume AI宣布已在B輪融資中籌集5000萬美元&#xff0c;由前Google DeepMind研究員Alan Cowen創立并擔任CEO。該AI模型專注于理解人類情感&#xff0c;并發布了「共情語音界面」演示&#xff0c;通過語音對話實現互動。從 Hume AI 官網展示的信息&#xff0c;EVI 能…

計算機視覺與深度學習實戰:以Python為工具,基于深度學習的汽車目標檢測

隨著人工智能技術的飛速發展,計算機視覺與深度學習已經成為當今科技領域的熱點。其中,汽車目標檢測作為自動駕駛、智能交通等系統的核心技術,受到了廣泛關注。本文將以Python為工具,探討基于深度學習的汽車目標檢測方法及其實戰應用。 一、計算機視覺與深度學習基礎 計算機…

力扣刷題--747. 至少是其他數字兩倍的最大數【簡單】

題目描述 給你一個整數數組 nums &#xff0c;其中總是存在 唯一的 一個最大整數 。 請你找出數組中的最大元素并檢查它是否 至少是數組中每個其他數字的兩倍 。如果是&#xff0c;則返回 最大元素的下標 &#xff0c;否則返回 -1 。 示例 1&#xff1a; 輸入&#xff1a;n…

Python-opencv通過距離變換提取圖像骨骼

文章目錄 距離變換distanceTransform函數 距離變換 如果把二值圖像理解成地形&#xff0c;黑色表示海洋&#xff0c;白色表示陸地&#xff0c;那么陸地上任意一點&#xff0c;到海洋都有一個最近的距離&#xff0c;如下圖所示&#xff0c;對于左側二值圖像來說&#xff0c;【d…

Gitee的原理及應用詳解(三)

本系列文章簡介&#xff1a; Gitee是一款開源的代碼托管平臺&#xff0c;是國內最大的代碼托管平臺之一。它基于Git版本控制系統&#xff0c;提供了代碼托管、項目管理、協作開發、代碼審查等功能&#xff0c;方便團隊協作和項目管理。Gitee的出現&#xff0c;在國內的開發者社…

漂流瓶掛機項目,聊天腳本賺錢新玩法,號稱單機30-50+ (教程+軟件)

一、項目簡介&#xff1a; 漂流瓶掛機項目主要是通過使用探遇漂流瓶、音麥漂流瓶等聊天軟件&#xff0c;為用戶提供一個聊天賺錢的平臺。男性用戶需要充值后才能發送消息&#xff0c;而女性用戶則可以通過接收消息賺取分紅。男性用戶發送給女性用戶的消息費用大約在.1-.2元之間…

VScode中對git的學習筆記

1.git是什么&#xff1f; Git是一個功能強大的分布式版本控制系統&#xff0c;由Linux內核的創始人Linus Torvalds在2005年創建。它以其速度、數據完整性和支持大型項目的能力而聞名&#xff0c;被廣泛應用于軟件開發中。Git允許開發者在本地機器上擁有完整的代碼庫副本&#x…

讀書筆記分享

1.蘇格拉底只在需要的時候才索取&#xff0c;那樣便能以最少的物質滿足自身的要求。他認為每個人都天生體質脆弱&#xff0c;只有在貧乏的環境中才會鍛煉地強壯起來。生活中的大多數人認為&#xff0c;奢華才是幸福的生活。無休止的物質積聚&#xff0c;讓人們每天生活在一個內…

2024-05-27 blue-vh-問題點

摘要: 2024-05-27 思考-日記-問題點 問題點: 一. 同步接口的并發問題 接口調用是在客戶端的的上下文&#xff0c;無論是線程&#xff0c;協程&#xff0c;是在客戶端的執行上下文里面同步的話&#xff0c;是同步客戶端的調用接口的上下文&#xff0c;阻塞的是客戶端的上下文&a…

SashulinMessageBroker:在消息流中調用C++ DLL

一、背景 在現實應用中&#xff0c;算法、核心邏輯為了追求快速高效的運行速度&#xff0c;很多人都采用C來編寫&#xff0c;并打包成動態庫供外部使用。SMB針對這種應用場景&#xff0c;提供了DLL組件&#xff0c;實現在消息流中對DLL的動態調用。下實例講解如何實現DLL as S…

多旋翼+發電機:國債應急系留照明無人機技術詳解

多旋翼發電機技術的應急系留照明無人機是一種集成了先進飛行技術、發電技術和照明技術的無人機系統。這種無人機具有高度的靈活性、移動性和適應性&#xff0c;能夠在各種復雜環境下迅速部署&#xff0c;為夜間搜救、救援等應急任務提供高效、可靠的照明支持。 無人機參數&…