Skip to content

WishingCat/Pinhaoke

Repository files navigation

拼好课 V2

拼好课是面向北京大学课程的搜索、筛选与树洞课程评测检索工具。生产入口:https://www.pinhaoke.love。项目以只读课程快照为数据源,不提供选课、退课或加入选课计划功能。

产品入口与数据范围

页面 路径 内容
课程搜索 / 2026 春季、暑期、秋季课程搜索、筛选与详情
树洞课程评测 /reviews 按课程或教师检索树洞课程评价,并按需查看完整快照树洞

课程搜索页的学期选项依次为:

  1. 2026 春季学期
  2. 2026 暑期学期
  3. 2026 秋季学期

秋季为默认学期。春季和秋季同时收录本科生、研究生课程;暑期收录本科生课程。选课系统中的重复挂载会在课程列表合并,因此页面卡片数少于源记录数:春季 3701、暑期 160、秋季 4421

“树洞课程评测”是三个学期选项旁边的独立入口,不参与学期切换。数据范围 2022-12-212026-07-13 和评测数据量 90880 以小字显示在“最新课程评测”标题右侧,后者等于 47843 个主题加 43037 条相关回复。快照覆盖的这些主题还保存 210570 条非空回复,用于完整树洞弹窗;该数量不计入评测数据量。

功能

课程搜索

  • 按课程名、目标语言课程名、英文名、教师、教室或课程号搜索
  • 按课程类型、类别、学分、开课单位、星期、成绩记载方式和教室筛选
  • 按课程名、学分、最早节次排序,或使用跨页稳定的随机排序
  • 合并选课网中同一教学班的多类别挂载,同时保留完整课程类型和类别徽章
  • 查看课程简介、先修课程、教材、参考书、教学大纲、教学评估及研究生详情
  • 将搜索、筛选、排序、学期、语言和已打开课程写入可分享 URL
  • 支持中文、English、日本語、한국어、Français、Deutsch、Español、Русский;译文缺失时回退中文

树洞课程评测

  • 按课程或教师自动检索,搜索输入经过 300 ms 防抖,不需要单独的搜索按钮
  • 热度最高的 24 门课程只在点击右侧“热门课程”后展开,不显示输入联想
  • 列表只展示课程评测主帖及其中具有实际评价信息的回复
  • 默认列表把 2026 年质量分最高的 10 个评测树洞置顶,其余和搜索结果按时间倒序显示
  • 点击卡片后按需读取该树洞在快照中的完整主帖和全部回复;列表筛选口径不会因此改变
  • 课程名、教师名、思修军理高数AI引论 等常见课程别称,以及 ZZJlsj 等教师姓名拼音首字母都会加粗彩色高亮
  • 展示树洞号、评论号、楼层、时间、来源月份和原树洞链接,不展示作者身份或回复关系
  • 电话、邮箱、微信和 QQ 等联系方式在入库前清除

留言板

  • 课程页与评测页右上角的留言按钮打开悬浮留言板,任何人都可以公开留言
  • 面板顶部一句话提示:问题反馈、功能建议、想对开发者说的话都可以写在这里,所有人可见
  • 留言按时间倒序滚动浏览,支持分页加载更多;单条留言上限 500
  • 发布不收集昵称或身份信息,同一 IP 有发布频率限制

访问统计

  • 课程页与评测页右上角的统计按钮打开悬浮面板,实时查看网站访问情况
  • 展示今日、近 7 天、累计的访问量与访客数,以及近 7 天每日访问量柱状趋势
  • 面板打开时每 20 秒自动刷新
  • 按北京时间分日统计,同一访客当天多次访问只算一位访客,不收集任何身份信息

通用体验

  • 支持浅色/深色模式,主题选择保存在浏览器本地
  • 支持键盘打开卡片、关闭弹窗、焦点循环与焦点恢复
  • 尊重 prefers-reduced-motion,关闭持续动画和大部分过渡
  • 适配桌面端、平板和手机端,覆盖 1440390320 等典型视口
  • 课程页和评测页使用 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-labeltitle;主题、语言和 URL 状态在刷新后可恢复。

前端实现均位于 index.htmlreviews.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 -v

项目结构

app.py                         FastAPI API 与只读 SQLite 查询
index.html                     无构建步骤的课程搜索页
reviews.html                   无构建步骤的树洞课程评测页
Images/                        Logo、联系方式与赞助图片
数据库/                        五个课程库与一个树洞评测库
课程数据/                      七份源 JSON 与数据口径说明
数据库构建脚本/                春季、树洞评测建库及共享原子构建工具
北京大学选课网数据抓取/         页面内抓取、接收器与暑期/秋季建库
北京大学课程数据翻译/           七语翻译流水线
deploy/                        Nginx、systemd 与唯一更新脚本
tests/                         后端、数据、前端契约、部署与文档测试
归档/                          V1 只读参考

文档索引

反馈与赞助

只要课程搜索仍被需要,项目会按学期维护。问题与功能建议可通过微信联系:

微信联系方式

微信赞助码
微信赞助码
     支付宝赞助码
支付宝赞助码

鸣谢赞助

赞助者 金额
噬铁侠 ¥100
罗淦-PKU ¥100

About

拼好课,北京大学课程查询平台。课程搜索,蹭课,课程查询。免费公益项目。

Topics

Resources

Stars

35 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors