jiachenlong/backend/app/schemas/schemas.py

230 lines
8.6 KiB
Python

# Pydantic Schema - 使用字段编码并支持 camelCase
from typing import Optional, List
from pydantic import BaseModel, EmailStr, Field, ConfigDict
from datetime import datetime
# ============ 用户相关 ============
class UserBase(BaseModel):
f01_01_name: str = Field(..., min_length=3, max_length=255, alias="username")
email: Optional[EmailStr] = None
phone: Optional[str] = None
avatar: Optional[str] = None
address: Optional[str] = None
bio: Optional[str] = None
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
class UserCreate(UserBase):
password: str = Field(..., min_length=6)
class UserUpdate(BaseModel):
f01_01_name: Optional[str] = Field(None, alias="username")
email: Optional[EmailStr] = None
phone: Optional[str] = None
avatar: Optional[str] = None
address: Optional[str] = None
bio: Optional[str] = None
password: Optional[str] = None
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
class UserResponse(UserBase):
# 新增字段
f99_94_level: Optional[str] = Field(None, alias="level")
f99_95_ai_count: Optional[int] = Field(0, alias="aiCount")
f99_96_search_count: Optional[int] = Field(0, alias="searchCount")
f99_97_collection_count: Optional[int] = Field(0, alias="collectionCount")
f01_06_phone_verified: Optional[bool] = Field(False, alias="phoneVerified")
f99_98_login_count: Optional[int] = Field(0, alias="loginCount")
f99_99_last_login: Optional[datetime] = Field(None, alias="lastLogin")
f01_07_gender: Optional[str] = Field(None, alias="gender")
f01_08_birthday: Optional[datetime] = Field(None, alias="birthday")
f01_09_region: Optional[str] = Field(None, alias="region")
f01_10_realname_verified: Optional[bool] = Field(False, alias="realnameVerified")
f99_100_points: Optional[int] = Field(0, alias="points")
f01_11_balance: Optional[float] = Field(0, alias="balance")
f01_12_total_amount: Optional[float] = Field(0, alias="totalAmount")
f01_13_invite_code: Optional[str] = Field(None, alias="inviteCode")
f99_90_id: str = Field(..., alias="id")
f01_01_name: str = Field(..., alias="username")
role: str
user_code: Optional[str] = None
f99_92_created_at: Optional[datetime] = Field(None, alias="created_at")
f99_93_updated_at: Optional[datetime] = Field(None, alias="updated_at")
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
# ============ 藏品相关 ============
class CollectionBase(BaseModel):
# f01 基本信息
f01_01_name: str = Field(..., min_length=2, max_length=255, alias="name")
f01_02_code: Optional[str] = Field(None, max_length=50, alias="code")
f01_03_category: str = Field(..., max_length=100, alias="category")
f01_04_status: Optional[str] = Field("in_collection", alias="status")
f01_05_remark: Optional[str] = Field(None, alias="remark")
# f02 详细字段
f02_10_prefix_serial: Optional[str] = Field(None, alias="prefixSerial")
f02_11_version: Optional[str] = Field(None, alias="version")
f02_12_packaging: Optional[str] = Field(None, alias="packaging")
f02_13_rarity: Optional[str] = Field(None, alias="rarity")
f02_14_number_category: Optional[str] = Field(None, alias="numberCategory")
# f03 评级信息
f03_20_is_graded: Optional[bool] = Field(False, alias="isGraded")
f03_21_grading_company: Optional[str] = Field(None, alias="gradingCompany")
f03_22_grading_score: Optional[str] = Field(None, alias="gradingScore")
f03_23_three_star: Optional[bool] = Field(False, alias="threeStar")
# f04 特殊信息
f04_30_special_mark: Optional[str] = Field(None, alias="specialMark")
f04_31_serial_feature: Optional[str] = Field(None, alias="serialFeature")
f04_32_issuer: Optional[str] = Field(None, alias="issuer")
f04_33_issue_year: Optional[str] = Field(None, alias="issueYear")
f04_34_material: Optional[str] = Field(None, alias="material")
f04_35_denomination: Optional[str] = Field(None, alias="denomination")
f04_36_issue_quantity: Optional[str] = Field(None, alias="issueQuantity")
# f05 价格信息
f05_40_cost_price: Optional[float] = Field(None, ge=0, alias="costPrice")
f05_41_target_price: Optional[float] = Field(None, ge=0, alias="targetPrice")
f05_42_goal_price: Optional[float] = Field(None, ge=0, alias="goalPrice")
f05_43_repair_fee: Optional[float] = Field(None, ge=0, alias="repairFee")
f05_44_grading_fee: Optional[float] = Field(None, ge=0, alias="gradingFee")
# f06 其他信息
f06_50_purpose: Optional[str] = Field(None, alias="purpose")
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
class CollectionCreate(CollectionBase):
pass
class CollectionUpdate(BaseModel):
# f01 基本信息
f01_01_name: Optional[str] = Field(None, alias="name")
f01_02_code: Optional[str] = Field(None, alias="code")
f01_03_category: Optional[str] = Field(None, alias="category")
f01_04_status: Optional[str] = Field(None, alias="status")
f01_05_remark: Optional[str] = Field(None, alias="remark")
# f02 详细字段
f02_10_prefix_serial: Optional[str] = Field(None, alias="prefixSerial")
f02_11_version: Optional[str] = Field(None, alias="version")
f02_12_packaging: Optional[str] = Field(None, alias="packaging")
f02_13_rarity: Optional[str] = Field(None, alias="rarity")
f02_14_number_category: Optional[str] = Field(None, alias="numberCategory")
# f03 评级信息
f03_20_is_graded: Optional[bool] = Field(None, alias="isGraded")
f03_21_grading_company: Optional[str] = Field(None, alias="gradingCompany")
f03_22_grading_score: Optional[str] = Field(None, alias="gradingScore")
f03_23_three_star: Optional[bool] = Field(None, alias="threeStar")
# f04 特殊信息
f04_30_special_mark: Optional[str] = Field(None, alias="specialMark")
f04_31_serial_feature: Optional[str] = Field(None, alias="serialFeature")
f04_32_issuer: Optional[str] = Field(None, alias="issuer")
f04_33_issue_year: Optional[str] = Field(None, alias="issueYear")
f04_34_material: Optional[str] = Field(None, alias="material")
f04_35_denomination: Optional[str] = Field(None, alias="denomination")
f04_36_issue_quantity: Optional[str] = Field(None, alias="issueQuantity")
# f05 价格信息
f05_40_cost_price: Optional[float] = Field(None, ge=0, alias="costPrice")
f05_41_target_price: Optional[float] = Field(None, ge=0, alias="targetPrice")
f05_42_goal_price: Optional[float] = Field(None, ge=0, alias="goalPrice")
f05_43_repair_fee: Optional[float] = Field(None, ge=0, alias="repairFee")
f05_44_grading_fee: Optional[float] = Field(None, ge=0, alias="gradingFee")
# f06 其他信息
f06_50_purpose: Optional[str] = Field(None, alias="purpose")
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
class CollectionImageResponse(BaseModel):
f99_90_id: str
filename: str
original_name: Optional[str] = None
path: Optional[str] = None
f99_92_created_at: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
class CollectionResponse(CollectionBase):
f99_90_id: str = Field(..., alias="id")
f99_91_user_id: str = Field(..., alias="userId")
f99_92_created_at: Optional[datetime] = Field(None, alias="createdAt")
f99_93_updated_at: Optional[datetime] = Field(None, alias="updatedAt")
images: List[CollectionImageResponse] = []
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
class CollectionListResponse(BaseModel):
data: List[CollectionResponse]
pagination: dict
# ============ 操作日志相关 ============
class OperationBase(BaseModel):
type: str = Field(..., max_length=50)
price: Optional[float] = None
note: Optional[str] = None
class OperationCreate(OperationBase):
f99_91_user_id: str
class OperationResponse(OperationBase):
f99_90_id: str
f99_91_user_id: str
f99_93_created_at: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
# ============ OCR 相关 ============
class OCRRequest(BaseModel):
image: str
ocr_provider: Optional[str] = "aliyun"
class OCRResponse(BaseModel):
text: str
confidence: float
fields: Optional[dict] = None
# ============ 通用响应 ============
class Token(BaseModel):
access_token: str
token_type: str = "bearer"
class TokenData(BaseModel):
f99_90_user_id: Optional[str] = None
class MessageResponse(BaseModel):
message: str
class ErrorResponse(BaseModel):
detail: str