Skip to content

Repository files navigation

Quiz! aPP.

一款基于间隔重复算法的刷题应用,帮助你高效记忆和掌握题目。支持刷题模式(判断题、单选题、多选题、填空题)和记忆模式(题目 / 答案卡片自评)。

应用是一个「空壳」:题库在浏览器里导入和管理,多份题库互相独立,学习进度保存在本地 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

导入后想改名称:刷题模式 / 记忆模式的设置面板第一项就是「修改名称」(改名只影响侧边栏显示,不动题目与进度)。

刷题模式(quiz)

questions 是一个数组,每个元素是一道题目,支持四种题型。

1. 判断题 (judgment)

{
  "id": "judgment_1",
  "type": "judgment",
  "question": "这是一道判断题的题目内容",
  "answer": true
}
字段 类型 说明
id string 题目唯一标识,建议格式:judgment_序号
type string 固定为 "judgment"
question string 题目内容
answer boolean 正确答案,truefalse

2. 单选题 (single)

{
  "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 开始),单选题只有一个元素

3. 多选题 (multiple)

{
  "id": "multiple_1",
  "type": "multiple",
  "question": "这是一道多选题的题目内容",
  "options": [
    { "text": "选项 A" },
    { "text": "选项 B" },
    { "text": "选项 C" },
    { "text": "选项 D" }
  ],
  "answer": [0, 2]
}

格式与单选题相同,区别在于 answer 数组可以包含多个索引。

4. 填空题 (blank)

{
  "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/sickfall illfall sick 均可
(A/B) 括号内词级替换 (be/get) used tobe used toget used to
A=B 等号两侧任选一套完整答案 contact/call sb = get in touch with sbcontact sbcall sbget in touch with sb 均可
全角符号 自动转半角 (an) 与半角等价

匹配时忽略大小写、空格和标点,保留字母、数字和中文进行比对。等号优先级高于斜杠,会先把答案拆成多套完整答案;每套内部仍按斜杠和括号规则匹配。斜杠分支支持共享前缀/后缀,例如 draw/reach/come to a conclusion,输入 draw conclusion 也会被判为正确。

常见占位词(用户可不输入):sbsthsb'sone'soneselfdoingto do

记忆模式(memory)

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"

完整示例

把任一文件拖进窗口(或从侧边栏导入)即可直接看到效果。

注意事项

  1. ID 必须唯一:每道题目的 id 必须不同,否则会导致进度记录混乱
  2. 索引从 0 开始answer 中的索引对应 options 数组的位置,第一个选项是 0
  3. JSON 格式要求:确保 JSON 格式正确,最外层必须是 { "questions": [...] } 对象
  4. 换行使用 \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 次)。

技术栈

License

MIT

About

Quest in zeal! a Paideia & Praxis. 一款基于间隔重复算法的刷题应用,帮助高效记忆和掌握题目。

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages