🏛️ #46 場地預約系統:禮堂只是招牌 — 骨子裡是 10 場地 × 學校節次 × LINE 三階段通知 × AI 衝突解析的中央調度系統
#46 不是只預約禮堂 — 是 10 個場地(禮堂、智慧教室、電腦教室、森林小屋、4 台 IPAD 平板車、校史室)統一調度。學校節次制(非半小時格)+ 沒有審核流程(任何人直接預約 + deviceId Rate Limit)+ LINE Flex Message 三階段通知 + Gemini AI 智慧衝突解析 + Gmail 風 30 秒 Undo + AI 學期報告。v2.50.6 累積 50+ 版的真實生產級系統。
場景:以前怎麼搶禮堂?
學期初印一張紙本月曆貼在總務處公佈欄,老師走過去寫名字。 問題不勝枚舉:
- 第一個寫的人通常是辦公室離總務處最近的(不公平)
- 寫錯要塗改、撕了重貼
- 時段重疊看不到
- 行政組長要每週手動拍照給校長 review
- 校外單位想借禮堂得打電話確認
#46 真實技術細節(不是 Google Calendar 風格半小時格!)
功能 A:10 個場地統一調度
- 禮堂、智慧教室 C304、2 間電腦教室、森林小屋、4 台 IPAD 平板車(三~六年級)、校史室
- 「禮堂」只是招牌,骨子裡是學校場地中央調度系統
功能 B:學校節次制(不是半小時格!)
- 採學校真實節次:晨間 / 第一節 ~ 第七節 / 午休 / 打掃⋯ 約 12 個 slot
- 不是想像中的 Google Calendar 風 48 個半小時方格
功能 C:週視圖 + 月視圖切換
- 月視圖格內直接顯示「節次簡稱 + 借用者」
- 衝突熱度染色(綠 → 黃 → 橘 → 紅)
功能 D:衝突時的智慧替代方案(規則演算法,不是 AI 模型)
- 被擋時即時在瀏覽器裡算出可用的替代方案:「鄰近日期 / 換場地 / 換時段」三種,最多列 4 個
- 依「當天已被借幾節」排序,自動排除週末與固定不開放的時段
- 平板車還會跨年級互推(優先推當天最空的那一台)
功能 E:完全沒有審核流程!(最反直覺設計)
- 任何人打開網頁都可預約,不需登入
- 防灌水只靠 deviceId + Rate Limiting(每小時 30 次、每天 100 次)
- 管理員用 Firebase Auth 登入才有「取消他人預約 / 批次取消 / 設定不開放時段」
- 持有相同 deviceId 可自刪自己的預約
學校最容易卡死的不是「沒人核可」,是「組長 A 不在那一週禮堂沒人能借」。砍掉審核 = 砍掉單點故障。Rate Limit + deviceId 自綁 + 30 秒 Undo + 管理員可隨時刪不當預約,這四層擋住所有惡意使用情境,比繁瑣審核流程實用得多。
功能 F:30 秒 Undo(Gmail 風格撤銷)
- 預約完 30 秒內可一鍵 Undo
功能 G:LINE Messaging API 三階段整合(殺手鐧)
- Phase 1:LINE 帳號綁定(透過 deviceId)
- Phase 2:預約建立 / 取消 / 強刪即時推 LINE Flex Message(綠 / 紅 / 橘卡片)
- Phase 3:使用前 30 分鐘自動提醒、異常活動偵測(批次取消 ≥ 10 次/h 就告警)、管理員告警訂閱
功能 H:AI 學期報告
- 管理員一鍵讓 Gemini 寫 4 段白皮書(綜述 / 亮點 / 異常 / 建議;使用 gemini-2.5-flash,在 Cloud Functions 後端呼叫)
- 上傳到 Firebase Storage
- 報告產生後,以 LINE 卡片通知已訂閱告警的管理員(附「查看報告」按鈕)
功能 I:PWA 三道更新保險絲(v2.41.6)
- SW activate 並行 cleanup + postMessage SW_ACTIVATED + 3 秒 timeout 強制 reload
真實技術棧
- 純 HTML + Vanilla JS + CSS(沒有 React/Vue 框架)
- app.js 單檔約 260 KB(從 v1.0 累積 50+ 版本,持續更新中)
- Firebase Firestore + Cloud Functions(Node 20)+ Auth + Storage
- @line/bot-sdk + @google/generative-ai(Gemini 2.5 Flash)
- PWA + IndexedDB 持久化(設計目標是降低 Firestore 讀取量,預估可降 60~70%,尚未量測)
- 8 篇開發文件(PROGRESS.md 68KB / FUTURE_PROPOSAL.md 60KB / OPTIMIZATION_PLAYBOOK.md 41KB)— 這不是普通工具,是當生產級教學產品在經營
兩個月實測數字
完整對照表:
| 指標 | 紙本時代(學期前) | #46 上線後(兩個月) |
|---|---|---|
| 平均預約時間 | 5-10 分鐘走廊跑 | 30 秒 |
| 時段衝突糾紛 | 每月 2-3 件 | 0 件 |
| 校外借用申請 | 每月 1-2 件 | 每月 6-8 件 |
| 預約總量 | 每月 ~30 場 | 每月 ~90 場 |
推薦搭配的工具
- #84 會議記錄自動產出 (Pro) — 禮堂用完直接生成記錄
- #80 教師會議報告集合站 — 整學期報告統整
- #56 許願池 — 學生家長想借禮堂的回饋
校長 / 主任視角
「我以前每週要跟 6 個處室確認用場地的衝突,現在打開 #46 一眼就看完了。 行政會議多了 20 分鐘可以討論真正的事。」
— 學務主任實測心得
想試試?
需要客製給自己學校用?在 許願池 留學校名 + 想要的時段顆粒度(半小時 / 一小時 / 一節課),阿凱老師會評估開源版。