# NextClass
**Repository Path**: dcesama/next-class
## Basic Information
- **Project Name**: NextClass
- **Description**: No description available
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-09
- **Last Updated**: 2026-09-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# NextClass / 下节课
面向学生的轻量课表提醒工具(Android)。支持手机端离线识别 Excel 课表,并联动系统日历提醒。
## 在线体验
> 直接下载安装包(已签名,Android 7.0+):[下载 NextClass-1.0.apk](https://gitee.com/dcesama/next-class/releases/download/v1.0.0/NextClass-1.0.apk)
## 运行截图
## 特性
- **Excel 自动导入**:手机直接选择 `.xlsx` / `.xls`,自动识别课程、星期、时间、周次,无需在电脑上转换;App 全程纯本地运行。
- **系统日历提醒**:课程写入手机原生日历(`CalendarContract`),上课前按设定时间提前提醒;集成 Android `WorkManager`,每周自动滚动同步,长期不打开 App 也不会断档。
- **本地 / 粘贴 JSON 导入**:支持选择本地 `schedule.json` 文件,也支持直接把 JSON 粘贴进 App 导入(网络不便时同样可用),并内置示例数据一键体验。
- **周视图**:1-16 周可滑动切换,本周课程按周次正确过滤(不会出现“幽灵课”),自动定位到今天并高亮。
- **课程详情**:点击卡片查看课程信息、压缩周次显示(`1-16 周 / 单周 / 双周`)、本周是否有课的说明;支持一键复制教室、跳转系统日历查看对应日程。
- 课程与日历同步完全遵循“Room 本地库为唯一数据源,系统日历仅作为提醒执行器”的架构。
## 架构
在原有 JSON 导入流程上增加手机端 Excel 识别:
```
Excel / JSON 文件或粘贴 JSON → 离线识别与校验 → Room 事务替换课表 → 系统日历提醒
可选 PC 工具:XLSX → schedule.json
```
目录结构:
```
app/ Android 端(Kotlin + Jetpack Compose + Room + DataStore + WorkManager)
tools/ PC 端课表转换工具(Python,XLS → schedule.json)
开发文档.md 产品技术开发文档 V1.0(接口契约 / 数据流的权威定义)
```
## 快速开始
### 1. 准备 Excel 课表(也可使用 JSON)
把 `.xlsx` 或 `.xls` 文件传到手机,即可直接导入。支持两种布局:
- 横向周课表:表头包含至少三列“周一、周二、周三……”(也支持“星期一”及 Mon 等英文名称),左侧填写时间或节次。课程单元格逐行填写课程名、教师、教室、周次;同一格多门课以空行分隔。
- 课程明细表:每行一条课程,表头为“课程名称、星期、时间、周次、教师、教室”;可用“开始时间、结束时间”替代“时间”,也可填写“节次”。教师、教室和周次可以省略。
识别规则:
- 读取第一个包含可识别课表表头的工作表,不混合不同学生的工作表。
- 支持纵向合并的课程单元格,按首尾行时间计算时段,只导入一次。跨多个星期的课程合并格需先拆分。
- 周次支持 `1-16周`、`1-8,10-16周`、`单周`、`1-16周(双)`,限 1-16 周;缺省为每周。教师、教室缺省为“待定”。
- 优先使用 `08:20-09:55` 等明确起止时间。仅有节次时使用项目默认作息(见导入页面);学校作息不同时请补充明确时间。不能识别时间时拒绝导入。
- Excel 原文件最多 16 MB,解压内容最多 32 MB,每张表最多 5000 行、128 列。不支持加密文件、图片课表或任意教务模板;课程错误提示包含工作表和行号。
- 成功后替换当前课表;解析失败不修改原课表。导入后核对时间并设置“开学周一日期”。
如需继续使用电脑端转换工具(可选):
```bash
cd tools
pip install -r requirements.txt
python xls_to_schedule.py 课表.xlsx -o schedule.json --student 张三
```
支持合并单元格、单/双周、`1-16 周` 等常见格式的自动解析,并允许交互式补录“课本/备注”。详见 [tools/README.md](tools/README.md)。
### 2. 导入(Android 端)
在 App 的「导入」页:
- **选择文件**:选择 Excel 或 JSON 文件,自动识别并导入;或
- **粘贴 JSON**:直接把文件内容粘贴进文本框导入(无网络时优先推荐)。
### 3. 设置与提醒
- 「设置 → 开学周一日期」:选择本学期开学第一周的周一(默认取本周周一),用于计算第几周。
- 「设置 → 提醒时间」:选择课前提前提醒分钟数。
- 「设置 → 同步到日历」:授权日历写入权限后写入“本周 + 未来两周”的日程;之后每周自动滚动更新。
## 开发
环境:JDK 17+、Android SDK(compileSdk 37, minSdk 24)。
```bash
gradlew :app:assembleDebug # 构建 debug APK
gradlew :app:assembleRelease # 构建 release(R8 压缩)
gradlew :app:testDebugUnitTest # 运行单元测试
```
注意:本项目使用 AGP 9 内建 Kotlin,需在 `gradle.properties` 保留 `android.disallowKotlinSourceSets=false`;并已关闭工具链自动下载(`org.gradle.java.installations.auto-download=false`),避免网络不佳时构建卡住。
## 数据契约(schedule.json)
```json
{
"semester": "2026-2027-1",
"studentName": "张三",
"generatedAt": "2026-09-09T12:00:00",
"courses": [
{
"id": "c0001",
"name": "高等数学",
"teacher": "张老师",
"classroom": "教一101",
"book": "",
"dayOfWeek": 1,
"startMinuteOfDay": 500,
"endMinuteOfDay": 595,
"applicableWeeks": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
}
]
}
```
- 时间使用“基于当日的分钟偏移”(如 08:20 = 500),禁止传输时间字符串,避免时区/解析问题;
- JSON 中的周次使用已展开的整数数组(`1-16`);Excel 导入时由手机端展开单双周和周次区间。