本地电子书阅读器(Web 应用)。核心闭环:导入一本书 → 舒服地读完 → 下次打开接着读。
产品设计见 docs/产品设计文档.md,技术方案见 docs/技术方案.md,迭代规划见 docs/功能迭代计划.md。
- 导入 TXT / EPUB / Markdown / HTML / PDF(多选批量导入,拖拽即可)
- TXT 自动识别 UTF-8 / GB18030(含 GBK)/ Big5 / UTF-16,可手动指定编码
- EPUB 解析真实章节与目录、提取封面与作者(零依赖自研解析,见 V5.0 方案)
- PDF 原版阅读:导入时连原文件一起保存,阅读页默认显示 PDF 原来的样子(版式 / 图片 / 表格都在),可一键切到文字视图做搜索、划线、朗读(见 V6.2 方案)
- 书库:每本书的封面就是它的第一页(PDF 渲染首页 / 文本排版首段 / EPUB 自带封面),另有书名、阅读进度、最后阅读时间、搜索/排序/重命名/批量删除、阅读时长统计(今日/本周/累计)
- 阅读页:分页 / 连续滚动两种模式;按钮 / 键盘 / 点按区域翻页;自动翻页;TTS 朗读(读完自动翻页)
- 排版:字号、行距、段距、页边距、首行缩进、两端对齐、字体预设与自定义字体
- 主题:日间 / 护眼 / 夜间
- 导航:章节目录(内置 + 自定义正则)、书签、全文搜索(页面内高亮)、划线笔记(可导出 Markdown,见 V4.0 方案)
- 划词翻译(V6.4):选中英文即出中文(单词给义项 + 所在整句对照),可一键存为想法;目标语言可设(见 V6.4 方案)
- 译文浮卡(V6.5):鼠标移到别处停下就自动收起,不用再点 ✕;不动鼠标读译文时不会消失(见 V6.5 方案)
- 生词本(V6.6):查词浮卡一键「★ 生词」收藏,自动附带所在整句语境与出处;阅读菜单独立「生词」页签支持回看出处、移出生词、导出 Markdown / Anki CSV(见 V6.6 方案)
- 学习资料中心(V6.7):按书籍 / 章节整理批注、笔记和生词,支持全文搜索、筛选、Markdown / CSV 导出、回到原文及本地间隔复习
- 科学复习(V6.8):艾宾浩斯遗忘曲线排期(1/2/4/7/15/30 天递进、毕业进 90 天维护、遗忘回退不归零)、生词卡记忆强度百分比与复习统计条(今日到期 / 学习中 / 已掌握 / 连续天数)、生词卡与翻译浮卡一键发音、TTS 朗读语言跟随书籍 + 语速档位(见 V6.8 方案)
- 进度自动保存,重新打开精确续读;进度条拖动跳转任意位置
- PWA 可安装,离线可读;备份导出 / 导入(全量 JSON,含 PDF 原件与生词本)
V6.8 科学记忆与复习 ✅
- 艾宾浩斯遗忘曲线排期:V6.7 的固定间隔升级为经典记忆周期 1 → 2 → 4 → 7 → 15 → 30 天, 六次记住后毕业进入长期记忆(90 天维护间隔); 忘了不再归零 —— 级别回退 2 级(留存是指数衰减不是清零)、明天重新见面。
- 记忆强度展示:生词卡按
R = e^(-t/S)显示"这个词条大概还记得几成"—— 刚复习完 100%,随时间衰减,级别越高衰减越慢。 - 复习统计条:学习资料中心新增"今日到期 / 学习中 / 已掌握 / 连续复习天数"; 今天没复习不断签,断档一天归零重计。
- 生词发音(🔊):生词卡与翻译浮卡均可朗读,中文词
zh-CN、英文词en-US自动判断。 - TTS 语言跟随书籍:英文书用英文语音引擎(EPUB 元信息优先,其余按正文抽样判断); 设置页新增 0.75×~2× 朗读语速档位。
- 数据模型不变(DB v7):复习字段原地升级,V6.7 老数据无需迁移。
完整设计见 docs/V6.8-科学记忆与复习方案.md。
V6.7 学习资料中心与间隔复习 ✅
- 统一整理:书库新增学习资料中心,汇集所有书籍的划线批注、笔记与生词,按书籍、章节和资料类型筛选。
- 搜索与导出:可搜索原文、笔记、生词、释义和语境;当前筛选结果支持导出 Markdown 或 CSV。
- 回到原文:每条资料保留书籍字符偏移,可从资料中心直接跳回阅读位置。
- 本地间隔复习:生词卡间隔复习;遗忘时安排次日重试,复习状态保存在 IndexedDB。
- 跨书出处:同一生词仍为一张卡,保留各书中的出现位置与语境。
V6.6 生词本(收集·回看·导出) ✅
- 查完词不再"阅后即丢":翻译浮卡提供「★ 生词」按钮,点击立即收录,并在浮卡展示
★ 生词徽标。 - 语境与出处同存:不仅存词和释义,还自动带上**所在整句(语境)**与字符偏移;重复查词自动累加查词次数(
lookups),并刷新为最新阅读语境。 - 阅读菜单「生词」页签:按最新收藏时间倒序浏览当前书的生词;点击条目或「回看」即可平滑跳转回阅读现场;支持随时单条移出生词。
- 导出双通道:支持一键导出 Markdown 笔记(人读)与带有 UTF-8 BOM 的 Anki 兼容 CSV(机器复习)。
- IndexedDB 升级至 V7:新增
vocabstore;删书时级联清理对应生词,全量备份与恢复无缝支持。
完整设计与对标见 docs/V6.6-生词本方案.md。
V6.5 译文浮卡自动收起 ✅
- 查完一个词继续读时,把鼠标移到别的段落停下,译文卡自动消失 —— 不必抬手点 ✕。
- 判定由三条件共同决定(
core/dismiss.ts,纯函数可测):浮卡出现满 600ms、 指针真的移动过(≥12px)、停在卡外达 500ms;指针停在卡内或指针没动过都不会收起。 - 点击正文 / 滚动 / 翻页 / 拖进度条 / 开菜单 / 切换原版·文字视图 → 同样立即收起。
完整设计见 docs/V6.5-翻译浮卡自动消失方案.md。
V6.4 划词翻译 ✅
- 选中文字 → 浮动工具栏多一个「🌐 译」→ 浮卡出译文;英文书直接译成中文, 中文内容也能译成英文(目标语言可固定,默认自动判断)。
- 单词不糊弄:动名词/分词(beginning/running)机器翻译只给词源义,
本地表补上常见义;多义词(bank)保留接口结果并附「也作:岸」;
再补一次所在整句的翻译做语境对照 —— 英文书里
beginning在上下文里是什么意思,一眼就懂。 - 长段落自动按句切分(免费接口单次 500 字符上限);同一段重复选中走缓存不重复请求; 接口挂了只影响这张浮卡,阅读 / 批注 / 续读一切照旧。
- 「存为想法」把译文写进批注 note,随 Markdown 一起导出。
- 实测样本:Gutenberg 公版《Alice's Adventures in Wonderland》(英文,14.8 万字符,随仓入库)。
完整设计、接口选型实测与取舍见 docs/V6.4-划词翻译方案.md。
V6.3 书架封面(每本书的第一页) ✅
- 封面 = 打开这本书看到的第一眼:PDF 用原件渲染第 1 页,EPUB 用书内自带封面, TXT / MD / HTML 把正文首段排版成书页(与阅读页同一套字体)。
- 导入时顺手生成;老书进书库后自动补齐(一本本串行,生成一张显示一张)。
- 任何失败都不影响导入:退回渐变色块封面,绝不挡住书。
- 封面 400×560(5:7,与卡片一致)、单张 7–60 KB。
完整设计见 docs/V6.3-书架封面方案.md。
V6.2 PDF 原版阅读 ✅
- 导入 PDF 时把原文件整份存进
pdfFiles(DB v6),不再只留抽出的文字; 一本 3 页的 PDF 导入仍在秒级完成(导入期不再需要 canvas)。 - 阅读页默认显示原版页面:pdf.js 按当前显示尺寸实时渲染当前页, 版式 / 图片 / 表格 / 公式原样呈现;×4 放大也是原生清晰度(不是拉伸位图)。
- 底栏「原版 / 文字」一键切换:搜索、划线、批注、朗读在文字视图照常可用, 切换时按字符偏移带过位置,进度条 / 书签 / 目录跳转两视图通用。
- 纯扫描版 PDF 只有原版视图(没有文字层),并明确提示文字功能不可用; V6.1 存下的按页位图仍兼容可读。
- IndexedDB 升到 V6(新增
pdfFiles);备份导出连原件一起带走。
完整设计见 docs/V6.2-PDF原版阅读方案.md。
历史版本:
| 版本 | 主题 | 标记 |
|---|---|---|
| v6.8.0 | 科学记忆与复习(艾宾浩斯周期 + 发音 + 统计 + TTS 语言跟随) | ✅ 当前 |
| v6.7.0 | 学习资料中心(跨书整理 + 搜索导出 + 间隔复习) | ✅ |
| v6.6.0 | 生词本(查词收集 + 整句语境 + 回看与导出) | ✅ |
| v6.5.0 | 译文浮卡自动收起(移开即消失) | ✅ |
| v6.4.0 | 划词翻译(英文→中文,含单词语境) | ✅ |
| v6.3.0 | 书架封面(每本书的第一页) | ✅ |
| v6.2.0 | PDF 原版阅读(原文件入库 + 按需渲染 + 双视图) | ✅ |
| v6.1.0 | 扫描版 PDF 按页位图阅读 | ✅ |
| v6.0.0 | PDF 支持(pdf.js 按需加载) | ✅ |
| v5.0.0 | 多格式导入(EPUB / MD / HTML + 批量) | ✅ |
| v4.0.0 | 批注与笔记体系(6 色 × 4 样式 + 容错锚定) | ✅ |
| v3.0.0 | 划线笔记 MVP + TTS 朗读 | ✅ |
| v2.1.0 | PWA 可安装 + 滚动阅读 | ✅ |
| v2.0.0 | 书库管理 + 阅读统计 + 备份导出 | ✅ |
| v1.1–v1.3 | 主题 / 章节切分 / 排版净化 | ✅ |
| v1.0 | MVP(导入 → 阅读 → 续读) | ✅ |
需要 Node ≥ 20。
npm install
npm run dev # 开发(http://localhost:5173)
npm run test # Vitest 单元测试(299 例)
npm run build # 产出纯静态文件到 dist/
npm run preview # 本地预览构建产物首次跑 dev / build / test 前,会自动执行 npm run sync:pdfjs 把
node_modules/pdfjs-dist/{cmaps,standard_fonts} 铺到 public/pdfjs/,
保证中文 PDF(Type0 + 预定义 CMap)能在浏览器里被解出文字。
注意:IndexedDB 在
file://协议下不可用,请通过 http(s) / localhost 访问,不要直接双击打开 HTML。
src/
├─ main.tsx / App.tsx # 入口;书库 / 学习资料 / 阅读视图切换;PWA 注册
├─ pages/
│ ├─ LibraryPage.tsx # 书库:导入、列表、管理、备份、统计
│ ├─ StudyMaterialsPage.tsx # 学习资料:跨书筛选、搜索、导出与间隔复习
│ ├─ ReaderPage.tsx # 阅读页:分页/滚动渲染、翻页、划线、TTS
│ └─ ReaderMenu.tsx # 阅读菜单:目录/书签/笔记/搜索/设置
├─ core/ # 纯逻辑层,框架无关、可单测
│ ├─ importers/ # V5.0 多格式导入(zip/epub/markdown/html)+ V6.0 PDF(pdf.js 按需加载)
│ ├─ highlight.ts # V4.0 批注模型与三层锚定
│ ├─ encoding.ts # 编码探测与解码(支持强制指定)
│ ├─ pagination.ts # Measurer 接口 + PageMap 分页引擎
│ ├─ toc.ts # 章节切分(内置 + 自定义正则)
│ ├─ search.ts # 全文搜索
│ ├─ purify.ts # 导入净化(推广行清理)
│ ├─ bookRepository.ts # IndexedDB 读写(含批注、生词及复习状态)
│ ├─ studyMaterials.ts # 学习资料聚合、筛选与 Markdown / CSV 导出
│ ├─ cover.ts # 书架封面:正文摘录/折行 + canvas 绘制
├─ bookCovers.ts # 封面生成编排(PDF 首页 / EPUB 封面 / 文本首段)
├─ pdfNav.ts # PDF 页码 ↔ 字符偏移换算
│ ├─ pdfOriginal.ts # PDF 原版页面按需渲染(清晰度/内存上限/取消)
│ ├─ scanView.ts # 位图等比显示几何(缩放不变形)
├─ translate.ts # 划词翻译:方向判断/切分/缓存/单词兜底义
├─ dismiss.ts # 浮层"移开即收起"判定(三条件,纯函数)
│ └─ settings.ts # 阅读设置(localStorage + CSS 变量)
└─ styles/theme.css # CSS 变量主题(日间/护眼/夜间)
demo/ 是早期原生 JS 原型归档,仅供对照,不参与构建。
test-fixtures/ 存放 PDF/EPUB 等二进制样本,供 *.test.ts 端到端断言用。
- docs/产品设计文档.md — 产品愿景、用户、闭环、非目标
- docs/技术方案.md — core 纯逻辑层 + PageMap 字符偏移坐标系 + CSS 变量主题
- docs/功能迭代计划.md — V1.x → V6.7 的演进路线与验收清单
- docs/V4.0-批注与笔记方案.md — 6 色 × 4 样式 + 容错锚定 + Obsidian 友好导出
- docs/V5.0-多格式导入方案.md — EPUB/MD/HTML 设计选型与"PDF 不做"的原始论证
- docs/V6.0-PDF支持方案.md — 上述翻案:按需加载 / 扫描版识别 / 加密提示
- docs/V6.1-修复记录.md — PDF 导入失败三连修 + 扫描版位图被进度条遮挡的根因与验证
- docs/V6.2-PDF原版阅读方案.md — 原文件入库 + 读时按需渲染 + 原版/文字双视图
- docs/V6.3-书架封面方案.md — 每本书的第一页当封面:各格式来源、排版规则与实测
- docs/V6.4-划词翻译方案.md — 划词翻译:接口实测选型、单词翻译的坑与对策
- docs/V6.5-翻译浮卡自动消失方案.md — 移开即收起的三条件判定与实测