Skip to content

教务系统迁移指南¤

本页面用于从旧的 SupwisdomClient 迁移到新的 UndergradEASClient

适用范围¤

  • 旧接口:zzupy.app.supwisdom.SupwisdomClient
  • 新接口:zzupy.app.eas.UndergradEASClient

兼容性说明

SupwisdomClient 已不再作为当前公开接口维护。新项目请直接使用 UndergradEASClient

迁移时最重要的变化¤

  • 新接口围绕“教学周”组织数据,而不是直接提供“当前周 / 今日 / 下一节课”等便捷方法
  • 课表数据改为结构化模型,常用字段位于 zzupy.model.eas
  • 支持 TeachingWeek.to_calendar() / TeachingWeeks.to_calendar()
  • 旧接口中的空教室查询能力目前没有对应实现

API 对照¤

场景 旧接口 新接口 说明
登录教务 client.login() eas.login() 都要求先完成 CAS 登录
当前周课表 get_current_week_courses() get_teaching_week(week) 需要你自己确定教学周序数
指定周课表 get_courses(date) get_teaching_week(week) 新接口按教学周查询
今日课程 get_today_courses() 无直接等价方法 TeachingWeek.get_day() 自行筛选
下一节课 get_next_course_today() 无直接等价方法 需要在当天节次中自行判断
学期信息 get_semester_data() get_semesters() 新接口返回 list[Semester]
空教室 get_room_data() 不支持 暂无替代接口
导出日历 不支持 to_calendar() 新增能力

迁移示例¤

初始化与登录¤

旧接口
from zzupy.app import CASClient, SupwisdomClient

cas = CASClient("your_account", "your_password")
cas.login()

with SupwisdomClient(cas) as client:
    client.login()
新接口
from zzupy.app import CASClient, UndergradEASClient

cas = CASClient("your_account", "your_password")
cas.login()

with UndergradEASClient(cas) as eas:
    eas.login()

课表查询¤

旧接口:当前周
week = client.get_current_week_courses()
新接口:指定教学周
week = eas.get_teaching_week(week=1)

由日期换算教学周¤

先算周序数,再查课表
from whenever import Date

week_index = eas.get_week_index(Date.parse_iso("2025-03-01"))
if week_index is not None:
    week = eas.get_teaching_week(week=week_index)

今日课程的替代写法¤

用 get_day() 自行筛选
week = eas.get_teaching_week(week=1)
lessons_today = week.get_day(weekday=1)

for idx, lesson in enumerate(lessons_today, start=1):
    if lesson:
        print(f"第{idx}节", lesson.course.name_zh)

导出日历¤

导出 .ics
weeks = eas.get_teaching_weeks()

with open("semester.ics", "wb") as f:
    f.write(weeks.to_calendar().to_ical())

异步迁移¤

异步版本的迁移原则完全相同,只是调用方式改为 await

异步版本
import asyncio

from zzupy.aio.app import CASClient, UndergradEASClient


async def main():
    cas = CASClient("your_account", "your_password")
    await cas.login()

    async with UndergradEASClient(cas) as eas:
        await eas.login()
        week = await eas.get_teaching_week(week=1)
        print(week.get(weekday=1, unit=1))


asyncio.run(main())

迁移建议¤

  • 如果旧代码依赖“当前周 / 今日 / 下一节课”这样的便捷方法,建议先在业务层封装一层兼容函数
  • 如果你只需要导出课表,新接口已经足够直接,优先使用 to_calendar() 而不是自己拼 .ics
  • 如果你依赖空教室查询,当前需要继续保留旧逻辑或等待后续支持