系統架構總覽
Section 1
整體資料結構關係圖
┌─────────────────────────────────────────────────────┐
│ users 資料表 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ role=admin │ │role=full_ │ │
│ │ (管理員) │ │access(老師)│ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ class_groups 資料表 │ │
│ │ teacher_id ──► 老師的 user.id │ │
│ │ student_ids ──► [學生ID列表] │ │
│ └──────────────────┬───────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ users (role=study_zone/oral) │ │
│ │ 學生帳號 │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
資料流:
老師登入 → 讀取 class_groups(teacher_id = 自己)
→ 只看到自己班級的 student_ids
→ 只查詢這些學生的 activity_log / student_progress
→ 只發送訊息給這些學生
核心設計原則
老師的資料隔離是透過
class_groups.teacher_id 來實現的。
每位老師登入後,系統只查詢 teacher_id = 自己ID 的班級,
再從班級的 student_ids 清單取出學生,確保老師看不到其他班級的資料。
涉及的五張資料表
| 資料表 | 用途 | 關聯欄位 |
|---|---|---|
| users | 所有帳號(管理員、老師、學生) | id, role |
| class_groups | 班級定義,記錄哪位老師帶哪些學生 | teacher_id → users.id |
| student_progress | 學生學習進度(streak、分數等) | id = users.id |
| activity_log | 每次學習活動的詳細紀錄 | student_id → users.id |
| teacher_messages | 老師發送給學生的訊息 | teacher_id, target_id |
| weekly_tasks | 老師設定的本週學習任務 | teacher_id, class_id |
角色與權限設計
Section 2
⚙️ admin
系統管理員
負責建立所有帳號、設定班級、指派老師。通常是學校英文組長或系統負責人。
建立/刪除所有帳號
查看全部學生資料
建立/編輯班級
指派老師到班級
存取教師儀表板
存取管理員後台
🎓 full_access
老師
英文老師,只能看到並互動自己班級的學生。不能看到其他老師的班級。
存取教師儀表板
查看自己班級學生
發送訊息給自己學生
設定本週任務
匯出自己班報告
存取管理員後台
📚 study_zone
國高中學生
使用 student.html 學習平台的學生。只能看到自己的學習紀錄,不能看其他人的。
進入學習專區
接收老師訊息
查看自己進度
教師儀表板
管理員後台
看其他學生資料
🎤 oral_practice
口說練習學生
只能使用口說對話功能(chat.html)的學生,通常是口說加強班或一對一練習。
進入 AI 對話頁面
接收老師訊息
學習專區(需另外開放)
教師儀表板
管理員後台
功能權限矩陣
| 功能 | admin | full_access (老師) |
study_zone (學生) |
oral_practice (學生) |
|---|---|---|---|---|
| 🎓 教師儀表板(自己班級) | ✅ | ✅ | — | — |
| 📊 查看全部班級資料 | ✅ | — | — | — |
| 💬 發訊息給自己學生 | ✅ | ✅ | — | — |
| 📢 全校廣播訊息 | ✅ | — | — | — |
| ✅ 發布本週任務 | ✅ | ✅ | — | — |
| 📥 匯出 CSV 報告 | ✅ | ⚡ 自班 | — | — |
| ⚙️ 管理員後台 | ✅ | — | — | — |
| 👤 建立/刪除帳號 | ✅ | — | — | — |
| 📚 學習專區 | ✅ | ✅ | ✅ | — |
| 🎤 口說對話 | ✅ | ✅ | — | ✅ |
| 📨 接收老師訊息 | — | — | ✅ | ✅ |
⚡ 部分權限:只能操作自己負責的班級資料
第一步:建立帳號
Section 3 · 由管理員操作
需要管理員操作
以下步驟需以
admin 角色登入後,進入「管理員後台」(admin.html) 才能執行。
1
建立老師帳號
在管理員後台新增帳號,角色選擇
full_access。
帳號設定範例:
帳號(username):teacher_wang
顯示名稱(display_name):王大明老師
密碼:設定初始密碼(建議之後請老師自行更改)
角色(role):full_access ← 這個是老師的角色
狀態(status):active
帳號(username):teacher_wang
顯示名稱(display_name):王大明老師
密碼:設定初始密碼(建議之後請老師自行更改)
角色(role):full_access ← 這個是老師的角色
狀態(status):active
💡 角色說明
老師的角色是
一個學校可以有多位老師(full_access),但 admin 建議只有 1~2 人。
full_access,不是 admin。admin 只給系統管理員(通常是英文組長或資訊老師)。一個學校可以有多位老師(full_access),但 admin 建議只有 1~2 人。
2
建立學生帳號
每位學生建立一個帳號,角色選擇
study_zone(學習專區)或 oral_practice(口說練習)。
帳號設定範例(學生):
帳號(username):student_b11001 ← 建議用學號
顯示名稱(display_name):陳小明
密碼:初始密碼(如生日 0915 或學號後4碼)
角色(role):study_zone ← 一般學生
狀態(status):active
備注(note):高一忠班 座號01 ← 方便管理
帳號(username):student_b11001 ← 建議用學號
顯示名稱(display_name):陳小明
密碼:初始密碼(如生日 0915 或學號後4碼)
角色(role):study_zone ← 一般學生
狀態(status):active
備注(note):高一忠班 座號01 ← 方便管理
批量建立帳號技巧
如果有 30 位學生,可以用統一格式:
帳號:
初始密碼:統一設為
備注欄:填入班級座號,方便之後設定班級時查找
帳號:
b11001 ~ b11030(班級+座號)初始密碼:統一設為
wayne123,學生首次登入後自行更改備注欄:填入班級座號,方便之後設定班級時查找
3
記錄每位老師和學生的系統 ID
建立帳號後,系統會自動產生唯一 ID(UUID格式)。這個 ID 是之後設定班級時的關鍵。
如何找到 ID:
1. 在管理員後台,點選該帳號的「詳情」
2. 或透過 API 查詢:GET tables/users?search=teacher_wang
3. 找到 "id" 欄位,如:
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
📌 建議:把老師和學生的 ID 記在試算表上,
方便後續建立班級時使用。
1. 在管理員後台,點選該帳號的「詳情」
2. 或透過 API 查詢:GET tables/users?search=teacher_wang
3. 找到 "id" 欄位,如:
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
📌 建議:把老師和學生的 ID 記在試算表上,
方便後續建立班級時使用。
第二步:設定班級分組
Section 4 · 由管理員操作
班級設定儲存在 class_groups 資料表。每個班級記錄「哪位老師」負責「哪些學生」,
這是實現老師資料隔離的關鍵。
建立班級的方法(透過 Admin 後台)
A
開啟管理員後台 → 班級管理
登入後進入 admin.html,找到「班級管理」區塊(若尚未有此頁面,可使用 API 直接建立)
直接透過 API 建立班級(推薦方式)
// 建立高一忠班(透過瀏覽器 Console 或 Postman)
fetch('tables/class_groups', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: 'class_senior1A', // 自訂班級ID(英數字)
class_name: '高一忠班',
grade: 'senior1',
teacher_id: '老師的UUID', // ← 填入老師的 users.id
teacher_name: '王大明老師',
student_ids: [ // ← 填入所有學生的 users.id
'學生A的UUID',
'學生B的UUID',
'學生C的UUID'
],
description: '113學年度高一忠班英文',
is_active: true
})
});
完成後效果
老師
teacher_wang 登入教師儀表板後,班級下拉選單只會出現「高一忠班」,
學生清單也只顯示 student_ids 中列出的學生。
grade 年級代碼對照表
| 代碼 | 說明 | 對應課程 |
|---|---|---|
| elementary | 國小 | elementary.html 國小英語學習樂園 |
| junior1 | 國中一年級 | student.html(國中模式) |
| junior2 | 國中二年級 | student.html(國中模式) |
| junior3 | 國中三年級(會考) | student.html(國中模式) |
| senior1 | 高中一年級 | student.html(高中模式) |
| senior2 | 高中二年級 | student.html(高中模式) |
| senior3 | 高中三年級(學測) | student.html(高中模式) |
📌 實際案例:一位老師帶兩個班
老師:林美慧老師(teacher_lin)
負責班級一:高二仁班(30名學生)
負責班級二:高二義班(28名學生)
建立兩筆 class_groups:
→ class_senior2B:teacher_id = teacher_lin 的ID,student_ids = [30個學生ID]
→ class_senior2C:teacher_id = teacher_lin 的ID,student_ids = [28個學生ID]
林老師登入後,班級選單出現「高二仁班」、「高二義班」兩個選項。
負責班級一:高二仁班(30名學生)
負責班級二:高二義班(28名學生)
建立兩筆 class_groups:
→ class_senior2B:teacher_id = teacher_lin 的ID,student_ids = [30個學生ID]
→ class_senior2C:teacher_id = teacher_lin 的ID,student_ids = [28個學生ID]
林老師登入後,班級選單出現「高二仁班」、「高二義班」兩個選項。
第三步:綁定師生關係
Section 5
完整資料設定流程
admin 建立
老師帳號
老師帳號
admin 建立
學生帳號
學生帳號
記錄所有人
的 ID
的 ID
建立
class_groups
class_groups
填入
teacher_id
teacher_id
填入
student_ids
student_ids
老師登入
儀表板
儀表板
只看到
自己的班級
自己的班級
只能互動
自己的學生
自己的學生
新增學生到現有班級(學期中轉班)
// 取得現有班級資料,再加入新學生
// 步驟一:取得目前的 student_ids
const r = await fetch('tables/class_groups/class_senior1A');
const cls = await r.json();
const currentIds = cls.student_ids || [];
// 步驟二:加入新學生
const newIds = [...currentIds, '新學生的UUID'];
// 步驟三:更新班級
fetch('tables/class_groups/class_senior1A', {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ student_ids: newIds })
});
從班級移除學生(轉班、退學)
// 移除特定學生的 ID
const newIds = currentIds.filter(id => id !== '要移除的學生UUID');
fetch('tables/class_groups/class_senior1A', {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ student_ids: newIds })
});
// ⚠️ 注意:移除學生只是把他從班級移出
// 不會刪除學生的帳號或學習紀錄
權限隔離機制說明
Section 6 · 技術說明
teacher.html 隔離機制(程式碼說明)
// teacher.html 登入後的資料載入流程:
// 1. 取得登入老師的 ID
const sess = getSession();
const teacherId = sess.id; // 老師自己的 ID
// 2. 只載入「自己負責」的班級
const r = await fetch(`tables/class_groups?limit=50`);
const allClasses = await r.json();
// 3. 過濾:只保留 teacher_id = 自己的班級
const myClasses = allClasses.data.filter(c => c.teacher_id === teacherId);
// ↑ 其他老師的班級在這裡被過濾掉了
// 4. 從自己的班級取出學生ID清單
const myStudentIds = myClasses.flatMap(c => c.student_ids);
// 5. 只查詢這些學生的資料
const allUsers = await fetch('tables/users?limit=200');
const myStudents = allUsers.data.filter(u => myStudentIds.includes(u.id));
// ↑ 其他班級的學生在這裡被過濾掉了
// 結論:老師只能看到 myStudents 這份清單
重要:這是前端過濾,不是後端權限控制
目前的隔離機制是在前端 JavaScript 進行過濾。技術上,有能力的人可以透過瀏覽器直接呼叫 API 取得其他班級資料。
如果需要完整的後端權限控制,需要在遷移到 GCP 後使用 Firebase Rules 或 Cloud Functions 實作。
對於學校內部使用,前端隔離已足夠。
admin 與老師看到的差異
| 功能 | admin 看到 | 老師(full_access)看到 |
|---|---|---|
| 班級選單 | 全校所有班級 | 只有自己的班級 |
| 學生清單 | 全校所有學生 | 只有自己班級的學生 |
| 訊息發送對象 | 全校學生 + 全班廣播 | 只有自己班級的學生 |
| 學習紀錄 | 全校學習紀錄 | 只有自己學生的紀錄 |
| 報告匯出 | 全校報告 | 只有自己班級報告 |
| 任務發布 | 全校 / 指定班級 | 只限自己的班級 |
班級總覽操作說明
Section 7
儀表板各區塊說明
| 區塊 | 說明 | 更新頻率 |
|---|---|---|
| 班級學生人數 | class_groups.student_ids 的總數 | 即時 |
| 本週活躍人數 | 7天內有 last_study_date 紀錄的學生數 | 重新整理時更新 |
| 全班平均分數 | student_progress.total_score 的平均值 | 重新整理時更新 |
| 需要關注學生 | 超過3天沒有學習紀錄的學生(紅色警示) | 重新整理時更新 |
| 每日學習人數 | 本週每天的學習人數趨勢(Bar 圖) | 重新整理時更新 |
| 積分排行榜 | 本班學生 total_score 降冪排列 | 重新整理時更新 |
| 模組使用分布 | 文法/單字/閱讀等各模組使用比例圓餅圖 | 重新整理時更新 |
需要關注的學生警示
🔴 從未使用
帳號建立後從未登入,可能需要告知學生帳號資訊或確認帳號是否正確
⚠️ 超過3天未學習
近期沒有學習紀錄,建議發送「學習提醒」訊息給該學生
發送訊息給學生
Section 8
五種訊息類型說明
| 類型 | 適用情境 | 建議用語 |
|---|---|---|
| 💪 加油鼓勵 | 學生最近分數下滑、許久未登入 | 「這週加油哦!每天練習10分鐘就夠了!」 |
| ⭐ 讚美表揚 | 學生本週進步、達成任務、連續學習 | 「你這週的文法進步好多!繼續保持!」 |
| 📢 學習提醒 | 考試前、重要單元、定期學習提醒 | 「下週考時態,記得多練習完成式!」 |
| 📋 任務指派 | 搭配本週任務功能使用,告知任務內容 | 「本週任務已發布,請完成5次文法練習!」 |
| 📌 公告通知 | 班級公告、系統維護、課程異動 | 「本週四無課,請提前完成本週學習進度。」 |
發送訊息步驟
1
選擇發送對象
「全班廣播」:發給自己班級的所有學生
「個別學生」:從下拉選單選擇特定學生(只顯示自己班級的學生)
「個別學生」:從下拉選單選擇特定學生(只顯示自己班級的學生)
2
填寫訊息內容
選擇訊息類型 → 填入標題 → 填入內容 → 選擇表情符號 → 設定到期日(可選)
3
學生何時看到?
學生下次登入 student.html 後,約 2 秒後右側會自動彈出訊息通知面板。
學生點「已讀」後,訊息不再出現。
快速發送提醒:從警示清單直接發送
在「班級總覽」的「需要關注的學生」區塊,每位學生右側都有「發送提醒」按鈕,
點擊後會自動切換到「發送訊息」頁面並帶入該學生,省去手動選擇的步驟。
設定本週任務
Section 9
任務設定欄位說明
| 欄位 | 說明 | 範例 |
|---|---|---|
| 任務標題 | 學生看到的任務名稱 | 本週文法衝刺! |
| 任務說明 | 詳細描述任務要求 | 請完成「時態」和「被動語態」各一次練習 |
| 指定模組 | 限定哪個學習模組(可選「任意模組」) | grammar(文法) |
| 目標次數 | 學生需完成幾次練習 | 5 次 |
| 目標分數 | 每次練習需達到的分數 | 70 分以上 |
| 開始日 | 任務開始日期 | 2025-04-28(週一) |
| 截止日 | 任務截止日期 | 2025-05-04(週日) |
| 指定班級 | 只有此班級的學生需完成 | 高一忠班 |
📌 設定範例:學測衝刺任務
標題:「學測最後衝刺!本週閱讀任務」
說明:「請完成學測閱讀測驗練習,每次需達70分以上,本週至少完成3次。加油!」
模組:閱讀(reading)
目標次數:3 次 | 目標分數:70 分
期間:2025-04-28 ~ 2025-05-04
班級:高三甲班
說明:「請完成學測閱讀測驗練習,每次需達70分以上,本週至少完成3次。加油!」
模組:閱讀(reading)
目標次數:3 次 | 目標分數:70 分
期間:2025-04-28 ~ 2025-05-04
班級:高三甲班
建議搭配訊息功能使用
發布任務後,同時發送一則「📋 任務指派」類型的訊息給學生,
讓學生登入時立即看到任務通知,提高完成率。
匯出學習報告
Section 10
CSV 匯出內容說明
CSV 欄位順序:
姓名, 帳號, 累計分數, 單字量, 連續天數, 等級, 上次學習日期
範例資料:
陳小明, b11001, 1580, 45, 7, senior, 2025-04-23
林大華, b11002, 820, 28, 3, junior, 2025-04-21
王美玲, b11003, 2100, 67, 14, senior, 2025-04-23
如何使用匯出的 CSV
- 用 Excel 或 Google Sheets 開啟(注意選 UTF-8 編碼,避免中文亂碼)
- 依「累計分數」排序,了解班級整體程度分布
- 找出「上次學習日期」超過一週的學生,進行個別輔導
- 作為學期平時成績的參考依據
- 每月固定匯出一次,追蹤全班進步趨勢
資料表欄位完整說明
Section 11 · 技術參考
users — 帳號資料表
| 欄位名稱 | 類型 | 說明 | 必填 |
|---|---|---|---|
| id | text | 系統自動產生的唯一ID(UUID) | 自動 |
| username | text | 登入帳號(建議用學號,如 b11001) | 必填 |
| password_hash | text | SHA-256 加密後的密碼(由系統處理) | 必填 |
| display_name | text | 顯示名稱(中文名字) | 必填 |
| role | text | 角色:admin / full_access / study_zone / oral_practice | 必填 |
| status | text | 帳號狀態:active / suspended | 必填 |
| text | 電子郵件(選填) | 選填 | |
| avatar_key | text | 頭像設定(study/daily/admin) | 選填 |
| last_login | datetime | 最後登入時間(系統自動更新) | 自動 |
| login_count | number | 累計登入次數(系統自動累加) | 自動 |
| note | text | 管理員備注(如:高一忠班 座號01) | 選填 |
class_groups — 班級資料表(最重要)
| 欄位名稱 | 類型 | 說明 | 必填 |
|---|---|---|---|
| id | text | 班級唯一ID(自訂,如 class_senior1A) | ⭐ 關鍵 |
| class_name | text | 班級名稱(如:高一忠班) | 必填 |
| grade | text | 年級代碼(見 Section 4) | 必填 |
| teacher_id | text | ⭐ 老師的 users.id(這決定哪位老師管這個班) | ⭐ 關鍵 |
| teacher_name | text | 老師顯示名稱(方便查看) | 必填 |
| student_ids | array | ⭐ 學生 users.id 的陣列(這決定老師看哪些學生) | ⭐ 關鍵 |
| description | text | 班級說明(如:113學年度高一英文) | 選填 |
| is_active | bool | 是否啟用(false=停用,學期結束後設為 false) | 必填 |
activity_log — 學習活動記錄(自動產生)
| 欄位名稱 | 說明 |
|---|---|
| student_id | 學生的 users.id |
| student_name | 學生顯示名稱 |
| module | 模組:grammar / vocab / reading / listening / exam / music / game / chat |
| action | 動作:start(開始)/ complete(完成)/ score(得分)/ login(登入) |
| topic | 題目或活動名稱(如:時態綜合、Shape of You) |
| score | 本次得分 |
| max_score | 滿分 |
| duration_sec | 學習時長(秒) |
| log_date | 記錄日期 YYYY-MM-DD |
此資料表由學生端 student.html 自動寫入,管理員和老師無需手動操作。
常見問題 FAQ
Section 12
❓ 老師登入後看不到任何學生?
原因:class_groups 沒有設定,或 teacher_id 填錯了。
解法:
解法:
- 確認 class_groups 資料表有該老師的班級記錄
- 確認 teacher_id 填的是老師的
users.id(UUID格式),不是 username - 確認 is_active = true
- 請老師重新登入,或按「重新整理」按鈕
❓ 學生的學習進度沒有顯示在老師儀表板?
原因:student_progress 資料表沒有該學生的記錄。
解法:
解法:
- 學生需要先登入 student.html 並完成至少一次學習活動
- 進度每60秒自動同步一次,請等待後重試
- 確認學生帳號的 id 與 class_groups.student_ids 中的 ID 一致
❓ 老師發送的訊息學生沒收到?
可能原因:
- 學生尚未登入(訊息在下次登入後才會出現)
- 訊息的 target_id 填錯(確認是學生的 users.id)
- 訊息已過期(expire_date 已過)
- 學生已點「已讀」(is_read = true)
❓ 如何新增一位老師?
步驟:
- admin 登入 admin.html
- 建立新帳號,role 設為
full_access - 記下新老師帳號的 users.id
- 建立或更新 class_groups,將 teacher_id 設為新老師的 ID
- 新老師即可登入 teacher.html 看到自己的班級
❓ 學期結束後如何處理舊班級?
建議做法:
- 將舊班級的
is_active設為false(不要刪除,保留歷史紀錄) - 建立新學期的班級(新的 class_groups 記錄)
- 學生帳號保留,進度累積,不需重新建立
- 視需要更新學生的 class_id 對應關係
❓ 可以讓一位學生同時屬於兩個班級嗎?
可以。只需在兩個 class_groups 的 student_ids 中都加入該學生的 ID。
例如:一位學生同時在「一般英文班」和「口說加強班」,兩位老師都可以在自己的儀表板看到他。
例如:一位學生同時在「一般英文班」和「口說加強班」,兩位老師都可以在自己的儀表板看到他。
快速設定清單
Section 13 · 學期初必做
學期初設定 Checklist
- 建立 admin 帳號 — 系統負責人,role = admin
- 建立老師帳號 — 每位英文老師一個帳號,role = full_access
- 建立學生帳號 — 每位學生一個,role = study_zone,建議用學號當 username
- 記錄所有帳號的 ID — 從 admin.html 或 API 取得 users.id(UUID格式)
- 建立班級(class_groups) — 填入 teacher_id 和 student_ids
- 測試老師登入 — 確認教師儀表板能看到正確班級和學生
- 測試學生登入 — 確認能進入學習專區,完成一次練習
- 測試訊息功能 — 老師發送測試訊息,確認學生登入後能看到
- 發布使用說明給學生 — 告知學生帳號、密碼、登入網址
- 設定第一週任務 — 讓學生有明確的學習目標
每週建議操作
| 時間 | 操作 | 目的 |
|---|---|---|
| 週一早上 | 發布本週任務 + 全班鼓勵訊息 | 設定學習目標,提高動機 |
| 週三 | 查看班級總覽,找出未學習學生 | 及時發提醒訊息 |
| 週五 | 查看本週完成進度,讚美表現好的學生 | 正向回饋,強化習慣 |
| 月底 | 匯出 CSV 報告,記錄學習成果 | 作為平時成績依據 |
設定完成!
完成以上設定後,老師就能在教師儀表板看到自己班級學生的完整學習狀況,
並透過訊息和任務與學生互動,打造更緊密的師生學習關係。