2025-09-26 14:56:39 +08:00

68 lines
2.1 KiB
JavaScript

/**
* @name Action
* @description 权限
* @example v-action:action || v-action="'action'" || v-action="['action1', 'action2']"
* @type {{mounted: actionDirective.mounted}}
*/
import router from '@/router'
const action = {
mounted: (el, binding) => {
// const route = router.currentRoute.value
// const actions = route?.meta?.actions ?? []
// const actionName = binding.arg || binding.value
//
// if (route?.meta?.actions.includes('*')) return
//
// if (!actionName) return
// if (Array.isArray(actionName)) {
// // 多个权限
// if (!actions.some((value) => actionName.includes(value))) {
// ;(el.parentNode && el.parentNode.removeChild(el)) || (el.style.display = 'none')
// }
// } else {
// // 一个权限,完全匹配
// if (!actions.includes(actionName)) {
// ;(el.parentNode && el.parentNode.removeChild(el)) || (el.style.display = 'none')
// }
// }
const { value: elActions } = binding
const route = router.currentRoute.value
const currentActions = route?.meta?.actions ?? []
const actions = typeof value === 'string' ? elActions.split() : elActions
if (currentActions.includes('*')) return
if (!currentActions.some((action) => actions.includes(action))) {
el.remove() || (el.style.display = 'none')
}
},
}
/**
* 校验权限
* @param {string | array} actions
*/
const checkAction = (actions = '') => {
const route = router.currentRoute.value
const currentActions = route?.meta?.actions ?? []
actions = typeof actions === 'string' ? actions.split() : actions
if (currentActions.includes('*')) {
return true
}
if (!currentActions.some((action) => actions.includes(action))) {
return false
}
return true
}
export const setupActionDirective = (app) => {
app.directive('action', action)
app.config.globalProperties.$checkAction = checkAction
return app
}
export default setupActionDirective