Vue核心知識:Vue動態權限到按鈕完整方案

為了進一步實現上面提到的動態路由功能,并且加入對每個路由的權限控制(即增、刪、改、查按鈕的權限控制),我們需要對數據庫、后端接口、前端的設計做一些改進和擴展。下面我將詳細描述如何在現有方案的基礎上加入對路由的增、刪、改、查權限控制。

目錄

      • 一、數據庫設計擴展
        • 1.1 修改路由表(routes)
        • 1.2 修改角色與路由權限表(role_routes)
      • 二、后端接口設計
        • 2.1 修改獲取路由接口
        • 2.2 添加路由權限的接口
      • 三、前端實現
        • 3.1 動態生成路由
        • 3.2 根據權限動態顯示按鈕
        • 3.3 在Vuex中存儲用戶權限
      • 四、總結

一、數據庫設計擴展

為了實現更細粒度的權限控制,我們需要對數據庫結構做一些修改和擴展,增加對路由權限的支持。每個路由會關聯四個權限:增、刪、改、查。

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,-- 增、刪、改、查權限permission_create BOOLEAN DEFAULT FALSE,permission_delete BOOLEAN DEFAULT FALSE,permission_update BOOLEAN DEFAULT FALSE,permission_view BOOLEAN DEFAULT TRUE
);
  • permission_create:該路由是否具有增權限。
  • permission_delete:該路由是否具有刪權限。
  • permission_update:該路由是否具有改權限。
  • permission_view:該路由是否具有查權限。
1.2 修改角色與路由權限表(role_routes)

role_routes表中,新增字段來存儲角色對路由的權限,分別對應增、刪、改、查。

CREATE TABLE role_routes (role_id INT,route_id INT,permission_create BOOLEAN DEFAULT FALSE,permission_delete BOOLEAN DEFAULT FALSE,permission_update BOOLEAN DEFAULT FALSE,permission_view BOOLEAN DEFAULT TRUE,PRIMARY KEY (role_id, route_id),FOREIGN KEY (role_id) REFERENCES roles(id),FOREIGN KEY (route_id) REFERENCES routes(id)
);
  • 每條記錄表示角色對某個路由的權限。

二、后端接口設計

在后端,我們需要確保路由的增、刪、改、查權限在獲取路由數據時被正確地返回,并且在路由的操作(如添加、刪除、修改、查看)時進行權限控制。

2.1 修改獲取路由接口

修改/api/get_routes接口,增加對路由權限的支持,返回每個路由的增、刪、改、查權限信息。

@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:role_route = RoleRoute.query.filter_by(role_id=role.id, route_id=route.id).first()routes_data.append({'path': route.path,'component': route.component,'name': route.name,'meta': route.meta,'permissions': {'create': role_route.permission_create,'delete': role_route.permission_delete,'update': role_route.permission_update,'view': role_route.permission_view}})return jsonify(routes_data)

在這個接口中,我們通過RoleRoute表來獲取每個角色對應的路由權限,并將這些權限一起返回。

2.2 添加路由權限的接口

我們還需要提供一個接口來修改路由權限(即為角色設置增、刪、改、查權限)。

@app.route('/api/set_route_permissions', methods=['POST'])
def set_route_permissions():data = request.jsonrole_id = data['role_id']route_id = data['route_id']permission_create = data['permission_create']permission_delete = data['permission_delete']permission_update = data['permission_update']permission_view = data['permission_view']role_route = RoleRoute.query.filter_by(role_id=role_id, route_id=route_id).first()if not role_route:role_route = RoleRoute(role_id=role_id, route_id=route_id)db.session.add(role_route)role_route.permission_create = permission_createrole_route.permission_delete = permission_deleterole_route.permission_update = permission_updaterole_route.permission_view = permission_viewdb.session.commit()return jsonify({'message': 'Permissions updated successfully'})

該接口接收角色ID、路由ID以及增、刪、改、查權限的設置,并更新數據庫中的權限數據。

三、前端實現

前端需要根據從后端接口獲取的路由信息和權限數據,動態生成路由,并根據權限來控制不同路由下按鈕的顯示與操作權限。

3.1 動態生成路由

前端的路由配置需要動態加載,并在路由生成時判斷當前用戶對該路由的權限。

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,permissions: route.permissions // 保存權限數據};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;
3.2 根據權限動態顯示按鈕

前端頁面上的操作按鈕(如增、刪、改、查)需要根據用戶對路由的權限來進行顯示和隱藏。假設每個頁面都有這些按鈕,我們可以使用v-if指令來根據權限控制顯示與否。

<template><div><button v-if="hasCreatePermission">新增</button><button v-if="hasUpdatePermission">編輯</button><button v-if="hasDeletePermission">刪除</button><button v-if="hasViewPermission">查看</button></div>
</template><script>
export default {computed: {hasCreatePermission() {return this.$store.state.userPermissions.create;},hasUpdatePermission() {return this.$store.state.userPermissions.update;},hasDeletePermission() {return this.$store.state.userPermissions.delete;},hasViewPermission() {return this.$store.state.userPermissions.view;}},created() {this.setPermissions(this.$route.meta.permissions);},methods: {setPermissions(permissions) {this.$store.commit('setUserPermissions', permissions);}}
}
</script>

在這個組件中,我們使用v-if指令根據權限來顯示對應的按鈕。hasCreatePermissionhasUpdatePermission等計算屬性返回當前用戶對該頁面的權限,setPermissions方法會在頁面加載時設置當前用戶的權限。

3.3 在Vuex中存儲用戶權限

在Vuex中,我們可以存儲用戶的權限數據,并在不同的組件中訪問。

// store.js
export default new Vuex.Store({state: {userPermissions: {create: false,delete: false,update: false,view: true}},mutations: {setUserPermissions(state, permissions) {state.userPermissions = permissions;}},actions: {async getRoutes({ commit }) {const res = await axios.get('/api/get_routes', { params: { role: 'admin' } });commit('setRoutes', res.data);return res.data;}}
});

四、總結

通過以上的設計和實現,我們能夠在前端根據路由和權限動態生成路由,并且為每個路由設置增、刪、改、查等操作的權限。后端負責根據用戶的角色返回對應的權限信息,前端通過vue-routervuex管理動態路由和用戶權限。通過這種方式,系統可以靈活地根據角色和權限來展示不同的功能,并且有效地控制用戶對數據的操作權限。

這種設計方式非常適合復雜權限管理的系統,能夠提供細粒度的權限控制,并且可以隨著業務需求的變化靈活調整。
在這里插入圖片描述

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

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

相關文章

swift 開發效率提升工具

安裝github copliot for xcode github/CopilotForXcode brew install --cask github-copilot-for-xcode安裝swiftformat for xcode brew install swiftformatXcode Swift File代碼格式化-SwiftFormat

Trae智能協作AI編程工具IDE:如何在MacBook Pro下載、安裝和配置使用Trae?

Trae智能協作AI編程工具IDE&#xff1a;如何在MacBook Pro下載、安裝和配置使用Trae&#xff1f; 一、為什么選擇Trae智能協作IDE&#xff1f; 在AI編程新時代&#xff0c;Trae通過以下突破性功能重新定義開發體驗&#xff1a; 雙向智能增強&#xff1a;AI不僅提供代碼補全&a…

【推薦項目】023-游泳俱樂部管理系統

023 游泳俱樂部管理系統 游泳俱樂部管理系統概述 前端技術框架&#xff1a; 我們優雅地采用了Vue.js作為游泳俱樂部管理系統的前端基礎框架。Vue.js以其輕盈、高效和易于上手的特點&#xff0c;為我們的用戶界面帶來了極致的流暢性和響應速度。通過Vue.js&#xff0c;我們為…

C語言:51單片機 基礎知識

一、單片機概述 單片機的組成及其特點 單片機是指在一塊芯片上集成了CPU、ROM、RAM、定時器/計數器和多種I/O接口電路等&#xff0c;具有一定規模的微型計算機。 特點&#xff1a; 1、單片機的存儲器以ROM、RAM嚴格分工。 2、采用面向控制的指令系統。 3、單片機的I/O口引腳通…

【計算機網絡入門】初學計算機網絡(八)

目錄 1. S-W協議的信道利用率 2. GBN、SR協議的信道利用率 3.術語補充 3.1 滑動窗口協議 3.2 ARQ協議、連續ARQ協議 4. 信道劃分介質訪問控制 4.1 時分復用&#xff08;TDM&#xff09; 4.2 統計時分復用&#xff08;STDM&#xff09; 4.3 頻分復用&#xff08;FDM&a…

HarmonyOS學習第7天: 文本組件點亮界面的文字魔法棒

一、引言 在 HarmonyOS 那豐富多彩的系統界面中&#xff0c;從簡潔直觀的應用圖標&#xff0c;到交互流暢的操作菜單&#xff0c;再到生動形象的圖文展示&#xff0c;每一處細節都經過精心雕琢&#xff0c;為用戶帶來了獨特而美妙的視覺與交互體驗。而在這琳瑯滿目的界面元素中…

從零開始:H20服務器上DeepSeek R1 671B大模型部署與壓力測試全攻略

前言 最近&#xff0c;我有幸在工作中接觸到了DeepSeek R1 671B模型&#xff0c;這是目前中文開源領域參數量最大的高質量模型之一。DeepSeek團隊在2024年推出的這款模型&#xff0c;以其驚人的6710億參數量和出色的推理性能&#xff0c;引起了業界廣泛關注。 作為一名AI基礎…

Unity中動態切換光照貼圖LightProbe的方法

關鍵代碼&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三張圖&#xff1a;lightmapColor,lightmapDir,以及一張ShadowMap 這里只操作前兩張&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

實例分割 | yolov11訓練自己的數據集

前言 因工作要求使用的都是yolov5系列的模型&#xff0c;今天學習一下最先進的yolov11&#xff0c;記錄一下環境配置及訓練過程。 1.項目下載及環境安裝 源碼位置&#xff1a;yolov11 可以看到&#xff0c;這里要求python版本大于等于3.8&#xff0c;我這里安裝python3.10.…

大模型推理時的尺度擴展定律

大模型推理時的尺度擴展定律 FesianXu at 20250212 at Wechat Search Team 前言 大模型的尺度擴展定律告訴我們&#xff1a;『LLM的性能會隨著模型的參數量、模型的訓練量、模型的訓練數據量的增加而增加』。訓練存在尺度擴展定律&#xff0c;測試也存在尺度擴展定律&#xff…

如何使用useEffect模擬組件的生命周期?

什么是 useEffect&#xff1f; useEffect 是 React 提供的一個 Hook&#xff0c;用于處理副作用&#xff08;side effects&#xff09;。它允許你在函數組件中執行一些操作&#xff0c;這些操作通常會影響組件的渲染&#xff0c;比如數據獲取、訂閱、DOM 操作等。通過 useEffe…

Linux網絡基礎(協議 TCP/IP 網絡傳輸基本流程 IP VS Mac Socket編程UDP)

文章目錄 一.前言二.協議協議分層分層的好處 OSI七層模型TCP/IP五層(或四層)模型為什么要有TCP/IP協議TCP/IP協議與操作系統的關系(宏觀上是如何實現的)什么是協議 三.網絡傳輸基本流程局域網(以太網為例)通信原理MAC地址令牌環網 封裝與解包分用 四.IP地址IP VS Mac地址 五.So…

網絡安全-使用DeepSeek來獲取sqlmap的攻擊payload

文章目錄 概述DeepSeek使用創建示例數據庫創建API測試sqlmap部分日志參考 概述 今天來使用DeepSeek做安全測試&#xff0c;看看在有思路的情況下實現的快不快。 DeepSeek使用 我有一個思路&#xff0c;想要測試sqlmap工具如何dump數據庫的&#xff1a; 連接mysql數據庫&#…

AI繪畫軟件Stable Diffusion詳解教程(2):Windows系統本地化部署操作方法(專業版)

一、事前準備 1、一臺配置不錯的電腦&#xff0c;英偉達顯卡&#xff0c;20系列起步&#xff0c;建議顯存6G起步&#xff0c;安裝win10或以上版本&#xff0c;我的顯卡是40系列&#xff0c;16G顯存&#xff0c;所以跑大部分的模型都比較快&#xff1b; 2、科學上網&#xff0…

Linux NAT和代理服務器

目錄 0.前言 1.NAT 網絡地址轉換 1.1 NAT 技術背景 1.2 NAT的定義與分類 1.3 NAT的工作原理 1.4 NAT的缺陷 2.代理服務器 2.1 概述 2.2 正向代理 2.3 反向代理 2.4 NAT 與代理服務器的區別和聯系 3.小結 &#xff08;圖像由AI生成&#xff09; 0.前言 在前面的文章中&#x…

AI學習第七天

數組&#xff1a;基礎概念、存儲特性及力扣實戰應用 在計算機科學與數學的廣袤領域中&#xff0c;數組作為一種極為重要的數據結構&#xff0c;發揮著不可或缺的作用。它就像一個有序的 “數據倉庫”&#xff0c;能高效地存儲和管理大量數據。接下來&#xff0c;讓我們深入了解…

ue5 創建多列StreeView的方法與理解

創建StreeView的多列樣式怎么就像是創建單行單列差不多?貌似就是在單行單列中加入了多列widget? 示例代碼 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailTabWidget){…

Linux之yum詳解

—— 小 峰 編 程 目錄 1、Linux軟件的安裝方式 2、什么是yum 3、配置網絡yum源 4、yum命令 【語法】 【yum常用命令】 1、Linux軟件的安裝方式 在CentOS系統中&#xff0c;軟件管理方式通常有三種方式&#xff1a; rpm安裝 、 yum安裝 以及 編譯安裝 。 2、什么是yum…

lvgl運行機制分析

lv_timer_handler() 是 LVGL 的“心臟”&#xff1a;這個函數會依次做以下事情&#xff1a; 處理定時器&#xff08;如動畫、延遲回調&#xff09;。 讀取輸入設備&#xff08;如觸摸屏、按鍵的狀態&#xff09;。 刷新臟區域&#xff08;僅重繪屏幕上發生變化的區域&#xf…

達夢數據庫授權給某個用戶查詢其他指定用戶下所有表的權限

方法1&#xff1a; 新版本有一個數據庫參數 GRANT_SCHEMA&#xff0c;表示是否開啟授予和回收模式權限功能。0&#xff1a;否&#xff1b;1&#xff1a;是 此參數為靜態參數&#xff0c;默認是0&#xff0c;將改參數修改為1后&#xff0c;重啟數據庫生效。 將參數修改為1 S…