权限常量和normalize权限列表函数抽离
This commit is contained in:
parent
7d91985bb2
commit
7cca406478
|
|
@ -1,123 +1,97 @@
|
||||||
import { useUserStore } from '@/store/user'
|
import { useUserStore } from '@/store/user'
|
||||||
|
import { ADMIN_ROLES, normalizePermissions } from '@/utils/permission'
|
||||||
const ADMIN_ROLES = ['admin', 'sys_admin']
|
|
||||||
|
|
||||||
const normalizePermissionList = (permissions) => {
|
|
||||||
if (!permissions) return []
|
|
||||||
if (Array.isArray(permissions)) return permissions.filter(Boolean)
|
|
||||||
if (typeof permissions === 'object') {
|
|
||||||
return Object.keys(permissions).filter(key => !!permissions[key])
|
|
||||||
}
|
|
||||||
if (typeof permissions === 'string') {
|
|
||||||
return permissions
|
|
||||||
.split(',')
|
|
||||||
.map((perm) => perm.trim())
|
|
||||||
.filter(Boolean)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
|
|
||||||
const resolveRequiredPermissions = (value) => {
|
const resolveRequiredPermissions = (value) => {
|
||||||
if (!value) return []
|
if (!value) return []
|
||||||
if (Array.isArray(value)) return value.filter(Boolean)
|
if (Array.isArray(value)) return value.filter(Boolean)
|
||||||
if (typeof value === 'string') {
|
if (typeof value === 'string') {
|
||||||
return value
|
return value
|
||||||
.split(',')
|
.split(',')
|
||||||
.map((item) => item.trim())
|
.map((item) => item.trim())
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
}
|
}
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
const evaluatePermission = (userStore, requiredPermissions, modifiers = {}) => {
|
const evaluatePermission = (userStore, requiredPermissions, modifiers = {}) => {
|
||||||
if (!userStore) return false
|
if (!userStore) return false
|
||||||
const { requireAll = modifiers.all } = modifiers
|
const {requireAll = modifiers.all} = modifiers
|
||||||
const permissionsToCheck = resolveRequiredPermissions(requiredPermissions)
|
const permissionsToCheck = resolveRequiredPermissions(requiredPermissions)
|
||||||
if (permissionsToCheck.length === 0) return true
|
if (permissionsToCheck.length === 0) return true
|
||||||
|
|
||||||
const userInfo = userStore.userInfo
|
const userInfo = userStore.userInfo
|
||||||
const userRoles = userInfo?.roles || []
|
const userRoles = userInfo?.roles || []
|
||||||
const isAdmin = Array.isArray(userRoles) && userRoles.some((role) => ADMIN_ROLES.includes(role))
|
const isAdmin = Array.isArray(userRoles) && userRoles.some((role) => ADMIN_ROLES.includes(role))
|
||||||
if (isAdmin) return true
|
if (isAdmin) return true
|
||||||
|
|
||||||
const userPermissions = normalizePermissionList(userInfo?.permissions)
|
const userPermissions = normalizePermissions(userInfo?.permissions)
|
||||||
if (userPermissions.length === 0) return false
|
if (userPermissions.length === 0) return false
|
||||||
|
|
||||||
if (requireAll) {
|
if (requireAll) {
|
||||||
return permissionsToCheck.every((permission) => userPermissions.includes(permission))
|
return permissionsToCheck.every((permission) => userPermissions.includes(permission))
|
||||||
}
|
}
|
||||||
|
|
||||||
return permissionsToCheck.some((permission) => userPermissions.includes(permission))
|
return permissionsToCheck.some((permission) => userPermissions.includes(permission))
|
||||||
}
|
}
|
||||||
|
|
||||||
const getUserStore = (binding, vnode) => {
|
const getUserStore = (binding, vnode) => {
|
||||||
const piniaInstance =
|
const piniaInstance =
|
||||||
binding?.instance?.proxy?.$pinia ||
|
binding?.instance?.proxy?.$pinia ||
|
||||||
binding?.instance?.appContext?.app?.$pinia ||
|
binding?.instance?.appContext?.app?.$pinia ||
|
||||||
vnode?.context?.$pinia ||
|
vnode?.context?.$pinia ||
|
||||||
binding?.instance?.appContext?.appContext?.provides?.pinia
|
binding?.instance?.appContext?.appContext?.provides?.pinia
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (piniaInstance) {
|
if (piniaInstance) {
|
||||||
return useUserStore(piniaInstance)
|
return useUserStore(piniaInstance)
|
||||||
|
}
|
||||||
|
return useUserStore()
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('[v-permission] failed to access pinia instance:', error)
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
return useUserStore()
|
|
||||||
} catch (error) {
|
|
||||||
console.warn('[v-permission] failed to access pinia instance:', error)
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const toggleElementVisibility = (el, shouldShow) => {
|
const toggleElementVisibility = (el, shouldShow) => {
|
||||||
if (shouldShow) {
|
if (shouldShow) {
|
||||||
el.style.display = el.__vOriginalDisplay || ''
|
el.style.display = el.__vOriginalDisplay || ''
|
||||||
} else {
|
} else {
|
||||||
if (el.style.display !== 'none') {
|
if (el.style.display !== 'none') {
|
||||||
el.__vOriginalDisplay = el.style.display
|
el.__vOriginalDisplay = el.style.display
|
||||||
|
}
|
||||||
|
el.style.display = 'none'
|
||||||
}
|
}
|
||||||
el.style.display = 'none'
|
el.__vPermissionVisible = shouldShow
|
||||||
}
|
|
||||||
el.__vPermissionVisible = shouldShow
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleDirective = (el, binding, vnode) => {
|
const handleDirective = (el, binding, vnode) => {
|
||||||
const userStore = getUserStore(binding, vnode)
|
const userStore = getUserStore(binding, vnode)
|
||||||
const shouldShow = evaluatePermission(userStore, binding.value, binding.modifiers)
|
const shouldShow = evaluatePermission(userStore, binding.value, binding.modifiers)
|
||||||
toggleElementVisibility(el, shouldShow)
|
toggleElementVisibility(el, shouldShow)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const registerPermissionDirective = (appOrVue) => {
|
export const registerPermissionDirective = (appOrVue) => {
|
||||||
if (!appOrVue) return
|
if (!appOrVue) return
|
||||||
|
|
||||||
const directiveConfig = {
|
const directiveConfig = {
|
||||||
mounted: handleDirective,
|
mounted: handleDirective,
|
||||||
updated: handleDirective,
|
updated: handleDirective,
|
||||||
beforeMount: handleDirective,
|
beforeMount: handleDirective,
|
||||||
beforeUpdate: handleDirective
|
beforeUpdate: handleDirective
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof appOrVue.directive === 'function') {
|
if (typeof appOrVue.directive === 'function') {
|
||||||
// Vue3
|
// Vue3
|
||||||
appOrVue.directive('permission', directiveConfig)
|
appOrVue.directive('permission', directiveConfig)
|
||||||
} else if (typeof appOrVue.prototype?.directive === 'function' || typeof appOrVue.directive === 'function') {
|
} else if (typeof appOrVue.prototype?.directive === 'function' || typeof appOrVue.directive === 'function') {
|
||||||
// Vue2 global Vue constructor
|
// Vue2 global Vue constructor
|
||||||
const VueCtor = appOrVue.prototype?.constructor || appOrVue
|
const VueCtor = appOrVue.prototype?.constructor || appOrVue
|
||||||
VueCtor.directive('permission', {
|
VueCtor.directive('permission', {
|
||||||
inserted: handleDirective,
|
inserted: handleDirective,
|
||||||
update: handleDirective,
|
update: handleDirective,
|
||||||
componentUpdated: handleDirective
|
componentUpdated: handleDirective
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default registerPermissionDirective
|
export default registerPermissionDirective
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,5 @@
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
|
import { ADMIN_ROLES, normalizePermissions } from '@/utils/permission'
|
||||||
const ADMIN_ROLES = ['admin', 'sys_admin']
|
|
||||||
|
|
||||||
const normalizePermissions = (permissions) => {
|
|
||||||
if (!permissions) return []
|
|
||||||
if (Array.isArray(permissions)) return permissions.filter(Boolean)
|
|
||||||
if (typeof permissions === 'object') {
|
|
||||||
return Object.keys(permissions).filter(key => !!permissions[key])
|
|
||||||
}
|
|
||||||
if (typeof permissions === 'string') {
|
|
||||||
return permissions
|
|
||||||
.split(',')
|
|
||||||
.map((perm) => perm.trim())
|
|
||||||
.filter(Boolean)
|
|
||||||
}
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户信息 Store
|
* 用户信息 Store
|
||||||
|
|
|
||||||
17
utils/permission.js
Normal file
17
utils/permission.js
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
export const ADMIN_ROLES = ['admin', 'sys_admin']
|
||||||
|
|
||||||
|
export const normalizePermissions = (permissions) => {
|
||||||
|
if (!permissions) return []
|
||||||
|
if (Array.isArray(permissions)) return permissions.filter(Boolean)
|
||||||
|
if (typeof permissions === 'object') {
|
||||||
|
return Object.values(permissions).filter((perm) => !!perm)
|
||||||
|
}
|
||||||
|
if (typeof permissions === 'string') {
|
||||||
|
return permissions
|
||||||
|
.split(',')
|
||||||
|
.map((perm) => perm.trim())
|
||||||
|
.filter(Boolean)
|
||||||
|
}
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user