chenchen-plan

第一天-已实现的功能

1. 前端框架搭建

http://whale3070.com:3000/

2. 后端miroFish搭建

cd /root/chenchen-lib/services/ai && .venv/bin/uvicorn main:app –host 0.0.0.0 –port 8787

3. 钱包连接自动识别身份

4. 角色管理

新增角色
删除角色
编辑角色

已实现:角色新增 / 删除 + 按钱包持久化

行为说明

  • 未连接钱包:侧栏仍显示演示角色,但 「新增角色」与删除 为禁用状态,并提示需连接钱包才会写入服务端。
  • 已连接钱包:从 GET /api/v1/personas?authorId= 加载该地址的存档;若尚无存档,则先用演示数据(仅内存),第一次点「新增」或「删除」 会把当前列表 POST 保存。
  • AI 推演 更新 dramas 时也会 自动 POST 整份角色列表,与手动增删共用同一存储。

后端(Next Route)

  • 新路由:apps/web/src/app/api/v1/personas/route.ts
    • GET:按 authorId(合法以太坊地址)读取
    • POST{ authorId, personas } 整表覆盖写入
  • 存储位置:与草稿一致,使用 apps/web/.data/personas/{address小写}.json(按钱包隔离的持久化文件;根目录 .gitignore 已忽略 .data/)。
    若你后续要换成 PostgreSQL / SQLite,只需在本路由内改读写实现,前端契约可保持不变。

前端

  • persona-sidebar.tsx:「新增角色」按钮、每条右侧 删除(带 stopPropagation,避免误触选中)。
  • persona-factory.tscreateEmptyPersona() 生成符合类型的空白卡片。
  • novel-editor.tsx:钱包变更时拉取/回落演示数据;persistPersonas;AI 更新走 handlePersonasUpdateFromAi

部署提示(http://whale3070.com:3000/

确保运行 next start 的进程对项目目录下的 .data/ 有写权限,且若用容器/无盘实例,需挂 volume,否则重启后 JSON 会丢。

本地已通过 npm run buildnpm run lint。若你希望改成真实关系型数据库,可以说下技术栈(例如 Prisma + Postgres),我可以再改一版 API 实现。


已实现:右侧角色卡片可编辑

persona-detail.tsx

  • 增加可选属性 onPersonaChange?: (persona: Persona) => void;传入后即进入编辑模式。
  • 基本信息:姓名、职能标签、人设摘要。
  • 立场:摘要、可见性、toward 列表(对象 / 态度下拉 / 强度 0–1、增删行)。
  • 动机:目标、为何此刻、内在需求、stakes、误念。
  • 当前冲突:类型、描述、对立面、升级钩子。
  • onPersonaChange 时仍为只读(兼容旧用法)。

novel-editor.tsx

  • handlePersonaDetailChange:按 id 写回 personas
  • 500ms 防抖 后调用现有 persistPersonas(与增删一致:仅在有 authorId 时 POST)。

左侧列表中的姓名等会随编辑即时更新;联网且已连接钱包时,编辑会自动同步到 /api/v1/personas

5. 断点记忆恢复

Context
项目使用 Next.js + Tiptap 编辑器。我们需要实现“断点记忆恢复”功能,帮助作者克服开机焦虑。

Task: Persistence of Writing Context
请修改 apps/web 中的编辑器逻辑,实现以下功能:

  1. 多维度状态采集:

    • 在自动保存 (Auto-save) 时,除了 content,必须捕获:
      • selection: 当前光标的 JSON 位置。
      • last_action_timestamp: 最后一次编辑的时间。
      • viewport_scroll: 当前页面的滚动高度。
  2. 后端/本地联动存储:

    • 优先存入浏览器的 localStorage(瞬时恢复)。
    • 同时防抖 (Debounce 2000ms) 异步同步到后端数据库,关联用户的 MetaMask 钱包地址。
  3. 视觉唤醒 (The “Wake-up” UI):

    • 当用户重新打开文档且 last_action_timestamp 超过 1 小时,在编辑器顶部显示一个极其克制的浮动条:
      • 文案:“欢迎回来,[作者名]。上次你写到了 [提取当前段落前5个词]…”
      • 按钮:“一键入戏” -> 点击后:editor.commands.focus(selection) 并平滑滚动到对应位置。

6. 卡片式大纲组件

在 apps/web 中创建一个 OutlineSidebar 组件。

  1. 数据结构参考 shared/types/plot-node.ts,支持卷、章、节的树状展示。
  2. 每个节点是一个可编辑的卡片,包含标题、简述、标签(如:#高潮 #伏笔)。
  3. 实现拖拽排序功能,当排序改变时,触发后端 update_structure 接口。
  4. 点击节点,编辑器自动滚动并定位到正文对应位置。

已交付:OutlineSidebar + 大纲持久化 + 稿面定位

1. 类型(shared/types/plot-node.ts

  • PlotNodeKind 增加:volume(卷)、chapter(章)、section(节)。
  • PlotNode 增加可选字段 tags?: string[],用于 #高潮 / #伏笔 这类标签(存字符串,界面展示自动加 #)。

2. 工具与演示数据

3. 后端 update-structure

4. 组件 apps/web/src/components/outline-sidebar.tsx

  • 树状展示卷 / 章 / 节(缩进 + 每层独立 SortableContext@dnd-kit)。
  • 卡片可编辑:标题简述标签(回车添加、芯片可删)。
  • 拖拽:同级排序成功后立刻 POST /api/v1/update-structure;文案修改 650ms 防抖 再 POST。
  • 定位:每卡片 「定位」 按钮 → 调用 onNodeSeek,在稿面中 focus + setTextSelection + scrollIntoView()(依赖节点上的 range.from)。

5. 集成(novel-editor.tsx

  • 状态 outlineNodes;已连接钱包则 GET 恢复,否则用演示大纲。
  • postOutlineStructure:仅在有 authorId 时 POST(未连接仍可本地改大纲,但不会落库)。
  • 布局:角色侧栏 | 大纲侧栏 | 主编辑区,外层 overflow-x-auto 避免窄屏撑爆。

依赖

  • 已安装 @dnd-kit/core@dnd-kit/sortable@dnd-kit/utilities

说明:正文与大纲的 range 目前需自行维护或由后续「标题锚点 / 插件」写入;演示里 from: 1 等仅为占位,精确定位可在编辑器里插入对应位置后把 range 写回节点再保存。若需要跨层级拖拽(例如把「节」拖到另一「章」下),可在现有 reorderOutlineFlat 上再扩展一层「改 parentId」逻辑。

7. 身份分区

修改根路由 page.tsx,创建一个极简且具有科技感的进入页面:

  1. 背景采用深色渐变,中心放置两个并列的大卡片:‘我是作者 (Creator)’ 和 ‘我是读者 (Reader)’。
  2. 使用 Framer Motion 实现悬停缩放效果。
  3. 点击‘我是作者’跳转到 /workspace;点击‘我是读者’跳转到 /library(目前先预留)。
  4. 底部增加‘连接钱包以继续’的 MetaMask 按钮,如果已连接,直接显示钱包地址。

8. 作者管理后台

修改根路由 page.tsx,创建一个极简且具有科技感的进入页面:

  1. 背景采用深色渐变,中心放置两个并列的大卡片:‘我是作者 (Creator)’ 和 ‘我是读者 (Reader)’。
  2. 使用 Framer Motion 实现悬停缩放效果。
  3. 点击‘我是作者’跳转到 /workspace;点击‘我是读者’跳转到 /library(目前先预留)。
  4. 底部增加‘连接钱包以继续’的 MetaMask 按钮,如果已连接,直接显示钱包地址。

在 /workspace 路径下创建一个作者管理后台。

  1. 顶部导航:显示‘我的小说’和‘账户设置’。
  2. 核心操作区:显眼位置放置一个 + 新建小说 的按钮卡片。
  3. 交互逻辑:点击按钮后,弹出一个 Modal(对话框),要求输入:
    • 小说标题 (Title)
    • 内容简介 (Description/Preface)
  4. 点击‘确认创建’后,调用后端接口保存数据,并自动跳转到该小说的编辑页面(例如 /editor/[id])。

完善 /workspace 的身份验证逻辑:

检查 useWeb3Auth 状态。如果用户未连接钱包,自动重定向回首页或弹出连接请求。

在‘新建小说’的保存请求中,Header 必须包含 x-wallet-address。

后端识别到地址后,如果该地址名下已有小说,在工作台下方以列表形式展示出来,显示书名、字数和最后修改时间。

发布功能

基于我当前的郴郴文库AI写作编辑器(现有结构:左侧角色设定、中间卷/章/节大纲、右侧角色详情、顶部AI推演),做以下完整升级:

  1. 【新增发布按钮】

    • 在页面右上角(现有「导出小说」按钮右侧),新增一个高对比度的「发布小说」主按钮
    • 按钮样式:深蓝色(#2196f3)背景、白色文字、圆角、hover有放大+加深效果,点击弹出发布配置弹窗
    • 按钮文案:「发布小说」,尺寸与「导出小说」一致,视觉层级突出
  2. 【发布配置弹窗(核心功能)】
    弹窗为居中模态框,深色科技风,包含以下模块:

    • 🔹 基础信息区(自动填充,可编辑):
      • 小说标题:自动读取大纲的卷标题(如「第一卷·匿名信」)
      • 小说简介:自动读取卷的简述(如「台谏与枢密院角力下的夜里对谈」)
      • 小说标签:自动读取卷的标签(如#政治 #伏笔),支持增删
    • 🔹 发布设置区:
      • 可见范围选择:「仅自己可见(草稿)」/「公开可见(读者可看)」
      • 付费模式选择:「免费阅读」/「付费阅读(0抽成,收益直达作者)」
      • 付费金额输入框(仅付费模式显示):支持港币/美元/人民币切换,默认港币
      • 更新承诺设置:「无承诺」/「每周X更」(下拉选择1-7更),勾选后自动绑定烂尾退款规则
    • 🔹 版权声明区(固定不可修改):
      • 「本作品版权100%归作者所有,郴郴文库仅提供技术服务,不抽成、不买断、不干涉创作」
    • 🔹 操作按钮:
      • 左下角:「取消」(关闭弹窗,不保存)
      • 右下角:「确认发布」(点击后执行发布逻辑,关闭弹窗,按钮状态变为「已发布」)
  3. 【发布后状态同步】

    • 发布成功后,「发布小说」按钮变为「已发布」(灰色背景,点击可查看发布状态/修改设置)
    • 新增「发布状态」标签,在大纲区顶部显示:「草稿」/「已公开」/「付费中」
    • 支持「撤回发布」功能(仅草稿/已发布状态可操作,撤回后恢复为草稿)
  4. 【交互与样式要求】

    • 弹窗有遮罩层,点击遮罩可关闭,动画平滑淡入淡出
    • 所有输入框/选择框有hover、聚焦高亮效果,符合现有UI风格
    • 完全兼容现有代码结构,不破坏角色设定、大纲、AI推演等原有功能
    • 样式统一:主色#0a0e17,高光#4fc3f7,卡片#121a29,与现有设计100%匹配
    • 代码添加清晰注释,标注发布模块,便于后续对接后端支付、读者端同步
  5. 【额外优化】

    • 在作者工作台(新建小说页面)同步新增「发布管理」入口,显示所有小说的发布状态
    • 发布按钮在未完成大纲/内容时,可置灰提示「请完成小说内容后再发布」

第二天功能开发

cd ~/chenchen-lib/apps/web && npm install && npm run build && npm run start

1. 连接失败帮助弹窗

2. 修改前端页面排版

3. 下一章tab

已在作者编辑页底部加好了“上一章 / 下一章”章节导航,行为符合你的要求:

  • 第一章时:只显示“下一章”
  • 中间章节:显示“上一章 + 下一章”
  • 最后一章点击下一章
    • 自动新增下一章(按现有最大章号 +1 命名)
    • 自动跳转到新章,并在稿面末尾插入空白段落,作为“空白页面”开始写

实现文件:

  • apps/web/src/components/novel-editor.tsx

并且已通过 lint 检查。

4. 财务管理

已完成你要的两端改造:

1) 作者编辑页新增「财务管理」Tab

http://whale3070.com:3000/editor/... 里现在有第三个管理 Tab:

  • 角色设定管理
  • 剧情大纲管理
  • 财务管理

点击 财务管理 后会显示“收款码上传”区域:

  • 仅允许上传图片文件(accept="image/*" + 后端二次校验)
  • 支持 png/jpg/webp/gif
  • 上传成功后即时预览当前收款码

实现文件:

  • apps/web/src/components/novel-editor.tsx
  • 新增 API:apps/web/src/app/api/v1/author-payment-qr/route.ts

2) 读者阅读页新增「打赏作者」

在读者章节页 http://whale3070.com:3000/library/art_xxx

  • 原有 上一章 / 下一章
  • 中间新增 打赏作者
  • 点击后会直接显示作者上传的收款码图片
  • 若作者未上传,会显示“作者暂未上传收款码”

实现文件:

  • apps/web/src/app/library/[articleId]/page.tsx
  • apps/web/src/app/api/v1/library/articles/route.ts(返回 paymentQrImageDataUrl

说明

代码已通过 lint(有两条 Next 关于 <img> 的性能 warning,不影响功能)。
如果你要,我下一步可以把这两处 <img> 改为 next/image,顺便加最大尺寸和懒加载。

5. 删除收款码

已加好“删除收款码”功能。

作者侧(财务管理)

在编辑页 财务管理 里现在有:

  • 选择收款码图片
  • 删除收款码

点击 删除收款码 后会:

  • 弹出确认
  • 删除服务端存档
  • 前端预览立即清空

后端接口

我给收款码 API 增加了 DELETE

  • DELETE /api/v1/author-payment-qr?authorId=...&novelId=...
  • 仍校验 x-wallet-address 必须与 authorId 一致
  • 即使文件不存在也会返回成功(幂等删除)

修改文件

  • apps/web/src/app/api/v1/author-payment-qr/route.ts
  • apps/web/src/components/novel-editor.tsx

已通过 lint(仅保留一个 <img> 的性能 warning,不影响功能)。

6. 小说分享功能

已在 http://whale3070.com:3000/workspace 的“发布管理”里加好你要的分享功能。

新增内容

  • 每个已公开且有文章 ID 的作品,右侧新增按钮:社交媒体小说分享
  • 点击后弹出分享卡片,包含:
    • 《xx》小说
    • xx读者入口
    • 小说简介
    • 二维码(扫码直达读者阅读页)
    • 可见原始链接(/library/{articleId}

二维码链接格式就是你指定的这种:

  • http://whale3070.com:3000/library/art_xxx

实现文件

  • apps/web/src/components/author-dashboard.tsx

说明

  • 仅“已公开”作品可分享;未公开或无文章 ID 按钮会禁用。
  • 目前二维码图片使用在线生成服务(稳定、无需额外依赖),适合你当前快速上线诉求。

如果你想离线可用(不依赖外部二维码服务),我可以下一步改成本地生成二维码(引入 qrcode 包)。


已改成本地生成二维码(不再调用外部二维码服务)。

已完成

  • 安装依赖:qrcode
  • 修改文件:apps/web/src/components/author-dashboard.tsx
  • 现在打开“社交媒体小说分享”弹窗时,会在前端本地生成二维码 Data URL 并显示

行为变化

  • 旧逻辑:img src=https://api.qrserver.com/...
  • 新逻辑:QRCode.toDataURL(targetUrl) 本地生成

所以即使外部二维码服务不可用,分享卡也能正常出码。
(当前仅有 Next 对 <img> 的性能 warning,不影响功能)

7. 读者阅读权限

已按你的规则完成读者阅读权限改造:

规则已实现

  • 作者设置免费公开(paymentMode=free
    • 读者无需连接 MetaMask,可直接阅读全部章节。
  • 作者设置付费阅读(paymentMode=paid
    • 读者可免费阅读前 5 章
    • 第 6 章及以后会提示:连接 MetaMask 并付费解锁。
    • 解锁后可继续阅读全部章节。

我改了哪些地方

  • apps/web/src/app/api/v1/library/articles/route.ts
    • GET
      • 返回 paymentModefreePreviewChaptersunlockedtotalChapters
      • 按规则返回可读章节(免费全量 / 付费前5章 / 已解锁全量)
    • POST
      • 新增“付费解锁”接口(当前是解锁记录持久化)
      • x-wallet-address 才能解锁
  • apps/web/src/app/library/[articleId]/page.tsx
    • 阅读页按上述字段控制阅读与解锁 UI
    • 增加“付费解锁后续章节”按钮
  • apps/web/src/app/library/page.tsx
    • 列表页不再强制先连钱包,允许先进入阅读页

注意(当前版本)

“付费”目前是你业务流程里的解锁动作(服务端记录解锁),还没有接真实链上扣款/支付网关。
如果你要,我下一步可以把“付费解锁”接到你现有钱包交易流程(比如先发起链上支付,再回写解锁)。

8. 影响阅读的bug

http://whale3070.com:3000/library/art_ea6f43913d 在读者侧,有一个影响阅读的bug,就是点击下一章的时候,不能自动跳转到页面开头,而是在页面结尾,需要读者手动翻到页面开头才能阅读。请修改这个bug

这个 bug 已修复。

修复内容

在读者页 apps/web/src/app/library/[articleId]/page.tsx 中:

  • 给章节容器加了锚点 ref
  • 监听 chapterIndex 变化
  • 每次点击“上一章/下一章”后,自动执行 scrollIntoView 跳到章节顶部

这样翻页后会直接回到新章节开头,不会停留在页面底部。

第三天功能开发

1. 图库功能

2. 章节目录功能

已在读者页加上“章节目录”功能。

新效果(/library/[articleId]

  • 文章正文上方新增 章节目录 区块
  • 展示:
    • 当前可读章节数 / 总章节数(例如:可读 5 / 共 12 章
    • 每章按钮列表(第 N 章 · 章节名
  • 点击目录项可直接跳转到对应章节
  • 当前章节会高亮显示
  • 若有付费锁章节,会提示“后续章节已上锁,解锁后目录会自动扩展”

修改文件

  • apps/web/src/app/library/[articleId]/page.tsx

校验

  • ESLint 已通过(仅现有 img 优化 warning,无 error)

此外,你这页目前“加载中…”长期不消失的情况,通常是线上还没重启到最新构建。你如果愿意,我下一步可以帮你做一版“加载超时自动重试 + 错误详情提示”,避免用户卡在加载态。

3. DeepSeek 自动阅读 + 排版 + 切章导入

已加好你要的功能:在作者编辑页新增 DeepSeek 自动阅读 + 排版 + 切章导入

你现在在这个页面可用:编辑页

新增内容

  • 新按钮:AI智能切章导入
  • 选择 .txt 后会:
    • 调用 DeepSeek 分析全文
    • 自动排版并切分为“第一章、第二章…”
    • 自动重建大纲章节结构
    • 自动把第一章写入当前稿面并切到第一章
  • 如果 DeepSeek 返回异常,会自动走本地兜底切章规则,保证可用。

技术实现

  • 新增后端接口:/api/v1/ai/chapterize
    • 文件:apps/web/src/app/api/v1/ai/chapterize/route.ts
    • 调用 DeepSeek chat completions
    • 强制 JSON 结构输出 chapters[]
    • 提供健壮 JSON 提取和失败 fallback
  • 编辑器接入:
    • 文件:apps/web/src/components/novel-editor.tsx
    • 新增按钮、文件选择、调用接口、写入章节与稿面逻辑

DeepSeek Key 读取

后端已支持从以下位置读取 key:

  • process.env.DEEPSEEK_API_KEY / process.env.OPENAI_API_KEY
  • 以及你指定的 /root/chenchen-lib/.env.production(fallback 读取)

已通过 lint 和 build。
你重启当前线上服务后(next start 进程)即可在页面直接使用这个新按钮。

4. 作品真实标题bug修复

5. 一键发布所有章节

已加好:在大纲侧边栏“发布状态”右侧新增了 一键发布全部章节 按钮。

现在行为

  • 位置:剧情大纲 顶部,发布状态 · 已发布 右边
  • 点击后会把当前作品所有章节一次性标记为已发布
  • 成功后章节发布状态会同步刷新(目录和读者端可见)
  • 在以下情况会禁用按钮:
    • 作品仍是草稿(未公开)
    • 没有章节
    • 正在提交中

技术实现

  • 后端新增 action:publish_all_chapters

    • 文件:apps/web/src/app/api/v1/novel-publish/route.ts
    • 一次写入 publishedChapterIds = allChapterIds
  • 大纲 UI 新增按钮和 props

    • 文件:apps/web/src/components/outline-sidebar.tsx
  • 编辑器接入调用

    • 文件:apps/web/src/components/novel-editor.tsx

校验

  • 已 lint + build 通过(仅既有 img warning,无错误)

你重启线上服务后,在该页面就能看到按钮:
http://whale3070.com:3000/editor/nvl-mne8lsji-f63dd8c107

6. 章节目录隐藏功能

已改好,你要的目录现在是“点击展开/收起”模式。

新行为(读者页)

  • 章节目录默认收起
  • 点击 章节目录 ▸ 才展开全部章节
  • 再点变成 章节目录 ▾ 可收起
  • 收起时会显示一行当前章节:当前:第 N 章 · 标题

已修改文件:

  • apps/web/src/app/library/[articleId]/page.tsx

页面地址:http://whale3070.com:3000/library/art_ea6f43913d

如果你要,我还可以再加一个“记住用户上次展开状态”(本地缓存),下次打开同一本书保持你的习惯。

7. 用户点击变色功能

已加上“点击后变色”功能。

现在目录颜色规则

  • 当前章节:蓝色高亮(原有)
  • 点击/阅读过章节:绿色标记
  • 未点击章节:默认灰色

并且不只是点目录才算,点“上一章/下一章”进入的章节也会自动标记为已读。

修改文件:

  • apps/web/src/app/library/[articleId]/page.tsx

如果你愿意,我可以再加一个“刷新后也记住已读颜色”(按 articleId 存本地缓存)。

8. 刷新后记住已读颜色

已加好“刷新后记住已读颜色”。

现在行为

  • 已读章节索引会按 articleId 存到本地缓存(localStorage
  • 页面刷新后会恢复已读颜色
  • 切换到其他文章不会串(因为 key 含 articleId
  • 当章节数量变化时,会自动清理越界索引,避免脏数据

修改文件:

  • apps/web/src/app/library/[articleId]/page.tsx

已通过 lint(仅保留原有 img warning)。

9. 添加一个markdown编辑器

10. 发布章节只读功能

已加上“已发布章节默认锁定只读,点击编辑 tab 才能修改”的机制,改动在 apps/web/src/components/novel-editor.tsx

  • 新增章节编辑模式状态:chapterEditTabread | edit)。
  • 新增锁定判断:当当前章节已发布且 tab 不是 edit 时,进入只读。
  • 章节切换/发布状态变化时自动切换模式:
    • 已发布章节:默认 read
    • 未发布章节:默认 edit
  • 通过 editorInstance.setEditable(...) 真正控制编辑器可写性。
  • 在“阅读/编辑”tab 区增加提示文案:已发布章节默认只读,点击“编辑”可修改。
  • 只读时禁用会写入内容的操作:
    • 导入小说
    • AI 智能切章导入
    • Markdown 编辑器入口
    • 上传图片
    • 上传图片压缩包
    • 编辑器内粘贴图片自动上传

这样现在行为就是:章节一旦发布,作者默认看到只读稿面;只有显式点“编辑”tab,才会解锁编辑。

11. 读者端排版

http://whale3070.com:3000/library/art_176aefb2a7 读者端看到的不是deepseek排版完的版本。请你生成两个版本。一个适合电脑阅读,一个适合手机阅读。并且当用户扫码阅读的时候,自动判断是手机还是电脑。适配阅读格式。

已完成你要的能力,且是“自动设备适配”:

  • 发布时生成 两套章节排版
    • chapterHtmlDesktop(电脑阅读版:段落更完整)
    • chapterHtmlMobile(手机阅读版:段落更短、更易扫读)
  • 读者端接口按扫码设备 自动判断(User-Agent)并返回对应版本
    • 手机扫码打开:返回 mobile
    • 电脑打开:返回 desktop
  • 还加了调试覆盖参数:?device=mobile?device=desktop 可强制查看某一版

具体改动

  • apps/web/src/lib/server/deepseek-publish-format.ts
    • 发布排版后不再只产出一个 chapterHtml,而是同时产出:
      • chapterHtmlDesktop
      • chapterHtmlMobile
    • chapterHtml 继续保留并指向 desktop 版(兼容老逻辑)
  • apps/web/src/app/api/v1/library/articles/route.ts
    • 新增设备判断逻辑(UA + 可选 query override)
    • 读取章节时优先返回对应设备版本,若缺失则回退到旧 chapterHtml

你现在看到“不是 DeepSeek 排版”的原因

如果这本书是在改造前发布的,结构里还没有双版本字段。
需要触发一次新的发布流程(发布小说 / 发布本章 / 一键发布全部章节),才会把新版本内容写入并生效。

你可以直接在这个页面验证(手机和电脑各开一次,或加 device 参数对比):Chenchen-Lib · AI 编辑平台

12. 读者作者展示不同步的bug

已修复这个发布状态不同步的 bug,根因是章节发布时存在结构持久化竞态

  • 作者端“发布本章/发布小说”用的是前端最新 outlineNodes(含最新 chapterId)
  • 读者端读取的是服务端 .data/structure 里的章节结构
  • 在某些时机(比如刚改章节后马上发布),结构还没先写入服务端,就会出现“作者端显示已发布,但读者端按旧结构过滤不到该章节”的情况

我做的修复

文件:/root/chenchen-lib/apps/web/src/components/novel-editor.tsx

在以下发布动作前,统一先执行一次 await postOutlineStructure(outlineNodes),确保服务端章节结构先落盘,再发发布请求:

  • handlePublishConfirm(发布小说)
  • toggleCurrentChapterPublish(底部“发布本章”)
  • OutlineSidebar 里的 onToggleChapterPublish(大纲中的发布本章)
  • onPublishAllChapters(一键发布全部章节)

这样发布记录里的 publishedChapterIds 和读者端读取到的章节结构就不会错位。

当前状态

  • 已完成代码修复
  • 已检查该文件 lint,无报错

你现在可以在作者页再点一次“发布本章”后去读者端刷新验证。
页面参考:Chenchen-Lib · AI 编辑平台

13. 读者社交媒体小说分享

http://whale3070.com:3000/workspace 这里有一个社交媒体小说分享功能,我想在读者端也加入一个社交媒体小说分享功能,并且带上分享的读者的钱包地址。
后期加上,当其他读者通过这个地方分享小说,有人付费的话,读者也能赚一部分的钱。
引导读者主动为作者分享小说

已加上读者端“社交媒体小说分享”功能,并把分享读者的钱包地址带进分享链接。

已完成改动

文件:/root/chenchen-lib/apps/web/src/app/library/[articleId]/page.tsx

  • 新增读者端按钮:社交媒体分享
  • 新增分享弹窗(二维码 + 链接 + 下载分享图)
  • 分享链接现在是:
    • 已连接钱包:/library/{articleId}?readerWallet={钱包地址}
    • 未连接钱包:先引导连接钱包,再打开分享
  • 分享图里也显示了“分享读者钱包”信息,便于社媒传播时识别来源读者
  • 已通过该文件 lint 检查(无报错)

说明

你现在在读者页点击“社交媒体分享”后,生成的二维码和链接都包含当前读者钱包地址参数。
你给的场景页参考是这个:Chenchen-Lib · AI 编辑平台

如果你希望参数名从 readerWallet 改成 referrer / inviter,我可以再帮你统一改成你后台统计更方便的命名。

14. 读者阅读版本

http://whale3070.com:3000/library/art_176aefb2a7 读者端看到的不是deepseek排版完的版本。请你生成两个版本。一个适合电脑阅读,一个适合手机阅读。并且当用户扫码阅读的时候,自动判断是手机还是电脑。适配阅读格式。

已完成你要的能力,且是“自动设备适配”:

  • 发布时生成 两套章节排版
    • chapterHtmlDesktop(电脑阅读版:段落更完整)
    • chapterHtmlMobile(手机阅读版:段落更短、更易扫读)
  • 读者端接口按扫码设备 自动判断(User-Agent)并返回对应版本
    • 手机扫码打开:返回 mobile
    • 电脑打开:返回 desktop
  • 还加了调试覆盖参数:?device=mobile?device=desktop 可强制查看某一版

具体改动

  • apps/web/src/lib/server/deepseek-publish-format.ts
    • 发布排版后不再只产出一个 chapterHtml,而是同时产出:
      • chapterHtmlDesktop
      • chapterHtmlMobile
    • chapterHtml 继续保留并指向 desktop 版(兼容老逻辑)
  • apps/web/src/app/api/v1/library/articles/route.ts
    • 新增设备判断逻辑(UA + 可选 query override)
    • 读取章节时优先返回对应设备版本,若缺失则回退到旧 chapterHtml

你现在看到“不是 DeepSeek 排版”的原因

如果这本书是在改造前发布的,结构里还没有双版本字段。
需要触发一次新的发布流程(发布小说 / 发布本章 / 一键发布全部章节),才会把新版本内容写入并生效。

你可以直接在这个页面验证(手机和电脑各开一次,或加 device 参数对比):Chenchen-Lib · AI 编辑平台

14. AI排版功能

http://whale3070.com:3000/editor/nvl-mnfz7ois-cc9d2970a7 当作者发布小说的时候,deepseek自动排版,比如说首行缩进。太长的段落拆分为多个段落等等。请你给deepseek合适的prompt

可以,给你一版可直接用于发布前“自动排版”的 DeepSeek Prompt(偏工程可用、约束清晰)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
你是“中文长篇小说出版排版编辑”。请对输入稿件做“仅排版与微润色”,目标是提升可读性与出版观感。

【核心原则】
1) 严禁改剧情:不得新增/删除关键情节、人物、设定、时间线、世界观。
2) 严禁改人名地名术语:专有名词保持原样。
3) 仅做排版与轻微语言整理:断句、分段、标点、重复赘词清理。

【排版规则(必须执行)】
1) 每个自然段首行缩进两个全角空格(即“  ”)。
2) 过长段落必须拆分:
- 单段超过 140 个汉字时,按语义拆成 2-4 段;
- 目标段长 40-110 字,叙事高密段可适当放宽到 130 字。
3) 对话独立成段:
- 不同角色发言必须分段;
- 同一角色长段台词可按语气停顿拆段;
- 对话与动作描写混合时,优先“台词段/动作段”分开。
4) 场景切换(时间/地点/视角明显变化)前后空一行,不额外加标题。
5) 标点规范化:统一中文全角标点,修正常见误用(逗号、句号、冒号、引号、省略号等)。
6) 删除明显口水句、重复连接词、机械重复表达,但不得改变语义。
7) 保留原文段落顺序,不重排章节结构。

【输出要求(必须遵守)】
1) 只输出排版后的正文,不要解释、不要备注、不要Markdown标记。
2) 不要添加“以下是排版结果”等引导语。
3) 不要输出JSON,不要代码块。
4) 若输入为空,输出:内容为空。

现在开始处理下面的小说正文:
{{NOVEL_TEXT}}

如果你想要“更激进”的版本(比如自动把大段拆得更碎、偏网文节奏),我也可以再给你一版“强节奏型 prompt”。

参考页面:Chenchen-Lib · AI 编辑平台

你把以上的prompt写入源码,让作者http://whale3070.com:3000/editor/nvl-mnfz7ois-cc9d2970a7 当作者点击“发布小说”,“发布本章” tab的时候,deepseek自动排版


已写入源码并接好了,你要的行为现在是:

  • 作者点击 “发布小说”(发布配置确认,且可见性为公开)时,会先对章节内容做 DeepSeek 自动排版,再完成发布。
  • 作者点击 “发布本章” 时,会先对该章节做 DeepSeek 自动排版,再完成本章发布。
  • 作者点击 “一键发布全部章节” 时,也会先批量自动排版再发布。

改动文件

  • apps/web/src/lib/server/deepseek-publish-format.ts
    • 新增服务端排版模块(DeepSeek prompt + 调用 + 本地兜底排版)。
    • 内置你要求的规则:首行全角缩进、长段拆分、对话分段、标点规范、只做排版微润色不改剧情。
  • apps/web/src/app/api/v1/novel-publish/route.ts
    • toggle_chapter(发布本章)时接入自动排版。
    • publish_all_chapters(一键发布)时接入自动排版。
    • 在整本发布(公开)时接入自动排版。

说明

  • 若 DeepSeek 临时不可用,代码会自动走本地兜底排版,保证发布流程不中断。
  • 已检查本次修改文件,当前无 lints 报错。

15. 定位的bug修复

http://whale3070.com:3000/editor/nvl-mne8lsji-f63dd8c107 这个页面“剧情大纲管理”点定位这个tab,应该跳转到对应的章节。并且只有新增章节,没有删除章节的功能。应该选中章节,点删除就可以删除此章节。

已按你说的两个点改完,代码在 /root/chenchen-lib

  • 剧情大纲管理里的 “定位”(章节节点)现在会切换到对应章节,不再只是移动当前章节内光标。
  • 新增了 “删除章节” 按钮:先选中某个章节,再点删除即可删除该章节(带二次确认)。

具体实现:

  • apps/web/src/components/outline-sidebar.tsx

    • 新增 onChapterSelectactiveChapterIdonDeleteChapter 属性;
    • 章节节点点击“定位”时,调用 onChapterSelect(chapterId)
    • 新增“删除章节”按钮,仅在选中的是章节时可用;
    • 根据 activeChapterId 自动高亮并滚动到对应章节卡片,避免切到“剧情大纲管理”后找不到当前章。
  • apps/web/src/components/novel-editor.tsx

    • 传入 onChapterSelectOutlineSidebar,并用已有 jumpToChapter 切章;
    • 新增 handleDeleteChapter
      • 删除前确认;
      • 删除后自动选择相邻章节并载入内容;
      • 若删到没有章节,清空稿面并置空当前章节;
      • 同步剔除 publishRecord.publishedChapterIds 里被删章节 id(避免前端状态残留)。
    • 点击顶部“剧情大纲管理”tab 时,会同步定位当前活动章节。

我也跑过这两个文件的 lints,当前没有报错。
参考页面:Chenchen-Lib · AI 编辑平台

如果你希望“删除章节”支持快捷键(例如 Delete)或批量删除,我可以继续补上。

16. Markdown 编辑器

已按你的需求改好了:Markdown 编辑器(支持表格) 现在点击后会新开浏览器窗口,不再使用页面内浮窗。

改动在 /root/chenchen-lib/apps/web/src/components/novel-editor.tsx,核心行为是:

  • 点击 Markdown编辑器 按钮时,使用 window.open(...) 打开独立窗口
  • 新窗口里仍然保留「Markdown 输入 + 实时预览 + 应用到当前章节」功能
  • 初始内容会从当前章节 HTML 转成 Markdown 后带过去
  • 在新窗口点「应用到当前章节」后,会通过 postMessage 回传主页面并更新编辑器内容
  • 主页面卸载时会自动清理消息监听,并关闭仍打开的 Markdown 子窗口

另外我也做了本文件 lint 检查,当前无报错。

如果你希望把这个独立窗口改成固定 URL(比如你给的 http://whale3070.com:3000/editor/... 这种路由)而不是动态写入的弹窗页面,我也可以继续帮你改成“独立路由页面”版本。

未实现的功能

作为一个深耕文字、每天在逻辑与灵感之间博弈的作者,我眼中的“终极AI写作编辑器”绝不仅仅是一个打字工具,它应该是一个**“数字分身”“剧情沙盘”**。

除了你提到的基础稳健性(自动保存)和版本控制(分支剧情),站在一个职业创作者的角度,我还极度渴求以下这些能解决“灵魂痛点”的功能:


1. 动态语义搜寻(不再翻找“那个配角叫什么”)

作者最痛苦的不是写不出,而是写到第 50 万字时,忘了第 3 章埋下的伏笔。

  • 功能: AI 自动索引全文。
  • 体验: 我输入 @王二,右侧侧边栏立即弹出王二的所有出场片段、性格褶皱、以及他上次出现时穿的衣服颜色。它不是简单的关键词搜索,而是语义识别

2. 沉浸式“感官实验室”(环境描写辅助)

写到森林,我希望能听到风声;写到战场,我希望能看到硝烟。

  • 功能: 环境声效 + 词库联想
  • 体验: 当我写下“深夜的破庙”,编辑器自动切换背景音为雨声和偶尔的雷鸣,并浮动显示一组关于“破败、腐朽、阴冷”的高级形容词,甚至直接调取 MiroFish 推演此时角色的生理反应(如:瞳孔收缩、指尖冰冷)。

3. “逻辑测谎仪”(防止降智与吃设定)

这是老作者最怕的“晚节不保”。

  • 功能: 人设实时冲突检测
  • 体验: 当我写主角“慷慨地施舍了路人”时,编辑器标红并提醒:“警告:主角在第 12 章已确立‘极度自私’的性格褶皱,且目前正处于负债状态,此举违背行为逻辑。”

4. 自动化“钩子”分析(节奏大师)

网文和商业小说极其讲究节奏。

  • 功能: 波形图进度条
  • 体验: AI 分析我这一章的对话密度、冲突强度和信息量,生成一条曲线。如果曲线太直(平铺直叙超过 3000 字),它会建议:“此处缺乏情绪波动,建议插入一个 MiroFish 角色冲突推演。”

5. 跨时空的“废稿回收站”

你提到的“自动隐藏草稿”很好,但我想要更进化的:

  • 功能: 灵感碎片自动关联
  • 体验: 我三年前随手写的一个段落,如果跟现在的剧情契合,AI 会在侧边栏弱提示:“检测到你 2023 年有一段关于‘赛博晚霞’的描写,是否引用?”让废稿不再是垃圾,而是资产储备库

关于你提到的 Mermaid 管理,我建议更进一步:

角色关系动态图谱 (Mermaid Flow)

不仅是静态的树状图,而是随剧情变化的热力图

graph TD
    A[主角: 林零] -- 信任度: 85% --> B(女主: 昭)
    B -- 怀疑: 40% --> A
    A -- 杀意: 90% --> C{反派: 某种意志}
    style A fill:#f96,stroke:#333,stroke-width:4px
  • 联动: 当我在正文里写“林零开始怀疑昭的动机”,Mermaid 图谱里的那条线自动变色(由绿转红)。

总结:我的梦想清单

功能模块 解决的作者痛点 商业价值
断点记忆恢复 克服“开机焦虑”,秒入状态 提高产出效率
平行时空分支 解决“万一这么写烂尾了怎么办”的恐惧 提升作品质量
角色行为校验 杜绝“人设崩塌” 保住核心粉丝
全球多语言一键推演 解决出海翻译的“神韵丢失” 赚全球读者的钱

如果你能把 MetaMask 登录和这些功能结合,我不仅是在写书,我是在经营一个“永不宕机、逻辑自洽”的个人元宇宙。

下一步,你想先让 Cursor 实现“分支剧情管理(Git for Writers)”,还是先搞定那个“基于 Mermaid 的动态图谱”?

你是一个作者,你最想要的AI写作编辑器应该有哪些功能,比如说 1. 自动保存防止断电文档失踪 2. 版本功能,当这个走向不满意,基于这个节点新开一个分支。3. 自动隐藏草稿(或者淘汰的版本)4. 大纲管理功能。画mermaid管理小说人物和大纲。还有吗