"""Pydantic 数据模型""" from datetime import datetime from typing import Any from pydantic import BaseModel, Field # ── 题目 ───────────────────────────────────────────────── class ProblemBase(BaseModel): difficulty: float = Field(default=0.5, ge=0.0, le=1.0) question_type: str = "" import_type: str = "精选题" knowledge_codes: list[str] = Field(default_factory=list) comment: str = "" source: str = "" class ProblemSummary(BaseModel): id: str difficulty: float question_type: str import_type: str chapters: list[str] = [] knowledge_codes: list[str] = [] comment: str = "" source: str = "" created_at: str = "" updated_at: str = "" class ProblemDetail(ProblemSummary): render_html: str | None = None metadata_html: str | None = None # 答案区 HTML class ProblemUpdate(BaseModel): difficulty: float | None = None question_type: str | None = None import_type: str | None = None comment: str | None = None class KnowledgeUpdate(BaseModel): knowledge_codes: list[str] # ── 分页 ───────────────────────────────────────────────── class PaginatedResponse(BaseModel): items: list[dict] total: int page: int page_size: int # ── 统计 ───────────────────────────────────────────────── class StatsResponse(BaseModel): total: int by_question_type: dict[str, int] by_import_type: dict[str, int] by_chapter: dict[str, int] # ── 搜索 ──────────────────────────────────────────────── class SearchResult(BaseModel): id: str body_snippet: str = "" difficulty: float = 0.5 question_type: str = "" import_type: str = "" chapters: list[str] = [] # ── 导入 ───────────────────────────────────────────────── class ImportTaskStatus(BaseModel): id: str status: str total: int completed: int message: str result: Any = {} # ── 试题篮 ─────────────────────────────────────────────── class CartCreate(BaseModel): name: str class CartSummary(BaseModel): id: int name: str item_count: int created_at: str = "" class CartDetail(CartSummary): items: list[ProblemSummary] = [] # ── 导出 ───────────────────────────────────────────────── class ExportRequest(BaseModel): chapter: str | None = None import_type: str | None = None cart_id: int | None = None title: str | None = None # ── 知识点 ─────────────────────────────────────────────── class KnowledgeNode(BaseModel): code: str path: str leaf_name: str chapter_code: str = "" chapter_name: str = "" # ── 认证 ───────────────────────────────────────────────── class TokenVerify(BaseModel): token: str # ── WebDAV 配置 ────────────────────────────────────────── class WebDAVConfig(BaseModel): url: str username: str password: str remote_path: str = "/tiku-backup" # ── API 错误 ───────────────────────────────────────────── class APIError(BaseModel): error: dict # {"code": "xxx", "message": "..."}