import {
|
reactive,
|
ref,
|
onUnmounted,
|
VNode,
|
DirectiveBinding,
|
Directive,
|
computed,
|
} from 'vue'
|
import { ElMessage } from 'element-plus'
|
import sdk from 'sdk'
|
import { Permission, UserInfo, Props } from './Permission.d'
|
|
/**
|
* 开发环境
|
*/
|
const isDev = process.env.NODE_ENV === 'development'
|
/**
|
* 组件子权限
|
*/
|
let subsPermissions: Permission[] = []
|
/**
|
* 临时缓存权限
|
*/
|
const permissionCodes = ref<string[]>([])
|
|
/**
|
* 校验权限,发出警告
|
* @param code
|
* @returns
|
*/
|
const isPermission = (
|
code: (typeof subsPermissions)[number]['id'],
|
isHint = true
|
) => {
|
if (!permissionCodes.value.includes(code)) {
|
isHint && ElMessage.warning('用户没有该权限!')
|
return false
|
}
|
return true
|
}
|
|
export const vPermission: { [key: string]: Directive } = {
|
created(
|
el: HTMLElement,
|
binding: DirectiveBinding,
|
vNode: VNode,
|
prevVNode: VNode
|
) {
|
el.addEventListener(
|
'click',
|
(event: Event) => {
|
if (!isPermission(binding.value)) {
|
event.stopPropagation()
|
return false
|
}
|
},
|
true
|
)
|
},
|
}
|
|
/**
|
* 设置权限
|
* @param permissionMap
|
*/
|
const setPermissions = (permissionMap: Record<string, string>) => {
|
Object.entries(permissionMap).forEach(([key, value]) => {
|
subsPermissions.push({
|
id: key,
|
name: value,
|
})
|
})
|
}
|
|
/**
|
* 初始化权限
|
* @param props
|
* @param permissionMap
|
* @example usePermission(props, {
|
* 'user-add': '新增用户',
|
* })
|
*/
|
export const usePermission = (
|
props: Props | any,
|
permissionMap: Record<string, string>
|
) => {
|
subsPermissions = []
|
permissionCodes.value = []
|
setPermissions(permissionMap)
|
const node = computed(() => props.node || {})
|
|
const page = isDev
|
? {
|
permissions: [],
|
}
|
: // @ts-ignore
|
window.app.current.project?.current.page
|
const permission = {
|
id: node.value?.id,
|
name: node.value?.name,
|
subs: subsPermissions,
|
}
|
|
page.permissions = page.permissions || []
|
|
if (
|
page.permissions.every(
|
(item: typeof permission) => item.id !== permission.id
|
)
|
) {
|
page.permissions.push(permission)
|
}
|
const userInfo: UserInfo = isDev
|
? { permissions: { all: true, widgets: [] } }
|
: sdk.userInfo
|
|
const { all, widgets } = userInfo.permissions
|
permissionCodes.value = all
|
? permission.subs.map((item: Permission) => item.id)
|
: widgets
|
|
onUnmounted(() => {
|
if (node.value) {
|
const index = page.permissions.findIndex(
|
(f: any) => f.id === node.value?.id
|
)
|
if (index !== -1) {
|
page.permissions.splice(index, 1)
|
}
|
}
|
})
|
|
return {
|
isPermission,
|
}
|
}
|