精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Vue3 動態路由實戰:手把手教你打造你的權限系統,精準權限控制,提升用戶體驗

admin
2024年12月28日 20:48 本文熱度 221

在現代 Web 應用中,不同用戶擁有不同權限,這需要前端根據用戶角色動態控制路由和菜單的顯示。Vue3 提供了強大的動態路由機制,結合 Vite 和 Pinia,我們可以輕松構建靈活且安全的權限系統。本文將詳細介紹如何實現動態路由,并提供一些實用技巧和優化方案。

動態路由核心概念

動態路由的核心在于根據用戶權限實時生成路由配置。不同于靜態路由的固定配置,動態路由可以根據用戶的角色、權限等信息動態添加或移除路由規則,從而實現頁面級別的訪問控制。

實現步驟詳解

我們的 Vue3 項目中使用了 Vite 構建工具和 Pinia 狀態管理庫。實現動態路由的關鍵步驟如下:

  1. 1. 后端接口設計: 后端接口需要根據用戶角色返回對應的菜單權限數據。數據格式通常為 JSON,包含每個菜單項的 pathnamecomponent 等信息。

  2. 2. 前端路由配置: 在前端路由文件 (src/router/index.ts) 中,定義基礎路由和動態路由的入口。基礎路由通常包括登錄、注冊等無需權限校驗的頁面。動態路由入口則作為動態添加路由的占位符。

    // src/router/index.ts
    import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';

    const routesRouteRecordRaw[] = [
      // 基礎路由
      { path'/login'name'login'component() => import('../views/Login.vue') },
      // 動態路由入口
      {
        path'/dashboard',
        name'dashboard',
        component() => import('../views/Dashboard.vue'),
        children: [], //  動態子路由將添加到這里
      },
    ];

    const router = createRouter({
      historycreateWebHistory(),
      routes,
    });

    export default router;
  3. 3. 動態添加路由: 在用戶登錄成功后,獲取后端返回的菜單權限數據。將這些數據轉換為 RouteRecordRaw 格式,并使用 router.addRoute() 方法動態添加到路由實例中。

     import { useUserStore } from '@/stores/user';

     router.beforeEach(async (to, from, next) => {
      const userStore = useUserStore();
      if (to.name !== 'login' && !userStore.user) {
        // 如果用戶未登錄,重定向到登錄頁
        next({ name'login' });
      } else if (to.name !== 'login' && !router.hasRoute(to.name)) {
        // 動態添加路由
         const menuData = await fetchUserMenu(); // 獲取菜單數據
         menuData.forEach(item => {
            router.addRoute('dashboard', {
                path: item.path
                name: item.name
                component() => import(`../views/${item.component}.vue`)
            })
        });

        // 確保 addRoute 完成后再跳轉,避免出現空白頁面
        next({ ...to, replacetrue }); // 跳轉到目標路由
      }

      next();
    });
  4. 4. Pinia 狀態管理: 使用 Pinia 存儲用戶的權限信息,方便在組件中進行權限控制。

    // stores/user.ts
    import { defineStore } from 'pinia';

    export const useUserStore = defineStore('user', {
      state() => ({
        usernull,
        menu: [],
      }),
      actions: {
        async login(username, password) {
           // 執行登錄邏輯 ...
          this.user = user;
          this.menu = await fetchUserMenu(); // 獲取菜單數據
        },
        logout() {
          this.user = null;
          this.menu = [];
          //  移除動態添加的路由 
          const routeNames = this.menu.map(item => item.name)
          routeNames.forEach(name => {
            if (router.hasRoute(name)) {
               router.removeRoute(name)
            }
          })
        },

      },
    });
  5. 5. 菜單渲染: 在菜單組件中使用 Pinia 獲取用戶的菜單權限數據,并根據數據動態渲染菜單項。

高級技巧與優化

  1. 1. 401 無權限處理: 當用戶訪問無權訪問的動態路由時,將其重定向到 401 頁面,而不是默認的 404 頁面,提供更友好的用戶提示。為此,我們創建了一個 getDynamicFullPathRoute 函數,獲取所有動態路由的完整路徑,并在 beforeEach 中進行判斷。

  2. 2. 本地路由緩存(可選): 為了減少不必要的請求,可以將動態路由數據緩存在 localStorage 中。這樣,只有在用戶首次登錄或手動清除緩存時,才會重新請求路由數據。當然,你需要根據實際需求權衡緩存策略。

// src/route/index.ts (部分代碼)
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import { useRoutesStore } from '~/stores/use-routes'

// ... 其他代碼

router.beforeEach(async (to, from, next) => {
    // 401處理 (簡化示例)
    if (to.path === '/404' && to.redirectedFrom?.fullPath) { 
      if (dynamicRoutes.includes(to.redirectedFrom.fullPath)) {
        next({ name'401' }) // 跳轉到401頁面
        return
      }
    }
// ... 其他邏輯

});


// src/stores/use-routes.ts (部分代碼)
import { defineStore } from 'pinia'
import type { RouteRecordRaw } from 'vue-router'

export const useRoutesStore = defineStore('userRoutes', {
    // ... 其他代碼
})

避免常見的坑

  1. 1. 逐個添加路由: 在 Vue3 中,需要使用 router.addRoute() 逐個添加動態路由。

  2. 2. 404 路由添加時機: 在所有動態路由添加完成后,再添加 404 路由。

  3. 3. 刷新頁面處理: 頁面刷新后,需要重新獲取動態路由,并在 next() 中使用 { ...to, replace: true } 避免導航錯誤。

總結

通過本文的講解,相信你已經掌握了使用 Vue3、Vite 和 Pinia 實現動態路由的核心技巧。記住,權限系統的設計需要兼顧安全性和用戶體驗,動態路由為我們提供了一個優雅的解決方案。


閱讀原文:原文鏈接?


該文章在 2024/12/30 15:29:49 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲在线天天更新国产又粗又大又黄 | 亚洲天堂中文字幕在线观看 | 97无码欧美熟妇人妻蜜 | 亚洲永久大片www免费 | 日韩大片免费看 | 另类自拍丝袜第五页 | 国精产品一二二区传媒有哪些 | 国产精品老熟女露脸视频 | 人妻超级精品碰碰在线97视频 | 欧美成人精品三级网站在线观看 | 午夜福利免费在线观看 | 亚洲精品自拍aⅴ在线 | 亚洲中文字幕精品久久久久久直播 | 高清乱码中文 | 一区二区三区视频在线观看 | 2025精品手机国产品在线 | 日本毛片爽看免费视频 | 亚洲精品91天天久久人人 | 欧美最猛性xxxxx亚洲精品 | 亚洲美免无码中文字幕在线 | 亚洲v无码精品久久久久成精品 | 国产微拍精品一区二区 | 偷拍情侣视频一区二区三区二区高清中文直播视频 | 亚洲va久久久噜噜噜久久狠狠h熟女欧美人人一区高潮日 | 久久久久无码国产精品不卡 | 久久久久国产精品四虎 | 在线观看欧美 | 国模无码一区二区三区 | 精品久久久久久无码专区 | 国产精品高潮呻吟爱久久AV无码 | 亚洲一区二区三区四区五区六区 | 国产日韩一区二区三区视频 | 色欲国产麻豆一精品一AV一免费 | 亚洲欧洲国产成人综合在线观看 | 最新国产乱人伦偷精品免费网站 | 亚洲乱码中文字幕久久孕妇黑人 | 亚洲美女黄免费a | 亚洲欧美图片视频 | 一女被多男灌满白浆受孕 | 91在线无码精品秘入口动漫 | 日本一卡精品视频免费 |