chenchen-plan
第一天-已实现的功能
1. 前端框架搭建
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 }整表覆盖写入
- GET:按
- 存储位置:与草稿一致,使用
apps/web/.data/personas/{address小写}.json(按钱包隔离的持久化文件;根目录.gitignore已忽略.data/)。
若你后续要换成 PostgreSQL / SQLite,只需在本路由内改读写实现,前端契约可保持不变。
前端
persona-sidebar.tsx:「新增角色」按钮、每条右侧 删除(带stopPropagation,避免误触选中)。persona-factory.ts:createEmptyPersona()生成符合类型的空白卡片。novel-editor.tsx:钱包变更时拉取/回落演示数据;persistPersonas;AI 更新走handlePersonasUpdateFromAi。
部署提示(http://whale3070.com:3000/)
确保运行 next start 的进程对项目目录下的 .data/ 有写权限,且若用容器/无盘实例,需挂 volume,否则重启后 JSON 会丢。
本地已通过 npm run build 与 npm 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 中的编辑器逻辑,实现以下功能:
多维度状态采集:
- 在自动保存 (Auto-save) 时,除了
content,必须捕获:selection: 当前光标的 JSON 位置。last_action_timestamp: 最后一次编辑的时间。viewport_scroll: 当前页面的滚动高度。
- 在自动保存 (Auto-save) 时,除了
后端/本地联动存储:
- 优先存入浏览器的
localStorage(瞬时恢复)。 - 同时防抖 (Debounce 2000ms) 异步同步到后端数据库,关联用户的 MetaMask 钱包地址。
- 优先存入浏览器的
视觉唤醒 (The “Wake-up” UI):
- 当用户重新打开文档且
last_action_timestamp超过 1 小时,在编辑器顶部显示一个极其克制的浮动条:- 文案:“欢迎回来,[作者名]。上次你写到了 [提取当前段落前5个词]…”
- 按钮:“一键入戏” -> 点击后:
editor.commands.focus(selection)并平滑滚动到对应位置。
- 当用户重新打开文档且
6. 卡片式大纲组件
在 apps/web 中创建一个 OutlineSidebar 组件。
- 数据结构参考 shared/types/plot-node.ts,支持卷、章、节的树状展示。
- 每个节点是一个可编辑的卡片,包含标题、简述、标签(如:#高潮 #伏笔)。
- 实现拖拽排序功能,当排序改变时,触发后端 update_structure 接口。
- 点击节点,编辑器自动滚动并定位到正文对应位置。
已交付:OutlineSidebar + 大纲持久化 + 稿面定位
1. 类型(shared/types/plot-node.ts)
PlotNodeKind增加:volume(卷)、chapter(章)、section(节)。PlotNode增加可选字段tags?: string[],用于#高潮/#伏笔这类标签(存字符串,界面展示自动加#)。
2. 工具与演示数据
apps/web/src/lib/plot-outline.ts:扁平列表 ⇄ 树、reorderOutlineFlat(仅允许同一父节点下拖拽排序)、plotKindLabel文案。apps/web/src/lib/demo-outline.ts:示例 卷→章→节,并带range(与 ProseMirrorfrom对齐,便于跳转)。
3. 后端 update-structure
apps/web/src/app/api/v1/update-structure/route.ts- GET
?authorId=&docId=→{ nodes, updatedAt } - POST
{ authorId, docId, nodes }→ 写入.data/structure/{address}_{docId}.json
- GET
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,创建一个极简且具有科技感的进入页面:
- 背景采用深色渐变,中心放置两个并列的大卡片:‘我是作者 (Creator)’ 和 ‘我是读者 (Reader)’。
- 使用 Framer Motion 实现悬停缩放效果。
- 点击‘我是作者’跳转到 /workspace;点击‘我是读者’跳转到 /library(目前先预留)。
- 底部增加‘连接钱包以继续’的 MetaMask 按钮,如果已连接,直接显示钱包地址。
8. 作者管理后台
修改根路由 page.tsx,创建一个极简且具有科技感的进入页面:
- 背景采用深色渐变,中心放置两个并列的大卡片:‘我是作者 (Creator)’ 和 ‘我是读者 (Reader)’。
- 使用 Framer Motion 实现悬停缩放效果。
- 点击‘我是作者’跳转到 /workspace;点击‘我是读者’跳转到 /library(目前先预留)。
- 底部增加‘连接钱包以继续’的 MetaMask 按钮,如果已连接,直接显示钱包地址。
在 /workspace 路径下创建一个作者管理后台。
- 顶部导航:显示‘我的小说’和‘账户设置’。
- 核心操作区:显眼位置放置一个 + 新建小说 的按钮卡片。
- 交互逻辑:点击按钮后,弹出一个 Modal(对话框),要求输入:
• 小说标题 (Title)
• 内容简介 (Description/Preface) - 点击‘确认创建’后,调用后端接口保存数据,并自动跳转到该小说的编辑页面(例如 /editor/[id])。
完善 /workspace 的身份验证逻辑:
检查 useWeb3Auth 状态。如果用户未连接钱包,自动重定向回首页或弹出连接请求。
在‘新建小说’的保存请求中,Header 必须包含 x-wallet-address。
后端识别到地址后,如果该地址名下已有小说,在工作台下方以列表形式展示出来,显示书名、字数和最后修改时间。
发布功能
基于我当前的郴郴文库AI写作编辑器(现有结构:左侧角色设定、中间卷/章/节大纲、右侧角色详情、顶部AI推演),做以下完整升级:
【新增发布按钮】
- 在页面右上角(现有「导出小说」按钮右侧),新增一个高对比度的「发布小说」主按钮
- 按钮样式:深蓝色(#2196f3)背景、白色文字、圆角、hover有放大+加深效果,点击弹出发布配置弹窗
- 按钮文案:「发布小说」,尺寸与「导出小说」一致,视觉层级突出
【发布配置弹窗(核心功能)】
弹窗为居中模态框,深色科技风,包含以下模块:- 🔹 基础信息区(自动填充,可编辑):
- 小说标题:自动读取大纲的卷标题(如「第一卷·匿名信」)
- 小说简介:自动读取卷的简述(如「台谏与枢密院角力下的夜里对谈」)
- 小说标签:自动读取卷的标签(如#政治 #伏笔),支持增删
- 🔹 发布设置区:
- 可见范围选择:「仅自己可见(草稿)」/「公开可见(读者可看)」
- 付费模式选择:「免费阅读」/「付费阅读(0抽成,收益直达作者)」
- 付费金额输入框(仅付费模式显示):支持港币/美元/人民币切换,默认港币
- 更新承诺设置:「无承诺」/「每周X更」(下拉选择1-7更),勾选后自动绑定烂尾退款规则
- 🔹 版权声明区(固定不可修改):
- 「本作品版权100%归作者所有,郴郴文库仅提供技术服务,不抽成、不买断、不干涉创作」
- 🔹 操作按钮:
- 左下角:「取消」(关闭弹窗,不保存)
- 右下角:「确认发布」(点击后执行发布逻辑,关闭弹窗,按钮状态变为「已发布」)
- 🔹 基础信息区(自动填充,可编辑):
【发布后状态同步】
- 发布成功后,「发布小说」按钮变为「已发布」(灰色背景,点击可查看发布状态/修改设置)
- 新增「发布状态」标签,在大纲区顶部显示:「草稿」/「已公开」/「付费中」
- 支持「撤回发布」功能(仅草稿/已发布状态可操作,撤回后恢复为草稿)
【交互与样式要求】
- 弹窗有遮罩层,点击遮罩可关闭,动画平滑淡入淡出
- 所有输入框/选择框有hover、聚焦高亮效果,符合现有UI风格
- 完全兼容现有代码结构,不破坏角色设定、大纲、AI推演等原有功能
- 样式统一:主色#0a0e17,高光#4fc3f7,卡片#121a29,与现有设计100%匹配
- 代码添加清晰注释,标注发布模块,便于后续对接后端支付、读者端同步
【额外优化】
- 在作者工作台(新建小说页面)同步新增「发布管理」入口,显示所有小说的发布状态
- 发布按钮在未完成大纲/内容时,可置灰提示「请完成小说内容后再发布」
第二天功能开发
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.tsxapps/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.tsapps/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.tsGET:- 返回
paymentMode、freePreviewChapters、unlocked、totalChapters - 按规则返回可读章节(免费全量 / 付费前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 通过(仅既有
imgwarning,无错误)
你重启线上服务后,在该页面就能看到按钮:
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。
- 新增章节编辑模式状态:
chapterEditTab(read | 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,而是同时产出:chapterHtmlDesktopchapterHtmlMobile
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,而是同时产出:chapterHtmlDesktopchapterHtmlMobile
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 | |
如果你想要“更激进”的版本(比如自动把大段拆得更碎、偏网文节奏),我也可以再给你一版“强节奏型 prompt”。
你把以上的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:- 新增
onChapterSelect、activeChapterId、onDeleteChapter属性; - 章节节点点击“定位”时,调用
onChapterSelect(chapterId); - 新增“删除章节”按钮,仅在选中的是章节时可用;
- 根据
activeChapterId自动高亮并滚动到对应章节卡片,避免切到“剧情大纲管理”后找不到当前章。
- 新增
在
apps/web/src/components/novel-editor.tsx:- 传入
onChapterSelect给OutlineSidebar,并用已有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管理小说人物和大纲。还有吗