一个功能完善的跨平台课表应用,支持多种视图模式、AI智能导入、文件导入导出,界面美观,操作流畅。
当前版本: v2.3.5
- 周视图:直观展示整周课程安排,支持多课程并排显示
- 日视图:专注单日详细课程,彩色边框清晰标识
- 列表视图:按周次分组查看所有课程,卡片式展示
- 添加/编辑/删除课程
- 自定义课程颜色(预设颜色自动分配)
- 多课表支持(可创建和管理多个课表)
- 课程时间冲突检测
- 连续节次自动识别
- AI图片识别:上传课程表图片,自动识别课程信息
- AI表格解析:解析CSV/Excel格式的课程表
- AI文字识别:从自然语言描述中提取课程数据
- 多AI服务支持:OpenAI、Claude、Gemini、DeepSeek
- 文件导入/导出:支持JSON格式导入导出课表数据
- 显示/隐藏周末课程
- 按周筛选课程
- 自定义上课时间设置
- 节假日和补课日管理
- 数据本地持久化(Isar数据库)
TODO: 添加应用截图
- Flutter 3.5.0+
- Dart 3.5.0+
- Android SDK 21+ (Android)
- iOS 12+ (iOS)
- Windows 10+ / macOS 10.14+ / Linux (桌面端)
git clone https://github.com/wykwey/YIClass
cd YIClass
flutter pub get
flutter run- 打开应用设置 → 高级功能 → AI导入配置
- 选择或配置AI服务提供商(OpenAI/Claude/Gemini/DeepSeek)
- 输入API Key和接口地址
- 选择使用的模型(视觉模型/文本模型)
- 保存配置后即可使用AI导入功能
class Course {
String name; // 课程名称
String location; // 上课地点
String teacher; // 教师姓名
int color; // 课程颜色(ARGB格式)
List<CourseSchedule> schedules; // 上课时间安排
}
class CourseSchedule {
int weekday; // 星期几 (1=周一, ..., 7=周日)
List<int> periods; // 节次列表 (如[1,2]表示1-2节)
List<int> weekPattern; // 上课周次数组 (如[1,2,3,4,5,6])
String reminder; // 提醒设置
}weekday: 星期几 (1=周一, 2=周二...7=周日)periods: 节次列表,范围 1-20 (如[1,2]表示1-2节)weekPattern: 周次数组,具体数字列表 (如[1,2,3,4,5,6]表示第1-6周)
class TimetableSettings {
DateTime startDate; // 学期开始日期
int totalWeeks; // 总周数 (1-20)
bool showWeekend; // 是否显示周末
int maxPeriods; // 最大节数 (1-16)
List<ClassTime> classTimes; // 每节课的时间设置
List<DateTime> holidays; // 节假日
int reminderMinutes; // 上课前提醒分钟数
}{
"name": "课表名称",
"isDefault": false,
"courses": [
{
"name": "课程名称",
"location": "上课地点",
"teacher": "教师姓名",
"schedules": [
{
"weekday": 1,
"periods": [1, 2],
"weekPattern": [1, 2, 3, 4, 5, 6],
}
]
}
]
}- 状态管理: Provider (ChangeNotifier)
- 数据持久化: Isar Plus (NoSQL数据库)
- UI框架: yicore
- 文件操作: file_selector (跨平台文件选择)
- AI服务: HTTP API (支持OpenAI/Claude/Gemini/DeepSeek等)
provider: ^6.1.5 # 状态管理
isar_plus: ^1.1.1 # 本地数据库
file_selector: ^1.0.3 # 文件选择器
http: ^1.1.0 # HTTP请求
image_picker: ^1.0.4 # 图片选择
shared_preferences: ^2.2.2 # 简单配置存储lib/
├── components/ # 可复用UI组件
│ ├── week_view_components/ # 周视图专用组件
│ ├── course_card.dart # 课程卡片
│ ├── bottom_nav_bar.dart # 底部导航
│ └── ...
├── data/ # 数据模型
│ ├── course.dart # 课程模型
│ ├── timetable.dart # 课表模型
│ └── ...
├── services/ # 业务逻辑服务
│ ├── ai/ # AI服务
│ │ ├── ai_service.dart # AI调用逻辑
│ │ └── ai_config_service.dart # AI配置管理
│ ├── file_service.dart # 文件导入导出
│ ├── timetable_service.dart # 课表CRUD
│ └── ...
├── states/ # 状态管理
│ ├── timetable_state.dart # 课表状态
│ ├── view_state.dart # 视图状态
│ └── week_state.dart # 周次状态
├── utils/ # 工具类
│ ├── color_utils.dart # 颜色工具
│ └── ...
└── views/ # 页面视图
├── week_view.dart # 周视图
├── day_view.dart # 日视图
├── list_view.dart # 列表视图
├── ai_import_page.dart # AI导入页面
└── ...
欢迎提交Pull Request或Issue。提交前请确保:
- 代码通过静态分析
- 添加适当的单元测试
- 更新相关文档
Q: 如何导入课程表? A: 支持三种导入方式:
- AI图片识别:在AI导入页面选择图片,AI会自动识别课程信息
- AI表格解析:粘贴CSV/Excel格式的课程表文本
- AI文字识别:输入自然语言描述的课程安排
- 文件导入:在设置页面或悬浮按钮选择"导入",选择JSON格式的课表文件
Q: 如何导出课程表? A: 在设置页面或悬浮按钮选择"导出",选择保存位置即可导出为JSON文件
Q: AI导入功能如何使用? A:
- 先在设置中启用"高级功能"
- 进入"AI导入配置",配置API Key和Endpoint
- 支持OpenAI、Claude、Gemini、DeepSeek等AI服务
- 配置完成后在AI导入页面使用
Q: 课程时间冲突如何处理?
- 保存课程时不会阻止冲突的创建,允许用户手动添加时间冲突的课程
- 在周视图和日视图中,如果同一时段有多门课程,只会显示第一个匹配的课程
- 用户可以通过编辑课程来调整时间安排,避免冲突
Q: 如何自定义课程颜色? A: 编辑课程时可以手动选择颜色,未设置颜色的课程会从预设颜色中自动分配
Q: 数据存储在哪里? A: 使用Isar数据库本地存储,所有数据保存在设备本地,不会上传到服务器
本项目采用 Apache License 2.0 开源协议。
- 许可证名称: Apache License 2.0
- 许可证链接: LICENSE
- 版权年份: 2025
- 版权所有者: wykwey
本应用使用的第三方库及其协议:
- Flutter - Google (BSD-3-Clause)
- Provider - Remi Rousselet (MIT)
- Isar Plus - Isar Team (Apache-2.0)
- file_selector - Flutter Team (BSD-3-Clause)
- intl - Dart Team (BSD-3-Clause)
- http - Dart Team (BSD-3-Clause)
- image_picker - Flutter Team (BSD-3-Clause)
- shared_preferences - Flutter Team (BSD-3-Clause)