题库数据保留在小程序本地;邀请码通过 CloudBase 云函数远程核销。首页两行独立入口,两个板块数据完全隔离。
小程序门禁调用当前 CloudBase HTTP 接口:
https://kaoyan-memorization-d0bl72591bdc-1506337511.ap-shanghai.app.tcloudbase.com
管理员在 /admin 生成一次性验证码,用户在小程序中输入后由云函数核销,并将授权令牌保存在本机。题库正文仍随小程序包发布,不上传到云端。开发者工具本地调试时可在“详情 → 本地设置”开启“不校验合法域名、TLS 版本及 HTTPS 证书”;正式发布前应在小程序后台配置合法业务域名。
- 微信开发者工具 → 导入项目 → 选择本目录(
miniprogram/) - AppID 选「测试号」即可(无需服务器与云环境)
- 编译后首页出现两行入口:艺术概论 / 电影概论
miniprogram/
├─ app.json / app.js / app.wxss / project.config.json / sitemap.json
├─ pages/{home,search,mine}/ 主包(首页两行入口、跨书搜索、我的)
├─ components/{item-card,five-block,freq-tag,keyword-mark}/
├─ utils/{store,search,storage,drill}.js 纯函数核心层(可测试、可复用)
├─ data/{search-index.json,doc-index.json,mock-papers.json}
├─ packageArt/{pages/{list,framework,detail,drill,paper},data/{art-<章>.json,art-frameworks.json},assets/framework/*.webp}
└─ packageFilm/{pages/{list,detail,drill},data/{film-<章>.json,film-outline.json}}
cd /mnt/d/study/workspace/mianshi/output/kaoyan_mock
python3 scripts/build_mp_data.py # 生成分片与索引,并断言包体积 < 1.5MB
node tests/mp/run.js # 核心层测试必须全绿
build_mp_data.py会同时扫描配置的 DOCX/PDF,生成doc-index.json。搜索顺序是:题库 → 电脑文档补充 → 网上搜索。 它也会从艺术概论校订版 DOCX 提取六章知识框架图,放入艺术分包;章节列表顶部与每章题目列表顶部均可进入。 网上搜索使用pages/web-search/的 web-view;正式发布前需在小程序后台配置网页业务域名。 本仓库的构建脚本只读data/kaoyan_data_pack.json和配置的本地文档;改动题库请改该文件后重建。
- 核心层(数据契约 / 考频映射 / 搜索 / 记录 / 刷题引擎 / 页面结构):
node tests/mp/run.js - 无 Node 环境(本机 WSL 无 node,且 Windows interop 被禁)可用等价运行器:
uv run --with quickjs python3 tests/mp/run_quickjs.py—— 它用 Python + QuickJS 提供require/fs/path/console/process/global垫片来执行同一批测试文件; 测试文件本身保持标准 Node 写法。 - 页面层:按
docs/验收清单-小程序.md在微信开发者工具中逐项验收。
- 主包:1.18 MB(含电脑文档补充索引;本工程门限 1.5MB)
- packageArt:1.44 MB(含六章 12 张知识框架图)
- packageFilm:0.62 MB
- 题库条目 367 条(艺术概论 272 / 电影概论 95);其中九字段齐全的「完整条目」116 条,其余 251 条为题库精简条目
- 精简条目按设计只渲染可用段落:无案例时显示「本题为题库精简条目」提示,不伪造案例
- 电影概论理论篇(批评框架)条目已回挂正确章节(第38–46章)
- 模拟卷 10 套 × 14 题(名词 6×5 + 简答 6×10 + 论述 2×30 = 150 分);简答与论述均按相关小节综合命题
- 纯本地数据版:内容更新需重新提交版本审核(无云端热更新)
- 模拟卷页两态:试卷态不显示任何来源标注;答案解析态才显示【来源】书·章与考频
电影运动双轴时间轴(横轴年份 / 纵轴世纪)、考频筛选联动统计、默写/听写、模拟卷计时。
本小程序是私人学习资料,不是公开产品。访问控制分两层:
- 不要提交审核/发布,保持在开发版或体验版
- 微信公众平台 → 管理 → 成员管理 → 体验成员,只把你允许的微信号加进去
- 只有白名单里的微信号能打开体验版;外人拿不到入口
- 启动第一页就是邀请码页(
pages/gate/),不通过进不去任何页面 - 10 个页面
onShow都挂了守卫,直接跳详情/刷题页会被弹回邀请码页 - 代码里只存邀请码的 SHA-256,明文不在仓库任何文件里
- 通过状态存在本地
gate:<哈希前8位>,换码后旧通行状态自动失效 - 「我的」页提供「清除邀请码」入口(换机或演示前用)
python3 -c "import hashlib;print(hashlib.sha256('你的新邀请码'.encode()).hexdigest())"把输出的哈希填进 miniprogram/utils/gate.js 的 CODE_HASH 一行,重新提交版本即可。
- 纯本地小程序无法防住会反编译的人:拿到代码包的人可以读到校验逻辑、跳过或伪造通过状态。这是原理限制,不是实现问题。
- 邀请码的真实作用是声明 + 心理门槛 + 挡住普通人;真正拦住外人靠上面的体验成员白名单。
- 若需要「一码一人、可远程吊销、不可绕过」,必须加服务端校验(云开发/自建服务),那会改变本项目「纯本地」的前提。
不想装微信开发者工具时,可双击打开 ../preview/index.html(单文件、数据已内联、无需服务器):
能点两书列表、五段式详情与标红、全局搜索、702 模拟卷双态、五种刷题模式。
- 它与小程序同数据、同 utils(store/search/drill/storage 直接复用),但不是小程序本体(无 WXML/WXSS 渲染器与 wx API),仅供查看内容与交互。
- 数据更新后重新生成:
python3 scripts/build_preview.py
- 入口:首页「电影双轴时间轴」一行 →
packageFilm/pages/timeline/index- 纵轴=世纪、横轴=年份;同一时段并列各国运动 / 代表人物 / 经典影片 / 核心主张
- 支持世纪筛选(19/20/21)、国别筛选(法国/美国/中国…)与关键词搜索(运动/国家/人物/片名)
- 搜索直达专页:检索索引已包含导演名 / 流派名 / 片名 / 国别名(59 条
type='entity'行)- 搜「小津安二郎」「法国新浪潮」「东京物语」「意大利」→ 命中专页并直达
- 导演专页:艺术风格要点 → 作品按年份罗列(每片:风格 + 意义)→ 相关知识条目跳转
- 流派专页:运动核心主张 → 代表人物 → 代表作品 → 相关知识条目跳转
- 数据(源文件下划线命名,分包副本连字符命名)
data/film_timeline.json→packageFilm/data/film-timeline.json(46 个时间点 / 13 个年代带 / 19·20·21 三个世纪)data/film_directors.json→packageFilm/data/film-directors.json(导演 41 / 流派 18 / 片目 57)
- 来源标注:教材原文标「教材第 N 章」;我补的通识内容标「通识补充」,页面上与教材原文分区显示(不混淆)
- 重建:
python3 scripts/author_timeline.py、python3 scripts/author_directors.py,再python3 scripts/build_mp_data.py
刷题页展开答案后有四个按钮:完全不会 / 有点印象 / 记住了 / 非常熟练。排期由 utils/srs.js(纯函数,小程序与预览共用)计算:
| 档位 | 下次复习 | 备注 |
|---|---|---|
| 完全不会 | 今天 | 同时进错题本 |
| 有点印象 | 1 天后 | 不进错题本 |
| 记住了 | 3 天后 | |
| 非常熟练 | 7 天后 | 连续两次非常熟练升到 15 天并封顶 |
- 存储键
srs:<book>:{ [itemId]: { due, interval, streak, last } },两书隔离 - 第六种刷题模式「今日复习」= 到期条目(
due <= 今天),按逾期升序,空队列有提示 - 首页每本书显示「今日待复习 N 题」
- 旧接口仍兼容:
judge(true)视为「记住了」,judge(false)视为「完全不会」
- 本轮完成页:刷完最后一题显示「本轮完成」(本次刷了 N 题 · 累计记住 · 累计未记 · 记住率)+「再来一轮」「回到首页」
- 首页学习统计:今日已刷 / 累计 / 记住率 / 错题 + 「继续上次刷题」(按最近一次进度恢复,两书取更近的一次)
- 上下题不跨书:详情页上一题/下一题按当前条目所属书推进(此前会按板块状态错位)
- 今日已刷:
today:<book>记录,跨日自动归零
drill:<book>(进度游标,含 at 时间戳)· wrong:<book> · fav:<book> · stats:<book> · today:<book> · srs:<book>