您好,登錄后才能下訂單哦!
本篇內容介紹了“vue權限控制與管理的實現方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
菜單權限:控制用戶在系統中能夠看到哪些菜單項
菜單權限指的就是后臺系統中的左側的菜單欄,前端可以根據后端接口返回的權限數據結合element-ui菜單組件循環拼接而成即可,有什么權限就展示什么菜單
通過vuex+持久化插件(本地存儲)解決刷新頁面菜單欄不顯示問題
實現退出登錄功能時,通過clear()
方法清除本地數據,跳轉后通過window.location.reload()
刷新當前頁面,可實現清除vuex數據的操作
路由權限為了防止用戶惡意通過在地址欄輸入地址發生強行跳轉,可以通過動態路由對用戶權限做出相關限制,有權限則跳轉,無權限則跳轉404頁面
路由權限的方法需要在兩個時機調用initDynamicRoutes
,分別是登錄成功時和頁面創建時,否則動態路由為默認值,刷新無法訪問
import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '@/layout'
import store from '@/store'
Vue.use(VueRouter)
// 動態路由規則
const tableRule = {
path: '/table',
name: 'table',
component: () => import('@/views/table/index.vue')
}
const imageRule = {
path: '/image',
name: 'image',
component: () => import('@/views/image')
}
const userRule = {
path: '/users',
name: 'users',
component: () => import('@/views/users')
}
// 路由規則和字符串的映射關系
const ruleMapping = {
table: tableRule,
users: userRule,
image: imageRule
}
//靜態路由
const routes = [
{
path: '/login',
// name: 'login', // 這里如果有name 控制臺會提示
component: () => import('@/views/login')
},
{
path: '/',
component: Layout,
children: [
{
path: '',
// name: 'home',
component: () => import('@/views/home')
},
{
path: '/chart',
component: () => import('@/views/chart')
}
]
}
]
const router = new VueRouter({
routes
})
//路由權限:用戶登錄后接口返回,存儲到本地緩存
const rightList = [
{
id: 1,
authName: "基本頁面",
icon: "el-icon-connection",
children: [
{
id: 11,
authName: "表格頁面",
icon: "el-icon-s-grid",
path: "table",
rights: ["view", "edit", "add", "delete"]
},
{
id: 12,
authName: "素材頁面",
icon: "el-icon-s-marketing",
path: "image",
rights: ["view", "edit", "add", "delete"]
}
]
},
{
id: 2,
authName: "用戶權限",
icon: "el-icon-set-up",
children: [
{
id: 21,
authName: "權限頁面",
icon: "el-icon-s-custom",
path: "users",
rights: ["view", "edit", "add", "delete"]
}
]
}
];
//在登錄(login.vue)、頁面刷新(App.vue)的時候,調用initDynamicRoutes
export function initDynamicRoutes () {
// 根據二級權限 對路由規則進行動態的添加
const currentRoutes = router.options.routes
rightList.forEach(item => { // 如果是沒有子路由的話 就直接添加進去 如果有子路由的話就進入二級權限遍歷
if (item.path) {
const temp = ruleMapping[item.path]
// 路由規則中添加元數據meta
temp.meta = item.rights
currentRoutes[1].children.push(temp)
}
item.children.forEach(item => {
// item 二級權限
const temp = ruleMapping[item.path]
// 路由規則中添加元數據meta,用于按鈕權限控制
temp.meta = item.rights
currentRoutes[1].children.push(temp)
})
})
// 添加路由規則
router.addRoutes(currentRoutes)
}
export default router
所謂的按鈕權限是指在某個菜單的界面中,我們需要根據后端返回的該角色當前操作模塊中對應的按鈕權限數據,展示出可進行操作的按鈕,比如刪除,修改,增加等按鈕.
如果要實現按鈕的權限控制,我們需要使用vue的自定義指令去實現: 首先需要創建一個按鈕權限控制的指令,我們定義這個指令的名稱為: v-permission
在這個指令的內部獲取到當前用戶的按鈕權限(vuex|本地緩存中)數據
在通過binding.value
獲取到自定義制定屬性值的數據
判斷從vuex|本地緩存
中獲取到的按鈕權限數據是否包含了自定義指令包含的權限
如果不包含,我們在設置el.style.display = “none”
,或者使用el.parentNode.removeChild(el)
刪除當前 按鈕元素
<el-button v-permission="[$route.path, 'add']">添加</el-button>
directives: {
// 檢測全選的指令
permission: {
// 綁定此指令的標簽插入到dom節點觸發
inserted(el, bind) {
// el:綁定該指令標簽
// bind:對象格式 當前綁定指令標簽上的數據情況
// 獲取按鈕上的value值,就是用戶當前要使用的權限和請求的路由地址
let value = bind.value//['/user','add']
//模擬后端返回的當前角色對應的權限
let rules = {
'/menu': ['add', 'edit'],
"/user": [ 'edit', 'remove'],
"/goods": ['add']
}
// 根據訪問的路由地址獲取該模塊的操作權限
let allow = rules[value[0]]
// 檢測當前操作是否合法
if (!allow.includes(value[1])) {
// 不合法隱藏操作按鈕
el.style = "display:none"
}
}
}
}
數據權限
就是不同的角色用戶看到的表格數據是不一樣的
比如張三是項目經理就可以看到某一個業務表格中的所有數據和字段信息
李四是普通員工只能看到表格中自己的數據
代碼實現: 前端在請求頭統一封裝,攜帶用戶信息,最后由后端檢測該用戶權限解析返回對應的數據即可;
import axios from 'axios'
import router from '@/router'
const request = axios.create()
// 映射
const actionMapping = {
get: 'view',
post: 'add',
put: 'edit',
delete: 'delete'
}
// request.defaults.baseURL = 'http://127.0.0.1:7001' // 注釋掉之后調的接口將是Mock數據
// 請求攔截器
request.interceptors.request.use(req => {
// console.log(req.url)
// console.log(req.method)
if (req.url !== '/login' && req.url !== '/roles') {
// 不是登錄的請求 也不是獲取權限的請求 則在請求頭中加入token 不知道如何使用Mock來驗證請求頭中的token 故此處注釋
// req.headers.Authorization = sessionStorage.getItem('token')
const action = actionMapping[req.method]
// 判斷非權限范圍內的請求
// console.log(router)
const currentRight = router.currentRoute.meta
// console.log(currentRight)
if (currentRight && currentRight.indexOf(action) === -1) {
// 沒有權限
alert('沒有權限')
return Promise.reject(new Error('沒有權限'))
}
}
return req
})
export default request
“vue權限控制與管理的實現方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。