from sqlalchemy.orm import Session from pydantic import BaseModel, validator, EmailStr from typing import Optional from datetime import datetime import re class UserBase(BaseModel): username: str email: Optional[EmailStr] = None full_name: Optional[str] = None class UserCreate(UserBase): password: str is_admin: bool = False # 新增管理员字段,默认为False @validator('username') def username_alphanumeric(cls, v): if not v.replace('_', '').isalnum(): raise ValueError('用户名只能包含字母、数字和下划线') if len(v) < 3 or len(v) > 20: raise ValueError('用户名长度必须在3-20个字符之间') return v @validator('password') def password_strength(cls, v): if len(v) < 6: raise ValueError('密码长度至少6位') return v class UserLogin(BaseModel): username: str password: str class UserUpdate(BaseModel): email: Optional[EmailStr] = None full_name: Optional[str] = None password: Optional[str] = None @validator('password') def password_strength(cls, v): if v and len(v) < 6: raise ValueError('密码长度至少6位') return v class UserResponse(UserBase): id: int is_admin: bool # 添加管理员标识 is_active: bool created_at: datetime updated_at: Optional[datetime] = None class Config: orm_mode = True # 文档相关模式 class DocumentBase(BaseModel): title: str content: Optional[str] = None description: Optional[str] = None file_type: str = "txt" file_size: int = 0 is_public: bool = False class DocumentCreate(DocumentBase): pass class DocumentUpdate(BaseModel): title: Optional[str] = None content: Optional[str] = None description: Optional[str] = None file_type: Optional[str] = None is_public: Optional[bool] = None class DocumentResponse(DocumentBase): id: int owner_id: int created_at: datetime updated_at: Optional[datetime] = None class Config: orm_mode = True # 操作日志相关模式 class UserOperationLogBase(BaseModel): operation: str details: Optional[str] = None ip_address: Optional[str] = None user_agent: Optional[str] = None class UserOperationLogResponse(UserOperationLogBase): id: int user_id: int created_at: datetime class Config: orm_mode = True # Token响应模式 class Token(BaseModel): access_token: str token_type: str class TokenData(BaseModel): username: Optional[str] = None