# scheme/users.py # 用户认证模块的请求/响应模型 from typing import Optional from pydantic import BaseModel, Field, field_validator # -------------------- 请求体模型 ----------------------------- class UserAdd(BaseModel): """创建用户(仅管理员)""" username: str = Field(..., min_length=3, max_length=50, description="登录名") password: str = Field(..., min_length=6, max_length=64, description="密码(明文,服务端加密存储)") role: str = Field(..., description="角色:admin/teacher/student") teacher_id: Optional[int] = Field(None, ge=1, description="教师角色的工号") stu_id: Optional[int] = Field(None, ge=1, description="学生角色的学号") @field_validator("role") @classmethod def validate_role(cls, v): allowed = ["admin", "teacher", "student"] if v not in allowed: raise ValueError(f"role 必须是 {allowed} 之一,当前值: {v}") return v class UserLogin(BaseModel): """登录""" username: str = Field(..., description="登录名") password: str = Field(..., description="密码") # -------------------- 响应模型 ---------------------------- class UserResponse(BaseModel): user_id: int username: str role: str teacher_id: Optional[int] = None stu_id: Optional[int] = None class Config: from_attributes = True class TokenResponse(BaseModel): """登录成功返回""" access_token: str = Field(..., description="JWT token") token_type: str = Field("bearer", description="token 类型") user: UserResponse class MessageResponse(BaseModel): """通用消息响应""" message: str