新增前后端AI聊天模块,包括流式对话、配置管理和UI组件优化。

This commit is contained in:
2026-03-19 01:35:13 +08:00
commit ba6ceb94c8
66 changed files with 8631 additions and 0 deletions

125
.claude/plan.md Normal file
View File

@@ -0,0 +1,125 @@
# 大纲管理功能实现计划
## 概述
为小说添加大纲管理功能,大纲属于小说的子资源,支持增删改查。前端采用**卷轴时间线**可视化展示,契合"墨韵书斋"设计风格。
## 视觉设计方向
不做传统列表,而是做一条**竖向卷轴时间线**
- 中央一条细线作为"墨线",串联所有大纲节点
- 每个节点是一张展开的"纸笺"卡片,左右交替排列
- 卡片显示序号、一句话描述hover展开详情
- 点击卡片可编辑、删除
- 底部有"添加新节点"按钮,点击弹出模态框
- 空状态:一卷未展开的空白卷轴动画
- 节点间可拖拽排序用sort_order字段
---
## 一、后端
### 1. 数据模型 (`backend/app/models.py`)
在现有Novel模型同文件新增Outline模型
```python
class Outline(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
novel_id: int = Field(foreign_key="novel.id", index=True)
sort_order: int = Field(default=0) # 排序序号
summary: str = Field(max_length=200) # 一句话描述
detail: str = Field(default="", max_length=1000) # 详情100-300字
created_at: datetime = Field(default_factory=_now_utc)
updated_at: datetime = Field(default_factory=_now_utc)
```
### 2. 请求/响应模式 (`backend/app/schemas.py`)
新增:
- `OutlineCreate` — summary(必填), detail(可选)
- `OutlineUpdate` — summary, detail, sort_order 均可选
- `OutlineRead` — 全字段
- `OutlineList` — items + total
- `OutlineReorder` — 接收排序后的id列表
### 3. API路由 (`backend/app/routers/outlines.py`)
新建路由文件,前缀 `/api/novels/{novel_id}/outlines`
- `GET /` — 列出该小说所有大纲按sort_order排序
- `POST /` — 创建大纲自动设置sort_order为最大值+1
- `GET /{outline_id}` — 获取单个大纲
- `PATCH /{outline_id}` — 更新大纲
- `DELETE /{outline_id}` — 删除大纲
- `PUT /reorder` — 批量更新排序
### 4. 注册路由 (`backend/app/main.py`)
引入并挂载outlines_router。
---
## 二、前端
### 5. TypeScript类型 (`frontend/src/types/outline.ts`)
```typescript
export interface Outline {
id: number
novel_id: number
sort_order: number
summary: string
detail: string
created_at: string
updated_at: string
}
export interface OutlineCreate { summary: string; detail?: string }
export interface OutlineUpdate { summary?: string; detail?: string; sort_order?: number }
export interface OutlineList { items: Outline[]; total: number }
```
### 6. API调用 (`frontend/src/api/outlines.ts`)
跟随novels.ts的模式所有请求挂在 `/novels/{novelId}/outlines` 下。
### 7. 路由 (`frontend/src/router/index.ts`)
新增路由:
- `/novels/:id/outlines` → OutlineView大纲页面从小说详情页进入
### 8. 小说详情页更新 (`NovelDetailView.vue`)
添加"查看大纲"按钮/入口,链接到大纲页面。
### 9. 大纲视图页面 (`frontend/src/views/OutlineView.vue`)
主页面,包含:
- 返回小说详情的导航
- 小说标题显示
- 卷轴时间线组件
- 添加大纲的按钮
### 10. 卷轴时间线组件 (`frontend/src/components/outline/OutlineTimeline.vue`)
**核心可视化组件**,设计要点:
- 中央竖向墨线2px渐变从墨色到透明
- 大纲节点左右交替排列odd左even右
- 每个节点通过横向短线连接到中央墨线
- 节点连接点有一个圆形墨点装饰
- 入场动画:依次从上到下淡入,配合墨线延伸
### 11. 大纲节点卡片 (`frontend/src/components/outline/OutlineNode.vue`)
单个大纲节点:
- 纸笺风格卡片paper-50背景细边框微阴影
- 顶部显示序号标记(朱砂红圆圈内数字)
- 一句话summary作为标题
- 默认折叠状态hover或点击展开detail
- 展开状态下显示编辑/删除按钮
- hover微抬效果与NovelCard一致的动效
### 12. 大纲表单弹窗 (`frontend/src/components/outline/OutlineFormModal.vue`)
复用BaseModal + BaseInput + BaseTextarea
- 新建/编辑共用一个组件
- summary输入框单行必填max 200字
- detail文本域多行100-300字建议
- 字数统计提示
### 13. 大纲空状态 (`frontend/src/components/outline/OutlineEmptyState.vue`)
空白卷轴SVG动画 + "展开你的故事脉络"文案 + 创建按钮。
---
## 实施顺序
1. 后端模型 + schemas + API路由步骤1-4
2. 前端类型 + API层步骤5-6
3. 路由 + 详情页入口步骤7-8
4. 大纲视图页面 + 时间线组件 + 节点卡片步骤9-11
5. 表单弹窗 + 空状态步骤12-13
6. 启动后端+前端验证全流程