from datetime import datetime from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator class RegisterRequest(BaseModel): username: str = Field(min_length=1, max_length=64) password: str = Field(min_length=6, max_length=128) confirm_password: str = Field(min_length=6, max_length=128, alias="confirmPassword") model_config = ConfigDict(populate_by_name=True) @field_validator("username") @classmethod def strip_username(cls, value: str) -> str: return value.strip() @model_validator(mode="after") def passwords_match(self) -> "RegisterRequest": if self.password != self.confirm_password: raise ValueError("两次输入的密码不一致") return self class LoginRequest(BaseModel): username: str = Field(min_length=1, max_length=64) password: str = Field(min_length=1, max_length=128) model_config = ConfigDict(populate_by_name=True) @field_validator("username") @classmethod def strip_username(cls, value: str) -> str: return value.strip() class UserPublic(BaseModel): model_config = ConfigDict(from_attributes=True) id: int username: str role_id: int vip_end_time: datetime | None = None class TokenResponse(BaseModel): access_token: str token_type: str = "bearer" user: UserPublic class HeartbeatRequest(BaseModel): verify_code: str = Field(min_length=1, max_length=128) class HeartbeatResponse(BaseModel): """心跳成功时的状态快照。""" vip_end_time: datetime | None = None vip_active: bool server_verify_code: str