B6

學生環境模板

定義「A1 課程頁 → StudentMode」的轉換規則:什麼內容會被注入、什麼維持不動。 每個課程綁一份 B6,跟著 course-registry 的 key 走。

1. B6 的定位

B1–B5 是全域共享的資源區塊(素材、案例、資料處理、IDE 規則、Skill 庫)。 B6 不一樣:每個課程一份,跟著 course-registry 的 key 走 (如 aicode100websitesupabase)。

B6 存在的理由:課程頁要切換到 StudentMode 時,不是直接把整頁丟過去,而是需要一份明確的 對應表,說清楚哪些內容會進 StudentMode、哪些不會。

2. StudentMode 的三區模型

StudentMode 是一個「模擬教室」,畫面由三個水平區塊組成:

順序區塊元件資料來源B6 是否覆蓋
課程區StudentPanelContent目前硬寫在 src/_data/website.ts完全替換為 B6.chapters
實體筆記區(上傳筆記)CourseNotesdata/notes.json + /api/notes不覆蓋,僅讀 B6.shell.notes.visible 當預設可見性
補充資料區(暫存筆記)Channeldata/channel.json + /api/channel不覆蓋,僅讀 B6.shell.channel.visible 當預設可見性

3. 為什麼 Notes / Channel 不被 B6 覆蓋

這是 B6 設計的核心。

  • Notes(實體筆記):老師在課堂上即時上傳的 PDF 筆記檔。
  • Channel(補充資料 / 暫存筆記):老師即時丟進來的補充連結、說明、檔案。

這兩區的內容屬於該堂課的現場產物,不是課程教材本體。如果 B6 直接覆蓋這兩區,切換課程時老師前一堂課上傳的 筆記會被清空,違反「模擬教室」的直覺——教室的白板內容應該由老師當下決定,不該被模板蓋掉。

所以 B6 對這兩區的介入限縮為:只管「預設可見性」這種外殼狀態,不碰內容。

舉例:101-A 的 B6 可以設 shell.channel.visible = true(這堂課預設打開補充資料區);101-B 可以設shell.notes.visible = false(這堂課預設不展示實體筆記)。但兩份 B6 都不能決定 channel / notes 裡放什麼——那永遠是老師的權責。

4. 欄位對應表(A1 課程內容 → B6.chapters)

目前 A1 課程(例如 StudentMode/src/_data/website.ts) 的章節資料結構,可以 100% 對應到 B6.chapters

A1 欄位B6 對應說明
Chapter.numberchapters[].number直接保留
Chapter.titlechapters[].title直接保留
Subgroup.titlechapters[].subgroups[].title直接保留
Subgroup.itemschapters[].subgroups[].items直接保留
Subgroup.bulkDownloadLabelchapters[].subgroups[].bulkDownloadLabel直接保留
PromptItem / DownloadItem / SkillDownloadItem / DocxDownloadItem / LinksItem / DemoItem同名全部沿用現有 Item union

換句話說,課程區的欄位對應是 1:1 直接轉入,沒有 schema 改寫。B6 的價值不在於改變章節的資料結構,而在於:

  1. 把每個課程的章節獨立出來(不再硬寫在 src/_data/ 某個檔案)。
  2. 明確綁到 courseId(由 course-registry 管理來源真相)。
  3. 教室外殼(Notes / Channel)分離,表達清楚哪些是教材、 哪些是現場產物。

5. 關於原本的 B6 提案(樣版文件生成)

src/app/(shell)/research-bytecode-scope/page.tsx裡曾提過另一個 B6 提案:「樣版文件生成」(xlsx / docx / pptx 的輸出模板)。

本版 B6 重新定義為「學生環境模板」,與原提案並不衝突:

  • 原提案聚焦在輸出檔案的版型(資料 → 成品文件)。
  • 本版聚焦在StudentMode 的課程注入(課程資料 → 學生端畫面)。

如未來仍需「輸出檔案版型」這個概念,建議改用 B7 或其他代號,避免語意混淆。

6. 實作範圍

本階段(已完成)

  • B6 Type 定義(src/types/student-template.ts
  • Crossbar 導覽加 B6 項
  • 本規格文件 + demo 頁面

下階段(待確認後進行)

  • 把 StudentMode 的 src/_data/website.ts搬遷到 B6 儲存位置(Insforge table 或 JSON file,依最終決定)。
  • 擴充 /skill-convert頁面:讓它的輸出符合 StudentTemplate schema。
  • StudentMode 啟動時依 courseId 讀取對應 B6,注入到StudentPanelContentshell.notes.visible /shell.channel.visible作為 CourseNotes / Channel 的初始可見性值。
  • Notes / Channel 的實際 API(/api/notes/api/channel)完全維持現狀,不改動。

驗證問題

老師把 StudentMode 的課程從 101-A 切換到 101-B,CourseNotes 區裡上傳的那份 PDF 會不會消失?

答:不會。Notes 檔案由 StudentMode 自己的 data/notes.json +/api/notes 管理,B6 切換只會替換課程區的 chapters, 以及重設 Notes / Channel 的 visible預設值,不會刪除任何實體檔案。