2025-11-18 16:46:04 +08:00
|
|
|
|
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):
|
|
|
|
|
|
"""
|
2025-11-20 11:42:18 +08:00
|
|
|
|
基础信息模型
|
2025-11-18 16:46:04 +08:00
|
|
|
|
|
2025-11-20 11:42:18 +08:00
|
|
|
|
字段与数据库模型 Info 保持一致
|
2025-11-18 16:46:04 +08:00
|
|
|
|
"""
|
2025-11-20 11:42:18 +08:00
|
|
|
|
first_name: str = Field(..., description='名')
|
|
|
|
|
|
last_name: str = Field(..., description='姓')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
birthday: str = Field(..., description='生日')
|
2025-11-20 11:42:18 +08:00
|
|
|
|
current_address: str = Field(..., description='街道地址')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
city: str = Field(..., description='城市')
|
|
|
|
|
|
phone: str = Field(..., description='电话')
|
2025-11-20 11:42:18 +08:00
|
|
|
|
postal_code: str = Field(..., description='邮编')
|
|
|
|
|
|
province: str = Field(..., description='州全称')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
status: bool = Field(False, description='状态')
|
2025-11-20 11:42:18 +08:00
|
|
|
|
email: str | None = Field(None, description='邮箱')
|
|
|
|
|
|
email_content: str | None = Field(None, description='邮件内容')
|
|
|
|
|
|
text: str | None = Field(None, description='文本内容')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Create(Base):
|
|
|
|
|
|
"""
|
|
|
|
|
|
创建请求模型
|
|
|
|
|
|
"""
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Update(BaseModel):
|
|
|
|
|
|
"""
|
|
|
|
|
|
更新请求模型,支持部分更新
|
|
|
|
|
|
"""
|
2025-11-20 11:42:18 +08:00
|
|
|
|
first_name: str | None = Field(None, description='名')
|
|
|
|
|
|
last_name: str | None = Field(None, description='姓')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
birthday: str | None = Field(None, description='生日')
|
2025-11-20 11:42:18 +08:00
|
|
|
|
current_address: str | None = Field(None, description='街道地址')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
city: str | None = Field(None, description='城市')
|
|
|
|
|
|
phone: str | None = Field(None, description='电话')
|
2025-11-20 11:42:18 +08:00
|
|
|
|
postal_code: str | None = Field(None, description='邮编')
|
|
|
|
|
|
province: str | None = Field(None, description='州全称')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
status: bool | None = Field(None, description='状态')
|
2025-11-20 11:42:18 +08:00
|
|
|
|
email: str | None = Field(None, description='邮箱')
|
|
|
|
|
|
email_content: str | None = Field(None, description='邮件内容')
|
|
|
|
|
|
text: str | None = Field(None, description='文本内容')
|
2025-11-18 16:46:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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='列表数据')
|