系统 SHALL 通过 ApiRequestLogMiddleware 记录经 FastAPI 处理的 API 请求,并写入 sys_api_request_log。每条记录 SHALL 包含 HTTP 方法、路径(接口地址)、Query 字符串、请求体、响应体、HTTP 状态码、耗时、IP、User-Agent、请求时间(create_at)、用户 ID、用户账号(user_no)及用户姓名(nick_name → create_name)。
POST /api/web/crm/customer/update)path、query_string、request_body、response_bodycreate_at 为请求完成时刻create_name 为 JWT 中的 real_namepassword、token、authorization 等敏感键*** 而非明文OPTIONS 或路径为 /health、/docs、/openapi.jsonsys_api_request_logmultipart/form-datarequest_body SHALL 标记为省略说明而非文件二进制内容系统 SHALL 在 sys_api_request_log 存储业务语义列:tenant_no、business_title、business_type、business_id、oper_summary。写操作接口 SHOULD 通过 @oper_log 声明上述字段;未声明时系统 SHALL 使用路径与方法推断规则填充 business_title 与 business_type(business_id 与 oper_summary 可为空)。
@oper_log(title="CRM客户管理", business_type=2, business_id_param="id", summary="修改客户【{name}】") 的更新接口被调用且 ContextVar 已设置business_title=CRM客户管理、business_type=2business_id 为请求中的客户 idoper_summary 为可读摘要文本@oper_logbusiness_title 由路径推断(如 CRM客户管理)business_type 为 0(其他)business_typesys_oper_type 字典一致)操作日志查询 SHALL 按当前用户 tenant_no 过滤 sys_api_request_log.tenant_no。中间件落库时 SHALL 从 JWT 写入 tenant_no。
系统 SHALL 提供 POST /api/web/monitor/operlog/list 与 POST /api/web/monitor/operlog/detail,将日志适配为 RuoYi OperLogVO 结构:operUrl(path)、operParam(request_body)、jsonResult(response_body)、operName(create_name 优先)、operTime、title(business_title)、businessType。
businessId 与可选 businessTitlebusiness_id 的日志分页列表operParam 与 jsonResult(受库内截断上限约束)user_id 范围)web-admin SHALL 提供操作日志标准列表页(界面模式 P01),支持按模块、操作类型、操作人、状态、时间范围筛选;详情展示接口地址、入参、出参与摘要。按钮与表格 SHALL 符合 Fresh Mint 与 web-admin-crud-dialog 规范。
operParam 与 jsonResultCRM 客户详情与合同详情中的操作日志 Tab SHALL 按 business_id 调用 operlog 列表,不再拉取全量日志后前端过滤。
business_id 等于该客户 id 的日志API_REQUEST_LOG_ENABLED 在生产环境 SHALL 为 true。body 截断上限 SHALL 保持可配置(API_REQUEST_LOG_MAX_BODY、API_REQUEST_LOG_MAX_BODY_BYTES)。
API_REQUEST_LOG_ENABLED=false