51feae55ba
- 后端:FastAPI + SQLAlchemy + Alembic,7 张核心表迁移成功 - 前端:Next.js 16 + TailwindCSS 4 + 三端布局(投资人/创始人/Admin) - 数据库:PostgreSQL 16,7 张核心实体表(tenants/users/companies/monthly_reports/health_scores/risk_events/audit_logs) - Docker:docker-compose.yml + 前后端 Dockerfile - 测试:健康检查 4 个测试全部 GREEN - 文档:README/run.md/AGENTS.md/docs 体系完整
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""统一响应模型。
|
||
|
||
所有 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()
|