from pydantic import BaseModel, validator from typing import Optional from datetime import datetime import re # 用户注册 class UserRegister(BaseModel): phone: str # 手机号必填,作为唯一标识 password: str nickname: Optional[str] = None @validator('phone') def validate_phone(cls, v): """验证手机号格式(11位数字)""" if not v: raise ValueError('手机号不能为空') if not re.match(r'^1[3-9]\d{9}$', v): raise ValueError('手机号格式错误,请输入11位有效手机号') return v @validator('password') def validate_password(cls, v): """验证密码""" if not v: raise ValueError('密码不能为空') if len(v) < 6: raise ValueError('密码长度不能少于6位') if len(v) > 72: raise ValueError('密码长度不能超过72位') return v # 用户登录 class UserLogin(BaseModel): phone: str # 手机号登录 password: str @validator('phone') def validate_phone(cls, v): """验证手机号格式(11位数字)""" if not v: raise ValueError('手机号不能为空') if not re.match(r'^1[3-9]\d{9}$', v): raise ValueError('手机号格式错误,请输入11位有效手机号') return v # 用户响应 class UserResponse(BaseModel): id: int phone: str nickname: Optional[str] avatar: Optional[str] balance: float created_at: datetime class Config: from_attributes = True # Token 响应 class Token(BaseModel): access_token: str token_type: str = "bearer" user: UserResponse