vue實(shí)現(xiàn)前端按鈕組件權(quán)限管理
方案1:數(shù)組+自定義指令
把權(quán)限放到數(shù)組中,通過vue的自定義指令來判斷是否擁有該權(quán)限,有則顯示,反之則不顯示
我們可以把這個(gè)按鈕需要的權(quán)限放到組件上
<el-button v-hasPermi="['home:advertising:update']" >新建</el-button>
自定義指令:
邏輯就是我們在登陸后會(huì)獲取該用戶的權(quán)限,并存儲(chǔ)到localStorage中,當(dāng)一個(gè)按鈕展示時(shí)會(huì)判斷l(xiāng)ocalStorage存儲(chǔ)的權(quán)限列表中是否存在該按鈕所需的權(quán)限。
/**
* 權(quán)限處理
*/
?
export default {
inserted(el, binding, vnode) {
const { value } = binding;
const SuperPermission = "superAdmin"; // 超級(jí)用戶,用于開發(fā)和測試
const permissions = localStorage.getItem('userPermissions')&& localStorage.getItem('userPermissions').split(',');
// 判斷傳入的組件權(quán)限是否符合要求
if (value && value instanceof Array && value.length > 0) {
const permissionFlag = value;
const hasPermissions = permissions && permissions.some(permission => all_permission === permission || permissionFlag.includes(permission));
// 判斷是否有權(quán)限是否要展示
if (!hasPermissions) {
el.parentNode && el.parentNode.removeChild(el);
}
} else {
throw new Error(`請?jiān)O(shè)置操作權(quán)限標(biāo)簽值`);
}
},
};
注冊權(quán)限
import Vue from 'vue';
import Vpermission from "./permission";
// 按鈕權(quán)限 自定義指令
Vue.directive('permission', Vpermission);
關(guān)于路由權(quán)限
數(shù)組的方案也可以用到菜單權(quán)限上,可以在路由的meta中攜帶該路由所需的權(quán)限,例如:
const router = [{
path: 'needPermissionPage',
name: 'NeedPermissionPage',
meta: {
role: ['permissionA', 'permissionB'],
},
}]
這個(gè)時(shí)候就需要在渲染權(quán)限的時(shí)候動(dòng)態(tài)渲染了,該方案可以看一下其他的文章或成熟的項(xiàng)目,寫的非常好
方案2: 二進(jìn)制
通過二進(jìn)制來控制權(quán)限:
假設(shè)我們有增刪改查四個(gè)基本權(quán)限:
const UPDATE = 0b000001; const DELETE = 0b000010; const ADD = 0b000100; const SEARCH = 0b001000;
每一位代表是否有該權(quán)限,有該權(quán)限則是1,反之是0
表達(dá)權(quán)限:
我們可以使用或運(yùn)算來表達(dá)一個(gè)權(quán)限結(jié)果,或運(yùn)算:兩個(gè)任何一個(gè)為1,結(jié)果就為1
const reslut = UPDATE | DELETE | SEARCH; console.log(reslut); // 11
變成了十進(jìn)制,我們可以通過toString方法變?yōu)槎M(jìn)制結(jié)果
const reslut = UPDATE | DELETE | SEARCH; console.log(reslut.toString(2)); // 1011
result 這個(gè)結(jié)果就代表我們既擁有更新權(quán)限,同時(shí)也擁有刪除和查詢的權(quán)限
那么我們可以將十進(jìn)制的reslut當(dāng)作該用戶的權(quán)限,把這個(gè)結(jié)果給后臺(tái),下次用戶登陸后只需要返回這個(gè)結(jié)果就可以了。
權(quán)限判斷
我們了解了如何表達(dá)一個(gè)權(quán)限,那如何做權(quán)限的判斷呢?
可以通過且運(yùn)算,且運(yùn)算:兩位都為1,這一位的結(jié)果才是1。
還是用上面的結(jié)果,當(dāng)我們從接口中拿到了reslut,判斷他是否有 DELETE 權(quán)限:
console.log((reslut & DELETE) === DELETE); // true
是否有新增的權(quán)限
console.log((result & ADD) === ADD); // false
判斷和使用
/**
* 接受該組件所需的權(quán)限,返回用戶權(quán)限列表是否有該權(quán)限
* @param {String} permission
* @returns {Boolean}
*/
function hasPermission(permission) {
const permissionList = {
UPDATE: 0b000001,
DELETE: 0b000010,
CREATE: 0b000100,
SEARCH: 0b001000
}
let btnPermission = permissionList[permission] ? permissionList[permission] : -1;
if (btnPermission === -1) return false;
const userPermission = localStorage.getItem('userPermissions');
// 將本地十進(jìn)制的值轉(zhuǎn)換為二進(jìn)制
const userPermissionBinary = userPermission.toString(2);
// 對比組件所需權(quán)限和本地存儲(chǔ)的權(quán)限
return (userPermissionBinary & btnPermission) === btnPermission;
}
直接在組件中通過v-show/v-if來控制是否展示
<el-button v-show="hasPermission('UPDATE')">更新</el-button>
小結(jié)
我理解來說,對于方案1來說,方案2的優(yōu)勢在于更簡潔,后臺(tái)僅需要存儲(chǔ)一個(gè)十進(jìn)制的值,但如果后期新增需求更新了新的權(quán)限,可能需要調(diào)整二進(jìn)制的位數(shù)來滿足業(yè)務(wù)需求。方案1的優(yōu)勢在于更加易懂,新增權(quán)限時(shí)僅需要更新組件自定義指令的數(shù)組。
以上就是vue實(shí)現(xiàn)前端按鈕組件權(quán)限管理的詳細(xì)內(nèi)容,更多關(guān)于vue 前端按鈕組件權(quán)限的資料請關(guān)注腳本之家其它相關(guān)文章!
- Vue自定義指令實(shí)現(xiàn)按鈕級(jí)的權(quán)限控制的示例代碼
- vue3實(shí)現(xiàn)按鈕權(quán)限管理的項(xiàng)目實(shí)踐
- vue3?自定義指令控制按鈕權(quán)限的操作代碼
- vue使用自定義指令來控制頁面按鈕組的權(quán)限思想
- vue使用自定義指令實(shí)現(xiàn)按鈕權(quán)限展示功能
- vue路由權(quán)限和按鈕權(quán)限的實(shí)現(xiàn)示例
- vue 按鈕 權(quán)限控制介紹
- Vue實(shí)現(xiàn)按鈕級(jí)權(quán)限方案
- Vue按鈕權(quán)限的實(shí)現(xiàn)示例
相關(guān)文章
使用vue-cli(vue腳手架)快速搭建項(xiàng)目的方法
本篇文章主要介紹了使用vue-cli(vue腳手架)快速搭建項(xiàng)目的方法,vue-cli 是一個(gè)官方發(fā)布 vue.js 項(xiàng)目腳手架,使用 vue-cli 可以快速創(chuàng)建 vue 項(xiàng)目,感興趣的小伙伴們可以參考一下2018-05-05
Vue2項(xiàng)目中Mock.js的完整集成與使用教程
Mock.js 是一個(gè)可以在開發(fā)階段模擬后端數(shù)據(jù)接口的 JavaScript 庫,它能夠生成大量不同類型的隨機(jī)數(shù)據(jù),并且模擬真實(shí)的接口返回,允許前端開發(fā)在沒有真實(shí)后端接口的情況下進(jìn)行開發(fā),本文給大家介紹了Vue2項(xiàng)目中Mock.js的完整集成與使用教程,需要的朋友可以參考下2025-02-02
vue自定義樹狀結(jié)構(gòu)圖的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue自定義樹狀結(jié)構(gòu)圖的實(shí)現(xiàn)方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
vue實(shí)現(xiàn)全屏滾動(dòng)效果(非fullpage.js)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)全屏滾動(dòng)效果,非fullpage.js,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
解決vue項(xiàng)目刷新后,導(dǎo)航菜單高亮顯示的位置不對問題
今天小編就為大家分享一篇解決vue項(xiàng)目刷新后,導(dǎo)航菜單高亮顯示的位置不對問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
詳解Vue3如何優(yōu)雅的監(jiān)聽localStorage變化
最近在研究框架,也仔細(xì)用了Vue3一些功能,所以本文就來和大家聊聊Vue3如何實(shí)現(xiàn)優(yōu)雅的監(jiān)聽localStorage的變化,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06
vue template中slot-scope/scope的使用方法
今天小編就為大家分享一篇vue template中slot-scope/scope的使用方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09

