feat(权限): 新增 v-permission 按钮级权限指令并移除前端权限别名

This commit is contained in:
yelan
2026-09-24 10:44:00 +08:00
parent e5b5412322
commit ec24e85829
11 changed files with 219 additions and 90 deletions
@@ -46,6 +46,7 @@ import {
readBackendStatus,
saveDocumentLibrary,
} from './mock'
import { DOC_TEMPLATE_PERMISSIONS, workflowPermission } from './permissions'
import type {
DepartmentTab,
DocumentBackendStatus,
@@ -72,42 +73,24 @@ const appStore = useAppStore()
const loginStore = useLoginStore()
const useMockLibrary = mockFlags.documents
const canCreateTemplate = computed(
() =>
!loginStore.isReadOnly &&
(useMockLibrary ||
loginStore.hasWritePermission(['sign:template:create', 'sign:template:version:create'])),
)
const canEditTemplate = computed(
() =>
!loginStore.isReadOnly &&
(useMockLibrary ||
loginStore.hasWritePermission(['sign:template:update', 'sign:template:version:create'])),
)
const canArchiveTemplate = computed(
() =>
!loginStore.isReadOnly &&
(useMockLibrary || loginStore.hasWritePermission('sign:template:archive')),
)
const canInitiateSigning = computed(
() =>
!loginStore.isReadOnly && (useMockLibrary || loginStore.hasWritePermission('sign:task:create')),
)
const workflowPermissions: Record<TemplateVersionAction, string> = {
'submit-review': 'sign:template:review:submit',
reject: 'sign:template:review:reject',
approve: 'sign:template:review:approve',
publish: 'sign:template:publish',
disable: 'sign:template:disable',
archive: 'sign:template:archive',
/**
* 页面操作的服务端校验兜底。
*
* 按钮是否显示由模板上的 v-permission 决定,这里必须用同一套权限码再判一次:
* 快捷键、回车提交和程序化调用不会经过按钮,只靠隐藏按钮挡不住。
*/
function canWriteDocument(permission: string) {
return !loginStore.isReadOnly && (useMockLibrary || loginStore.hasWritePermission(permission))
}
const canCreateTemplate = computed(() => canWriteDocument(DOC_TEMPLATE_PERMISSIONS.create))
const canEditTemplate = computed(() => canWriteDocument(DOC_TEMPLATE_PERMISSIONS.edit))
const canArchiveTemplate = computed(() => canWriteDocument(DOC_TEMPLATE_PERMISSIONS.stop))
const canInitiateSigning = computed(() => canWriteDocument(DOC_TEMPLATE_PERMISSIONS.initiate))
function canRunTemplateWorkflow(action: TemplateVersionAction) {
return (
!loginStore.isReadOnly &&
(useMockLibrary || loginStore.hasWritePermission(workflowPermissions[action]))
)
return canWriteDocument(workflowPermission(action))
}
/** 真实模式下的加载状态:区分"正在加载"与"确实没有模板" */
const libraryLoading = ref(false)
@@ -959,8 +942,7 @@ onMounted(() => {
v-model="filters.keyword"
:total="filteredTemplates.length"
:show-reset="useMockLibrary"
:can-create="canCreateTemplate"
:can-export="useMockLibrary"
:show-export="useMockLibrary"
@add="showAddMessage"
@export="showExportMessage"
@reset="resetMockData"
@@ -985,10 +967,6 @@ onMounted(() => {
v-for="template in filteredTemplates"
:key="template.id"
:template="template"
:can-edit="canEditTemplate"
:can-initiate="canInitiateSigning"
:can-workflow="canRunTemplateWorkflow"
:can-remove="canArchiveTemplate"
:is-mock="useMockLibrary"
@preview="handlePreview"
@edit="showEditMessage"