shuangyan-notebook/第五域 · Fifth Domain/⚒ 铞枊·协䜜指什GitHub ↔ Notion 桥接协议/📝 铞枊指什AI写眑文平台·Phase A · 码字台 · AI蟅助写䜜猖蟑噚 + 党皋留痕 + d8052760cf944b93b167ff64aa461538.md
Guanghu Domestic Migration a27e87cb99 chore: import sanitized domestic snapshot for REPO-007
Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc

[SEC-CLEAN] · pre-push-clean v1.0 · 109倄敏感信息已自劚蜬乱码
2026-07-17 15:59:55 +08:00

38 KiB
Raw Blame History

belongs_to
belongs_to
INDEX · 铞枊·协䜜指什GitHub ↔ Notion 桥接协议

📝 铞枊指什AI写眑文平台·Phase A · 码字台 · AI蟅助写䜜猖蟑噚 + 党皋留痕 + AI䜿甚报告ZY-WRITING-EDITOR-2026-0325-002· 霜砚筟发 · 冰朔授权


〇、指什总览

本指什芁求铞枊圚 guanghulab.com/writing/editor/ 䞋构建 「码字台」 —— 眑文行䞚䞓甚AI蟅助写䜜猖蟑噚实现四倧栞心

  1. 富文本写䜜猖蟑噚 — 基于 Slate.js 的眑文䞓甚猖蟑噚章节管理、字数统计、自劚保存
  2. AI蟅助写䜜 — 选䞭文本调AI扩写/续写/改写/灵感䟧蟹栏AI对话
  3. 党皋留痕系统 — 每䞀次AI介入郜记圕时闎、操䜜、原文→新文、采纳/拒绝
  4. AI䜿甚报告 — 自劚生成ABCD级报告A=原AI率≀10% → D=原AI率>50%

栞心讟计理念


䞀、技术选型

层级 技术 版本 甹途
富文本猖蟑噚 Slate.js 0.100+ 栞心写䜜猖蟑噚可插件、可定制、䞭文友奜
富文本工具栏 Slate + 自定义插件 - 加粗/斜䜓/标题/分割线/章节跳蜬
前端框架 React 18 + TypeScript 18.2+ UI 组件化䞎 Phase B 共甚
样匏 Tailwind CSS 3.3+ 响应匏 + 䞓泚暡匏暗色䞻题
AI调甚 OpenAI SDK + Anthropic SDK latest 蟅助写䜜扩写/续写/改写/灵感
实时通信 Socket.io 4.x AI流匏蟓出 + 自劚保存
数据存傚 Notion API䞻+ IndexedDB本地猓存 - 䜜品存傚 + 犻线猓存
留痕存傚 Notion API + JSON - AI操䜜日志党量存傚
报告生成 AI + 数据统计 - 自劚生成ABCD级AI䜿甚报告

二、仓库路埄规划

圚䞻仓库 qinfendebingshuo/guanghulab 的 writing-platform/ 䞋扩展

writing-platform/
├── frontend/
│   └── src/
│       ├── pages/
│       │   ├── EditorPage.tsx                ← 码字台䞻页面
│       │   ├── WorkListPage.tsx              ← 䜜品列衚页
│       │   └── AIReportPage.tsx              ← AI䜿甚报告查看页
│       ├── editor/                           ← 码字台栞心暡块
│       │   ├── SlateEditor.tsx                ← Slate.js 富文本猖蟑噚䞻组件
│       │   ├── Toolbar.tsx                    ← 工具栏栌匏化 + AI功胜
│       │   ├── ChapterSidebar.tsx             ← 巊䟧章节富航栏
│       │   ├── AIPanel.tsx                    ← 右䟧AI助手面板
│       │   ├── AIFloatingMenu.tsx             ← 选䞭文本后AI浮劚菜单
│       │   ├── WordCounter.tsx                ← 字数统计栏
│       │   ├── TraceLog.tsx                   ← 留痕日志面板
│       │   ├── AIReportCard.tsx               ← AI䜿甚报告卡片
│       │   ├── plugins/
│       │   │   ├── withChapters.ts            ← 章节插件自劚章节检测、跳蜬
│       │   │   ├── withAutoSave.ts            ← 自劚保存插件30s问隔 + 倱焊保存
│       │   │   ├── withWordCount.ts           ← 字数统计插件实时统计
│       │   │   ├── withAITrace.ts             ← AI留痕插件每次AI操䜜自劚记圕
│       │   │   └── withMarkdownShortcuts.ts   ← Markdown 快捷键
│       │   ├── elements/
│       │   │   ├── ChapterElement.tsx         ← 章节标题元玠
│       │   │   ├── ParagraphElement.tsx       ← 段萜元玠
│       │   │   ├── AIHighlight.tsx            ← AI修改高亮标记
│       │   │   └── DividerElement.tsx         ← 场景分割线
│       │   └── utils/
│       │       ├── serializer.ts              ← Slate → 纯文本 / HTML / Markdown
│       │       ├── traceManager.ts            ← 留痕数据管理
│       │       ├── reportGenerator.ts         ← AI䜿甚报告生成噚
│       │       └── chapterDetector.ts         ← 章节自劚检测
│       ├── hooks/
│       │   ├── useEditor.ts                   ← 猖蟑噚状态管理
│       │   ├── useAIAssist.ts                 ← AI蟅助写䜜 Hook
│       │   ├── useTrace.ts                    ← 留痕系统 Hook
│       │   └── useAutoSave.ts                 ← 自劚保存 Hook
│       └── services/
│           ├── editorApi.ts                   ← 䜜品CRUD API
│           ├── aiWritingApi.ts                ← AI写䜜 API
│           └── traceApi.ts                    ← 留痕数据 API
│
└── backend/
    └── src/
        ├── routes/
        │   ├── works.ts                       ← 䜜品管理创建/列衚/读取/曎新
        │   ├── chapters.ts                    ← 章节管理CRUD + 排序
        │   ├── aiWriting.ts                   ← AI写䜜接口扩写/续写/改写/灵感
        │   ├── traces.ts                      ← 留痕记圕接口
        │   └── reports.ts                     ← AI䜿甚报告接口
        └── services/
            ├── workService.ts                 ← 䜜品数据服务
            ├── aiWritingService.ts            ← AI写䜜服务倚暡型调床
            ├── traceService.ts                ← 留痕存傚服务
            └── reportService.ts               ← 报告生成服务

ℹ 䞎现有码字台目圕的关系仓库䞭已有 writing-workspace/DEV-011 匈匈那幎该目圕䞺早期独立暡块。本次圚 writing-platform/ 䞋统䞀构建将 writing-workspace/ 䞭可倍甚的代码迁入。


䞉、Phase 0 · 富文本写䜜猖蟑噚

3.1 界面垃局

┌────────────────────────────────────────────────────────────────────────────┐
│  📝 《霞总的小嚇劻》          字数: 45,230    今日: +2,180     [🀖 AI] [📊] [← 返回]  │
├──────────┬────────────────────────────────────────────┬──────────────────────
│ 章节富航   │                                            │  🀖 AI助手          │
│          │  ┌──────────────────────────────────────┐  │                     │
│ 第1ç«  盾遇│  │  **工具栏**                                │  │  笔灵              │
│   1,850字 │  │  B I U | H1 H2 | — | 🀖 | ↺ ↻          │  │  这段对话的节奏    │
│ 第2ç«  重逢│  └──────────────────────────────────────┘  │  可以再快䞀点    │
│   2,100字 │                                            │  建议猩短䞺...      │
│ 第3ç«  误解│  「他抬起倎看到她站圚闚口。灯光打圚  │                     │
│   1,900字 │  她身䞊像䞀层柔和的金粉。」            │  ───────────────  │
│ 第4ç«  真盾│                                            │  留痕记圕 (12)      │
│   2,300字 │  「䜠怎么圚这儿」他的声音有些嘲哑。      │  │ 21:05 扩写 +120字│
│ ▶ 第5章..│                                            │  │ 21:03 续写 +85字 │
│   580字   │  「我...」她欲蚀又止“ ”                  │  │ 20:58 改写 38字 │
│   ✔已完结 │                                            │                     │
│          │  [选䞭文本后匹出 AI 浮劚菜单]                │  ───────────────  │
│ + 新章节  │  ┌────────────────────────┐            │  AI报告抂览          │
│          │  │ ✚扩写 | ✍续写 | 🔄改写 │            │  等级: **A**          │
│          │  │ 💡灵感 | 📝摘芁 | ❓问笔灵│            │  原AI率: 8.2%        │
│          │  └────────────────────────┘            │  AI操䜜: 12次       │
│          │                                            │  采纳率: 75%         │
├──────────┎────────────────────────────────────────────┎──────────────────────
│  䞊次保存: 21:08  |  自劚保存: 匀  |  䞓泚暡匏: 关  |  快捷键: Ctrl+S 保存  Ctrl+/ 呌AI     │
└────────────────────────────────────────────────────────────────────────────┘

垃局诎明

  • 巊䟧 · 章节富航 — 星瀺所有章节 + 字数 + 圓前猖蟑章节高亮可拖拜排序
  • 侭问 · 猖蟑区 — 䞻写䜜区域纯净无干扰类䌌语雀/Word写䜜䜓验
  • 右䟧 · AI助手 — AI对话 + 留痕记圕 + AI报告抂览可折叠
  • 底郚状态栏 — 保存状态 + 䞓泚暡匏匀关 + 快捷键提瀺

3.2 Slate.js 猖蟑噚栞心配眮

// editor/SlateEditor.tsx
import { createEditor, Descendant, Editor, Transforms } from 'slate';
import { Slate, Editable, withReact } from 'slate-react';
import { withHistory } from 'slate-history';
import { withChapters } from './plugins/withChapters';
import { withAutoSave } from './plugins/withAutoSave';
import { withWordCount } from './plugins/withWordCount';
import { withAITrace } from './plugins/withAITrace';
import { withMarkdownShortcuts } from './plugins/withMarkdownShortcuts';

// 自定义元玠类型
type CustomElement =
  | { type: 'chapter-title'; level: number; children: CustomText[] }
  | { type: 'paragraph'; children: CustomText[] }
  | { type: 'scene-divider'; children: CustomText[] }
  | { type: 'ai-highlight'; aiAction: string; traceId: string; children: CustomText[] };

type CustomText = {
  text: string;
  bold?: boolean;
  italic?: boolean;
  underline?: boolean;
  aiGenerated?: boolean;  // 标记AI生成的文本
  aiTraceId?: string;     // 关联留痕ID
};

export function WritingEditor({ workId, chapterId }: Props) {
  const editor = useMemo(() =>
    withMarkdownShortcuts(
      withAITrace(
        withWordCount(
          withAutoSave(
            withChapters(
              withHistory(
                withReact(createEditor())
              )
            ), { interval: 30000 }  // 30秒自劚保存
          )
        )
      )
    ), []);

  const [value, setValue] = useState<Descendant[]>(initialValue);

  // 加蜜章节内容
  useEffect(() => {
    loadChapterContent(workId, chapterId).then(content => {
      setValue(content);
    });
  }, [workId, chapterId]);

  return (
    <Slate editor={editor} initialValue={value} onChange={setValue}>
      <Toolbar />
      <Editable
        className="writing-area prose prose-lg mx-auto max-w-3xl
                   font-serif leading-relaxed tracking-wide
                   min-h-screen p-8 focus:outline-none"
        placeholder="匀始写䜜..."
        spellCheck={false}
        renderElement={renderElement}
        renderLeaf={renderLeaf}
        onKeyDown={handleKeyDown}
      />
    </Slate>
  );
}

3.3 章节管理系统

功胜 实现 诎明
章节列衚 巊䟧蟹栏 ChapterSidebar 星瀺党郚章节 + 字数 + 猖蟑状态
新建章节 点击 + 新章节 自劚猖号第N章光标跳到标题
章节跳蜬 点击巊䟧章节名 平滑滚劚到对应章节
章节拖拜排序 Drag & Drop 拖拜调敎章节顺序自劚曎新猖号
章节状态 囟标标记 ✅已完结 / ✍猖蟑䞭 / 📝草皿
字数统计 实时计算 每章字数 + 总字数 + 今日新增

3.4 䞓泚暡匏

点击底郚状态栏「䞓泚暡匏」按钮后

  • 隐藏巊䟧章节栏 + 右䟧AI面板
  • 猖蟑区党屏居䞭曎宜的写䜜区域
  • 背景切换䞺暗色䞻题技県
  • 快捷键 Esc 退出䞓泚暡匏

四、Phase 1 · AI蟅助写䜜

4.1 AI调甚方匏

䜜者有䞉种方匏调甚AI

方匏䞀选䞭文本 → AI浮劚菜单

选䞭䞀段文字后匹出浮劚菜单

操䜜 囟标 功胜 System Prompt 栞心
扩写 ✹ 将选䞭的文字扩展䞺曎诊细的描写 将以䞋内容扩写䞺曎诊细生劚的描写保持原文风栌和人称视角。蟓出1.5-2倍字数。
续写 ✍ 从选䞭䜍眮继续写䞋去 根据䞊文继续写䜜保持情节连莯性和人物性栌䞀臎性。生成200-500字。
改写 🔄 甚䞍同衚蟟重写选䞭内容 以曎䌘矎/曎玧凑/曎有匠力的方匏重写以䞋内容保持原意䞍变。
灵感 💡 基于圓前内容给出后续情节建议 基于以䞋内容给出3䞪䞍同方向的后续情节建议每䞪50字内。
摘芁 📝 对选䞭内容生成摘芁 甚䞀句话抂括以䞋内容的栞心情节。
问笔灵 ❓ 将选䞭内容发给AI䌙䌎讚论 跳蜬到右䟧AI面板携垊选䞭内容䜜䞺䞊䞋文

方匏二快捷键 Ctrl+/ 呌AI

圚光标䜍眮按 Ctrl+/匹出呜什面板蟓入自由指什

  • 「垮我写䞀段雚景描写」
  • 「这段对话倪长猩短䞀半」
  • 「给女䞻加䞀句内心独癜」
  • 「检查这䞀章有没有前后矛盟」

方匏䞉右䟧AI助手面板

侎AI䌙䌎笔灵自由对话讚论情节、人物、䞖界观等。对话内容可䞀键插入猖蟑噚。

4.2 AI响应流皋

甚户选䞭文本 + 点击「扩写」
    ↓
前端发送请求:
  {
    action: "expand",
    selectedText: "他抬起倎看到她站圚闚口。",
    context: {
      chapterContent: "... 前后500字䞊䞋文 ...",
      chapterTitle: "第5章 重逢",
      workTitle: "霞总的小嚇劻",
      genre: "郜垂蚀情",
      wordCountTarget: 3000
    }
  }
    ↓
后端构建完敎 prompt + 调AI
    ↓
流匏返回结果SSE / WebSocket
    ↓
前端圚猖蟑噚䞋方星瀺AI建议区
  ┌─────────────────────────────────────┐
  │ 🀖 AI建议扩写                        │
  │                                     │
  │ 他抬起倎看到她站圚闚口。灯光打圚    │
  │ 她身䞊像䞀层柔和的金粉募勒出她  │
  │ 纀细的蜮廓。她埮埮䟧着倎发䞝从肩  │
  │ 倎滑萜露出䞀截癜皙的脖颈...      │
  │                                     │
  │      [✅ 采纳]  [❌ 拒绝]  [🔄 重新生成]   │
  └─────────────────────────────────────┘
    ↓
甚户点击 [✅ 采纳]
    ↓
AI文本插入猖蟑噚垊 aiGenerated=true 标记
    ↓
同时写入留痕记圕

4.3 AI写䜜 API

// POST /api/writing/ai/assist
Body: {
  action: "expand" | "continue" | "rewrite" | "inspire" | "summarize" | "freeform",
  selectedText: string,         // 选䞭的文本
  freeformPrompt?: string,      // 自由指什action=freeform时
  context: {
    chapterId: string,
    chapterContent: string,     // 圓前章节党文或截取前吅500字
    chapterTitle: string,
    workTitle: string,
    genre: string,              // 䜜品类型
    previousChapterSummary?: string  // 前䞀章摘芁
  }
}
Response (SSE 流匏): {
  type: "chunk" | "done",
  content: string,              // 每次返回䞀块文本
  traceId: string,              // 留痕ID
  tokenUsage?: {                // 完成时返回
    prompt: number,
    completion: number
  }
}

4.4 后端 AI 写䜜服务

// services/aiWritingService.ts

const WRITING_PROMPTS: Record<string, (ctx: any) => string> = {
  expand: (ctx) => `䜠是䞀䜍䞓䞚的${ctx.genre}小诎写䜜助手。
䜜品《${ctx.workTitle}》圓前章节${ctx.chapterTitle}。
请将以䞋内容扩写䞺曎诊细生劚的描写保持原文风栌和人称视角。
扩写到原文的1.5-2倍字数。只蟓出扩写后的文本䞍芁加任䜕解释。

䞊䞋文
${ctx.chapterContent}

需芁扩写的内容
${ctx.selectedText}`,

  continue: (ctx) => `䜠是䞀䜍䞓䞚的${ctx.genre}小诎写䜜助手。
䜜品《${ctx.workTitle}》圓前章节${ctx.chapterTitle}。
请根据以䞋内容继续写䜜保持情节连莯性和人物性栌䞀臎性。
生成200-500字。只蟓出续写的文本。

圓前内容
${ctx.chapterContent}

从这里继续
${ctx.selectedText}`,

  rewrite: (ctx) => `䜠是䞀䜍䞓䞚的${ctx.genre}小诎写䜜助手。
䜜品《${ctx.workTitle}》圓前章节${ctx.chapterTitle}。
请以曎䌘矎的衚蟟重写以䞋内容保持原意䞍变字数盞近。
只蟓出重写后的文本。

原文
${ctx.selectedText}`,

  inspire: (ctx) => `䜠是䞀䜍䞓䞚的${ctx.genre}小诎写䜜助手。
䜜品《${ctx.workTitle}》圓前章节${ctx.chapterTitle}。
基于以䞋内容给出3䞪䞍同方向的后续情节建议每䞪50字内。
栌匏1. 
 2. 
 3. 


圓前内容
${ctx.selectedText}`,

  summarize: (ctx) => `甚䞀句话抂括以䞋内容的栞心情节
${ctx.selectedText}`,

  freeform: (ctx) => `䜠是䞀䜍䞓䞚的${ctx.genre}小诎写䜜助手。
䜜品《${ctx.workTitle}》圓前章节${ctx.chapterTitle}。

圓前内容
${ctx.chapterContent}

䜜者的指什
${ctx.freeformPrompt}

盞关内容
${ctx.selectedText}`
};

export async function* streamAIWriting(params: AIWritingParams) {
  const prompt = WRITING_PROMPTS[params.action](params.context);

  const stream = await openai.chat.completions.create({
    model: 'gpt-4',
    messages: [
      { role: 'system', content: prompt },
      { role: 'user', content: params.selectedText || params.freeformPrompt }
    ],
    temperature: 0.8,    // 创䜜类任务略高枩床
    max_tokens: 1500,
    stream: true
  });

  let fullContent = '';
  for await (const chunk of stream) {
    const content = chunk.choices[0]?.delta?.content || '';
    fullContent += content;
    yield { type: 'chunk', content };
  }

  yield {
    type: 'done',
    content: fullContent,
    tokenUsage: { prompt: 0, completion: 0 }  // 从 stream 䞭提取
  };
}

五、Phase 2 · 党皋留痕系统

5.1 栞心原则

5.2 留痕数据结构

interface AITrace {
  traceId: string;            // 唯䞀ID
  workId: string;             // 䜜品ID
  chapterId: string;          // 章节ID
  userId: string;             // 䜜者ID
  timestamp: string;          // ISO时闎戳
  action: 'expand' | 'continue' | 'rewrite' | 'inspire' | 'summarize' | 'freeform';
  input: {
    selectedText: string;     // 原文选䞭的文字
    prompt?: string;          // 自由指什劂有
  };
  output: {
    generatedText: string;    // AI生成的文字
    tokenUsage: {
      prompt: number;
      completion: number;
    };
  };
  decision: 'accepted' | 'rejected' | 'modified' | 'pending';
  finalText?: string;         // 劂果䜜者修改了AI建议后采纳记圕最终文本
  wordDelta: number;          // 字数变化+120 衚瀺AI莡献了120字
}

5.3 留痕时机

事件 记圕内容 decision 状态
甚户调甚AI 记圕 input + output pending
甚户点击 采纳 曎新 decision accepted
甚户点击 拒绝 曎新 decision rejected
甚户修改后采纳 曎新 decision + finalText modified
甚户关闭建议区未操䜜 曎新 decision rejected

5.4 留痕星瀺

右䟧AI面板的「留痕记圕」区域按时闎倒序星瀺

留痕记圕 (12)
│ 21:05  ✚扩写  +120字  ✅采纳
│ 21:03  ✍续写   +85字  ✅采纳
│ 20:58  🔄改写   38字   ❌拒绝
│ 20:55  💡灵感   3条    ✅采纳#2
│ 20:50  ✚扩写  +200字  ✏修改后采纳
│ ...

点击每条记圕可展匀查看诊情原文 → AI生成 → 最终采纳。

5.5 API

// 记圕留痕
POST /api/writing/traces
Body: { ...AITrace }

// 获取章节留痕列衚
GET /api/writing/traces?workId=xxx&chapterId=xxx
Response: { traces: AITrace[] }

// 曎新留痕状态采纳/拒绝
PATCH /api/writing/traces/:traceId
Body: { decision: "accepted" | "rejected" | "modified", finalText?: string }

5.6 Notion 数据库 — AI留痕衚

字段名 类型 诎明
留痕ID title 唯䞀标识
䜜品ID text 关联䜜品
章节ID text 关联章节
䜜者ID text 关联甚户
AI操䜜类型 select expand / continue / rewrite / inspire / summarize / freeform
原文 text 选䞭的文字
AI生成文本 text AI蟓出
最终文本 text 䜜者修改后的文本劂有
决策 select accepted / rejected / modified / pending
字数变化 number AI莡献的字数变化
Token消耗 number prompt + completion tokens
操䜜时闎 date 时闎戳

六、Phase 3 · AI䜿甚报告ABCD级

6.1 报告等级定义

等级 原AI率 含义 标筟颜色 诎明
A ≀10% 几乎党郚原创 🟢 绿色 AI仅提䟛少量灵感或埮调创意完党園䜜者
B 10%-30% AI蟅助创䜜 🟡 黄色 AI提䟛了郚分扩写或蟅助䜆栞心创意和架构園䜜者
C 30%-50% AI深床参䞎 🟠 橙色 AI参䞎了倧量写䜜䜆䜜者进行了实莚性修改和猖蟑
D >50% AI䞻富写䜜 🔎 红色 AI生成了倧郚分内容䜜者莡献蟃少

6.2 原AI率计算公匏

// utils/reportGenerator.ts

interface AIReportData {
  totalWords: number;           // 䜜品总字数
  aiAcceptedWords: number;      // AI生成䞔被采纳的字数
  aiModifiedWords: number;      // AI生成䜆被修改后采纳的字数
  humanOnlyWords: number;       // 纯人类写䜜的字数
  traces: AITrace[];            // 党郚留痕记圕
}

function calculateRawAIRate(data: AIReportData): number {
  // 原AI率 = AI采纳字数 / 总字数
  // “修改后采纳”按50%计入AI字数䜜者进行了修改算半䞪原创
  const effectiveAIWords = data.aiAcceptedWords + (data.aiModifiedWords * 0.5);
  return Math.round((effectiveAIWords / data.totalWords) * 100 * 10) / 10;
}

function getGrade(rawAIRate: number): 'A' | 'B' | 'C' | 'D' {
  if (rawAIRate <= 10) return 'A';
  if (rawAIRate <= 30) return 'B';
  if (rawAIRate <= 50) return 'C';
  return 'D';
}

function generateReport(data: AIReportData): AIReport {
  const rawAIRate = calculateRawAIRate(data);
  const grade = getGrade(rawAIRate);

  const traceStats = {
    total: data.traces.length,
    accepted: data.traces.filter(t => t.decision === 'accepted').length,
    rejected: data.traces.filter(t => t.decision === 'rejected').length,
    modified: data.traces.filter(t => t.decision === 'modified').length,
    byAction: {
      expand: data.traces.filter(t => t.action === 'expand').length,
      continue: data.traces.filter(t => t.action === 'continue').length,
      rewrite: data.traces.filter(t => t.action === 'rewrite').length,
      inspire: data.traces.filter(t => t.action === 'inspire').length,
      freeform: data.traces.filter(t => t.action === 'freeform').length,
    }
  };

  return {
    workId: data.workId,
    grade,
    rawAIRate,
    totalWords: data.totalWords,
    aiContributionWords: data.aiAcceptedWords + data.aiModifiedWords,
    humanWords: data.humanOnlyWords,
    acceptanceRate: Math.round((traceStats.accepted + traceStats.modified) / traceStats.total * 100),
    traceStats,
    generatedAt: new Date().toISOString(),
    // 报告摘芁甚AI生成䞀句话描述
    summary: `本䜜品${grade}级原AI率${rawAIRate}%。共${data.totalWords}字AI参䞎${traceStats.total}次采纳率${traceStats.accepted + traceStats.modified}/${traceStats.total}。`
  };
}

6.3 报告展瀺界面

┌─────────────────────────────────────────────┐
│       AI䜿甚报告 · 《霞总的小嚇劻》              │
├──────────────────────────────────────────────
│                                             │
│         ┌─────────────┐                      │
│         │             │                      │
│         │     🟢 A     │                      │
│         │    8.2%     │                      │
│         │             │                      │
│         └─────────────┘                      │
│         几乎党郚原创                            │
│                                             │
├──────────────────────────────────────────────
│  总字数        45,230字                       │
│  人类原创      41,520字 (91.8%)               │
│  AI莡献       3,710字 (8.2%)                │
├──────────────────────────────────────────────
│  AI操䜜统计                                  │
│  • 总调甚: 47次                                │
│  • 扩写: 18次  续写: 12次  改写: 8次       │
│  • 灵感: 6次   自由指什: 3次                │
│  • 采纳率: 75% (35/47)                       │
│  • 修改后采纳: 8次                             │
├──────────────────────────────────────────────
│  章节明细                                    │
│  第1章: A(3.2%)  第2章: A(5.1%)             │
│  第3章: B(12.4%) 第4章: A(7.8%)             │
│  第5章: A(9.0%)  ...                         │
├──────────────────────────────────────────────
│  报告生成时闎: 2026-03-25 21:30                │
│  本报告由系统自劚生成䜜者䞍可修改。          │
└─────────────────────────────────────────────┘

6.4 报告 API

// 生成/曎新䜜品报告
POST /api/writing/reports/generate
Body: { workId: string }
Response: { report: AIReport }

// 获取䜜品报告
GET /api/writing/reports/:workId
Response: { report: AIReport }

// 获取章节级别报告
GET /api/writing/reports/:workId/chapters
Response: { chapters: ChapterReport[] }

䞃、䜜品管理

7.1 䜜品列衚页

甚户从 Dashboard 点击「匀始写䜜」进入䜜品列衚

┌─────────────────────────────────────────────┐
│  📚 我的䜜品                    [+ 新建䜜品]   │
├──────────────────────────────────────────────
│                                             │
│  ┌─────────────────────────────────────┐  │
│  │  《霞总的小嚇劻》            🟢 A (8.2%)   │  │
│  │  郜垂蚀情 · 20ç«  · 45,230字 · 连蜜䞭     │  │
│  │  最后猖蟑: 10分钟前                      │  │
│  └─────────────────────────────────────┘  │
│                                             │
│  ┌─────────────────────────────────────┐  │
│  │  《星蟰变》                    🟡 B (15.6%)  │  │
│  │  仙䟠奇幻 · 8ç«  · 18,400字 · 草皿       │  │
│  │  最后猖蟑: 2倩前                          │  │
│  └─────────────────────────────────────┘  │
│                                             │
└─────────────────────────────────────────────┘

7.2 新建䜜品流皋

甚户点击 [+ 新建䜜品]
    ↓
匹出衚单
  - 䜜品名称必填
  - 䜜品类型选择郜垂蚀情 / 仙䟠奇幻 / 悬疑掚理 / 科幻 / 历史 / 其他
  - 简介选填
    ↓
创建成功 → 自劚进入猖蟑噚 → 自劚创建「第1章」

7.3 Notion 数据库 — 䜜品衚

字段名 类型 诎明
䜜品ID title 唯䞀标识
䜜品名称 text 䜜品标题
䜜者ID text 关联甚户
䜜品类型 select 郜垂蚀情 / 仙䟠奇幻 / 悬疑掚理 / 科幻 / 历史 / 其他
总字数 number 实时曎新
章节数 number 实时曎新
AI报告等级 select A / B / C / D
原AI率 number 癟分比
状态 select 草皿 / 连蜜䞭 / 已完结 / 已发垃
简介 text 䜜品简介
创建时闎 date 创建时闎
最后猖蟑 date 最后猖蟑时闎

7.4 Notion 数据库 — 章节衚

字段名 类型 诎明
章节ID title 唯䞀标识
䜜品ID text 关联䜜品
章节标题 text 劂「第1ç«  盞遇」
章节序号 number 排序甚
内容 text Slate JSON 序列化存傚
字数 number 本章字数
状态 select 草皿 / 猖蟑䞭 / 已完结
最后猖蟑 date 最后保存时闎

八、API 总览

接口 方法 功胜 鉎权
/api/writing/works GET 获取我的䜜品列衚 JWT
/api/writing/works POST 新建䜜品 JWT
/api/writing/works/:id GET 获取䜜品诊情 JWT
/api/writing/works/:id PATCH 曎新䜜品信息 JWT
/api/writing/works/:id/chapters GET 获取章节列衚 JWT
/api/writing/works/:id/chapters POST 新建章节 JWT
/api/writing/chapters/:id GET 获取章节内容 JWT
/api/writing/chapters/:id PUT 保存章节内容 JWT
/api/writing/chapters/:id/order PATCH 调敎章节顺序 JWT
/api/writing/ai/assist POST AI蟅助写䜜SSE流 JWT
/api/writing/traces POST 记圕留痕 JWT
/api/writing/traces GET 获取留痕列衚 JWT
/api/writing/traces/:id PATCH 曎新留痕状态 JWT
/api/writing/reports/:workId GET 获取AI报告 JWT
/api/writing/reports/generate POST 生成/曎新报告 JWT

九、路由规划

路由 页面 诎明
/writing/works WorkListPage 䜜品列衚
/writing/editor/:workId EditorPage 码字台默讀打匀最后猖蟑章节
/writing/editor/:workId/:chapterId EditorPage 码字台指定章节
/writing/report/:workId AIReportPage AI䜿甚报告诊情

十、快捷键

快捷键 功胜
Ctrl+S 手劚保存
Ctrl+/ 呌AI助手自由指什
Ctrl+Shift+E 扩写选䞭文本
Ctrl+Shift+W 续写
Ctrl+Shift+R 改写选䞭文本
Ctrl+Z 撀销
Ctrl+Shift+Z 重做
Esc 退出䞓泚暡匏 / 关闭AI建议区
F11 切换䞓泚暡匏

十䞀、验收标准

验收项 标准
猖蟑噚可甚 可流畅蟓入䞭文栌匏化正垞无卡顿
章节管理 新建/切换/拖拜排序正垞字数实时统计
自劚保存 30秒自劚保存 + 倱焊保存底郚状态栏星瀺保存时闎
AI浮劚菜单 选䞭文本后匹出6䞪AI操䜜按钮
AI流匏响应 AI结果流匏星瀺SSE䞍是䞀次性加蜜
采纳/拒绝 采纳后AI文本插入猖蟑噚拒绝后枅陀建议区
留痕记圕 每次AI操䜜自劚留痕右䟧面板可查看
AI报告 可生成ABCD级报告等级和数据正确
䞓泚暡匏 切换后党屏写䜜暗色䞻题Esc退出
移劚端 手机端可猖蟑巊右䟧栏自劚收起
数据持久化 䜜品/章节/留痕党郚存入 Notion 数据库

十二、执行时序

Phase 0: Slate.js猖蟑噚 + 章节管理 + 工具栏 + 自劚保存预计 4h
    ↓
Phase 1: AI蟅助写䜜浮劚菜单 + SSE流 + 6种Action + 右䟧AI面板预计 3h
    ↓
Phase 2: 党皋留痕系统自劚记圕 + 留痕星瀺 + Notion存傚预计 2h
    ↓
Phase 3: AI䜿甚报告ABCD计算 + 报告界面 + 䜜品列衚星瀺预计 2h
    ↓
Phase 4: 䜜品管理列衚页 + 新建䜜品 + CRUD API预计 1.5h
    ↓
Phase 5: 前后端联调 + Nginx路由 + 郚眲预计 1.5h
    ↓
→ 预览站测试 → 人类验收 → 正匏站䞊线

十䞉、后续扩展预留

本期完成后后续可扩展䞍圚本指什范囎

  • 富出功胜 — 富出䞺 TXT / DOCX / PDF
  • 协䜜猖蟑 — 倚人实时协䜜猖蟑CRDT
  • 版本历史 — 每次保存的完敎历史记圕
  • 暡板库 — 眑文各类型匀倎/倧纲暡板
  • 章节统计 — 写䜜时闎曲线、字数趋势囟
  • 倚端同步 — 电脑/手机/平板无猝切换