管理端項目牽涉到多種角色的登錄,進而需要很多判斷權限的問題,例如菜單權限、按鈕權限等。這個問題在我第一份工作的時候並沒有實現,所以心有遺憾,后來第二份工作中關於按鈕和菜單的權限是每處去比對判斷的,總覺得不是最合適的方法,作為有經驗的前端(吹噓一番而已,此處省略3個字.....😂),應該考慮到的是用最少的代碼實現最廣泛的功能,而不是在改動的時候需要每一處都修改,沒有任何“框架”的思想,,所以廢話不多說了,開始吧。
菜單權限和按鈕權限都是需要這些步驟:
- 拿到能看到的菜單或者按鈕的列表
- 當前按鈕和菜單的權限
- 判斷當前權限是否在能夠看到的權限列表里面
在用戶請求login接口時,返回的信息中有buttonRoleList信息,這里是按鈕權限的信息,里面是所有當前用戶的按鈕權限,數據類型如

登錄時獲取到buttonRoleList后須要將數據存儲在vuex中,且調用createStyle操作,createStyle的方法實現如下:
1 export function createStyle (styleList, styleid = 'styleBtnRole') { 2 // 先更新按鈕角色列表 3 buttonRoleList = styleList; 4 // 在頁面head中增加id為styleBtnRole的style樣式 5 var head = document.getElementsByTagName('head')[0]; 6 var styleBtnRole = document.getElementById(styleid); 7 if (styleBtnRole) { 8 head.removeChild(styleBtnRole); 9 } 10 if (styleList.length) { 11 styleBtnRole = document.createElement('style'); 12 styleBtnRole.id = styleid; 13 styleBtnRole.type = 'text/css'; 14 // 樣式中是遍歷增加class為buttonRoleList中每一項的樣式 15 var cssText = ''; 16 styleList.forEach(style => { 17 cssText += '.' + style + '{transform: scale(1);-webkit-transform: scale(1);}'; 18 }); 19 if (styleBtnRole.styleSheet) { // IE 20 styleBtnRole.styleSheet.cssText = cssText; 21 } else { // w3c 22 // w3c瀏覽器中只要創建文本節點插入到style元素中就行了 23 var textNode = document.createTextNode(cssText); 24 styleBtnRole.appendChild(textNode); 25 } 26 head.appendChild(styleBtnRole); 27 } 28 }
注意此處scale(0)為不可見,scale(1)為可見。
head中最終渲染的style如下:

同時每個需要判斷權限的按鈕上增加authComponent class,而authComponent的樣式為:
1 .authComponent{ 2 transform: scale(0); 3 }
實現邏輯是所有按鈕默認不展示,當獲取到對應的權限后,增加對應的權限樣式時才會顯示,如下圖:
需要注意的時,顯示按鈕class的獲取,在配置權限時可以增加該class,便於查找。
平時學到的一些技術和技巧都沒有記錄下來,以后就多多記錄,共同學習進步啦啦啦啦啦啦。。。。歡迎指點😂