AACPOJ 班級與組織管理操作指南


posted on April 17, 2026, 3:35 p.m.

這篇給誰看

本文是 AACPOJ 的班級與課程管理操作指南。如果你是管理員(課程管理員 / 班級管理員 / 網站管理員),往下展開每個操作看完整步驟。如果你是學生,看前面兩個章節了解系統全貌也很有幫助。

每個操作會標示所需權限:網站管理員 課程管理員以上 班級管理員以上。課程管理員自動擁有旗下所有班級的管理權限。


系統全景

AACPOJ 以「課程 → 班級 → 作業/考試/資源」為主軸。課程是最外層教學單位(例如「Level 0」「Level 1」),班級是課程底下的實際教學班別(例如「Level 1 — 2026 春季班」),所有教學活動(作業、公告、錄影、投影片、協作室、考試)都掛在班級上。

課程 Course
 └─ 班級 Class
     ├─ 作業 Assignment
     │   └─ 題目 AssignmentProblem
     │       ├─ 學生狀態(judge + self-report)
     │       └─ 題目資源(翻譯 / 提示 / 題解)
     ├─ 班級公告
     ├─ 課堂錄影
     ├─ 教學投影片
     ├─ 示範協作室(建班時自動建立)
     └─ 相關競賽

學生加入流程目前由管理員手動加入(見下文「班級管理 → 手動新增班級成員」),不採公開申請。


權限速覽

操作 網站管理員 課程管理員 班級管理員 一般成員
編輯課程資訊 / 踢除成員
建立新班級
編輯班級資訊
手動新增班級成員
建立/編輯作業、題目、資源
管理公告 / 錄影 / 投影片
建立考試(目前限 Django 後台)
檢視全班進度
Django 後台 /admin/

常用入口

目的 URL
我所屬/管理的課程 /courses/
課程首頁 /course/<id>-<slug>
班級首頁 /course/<id>-<slug>/class/<cid>-<cslug>
班級作業 /homework/<class_id>/
外部 OJ 帳號綁定 /oj-accounts/
協作室 /collab/rooms/
筆記 /notes/

URL 格式提醒:課程和班級 URL 用 id-slug(連字號連接),例如 /course/4-lv1/class/6-lv1-2026-spring。舊的 /organization/... URL 會自動 301 導到 /course/...


課程管理 課程管理員以上

課程首頁

編輯課程資訊(介紹、Logo、管理員)

URL/course/<id>-<slug>/edit

  1. 進入課程首頁,點右上「編輯」
  2. 可修改:介紹(Markdown)、Logo、管理員列表(admins M2M)
  3. 儲存
課程名稱和 slug 不可編輯。若需改名請到 Django admin /admin/judge/course/
檢視成員與踢除
  • 成員列表:/course/<id>-<slug>/users
  • 踢除:從成員頁點「踢除」按鈕 → 確認
課程成員列表
踢除會同時從課程與所有旗下班級移除該成員。
建立新班級

URL/course/<id>-<slug>/class/new

  1. 從課程首頁點「建立班級」
  2. 填:班級名稱(全系統唯一)、slug、描述
  3. 系統自動:建 Class 記錄、建示範協作室(擁有者 = 你)、把你加入 Class.admins
  4. 自動導向班級首頁

建議命名Level 1 — 2026 春季班,避免特殊字元。


班級管理 班級管理員以上

班級首頁是整個系統的教學中心:公告、作業、投影片、錄影、最近活動、相關競賽、班級排行,全部都在這一頁。

班級首頁全景

編輯班級資訊(Google Meet / Discord / 錄影資料夾)

URL/course/<id>-<slug>/class/<cid>-<cslug>/edit

編輯班級表單
  1. 從班級首頁點右上「編輯」
  2. 可修改:名稱、描述、Google Meet URL、Discord URL、Google Drive 錄影資料夾 URL
這三個整合 URL 填滿後,學生從班級首頁一鍵進入,建議必填。班級管理員列表不在這裡改,走 Django admin /admin/judge/class/
手動新增班級成員

URLPOST /homework/<class_id>/add-member/

  1. 班級首頁或作業列表 → 「新增成員」
  2. 輸入關鍵字搜尋(帳號/姓名/Email)
  3. 確認新增 → 系統自動確保學生在課程內,再加入班級
目前學生加入流程完全靠管理員手動加人,開學前批量加最方便。

班級公告

新增 / 編輯 / 刪除公告
  • 新增:/homework/<class_id>/announcements/create/
  • 編輯:/homework/<class_id>/announcements/<ann_id>/update/
  • 刪除:/homework/<class_id>/announcements/<ann_id>/delete/

支援 Markdown,可勾選「置頂」永遠顯示在最上方。


課堂錄影

新增錄影 / 拖曳排序

URL/homework/<class_id>/recordings/create/

填:標題(如「第 3 堂 — 二分搜尋」)、上課日期、影片連結(Google Drive)。Drive 檢視 URL 會自動轉成可嵌入 URL。

同日期的錄影可用 POST /homework/<class_id>/recordings/reorder/(拖曳)調順序。


教學投影片

支援三種類型:內建 HTML 投影片、PDF、外部連結(如 Google Slides)。

新增投影片

URL/homework/<class_id>/slides/create/

  • HTML:填檔名(如 binary-search-intro.html),實體檔須先放到 /home/aacp/site/resources/slides/
  • PDF:填相對路徑(如 pdf/slides-01.pdf
  • 外部連結:直接填 URL

其他欄位:標題、slug(唯一)、所屬單元分類、排序值、可見性。

檔案部署:HTML/PDF 投影片的實體檔案要請 Anna 代放,你只在資料庫建記錄。
單元綁定(讓作業的單元名變成連結)

投影片可掛在某個 HomeworkCategory 上。學生在作業頁看到屬於該單元的題目時,單元名會變成可點擊連結,直接開投影片。

需先在 Django admin 建立對應的 HomeworkCategory(支援巢狀)。


作業系統

作業 = 一組題目 + 學生進度追蹤 + 自動同步外部 OJ 成績。題目可以是 AACPOJ 本站題、外部 OJ(CF / AtCoder / CSES / TIOJ / NCOJ)題、或閱讀/影片資源(不計分)。

班級作業列表

建立新作業

URL/homework/<class_id>/assignment/new/

新增作業表單
  1. 班級首頁 → 作業列表 → 「新增作業」
  2. 填:標題、描述(Markdown)
  3. 勾選:
    • is_active:學生可見(取消則隱藏而不刪除)
    • 「學生可見全班概覽」:允許學生看其他同學的進度
    • </ul> </li>
    • 儲存 → 跳到題目編輯頁
新增題目(AACPOJ 本站題)

URL/homework/<class_id>/<assignment_id>/problems/add/

新增題目表單
  1. OJ 選「AACPOJ」
  2. 選擇題目(下拉或搜尋)
  3. 設定分數(預設 = 題目原分)
  4. 必通過子題(選填):留空 = 必須 AC;填 1,2 = 只需通過子題 1 和 2
新增題目(外部 OJ:CF / AtCoder / CSES / TIOJ / NCOJ)
  1. OJ 選對應系統
  2. 輸入題目 ID:
    • Codeforces:1538G
    • AtCoder:abc270_e
    • CSES:題號 1194
    • </ul> </li>
    • 點「抓題名」自動填充標題
    • 設定分數
新增非題目項目(閱讀 / 影片)
  1. 類型選「閱讀資源」或「影片」
  2. 填標題、URL
  3. 不計分、不需 AC,學生可自報「已讀」
排序題目 / 編輯 / 刪除

作業題目管理頁,拖曳左側把手可改順序,右側按鈕編輯/刪除。

作業題目管理頁
  • 拖曳排序:POST /homework/<class_id>/<assignment_id>/problems/reorder/
  • 編輯:/homework/<class_id>/<assignment_id>/problems/<ap_id>/edit/
  • 刪除:/homework/<class_id>/<assignment_id>/problems/<ap_id>/delete/
檢視單題全班狀態(+ 學生上傳的程式碼)

進題目編輯頁,下方列每位學生的 judge_status、self_status、通過子題、最後更新時間。外部 OJ 題目會顯示學生自己上傳的程式碼,給教師檢閱用。

題目編輯頁含學生狀態
全班進度總覽

URL/homework/<class_id>/<assignment_id>/overview/

排行榜式表格。管理員永遠看得到;學生看得到的前提是作業勾「學生可見全班概覽」。

全班進度總覽
最近班級活動(上課前快速掌握)

URL/homework/<class_id>/updates/

顯示班上最近的提交與同步更新。

最近班級活動

題目資源:翻譯 / 提示 / 題解

全域資源 vs 作業專屬,怎麼分?
  • 全域資源:掛在 Problem(AACPOJ)或 oj+external_id(外部題),所有作業用到這題都看得到。適合通用翻譯、官方題解。
  • 作業專屬:只在該作業內顯示。適合和本週教學脈絡綁定的提示。
新增資源

URLPOST /homework/<class_id>/<assignment_id>/save-resource/

  1. 作業題目管理頁,每題旁有「+ 資源」
  2. 選類型:translation(翻譯)/ hint(提示,可多層)/ editorial(文字題解)/ video(影片講解)/ pitfall(常見錯誤)
  3. 填內容(Markdown 或 URL)
  4. 切換「全域 / 作業專屬」
  5. 儲存
編輯 / 刪除資源
  • 編輯:/homework/resource/<resource_id>/edit/
  • 刪除:/homework/resource/<resource_id>/delete/
  • 檢視:/homework/resource/<resource_id>/(投影片可直接連這個 URL,例如外部題目的中文翻譯)

成績同步

學生在外部 OJ 的 AC 紀錄不會自動進來,要觸發同步。

前置:學生綁定外部 OJ 帳號

學生必須在 /oj-accounts/ 綁定對應 OJ 的 handle。

  • 可自動同步:Codeforces、AtCoder、TIOJ、NCOJ
  • 僅能自報:CSES(無公開 API,學生自己標 ac_confident
同步特定學生 / 全班
  • 單生:POST /homework/<class_id>/<assignment_id>/sync/(題目狀態頁點學生旁「同步」)
  • 全班:POST /homework/<class_id>/<assignment_id>/sync-all/
全班同步耗時數分鐘(rate limit),別在上課中觸發。排程每日自動跑一次。

查進度:GET /homework/<class_id>/<assignment_id>/get-status/(AJAX)


考試系統

主要用於入學測驗、期末測驗:寄一次性 Token 連結給考生,限時作答。

目前限制:考試 CRUD 介面尚未做前端版,統一在 Django admin。班級管理員如需辦考試請聯絡 Anna 或網站管理員。
考試結構(Exam / Section / Question / ExamLink)
Exam
 ├─ ExamSection(區段,如「選擇題」「實作題」)
 │   └─ ExamQuestion(考卷題目,從 Question 題庫取)
 └─ ExamLink(考生連結,uuid token)
     ├─ Response(作答紀錄)
     └─ AntiCheatLog(防作弊紀錄)
建立考試(Django admin)僅網站管理員

URL/admin/exams/exam/add/

  • 基本:標題、時長、啟用、open_atclose_at
  • 選項:show_anti_cheat_warningshow_score_after_submit
  • 信件:HTML 模板、主旨、額外說明。模板變數:{{ student_name }}{{ exam_url }}{{ deadline }}{{ time_limit }}
  • 題庫:/admin/exams/question/add/ → 區段:/admin/exams/examsection/add/ → 把題目加到考卷:/admin/exams/examquestion/add/
建立考生連結並寄信 僅網站管理員

URL/admin/exams/examlink/add/

  • 填:考試、學生 Email、姓名、家長 Email(CC)、額外時間
  • 預約寄信:填 scheduled_send_at,由 crontab 自動寄
  • 立即寄信:用 admin action「Send exam links」
  • 考生連結格式:https://<exam-host>/e/<token>/
考生作答流程 URL
  • 收信點連結:/e/<token>/
  • 驗證身份:/e/<token>/verify/
  • 開始作答:/e/<token>/start/
  • 自動儲存草稿:/e/<token>/save-draft/
  • 交卷:/e/<token>/finish/
  • 查剩餘時間:/e/<token>/time/
檢視成績與防作弊紀錄 僅網站管理員
  • 成績總覽:/admin/exams/scoresoverview/
  • 防作弊紀錄:/admin/exams/anticheatlog/(切換分頁、複製、右鍵、失焦等行為)

協作編輯室

師生即時協作寫程式,像 Google Docs 但寫 C++ 用的(Monaco Editor + Yjs)。每個班建立時系統自動建一個示範協作室。

建立協作室 / 邀請成員 / 改角色
  • 建立:POST /collab/create/(從 /collab/rooms/
  • 邀請:POST /collab/invite/
    • 角色:Editor(可編輯不可提交)、Viewer(只讀)
    • 可設使用次數上限、有效期
    </li>
  • 改角色:POST /collab/change_role/(Owner 擁有完全控制,是唯一能提交程式的角色)
  • </ul>
    比賽限制:≤24 小時的短竅賽進行中協作室會被停用,防止作弊。
程式碼分享庫

/collab/share/:把常用模板(線段樹、Dijkstra、…)分享到 Level 分類庫,全站可見。上課臨時取用模板很方便。


筆記系統

兩種筆記:獨立筆記(任意)與單元筆記(綁作業單元)。完整功能介紹見 筆記系統升級

管理員檢視所有學生的獨立筆記 僅網站管理員

URL/notes/admin/

給教學診斷用,可看到所有學生的獨立筆記。


故障排除

學生說「我加不進班級」
  1. 目前學生無法自己申請加入,管理員要手動加。照「班級管理 → 手動新增班級成員」走一次就行
  2. 若加人時報錯「此班級未啟用」,檢查班級 is_active 是否為 True(到 /admin/judge/class/ 打勾)
作業成績沒同步過來
  1. 確認學生在 /oj-accounts/ 綁了該 OJ 的 handle
  2. 確認 OJ 可自動同步(CF/AtCoder/TIOJ/NCOJ 可,CSES 不可)
  3. 手動觸發「全班同步」看是否有錯誤
  4. 檢查 SyncLog.last_error/admin/homework/synclog/
投影片打不開
  1. 非班級成員無法開
  2. 檢查實體檔案:/home/aacp/site/resources/slides/<檔名>
  3. slug 打錯會 404:檢查 /admin/homework/slide/
其他問題

Slack 或 Discord 問 Anna。