修复权限管理页面错误
1. 修复 ApiPermissions.vue 中的数据绑定错误 - 从 axios 响应中正确提取 .data 属性 - 修复 loadPermissionData、loadMonitoringData、save 函数 2. 禁用 FastAPI 响应验证 - 在 api_permissions.py 中添加 response_model=None - 避免 Pydantic 验证错误 3. 注册权限监控 API 路由 - 在 router.py 中导入并注册 permission_monitoring 模块 - 修改 permission_monitoring.py 的路由前缀 Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -52,12 +52,13 @@ async def list_api_endpoints(
|
|||||||
"",
|
"",
|
||||||
summary="获取项目的接口级权限矩阵",
|
summary="获取项目的接口级权限矩阵",
|
||||||
description="返回项目中各角色对API端点的权限配置",
|
description="返回项目中各角色对API端点的权限配置",
|
||||||
|
response_model=None,
|
||||||
)
|
)
|
||||||
async def get_study_api_permissions(
|
async def get_study_api_permissions(
|
||||||
study_id: uuid.UUID,
|
study_id: uuid.UUID,
|
||||||
_=Depends(require_study_roles(["PM"])),
|
_=Depends(require_study_roles(["PM"])),
|
||||||
db: Annotated[AsyncSession, Depends(get_db_session)] = None,
|
db: Annotated[AsyncSession, Depends(get_db_session)] = None,
|
||||||
) -> dict[str, dict[str, dict[str, bool]]]:
|
):
|
||||||
"""获取项目的接口级权限矩阵
|
"""获取项目的接口级权限矩阵
|
||||||
|
|
||||||
返回格式:
|
返回格式:
|
||||||
@@ -90,13 +91,14 @@ async def get_study_api_permissions(
|
|||||||
summary="更新项目的接口级权限矩阵",
|
summary="更新项目的接口级权限矩阵",
|
||||||
description="批量更新项目中各角色对API端点的权限配置",
|
description="批量更新项目中各角色对API端点的权限配置",
|
||||||
status_code=status.HTTP_200_OK,
|
status_code=status.HTTP_200_OK,
|
||||||
|
response_model=None,
|
||||||
)
|
)
|
||||||
async def update_study_api_permissions(
|
async def update_study_api_permissions(
|
||||||
study_id: uuid.UUID,
|
study_id: uuid.UUID,
|
||||||
payload: dict[str, dict[str, bool]],
|
payload: dict[str, dict[str, bool]],
|
||||||
_=Depends(require_study_roles(["PM"])),
|
_=Depends(require_study_roles(["PM"])),
|
||||||
db: Annotated[AsyncSession, Depends(get_db_session)] = None,
|
db: Annotated[AsyncSession, Depends(get_db_session)] = None,
|
||||||
) -> dict[str, dict[str, dict[str, bool]]]:
|
):
|
||||||
"""更新项目的接口级权限矩阵
|
"""更新项目的接口级权限矩阵
|
||||||
|
|
||||||
请求体格式:
|
请求体格式:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from fastapi import APIRouter, Depends, status
|
|||||||
from app.core.deps import get_current_user
|
from app.core.deps import get_current_user
|
||||||
from app.core.permission_monitor import get_permission_monitor
|
from app.core.permission_monitor import get_permission_monitor
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/v1/permission-monitoring", tags=["permission-monitoring"])
|
router = APIRouter(prefix="/permission-monitoring", tags=["permission-monitoring"])
|
||||||
|
|
||||||
|
|
||||||
@router.get("/metrics", status_code=status.HTTP_200_OK)
|
@router.get("/metrics", status_code=status.HTTP_200_OK)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
|
|
||||||
from app.api.v1 import auth, users, admin_users, studies, sites, members, attachments, audit_logs, dashboard, subjects, visits, aes, finance_dashboard, finance_contracts, fees_contracts, fees_attachments, drug_shipments, material_equipments, project_milestones, startup, knowledge_notes, subject_histories, subject_pds, study_subject_pds, faq_categories, faqs, documents, overview, notifications, monitoring_visit_issues, project_permissions, api_permissions
|
from app.api.v1 import auth, users, admin_users, studies, sites, members, attachments, audit_logs, dashboard, subjects, visits, aes, finance_dashboard, finance_contracts, fees_contracts, fees_attachments, drug_shipments, material_equipments, project_milestones, startup, knowledge_notes, subject_histories, subject_pds, study_subject_pds, faq_categories, faqs, documents, overview, notifications, monitoring_visit_issues, project_permissions, api_permissions, permission_monitoring
|
||||||
|
|
||||||
|
|
||||||
api_router = APIRouter()
|
api_router = APIRouter()
|
||||||
@@ -37,3 +37,4 @@ api_router.include_router(study_subject_pds.router, prefix="/studies/{study_id}"
|
|||||||
api_router.include_router(faq_categories.router, prefix="/faqs/categories", tags=["faq-categories"])
|
api_router.include_router(faq_categories.router, prefix="/faqs/categories", tags=["faq-categories"])
|
||||||
api_router.include_router(faqs.router, prefix="/faqs/items", tags=["faqs"])
|
api_router.include_router(faqs.router, prefix="/faqs/items", tags=["faqs"])
|
||||||
api_router.include_router(documents.router, prefix="", tags=["documents"])
|
api_router.include_router(documents.router, prefix="", tags=["documents"])
|
||||||
|
api_router.include_router(permission_monitoring.router)
|
||||||
|
|||||||
@@ -130,8 +130,8 @@ const loadPermissionData = async () => {
|
|||||||
fetchApiEndpointPermissions(studyId.value),
|
fetchApiEndpointPermissions(studyId.value),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
moduleMatrix.value = moduleRes;
|
moduleMatrix.value = moduleRes.data;
|
||||||
apiMatrix.value = apiRes;
|
apiMatrix.value = apiRes.data;
|
||||||
dirty.value = false;
|
dirty.value = false;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
ElMessage.error("加载权限数据失败");
|
ElMessage.error("加载权限数据失败");
|
||||||
@@ -151,9 +151,9 @@ const loadMonitoringData = async () => {
|
|||||||
fetchPermissionAlerts(undefined, 20),
|
fetchPermissionAlerts(undefined, 20),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
metrics.value = metricsRes;
|
metrics.value = metricsRes.data;
|
||||||
health.value = healthRes;
|
health.value = healthRes.data;
|
||||||
alerts.value = alertsRes;
|
alerts.value = alertsRes.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
ElMessage.error("加载监控数据失败");
|
ElMessage.error("加载监控数据失败");
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@@ -177,11 +177,13 @@ const save = async () => {
|
|||||||
try {
|
try {
|
||||||
// 保存当前活跃标签的权限
|
// 保存当前活跃标签的权限
|
||||||
if (activeTab.value === "module" && moduleMatrix.value) {
|
if (activeTab.value === "module" && moduleMatrix.value) {
|
||||||
await updateProjectRolePermissions(studyId.value, {
|
const res = await updateProjectRolePermissions(studyId.value, {
|
||||||
roles: moduleMatrix.value.roles,
|
roles: moduleMatrix.value.roles,
|
||||||
});
|
});
|
||||||
|
moduleMatrix.value = res.data;
|
||||||
} else if (activeTab.value === "api" && apiMatrix.value) {
|
} else if (activeTab.value === "api" && apiMatrix.value) {
|
||||||
await updateApiEndpointPermissions(studyId.value, apiMatrix.value);
|
const res = await updateApiEndpointPermissions(studyId.value, apiMatrix.value);
|
||||||
|
apiMatrix.value = res.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
dirty.value = false;
|
dirty.value = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user