统一业务页面权限与抽屉编辑

1、将 FAQ 分类和问题维护改为抽屉交互,并按分类、问题、回复的细粒度权限控制入口。

2、将注意事项、可行性和伦理记录接入详情页抽屉编辑,创建时支持先保存主记录再上传附件。

3、将参与者基础信息编辑改为抽屉,详情页按可读权限显示病史、访视、AE 和 PD 标签页。

4、补充业务页面权限一致性测试,覆盖停用中心、无权限入口和面包屑上下文。
This commit is contained in:
Cheng Zhou
2026-06-04 11:10:20 +08:00
parent 6a2e43f829
commit 6e8494abd5
39 changed files with 2334 additions and 337 deletions
+3 -3
View File
@@ -50,7 +50,7 @@ async def create_category(
action="CREATE_FAQ_CATEGORY",
detail=f"FAQ 分类 {category.name} 已创建",
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, payload.study_id, current_user),
)
return CategoryRead.model_validate(category)
@@ -112,7 +112,7 @@ async def update_category(
action="UPDATE_FAQ_CATEGORY",
detail=f"FAQ 分类 {category_id} 已更新",
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, updated.study_id, current_user),
)
return CategoryRead.model_validate(updated)
@@ -150,5 +150,5 @@ async def delete_category(
action="DELETE_FAQ_CATEGORY",
detail=f"FAQ 分类 {category_id} 已删除",
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, category.study_id, current_user),
)
+5 -5
View File
@@ -74,7 +74,7 @@ async def create_faq(
action="CREATE_FAQ_ITEM",
detail="FAQ 已创建",
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, payload.study_id, current_user),
)
return FaqRead.model_validate(item)
@@ -200,7 +200,7 @@ async def update_faq(
action=action,
detail=detail,
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, item.study_id, current_user),
)
return FaqRead.model_validate(updated)
@@ -356,7 +356,7 @@ async def create_reply(
action="CREATE_FAQ_REPLY",
detail="FAQ 已回复",
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, item.study_id, current_user),
)
data = FaqReplyRead.model_validate(reply)
if quote:
@@ -401,7 +401,7 @@ async def delete_faq(
action="DELETE_FAQ_ITEM",
detail="FAQ 已删除",
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, item.study_id, current_user),
)
@@ -454,5 +454,5 @@ async def delete_reply(
action="DELETE_FAQ_REPLY",
detail="FAQ 回复已删除",
operator_id=current_user.id,
operator_role=await get_operator_role_label(db, study_id, current_user),
operator_role=await get_operator_role_label(db, item.study_id, current_user),
)