


import { usePermissionStore } from '@/store/modules/permission'
export const permissionDirective = {
mounted(el, binding) {
const permissionStore = usePermissionStore()
const { value } = binding
if (value && Array.isArray(value)) {
const hasPermission = permissionStore.hasPermission(value)
if (!hasPermission) {
el.parentNode?.removeChild(el)
}
} else {
throw new Error(`需要权限数组,如 v-permission="['add']"`)
}
}
}
import { defineStore } from 'pinia'
export const usePermissionStore = defineStore('permission', {
state: () => ({
permissionData: null,
authorizedRoutes: [],
}),
actions: {
setPermissionData(data) {
this.permissionData = data
},
setAuthorizedRoutes(routes) {
this.authorizedRoutes = routes
},
clearSessionData() {
this.permissionData = null
this.authorizedRoutes = []
},
hasPermission(permissions) {
if (!this.permissionData) return false
const checkPermission = (nodes, codes) => {
return nodes.some((node) => {
if (codes.includes(node.webPath)) return true
if (node.children?.length) {
return checkPermission(node.children, codes)
}
return false
})
}
return checkPermission(this.permissionData.permissionTree, permissions)
},
},
})
export default usePermissionStore
import { createApp } from 'vue'
import { permissionDirective } from './directives/permission'
const app = createApp(App)
app.directive('permission', permissionDirective)
app.mount('#app')
<template>
<!-- 只有有add权限才会显示 -->
可以每个页面加各自的标识:corn-add
<button v-permission="['add']">创建任务</button>
<!-- 多个权限满足其一即可 -->
<button v-permission="['add', 'edit']">操作按钮</button>
</template>