from pydantic import BaseModel, Field from typing import Any, Dict, Generic, List, Optional, TypeVar, Union T = TypeVar('T') class StandardResponse(BaseModel, Generic[T]): """标准API响应模型""" success: bool = Field(True, description="请求是否成功") code: int = Field(200, description="业务状态码") message: str = Field("操作成功", description="响应消息") data: Optional[T] = Field(None, description="响应数据") class PageInfo(BaseModel): """分页信息""" page: int = Field(..., description="当前页码") size: int = Field(..., description="每页大小") total: int = Field(..., description="总记录数") pages: int = Field(..., description="总页数") class PagedResponse(BaseModel, Generic[T]): """分页响应数据""" items: List[T] = Field(..., description="数据列表") page_info: PageInfo = Field(..., description="分页信息") class ErrorDetail(BaseModel): """错误详情""" loc: List[str] = Field(..., description="错误位置") msg: str = Field(..., description="错误消息") type: str = Field(..., description="错误类型") class ValidationError(BaseModel): """验证错误响应""" detail: List[ErrorDetail] class HealthCheck(BaseModel): """健康检查项目""" status: str = Field(..., description="状态") message: str = Field(..., description="消息") class HealthCheckResponse(BaseModel): """健康检查响应""" checks: Dict[str, HealthCheck] = Field(..., description="检查项目") class TokenResponse(BaseModel): """令牌响应""" access_token: str = Field(..., description="访问令牌") token_type: str = Field("bearer", description="令牌类型") expires_in: int = Field(..., description="过期时间(秒)") class FileUploadResponse(BaseModel): """文件上传响应""" file_id: str = Field(..., description="文件ID") url: str = Field(..., description="文件URL") file_name: str = Field(..., description="文件名") content_type: str = Field(..., description="内容类型") size: int = Field(..., description="文件大小(字节)")