From e43a118dee0f2291d988afe800966c2ebf2d2f04 Mon Sep 17 00:00:00 2001 From: yelan Date: Thu, 3 Sep 2026 10:24:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(document-permissions):=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E6=9D=83=E9=99=90=E9=A1=B5=E9=9D=A2=E6=8C=89=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=8E=A5=E5=85=A5=E7=9C=9F=E5=AE=9E=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clinical-web/docs/document-permissions-api.md | 55 ++ .../api/management/document-permissions.ts | 1 + clinical-web/src/api/management/types.ts | 6 +- .../components/DepartmentPermissionTable.vue | 266 ++++++--- .../components/RolePermissionMatrix.vue | 104 +++- .../components/TemplatePermissionPanel.vue | 8 +- .../management/document-permissions/index.vue | 511 ++++++++++++++---- .../management/document-permissions/mock.ts | 50 +- .../management/document-permissions/types.ts | 14 +- 9 files changed, 789 insertions(+), 226 deletions(-) create mode 100644 clinical-web/docs/document-permissions-api.md diff --git a/clinical-web/docs/document-permissions-api.md b/clinical-web/docs/document-permissions-api.md new file mode 100644 index 0000000..4ff1a1f --- /dev/null +++ b/clinical-web/docs/document-permissions-api.md @@ -0,0 +1,55 @@ +# 文档权限页面接口接入说明 + +依据 default_OpenAPI (1).json,文档权限页面当前按“文档模板”维度接入权限。页面保留原型的三部分: + +1. **文档库权限矩阵**:说明可见、可用、可维护和继承规则。 +2. **按角色授权**:选择一个文档模板,调整角色的 VIEW、USE、MAINTAIN。 +3. **按科室授权**:沿用当前模板,调整科室的 VIEW、USE、MAINTAIN。 + +## 已接入接口 + +| 用途 | 方法 | 路径 | +| ---------------------- | ------ | --------------------------------------------------------- | +| 查询可配置模板 | GET | /api/v1/templates | +| 查询角色 | GET | /api/v1/roles | +| 查询科室 | GET | /api/v1/departments | +| 查询模板权限及继承结果 | GET | /api/v1/templates/{templateId}/permissions | +| 绑定模板权限 | POST | /api/v1/templates/{templateId}/permissions | +| 撤销模板权限 | DELETE | /api/v1/templates/{templateId}/permissions/{permissionId} | + +权限绑定请求使用 OpenAPI 中的 PermissionBindingRequest: + +```json +{ + "subjectType": "ROLE", + "subjectId": "", + "permissionLevel": "USE", + "effect": "ALLOW" +} +``` + +权限等级映射: + +- VIEW:可浏览模板 +- USE:可发起签署 +- MAINTAIN:可维护模板 + +## 页面保存行为 + +当前契约没有更新权限绑定的 PUT 接口,因此开关按以下规则保存: + +- 开启:删除同主体、同等级的直接 DENY;没有有效允许权限时 POST ALLOW。 +- 关闭:撤销直接 ALLOW;如果仍有继承的 ALLOW,POST 直接 DENY 覆盖继承。 +- 继承 DENY 没有持久化绑定 ID,且契约约定拒绝优先,页面将其显示为不可直接覆盖。 + +页面不会把继承结果当成可删除的直接绑定,也不会伪造全局权限矩阵数据。真实环境接口没有数据时会显示空态。 + +## 当前 OpenAPI 未提供的能力 + +如果产品要求“跨全部文档模板”的全局角色/科室权限矩阵,后端还需要提供以下能力之一: + +- 全局角色权限查询与批量保存接口; +- 全局科室权限查询与批量保存接口; +- 或提供带模板维度的批量权限查询/保存接口,避免前端逐个模板请求。 + +另外,当前 GET /api/v1/templates 的语义是查询当前用户有权限查看的模板。若权限管理员需要配置自己当前不可见的模板,请后端提供管理员可见的模板列表语义或专用接口。 diff --git a/clinical-web/src/api/management/document-permissions.ts b/clinical-web/src/api/management/document-permissions.ts index 05b5a8b..d79b1e0 100644 --- a/clinical-web/src/api/management/document-permissions.ts +++ b/clinical-web/src/api/management/document-permissions.ts @@ -95,6 +95,7 @@ function mapTemplatePermission(dto: TemplatePermissionResponseDto): TemplatePerm effect: dto.effect, inherited: dto.inherited, createdAt: formatDateTime(dto.createdAt), + createdBy: dto.createdBy, } } diff --git a/clinical-web/src/api/management/types.ts b/clinical-web/src/api/management/types.ts index 70e01bd..3cd6157 100644 --- a/clinical-web/src/api/management/types.ts +++ b/clinical-web/src/api/management/types.ts @@ -511,7 +511,7 @@ export type ApiPermissionLevel = 'VIEW' | 'USE' | 'MAINTAIN' export type ApiPermissionEffect = 'ALLOW' | 'DENY' export interface TemplatePermissionResponseDto { - id: string + id?: string templateId: string subjectType: ApiPermissionSubjectType subjectId: string @@ -519,10 +519,11 @@ export interface TemplatePermissionResponseDto { effect: ApiPermissionEffect inherited: boolean createdAt: string + createdBy?: string } export interface TemplatePermissionRecord { - id: string + id?: string templateId: string subjectType: ApiPermissionSubjectType subjectId: string @@ -531,6 +532,7 @@ export interface TemplatePermissionRecord { effect: ApiPermissionEffect inherited: boolean createdAt: string + createdBy?: string } export interface CreateTemplatePermissionRequest { diff --git a/clinical-web/src/views/management/document-permissions/components/DepartmentPermissionTable.vue b/clinical-web/src/views/management/document-permissions/components/DepartmentPermissionTable.vue index 8855748..f13cd0e 100644 --- a/clinical-web/src/views/management/document-permissions/components/DepartmentPermissionTable.vue +++ b/clinical-web/src/views/management/document-permissions/components/DepartmentPermissionTable.vue @@ -1,59 +1,109 @@ diff --git a/clinical-web/src/views/management/document-permissions/components/RolePermissionMatrix.vue b/clinical-web/src/views/management/document-permissions/components/RolePermissionMatrix.vue index d10e2ba..49b2a57 100644 --- a/clinical-web/src/views/management/document-permissions/components/RolePermissionMatrix.vue +++ b/clinical-web/src/views/management/document-permissions/components/RolePermissionMatrix.vue @@ -1,18 +1,46 @@