"""统一响应模型。 所有 API 返回统一壳:{code, message, data, trace_id, timestamp} """ import uuid from datetime import datetime, timezone from typing import Any, Generic, TypeVar from pydantic import BaseModel, Field T = TypeVar("T") class ApiResponse(BaseModel, Generic[T]): """统一 API 响应壳。""" code: int = Field(default=0, description="业务状态码,0 表示成功") message: str = Field(default="success", description="提示信息") data: T | None = Field(default=None, description="业务数据") trace_id: str = Field(default_factory=lambda: str(uuid.uuid4()), description="链路追踪 ID") timestamp: str = Field( default_factory=lambda: datetime.now(timezone.utc).isoformat(), description="响应时间(UTC ISO 8601)", ) def success(data: Any = None, message: str = "success") -> dict[str, Any]: """构造成功响应。""" return ApiResponse(code=0, message=message, data=data).model_dump() def error(code: int = -1, message: str = "error", data: Any = None) -> dict[str, Any]: """构造错误响应。""" return ApiResponse(code=code, message=message, data=data).model_dump()