from pydantic import BaseModel, Field from typing import Optional, List # =================================================================== # 基础模型 (Base Models) # =================================================================== class UserInfo(BaseModel): """用户的基本信息""" id: int = Field(..., description="用户的唯一ID", example=1001) name: str = Field(..., description="用户的姓名", example="张三") registered_faces_count: int = Field(..., description="该用户已注册的人脸数量", example=2) class FaceLocation(BaseModel): """人脸在图片中的位置和尺寸""" x: int = Field(..., description="人脸框左上角的X坐标") y: int = Field(..., description="人脸框左上角的Y坐标") width: int = Field(..., description="人脸框的宽度") height: int = Field(..., description="人脸框的高度") # =================================================================== # API 请求模型 (Request Models) # =================================================================== class ImageSource(BaseModel): """图片来源,可以是URL或Base64编码的数据""" url: Optional[str] = Field(None, description="图片的URL地址", example="http://example.com/image.jpg") face_data: Optional[str] = Field(None, description="图片的Base64编码字符串") class RegisterRequest(ImageSource): """注册新用户的请求体""" id: int = Field(..., description="要注册用户的唯一ID", example=1001) name: str = Field(..., description="要注册用户的姓名", example="张三") class VerifyRequest(ImageSource): """1:1人脸认证的请求体""" id: int = Field(..., description="要验证的用户ID", example=1001) # =================================================================== # API 响应模型 (Response Models) # =================================================================== class StandardResponse(BaseModel): """标准API响应模型""" code: int = Field(0, description="响应码,0为成功,非0为失败", example=0) message: str = Field("success", description="响应消息", example="操作成功") data: Optional[dict] = None class UserListResponse(StandardResponse): """获取用户列表的响应""" data: List[UserInfo] class RegisterResponse(StandardResponse): """注册成功后的响应""" data: UserInfo class VerificationResult(BaseModel): """1:1认证结果""" match: bool = Field(..., description="是否匹配") confidence: float = Field(..., description="置信度 (0.0 to 1.0)") class VerifyResponse(StandardResponse): """1:1人脸认证的响应""" data: VerificationResult class DetectedFace(UserInfo): """1:N识别结果中的单个人脸信息""" location: FaceLocation confidence: float = Field(..., description="识别的置信度") class DetectResponse(StandardResponse): """1:N人脸识别的响应""" data: List[DetectedFace]