init
This commit is contained in:
15
src/directives/index.ts
Normal file
15
src/directives/index.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import type { App } from 'vue'
|
||||
import { hasRole } from './permission/hasRole'
|
||||
import { hasPermi } from './permission/hasPermi'
|
||||
import { hasResize } from './resize/ResizeObserver'
|
||||
|
||||
/**
|
||||
* 导出指令:v-xxx
|
||||
* @methods hasRole 用户权限,用法: v-hasRole
|
||||
* @methods hasPermi 按钮权限,用法: v-hasPermi
|
||||
*/
|
||||
export const setupAuth = (app: App<Element>) => {
|
||||
hasRole(app)
|
||||
hasPermi(app)
|
||||
hasResize(app)
|
||||
}
|
||||
27
src/directives/permission/hasPermi.ts
Normal file
27
src/directives/permission/hasPermi.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import type { App } from 'vue'
|
||||
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
||||
|
||||
const { t } = useI18n() // 国际化
|
||||
|
||||
export function hasPermi(app: App<Element>) {
|
||||
app.directive('hasPermi', (el, binding) => {
|
||||
const { wsCache } = useCache()
|
||||
const { value } = binding
|
||||
const all_permission = '*:*:*'
|
||||
const permissions = wsCache.get(CACHE_KEY.USER).permissions
|
||||
|
||||
if (value && value instanceof Array && value.length > 0) {
|
||||
const permissionFlag = value
|
||||
|
||||
let hasPermissions = false
|
||||
permissionFlag.forEach(permiKey => {
|
||||
if (all_permission === permiKey || permissions[permiKey]) hasPermissions = true
|
||||
})
|
||||
if (!hasPermissions) {
|
||||
el.parentNode && el.parentNode.removeChild(el)
|
||||
}
|
||||
} else {
|
||||
throw new Error(t('permission.hasPermission'))
|
||||
}
|
||||
})
|
||||
}
|
||||
27
src/directives/permission/hasRole.ts
Normal file
27
src/directives/permission/hasRole.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import type { App } from 'vue'
|
||||
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
||||
|
||||
const { t } = useI18n() // 国际化
|
||||
|
||||
export function hasRole(app: App<Element>) {
|
||||
app.directive('hasRole', (el, binding) => {
|
||||
const { wsCache } = useCache()
|
||||
const { value } = binding
|
||||
const super_admin = 'admin'
|
||||
const roles = wsCache.get(CACHE_KEY.USER).roles
|
||||
|
||||
if (value && value instanceof Array && value.length > 0) {
|
||||
const roleFlag = value
|
||||
|
||||
const hasRole = roles.some((role: string) => {
|
||||
return super_admin === role || roleFlag.includes(role)
|
||||
})
|
||||
|
||||
if (!hasRole) {
|
||||
el.parentNode && el.parentNode.removeChild(el)
|
||||
}
|
||||
} else {
|
||||
throw new Error(t('permission.hasRole'))
|
||||
}
|
||||
})
|
||||
}
|
||||
31
src/directives/resize/ResizeObserver.ts
Normal file
31
src/directives/resize/ResizeObserver.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import type { App } from 'vue'
|
||||
const map = new WeakMap()
|
||||
const ob = new ResizeObserver((entries) => {
|
||||
for (const entry of entries) {
|
||||
// 获取dom元素的回调
|
||||
const handler = map.get(entry.target)
|
||||
//存在回调函数
|
||||
if (handler) {
|
||||
// 将监听的值给回调函数
|
||||
handler({
|
||||
width: entry.borderBoxSize[0].inlineSize,
|
||||
height: entry.borderBoxSize[0].blockSize
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
export function hasResize(app: App<Element>) {
|
||||
app.directive('hasResize', {
|
||||
mounted(el, binding) {
|
||||
map.set(el, binding.value)
|
||||
ob.observe(el)
|
||||
},
|
||||
unmounted(el) {
|
||||
ob.unobserve(el)
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
export default hasResize
|
||||
Reference in New Issue
Block a user