一款基于间隔重复算法的刷题应用,帮助你高效记忆和掌握题目。支持刷题模式(判断题、单选题、多选题、填空题)和记忆模式(题目 / 答案卡片自评)。
应用是一个「空壳」:题库在浏览器里导入和管理,多份题库互相独立,学习进度保存在本地 localStorage,不会上传到任何服务器。
- 间隔重复算法:根据答题情况智能安排复习,答错的题目需要更多次正确才能掌握
- 四种题型:支持判断题、单选题、多选题、填空题
- 记忆模式:只有题目和答案的卡片,看题后自评「知道 / 忘记」;「学习新的题目」把新卡片连对几次后转入复习,「复习」按 1 / 2 / 4 / 8… 天的翻倍曲线推进,走完设定的掌握阈值即已掌握
- 多题库管理:导入、重命名、排序、删除多份题库,随时切换
- 全局 + 按题库设置:音效 / 选中自动提交 / 答对自动下一题是全局设置;活动池大小、掌握次数、刷题顺序等跟着题库走(记忆模式也有一套自己的按题库设置)
- 总览:一键浏览答题统计、题目状态与正确答案,按题型分组展示,方便快速过一遍;记忆模式则按「未学习 / 学习中 / 复习中 / 已掌握」查看卡片状态
- 进度持久化与备份:进度存浏览器 localStorage,每份题库独立;可导出 / 导入紧凑进度串,也可整库导出 JSON
- PWA / 移动端友好:可安装到桌面,适配手机
# 安装依赖
pnpm install
# 开发服务器
pnpm dev
# 构建 → dist/index.html + assets
pnpm build
# 预览最近一次构建
pnpm preview
# 类型检查(Svelte-aware)
pnpm check
# 跑测试
pnpm test在 UI 左侧栏点击「导入」按钮,可以从 JSON 文件或剪贴板导入。也可以把 .json 文件直接拖到窗口任意位置松手导入(支持一次拖入多个)。文件不会上传到任何服务器,只存在浏览器 localStorage 中。
如果浏览器存储空间不足,导入会提示配额错误;可以删除不用的题库后重试。
一份题库是一个 JSON 对象(不再支持裸数组):
{
"mode": "quiz",
"title": "……可选的题库标题……",
"state": "……可选的进度备份……",
"questions": [ /* 题目数组,必需 */ ]
}| 字段 | 类型 | 说明 |
|---|---|---|
questions |
array | 必需,题目数组,见下方题型说明 |
mode |
string | 题库模式,支持 "quiz"(刷题模式)和 "memory"(记忆模式)。强烈建议显式写出:省略时程序按 "quiz" 解析,一份记忆题库如果漏了 mode 会因为题目没有 type 而导入失败 |
title |
string | 可选,题库标题。导入后作为侧边栏里显示的名称;省略时用文件名(文件导入)或「剪贴板题库」(剪贴板导入) |
state |
string | 可选,由本应用导出的进度备份编码。给 LLM 的生成题库 Prompt 不需要输出它 |
让 AI 生成题库时,直接复制侧边栏导入菜单里的 「复制 Prompt」→「生成刷题题库」/「生成记忆题库」,把题目内容附在后面即可。两份 Prompt 都会要求 AI 输出
mode("quiz"或"memory")与questions,并允许它顺手生成一个可选的title,不要输出state。导入后想改名称:刷题模式 / 记忆模式的设置面板第一项就是「修改名称」(改名只影响侧边栏显示,不动题目与进度)。
questions 是一个数组,每个元素是一道题目,支持四种题型。
{
"id": "judgment_1",
"type": "judgment",
"question": "这是一道判断题的题目内容",
"answer": true
}| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | 题目唯一标识,建议格式:judgment_序号 |
type |
string | 固定为 "judgment" |
question |
string | 题目内容 |
answer |
boolean | 正确答案,true 或 false |
{
"id": "single_1",
"type": "single",
"question": "这是一道单选题的题目内容",
"options": [
{ "text": "选项 A" },
{ "text": "选项 B" },
{ "text": "选项 C" },
{ "text": "选项 D" }
],
"answer": [0]
}| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | 题目唯一标识,建议格式:single_序号 |
type |
string | 固定为 "single" |
question |
string | 题目内容,支持换行符 \n |
options |
array | 选项数组,每个选项包含 text 字段 |
answer |
number[] | 正确答案的索引数组(从 0 开始),单选题只有一个元素 |
{
"id": "multiple_1",
"type": "multiple",
"question": "这是一道多选题的题目内容",
"options": [
{ "text": "选项 A" },
{ "text": "选项 B" },
{ "text": "选项 C" },
{ "text": "选项 D" }
],
"answer": [0, 2]
}格式与单选题相同,区别在于 answer 数组可以包含多个索引。
{
"id": "blank_1",
"type": "blank",
"question": "取得进步",
"answer": "make progress"
}| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | 题目唯一标识,建议格式:blank_序号 |
type |
string | 固定为 "blank" |
question |
string | 提示内容(展示给用户) |
answer |
string | string[] | 答案。为 string 时展示单个输入框;为 string[] 时按元素数量展示多个输入框,每空逐一匹配对应答案 |
填空题答案支持以下语法,系统会自动宽松匹配:
| 语法 | 含义 | 示例 |
|---|---|---|
(xxx) |
括号内容可选 | on (an) average → 写不写 an 都算对 |
A/B |
斜杠两侧任选其一 | fall ill/sick → fall ill 或 fall sick 均可 |
(A/B) |
括号内词级替换 | (be/get) used to → be used to 或 get used to |
A=B |
等号两侧任选一套完整答案 | contact/call sb = get in touch with sb → contact sb、call sb 或 get in touch with sb 均可 |
| 全角符号 | 自动转半角 | (an)、/、= 与半角等价 |
匹配时忽略大小写、空格和标点,保留字母、数字和中文进行比对。等号优先级高于斜杠,会先把答案拆成多套完整答案;每套内部仍按斜杠和括号规则匹配。斜杠分支支持共享前缀/后缀,例如 draw/reach/come to a conclusion,输入 draw conclusion 也会被判为正确。
常见占位词(用户可不输入):sb、sth、sb's、one's、oneself、doing、to do。
mode: "memory" 的题库是「问答卡片」:每道题只有题目和答案,没有选项、不判分。使用时先自己回忆,再看答案自评:
- 学习新的题目:从还没学过的卡片里挑一批(数量 = 「目标每轮学习数」,默认 5 道),连续答对设定的次数(默认 3 次,对应设置里的「连续正确次数」)后转入复习;这一轮学满设定的道数就结束,学到一半退出可以接着续学。
- 复习:进入后把「当天到期的 + 上一轮答错还没补完连对的」卡片过一遍,答对一次就进入下一级;答错则掌握阶梯回到第 1 级重新开始,并且这道卡本轮还要再连续答对 N 次(N = 设置里的「连续正确次数」,不可单独设置);只要还在同一天,退出再进来它仍留在本轮里。
卡片上按钮是「知道 / 忘记」:点任意一个都会展示答案;点「知道」后发现其实记错了,还可以再点「记错了」。复习间隔是一条固定的翻倍曲线——第 1 次隔 1 天,第 2 次隔 2 天,第 3 次隔 4 天……(1 / 2 / 4 / 8 / 16…)。走完「掌握阈值」次复习(默认 7 次,可在记忆模式设置里调整)就算已掌握,之后不再出现。
卡片状态分四种:未学习 / 学习中 / 复习中 / 已掌握,总览里可以按状态查看和搜索。
{
"mode": "memory",
"questions": [
{ "id": "m1", "question": "取得进步", "answer": "make progress" }
]
}| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | 卡片唯一标识,必须唯一 |
question |
string | 正面(看到的一面),可以是一个词、一句话或一个问题 |
answer |
string | 背面(回忆起来的一面),必须是字符串 |
让 AI 生成记忆题库时,用侧边栏导入菜单里的「复制 Prompt → 生成记忆题库」,把内容附在后面即可。生成的 JSON 最外层应带
"mode": "memory"。
把任一文件拖进窗口(或从侧边栏导入)即可直接看到效果。
- ID 必须唯一:每道题目的
id必须不同,否则会导致进度记录混乱 - 索引从 0 开始:
answer中的索引对应options数组的位置,第一个选项是 0 - JSON 格式要求:确保 JSON 格式正确,最外层必须是
{ "questions": [...] }对象 - 换行使用
\n:题目内容中如需换行,使用\n转义字符
设置分两层,分布在两个入口:
- 全局设置(跨题库共享):音效、选中答案自动提交、答对自动下一题。 入口在侧边栏左下角(滑块图标)。没有题库时也能修改。
- 当前题库设置(跟着题库走):题型筛选、刷题顺序、新题入池时预览、活动题目池大小、掌握所需正确次数。 入口在答题界面底部工具栏左侧的齿轮图标。
- 记忆模式设置(跟着题库走):目标每轮学习数(同时决定活动题目池大小)、学习顺序、连续正确次数、掌握阈值,以及重置记忆进度。 入口在记忆界面底部的齿轮图标(与刷题模式工具栏同位置)。
按题库设置的默认模板(「default settings」)会保存在 general 配置里:调整当前题库的设置时,默认模板同步更新,新导入的题库会继承它。
每份题库的进度可独立重置:打开应用,进入该题库,点击底部工具栏左侧的设置图标 → 「重置所有进度」。记忆模式题库同样点击底部工具栏左侧的设置图标 → 「重置记忆模式进度」。
或者在浏览器开发者工具的 Console 中执行(替换 <hash> 为题库哈希):
localStorage.removeItem('quiz_app_state_<hash>')quiz_app_general 唯一的 general 配置:
{ activeBank, defaultSettings, library, globalSettings }
quiz_app_questions_<hash> 某份题库的题目数组 JSON
quiz_app_state_<hash> 某份题库的进度 + 按库设置 + UI 偏好
(记忆模式的进度与设置也在同一个键的 memory 段里)
应用使用间隔重复算法来安排题目的复习,灵感来源于不背单词。
- 活动池:同时学习的题目数量(默认 25 题)
- 掌握条件:
- 从未答错:连续答对 3 次即掌握
- 曾经答错:连续答对 4 次才能掌握
- 选题策略:优先选择距离上次回答轮次较远的题目,避免连续重复
这些参数可以在应用设置中调整。
记忆模式使用另一条固定曲线:复习间隔按 1 / 2 / 4 / 8 / 16… 天翻倍,走完「掌握阈值」次复习即已掌握(默认 7 次)。
- Svelte 5 - 前端框架
- Vite - 构建工具
- TypeScript - 类型系统
- shadcn-svelte - UI 组件
MIT