vue2使用use注冊自定義指令實現權限控制

版本環境

vue的版本是^2.6.12,將會使用到Vue.use()、Vue.directive()

適用環境

頁面某些按鈕,需要受到當前登錄用戶的“角色”“權限”的影響,通過store獲取角色role和權限permission,通過自定義指令的方式,控制某一個組件的顯示與隱藏。

文件架構

index.js文件,src/index.js

directive文件夾中三個文件,分別是src/directive/hasPermi.js、src/directive/hasRole.js、src/directive/index.js

前置配置

需要配合store使用,store.getter.roles角色,store.getters.permissions權限

文件內容

src/index.js文件

主要用于注冊組件。用注冊插件的方式,一次性注冊兩個指令

import Vue from 'vue'import permission from './directive'Vue.use(permission)// 省略其他

src/directive/index.js文件

import hasRole from './hasRole'
import hasPermi from './hasPermi'const install = function(Vue) {Vue.directive('hasRole', hasRole)Vue.directive('hasPermi', hasPermi)
}if (window.Vue) {window['hasRole'] = hasRolewindow['hasPermi'] = hasPermiVue.use(install); // eslint-disable-line
}export default install

vue2的官方文檔對Vue.directive()做了解釋,第一個參數為指令名稱,文件中設置了兩個指令,在組件中可以使用“v-hasPermi”和“v-hasRole”。就像使用v-if一樣來控制組件。

第二個參數為一個function方法,入參為VUE對象。

控制的邏輯就是很簡單的刪除VNode下面的所有Element元素。在另外兩個文件中可以具體看到。

src/directive/hasRole.js文件

 /*** 角色權限處理*/import store from '@/store'export default {inserted(el, binding, vnode) {const { value } = bindingconst super_admin = "admin";const roles = store.getters && store.getters.rolesif (value && value instanceof Array && value.length > 0) {const roleFlag = valueconst hasRole = roles.some(role => {return super_admin === role || roleFlag.includes(role)})if (!hasRole) {el.parentNode && el.parentNode.removeChild(el)}} else {throw new Error(`請設置角色權限標簽值"`)}}
}

inserted是鉤子函數,在官方文檔中有說明

在插入父節點的時候,判斷是否有權限,如果沒有的話,通過vnode刪除下面的所有子節點。

考慮到可能被多個角色控制,因此v-hasRole要傳入一個數組,通過判斷是否具有指定的字符串,只要滿足其中一個便顯示。否則通過el對象拿到parentNode節點,通過父節點的removeChild移除自身。

src/directive/hasPermi.js文件

 /*** 操作權限處理*/import store from '@/store'export default {inserted(el, binding, vnode) {const { value } = bindingconst all_permission = "*:*:*";const permissions = store.getters && store.getters.permissionsif (value && value instanceof Array && value.length > 0) {const permissionFlag = valueconst hasPermissions = permissions.some(permission => {return all_permission === permission || permissionFlag.includes(permission)})if (!hasPermissions) {el.parentNode && el.parentNode.removeChild(el)}} else {throw new Error(`請設置操作權限標簽值`)}}
}

和角色控制一樣的判斷邏輯,不同的是,按鈕這種權限,可以通過拼接或者特定字符指定。

假設一個list菜單,下面有兩個頁面add頁面和edit頁面,里面都有一個功能相同的按鈕,但是想細致的區分兩個權限。則,可以設置一個按鈕的權限為“list:add:btn"另一個的按鈕權限為"list:edit:btn”。對應的,如果同時有這兩個的權限,可以將兩個的值都設置為"list:all:btn"。

代碼示例,v-hasRole也是一樣

<el-button v-hasPermi="['list:add:btn']">確認</el-button><el-button v-hasPermi="['list:edit:btn']">確認</el-button>

精細到每一個組件的控制,還是按角色來粗略區分。要按實際業務需要,以及方便程度。

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

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

相關文章

antd DatePicker日期選擇框限制最多選擇一年

實現效果 實現邏輯 import React, { useState } from react;const ParentComponent () > {const [dates, setDates] useState(null);const disabledDate (current) > {if (!dates) {return false;}const tooLate dates[0] && current.diff(dates[0], days) &…

Appium自動化測試框架1

電腦的瀏覽器 手機的瀏覽器 手機上的app 原生的應用 純java 手機上的app apk 移動網頁應用 純HTML CSS 手機的瀏覽器上 電腦的瀏覽器上 混合應用 java html css python代碼 Appium python庫 Appium 手機 都是代表本機 0.0.0.0 127.0.0.1 localhost 如何啟動app 啟動參…

土壤養分化驗儀:農業生態與可持續發展

隨著現代農業技術的不斷進步&#xff0c;土壤養分化驗儀在農業生產中扮演著越來越重要的角色。這款高科技設備以其高精度、高效率的特點&#xff0c;為農業生態與可持續發展提供了強有力的支撐。 一、農田土壤監測與管理 農田是土壤養分化驗儀最主要的應用場所。通過對農田土壤…

【AI】DeepStream(14):圖像分割deepstream-segmentation-test示例演示

【AI】AI學習目錄匯總 1、簡介 deepstream-segmentation-test示例演示了圖像的語義分割。兩個配置文件,分別加載U-Net和Res-UNet兩種分割模型 unet_output_graph.uffunetres18_v4_pruned0.65_800_data.uffU-Net是一個在生物醫學圖像分割領域廣泛應用的卷積神經網絡(CNN),…

集團型企業組織架構復雜,業務線多,如何進行高效費用管控?

企業管理中流行這樣一句話&#xff1a;“企業轉型&#xff0c;財務先行”。對集團型企業而言&#xff0c;當今的發展形勢下&#xff0c;通過財務戰略全面轉型、最終撬動企業價值提升&#xff0c;是一件難而正確的事情。 集團企業具有經營規模大、產業鏈多、分支機構多、地域跨度…

地下電子標識器探測儀ED8000選型注意事項

ED8000探測儀是一臺集成了多頻率、多種ID標識器調制模式、高低靈敏度調節、可讀寫標識器等全功能、高性能電子標識器探測儀。它有著極高的靈敏度,同時具備良好的噪聲抑制能力&#xff0c;不僅適合專業測繪人員&#xff0c;普通操作人員也可以輕松掌握。 ED8000可支持模擬電子標…

洛谷 P1042 [NOIP2003 普及組] 乒乓球

洛谷 P1042 [NOIP2003 普及組] 乒乓球 題目背景 國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革&#xff0c;以推動乒乓球運動在全球的普及。其中 11 11 11 分制改革引起了很大的爭議&#xff0c;有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位…

2024亞洲國際餐飲展覽會(北京餐飲展|火鍋展|預制菜展會)

2024北京餐飲展會&#xff0c;2024北京食材展會&#xff0c;2024北京火鍋展會&#xff0c;2024北京火鍋食材展會&#xff0c;2024北京預制菜展會&#xff0c;2024北京預制食材展會&#xff0c; 2024亞洲國際餐飲展覽會&#xff08;北京餐飲展|火鍋展|預制菜展會&#xff09; …

【C語言】刷題筆記 Day2

【筆記】 【1】局部變量不初始化&#xff0c;默認放的隨機值。 1 int n0; 2 scanf("%d",&n); //13.141 【2】這里雖然輸入的是一個浮點數&#xff0c;但是只取整數部分。 【3】3.156e7 表示的是3.156*10的7次方。 【4】多組輸入&#xff0c;保存和不保存…

基于 Windows Server 2019 部署域控服務器

文章目錄 前言1. 域控服務器設計規劃2. 安裝部署域控服務器2.1. 添加 Active Directory 域服務2.2. 將服務器提升為域控制器2.3. 檢查域控服務器配置信息 3. 管理域賬號3.1. 新建域管理員賬號3.2. 新建普通域賬號 4. 服務器加域和退域4.1. 服務器加域操作4.2. 服務器退域操作 總…

Iperf基本用法

Iperf是一款開源的網絡性能測試工具&#xff0c;它可以用來測量網絡帶寬、延遲、抖動和數據包丟失等網絡性能指標。Iperf支持TCP和UDP協議&#xff0c;可以用于點對點或客戶端-服務器等模式的網絡測試。 安裝Iperf 在Linux系統中&#xff0c;您可以使用包管理器安裝Iperf。例如…

記錄一下簡單導入導出excel二級表頭

數據庫導入導出表頭 之前的工具類GenerateExcelToFile新增兩個導出這種二級表頭方法 package com.njry.utils;import cn.hutool.core.util.IdUtil; import com.njry.config.FileProperties; import com.njry.exception.BadRequestException; import org.apache.poi.hssf.user…

OpenGL的學習之路

Qt如何創建OpenGL的渲染窗口&#xff1f; 類比GLFW庫&#xff0c;Qt提供了OpenGL的渲染窗口類QOpenGLWidget&#xff1a; 1、重寫initializeGL()和resizeGL()函數來設置OpenGL狀態并提供透視圖轉換。 2、重寫paintGL()來繪制3D場景&#xff0c;只調用OpenGL函數。 3、還可以…

python 基礎綜合應用——小開發

#python 基礎綜合應用——小開發 綜合復習 變量- 循環- 函數- 模塊 開發 名片管理系統 名片管理系統介紹 名片管理系統可以理解成花名冊軟件&#xff0c;通過個人新建人的信息后可以進行查詢等簡單操作的程序 名片管理系統有三個作用&#xff0c; 1.新建名片 2.顯示全部名…

【設計模式】裝飾者模式里Java實現

插&#xff1a; AI時代&#xff0c;程序員或多或少要了解些人工智能&#xff0c;前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家(前言 – 人工智能教程 ) 堅持不懈&#xff0c;越努力越幸運&#xff0c;大家…

【VIM的使用】

Vim 是一個非常強大的文本編輯器&#xff0c;尤其在 Linux 環境下被廣泛使用。它基于 vi 編輯器開發而來&#xff0c;增加了許多功能和改進。下面是一個簡化的 Vim 教程&#xff0c;幫助你快速上手&#xff1a; 啟動 Vim 要啟動 Vim&#xff0c;只需在終端中輸入 vim [filen…

Leetcode刷題2---兩數相加 Python

目錄 題目及分析解法一: 迭代法解法二: 遞歸法解法三&#xff1a;反轉鏈表法 題目及分析 &#xff08;力扣序號2&#xff1a;兩數相加&#xff09; 給你兩個非空的鏈表&#xff0c;表示兩個非負的整數。它們每位數字都是按照逆序的方式存儲的&#xff0c;并且每個節點只能存儲…

python之音頻處理(2)兩個音頻文件的合并

from pydub import AudioSegment# 加載兩個音頻文件 audio1 AudioSegment.from_file(r"D:\websiteDownload\huanxing.wav") audio2 AudioSegment.from_file(r"D:\websiteDownload\我今天被一件事情搞得很煩.wav")# 設置間隔&#xff08;單位&#xff1a;…

Altium Designer專業PCB設計軟件下載安裝 Altium Designer安裝包下載獲取

在電子設計的廣袤領域中&#xff0c;PCB設計無疑占據著重要的地位。而Altium Designer作為一款業界領先的電子設計自動化軟件&#xff0c;其提供的先進布局工具&#xff0c;無疑為設計師們打開了一扇通往高效、精確設計的大門。 在PCB設計的核心環節——布局中&#xff0c;Alti…

初學Spring之自動裝配 Bean

Bean 的作用域&#xff1a; 1.單例模式&#xff08;Spring 默認機制&#xff09; scope“singleton” 2.原型模式&#xff1a;每次從容器中 get 時&#xff0c;都會產生一個新對象 scope"prototype" 3. request、session、application&#xff0c;只能在 web 開…