大学生课表信息高度分散:教务系统导出的课表是版式各异的 PDF,作息时间又常是另一份图片或通知,想看明白"今天第几节在哪上课"要在多个文件间反复对照。而市面课表 App 普遍要求注册登录、把课表上传到服务器、常驻后台推送,对"只想要个安静好用的本地课表"的学生并不友好。本项目面向在校学生做一个不联网、不要账号、打开即用的离线课表工具:把教务系统的课表 PDF、作息时间表图片一次性导入,整理成清晰可读的周视图,并支持多套课表(本学期 / 辅修 / 考研)分别管理。
点击空白处退出提示
大学生课表信息高度分散:教务系统导出的课表是版式各异的 PDF,作息时间又常是另一份图片或通知,想看明白"今天第几节在哪上课"要在多个文件间反复对照。而市面课表 App 普遍要求注册登录、把课表上传到服务器、常驻后台推送,对"只想要个安静好用的本地课表"的学生并不友好。本项目面向在校学生做一个不联网、不要账号、打开即用的离线课表工具:把教务系统的课表 PDF、作息时间表图片一次性导入,整理成清晰可读的周视图,并支持多套课表(本学期 / 辅修 / 考研)分别管理。
1. 周视图课表:7×12 网格,左右滑动切周,表头显示每列对应的真实日期、今天自动高亮;点空白格即可加课或加自定义安排(自习、健身、实验等),跨节次的课显示为整块。
2. 课表 PDF 导入:教务系统导出的 PDF 直接选入,自动识别课程名、星期、节次、周次(含单双周)、教师与教室;识别结果先进入校正页供勾选修改,确认后才写入,写库前还会提示"当前课表为空/已有多少门"。
3. 作息时间表导入:支持图片 OCR(离线中文识别)、粘贴文本、PDF 文字层三种通道,自动得到每节课的起止时间,并正确跳过课间与上午/下午大课间;识别不全时可手动补一节。
4. 多课表管理与学期设置:一张课表 = 课程 + 自定义安排 + 作息时间 + 学期设置,可新建、切换、重命名、删除、复用其他课表的作息;启动时自动回到上次使用的课表,也可指定"总是打开主课表"。
5. 周次定位与校准:打开就停在今天所在的那一周,并随日期自动推进;不知道开学日期时,填"这周是第几周"即可反推出开学日期。
6. 细节体验:同一格里时间冲突的课并排显示并标注冲突课程名;教室名自动缩写(本部-思源楼-301 → 思源301);日期/时间/周次输入自动纠正(2026-9-1 → 2026-09-01、8:5 → 8:05);支持深色模式、小屏与系统大字体。
【我负责的部分】一人独立完成:需求梳理、交互与视觉设计、全部编码、测试脚本编写与真机验证。
【技术栈】Kotlin 2.0.21 + Jetpack Compose(Material 3);Room/SQLite 本地存储;Coroutines/Flow 单向数据流;PDF 解析用 PDFBox-Android(本机解析,不联网);图片文字识别用 ML Kit 中文离线模型(模型随包安装);最低支持 Android 8.0,目标 Android 15。
【架构】单 Activity + Compose 路由,MVVM 分层(UI → ViewModel → Repository → Room DAO);解析层完全不接触数据库,导入流程统一为"解析 → 校正页 → 落库";所有数据按课表维度隔离,作息、学期设置都挂在课表上,切换课表即切换整套配置。
【亮点】1) 零权限、零后台服务、无账号:文件读取走系统文件选择器(SAF),并用 manifest 的 tools:node="remove" 摘掉了依赖库带进来的联网权限,数据只存本机;2) 性能:真机实测 release 冷启动中位数 178ms(目标 ≤500ms),APK 9.67MB(通过只保留 arm64 原生库、排除无用资源、压缩原生库,从 48.6MB 降下来);3) 质量保障:自建 7 套离线回归脚本(真 SQLite 跑数据库迁移、三份真实课表解析回放、OCR 回放、排版与周次逻辑等,合计 200 余条断言)+ 真机截图对比验证。
【难点与解决】1) 中文课表 PDF 的文字层只有坐标、没有行列概念:按页取表头基线定位星期列、列边界取相邻表头中点、以课程名记号锚定条目并判定详情续行,重建表格;修复了多页串行、字段个数不定、单双周、续行误判四处缺陷;2) 作息表图片漏节次:节次号单元格识别失败会丢弃整行,用孤立行回填 + 末行截断推断 + 手动补一节解决;3) Compose 中 Text 的 maxLines 超出格子高度不会截断,多出的行会压到下一行("字叠字"),改为按格子高度在 sp 空间计算行数并加裁切兜底;4) "每次打开都停在第 1 周"的排查:翻页器把初始位置与程序化翻页误报成用户选择,关掉了"跟随当前日期",用真机复现 + 修复前后截图比对定位并修复。



评论