醫智匯

classroom-live

classroom-live

怎麼用

打開你的 AI 助手,把下面這句話貼給它。下面那一大段是寫給它看的,你不必讀。

請照平台的 classroom-live 這個 skill 幫我做

適用:授課老師(臨床教師、護理部在職教育、教學部)想在課堂上即時收學生的作答——

「預先出題、學生限時作答、作答完公布(或不公布)答案、接著下一題」,或像 Slido 的即時問卷。

這份做法附完整、測過的範本(參考檔 references/template.md 的三個檔案)。原樣寫進資料夾、先存成第 1 版走過一輪,再依老師的需求改;不要從零重寫、不要精簡。

先問清楚

  • 學生是誰?院內同仁(院方 Google 帳號)或實習生(多半是個人 Gmail)。
  • 有實習生:開放程度一定要用 listed(只有名單上的人),而且平台要開「一級應用名單可以加個人 Gmail」——

用 wanfangai_status 看不出來就先做,發佈試用版後實測一位實習生加入;被擋(workspace_required)就請他問平台管理員是否已開放。

  • 題目誰出?範本是老師在工具裡出題(題組),正確答案只有老師讀得到。
  • 要不要公布答案?每題都可以選:按「公布答案」學生就看到對錯;不按直接下一題就不公布。
  • 要不要記名?平台的紀錄一定帶作答者的名字(老師的結果頁看得到誰答什麼)。投影的畫面只顯示人數與分布,不顯示名字。

要「完全匿名」做不到——跟老師說清楚。

平台怎麼擋(不要自己在畫面上判斷權限)

宣告檔的角色與資料袋(app-manifest.yml)決定誰能讀寫什麼,平台在伺服器上擋,改網頁也繞不過:

security_level: 1
visibility: listed          # 只有名單上的人;學生用加入連結進名單
data:
  collects: [staff_identity, quiz_response]
  contains_staff_info: false   # 只有學生自己按按鈕加入、作答時帶出的姓名 → 仍是一級
  contains_patient_info: false
roles:
  teacher:
    label: 老師
    description: 出題、主持、看結果、管理名單
    manage_members: true
  student:
    label: 學生
    description: 加入課堂、作答
access:
  quizzes:                  # 題組(含正確答案):學生讀不到
    teacher: [read, create, update, delete]
  sessions:                 # 每一場的狀態(第幾題、開放/截止/公布):學生只能讀
    teacher: [read, create, update, delete]
    student: [read]
  responses:                # 作答:學生只能新增、只讀得到自己的
    teacher: [read, delete]
    student: [create, read_own]
skills_used: [classroom-live]
  • 負責人(老師本人)什麼都能做,不用把自己加進名單;要第二位老師一起主持,在應用管理頁「成員」把他加成「老師」。
  • 加入連結只能給「學生」這種不能管理成員的角色(平台會擋)。
  • 正確答案放在 quizzes(學生讀不到);老師按「公布答案」時才把答案寫進 sessions(學生讀得到)。不要把答案寫在網頁程式裡——網頁的原始碼誰都看得到。

網址與分班

  • 每一場(一個班、一堂課)有自己的代碼:https://<代號>.apps.<平台網域>/<10 碼英數>,例如 /k3f9x2m7qa。代碼是隨機產生的,別人猜不到。

平台找不到檔案的路徑會回首頁那一頁,頁面自己讀網址裡的代碼(不用另外設定,也不要放 404.html——放了這招就失效)。

  • 每筆作答都帶這一場的代碼(uid),老師的畫面依代碼篩選(UberTeach.data.list({ query: { uid } })),所以同一份題組用在不同班,紀錄自然分開。
  • 分班是應用自己記的,平台不擋「A 班學生打開 B 班的網址」;課堂互動通常沒關係(老師看得到名字)。不同老師要彼此看不到,各自複製一份應用。

學生怎麼加入(加入連結)

老師按「開始上課」時,範本用 UberTeach.members.createJoinLink({ role: 'student', minutes: 120, next: '/' + uid }) 開一個加入連結,

並把它做成 QR code 顯示在主持畫面上(書架的 qrcode-generator):

  • 學生掃 QR code → 登入(院方帳號或個人 Gmail)→ 平台的加入頁按「加入」→ 進名單,直接到這一場的頁面。
  • 連結預設開放 2 小時(一堂課),時間到就失效;老師也可以在應用管理頁「成員 → 加入連結」停用。
  • 課程結束,老師按「清空學生名單」(UberTeach.members.clear({ role: 'student' }));學生的作答留著,結果照樣看得到。

members 的功能本機預覽不能用(沒有名單);要發佈試用版才測得到。

即時的程度與限制(跟老師說清楚)

  • 不是推播,是每隔幾秒去讀一次:學生每 3 秒、老師每 4 秒,所以換題、出結果會晚個幾秒。

平台每個人每個應用每分鐘最多 60 次,這個頻率夠用;不要調得更快(會被擋 rate_limited)。

  • 一次最多讀 50 筆:範本的 all() 會一頁一頁讀完。一班超過 100 人時,老師的即時統計改成每 6–8 秒讀一次。
  • 倒數計時在學生的瀏覽器算:老師的統計只算截止後 5 秒內送到的(用平台記下的送出時間),晚交的不算。
  • 每個應用最多 1 萬筆紀錄(作答、場次、題組合計)。一班 50 人、每堂 10 題約 500 筆;大約 20 堂課要請老師到應用管理頁匯出 CSV、刪掉舊場次。
  • 平台的 AI 目前關閉,範本不用 AI。

範本怎麼用(照抄,不要改寫)

範本是參考檔 references/template.md:用 wanfangai_read_skill(name: classroom-live、file: references/template.md)讀,裡面三個檔案

index.html、style.css、app.js(約 20 KB)。

  • 三個檔案原樣寫進資料夾最上層,一個字都不要改——不要精簡、不要重寫、不要合併。

2026-10-15 演練站實跑:AI 助手把範本重寫成 6.6 KB,選項按了不反白、送出沒有回饋(學生重複送出)、不會倒數、時間到不截止、

作答數算成筆數、公布答案時看不到答案、沒有結果頁——還跟老師說這些都有。範本裡這些都做好了。

  • 宣告檔照上面「平台怎麼擋」寫,存成第 1 版、發試用版。
  • 自己打開試用版走一輪(下面「說『做好了』之前」的 1、3、4、5),再請老師用另一個帳號當學生。
  • 確認都對了,才照「依需求改」改成老師要的樣子;改了「下一題、截止、公布、結果」相關的程式,要再走一輪。

依需求改

  • 只要即時問卷(Slido 式),不考試:題目都用「評分」或「簡答」,不設正確答案;「公布答案」按鈕自然不能按。
  • 加題型:在 TYPE_LABEL 加一種,editQuiz 的表單、學生端 render 的作答方式、老師端統計各加一段。
  • 改畫面文字、顏色:改 style.css 與畫面字串;不要改角色與資料袋的名稱(改了要重新發佈,名單上的人也會暫時沒有權限)。
  • 畫面上放的內容一律用 textContent(範本的 el()),不要用 `innerHTML` 放學生打的字。

說「做好了」之前

照平台在試用版發佈完給的四項檢查,再加這幾項(自己做不到的,列給老師請他做):

  • 老師開一場:主持畫面有 QR code 與加入連結。
  • 另一個帳號(最好是實習生的個人 Gmail)掃 QR code 加入,看得到「已加入,等老師出題…」。
  • 老師按「下一題」→ 學生的畫面幾秒內換成題目與倒數 → 學生送出 → 老師的「已作答」人數與長條圖更新。
  • 截止 → 公布答案 → 學生看到對錯。
  • 結果頁:每題答對率、每位學生的題數;「下載 CSV」打得開、中文不是亂碼。
  • 學生打開 /results/<代碼> 只看到「請用老師給的連結進入」;學生的頁面去讀 quizzes(題組與答案)會被平台擋(app_role_required)——這是對的。