Files
chengkai3 483fdb982b feat:[FL-165][给系统开发一个操作文档管理和展示功能]
- 创建后端数据库模型: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>
2026-06-20 23:22:03 +08:00

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