from datetime import datetime, timezone, timedelta from pydantic import BaseModel, Field, computed_field from typing import List from uuid import UUID from utils.time_tool import TimestampModel CHINA_TZ = timezone(timedelta(hours=8)) class Base(BaseModel): """ 基础信息模型 字段与数据库模型 Info 保持一致 """ first_name: str = Field(..., description='名') last_name: str = Field(..., description='姓') birthday: str = Field(..., description='生日') current_address: str = Field(..., description='街道地址') city: str = Field(..., description='城市') phone: str = Field(..., description='电话') postal_code: str = Field(..., description='邮编') province: str = Field(..., description='州全称') status: bool = Field(False, description='状态') email: str | None = Field(None, description='邮箱') email_content: str | None = Field(None, description='邮件内容') text: str | None = Field(None, description='文本内容') class Create(Base): """ 创建请求模型 """ pass class Update(BaseModel): """ 更新请求模型,支持部分更新 """ first_name: str | None = Field(None, description='名') last_name: str | None = Field(None, description='姓') birthday: str | None = Field(None, description='生日') current_address: str | None = Field(None, description='街道地址') city: str | None = Field(None, description='城市') phone: str | None = Field(None, description='电话') postal_code: str | None = Field(None, description='邮编') province: str | None = Field(None, description='州全称') status: bool | None = Field(None, description='状态') email: str | None = Field(None, description='邮箱') email_content: str | None = Field(None, description='邮件内容') text: str | None = Field(None, description='文本内容') class Out(TimestampModel, Base): """ 输出模型 """ code: int = Field(200, description='状态码') message: str = Field('成功', description='提示信息') id: UUID = Field(..., description='ID') create_time: datetime = Field(..., description='创建时间') update_time: datetime = Field(..., description='更新时间') @computed_field @property def create_time_cn(self) -> str: return self.create_time.astimezone(CHINA_TZ).strftime("%Y-%m-%d %H:%M:%S") @computed_field @property def update_time_cn(self) -> str: return self.update_time.astimezone(CHINA_TZ).strftime("%Y-%m-%d %H:%M:%S") class Config: from_attributes = True class OutList(BaseModel): """ 列表输出模型 """ code: int = Field(200, description='状态码') message: str = Field('成功', description='提示信息') count: int = Field(0, description='总数') num: int = Field(0, description='当前数量') items: List[Out] = Field([], description='列表数据')