Files
yaoyaoai/app/schemas/auth.py
fengchuanhn@gmail.com 3c91a52aff 11
2026-05-22 14:40:37 +08:00

62 lines
1.6 KiB
Python

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