sequenceDiagram autonumber participant FE as 前端页面 participant API as admin.ts participant RT as FastAPI Router participant SVC as Service participant DB as PostgreSQL participant FS as 日志文件(RUNTIME_LOG_DIR) Note over FE,FS: A 配置变更历史(带筛选) FE->>API: getSystemLogs({config_key, changed_by, from, to, page, page_size}) API->>RT: GET /api/admin/system-logs?... RT->>RT: require_admin() RT->>SVC: get_system_logs(db, filters) SVC->>DB: SELECT ConfigChangeLog WHERE ... ORDER changed_at DESC SVC->>DB: JOIN agents 取 changed_by_name DB-->>SVC: rows SVC-->>RT: {items, total, page, page_size} RT-->>FE: {code:0, data} Note over FE,FS: B 安全审计日志(复用后端) FE->>API: getAuditLogs({employee_id, action, resource, from, to, page, page_size}) API->>RT: GET /api/admin/audit-logs?... RT->>RT: require_permission(audit_log:read:all) RT->>SVC: list_audit_logs(db, filters) SVC->>DB: SELECT AuditLog WHERE ... DB-->>SVC: rows SVC-->>RT: {items, total, page, page_size} RT-->>FE: {code:0, data} Note over FE,FS: D 运行期日志(列表) FE->>API: getRuntimeLogs({level, from, to, keyword, page, page_size}) API->>RT: GET /api/admin/runtime-logs?... RT->>RT: require_admin() RT->>SVC: read_runtime_logs(RUNTIME_LOG_DIR, filters) SVC->>FS: 读 *.log 逐行 json.loads FS-->>SVC: 命中行 SVC-->>RT: {items, total, page, page_size} RT-->>FE: {code:0, data} Note over FE,FS: D 运行期日志(下载) FE->>API: getRuntimeLogDownload({level, from, to, keyword}) API->>RT: GET /api/admin/runtime-logs?download=true RT->>RT: require_admin() RT->>SVC: build_runtime_log_stream(RUNTIME_LOG_DIR, filters) SVC->>FS: 读 *.log 过滤行 RT-->>FE: StreamingResponse(text/plain, attachment)