{% extends "base.html" %} {% block title %}学业 · 西湖生存手册{% endblock %} {% block content %}

学业(SIS)

{% set sched = blocks.get('schedule') %} {% set gr = blocks.get('grades') %} {% set ex = blocks.get('exams') %} {% set ev = blocks.get('evals') %} {% set reg = blocks.get('registration') %} {% set vh = blocks.get('vol_history') %} {% set cl = blocks.get('clubs') %} {% set sc = blocks.get('second_class') %} {% set av = blocks.get('advisor') %} {% set oa = blocks.get('other_apps') %} {# —— 概览数字条:首屏即答案 —— #}
在修课程
{{ (sched | length) if sched and not sched.error else '—' }}
{% if gr and not gr.error %}
总课程
{{ gr.total_courses }}
总学分
{{ gr.total_credits }}
GPA(估算)
{{ gr.gpa_estimated or '—' }}
{% endif %}
排期考试
{{ (ex | length) if ex and not ex.error else '—' }}
待评教
{{ (ev | length) if ev and not ev.error else '—' }}
{% if vh and not vh.error %}
志愿时长
{% if vh.total_time %}{{ vh.total_time.split(' ')[0] }} {{ vh.total_time.split(' ')[1] }}{% else %}—{% endif %}
{% endif %} {% if sc and not sc.error %}
二课待完成
{{ sc.pending }}
{% endif %} {% if av and not av.error and av.assigned %}
学业导师
{{ av.assigned }}
{% endif %} {% if cl is not none and not (cl and cl.error) %}
我的社团
{{ cl | length }}
{% endif %} {% if reg and not reg.error %}
注册缴费
{{ reg.fields.get('Payment Academic Year') or '—' }}
{% endif %}
{# —— 左侧常驻目录树(组→块二级,2026-10-25 重设计)—— #}
{# ============================ 课表 ============================ #}

本学期课表({{ sched | length }} 节)

{% if sched and not sched.error %} {% for c in sched %}{% endfor %}
课程教师星期时间地点
{{ c.name }}{{ c.teacher }}{{ c.weekday }}{{ c.time }}{{ c.location }}
{% else %}
课表不可用:{{ sched.error if sched else '未加载' }}(需教务凭据与校园网/VPN)
{% endif %}
{# ============================ 成绩 ============================ #}
{% if gr and not gr.error %}

成绩({{ gr.total_courses }} 门 / {{ gr.total_credits }} 学分{% if gr.gpa_estimated %} / GPA≈{{ gr.gpa_estimated }}{% endif %})

{{ gr.gpa_note }}官方成绩单以教务为准。
{% if gr.rows %}
{% if gr.by_term %}
{% for b in gr.by_term %}
{{ b.term }}
{{ b.count }} 门 · {{ b.credits }} 学分
GPA {{ b.gpa or '—' }}
{% endfor %}
{% endif %} {% set ns = namespace(prev='') %}{% for g in gr.rows %}{% endfor %}
学期课程等级学分
{% if g.term == ns.prev %}{{ g.term }}{% else %}{{ g.term }}{% set ns.prev = g.term %}{% endif %}{{ g.name }}{{ g.grade }}{{ g.credits }}
{% else %}
暂无成绩记录。
{% endif %} {% elif gr and gr.error %}
成绩不可用:{{ gr.error }}
{% endif %}
{# ============================ 考试 / 评教 ============================ #}

考试安排

{% set ex2 = ex %} {% if ex2 is not none and not (ex2 and ex2.error) %} {% if ex2 %}{% for e in ex2 %}{% endfor %}
课程日期时间类型考场座位
{{ e.course }}{{ e.date }}{{ e.time }}{{ e.kind }}{{ e.room }}{{ e.seat }}
{% else %}
本学期暂无排期考试。
{% endif %} {% elif ex2 and ex2.error %}
考试安排不可用:{{ ex2.error }}
{% endif %}

待评教

{% if ev is not none %} {% if ev and not ev.error and ev %}{% for e in ev %}{% endfor %}
课程学期时段
{{ e.name }}{{ e.term }}{{ e.period }}
{% elif not (ev and ev.error) %}
暂无待评教任务。
{% else %}
评教不可用:{{ ev.error }}
{% endif %} {% endif %}
{# ============================ 第二课堂 ============================ #}
{% if sc and not sc.error %}

第二课堂({{ sc.pending }} 项待完成)

{% for c in sc.categories %}
{{ c.name }}
{{ c.percent if c.percent is not none else '—' }}{% if c.percent is not none %}%{% endif %}
{% endfor %}
{% for c in sc.categories %}
{{ c.name }}{{ c.percent if c.percent is not none else '—' }}{% if c.percent is not none %}%{% endif %}
{% for n in c.nodes %} {% if n.name and n.name != c.name %}
{{ n.name }}{% if n.percent is not none %} · {{ n.percent }}%{% endif %}{% if n.note %} · {{ n.note }}{% endif %}
{% endif %} {% if n.rows %} {% for r in n.rows %}{% endfor %}
要求完成进度
{{ r.requirement }}{{ r.progress or '—' }}
{% endif %} {% for ch in n.children %}
{{ ch.name }}{% if ch.percent is not none %} · {{ ch.percent }}%{% endif %}
{% if ch.rows %} {% for r in ch.rows %}{% endfor %}
要求完成进度
{{ r.requirement }}{{ r.progress or '—' }}
{% endif %} {% endfor %} {% endfor %}
{% endfor %} {% elif sc and sc.error %}
第二课堂不可用:{{ sc.error }}
{% else %}
第二课堂数据未加载。
{% endif %}
{# ============================ 学业导师 ============================ #}
{% if av and not av.error %}

学业导师{% if av.assigned %}(已分配:{{ av.assigned }}){% endif %}

{% if av.announcement %}
{{ av.announcement }}
{% endif %} {% for r in av.rotations %}
{{ r.label or '导师名单' }}{{ r.count }} 位
{% for a in r.advisors %}{% endfor %}
导师学院配额余量1志愿2志愿3志愿
{{ a.name }}{{ a.school }}{{ a.quota }}{{ a.remaining or '—' }}{{ a.choices.get('1st Choice') or '—' }}{{ a.choices.get('2nd Choice') or '—' }}{{ a.choices.get('3rd Choice') or '—' }}
{% endfor %} {% elif av and av.error %}
学业导师不可用:{{ av.error }}
{% endif %}
{# ============================ 其他申请 ============================ #}
{% if oa and not oa.error %}

其他申请

学籍异动 / 困难认定 / 本博衔接 / 就业{{ oa.status_change.tabs | length }} 类异动流程
学籍异动可办理流程:{{ oa.status_change.tabs | join(' · ') }}
困难认定
{{ oa.difficulty.count }} 条申请{% if oa.difficulty.message %} · {{ oa.difficulty.message }}{% endif %}
本博衔接
{{ oa.phd.count }} 条申请{% if oa.phd.message %} · {{ oa.phd.message }}{% endif %}
就业服务
{{ oa.employment.count }} 条{% if oa.employment.message %} · {{ oa.employment.message }}{% endif %}
学术进度
{{ oa.academic_progress.count }} 条{% if oa.academic_progress.message %} · {{ oa.academic_progress.message }}{% endif %}
{% elif oa and oa.error %}
其他申请不可用:{{ oa.error }}
{% endif %}
{# ============================ 学籍档案 ============================ #}

学籍档案

{% set pf = blocks.get('profile') %} {% if pf and not pf.error %}
个人信息{{ pf | length }} 项
{% for k, v in pf.items() %}{% if v %}
{{ k }}
{{ v }}
{% endif %}{% endfor %}
{% endif %} {% set ac = blocks.get('academic') %} {% if ac and not ac.error %}
学籍信息{{ ac | length }} 项
{% for k, v in ac.items() %}{% if v %}
{{ k }}
{{ v }}
{% endif %}{% endfor %}
{% endif %} {% set ext = blocks.get('extended') %} {% if ext is not none and not (ext and ext.error) %}
扩展信息{{ ext | length if ext else 0 }} 项 · 联系方式与户籍
{% for k, v in (ext or {}).items() %}{% if v %}
{{ k }}
{{ v }}
{% endif %}{% endfor %}
{% elif ext and ext.error %}
扩展信息不可用:{{ ext.error }}
{% endif %} {% if reg is not none and not (reg and reg.error) %}
学期注册缴费{{ reg.fields.get('Payment Academic Year') or '—' }}{% if reg.notice %}未开放{% endif %}
{% for k, v in reg.fields.items() %}{% if v %}
{{ k }}
{{ v }}
{% endif %}{% endfor %}
{% if reg.notice %}
站点提示:{{ reg.notice }}
{% endif %}
{% elif reg and reg.error %}
学期注册不可用:{{ reg.error }}
{% endif %} {% set src = blocks.get('source') %} {% if src is not none and not (src and src.error) %}
生源信息确认{% if src.message and 'Not yet open' in src.message %}未开放{% endif %}
{{ src.message or '状态未知' }}
{% elif src and src.error %}
生源信息不可用:{{ src.error }}
{% endif %}
{# ============================ 校园记录 ============================ #}

校园记录

{% set dorm = blocks.get('dorm') %} {% if dorm and not dorm.error %}
住宿{% if dorm.info.get('On Campus Dormitory') %}{{ dorm.info.get('On Campus Dormitory') }}{% endif %}
{% if dorm.applications %} {% for a in dorm.applications[:8] %}{% endfor %}
申请号类型事由时间状态
{{ a.application_no or '—' }}{{ a.application_type or '—' }}{{ a.reason or '—' }}{{ a.date_time or '—' }}{% if a.status %}{{ a.status }}{% else %}—{% endif %}
{% else %}
暂无住宿申请记录。
{% endif %}
{% elif dorm and dorm.error %}
住宿信息不可用:{{ dorm.error }}
{% endif %} {% if vh is not none and not (vh and vh.error) %}
志愿服务总时长 {{ vh.total_time or '—' }} · {{ vh.entries | length }} 条
{% if vh.entries %} {% set vs = namespace(prev='') %}{% for e in vh.entries %}{% set cur = e.year ~ '|' ~ e.source %}{% endfor %}
学年来源服务名称时间时长(h)
{% if cur == vs.prev %}{{ e.year }}{% else %}{{ e.year }}{% endif %}{% if cur == vs.prev %}{{ e.source }}{% else %}{{ e.source }}{% set vs.prev = cur %}{% endif %}{{ e.name }}{{ e.time_text }}{{ e.hours }}
{% else %}
暂无志愿服务记录。
{% endif %}
{% elif vh and vh.error %}
志愿服务不可用:{{ vh.error }}
{% endif %} {% set ho = blocks.get('honors') %} {% if ho is not none and not (ho and ho.error) %}
荣誉{% if ho %}{{ ho | length }} 条{% else %}暂无{% endif %}
{% if ho %} {% for h in ho[:10] %}{% endfor %}
荣誉级别日期状态
{{ h.name or '—' }}{{ h.level or '—' }}{{ h.date or '—' }}{% if h.status %}{{ h.status }}{% else %}—{% endif %}
{% else %}
暂无荣誉记录。
{% endif %}
{% elif ho and ho.error %}
荣誉不可用:{{ ho.error }}
{% endif %} {% set lv = blocks.get('leave') %} {% if lv is not none and not (lv and lv.error) %}
请假{% if lv %}{{ lv | length }} 条{% else %}暂无{% endif %}
{% if lv %} {% for l in lv[:10] %}{% endfor %}
申请号类型开始结束状态
{{ l.application_no or '—' }}{{ l.leave_type or '—' }}{{ l.start or '—' }}{{ l.end or '—' }}{% if l.status %}{{ l.status }}{% else %}—{% endif %}
{% else %}
暂无请假记录。
{% endif %}
{% elif lv and lv.error %}
请假不可用:{{ lv.error }}
{% endif %} {% set pr = blocks.get('practice') %} {% if pr is not none and not (pr and pr.error) %}
社会实践{% if pr %}{{ pr | length }} 条{% else %}暂无{% endif %}
{% if pr %} {% for p in pr[:10] %}{% endfor %}
项目组织开始结束时长状态
{{ p.title or '—' }}{{ p.organization or '—' }}{{ p.start or '—' }}{{ p.end or '—' }}{{ p.hours or '—' }}{% if p.status %}{{ p.status }}{% else %}—{% endif %}
{% else %}
暂无社会实践记录。
{% endif %}
{% elif pr and pr.error %}
社会实践不可用:{{ pr.error }}
{% endif %} {% set dc = blocks.get('discipline') %} {% if dc is not none and not (dc and dc.error) %}
违纪{% if dc %}{{ dc | length }} 条{% else %}暂无{% endif %}
{% if dc %} {% for d in dc[:10] %}{% endfor %}
日期类别描述状态
{{ d.date or '—' }}{{ d.category or '—' }}{{ d.description or '—' }}{% if d.status %}{{ d.status }}{% else %}—{% endif %}
{% else %}
暂无违纪记录。
{% endif %}
{% elif dc and dc.error %}
违纪信息不可用:{{ dc.error }}
{% endif %} {% set ap = blocks.get('appointments') %} {% if ap is not none and not (ap and ap.error) %}
心理预约{% if ap.entries %}{{ ap.entries | length }} 个时段{% else %}{{ ap.week or '本周' }} 无预约{% endif %}
{% if ap.entries %} {% for s in ap.entries %}{% endfor %}
日期时间内容
{{ s.date or s.day }}{{ s.time }}{{ s.text }}
{% else %}
本周无预约。
{% endif %}
{% elif ap and ap.error %}
预约信息不可用:{{ ap.error }}
{% endif %} {% set le = blocks.get('leaving') %} {% if le is not none and not (le and le.error) %}
离校检查{% if le.message and 'no task' in le.message %}无离校任务{% endif %}
{{ le.message or '状态未知' }}
{% elif le and le.error %}
离校检查不可用:{{ le.error }}
{% endif %}
{# ============================ 社团与资助 ============================ #}

社团与资助

{% if cl is not none and not (cl and cl.error) %}
我的社团{{ cl | length }} 个
{% if cl %} {% for c in cl %}{% endfor %}
学年社团发起人发起截止当前人数
{{ c.academic_year or '—' }}{{ c.club_name or '—' }}{{ c.founder or '—' }}{{ c.initiation_deadline or '—' }}{{ c.initiators or '—' }}
{% else %}
暂未加入社团。
{% endif %}
{% elif cl and cl.error %}
我的社团不可用:{{ cl.error }}
{% endif %} {% set og = blocks.get('orgs') %} {% if og is not none and not (og and og.error) %}
社团目录{{ og | length }} 个
{% if og %}
{% for o in og %}{{ o.name }}{% endfor %}
{% else %}
目录为空。
{% endif %}
{% elif og and og.error %}
社团目录不可用:{{ og.error }}
{% endif %} {# 社团简介:随包内置的离线数据(改写自 WikiLake),不依赖登录 #} {% set cw = club_wiki %} {% if cw and cw.clubs %}
社团简介WikiLake · {{ cw.clubs | length }} 个
摘要改写自 WikiLake({{ cw.meta.source }},{{ cw.meta.fetched }} 抓取)。原文版权归其贡献者,此处不含负责人信息与照片。
{% for c in cw.clubs %} {% endfor %}
社团简介原文
{{ c.name }}{{ c.summary }}WikiLake
{% endif %} {% set at = blocks.get('activities') %} {% if at is not none and not (at and at.error) %}
社团活动{% if at %}{{ at | length }} 条{% else %}暂无{% endif %}
{% if at %}
{% for a in at[:30] %}{{ a.name or a.title or a }}{% endfor %}
{% else %}
暂无活动报名记录。
{% endif %}
{% elif at and at.error %}
社团活动不可用:{{ at.error }}
{% endif %} {% set ad = blocks.get('aid') %} {% if ad is not none and not (ad and ad.error) %}
贷款 / 勤工助学 / 海外交流贷款 {{ ad.loans | length }} · 岗位 {{ ad.jobs | length }} · 交流 {{ (ad.outbound | length) + (ad.exchange | length) }}
贷款援助
{{ ad.loans | length }} 条
贷款申请
{{ ad.loan_app | length }} 条
还款计划
{{ ad.repay | length }} 条
海外交流
{{ ad.outbound | length }} 条
交换申请
{{ ad.exchange | length }} 条
勤工助学
{{ ad.jobs | length }} 个
{% if ad.claim_notice %}
工时申报:{{ ad.claim_notice }}
{% endif %}
{% elif ad and ad.error %}
资助信息不可用:{{ ad.error }}
{% endif %}
{% endblock %} {% block scripts %} {% endblock %}