Skip to content

feat: 课程自动排序、Web课程名显示、ICS日历导出#17

Open
magneticyue-tech wants to merge 3 commits into
cr4n5:mainfrom
magneticyue-tech:feat/course-sort-and-ics
Open

feat: 课程自动排序、Web课程名显示、ICS日历导出#17
magneticyue-tech wants to merge 3 commits into
cr4n5:mainfrom
magneticyue-tech:feat/course-sort-and-ics

Conversation

@magneticyue-tech

@magneticyue-tech magneticyue-tech commented Jul 3, 2026

Copy link
Copy Markdown

新增功能

1. 课程自动排序(保留手动排序)

  • 新增配置项 course_sort_enabled(默认关闭,完全保持原有手动顺序)。开启后程序在获取课程信息后对课程执行顺序做拓扑排序:退课先于与其冲突的选课执行。
  • 冲突判定:上课时间重叠(同一天、节次相交、周次相交,支持单双周如{2-8周(双)}与多段如{1-6周,9-17周}),或同一课程号的不同教学班(教务系统不允许同时持有)。
  • 在满足约束的前提下选课操作尽量靠前(先抢课);选课之间按开课类型优先:体育分项 > 通识选修课 > 其他(此类课程通常竞争最激烈),同优先级保持原有相对顺序(稳定排序)。
  • Web页面新增自动排序按钮与每行 按钮,便于手动微调。
  • 附单元测试 pkg/course/sortCourse_test.go(6个用例全部通过)。

2. Web配置页按课程编号显示课程名

  • 新增 /getCourseInfo 接口,从本地course.json任务落实情况课程导出.xlsx读取课程信息;输入课程编号即实时显示课程名称与上课时间,便于用户手动调整课程顺序。

3. ICS日历导出

  • 新增配置项 semester_start_date(第1周星期一日期)。设置后程序为课程列表中选课的课程生成 timetable_<学年学期>.ics,可导入Apple日历、Google日历。
  • 因部分课程单双周上课,每次上课生成一条独立VEVENT,不使用重复规则。
  • 同一课程配置多个备选教学班时仅为最靠前的教学班生成日历。
  • Web页面提供日历下载按钮(/exportIcs)。

4. 个人完整课表ICS(抢课后生成,含预置分配课程)

  • 在抢课完成后在线拉取个人完整课表,生成 timetable_<学年学期>_full.ics:复用已有登录态请求教务系统 xskbcx_cxXsgrkb 接口(此前 GetStuInfo 已请求该接口但仅取学号信息、丢弃了 kbList 课表数组)。
  • 抢课后生成的意义:日历反映实际选课结果——自动排除未选上的备选教学班(解决同一课程配置多个备选班导致日历重复的问题),并包含教务处预置分配、无需手动选课的课程,是完整个人课表。无需浏览器自动化,无需额外账号密码。
  • 在线获取失败时回退为按选课配置生成。
  • 解析 kbList 的星期/节次/周次(单双周)字段,附单元测试 pkg/course/timetable_test.go
  • 说明:教务系统不提供“第1周星期一”的日历日期(课表接口只有周次范围,无日历锚点,主流正方适配器亦如此),故 semester_start_date 需每学期手动填写一次;未填写则跳过ICS生成,不影响选退课。

兼容性

  • 新配置项均为可选(omitempty),旧配置文件无需修改即可运行。
  • go vetgo test ./pkg/course/go build 全部通过(Go 1.23.4)。

🤖 Generated with Claude Code

- 课程自动排序(course_sort_enabled): 拓扑排序保证退课先于与其
  冲突的选课执行(时间重叠或同课程号),其余选课尽量靠前,
  选课间按开课类型优先(体育分项>通识选修课>其他),
  保留手动排序选项;Web页面提供自动排序按钮与↑↓手动调整
- Web配置页按课程编号自动显示课程名称与上课时间
  (来源course.json或任务落实情况课程导出Excel)
- ICS日历导出(semester_start_date): 为选课课程生成日历文件,
  兼容Apple/Google日历;因单双周原因每次上课为独立事件

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@magneticyue-tech magneticyue-tech force-pushed the feat/course-sort-and-ics branch from d70a8e8 to 540987a Compare July 3, 2026 01:32
claude added 2 commits July 3, 2026 09:55
复用已有登录态请求教务系统xskbcx_cxXsgrkb接口,解析此前被丢弃的
kbList课表数组,生成timetable_<学年学期>_full.ics。与选课日历不同,
该文件包含无需手动选课的预置分配课程,是完整个人课表。无需浏览器
自动化。附kbList星期/节次/周次(单双周)解析的单元测试。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
将个人课表ICS生成移至抢课完成之后:
- 反映实际选课结果,自动排除未选上的备选教学班,
  解决同一课程配置多个备选教学班导致日历重复的问题
- 在线获取失败时回退为按选课配置生成
- 教务系统不提供第1周星期一的日历日期(课表接口仅有周次范围),
  故 semester_start_date 保持手动填写,未填写则跳过并提示

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cr4n5

cr4n5 commented Jul 3, 2026

Copy link
Copy Markdown
Owner

感谢提交pr!
对于功能1、3、4,我觉得加入该项目会让项目变得更臃肿,项目的核心原则还是稳定运行先,而且主播后续并没有很多时间维护.. ;其次ICS日历,杭电助手我记得是有该功能的,在钉钉课表还是哪里可以生成订阅链接导入日历
对于“Web配置页按课程编号显示课程名”,“Web页面新增自动排序按钮与每行↑ ↓按钮,便于手动微调。”这两个功能我觉得非常不错,你可以修改测试一下,再提一个pr,谢谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants