Vue核心知識:動態路由實現完整方案

在這里插入圖片描述

在Vue中實現動態路由,并結合后端接口和數據庫表設計,是一個復雜的項目,需要多個技術棧和步驟的配合。以下將詳細描述整個實現過程,包括數據庫設計、后端接口設計、前端路由配置以及如何實現動態路由的功能。

目錄

      • 一、需求分析
      • 二、數據庫設計
        • 1.1 路由表(routes)
        • 1.2 角色表(roles)
        • 1.3 用戶表(users)
        • 1.4 角色與路由權限表(role_routes)
      • 三、后端接口設計
        • 2.1 獲取用戶角色接口
        • 2.2 根據角色獲取路由接口
      • 四、前端實現
        • 4.1 動態路由的基本概念
        • 4.2 前端路由配置
        • 4.3 Vuex管理路由狀態
        • 4.4 在組件中動態渲染路由
      • 五、總結

一、需求分析

動態路由的核心需求是:

  1. 前端根據后臺返回的路由配置,動態地生成路由
  2. 路由信息存儲在數據庫中,后端根據權限和角色返回給前端相應的路由配置
  3. 前端通過動態加載組件來提升性能

為了實現這個需求,我們需要完成以下幾個方面的工作:

  • 數據庫設計:定義表結構,存儲用戶的權限信息和路由配置。
  • 后端設計:通過接口返回路由配置,并進行權限控制。
  • 前端設計:根據接口返回的路由配置動態生成Vue路由。

二、數據庫設計

首先需要設計一個數據庫表來存儲路由信息。假設我們有一個表來存儲系統的路由信息,一個表存儲用戶和角色的關系,以及角色與權限的關系。

1.1 路由表(routes)
CREATE TABLE routes (id INT AUTO_INCREMENT PRIMARY KEY,path VARCHAR(255) NOT NULL,component VARCHAR(255) NOT NULL,name VARCHAR(255) NOT NULL,parent_id INT DEFAULT 0, meta JSON DEFAULT NULL, is_enabled BOOLEAN DEFAULT TRUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
  • id:路由的唯一標識。
  • path:路由的路徑。
  • component:組件路徑,可以是動態加載的組件路徑。
  • name:路由名稱,用于匹配。
  • parent_id:如果路由是子路由,父路由的ID,支持多級嵌套。
  • meta:額外的元數據,比如權限、描述等。
  • is_enabled:標記路由是否啟用。
  • created_atupdated_at:創建和更新時間。
1.2 角色表(roles)
CREATE TABLE roles (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
1.3 用戶表(users)
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,role_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (role_id) REFERENCES roles(id)
);
1.4 角色與路由權限表(role_routes)
CREATE TABLE role_routes (role_id INT,route_id INT,PRIMARY KEY (role_id, route_id),FOREIGN KEY (role_id) REFERENCES roles(id),FOREIGN KEY (route_id) REFERENCES routes(id)
);

這張表用于記錄每個角色對應的路由權限。

三、后端接口設計

后端接口負責查詢數據庫中的路由信息,并根據用戶角色返回相應的路由配置。后端一般會有以下幾個接口:

  1. 獲取用戶角色接口:根據用戶信息獲取用戶的角色。
  2. 根據角色獲取路由接口:根據角色ID查詢對應的路由權限。
2.1 獲取用戶角色接口
@app.route('/api/get_role', methods=['GET'])
def get_user_role():user_id = request.args.get('user_id')user = User.query.get(user_id)if user:return jsonify({'role': user.role.name})return jsonify({'message': 'User not found'}), 404
2.2 根據角色獲取路由接口
@app.route('/api/get_routes', methods=['GET'])
def get_routes():role_name = request.args.get('role')role = Role.query.filter_by(name=role_name).first()if not role:return jsonify({'message': 'Role not found'}), 404routes = db.session.query(Route).join(RoleRoute).filter(RoleRoute.role_id == role.id).all()routes_data = []for route in routes:routes_data.append({'path': route.path,'component': route.component,'name': route.name,'meta': route.meta})return jsonify(routes_data)

四、前端實現

4.1 動態路由的基本概念

在Vue中,路由是由vue-router控制的。我們需要根據從后端接口獲取的路由數據來動態地配置這些路由。

  1. 創建一個路由生成器:這個生成器會根據路由的結構,遞歸地生成路由配置。
  2. 動態加載組件:為了提高性能,可以根據需要動態加載路由對應的組件。
4.2 前端路由配置

假設我們使用vue-router來配置路由。在Vue項目中,我們可以創建一個router/index.js文件,來處理動態路由的生成。

import Vue from 'vue';
import Router from 'vue-router';
import store from '../store';Vue.use(Router);const router = new Router({routes: []
});function generateRoutes(routes) {const routeArray = [];routes.forEach(route => {const routeConfig = {path: route.path,name: route.name,component: () => import(`@/views/${route.component}.vue`), // 動態加載組件meta: route.meta};if (route.children && route.children.length > 0) {routeConfig.children = generateRoutes(route.children);}routeArray.push(routeConfig);});return routeArray;
}router.beforeEach(async (to, from, next) => {if (!store.state.routes.length) {const res = await store.dispatch('getRoutes');const routes = generateRoutes(res);routes.forEach(route => {router.addRoute(route);});next({ ...to, replace: true });} else {next();}
});export default router;
4.3 Vuex管理路由狀態

為了管理從后端獲取到的路由數據,我們需要使用Vuex來存儲路由信息,并在路由初始化時進行調用。

// store.js
import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';Vue.use(Vuex);export default new Vuex.Store({state: {routes: []},mutations: {setRoutes(state, routes) {state.routes = routes;}},actions: {async getRoutes({ commit }) {try {const response = await axios.get('/api/get_routes', {params: {role: 'admin' // 根據用戶角色獲取路由}});commit('setRoutes', response.data);return response.data;} catch (error) {console.error('Failed to fetch routes:', error);}}},modules: {}
});
4.4 在組件中動態渲染路由

當路由數據更新后,我們需要在App.vue或者根組件中使用Vue Router來管理路由,并且確保路由在動態添加后被正確加載。

<template><div id="app"><router-view></router-view></div>
</template><script>
export default {name: 'App',created() {this.$store.dispatch('getRoutes');}
}
</script>

五、總結

實現Vue中的動態路由不僅僅需要前端的配置,還涉及到后端與數據庫的配合。通過數據庫存儲路由信息和角色權限,后端根據角色返回路由數據,前端通過vue-router動態生成路由配置,并通過vuex管理路由狀態。動態加載組件也是提高性能的一個關鍵點,確保用戶只在需要時才加載路由對應的組件。

通過這種方式,系統可以靈活地配置和管理不同用戶的權限路由,使得前端界面能夠根據用戶角色和權限進行個性化的展示。

在這里插入圖片描述

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

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

相關文章

自媒體多賬號如何切換不同定位才能做得更好

一、選擇稀缺增長的賽道&#xff0c;避開內卷紅海 1.職場賽道 ● 細分方向&#xff1a;公務員/體制內經驗分享、自由職業指南、遠程辦公技巧。例如&#xff0c;通過采訪自由職業者或分享遠程工作體驗&#xff0c;快速積累精準粉絲。 ● 優勢&#xff1a;職場人群需求明確&…

基于SpringBoot的校園二手交易平臺(源碼+論文+部署教程)

運行環境 校園二手交易平臺運行環境如下&#xff1a; ? 前端&#xff1a;Vue ? 后端&#xff1a;Java ? IDE工具&#xff1a;IntelliJ IDEA&#xff08;可自行更換&#xff09; ? 技術棧&#xff1a;SpringBoot Vue MySQL 主要功能 校園二手交易平臺主要包含前臺和…

iPhone 鏡像 連接錯誤

重置連接 defaults delete com.apple.ScreenContinuity打開 iPhone 鏡像 參考 mac鏡像iPhone無法連接報錯個人經歷的 iPhone 鏡像 bug 與部分解決辦法

Qt基礎入門-詳解

前言 qt之路正式開啟 &#x1f493; 個人主頁&#xff1a;普通young man-CSDN博客 ? 文章專欄&#xff1a;C_普通young man的博客-CSDN博客 ? 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有問題 評論區見&#x1f4dd; &#x1f389;歡迎大家點贊&#x1f44…

Unity 優化封裝常用API和編輯器擴展工具包

資源名&#xff1a;WXTools 文章目錄 MeshRenderEditorSpriteGroupToolWXEditorUtilsComponentUtilsDataUtilsGameObjectUtilsRigidbodyUtilsStringUtilsTransformUtilsVectorUtilsWXTools 內容包括&#xff1a; MeshRenderEditor mesh擴展 SpriteGroupTool SpriteGroup操作…

python學習第三天

條件判斷 條件判斷使用if、elif和else關鍵字。它們用于根據條件執行不同的代碼塊。 # 條件判斷 age 18 if age < 18:print("你還是個孩子&#xff01;") elif age 18:print("永遠十八歲&#xff01;") else:print("你還年輕&#xff01;")…

ThinkPHP使用phpword讀取模板word文件并添加表格

1.安裝phpword包composer require phpoffice/phpword 2.模板文件結構 如上圖框住的是要替換的文本和要復制表格樣式 實現代碼 <?phpnamespace app\api\logic;use PhpOffice\PhpWord\Element\Table; use PhpOffice\PhpWord\SimpleType\TblWidth; use PhpOffice\PhpWord\…

(原創)用python語言基于paddleocr構建批量識別實現紙質和電子的增值稅專用發票程序

文章目錄 1. 說明2. 準備工作3. 代碼3.1 導入庫&#xff1a;3.2 遍歷發票指定處理方式3.3 發票識別相關函數3.4 發票字段定位函數3.6 識別記錄相關函數3.6 識別結果校驗3.7 文件預處理等其他函數3.8 main主函數 1. 說明 1.1 以paddle識別引擎為基礎的增值稅發票識別程序&#…

DeepSeek搭配Excel,制作自定義按鈕,實現辦公自動化!

今天跟大家分享下我們如何將DeepSeek生成的VBA代碼&#xff0c;做成按鈕&#xff0c;將其永久保存在我們的Excel表格中&#xff0c;下次遇到類似的問題&#xff0c;直接在Excel中點擊按鈕&#xff0c;就能10秒搞定&#xff0c;操作也非常的簡單. 一、代碼準備 代碼可以直接詢問…

解決顯示器在高刷條件下花屏的問題

起因是家里的顯示器好久沒用之后&#xff0c;100HZ的刷新率下會花屏&#xff0c;在75HZ的情況下就正常顯示&#xff0c;在網上找了一圈感覺是硬件問題解決不了 于是想了想如果我用90HZ呢&#xff1f;不過原始的情況下沒有自定義刷新率的選擇&#xff0c;不過amd和nvida控制面板…

IP-----雙重發布

目錄 6.雙重發布 1.重發布的作用 2.部署條件 1.必須存在ASBR 2.種子度量值 3.重發布的規則 4.重發布的數量 5.重發布的場景 1.場景和規則 2.直連和靜態 3.動態RIP 4.動態OSPF 5.更改開銷值 6.重發布的問題1 7.重發布的問題2 1.流量 2.前綴列表 3.偏移列表 4…

藍橋杯試題:DFS回溯

一、題目要求 輸入一個數組n&#xff0c;輸出1到n的全排列 二、代碼展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…

Ruby基礎

一、字符串 定義 283.to_s //轉為string "something#{a}" //定義字符串&#xff0c;并且插入a變量的值 something//單引號定義變量 %q(aaaaaaaaa) // 定義字符串&#xff0c;&#xff08;&#xff09;內可以是任何數&#xff0c;自動轉義雙引號%Q("aaaaa"…

基于提示驅動的潛在領域泛化的醫學圖像分類方法(Python實現代碼和數據分析)

摘要 醫學圖像分析中的深度學習模型易受數據集偽影偏差、相機差異、成像設備差異等導致的分布偏移影響&#xff0c;導致在真實臨床環境中診斷不可靠。領域泛化&#xff08;Domain Generalization, DG&#xff09;方法旨在通過多領域訓練提升模型在未知領域的性能&#xff0c;但…

C#—Settings配置詳解

C#—Settings配置詳解 在C#項目中&#xff0c;全局配置通常指的是應用程序的設置&#xff08;settings&#xff09;&#xff0c;這些設置可以跨多個類或組件使用&#xff0c;并且通常用于存儲應用程序的配置信息&#xff0c;如數據庫連接字符串、用戶偏好設置等。 Settings配置…

國自然面上項目|基于多模態MR影像的膠質母細胞瘤高危區域定位及預后預測研究|基金申請·25-02-28

小羅碎碎念 今天和大家分享一個面上項目&#xff0c;執行年限為2019.01&#xff5e;2022.12&#xff0c;直接費用為57萬元。 膠質母細胞瘤&#xff08;GBM&#xff09;預后差且差異大&#xff0c;異質性是重要因素&#xff0c;臨床手段難評價。影像組學為異質性研究提供方法&am…

Nat Mach Intell | AI分子對接算法評測

《Nature Machine Intelligence》發表重磅評測&#xff0c;系統評估AI與物理方法在虛擬篩選&#xff08;VS&#xff09;中的表現&#xff0c;突破藥物發現效率瓶頸。 核心評測體系&#xff1a;三大數據集 研究團隊構建了三個新型測試集&#xff1a; TrueDecoy&#xff1a;含14…

安路FPGA開發入門:軟件安裝與點燈與仿真(TangDynasty ModelSim)

文章目錄 前言軟件安裝開發軟件仿真軟件 點燈測試代碼編寫與編譯引腳分配固件下載 仿真測試ModelSim添加仿真庫TangDynasty仿真設置進行仿真 后記 前言 最近因為工作需要用安路的FPGA&#xff0c;這里對安路FPGA開發相關流程做個記錄。作為測試只需要一個核心板&#xff08;我這…

千峰React:外部庫引用

flushSync強制刷新 如果不強制刷新是這樣&#xff1a;每次count在下一輪才更新 import { useState, useRef } from react import { flushSync } from react-domfunction App() {const [count, setCount] useState(0)const refuseRef(null)const handleClick () > { setCo…

防火墻旁掛組網雙機熱備負載均衡

一&#xff0c;二層交換網絡&#xff1a; 使用MSTPVRRP組網形式 VLAN 2--->SW3為主,SW4 作為備份 VLAN 3--->SW4為主,SW3 作為備份 MSTP 設計 --->SW3 、 4 、 5 運行 實例 1 &#xff1a; VLAN 2 實例 2 &#xff1a; VLAN 3 SW3 是實例 1 的主根&#xff0c;實…