483fdb982b
- 创建后端数据库模型:DocumentChapter 和 Document,支持按章节组织的树形文档结构 - 创建数据库迁移文件:002_add_document_management.sql - 创建 Pydantic schemas:定义文档和章节的请求/响应模型 - 创建后端服务层:document_service.py 实现 CRUD 和树形结构构建 - 创建 API 路由:/api/v1/documents 和 /api/v1/documents/chapters,支持完整的 RESTful 操作 - 创建前端类型定义:document.ts - 创建文档管理页面:/admin/documents,包含章节树形目录和文档表格,支持增删改查 - 创建文档展示页面:/admin/docs-view,左侧目录树右侧内容展示,支持 Markdown 渲染 - 安装 react-markdown 依赖用于文档内容展示 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class DocumentChapterPublic(BaseModel):
|
|
id: int
|
|
name: str
|
|
description: str | None = None
|
|
parent_id: int | None = None
|
|
sort_order: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class DocumentChapterTreeItem(DocumentChapterPublic):
|
|
children: list["DocumentChapterTreeItem"] = Field(default_factory=list)
|
|
documents: list["DocumentPublic"] = Field(default_factory=list)
|
|
|
|
|
|
class DocumentChapterListResponse(BaseModel):
|
|
items: list[DocumentChapterPublic]
|
|
total: int
|
|
|
|
|
|
class DocumentChapterCreateRequest(BaseModel):
|
|
name: str = Field(min_length=1, max_length=128)
|
|
description: str | None = Field(default=None, max_length=512)
|
|
parent_id: int | None = None
|
|
sort_order: int = 0
|
|
|
|
|
|
class DocumentChapterUpdateRequest(BaseModel):
|
|
name: str | None = Field(default=None, min_length=1, max_length=128)
|
|
description: str | None = Field(default=None, max_length=512)
|
|
parent_id: int | None = None
|
|
sort_order: int | None = None
|
|
|
|
|
|
class DocumentPublic(BaseModel):
|
|
id: int
|
|
title: str
|
|
content: str
|
|
chapter_id: int | None = None
|
|
sort_order: int
|
|
status: str
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class DocumentListResponse(BaseModel):
|
|
items: list[DocumentPublic]
|
|
total: int
|
|
|
|
|
|
class DocumentCreateRequest(BaseModel):
|
|
title: str = Field(min_length=1, max_length=256)
|
|
content: str
|
|
chapter_id: int | None = None
|
|
sort_order: int = 0
|
|
status: Literal["draft", "published"] = "draft"
|
|
|
|
|
|
class DocumentUpdateRequest(BaseModel):
|
|
title: str | None = Field(default=None, min_length=1, max_length=256)
|
|
content: str | None = None
|
|
chapter_id: int | None = None
|
|
sort_order: int | None = None
|
|
status: Literal["draft", "published"] | None = None
|