from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field class UserBase(BaseModel): """User 基础 Schema""" email: EmailStr = Field(..., description="邮箱") full_name: str = Field(..., min_length=1, max_length=100, description="姓名") role: str = Field(default="会计", description="角色") class UserCreate(UserBase): """创建用户的 Schema""" password: str = Field(..., min_length=6, max_length=50, description="密码") company_id: int = Field(..., description="企业ID") class UserUpdate(BaseModel): """更新用户的 Schema""" full_name: Optional[str] = Field(None, min_length=1, max_length=100) role: Optional[str] = None permissions: Optional[dict] = None status: Optional[str] = None class UserResponse(UserBase): """用户响应 Schema""" model_config = ConfigDict(from_attributes=True) id: int company_id: int status: str permissions: Optional[dict] last_login_at: Optional[datetime] created_at: datetime updated_at: datetime class UserLogin(BaseModel): """用户登录 Schema""" email: EmailStr = Field(..., description="邮箱") password: str = Field(..., description="密码") class Token(BaseModel): """Token Schema""" access_token: str token_type: str = "bearer" class TokenData(BaseModel): """Token 数据 Schema""" user_id: Optional[int] = None email: Optional[str] = None