Files
NovalRedot/.claude/plan.md

126 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 大纲管理功能实现计划
## 概述
为小说添加大纲管理功能,大纲属于小说的子资源,支持增删改查。前端采用**卷轴时间线**可视化展示,契合"墨韵书斋"设计风格。
## 视觉设计方向
不做传统列表,而是做一条**竖向卷轴时间线**
- 中央一条细线作为"墨线",串联所有大纲节点
- 每个节点是一张展开的"纸笺"卡片,左右交替排列
- 卡片显示序号、一句话描述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. 启动后端+前端验证全流程