拼好课是面向北京大学课程的搜索、筛选与树洞课程评测检索工具。生产入口:https://www.pinhaoke.love。项目以只读课程快照为数据源,不提供选课、退课或加入选课计划功能。
| 页面 | 路径 | 内容 |
|---|---|---|
| 课程搜索 | / |
2026 春季、暑期、秋季课程搜索、筛选与详情 |
| 树洞课程评测 | /reviews |
按课程或教师检索树洞课程评价,并按需查看完整快照树洞 |
课程搜索页的学期选项依次为:
- 2026 春季学期
- 2026 暑期学期
- 2026 秋季学期
秋季为默认学期。春季和秋季同时收录本科生、研究生课程;暑期收录本科生课程。选课系统中的重复挂载会在课程列表合并,因此页面卡片数少于源记录数:春季 3701、暑期 160、秋季 4421。
“树洞课程评测”是三个学期选项旁边的独立入口,不参与学期切换。数据范围 2022-12-21 至 2026-07-13 和评测数据量 90880 以小字显示在“最新课程评测”标题右侧,后者等于 47843 个主题加 43037 条相关回复。快照覆盖的这些主题还保存 210570 条非空回复,用于完整树洞弹窗;该数量不计入评测数据量。
- 按课程名、目标语言课程名、英文名、教师、教室或课程号搜索
- 按课程类型、类别、学分、开课单位、星期、成绩记载方式和教室筛选
- 按课程名、学分、最早节次排序,或使用跨页稳定的随机排序
- 合并选课网中同一教学班的多类别挂载,同时保留完整课程类型和类别徽章
- 查看课程简介、先修课程、教材、参考书、教学大纲、教学评估及研究生详情
- 将搜索、筛选、排序、学期、语言和已打开课程写入可分享 URL
- 支持中文、English、日本語、한국어、Français、Deutsch、Español、Русский;译文缺失时回退中文
- 按课程或教师自动检索,搜索输入经过
300 ms防抖,不需要单独的搜索按钮 - 热度最高的
24门课程只在点击右侧“热门课程”后展开,不显示输入联想 - 列表只展示课程评测主帖及其中具有实际评价信息的回复
- 默认列表把 2026 年质量分最高的
10个评测树洞置顶,其余和搜索结果按时间倒序显示 - 点击卡片后按需读取该树洞在快照中的完整主帖和全部回复;列表筛选口径不会因此改变
- 课程名、教师名、
思修、军理、高数、AI引论等常见课程别称,以及ZZJ、lsj等教师姓名拼音首字母都会加粗彩色高亮 - 展示树洞号、评论号、楼层、时间、来源月份和原树洞链接,不展示作者身份或回复关系
- 电话、邮箱、微信和 QQ 等联系方式在入库前清除
- 课程页与评测页右上角的留言按钮打开悬浮留言板,任何人都可以公开留言
- 面板顶部一句话提示:问题反馈、功能建议、想对开发者说的话都可以写在这里,所有人可见
- 留言按时间倒序滚动浏览,支持分页加载更多;单条留言上限
500字 - 发布不收集昵称或身份信息,同一 IP 有发布频率限制
- 课程页与评测页右上角的统计按钮打开悬浮面板,实时查看网站访问情况
- 展示今日、近
7天、累计的访问量与访客数,以及近7天每日访问量柱状趋势 - 面板打开时每
20秒自动刷新 - 按北京时间分日统计,同一访客当天多次访问只算一位访客,不收集任何身份信息
- 支持浅色/深色模式,主题选择保存在浏览器本地
- 支持键盘打开卡片、关闭弹窗、焦点循环与焦点恢复
- 尊重
prefers-reduced-motion,关闭持续动画和大部分过渡 - 适配桌面端、平板和手机端,覆盖
1440、390、320等典型视口 - 课程页和评测页使用
AbortController与请求序号校验,避免快速输入时旧响应覆盖新结果
项目没有前端构建步骤,唯一的写入接口是公开留言板:
浏览器
├─ index.html / reviews.html 原生 HTML、CSS、JavaScript
└─ GET/POST /api/* 搜索、筛选、详情、留言、健康检查
│
Nginx TLS、静态图片、反向代理
│
Uvicorn + FastAPI 参数校验、查询合并、多语言替换
│
SQLite mode=ro 五个课程库 + 一个树洞评测库
SQLite 可写 留言板库 + 访问统计库(服务器状态目录,不入仓库)
app.py是唯一后端模块,所有数据库路径从仓库根目录解析。- 五个课程库按学期和本研学段组合;API 使用
a/r/u/g/s前缀区分详情 ID。 - 树洞评测库分开保存评测列表条目和完整快照回复,使首页检索保持精确、详情查看保持完整。
- 留言板与访问统计数据保存在服务器状态目录的独立 SQLite 库;六个正式库保持只读。
- 六个正式数据库由 Git LFS 管理;课程源 JSON、建库脚本、抓取脚本和翻译脚本各有独立说明。
- 生产由 Nginx 终止 TLS,systemd 运行 Uvicorn,唯一更新入口是
deploy/update.sh。
API 速查:
| Endpoint | 用途 |
|---|---|
GET /api/filters |
返回指定学期的筛选选项 |
GET /api/courses |
课程搜索、筛选、排序和分页 |
GET /api/courses/{id} |
根据带命名空间 ID 返回课程详情 |
GET /api/reviews |
返回筛选后的评测主题和相关回复 |
GET /api/reviews/{pid} |
返回已命中主题的完整主帖及快照回复 |
GET /api/review-courses |
返回热门课程及课程名建议数据 |
GET /api/reviews/meta |
返回评测日期、数量和快照覆盖信息 |
GET /api/messages |
返回公开留言列表,按时间倒序分页 |
POST /api/messages |
发布一条公开留言 |
GET /api/stats |
返回今日/近 7 天/累计访问量与访客数及每日趋势 |
GET /api/health |
校验六个数据库及关键数据契约 |
完整参数、ID、列表合并和只读安全契约见 CLAUDE.md。
- 两个页面共享安静、信息优先的产品风格,最大内容宽度为
1120px。 - 正文字体使用苹方、冬青黑体和系统无衬线字体回退;课程号、树洞号、楼层与统计数字使用 JetBrains Mono 或系统等宽字体。
- 中性色背景承载高密度信息,品牌主色为薄荷青绿;课程类型、评测实体和卡片边框使用可区分的靛蓝、绿色、琥珀、玫红等辅助色。
- 课程页顶部使用青绿与靛蓝柔光,评测页使用粉色与雾蓝柔光;浅色和深色主题分别调校对比度。
- 标题可使用克制的品牌渐变,搜索框、筛选器和内容卡片保持清晰实体边界,避免装饰遮挡文本。
- 课程页由吸顶工具栏、品牌标题、学期分段控件、独立评测入口、搜索框、筛选区、结果工具栏、课程卡片和详情弹窗组成。
- 课程卡片按公选、通识、专业和研究生类型使用不同颜色的完整边框;课程详情在站内模态框中展示。
- 评测页沿用相同字体、宽度、搜索框和学期控件比例。树洞卡片使用六组轮换的完整彩色边框,不使用左侧彩条。
- 评测正文中的课程全称、教师全称和高置信缩写使用稳定颜色高亮;正文始终作为文本节点安全分段。
- 完整树洞弹窗使用独立滚动区,桌面端居中,手机端靠近底部并尽量利用可视高度。
- 筛选网格从四列逐步缩为三列和两列;
720px以下使用居中、全宽的筛选按钮折叠筛选区。 390px以下三个学期仍保持同组,树洞课程评测入口独占一行;320px下学期按钮可逐项换行。- 所有固定控件具有稳定尺寸,长课程名、院系名和标签允许安全换行,不产生横向滚动。
- 卡片支持 Enter/Space,弹窗支持 Escape、背景点击、焦点锁定、背景
inert和关闭后的焦点恢复。 - 图标按钮提供
aria-label或title;主题、语言和 URL 状态在刷新后可恢复。
前端实现均位于 index.html 和 reviews.html,修改视觉或交互后需同时检查浅色/深色、桌面/手机、键盘操作、横向溢出和浏览器控制台。
- 课程数据是抓取日期对应的选课网快照,不代表实时余量或实时教室安排。
- 课程数据库只读打开,应用请求不能修改课程或评测数据。
- 留言板内容完全公开;发布时不收集昵称或身份信息,来源 IP 仅以哈希形式用于发布频率限制,不对外展示。
- 访问统计只保存按北京时间分日的访问量与去重访客数,来源 IP 仅以哈希形式用于当日去重,不记录身份,也不对外展示。
- 树洞评测源快照不进入仓库;仓库只保存经过筛选和隐私清理的 SQLite 成品。
- 完整树洞仅指输入快照中保存的主帖和回复。源 manifest 的回复缓存覆盖率为
95.24%,未缓存回复无法展示。 - 自动分类和实体识别可能存在遗漏,页面底部保留该限制说明。
仓库内 venv/ 面向生产目录,不适合作为 macOS 开发环境。使用临时虚拟环境:
python3 -m venv /tmp/pinhaoke-dev
/tmp/pinhaoke-dev/bin/python -m pip install -r requirements.txt
/tmp/pinhaoke-dev/bin/python -m uvicorn app:app --host 127.0.0.1 --port 8000 --reload访问 http://127.0.0.1:8000/ 使用课程搜索,访问 http://127.0.0.1:8000/reviews 使用树洞课程评测。不要直接双击 HTML 文件,页面依赖 /api/* 后端。
运行完整测试:
python3 -m unittest discover -s tests -vapp.py FastAPI API 与只读 SQLite 查询
index.html 无构建步骤的课程搜索页
reviews.html 无构建步骤的树洞课程评测页
Images/ Logo、联系方式与赞助图片
数据库/ 五个课程库与一个树洞评测库
课程数据/ 七份源 JSON 与数据口径说明
数据库构建脚本/ 春季、树洞评测建库及共享原子构建工具
北京大学选课网数据抓取/ 页面内抓取、接收器与暑期/秋季建库
北京大学课程数据翻译/ 七语翻译流水线
deploy/ Nginx、systemd 与唯一更新脚本
tests/ 后端、数据、前端契约、部署与文档测试
归档/ V1 只读参考
只要课程搜索仍被需要,项目会按学期维护。问题与功能建议可通过微信联系:
![]() 微信赞助码 |
![]() 支付宝赞助码 |
| 赞助者 | 金额 |
|---|---|
| 噬铁侠 | ¥100 |
| 罗淦-PKU | ¥100 |


