"""Pydantic 请求/响应模型""" from datetime import datetime from typing import Optional from pydantic import BaseModel, Field # ---- 认证 ---- class LoginRequest(BaseModel): username: str password: str class TokenResponse(BaseModel): access_token: str token_type: str = "bearer" role: str username: str permissions: list[str] class UserInfo(BaseModel): id: int username: str role: str is_active: bool remark: str = "" created_at: Optional[datetime] = None permissions: list[str] = [] class Config: from_attributes = True # ---- 用户管理 ---- class UserCreate(BaseModel): username: str = Field(..., min_length=2, max_length=64) password: str = Field(..., min_length=6, max_length=128) role: str = Field("support", pattern="^(super_admin|operation|support)$") remark: str = "" class UserUpdate(BaseModel): password: Optional[str] = None role: Optional[str] = None is_active: Optional[bool] = None remark: Optional[str] = None # ---- 账号 ---- class AccountImport(BaseModel): """批量导入,文本格式:用户名|密码|邮箱|邮箱密码""" text: str class AccountAssign(BaseModel): assigned_to: Optional[int] = None class AccountTag(BaseModel): tag: Optional[str] = None account_ids: Optional[list[int]] = None class AccountOut(BaseModel): id: int username: str # 敏感字段根据角色决定是否返回 password: Optional[str] = None email: Optional[str] = None email_password: Optional[str] = None tag: str = "" assigned_to: Optional[int] = None assigned_username: Optional[str] = None remark: str = "" created_at: Optional[datetime] = None class Config: from_attributes = True # ---- 登录任务 ---- class LoginBatchRequest(BaseModel): account_ids: list[int] max_geetest_retries: int = 5 concurrency: int = 3 # 并发数,1-10 class LoginTaskOut(BaseModel): id: int batch_id: str account_id: int account_username: str = "" status: str cookie: str = "" message: str = "" created_by: int created_at: Optional[datetime] = None finished_at: Optional[datetime] = None class Config: from_attributes = True # ---- 代理配置 ---- class ProxyConfigOut(BaseModel): enabled: bool = False api_url: str = "" http: str = "" https: str = "" whitelist_enabled: bool = False whitelist_uid: str = "" whitelist_ukey: str = "" class ProxyConfigUpdate(ProxyConfigOut): pass # ---- 通用 ---- class MessageResponse(BaseModel): message: str success: bool = True