| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- """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": "..."}
|