diff --git a/.gitignore b/.gitignore
index dc431d8..0e8758a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -483,4 +483,4 @@ secrets/
*.pem
*.p12
*.p8
-*.mobileprovision
\ No newline at end of file
+*.mobileprovisiondocs/05_views/
diff --git a/docs/00_starter/README.md b/docs/00_starter/README.md
new file mode 100644
index 0000000..f9ac386
--- /dev/null
+++ b/docs/00_starter/README.md
@@ -0,0 +1,162 @@
+# 📚 文檔指南
+
+本文檔提供 Drama Ling 專案文檔結構的完整說明。
+
+## 📁 目錄結構
+
+```
+docs/
+├── 00_starter/ # 專案初始化和模板
+├── 01_requirement/ # 專案需求和規格說明
+├── design/ # 設計和使用者體驗文檔
+├── technical/ # 技術架構和規格說明
+├── development/ # 開發指南和工作流程
+└── README.md # 本文件 - 文檔總覽
+```
+
+---
+
+## 📂 目錄詳細說明
+
+### 🚀 `/00_starter` - 專案基礎
+**用途**: 包含專案初始化和AI輔助開發所使用的基礎模板和提示詞。
+
+| 檔案名稱 | 用途 |
+|------|---------|
+| `CLAUDE_TEMPLATE.md` | Claude AI 互動模板和專案設置 |
+| `READ.md` | 使用入門模板的說明指引 |
+| `business_function_design_prompt.md` | 生成業務功能設計的 AI 提示詞 |
+| `generate_requirements_prompt.md` | 創建專案需求的 AI 提示詞 |
+| `generate_system_structure_prompt.md` | 系統架構生成的 AI 提示詞 |
+| `system_detail_prompt.md` | 詳細系統規格的 AI 提示詞 |
+| `system_structured_schema.json` | 結構化系統設計輸出的 JSON 架構 |
+
+**使用時機**: 這些檔案主要在專案初始化時使用,以及與 AI 助手協作生成文檔和程式碼結構時使用。
+
+---
+
+### 📋 `/01_requirement` - 專案需求
+**用途**: 包含核心專案需求、規格說明和系統設計文檔。
+
+| 檔案名稱 | 用途 |
+|------|---------|
+| `founding_pitch.md` | 初始專案提案和商業案例 |
+| `requirements.md` | **主要需求文檔** - 詳細的產品規格、功能和使用者故事 |
+| `system_structure_design.json` | **結構化系統設計** - 從需求生成,包含模組、功能和UI視圖的JSON格式 |
+
+**關鍵文檔**: `requirements.md` 是產品應該做什麼以及如何運作的唯一真實來源。
+
+---
+
+### 🎨 `/design` - 設計規格
+**用途**: 涵蓋使用者體驗、視覺設計和互動模式的文檔。
+
+| 檔案名稱 | 用途 |
+|------|---------|
+| `ai-algorithm-specs.md` | AI 分析演算法和語言處理規格 |
+| `business-logic-rules.md` | 核心商業規則和邏輯流程定義 |
+| `content-management-specs.md` | 內容創建、策劃和管理工作流程 |
+| `gamification-mechanics.md` | 遊戲元素、成就和獎勵系統設計 |
+| `ui-ux-guidelines.md` | 視覺設計標準、組件庫和使用者介面指南 |
+
+**目標讀者**: 設計師、前端開發人員和產品經理。
+
+---
+
+### ⚙️ `/technical` - 技術架構
+**用途**: 技術實作細節、系統架構和整合規格說明。
+
+| 檔案名稱 | 用途 |
+|------|---------|
+| `api-specifications.md` | **REST API 文檔** - 端點、請求/回應格式、認證 |
+| `database-schema.md` | 資料庫設計、資料表、關聯和資料模型 |
+| `flutter-dotnet-integration.md` | Flutter 前端與 .NET Core 後端的整合指南 |
+| `tech-stack-decision.md` | 技術選擇、理由和架構決策 |
+
+**關鍵文檔**: `api-specifications.md` 作為前端和後端團隊之間的契約。
+
+---
+
+### 👨💻 `/development` - 開發指南
+**用途**: 為開發人員提供編碼標準、工作流程和專案路線圖的指南。
+
+| 檔案名稱 | 用途 |
+|------|---------|
+| `coding-standards.md` | Flutter/Dart 和 .NET/C# 的程式碼風格指南、命名慣例和最佳實踐 |
+| `development-workflow.md` | Git 工作流程、分支策略、程式碼審查流程和開發生命週期 |
+| `project-roadmap.md` | **開發時程表** - 階段、里程碑和功能交付時程 |
+
+**目標讀者**: 所有參與專案的開發人員。
+
+---
+
+## 🎯 如何使用這個文檔
+
+### 新團隊成員
+1. **從這裡開始**: 閱讀這個 `README.md` 文檔總覽
+2. **了解產品**: 閱讀 `/01_requirement/requirements.md`
+3. **學習技術棧**: 查看 `/technical/tech-stack-decision.md`
+4. **遵循開發流程**: 學習 `/development/development-workflow.md`
+5. **遵守編碼標準**: 查看 `/development/coding-standards.md`
+
+### 前端開發人員
+- 主要文檔: `/design/ui-ux-guidelines.md`, `/technical/flutter-dotnet-integration.md`
+- API 契約: `/technical/api-specifications.md`
+- 編碼標準: `/development/coding-standards.md`
+
+### 後端開發人員
+- 主要文檔: `/technical/api-specifications.md`, `/technical/database-schema.md`
+- 整合指南: `/technical/flutter-dotnet-integration.md`
+- 商業邏輯: `/design/business-logic-rules.md`
+
+### 產品經理
+- 主要文檔: `/01_requirement/requirements.md`, `/development/project-roadmap.md`
+- 設計規格: `/design/` 目錄下的所有檔案
+- 進度追蹤: `/development/project-roadmap.md`
+
+### 設計師
+- 主要文檔: `/design/ui-ux-guidelines.md`, `/design/gamification-mechanics.md`
+- 內容策略: `/design/content-management-specs.md`
+
+---
+
+## 🔄 文檔維護
+
+### 何時更新
+- **需求變更**: 更新 `/01_requirement/requirements.md` 並重新生成 `system_structure_design.json`
+- **API 變更**: 更新 `/technical/api-specifications.md`
+- **設計更新**: 更新 `/design/` 目錄中相關檔案
+- **新功能**: 更新 `/development/project-roadmap.md` 中的路線圖
+
+### 責任歸屬
+- **產品團隊**: `/01_requirement/` 和 `/design/` 目錄
+- **工程團隊**: `/technical/` 和 `/development/` 目錄
+- **AI/DevOps**: `/00_starter/` 目錄(模板維護)
+
+---
+
+## 🔍 快速參考
+
+| 尋找... | 前往... |
+|----------------|----------|
+| 要建構什麼功能 | `/01_requirement/requirements.md` |
+| API 端點和資料格式 | `/technical/api-specifications.md` |
+| 資料庫結構 | `/technical/database-schema.md` |
+| UI 設計標準 | `/design/ui-ux-guidelines.md` |
+| 如何貢獻程式碼 | `/development/development-workflow.md` |
+| 開發時程表 | `/development/project-roadmap.md` |
+| 系統架構 | `/01_requirement/system_structure_design.json` |
+
+---
+
+## 📞 技術支援
+
+如果您需要任何文檔的說明:
+- 📧 Email: dev@dramaling.com
+- 💬 Slack: #dev-support
+- 📱 Issues: [GitHub Issues](https://github.com/JettCheng/DramaLingApp/issues)
+
+---
+
+**最後更新**: 2025-01-05
+**版本**: 1.0.0
\ No newline at end of file
diff --git a/docs/00_starter/READ.md b/docs/00_starter/start.md
similarity index 100%
rename from docs/00_starter/READ.md
rename to docs/00_starter/start.md
diff --git a/docs/02_design/ai-algorithm-specs.md b/docs/02_design/ai-algorithm-specs.md
new file mode 100644
index 0000000..76893ed
--- /dev/null
+++ b/docs/02_design/ai-algorithm-specs.md
@@ -0,0 +1,183 @@
+# AI 對話分析算法規格
+
+## 概述
+定義 Drama Ling 應用中 AI 對話分析系統的具體實現方案,包含語法、語意、流暢度三維度評分邏輯。
+
+## 核心評分維度
+
+### 1. 語法評分 (Grammar Score)
+**目標**: 評估用戶對話的語法正確性
+
+#### 評分標準 (0-100分)
+- [ ] **基礎語法** (40分)
+ - 主詞動詞一致性
+ - 時態使用正確性
+ - 詞序結構正確性
+
+- [ ] **進階語法** (35分)
+ - 複句結構使用
+ - 介系詞使用準確性
+ - 語法變化形式正確性
+
+- [ ] **高級語法** (25分)
+ - 複雜句型運用
+ - 條件句、被動語態等
+ - 語法多樣性展現
+
+#### 實現技術方案
+- [ ] **技術選擇**: 待決定 (GPT-4/Claude/自建模型)
+- [ ] **API整合方式**: 待定義
+- [ ] **錯誤分類系統**: 待建立
+- [ ] **即時分析響應時間**: 目標 < 2秒
+
+### 2. 語意評分 (Semantic Score)
+**目標**: 評估對話內容的語意適切性和情境理解
+
+#### 評分標準 (0-100分)
+- [ ] **情境理解** (45分)
+ - 場景適應性
+ - 對話目標達成度
+ - 上下文連貫性
+
+- [ ] **詞彙選擇** (35分)
+ - 詞彙準確性
+ - 語域適當性
+ - 表達豐富度
+
+- [ ] **邏輯性** (20分)
+ - 推理合理性
+ - 回應關聯性
+ - 論述完整性
+
+#### 實現技術方案
+- [ ] **語意理解模型**: 待選擇
+- [ ] **情境知識庫**: 待建立
+- [ ] **評分權重配置**: 待調整
+- [ ] **多語言支援策略**: 待規劃
+
+### 3. 流暢度評分 (Fluency Score)
+**目標**: 評估對話的自然度和表達流暢性
+
+#### 評分標準 (0-100分)
+- [ ] **表達自然度** (40分)
+ - 語言節奏感
+ - 慣用表達使用
+ - 母語使用習慣
+
+- [ ] **對話連接** (35分)
+ - 轉接詞使用
+ - 對話銜接流暢性
+ - 互動反應適時性
+
+- [ ] **整體表現** (25分)
+ - 整段對話完整性
+ - 表達信心度
+ - 溝通效果達成
+
+#### 實現技術方案
+- [ ] **流暢度檢測算法**: 待開發
+- [ ] **對話品質指標**: 待定義
+- [ ] **即時反饋機制**: 待設計
+- [ ] **學習進度追蹤**: 待實現
+
+## AI 對話訂正功能
+
+### 訂正類型
+- [ ] **語法訂正**: 直接糾錯並提供正確表達
+- [ ] **語意優化**: 建議更貼切的表達方式
+- [ ] **流暢度改善**: 提供更自然的表達替代方案
+- [ ] **文化適應性**: 符合目標語言文化的表達建議
+
+### 訂正展示方式
+- [ ] **即時高亮**: 標示問題部分
+- [ ] **建議面板**: 顯示改進方案
+- [ ] **解釋說明**: 提供訂正原因
+- [ ] **學習建議**: 相關學習資源推薦
+
+### 技術實現細節
+- [ ] **訂正算法選擇**: 待決定
+- [ ] **多層次訂正邏輯**: 待設計
+- [ ] **用戶接受度追蹤**: 待建立
+- [ ] **訂正準確度評估**: 待實現
+
+## 即時分析與回覆建議
+
+### 分析觸發機制
+- [ ] **即時觸發**: 用戶輸入完成後立即分析
+- [ ] **按需觸發**: 用戶主動請求分析
+- [ ] **階段性觸發**: 對話段落結束後分析
+- [ ] **綜合評估**: 整次對話結束後完整分析
+
+### 回覆建議系統
+- [ ] **情境適應建議**: 基於場景的回覆選項
+- [ ] **難度分級建議**: 符合用戶程度的表達方式
+- [ ] **個人化建議**: 基於學習記錄的客製化建議
+- [ ] **文化脈絡建議**: 考量文化背景的表達建議
+
+### 建議展示格式
+- [ ] **候選回覆**: 3-5個建議回覆選項
+- [ ] **難度標示**: 標明建議的語言難度等級
+- [ ] **使用情境**: 說明適用場合和語境
+- [ ] **學習重點**: 強調該建議的學習價值
+
+## 技術架構設計
+
+### AI 模型整合
+- [ ] **主要AI服務商**: 待選擇 (OpenAI/Anthropic/Google/其他)
+- [ ] **備用方案**: 多供應商容錯機制
+- [ ] **本地化處理**: 敏感資料保護方案
+- [ ] **成本控制**: API使用量管理策略
+
+### 效能優化
+- [ ] **響應時間**: 目標全流程 < 3秒
+- [ ] **並發處理**: 支援多用戶同時分析
+- [ ] **快取策略**: 常見分析結果快取
+- [ ] **負載平衡**: 分散式處理架構
+
+### 資料隱私
+- [ ] **用戶對話保護**: 資料加密和存取控制
+- [ ] **AI訓練資料**: 不使用用戶資料訓練
+- [ ] **資料保留政策**: 對話記錄管理規則
+- [ ] **合規要求**: GDPR等隱私法規遵循
+
+## 評估與優化
+
+### 算法效果評估
+- [ ] **準確度指標**: 各維度評分準確性測量
+- [ ] **用戶滿意度**: 評分結果接受度調查
+- [ ] **學習效果**: 長期學習成效追蹤
+- [ ] **對比實驗**: A/B測試不同算法方案
+
+### 持續優化機制
+- [ ] **模型微調**: 基於用戶回饋調整算法
+- [ ] **權重優化**: 動態調整各維度評分權重
+- [ ] **新功能實驗**: 漸進式功能測試上線
+- [ ] **效能監控**: 系統性能持續監測
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 確定主要AI技術供應商和API方案
+2. [ ] 設計三維度評分的具體算法邏輯
+3. [ ] 建立即時分析的技術架構
+4. [ ] 定義訂正功能的實現方式
+
+### 中優先級
+1. [ ] 建立評分準確度的測試基準
+2. [ ] 設計個人化建議的推薦算法
+3. [ ] 規劃多語言支援的技術方案
+4. [ ] 建立用戶回饋收集機制
+
+### 低優先級
+1. [ ] 研究進階AI功能的可行性
+2. [ ] 探索本地化AI模型的部署方案
+3. [ ] 調研語言學習領域的最新AI技術
+4. [ ] 建立與學術機構的合作評估機制
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 待分配
+**審查週期**: 每兩週檢討一次
\ No newline at end of file
diff --git a/docs/02_design/business-logic-rules.md b/docs/02_design/business-logic-rules.md
new file mode 100644
index 0000000..59ea811
--- /dev/null
+++ b/docs/02_design/business-logic-rules.md
@@ -0,0 +1,298 @@
+# 商業邏輯與營收規則
+
+## 概述
+定義 Drama Ling 應用的完整商業模式實現,包含訂閱制、內購、廣告等營收機制的具體規則和邏輯。
+
+## 訂閱制服務
+
+### 訂閱方案設計
+
+#### 免費版 (Free Tier)
+**功能範圍**:
+- [ ] **基礎對話練習**: 每日限制 5 次對話
+- [ ] **基礎場景**: 僅開放日常生活場景 (共10個)
+- [ ] **AI分析功能**: 每日限制 3 次使用
+- [ ] **排行榜**: 僅顯示好友排行榜
+- [ ] **成就系統**: 僅開放基礎成就 (30%)
+- [ ] **廣告觀看**: 觀看廣告可獲得額外使用次數
+
+**限制條件**:
+- [ ] 對話練習冷卻時間: 4小時
+- [ ] 不支援離線下載
+- [ ] 廣告頻率: 每3次操作顯示1次
+- [ ] 不支援匯出學習記錄
+
+#### 基礎版 (Basic Plan) - 月費 NT$199
+**解鎖功能**:
+- [ ] **無限對話練習**: 移除每日次數限制
+- [ ] **擴展場景**: 開放社交互動場景 (額外12個)
+- [ ] **無廣告體驗**: 完全移除廣告干擾
+- [ ] **進階AI分析**: 無限制使用三維度評分
+- [ ] **詳細學習報告**: 週報和月報功能
+- [ ] **雲端同步**: 跨設備學習進度同步
+
+**優惠政策**:
+- [ ] 年付優惠: NT$1,980 (相當於月付83折)
+- [ ] 學生優惠: 憑學生證享7折優惠
+- [ ] 首月體驗: 新用戶首月 NT$99
+
+#### 進階版 (Premium Plan) - 月費 NT$399
+**解鎖功能**:
+- [ ] **全場景開放**: 包含應急處理和專業場景
+- [ ] **個人化學習計劃**: AI客製化學習路徑
+- [ ] **優先客服**: 24小時內回覆保證
+- [ ] **專屬成就**: 解鎖所有成就和徽章
+- [ ] **語音辨識**: 口說練習和發音評估
+- [ ] **離線模式**: 下載內容供離線學習
+- [ ] **學習數據匯出**: 完整學習歷程匯出
+
+**年付優惠**: NT$3,999 (相當於月付83折)
+
+#### 專業版 (Professional Plan) - 月費 NT$799
+**解鎖功能**:
+- [ ] **企業場景**: 商務、面試、簡報等專業場景
+- [ ] **一對一AI導師**: 個人化指導和建議
+- [ ] **多語言支援**: 支援5種目標語言學習
+- [ ] **競賽特權**: 參與高級競賽和獲得實體獎勵
+- [ ] **API存取**: 開發者可整合學習數據
+- [ ] **白標服務**: 企業客戶客製化版本
+- [ ] **專屬社群**: 高級用戶專屬討論區
+
+### 訂閱管理機制
+
+#### 訂閱流程
+- [ ] **免費試用**: 所有付費方案提供7天免費試用
+- [ ] **自動續約**: 到期前24小時自動扣款續約
+- [ ] **取消政策**: 隨時可取消,當期使用到期為止
+- [ ] **升級降級**: 即時生效,費用按比例計算
+- [ ] **暫停功能**: 最多可暫停3個月 (保留資料)
+
+#### 付費方式整合
+- [ ] **信用卡**: 支援 Visa、MasterCard、JCB
+- [ ] **數位支付**: Apple Pay、Google Pay、Samsung Pay
+- [ ] **電信帳單**: 與電信商合作代收
+- [ ] **第三方支付**: 街口支付、LINE Pay、悠遊付
+- [ ] **銀行轉帳**: 提供虛擬帳號轉帳
+- [ ] **禮品卡**: 實體和數位禮品卡購買
+
+#### 計費邏輯
+- [ ] **按月計費**: 每月同一日期扣款
+- [ ] **按年計費**: 年付享折扣優惠
+- [ ] **比例退款**: 降級時退還剩餘天數費用
+- [ ] **暫停計費**: 暫停期間停止扣款
+- [ ] **逾期處理**: 扣款失敗後7天緩衝期
+
+## 內容付費機制
+
+### 付費內容類型
+
+#### 特殊場景包 (每包 NT$99-299)
+- [ ] **主題場景包**:
+ - 旅遊場景包 (機場、飯店、觀光) - NT$149
+ - 醫療場景包 (看病、急救、藥局) - NT$199
+ - 法律場景包 (法庭、律師、契約) - NT$299
+ - 學術場景包 (論文、研究、會議) - NT$249
+
+- [ ] **文化場景包**:
+ - 節日慶典場景 (聖誕、新年、婚禮) - NT$129
+ - 運動場景包 (健身、比賽、戶外) - NT$149
+ - 美食場景包 (料理、品酒、米其林) - NT$179
+ - 藝術場景包 (博物館、畫展、音樂會) - NT$199
+
+#### 專業對話包 (每包 NT$199-499)
+- [ ] **商務專業包**:
+ - 國際商務談判包 - NT$399
+ - 跨國會議包 - NT$299
+ - 企業簡報包 - NT$249
+ - 客戶關係包 - NT$199
+
+- [ ] **考試準備包**:
+ - IELTS口說包 - NT$499
+ - TOEFL口說包 - NT$499
+ - 多益口說包 - NT$399
+ - 全民英檢包 - NT$299
+
+#### 名師課程包 (每包 NT$599-1,299)
+- [ ] **語言專家系列**: 知名語言學習專家錄製
+- [ ] **母語人士系列**: 道地母語人士對話示範
+- [ ] **文化導師系列**: 深度文化背景解析
+- [ ] **商務導師系列**: 商界菁英實戰經驗
+
+### 內購邏輯設計
+
+#### 購買流程
+- [ ] **預覽功能**: 購買前可試用第一個場景
+- [ ] **一鍵購買**: 整合系統支付,無需跳轉
+- [ ] **批次購買**: 購買多個內容包享組合折扣
+- [ ] **心願清單**: 加入心願清單,降價時通知
+- [ ] **禮品贈送**: 可購買贈送給好友
+
+#### 定價策略
+- [ ] **動態定價**: 根據用戶程度和偏好調整價格
+- [ ] **限時優惠**: 新內容上線限時特價
+- [ ] **組合折扣**: 相關內容包組合購買享折扣
+- [ ] **會員折扣**: 訂閱用戶享內購9折優惠
+- [ ] **活動促銷**: 節日和特殊活動期間折扣
+
+#### 內容保護機制
+- [ ] **DRM保護**: 防止內容被盜用或分享
+- [ ] **帳號綁定**: 購買內容綁定特定帳號
+- [ ] **設備限制**: 最多可在3台設備上使用
+- [ ] **離線保護**: 離線內容定期需要驗證授權
+- [ ] **盜版檢測**: 偵測和防範非法分享行為
+
+## 廣告系統設計
+
+### 廣告展示策略
+
+#### 免費用戶廣告頻率
+- [ ] **啟動廣告**: App開啟時展示 (5秒,可跳過)
+- [ ] **練習間廣告**: 每3次對話練習後展示
+- [ ] **功能解鎖廣告**: 使用進階功能前觀看廣告
+- [ ] **退出廣告**: 結束學習階段時展示
+- [ ] **獎勵廣告**: 主動觀看獲得獎勵
+
+#### 廣告類型與時長
+- [ ] **影片廣告**: 15-30秒影片廣告,教育、遊戲類優先
+- [ ] **互動廣告**: 可互動的廣告內容,增加參與度
+- [ ] **原生廣告**: 融入介面設計的原生廣告內容
+- [ ] **橫幅廣告**: 螢幕底部或頂部的橫幅展示
+- [ ] **全螢幕廣告**: 在自然暫停點展示的全螢幕廣告
+
+### 廣告獎勵機制
+
+#### 觀看獎勵類型
+- [ ] **額外練習次數**: 觀看廣告獲得2次額外對話機會
+- [ ] **AI分析次數**: 獲得1次額外AI分析機會
+- [ ] **積分獎勵**: 觀看廣告獲得25-50積分
+- [ ] **內容試用**: 獲得付費場景1小時試用權
+- [ ] **社交功能**: 獲得好友排行榜查看權限
+
+#### 獎勵發放規則
+- [ ] **每日上限**: 每種獎勵每日最多獲得5次
+- [ ] **冷卻時間**: 同類獎勵需間隔30分鐘
+- [ ] **觀看驗證**: 需完整觀看才能獲得獎勵
+- [ ] **獎勵疊加**: 不同類型獎勵可以疊加使用
+- [ ] **有效期限**: 獎勵需在獲得後24小時內使用
+
+### 廣告品質控制
+
+#### 廣告內容審核
+- [ ] **教育相關**: 優先顯示教育、學習相關廣告
+- [ ] **年齡適宜**: 確保廣告內容適合目標用戶年齡層
+- [ ] **文化敏感**: 避免文化衝突或敏感內容
+- [ ] **品牌安全**: 排除有害品牌和不當內容
+- [ ] **用戶回饋**: 建立廣告品質回饋機制
+
+#### 廣告效果最佳化
+- [ ] **個人化投放**: 基於用戶興趣和行為投放相關廣告
+- [ ] **A/B測試**: 測試不同廣告格式和時機的效果
+- [ ] **頻率控制**: 避免相同廣告過度曝光造成反感
+- [ ] **時段優化**: 在用戶活躍時段投放高價值廣告
+- [ ] **轉換追蹤**: 追蹤廣告點擊和轉換效果
+
+## 企業客戶方案
+
+### B2B 服務方案
+
+#### 企業培訓版 (客製化報價)
+**服務內容**:
+- [ ] **員工帳號管理**: 批次開設和管理員工學習帳號
+- [ ] **學習進度追蹤**: 管理者可查看員工學習狀況
+- [ ] **客製化內容**: 根據企業需求開發專屬學習場景
+- [ ] **培訓報告**: 定期提供企業培訓成效報告
+- [ ] **專屬客服**: 指派專人負責企業客戶服務
+- [ ] **API整合**: 與企業現有系統整合
+
+#### 教育機構版 (年費制)
+**服務內容**:
+- [ ] **學生管理系統**: 教師可管理學生學習進度
+- [ ] **課程規劃工具**: 協助教師規劃語言學習課程
+- [ ] **成績管理**: 整合學習成果到既有成績系統
+- [ ] **教學資源**: 提供教師專用教學資源和指南
+- [ ] **大量授權**: 支援數百到數千學生同時使用
+- [ ] **教育折扣**: 相較個人版享有大幅優惠
+
+### 定價模式
+
+#### 企業培訓版定價
+- [ ] **基礎方案**: NT$200/人/月 (最少50人)
+- [ ] **標準方案**: NT$350/人/月 (包含客製化內容)
+- [ ] **高級方案**: NT$500/人/月 (包含專屬客服和API)
+- [ ] **設定費**: 一次性 NT$50,000 系統設定費
+- [ ] **客製化開發**: 另外報價,通常 NT$100,000 起跳
+
+#### 教育機構版定價
+- [ ] **小型機構** (≤100學生): NT$8,000/月
+- [ ] **中型機構** (101-500學生): NT$25,000/月
+- [ ] **大型機構** (501-2000學生): NT$80,000/月
+- [ ] **超大型機構** (>2000學生): 客製化報價
+
+## 數據服務營收
+
+### 匿名化數據分析服務
+- [ ] **學習趨勢報告**: 提供語言學習趨勢分析報告
+- [ ] **教育機構諮詢**: 協助教育機構優化教學方法
+- [ ] **語言能力評估**: 提供標準化語言能力評估服務
+- [ ] **內容效果分析**: 分析不同學習內容的效果差異
+- [ ] **技術授權**: 授權AI分析技術給其他教育平台
+
+### 數據隱私保護
+- [ ] **完全匿名化**: 移除所有可識別個人身份的資訊
+- [ ] **聚合數據**: 僅提供統計性聚合數據,不提供個人資料
+- [ ] **用戶同意**: 明確告知並取得用戶同意才收集分析數據
+- [ ] **法規遵循**: 完全遵守GDPR和相關隱私法規
+- [ ] **安全傳輸**: 使用最高等級加密保護數據傳輸
+
+---
+
+## 技術實現考量
+
+### 支付系統整合
+- [ ] **第三方支付串接**: 整合多種支付方式API
+- [ ] **交易安全**: PCI DSS合規的支付安全機制
+- [ ] **退款處理**: 自動化退款處理流程
+- [ ] **發票開立**: 整合電子發票開立系統
+- [ ] **帳務對帳**: 自動化帳務對帳和財務報告
+
+### 訂閱管理系統
+- [ ] **自動續約**: 智慧續約提醒和自動扣款機制
+- [ ] **方案升降級**: 即時生效的方案變更處理
+- [ ] **使用量監控**: 即時監控用戶使用量和限制
+- [ ] **帳號暫停復原**: 自動化帳號狀態管理
+- [ ] **客戶生命週期**: 完整的客戶生命週期管理
+
+### 廣告平台整合
+- [ ] **廣告SDK整合**: 整合主流廣告平台SDK
+- [ ] **廣告投放優化**: 智慧廣告投放和最佳化
+- [ ] **收益最大化**: 動態調整廣告格式和頻率
+- [ ] **廣告屏蔽檢測**: 檢測並應對廣告屏蔽軟體
+- [ ] **廣告效果追蹤**: 精確的廣告效果分析和報告
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 確定各訂閱方案的具體定價和功能範圍
+2. [ ] 設計付費內容的具體場景和定價策略
+3. [ ] 建立廣告獎勵機制的平衡性測試
+4. [ ] 規劃企業客戶的銷售和服務流程
+
+### 中優先級
+1. [ ] 設計支付流程的使用者體驗
+2. [ ] 建立客戶服務的標準作業程序
+3. [ ] 規劃數據分析服務的產品化方案
+4. [ ] 設計會員等級和忠誠度計劃
+
+### 低優先級
+1. [ ] 研究新興支付方式的整合可能性
+2. [ ] 探索NFT或區塊鏈技術的應用場景
+3. [ ] 建立合作夥伴的收益分成機制
+4. [ ] 設計社群變現的創新模式
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 待分配
+**審查週期**: 每兩週檢討一次
\ No newline at end of file
diff --git a/docs/02_design/content-management-specs.md b/docs/02_design/content-management-specs.md
new file mode 100644
index 0000000..4e8935c
--- /dev/null
+++ b/docs/02_design/content-management-specs.md
@@ -0,0 +1,395 @@
+# 內容管理規格文件
+
+## 概述
+定義 Drama Ling 應用中所有學習內容的創作標準、管理架構和品質控制機制。
+
+## 劇本創作標準
+
+### 劇本結構規格
+
+#### 基本劇本架構
+```json
+{
+ "scenario_id": "SC_Restaurant_01",
+ "scenario_name": "餐廳訂位",
+ "category": "daily_life",
+ "difficulty_level": "A2",
+ "estimated_duration": "5-8分鐘",
+ "learning_objectives": ["預約用餐", "詢問菜單", "表達偏好"],
+ "target_vocabulary": ["reservation", "available", "preference"],
+ "cultural_context": "西式餐廳用餐禮儀",
+ "dialogue_flow": {...}
+}
+```
+
+#### 對話流程設計原則
+- [ ] **情境設定**: 清楚的場景背景和角色身份
+- [ ] **目標導向**: 每個劇本都有明確的溝通目標
+- [ ] **循序漸進**: 難度由淺入深,符合學習曲線
+- [ ] **互動性強**: 提供多種對話分支選擇
+- [ ] **實用性高**: 貼近真實生活溝通需求
+
+### 劇本分類體系
+
+#### 按難度分級 (CEFR標準)
+- [ ] **A1 初學者**: 基礎日常對話 (自我介紹、購物等)
+- [ ] **A2 初級**: 簡單社交對話 (餐廳、交通等)
+- [ ] **B1 中級**: 複雜情境對話 (工作會議、申訴等)
+- [ ] **B2 中高級**: 專業場景對話 (面試、簡報等)
+- [ ] **C1 高級**: 抽象議題討論 (辯論、學術等)
+- [ ] **C2 精通級**: 專業領域深度對話
+
+#### 按場景主題分類
+**日常生活類** (20個場景)
+- [ ] 自我介紹與問候
+- [ ] 購物和消費
+- [ ] 餐廳用餐
+- [ ] 交通出行
+- [ ] 醫療保健
+- [ ] 住宿安排
+- [ ] 銀行金融
+- [ ] 郵政服務
+- [ ] 娛樂休閒
+- [ ] 家庭生活
+
+**社交互動類** (15個場景)
+- [ ] 朋友聚會
+- [ ] 約會戀愛
+- [ ] 鄰里互動
+- [ ] 社團活動
+- [ ] 節慶慶祝
+- [ ] 運動健身
+- [ ] 興趣愛好
+- [ ] 旅遊規劃
+- [ ] 文化交流
+- [ ] 志工服務
+
+**應急處理類** (12個場景)
+- [ ] 車禍事故處理
+- [ ] 醫療急救
+- [ ] 報警求助
+- [ ] 投訴申訴
+- [ ] 設備故障
+- [ ] 迷路求助
+- [ ] 金融詐騙
+- [ ] 自然災害
+- [ ] 法律諮詢
+- [ ] 心理諮商
+
+**專業場景類** (18個場景)
+- [ ] 商務談判
+- [ ] 工作面試
+- [ ] 會議簡報
+- [ ] 客戶服務
+- [ ] 技術討論
+- [ ] 學術研究
+- [ ] 教育培訓
+- [ ] 醫療諮詢
+- [ ] 法律程序
+- [ ] 媒體採訪
+
+### 劇本創作指南
+
+#### 對話編寫原則
+- [ ] **自然流暢**: 符合目標語言的自然表達習慣
+- [ ] **文化適切**: 考量目標語言的文化背景和習俗
+- [ ] **語法重點**: 每個劇本強調特定語法結構
+- [ ] **詞彙密度**: 新詞彙密度控制在15-25%之間
+- [ ] **重複強化**: 重要詞彙和句型在對話中多次出現
+
+#### 角色設計規範
+- [ ] **角色背景**: 明確的年齡、職業、性格設定
+- [ ] **對話風格**: 符合角色身份的語言使用風格
+- [ ] **情緒表達**: 透過語言展現角色情緒變化
+- [ ] **互動動機**: 每個角色都有清楚的對話動機
+- [ ] **文化代表性**: 角色設定體現多元文化背景
+
+#### 分支劇情設計
+- [ ] **多重選擇**: 提供3-5個對話選項供用戶選擇
+- [ ] **後果差異**: 不同選擇導向不同的對話發展
+- [ ] **學習重點**: 每個分支突出不同的學習重點
+- [ ] **複雜度漸增**: 後續分支難度逐漸提升
+- [ ] **回歸主線**: 分支最終回歸主要學習目標
+
+### 品質檢核標準
+
+#### 語言準確性檢查
+- [ ] **母語人士審核**: 至少一位母語專家審核
+- [ ] **語法正確性**: 確保語法使用完全正確
+- [ ] **用詞準確性**: 詞彙使用符合情境和語域
+- [ ] **發音標註**: 提供正確的發音指導
+- [ ] **語調標記**: 標註語調變化和重音位置
+
+#### 教學效果驗證
+- [ ] **學習目標對應**: 內容與學習目標完全對應
+- [ ] **難度適中性**: 透過測試驗證難度合適性
+- [ ] **參與度測試**: 確保內容能維持學習者興趣
+- [ ] **記憶效果**: 驗證詞彙和句型的記憶留存效果
+- [ ] **實用性驗證**: 確認內容在實際情境中的適用性
+
+## 詞彙庫組織架構
+
+### 詞彙分類系統
+
+#### 按頻率分級
+- [ ] **核心詞彙** (1-1000): 最常用的基礎詞彙
+- [ ] **重要詞彙** (1001-3000): 日常溝通必備詞彙
+- [ ] **進階詞彙** (3001-6000): 中級學習者詞彙
+- [ ] **專業詞彙** (6000+): 特定領域專業詞彙
+
+#### 按主題領域分類
+**生活主題詞彙**
+- [ ] 家庭與人際關係 (300詞)
+- [ ] 食物與飲料 (400詞)
+- [ ] 衣著與時尚 (250詞)
+- [ ] 住房與家具 (350詞)
+- [ ] 交通與旅行 (300詞)
+- [ ] 健康與醫療 (400詞)
+- [ ] 購物與消費 (250詞)
+- [ ] 娛樂與休閒 (350詞)
+
+**學術主題詞彙**
+- [ ] 教育與學習 (400詞)
+- [ ] 科學與技術 (500詞)
+- [ ] 商業與經濟 (450詞)
+- [ ] 政治與社會 (350詞)
+- [ ] 文化與藝術 (300詞)
+- [ ] 環境與自然 (400詞)
+
+#### 按語法功能分類
+- [ ] **動詞類**: 行為動詞、狀態動詞、助動詞
+- [ ] **名詞類**: 可數名詞、不可數名詞、專有名詞
+- [ ] **形容詞類**: 描述性、評價性、比較級形容詞
+- [ ] **副詞類**: 時間、地點、方式、程度副詞
+- [ ] **連接詞**: 因果、對比、順序連接詞
+- [ ] **介系詞**: 時間、地點、方式介系詞
+
+### 詞彙條目規格
+
+#### 基本詞彙資訊
+```json
+{
+ "vocabulary_id": "VOC_0001",
+ "word": "restaurant",
+ "phonetic": "/ˈrestərɑːnt/",
+ "part_of_speech": "noun",
+ "difficulty_level": "A2",
+ "frequency_rank": 1250,
+ "definition": "A place where people pay to sit and eat meals",
+ "chinese_translation": "餐廳",
+ "example_sentences": [...],
+ "collocations": [...],
+ "related_words": [...],
+ "usage_notes": "..."
+}
+```
+
+#### 學習輔助資訊
+- [ ] **記憶提示**: 詞根分析、聯想記憶法
+- [ ] **易混淆詞**: 相似詞彙的辨析說明
+- [ ] **使用場景**: 適用的具體溝通場景
+- [ ] **語域標註**: 正式/非正式/口語/書面語標註
+- [ ] **文化背景**: 詞彙使用的文化背景說明
+
+#### 多媒體資源
+- [ ] **發音音檔**: 標準發音示範錄音
+- [ ] **情境圖片**: 詞彙概念的視覺化圖片
+- [ ] **使用影片**: 實際使用情境的短影片
+- [ ] **手勢動作**: 相關的肢體語言或手勢說明
+- [ ] **文化圖像**: 體現文化背景的相關圖像
+
+### 間隔複習演算法
+
+#### 複習間隔計算
+```python
+# SuperMemo 2 演算法改良版
+def calculate_next_review(quality_rating, repetition_count, previous_interval, ef_factor):
+ """
+ quality_rating: 1-5 (用戶回答品質)
+ repetition_count: 複習次數
+ previous_interval: 上次複習間隔(天)
+ ef_factor: 容易程度因子 (1.3-2.5)
+ """
+ # 實際計算邏輯待實現
+ pass
+```
+
+#### 掌握度評估指標
+- [ ] **即時評分** (0-5分): 當次複習的回答品質
+- [ ] **累積掌握度** (0-100%): 基於多次複習的綜合評估
+- [ ] **遺忘曲線預測**: 預測遺忘時間點
+- [ ] **複習緊急度**: 基於遺忘風險的複習優先級
+- [ ] **長期記憶轉化**: 評估是否已轉入長期記憶
+
+#### 個人化複習策略
+- [ ] **學習節奏適應**: 根據個人學習速度調整間隔
+- [ ] **弱項強化**: 對掌握度低的詞彙增加複習頻率
+- [ ] **關聯複習**: 相關詞彙組合複習提升效果
+- [ ] **情境複習**: 在相關對話情境中複習詞彙
+- [ ] **多感官複習**: 結合視覺、聽覺、觸覺的複習方式
+
+## 多語言支援策略
+
+### 支援語言規劃
+
+#### 第一階段語言 (MVP版本)
+- [ ] **英語** (主要目標語言)
+ - 美式英語為主,英式英語為輔
+ - 涵蓋日常、商務、學術各領域
+ - 支援多種口音和方言
+
+#### 第二階段語言 (6個月後)
+- [ ] **日語**: 考量台灣日語學習需求量大
+- [ ] **韓語**: 韓流文化帶動的學習需求
+- [ ] **西班牙語**: 全球第二大使用人口
+
+#### 第三階段語言 (12個月後)
+- [ ] **法語**: 歐洲商務和文化需求
+- [ ] **德語**: 工程和學術領域需求
+- [ ] **中文**: 針對外國人學中文的需求
+
+### 本地化內容策略
+
+#### 文化適應性內容
+- [ ] **節日慶典**: 各文化重要節日的對話場景
+- [ ] **社交禮儀**: 不同文化的禮貌用語和行為規範
+- [ ] **商務文化**: 各國商務溝通的文化差異
+- [ ] **飲食文化**: 各地美食和用餐文化的對話場景
+- [ ] **生活習俗**: 日常生活中的文化差異體現
+
+#### 語言變體處理
+- [ ] **方言支援**: 主要方言和口音的識別和教學
+- [ ] **語域差異**: 正式/非正式語言使用的區別
+- [ ] **世代差異**: 不同年齡層的語言使用習慣
+- [ ] **專業用語**: 各行業專業術語的本地化
+- [ ] **網路語言**: 當代網路流行語和俚語
+
+### 翻譯品質控制
+
+#### 翻譯標準流程
+1. [ ] **專業翻譯**: 母語專家進行初譯
+2. [ ] **交叉審核**: 另一位專家進行審核
+3. [ ] **文化檢查**: 文化顧問檢查文化適切性
+4. [ ] **教學驗證**: 語言教師驗證教學適用性
+5. [ ] **用戶測試**: 目標用戶群測試使用體驗
+
+#### 翻譯一致性維護
+- [ ] **術語庫管理**: 建立統一的專業術語翻譯
+- [ ] **風格指南**: 制定各語言的翻譯風格指南
+- [ ] **版本控制**: 追蹤所有翻譯版本和修改歷程
+- [ ] **同步更新**: 原文修改時所有語言版本同步更新
+- [ ] **品質監控**: 定期檢查翻譯品質和一致性
+
+## 內容品質控制系統
+
+### 內容審核流程
+
+#### 創作階段審核
+1. [ ] **需求確認**: 確認內容符合教學需求
+2. [ ] **大綱審核**: 審核內容架構和學習目標
+3. [ ] **初稿創作**: 專業編劇和語言專家創作
+4. [ ] **專家審核**: 語言學習專家審核教學效果
+5. [ ] **母語審核**: 母語專家審核語言準確性
+
+#### 測試階段驗證
+1. [ ] **內部測試**: 團隊內部試用和回饋
+2. [ ] **專家測試**: 外部語言專家測試評估
+3. [ ] **用戶測試**: 目標用戶群小規模測試
+4. [ ] **數據分析**: 分析測試數據和學習效果
+5. [ ] **迭代優化**: 基於測試結果優化內容
+
+#### 上線後監控
+- [ ] **使用數據追蹤**: 監控內容使用率和完成率
+- [ ] **用戶回饋收集**: 收集用戶對內容的評價和建議
+- [ ] **學習效果分析**: 分析內容對學習成效的影響
+- [ ] **定期更新**: 基於數據和回饋定期更新內容
+- [ ] **版本控制**: 記錄所有內容變更和版本歷史
+
+### 內容評分標準
+
+#### 語言品質評分 (1-10分)
+- [ ] **準確性** (25%): 語法和用詞準確性
+- [ ] **流暢性** (25%): 語言表達的自然流暢度
+- [ ] **適切性** (25%): 符合情境和語域要求
+- [ ] **豐富性** (25%): 語言表達的多樣性和豐富度
+
+#### 教學效果評分 (1-10分)
+- [ ] **目標對應** (30%): 內容與學習目標的對應程度
+- [ ] **難度適中** (25%): 難度設計的合理性
+- [ ] **參與度** (25%): 內容的趣味性和參與度
+- [ ] **實用性** (20%): 實際應用價值
+
+#### 技術品質評分 (1-10分)
+- [ ] **系統相容** (30%): 與系統功能的相容性
+- [ ] **載入效能** (25%): 內容載入速度和效能
+- [ ] **互動設計** (25%): 互動元素的設計品質
+- [ ] **錯誤率** (20%): 技術錯誤和bug數量
+
+### 持續改進機制
+
+#### 內容效果分析
+- [ ] **學習成效追蹤**: 追蹤用戶學習成效變化
+- [ ] **完成率分析**: 分析不同內容的完成率差異
+- [ ] **重複使用率**: 分析內容的重複學習率
+- [ ] **推薦效果**: 分析推薦內容的接受度
+- [ ] **用戶留存影響**: 分析內容對用戶留存的影響
+
+#### 最佳化策略
+- [ ] **數據驅動優化**: 基於使用數據優化內容設計
+- [ ] **A/B測試**: 測試不同版本內容的效果差異
+- [ ] **用戶回饋整合**: 將用戶建議整合到內容改進中
+- [ ] **專家建議**: 定期邀請專家評估和建議改進
+- [ ] **技術創新**: 整合新技術提升內容品質和體驗
+
+---
+
+## 技術實現架構
+
+### 內容管理系統 (CMS)
+- [ ] **創作工具**: 提供編劇和專家使用的內容創作工具
+- [ ] **審核流程**: 支援多階段審核流程的工作流系統
+- [ ] **版本控制**: 完整的內容版本管理和回溯功能
+- [ ] **多語言支援**: 支援多語言內容的統一管理
+- [ ] **權限管理**: 不同角色的內容存取和編輯權限
+
+### 內容發布系統
+- [ ] **內容打包**: 自動化內容打包和壓縮
+- [ ] **CDN部署**: 全球內容分發網路部署
+- [ ] **版本發布**: 支援段階式發布和回滾機制
+- [ ] **快取管理**: 智慧內容快取和更新策略
+- [ ] **效能監控**: 內容載入效能和使用情況監控
+
+### 學習數據分析
+- [ ] **使用行為追蹤**: 詳細追蹤用戶學習行為
+- [ ] **效果評估**: 自動化學習效果評估和報告
+- [ ] **個人化推薦**: AI驅動的個人化內容推薦
+- [ ] **預測分析**: 預測學習趨勢和內容需求
+- [ ] **即時優化**: 基於即時數據調整內容策略
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 建立劇本創作的具體範本和指導原則
+2. [ ] 設計詞彙庫的資料結構和管理系統
+3. [ ] 實現間隔複習演算法的具體邏輯
+4. [ ] 建立內容品質控制的評估機制
+
+### 中優先級
+1. [ ] 設計內容管理系統的使用者介面
+2. [ ] 建立多語言內容的同步管理機制
+3. [ ] 規劃內容創作團隊的工作流程
+4. [ ] 設計用戶回饋的收集和分析系統
+
+### 低優先級
+1. [ ] 研究AI輔助內容創作的可行性
+2. [ ] 探索虛擬實境內容的創作可能性
+3. [ ] 建立與外部內容供應商的合作機制
+4. [ ] 設計內容智慧財產權保護方案
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 待分配
+**審查週期**: 每兩週檢討一次
\ No newline at end of file
diff --git a/docs/02_design/gamification-mechanics.md b/docs/02_design/gamification-mechanics.md
new file mode 100644
index 0000000..d49df2f
--- /dev/null
+++ b/docs/02_design/gamification-mechanics.md
@@ -0,0 +1,268 @@
+# 遊戲化機制設計規格
+
+## 概述
+定義 Drama Ling 應用中的完整遊戲化系統,包含排行榜、成就系統、闖關機制等,提升用戶學習動機和留存率。
+
+## 排行榜競爭機制
+
+### 排行榜類型
+- [ ] **全球排行榜**: 所有用戶的總體排名
+- [ ] **週排行榜**: 每週重置的短期競爭
+- [ ] **月排行榜**: 月度學習成就排名
+- [ ] **好友排行榜**: 僅顯示好友間的排名比較
+- [ ] **等級分組排行榜**: 依語言程度分組競爭
+- [ ] **地區排行榜**: 基於地理位置的本地競爭
+
+### 積分計算規則
+#### 基礎積分來源 (總分 = 基礎分 × 難度係數 × 連擊加成)
+
+**對話練習積分**
+- [ ] **完成對話**: 10分/次
+- [ ] **使用目標詞彙**: +5分/個詞彙
+- [ ] **達成任務目標**: +15分/任務
+- [ ] **流暢完成對話**: +10分 (無需AI提示)
+
+**評分積分轉換**
+- [ ] **語法評分**: 0.3 × 語法分數
+- [ ] **語意評分**: 0.3 × 語意分數
+- [ ] **流暢度評分**: 0.4 × 流暢度分數
+- [ ] **綜合優秀**: 三維度均 > 85分時 +50分獎勵
+
+**特殊活動積分**
+- [ ] **限時挑戰完成**: 基礎分 × 1.5倍
+- [ ] **首次嘗試新場景**: +25分
+- [ ] **連續學習天數**: +5分/天 (上限 +100分)
+- [ ] **幫助其他用戶**: +20分 (回答問題、分享經驗)
+
+#### 難度係數設定
+- [ ] **初級場景 (A1-A2)**: 1.0倍
+- [ ] **中級場景 (B1-B2)**: 1.3倍
+- [ ] **高級場景 (C1-C2)**: 1.6倍
+- [ ] **專業場景 (商務、醫療等)**: 1.8倍
+- [ ] **即興對話場景**: 2.0倍
+
+#### 連擊加成機制
+- [ ] **連續成功對話**: 2-5次 (+10%), 6-10次 (+20%), 11+次 (+30%)
+- [ ] **每日連擊**: 連續天數 × 2% 加成 (上限 +60%)
+- [ ] **完美表現**: 當日所有對話評分 > 90分時 +50% 加成
+- [ ] **挑戰連擊**: 連續完成限時挑戰 +25% 加成/次
+
+### 排行榜更新機制
+- [ ] **即時更新**: 積分變化立即反映
+- [ ] **排名快取**: 5分鐘更新一次排名顯示
+- [ ] **歷史記錄**: 保存每日/週/月排名變化
+- [ ] **排名爭議處理**: 異常分數檢測和處理機制
+
+## 成就系統設計
+
+### 成就分類
+
+#### 學習里程碑類
+- [ ] **初學者**: 完成首次對話
+- [ ] **勤奮學習者**: 連續學習 7/30/100 天
+- [ ] **場景探索家**: 完成 5/15/50 個不同場景
+- [ ] **詞彙大師**: 掌握 100/500/2000 個詞彙
+- [ ] **對話達人**: 完成 50/200/1000 次對話練習
+- [ ] **完美主義者**: 獲得 10/50/200 次滿分評價
+
+#### 技能提升類
+- [ ] **語法專家**: 語法評分達到 90+ 分 10/50/200 次
+- [ ] **語意高手**: 語意評分達到 90+ 分 10/50/200 次
+- [ ] **流暢達人**: 流暢度評分達到 90+ 分 10/50/200 次
+- [ ] **全能選手**: 三維度同時達到 85+ 分 5/20/100 次
+- [ ] **快速反應**: 限時挑戰中 10/50/200 次快速完成
+
+#### 社交互動類
+- [ ] **樂於助人**: 幫助其他用戶 10/50/200 次
+- [ ] **人氣王**: 獲得 50/200/1000 個好友讚賞
+- [ ] **分享達人**: 分享學習成果 20/100/500 次
+- [ ] **導師**: 指導新用戶學習 5/20/100 次
+- [ ] **社群領袖**: 在討論區發表優質內容 30/150/500 次
+
+#### 挑戰征服類
+- [ ] **勇敢嘗試**: 嘗試高難度場景 5/20/100 次
+- [ ] **速度之王**: 在時限內完成對話 20/100/500 次
+- [ ] **堅持不懈**: 從失敗中重新挑戰 10/50/200 次
+- [ ] **創新思維**: 使用創意表達方式 15/75/300 次
+- [ ] **極限挑戰**: 完成最高難度場景 1/5/20 次
+
+#### 特殊節日類
+- [ ] **新年決心**: 新年期間連續學習 7 天
+- [ ] **情人節浪漫**: 完成浪漫場景對話 10 次
+- [ ] **萬聖節驚奇**: 完成恐怖/驚悚場景 5 次
+- [ ] **聖誕精神**: 12月完成 25 次學習任務
+- [ ] **生日慶祝**: 生日當天完成特殊挑戰
+
+### 成就獎勵機制
+- [ ] **徽章收藏**: 每個成就對應獨特徽章設計
+- [ ] **積分獎勵**: 不同等級成就給予 50/200/500 積分獎勵
+- [ ] **稱號系統**: 解鎖專屬稱號在排行榜顯示
+- [ ] **內容解鎖**: 解鎖新場景、新功能或專屬內容
+- [ ] **實體獎勵**: 高級成就獲得實體紀念品 (限量版)
+
+### 成就進度追蹤
+- [ ] **視覺化進度條**: 清楚顯示完成進度
+- [ ] **階段性提醒**: 接近完成時的推送通知
+- [ ] **成就預告**: 即將解鎖的成就提示
+- [ ] **統計面板**: 個人成就完成統計概覽
+- [ ] **好友比較**: 與好友的成就完成度比較
+
+## 闖關系統設計
+
+### 關卡結構
+
+#### 主線關卡 (情境導向)
+- [ ] **第一章: 日常生活** (10關)
+ - 自我介紹、購物、餐廳、交通等基礎場景
+ - 解鎖條件: 無 (新手引導)
+ - 完成獎勵: 100積分 + 基礎徽章
+
+- [ ] **第二章: 社交互動** (12關)
+ - 朋友聚會、約會、工作會議、電話對話等
+ - 解鎖條件: 第一章通過率 ≥ 80%
+ - 完成獎勵: 150積分 + 社交徽章
+
+- [ ] **第三章: 應急處理** (15關)
+ - 醫療急救、車禍處理、投訴申訴、緊急求助等
+ - 解鎖條件: 第二章通過率 ≥ 75% + 總積分 ≥ 1000
+ - 完成獎勵: 200積分 + 危機處理徽章
+
+- [ ] **第四章: 專業場景** (18關)
+ - 商務談判、學術討論、技術交流、面試等
+ - 解鎖條件: 第三章通過率 ≥ 70% + 連續學習 ≥ 30天
+ - 完成獎勵: 300積分 + 專業徽章
+
+#### 支線關卡 (技能導向)
+- [ ] **語法強化關**: 專注語法訓練的特殊關卡
+- [ ] **詞彙擴展關**: 大量新詞彙學習關卡
+- [ ] **發音矯正關**: 語音識別和發音練習關卡
+- [ ] **文化理解關**: 目標語言文化背景學習關卡
+- [ ] **考試準備關**: 針對語言檢定考試的專門關卡
+
+#### 每日挑戰關
+- [ ] **每日一題**: 精選對話場景每日更新
+- [ ] **週題挑戰**: 週末特殊難題挑戰
+- [ ] **月度任務**: 整月累積完成的大型任務
+- [ ] **季節活動**: 配合節日的限時特殊關卡
+- [ ] **突發事件**: 隨機出現的緊急情境關卡
+
+### 關卡評價系統
+- [ ] **三星評級**: 基於綜合表現的 1-3 星評價
+ - ⭐ 通過: 綜合評分 ≥ 60分
+ - ⭐⭐ 良好: 綜合評分 ≥ 80分
+ - ⭐⭐⭐ 優秀: 綜合評分 ≥ 95分
+
+- [ ] **完成條件**:
+ - 達成主要對話目標
+ - 使用指定關鍵詞彙 (如有)
+ - 在時間限制內完成 (如有)
+ - 維持角色扮演一致性
+
+- [ ] **重複挑戰**: 允許重複挑戰提升星級評價
+- [ ] **額外目標**: 每關設定 2-3 個額外挑戰目標
+
+### 解鎖機制
+- [ ] **順序解鎖**: 主線關卡需按順序完成
+- [ ] **條件解鎖**: 滿足特定條件才能解鎖新內容
+- [ ] **付費解鎖**: 部分高級內容需要付費或達到VIP等級
+- [ ] **社交解鎖**: 邀請好友或達到社交成就解鎖
+- [ ] **時間解鎖**: 某些內容在特定時間開放
+
+## 進度追蹤系統
+
+### 個人進度面板
+- [ ] **整體進度**: 所有關卡完成百分比
+- [ ] **各章節進度**: 每章節詳細完成情況
+- [ ] **技能雷達圖**: 語法/語意/流暢度能力視覺化
+- [ ] **學習軌跡**: 每日/週/月學習時間和強度變化
+- [ ] **成長曲線**: 長期能力提升趨勢圖
+
+### 統計資訊
+- [ ] **累計學習時間**: 總學習時長統計
+- [ ] **對話完成數**: 累計完成對話次數
+- [ ] **詞彙掌握量**: 已學習和熟練掌握詞彙統計
+- [ ] **場景體驗數**: 體驗過的不同情境場景統計
+- [ ] **AI互動次數**: 與AI分析系統的互動統計
+
+### 學習建議
+- [ ] **弱項分析**: 基於表現數據識別學習弱點
+- [ ] **推薦關卡**: 個性化推薦適合的下一個關卡
+- [ ] **學習計劃**: AI生成的個人化學習進度安排
+- [ ] **複習提醒**: 基於遺忘曲線的複習內容建議
+- [ ] **目標設定**: 協助用戶設定並追蹤學習目標
+
+## 社交競爭機制
+
+### 好友系統
+- [ ] **好友邀請**: 通過ID、QR碼、聯絡人邀請好友
+- [ ] **好友動態**: 查看好友的學習進度和成就
+- [ ] **互相鼓勵**: 為好友的成就點讚和留言
+- [ ] **學習PK**: 與好友進行一對一學習競賽
+- [ ] **組隊學習**: 多人協作完成團體挑戰
+
+### 學習群組
+- [ ] **主題群組**: 按學習主題或程度分組
+- [ ] **地區群組**: 同地區學習者交流群組
+- [ ] **學習夥伴**: 匹配相似程度的學習夥伴
+- [ ] **導師制度**: 高級用戶指導初學者
+- [ ] **學習俱樂部**: 定期舉辦線上/線下學習活動
+
+### 競賽活動
+- [ ] **週賽**: 每週主題競賽活動
+- [ ] **月度錦標賽**: 月度大型競賽活動
+- [ ] **季度總決賽**: 季度最高榮譽競賽
+- [ ] **特殊賽事**: 節日或紀念日特別賽事
+- [ ] **團體戰**: 群組間的團體競賽活動
+
+---
+
+## 技術實現考量
+
+### 資料存儲
+- [ ] **積分記錄**: 用戶積分變化歷史記錄
+- [ ] **成就狀態**: 各項成就的完成狀態和進度
+- [ ] **關卡進度**: 關卡完成狀態和評級記錄
+- [ ] **排行榜快取**: 高效的排行榜查詢和更新機制
+- [ ] **統計數據**: 各種學習統計數據的存儲結構
+
+### 效能優化
+- [ ] **排行榜快取策略**: Redis快取熱門排行榜數據
+- [ ] **積分批次更新**: 避免頻繁數據庫寫入
+- [ ] **成就檢查優化**: 高效的成就觸發檢測機制
+- [ ] **統計數據預計算**: 定期預計算複雜統計數據
+- [ ] **分散式處理**: 大量用戶同時更新的處理策略
+
+### 防作弊機制
+- [ ] **異常檢測**: 識別異常高分或快速完成的可疑行為
+- [ ] **行為分析**: 分析用戶學習行為模式的合理性
+- [ ] **時間驗證**: 驗證完成任務的時間合理性
+- [ ] **IP限制**: 防止同一IP多帳號刷分
+- [ ] **人工審核**: 對可疑高分進行人工審核機制
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 確定積分計算的具體數值和平衡性
+2. [ ] 設計成就系統的徽章視覺設計
+3. [ ] 規劃關卡內容的具體場景劇本
+4. [ ] 建立防作弊機制的技術方案
+
+### 中優先級
+1. [ ] 設計社交功能的互動介面
+2. [ ] 規劃競賽活動的舉辦週期和規則
+3. [ ] 建立學習數據的分析和建議算法
+4. [ ] 設計個性化推薦系統
+
+### 低優先級
+1. [ ] 研究遊戲化的心理學原理應用
+2. [ ] 探索AR/VR技術在闖關系統的應用
+3. [ ] 建立與外部平台的積分兌換機制
+4. [ ] 設計線下活動與線上系統的結合
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 待分配
+**審查週期**: 每兩週檢討一次
\ No newline at end of file
diff --git a/docs/02_design/ui-ux-guidelines.md b/docs/02_design/ui-ux-guidelines.md
new file mode 100644
index 0000000..ee2c82b
--- /dev/null
+++ b/docs/02_design/ui-ux-guidelines.md
@@ -0,0 +1,521 @@
+# UI/UX 設計規範
+
+## 概述
+定義 Drama Ling 應用的完整使用者介面和使用者體驗設計標準,確保整體設計的一致性和使用性。
+
+## 設計原則
+
+### 核心設計理念
+- [ ] **沉浸式學習**: 創造身歷其境的語言學習環境
+- [ ] **簡潔直觀**: 界面設計簡潔明瞭,操作直觀易懂
+- [ ] **鼓勵互動**: 透過視覺設計鼓勵用戶積極參與學習
+- [ ] **成就感驅動**: 設計元素突出學習進步和成就感
+- [ ] **文化包容**: 設計考量多元文化背景用戶需求
+
+### 使用者體驗原則
+- [ ] **學習導向**: 所有設計決策以提升學習效果為優先
+- [ ] **減少阻力**: 消除學習過程中不必要的操作阻力
+- [ ] **即時回饋**: 提供即時的視覺和互動回饋
+- [ ] **個人化體驗**: 基於用戶偏好和程度調整介面
+- [ ] **無障礙設計**: 確保不同能力用戶都能順利使用
+
+## 視覺設計系統
+
+### 色彩規範
+
+#### 主要色彩 (Primary Colors)
+```css
+:root {
+ /* 主要品牌色 - 學習藍 */
+ --primary-blue: #2196F3;
+ --primary-blue-light: #64B5F6;
+ --primary-blue-dark: #1976D2;
+
+ /* 輔助色 - 成功綠 */
+ --success-green: #4CAF50;
+ --success-green-light: #81C784;
+ --success-green-dark: #388E3C;
+
+ /* 強調色 - 活力橙 */
+ --accent-orange: #FF9800;
+ --accent-orange-light: #FFB74D;
+ --accent-orange-dark: #F57C00;
+}
+```
+
+#### 功能性色彩 (Functional Colors)
+```css
+:root {
+ /* 錯誤和警告 */
+ --error-red: #F44336;
+ --warning-yellow: #FFC107;
+
+ /* 資訊提示 */
+ --info-cyan: #00BCD4;
+
+ /* 中性色調 */
+ --text-primary: #212121;
+ --text-secondary: #757575;
+ --background-primary: #FFFFFF;
+ --background-secondary: #FAFAFA;
+ --divider: #E0E0E0;
+}
+```
+
+#### 遊戲化色彩 (Gamification Colors)
+```css
+:root {
+ /* 等級和成就 */
+ --bronze: #CD7F32;
+ --silver: #C0C0C0;
+ --gold: #FFD700;
+ --platinum: #E5E4E2;
+
+ /* 排行榜 */
+ --rank-1st: #FFD700;
+ --rank-2nd: #C0C0C0;
+ --rank-3rd: #CD7F32;
+ --rank-other: #90A4AE;
+}
+```
+
+### 字體系統
+
+#### 中文字體
+- [ ] **主要字體**: Noto Sans TC (Google Fonts)
+- [ ] **備用字體**: PingFang TC, Microsoft JhengHei, sans-serif
+- [ ] **特殊用途**: 標題可使用 Noto Serif TC 增加正式感
+
+#### 英文字體
+- [ ] **主要字體**: Inter (現代、易讀)
+- [ ] **備用字體**: -apple-system, BlinkMacSystemFont, Roboto, sans-serif
+- [ ] **等寬字體**: JetBrains Mono (程式碼、發音標記)
+
+#### 字體大小規範
+```css
+:root {
+ /* 移動設備字體大小 */
+ --text-xs: 12px; /* 提示文字 */
+ --text-sm: 14px; /* 輔助資訊 */
+ --text-base: 16px; /* 正文內容 */
+ --text-lg: 18px; /* 重要文字 */
+ --text-xl: 20px; /* 小標題 */
+ --text-2xl: 24px; /* 標題 */
+ --text-3xl: 30px; /* 大標題 */
+
+ /* 桌面設備字體大小 */
+ --text-desktop-base: 18px;
+ --text-desktop-lg: 20px;
+ --text-desktop-xl: 22px;
+}
+```
+
+### 間距系統
+
+#### 標準間距單位
+```css
+:root {
+ --space-1: 4px; /* 超小間距 */
+ --space-2: 8px; /* 小間距 */
+ --space-3: 12px; /* 中小間距 */
+ --space-4: 16px; /* 標準間距 */
+ --space-5: 20px; /* 中間距 */
+ --space-6: 24px; /* 大間距 */
+ --space-8: 32px; /* 超大間距 */
+ --space-10: 40px; /* 區塊間距 */
+ --space-12: 48px; /* 頁面間距 */
+}
+```
+
+#### 佈局間距規範
+- [ ] **元件內邊距**: 16px (--space-4)
+- [ ] **元件間間距**: 24px (--space-6)
+- [ ] **區塊間間距**: 40px (--space-10)
+- [ ] **頁面邊距**: 20px (mobile) / 32px (desktop)
+- [ ] **列表項目間距**: 12px (--space-3)
+
+### 圓角和陰影
+
+#### 圓角規範
+```css
+:root {
+ --radius-sm: 4px; /* 小元件 */
+ --radius-md: 8px; /* 標準元件 */
+ --radius-lg: 12px; /* 卡片元件 */
+ --radius-xl: 16px; /* 模態視窗 */
+ --radius-full: 50%; /* 圓形元素 */
+}
+```
+
+#### 陰影系統
+```css
+:root {
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
+}
+```
+
+## 元件設計規範
+
+### 按鈕組件
+
+#### 主要按鈕 (Primary Button)
+```css
+.btn-primary {
+ background: var(--primary-blue);
+ color: white;
+ padding: 12px 24px;
+ border-radius: var(--radius-md);
+ font-weight: 600;
+ font-size: var(--text-base);
+ border: none;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.btn-primary:hover {
+ background: var(--primary-blue-dark);
+ transform: translateY(-1px);
+ box-shadow: var(--shadow-md);
+}
+```
+
+#### 按鈕狀態設計
+- [ ] **正常狀態**: 標準顏色和樣式
+- [ ] **懸停狀態**: 顏色加深,輕微上移效果
+- [ ] **按下狀態**: 顏色更深,無上移效果
+- [ ] **禁用狀態**: 透明度50%,不可點擊
+- [ ] **載入狀態**: 顯示載入動畫
+
+#### 按鈕尺寸變體
+- [ ] **大型按鈕**: 48px高度,主要行動按鈕
+- [ ] **標準按鈕**: 40px高度,一般操作按鈕
+- [ ] **小型按鈕**: 32px高度,次要操作按鈕
+- [ ] **迷你按鈕**: 24px高度,標籤或圖示按鈕
+
+### 輸入框組件
+
+#### 文字輸入框設計
+```css
+.input-field {
+ width: 100%;
+ padding: 12px 16px;
+ border: 2px solid var(--divider);
+ border-radius: var(--radius-md);
+ font-size: var(--text-base);
+ transition: border-color 0.2s ease;
+}
+
+.input-field:focus {
+ outline: none;
+ border-color: var(--primary-blue);
+ box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);
+}
+```
+
+#### 輸入框狀態
+- [ ] **正常狀態**: 灰色邊框,清楚標示輸入區域
+- [ ] **聚焦狀態**: 藍色邊框,外圍藍色光暈
+- [ ] **錯誤狀態**: 紅色邊框,搭配錯誤訊息
+- [ ] **成功狀態**: 綠色邊框,表示輸入正確
+- [ ] **禁用狀態**: 灰色背景,無法互動
+
+### 卡片組件
+
+#### 基礎卡片設計
+```css
+.card {
+ background: var(--background-primary);
+ border-radius: var(--radius-lg);
+ padding: var(--space-6);
+ box-shadow: var(--shadow-sm);
+ border: 1px solid var(--divider);
+ transition: all 0.2s ease;
+}
+
+.card:hover {
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-md);
+}
+```
+
+#### 特殊卡片變體
+- [ ] **場景卡片**: 包含圖片、標題、難度標籤
+- [ ] **成就卡片**: 徽章圖示、成就名稱、進度條
+- [ ] **排行榜卡片**: 排名、用戶頭像、分數
+- [ ] **學習記錄卡片**: 日期、學習時長、完成項目
+
+### 導航組件
+
+#### 底部導航列
+```css
+.bottom-navigation {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: var(--background-primary);
+ border-top: 1px solid var(--divider);
+ display: flex;
+ justify-content: space-around;
+ padding: var(--space-2) 0;
+}
+
+.nav-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: var(--space-2);
+ color: var(--text-secondary);
+ transition: color 0.2s ease;
+}
+
+.nav-item.active {
+ color: var(--primary-blue);
+}
+```
+
+#### 導航項目設計
+- [ ] **首頁**: 家圖示,學習概覽
+- [ ] **練習**: 對話氣泡圖示,對話練習
+- [ ] **進度**: 圖表圖示,學習進度
+- [ ] **排行榜**: 獎盃圖示,競爭排名
+- [ ] **個人**: 用戶圖示,個人資料
+
+## 互動設計規範
+
+### 動畫效果
+
+#### 頁面轉場動畫
+```css
+/* 頁面進入動畫 */
+.page-enter {
+ animation: slideInRight 0.3s ease-out forwards;
+}
+
+@keyframes slideInRight {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+```
+
+#### 互動回饋動畫
+- [ ] **點擊回饋**: 輕微縮放效果 (scale 0.95)
+- [ ] **載入動畫**: 旋轉或脈衝效果
+- [ ] **成功動畫**: 綠色勾選圖示彈出
+- [ ] **錯誤動畫**: 紅色搖擺效果
+- [ ] **進度動畫**: 平滑的進度條填充
+
+#### 遊戲化動畫
+- [ ] **獲得積分**: 積分數字向上飛出效果
+- [ ] **解鎖成就**: 徽章閃爍和彈出動畫
+- [ ] **等級提升**: 光芒四射的升級特效
+- [ ] **連擊效果**: 連續成功時的視覺強化
+- [ ] **排名變化**: 排名上升或下降的動態效果
+
+### 觸控互動
+
+#### 手勢支援
+- [ ] **輕觸 (Tap)**: 選擇、確認操作
+- [ ] **長按 (Long Press)**: 顯示詳細資訊或選單
+- [ ] **滑動 (Swipe)**: 頁面導航、項目操作
+- [ ] **雙擊 (Double Tap)**: 快速操作或放大
+- [ ] **捏放 (Pinch)**: 縮放內容 (如文字大小)
+
+#### 觸控回饋
+- [ ] **視覺回饋**: 觸控時的顏色變化或陰影
+- [ ] **觸覺回饋**: 重要操作提供震動回饋
+- [ ] **音效回饋**: 成功、錯誤、點擊的音效
+- [ ] **狀態回饋**: 清楚顯示操作結果和狀態變化
+
+## 響應式設計
+
+### 斷點設計
+```css
+:root {
+ /* 響應式斷點 */
+ --breakpoint-sm: 640px; /* 小型平板 */
+ --breakpoint-md: 768px; /* 平板 */
+ --breakpoint-lg: 1024px; /* 小型筆電 */
+ --breakpoint-xl: 1280px; /* 桌面 */
+}
+```
+
+### 設備適配策略
+
+#### 手機版 (< 640px)
+- [ ] **單欄布局**: 垂直排列所有內容
+- [ ] **大觸控目標**: 最小44x44px觸控區域
+- [ ] **簡化導航**: 隱藏次要功能,突出主要操作
+- [ ] **全螢幕模式**: 充分利用螢幕空間
+- [ ] **拇指友好**: 重要操作放在拇指易達區域
+
+#### 平板版 (640px-1024px)
+- [ ] **混合布局**: 部分內容可並排顯示
+- [ ] **侧邊導航**: 利用寬螢幕顯示更多導航選項
+- [ ] **多欄內容**: 列表和詳細資訊可同時顯示
+- [ ] **適中字體**: 在可讀性和螢幕利用間平衡
+
+#### 桌面版 (> 1024px)
+- [ ] **多欄布局**: 充分利用寬螢幕空間
+- [ ] **懸停效果**: 支援滑鼠懸停互動
+- [ ] **快捷鍵**: 提供鍵盤快捷鍵支援
+- [ ] **多工視窗**: 支援多個內容區域同時顯示
+
+### 內容適配原則
+- [ ] **內容優先**: 根據內容重要性調整佈局
+- [ ] **漸進增強**: 基礎功能在所有設備可用,進階功能在大螢幕優化
+- [ ] **一致體驗**: 核心功能在各設備保持一致
+- [ ] **效能考量**: 小螢幕設備優化載入速度和流量使用
+
+## 可用性設計
+
+### 無障礙設計 (Accessibility)
+
+#### 視覺無障礙
+- [ ] **色彩對比**: 確保文字和背景對比度 ≥ 4.5:1
+- [ ] **色彩獨立**: 重要資訊不僅依賴顏色傳達
+- [ ] **字體大小**: 支援系統字體大小設定
+- [ ] **高對比模式**: 提供高對比度主題選項
+- [ ] **暗黑模式**: 提供護眼的暗色主題
+
+#### 操作無障礙
+- [ ] **鍵盤導航**: 所有功能可透過鍵盤操作
+- [ ] **焦點指示**: 清楚的鍵盤焦點視覺指示
+- [ ] **語意標籤**: 正確使用HTML語意標籤
+- [ ] **螢幕閱讀器**: 支援VoiceOver、TalkBack等
+- [ ] **操作時間**: 提供充足的操作反應時間
+
+#### 認知無障礙
+- [ ] **簡潔介面**: 避免認知負擔過重的複雜介面
+- [ ] **一致性**: 保持操作和佈局的一致性
+- [ ] **錯誤預防**: 設計防止用戶犯錯的機制
+- [ ] **幫助資訊**: 提供易懂的使用說明和幫助
+- [ ] **進度提示**: 清楚顯示當前位置和進度
+
+### 國際化考量
+
+#### 多語言支援
+- [ ] **文字長度**: 考量不同語言文字長度差異
+- [ ] **文字方向**: 支援從右到左的語言 (如阿拉伯文)
+- [ ] **字體支援**: 確保各語言字體正確顯示
+- [ ] **文化色彩**: 考量不同文化對色彩的認知差異
+- [ ] **符號理解**: 使用全球通用的圖示和符號
+
+#### 本地化介面
+- [ ] **日期格式**: 依據地區顯示適當的日期格式
+- [ ] **數字格式**: 支援不同的數字和貨幣格式
+- [ ] **時區處理**: 正確處理不同時區的時間顯示
+- [ ] **節日活動**: 配合當地節日調整介面元素
+- [ ] **法規遵循**: 遵循各地區的法規和標準
+
+## 品牌視覺規範
+
+### Logo 使用規範
+
+#### Logo 變體
+- [ ] **完整Logo**: 包含圖示和文字的完整版本
+- [ ] **圖示版**: 僅包含圖示的簡化版本
+- [ ] **文字版**: 僅包含文字的橫式版本
+- [ ] **單色版**: 單色版本適用於特殊情況
+- [ ] **反白版**: 深色背景使用的反白版本
+
+#### Logo 使用規則
+- [ ] **最小尺寸**: Logo最小顯示尺寸24x24px
+- [ ] **安全空間**: Logo周圍保持至少等於Logo高度的空白
+- [ ] **背景限制**: 避免在複雜背景上使用Logo
+- [ ] **變形禁止**: 不得任意拉伸、旋轉或變形Logo
+- [ ] **色彩規範**: 僅使用官方指定的Logo色彩
+
+### 圖示系統
+
+#### 圖示風格
+- [ ] **線性風格**: 使用2px線寬的線性圖示
+- [ ] **圓角設計**: 圖示轉角使用2px圓角
+- [ ] **一致比例**: 所有圖示使用24x24px網格設計
+- [ ] **視覺重量**: 保持圖示視覺重量的一致性
+- [ ] **識別性**: 確保圖示意義清楚易懂
+
+#### 圖示分類
+- [ ] **導航圖示**: 首頁、練習、進度、排行榜、個人
+- [ ] **功能圖示**: 播放、暫停、設定、搜尋、分享
+- [ ] **狀態圖示**: 正確、錯誤、警告、資訊、載入
+- [ ] **遊戲圖示**: 積分、成就、等級、排名、獎勵
+- [ ] **學習圖示**: 詞彙、對話、複習、分析、進度
+
+### 插圖風格
+
+#### 插圖設計原則
+- [ ] **友善風格**: 使用溫和、友善的插圖風格
+- [ ] **多元包容**: 插圖人物體現多元文化和包容性
+- [ ] **情境相關**: 插圖內容與學習情境密切相關
+- [ ] **色彩和諧**: 插圖色彩與整體設計系統和諧統一
+- [ ] **簡潔明瞭**: 避免過於複雜的插圖設計
+
+#### 插圖應用場景
+- [ ] **空狀態**: 無內容時的友善提示插圖
+- [ ] **載入畫面**: 載入過程中的趣味插圖
+- [ ] **成功慶祝**: 完成學習任務的慶祝插圖
+- [ ] **引導教學**: 功能介紹和使用教學插圖
+- [ ] **情境場景**: 對話練習場景的背景插圖
+
+---
+
+## 設計工具與資源
+
+### 設計系統管理
+- [ ] **設計令牌**: 使用設計令牌統一管理設計變數
+- [ ] **組件庫**: 建立可重複使用的UI組件庫
+- [ ] **圖示庫**: 統一管理和更新所有圖示資源
+- [ ] **色彩面板**: 提供設計師和開發者共用的色彩規範
+- [ ] **間距指南**: 視覺化的間距和佈局指南
+
+### 原型和測試工具
+- [ ] **原型工具**: 使用Figma或Sketch製作高保真原型
+- [ ] **互動原型**: 製作可點擊的互動原型進行用戶測試
+- [ ] **設計規範**: 自動生成開發者所需的設計規範
+- [ ] **版本控制**: 設計檔案的版本管理和協作機制
+- [ ] **回饋收集**: 設計評審和用戶回饋的收集機制
+
+### 效能最佳化
+- [ ] **圖片最佳化**: 使用WebP格式和適當壓縮比例
+- [ ] **字體載入**: 最佳化字體載入策略和fallback機制
+- [ ] **動畫效能**: 使用CSS transform和opacity製作高效動畫
+- [ ] **懶載入**: 圖片和非關鍵內容的懶載入機制
+- [ ] **快取策略**: 靜態資源的快取和更新策略
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 完成主要UI組件的詳細設計規範
+2. [ ] 建立完整的設計系統和組件庫
+3. [ ] 製作各個核心頁面的高保真原型
+4. [ ] 進行用戶體驗測試和最佳化
+
+### 中優先級
+1. [ ] 設計遊戲化元素的視覺效果和動畫
+2. [ ] 建立多語言介面的本地化設計規範
+3. [ ] 規劃無障礙設計的實施細節
+4. [ ] 設計響應式佈局的各個斷點版本
+
+### 低優先級
+1. [ ] 研究最新的UI/UX設計趨勢和最佳實踐
+2. [ ] 探索VR/AR介面設計的可能性
+3. [ ] 建立設計系統的自動化更新機制
+4. [ ] 設計品牌延伸應用的視覺規範
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 待分配
+**審查週期**: 每兩週檢討一次
\ No newline at end of file
diff --git a/docs/03_development/coding-standards.md b/docs/03_development/coding-standards.md
new file mode 100644
index 0000000..7acfe8b
--- /dev/null
+++ b/docs/03_development/coding-standards.md
@@ -0,0 +1,993 @@
+# 程式碼規範與開發標準
+
+## 概述
+建立統一的程式碼撰寫規範和開發流程標準,確保團隊協作效率和代碼品質。
+
+## 通用開發原則
+
+### 代碼品質原則
+- [ ] **可讀性優先**: 代碼應該容易閱讀和理解
+- [ ] **一致性**: 遵循統一的命名和格式規範
+- [ ] **簡潔性**: 避免過度複雜的解決方案
+- [ ] **可測試性**: 代碼結構便於單元測試
+- [ ] **可維護性**: 考慮未來修改和擴展的便利性
+
+### SOLID原則遵循
+- [ ] **單一職責**: 每個函數/類只負責一個明確的功能
+- [ ] **開放封閉**: 對擴展開放,對修改封閉
+- [ ] **里氏替換**: 子類應該能夠替換父類
+- [ ] **介面隔離**: 不應該依賴不需要的介面
+- [ ] **依賴倒置**: 依賴抽象而非具體實現
+
+## C# (.NET Core) 規範
+
+### 基本格式規則
+
+#### EditorConfig 配置
+```ini
+# .editorconfig
+root = true
+
+[*]
+charset = utf-8
+end_of_line = crlf
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = true
+
+[*.{cs,csx,vb,vbx}]
+indent_size = 4
+insert_final_newline = true
+
+[*.{json,js,ts,tsx,css,scss,yml,yaml}]
+indent_size = 2
+```
+
+#### .NET 分析器規則
+```xml
+
+
+
+ net8.0
+ enable
+ true
+
+ CS1591
+ true
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers
+
+
+
+```
+
+### 命名規範
+
+#### C# 命名慣例
+```csharp
+// ✅ 類別和方法使用PascalCase
+public class UserService
+{
+ public async Task GetUserProfileAsync(Guid userId)
+ {
+ // 方法實現
+ }
+
+ public decimal CalculateMonthlyInterestRate(decimal principal, decimal rate)
+ {
+ return principal * rate / 12;
+ }
+}
+
+// ✅ 變數和參數使用camelCase
+private readonly IUserRepository _userRepository;
+private const int MaxRetryAttempts = 3;
+
+public async Task ValidateUserAsync(string email, string password)
+{
+ var isValidEmail = IsValidEmailFormat(email);
+ var hashedPassword = HashPassword(password);
+
+ return isValidEmail && await _userRepository.ValidateCredentialsAsync(email, hashedPassword);
+}
+
+// ❌ 避免的命名
+private string data; // 太泛化
+private int u; // 太簡短
+private async Task GetUserProfileDataAsync() {} // 冗餘的Data後綴
+```
+
+#### 常數和列舉
+```typescript
+// ✅ 常數使用SCREAMING_SNAKE_CASE
+const API_ENDPOINTS = {
+ USER_PROFILE: '/api/v1/users/profile',
+ DIALOGUE_START: '/api/v1/dialogues/start',
+} as const;
+
+const MAX_DIALOGUE_DURATION_MINUTES = 30;
+const DEFAULT_PAGINATION_LIMIT = 20;
+
+// ✅ 列舉使用PascalCase
+enum DialogueStatus {
+ InProgress = 'in_progress',
+ Completed = 'completed',
+ Abandoned = 'abandoned',
+}
+
+enum UserSubscriptionPlan {
+ Free = 'free',
+ Basic = 'basic',
+ Premium = 'premium',
+ Professional = 'professional',
+}
+```
+
+#### 類型定義
+```typescript
+// ✅ 介面使用PascalCase,以I開頭(可選)
+interface UserProfile {
+ userId: string;
+ username: string;
+ email: string;
+ createdAt: Date;
+ subscription: UserSubscriptionPlan;
+}
+
+interface ApiResponse {
+ success: boolean;
+ data: T | null;
+ message?: string;
+ error?: ApiError;
+}
+
+// ✅ 類型別名使用PascalCase
+type DialogueAnalysis = {
+ grammarScore: number;
+ semanticScore: number;
+ fluencyScore: number;
+ overallScore: number;
+ feedback: string[];
+};
+
+type CreateDialogueRequest = {
+ scenarioId: string;
+ difficultyOverride?: string;
+ targetVocabulary?: string[];
+};
+```
+
+### 函數撰寫規範
+
+#### 函數設計原則
+```typescript
+// ✅ 函數應該小巧、單一職責
+const validateEmailFormat = (email: string): boolean => {
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ return emailRegex.test(email);
+};
+
+const calculateDialogueScore = (
+ grammarScore: number,
+ semanticScore: number,
+ fluencyScore: number
+): number => {
+ const weights = { grammar: 0.3, semantic: 0.4, fluency: 0.3 };
+
+ return Math.round(
+ grammarScore * weights.grammar +
+ semanticScore * weights.semantic +
+ fluencyScore * weights.fluency
+ );
+};
+
+// ✅ 使用純函數優於副作用函數
+const createUserSlug = (username: string): string => {
+ return username
+ .toLowerCase()
+ .replace(/[^a-z0-9]/g, '-')
+ .replace(/-+/g, '-')
+ .trim();
+};
+
+// ✅ 錯誤處理明確
+const fetchUserProfile = async (userId: string): Promise => {
+ try {
+ const response = await api.get(`/users/${userId}`);
+
+ if (!response.data) {
+ throw new Error('User profile not found');
+ }
+
+ return response.data;
+ } catch (error) {
+ logger.error('Failed to fetch user profile', { userId, error });
+ throw error;
+ }
+};
+```
+
+#### 異步處理規範
+```typescript
+// ✅ 使用async/await而非Promise.then
+const processDialogueAnalysis = async (
+ dialogueId: string
+): Promise => {
+ const dialogue = await getDialogue(dialogueId);
+ const analysis = await analyzeDialogueWithAI(dialogue.messages);
+ const savedAnalysis = await saveAnalysisResults(dialogueId, analysis);
+
+ return savedAnalysis;
+};
+
+// ✅ 適當的錯誤處理和重試機制
+const retryOperation = async (
+ operation: () => Promise,
+ maxRetries: number = 3,
+ delayMs: number = 1000
+): Promise => {
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
+ try {
+ return await operation();
+ } catch (error) {
+ if (attempt === maxRetries) {
+ throw error;
+ }
+
+ await new Promise(resolve => setTimeout(resolve, delayMs * attempt));
+ }
+ }
+
+ throw new Error('All retry attempts failed');
+};
+```
+
+### React/React Native 組件規範
+
+#### 組件結構
+```tsx
+// ✅ 組件檔案結構標準
+import React, { useState, useEffect, useCallback } from 'react';
+import { View, Text, StyleSheet } from 'react-native';
+
+import { useAppDispatch, useAppSelector } from '@/hooks/redux';
+import { Button } from '@/components/ui';
+import { DialogueService } from '@/services';
+import { updateDialogueProgress } from '@/store/slices/dialogueSlice';
+
+import type { Dialogue, DialogueMessage } from '@/types';
+
+// ✅ Props介面定義
+interface DialogueChatProps {
+ dialogueId: string;
+ onDialogueComplete: (dialogue: Dialogue) => void;
+ isVisible: boolean;
+}
+
+// ✅ 組件主體
+export const DialogueChat: React.FC = ({
+ dialogueId,
+ onDialogueComplete,
+ isVisible,
+}) => {
+ // State declarations
+ const [inputText, setInputText] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
+
+ // Redux selectors
+ const dialogue = useAppSelector(state =>
+ state.dialogue.currentDialogue
+ );
+ const dispatch = useAppDispatch();
+
+ // Effects
+ useEffect(() => {
+ if (isVisible && dialogueId) {
+ loadDialogue();
+ }
+ }, [isVisible, dialogueId]);
+
+ // Handlers
+ const handleSendMessage = useCallback(async () => {
+ if (!inputText.trim()) return;
+
+ setIsLoading(true);
+ try {
+ const response = await DialogueService.sendMessage(dialogueId, inputText);
+ dispatch(updateDialogueProgress(response));
+ setInputText('');
+ } catch (error) {
+ // Error handling
+ } finally {
+ setIsLoading(false);
+ }
+ }, [dialogueId, inputText, dispatch]);
+
+ const loadDialogue = useCallback(async () => {
+ // Load dialogue logic
+ }, [dialogueId]);
+
+ // Early returns
+ if (!dialogue) {
+ return ;
+ }
+
+ // Main render
+ return (
+
+ {dialogue.scenarioTitle}
+ {/* Component content */}
+
+
+ );
+};
+
+// ✅ 樣式定義
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 16,
+ },
+ title: {
+ fontSize: 18,
+ fontWeight: 'bold',
+ marginBottom: 16,
+ },
+});
+```
+
+#### Hooks使用規範
+```tsx
+// ✅ 自定義Hook範例
+export const useDialogueAnalysis = (dialogueId: string) => {
+ const [analysis, setAnalysis] = useState(null);
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState(null);
+
+ const analyzeDialogue = useCallback(async () => {
+ setLoading(true);
+ setError(null);
+
+ try {
+ const result = await DialogueService.getAnalysis(dialogueId);
+ setAnalysis(result);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : 'Analysis failed');
+ } finally {
+ setLoading(false);
+ }
+ }, [dialogueId]);
+
+ useEffect(() => {
+ if (dialogueId) {
+ analyzeDialogue();
+ }
+ }, [analyzeDialogue, dialogueId]);
+
+ return {
+ analysis,
+ loading,
+ error,
+ refetch: analyzeDialogue
+ };
+};
+```
+
+### API和服務層規範
+
+#### API客戶端結構
+```typescript
+// ✅ API服務類設計
+export class DialogueService {
+ private static readonly BASE_URL = '/api/v1/dialogues';
+
+ static async startDialogue(request: CreateDialogueRequest): Promise {
+ const response = await apiClient.post>(
+ `${this.BASE_URL}/start`,
+ request
+ );
+
+ if (!response.data.success) {
+ throw new ApiError(
+ response.data.error?.message || 'Failed to start dialogue'
+ );
+ }
+
+ return response.data.data!;
+ }
+
+ static async sendMessage(
+ dialogueId: string,
+ message: string
+ ): Promise {
+ const response = await apiClient.post>(
+ `${this.BASE_URL}/${dialogueId}/message`,
+ { message, message_type: 'text' }
+ );
+
+ return this.handleApiResponse(response);
+ }
+
+ private static handleApiResponse(
+ response: ApiResponse
+ ): T {
+ if (!response.success || !response.data) {
+ throw new ApiError(
+ response.error?.message || 'API request failed'
+ );
+ }
+
+ return response.data;
+ }
+}
+
+// ✅ 錯誤處理類
+export class ApiError extends Error {
+ constructor(
+ message: string,
+ public statusCode?: number,
+ public code?: string
+ ) {
+ super(message);
+ this.name = 'ApiError';
+ }
+}
+```
+
+## 資料庫操作規範
+
+### SQL查詢撰寫標準
+
+#### 查詢可讀性
+```sql
+-- ✅ 好的SQL格式 - 關鍵字大寫、適當縮排
+SELECT
+ u.user_id,
+ u.username,
+ u.total_score,
+ COUNT(d.dialogue_id) AS total_dialogues,
+ AVG(d.overall_score)::INTEGER AS avg_score
+FROM users u
+LEFT JOIN dialogues d ON u.user_id = d.user_id
+ AND d.status = 'completed'
+WHERE u.status = 'active'
+ AND u.created_at >= CURRENT_DATE - INTERVAL '30 days'
+GROUP BY u.user_id, u.username, u.total_score
+HAVING COUNT(d.dialogue_id) >= 5
+ORDER BY u.total_score DESC
+LIMIT 100;
+
+-- ❌ 避免的格式
+select u.user_id,u.username,count(d.dialogue_id) from users u left join dialogues d on u.user_id=d.user_id where u.status='active' group by u.user_id,u.username;
+```
+
+#### 效能考量
+```sql
+-- ✅ 使用適當索引和條件
+-- 確保WHERE條件中的欄位有索引
+SELECT dialogue_id, created_at, overall_score
+FROM dialogues
+WHERE user_id = $1 -- 有索引
+ AND created_at >= $2 -- 有索引
+ AND status = 'completed' -- 有索引
+ORDER BY created_at DESC
+LIMIT 20;
+
+-- ✅ 避免N+1查詢問題
+WITH user_stats AS (
+ SELECT
+ user_id,
+ COUNT(*) as dialogue_count,
+ AVG(overall_score) as avg_score
+ FROM dialogues
+ WHERE status = 'completed'
+ GROUP BY user_id
+)
+SELECT
+ u.username,
+ COALESCE(us.dialogue_count, 0) as total_dialogues,
+ COALESCE(us.avg_score, 0) as average_score
+FROM users u
+LEFT JOIN user_stats us ON u.user_id = us.user_id
+WHERE u.status = 'active';
+```
+
+### ORM使用規範 (以Prisma為例)
+
+```typescript
+// ✅ Prisma查詢最佳實踐
+export class UserRepository {
+
+ // ✅ 使用事務處理相關操作
+ static async updateUserScoreAndLevel(
+ userId: string,
+ scoreIncrease: number
+ ): Promise {
+ return await prisma.$transaction(async (tx) => {
+ const user = await tx.user.findUniqueOrThrow({
+ where: { userId },
+ });
+
+ const newTotalScore = user.totalScore + scoreIncrease;
+ const newLevel = this.calculateUserLevel(newTotalScore);
+
+ return await tx.user.update({
+ where: { userId },
+ data: {
+ totalScore: newTotalScore,
+ currentLevel: newLevel,
+ updatedAt: new Date(),
+ },
+ });
+ });
+ }
+
+ // ✅ 使用include避免N+1問題
+ static async getUserWithRecentDialogues(
+ userId: string
+ ): Promise {
+ return await prisma.user.findUniqueOrThrow({
+ where: { userId },
+ include: {
+ dialogues: {
+ where: {
+ status: 'completed',
+ createdAt: {
+ gte: subDays(new Date(), 7)
+ }
+ },
+ orderBy: { createdAt: 'desc' },
+ take: 10,
+ },
+ subscription: true,
+ },
+ });
+ }
+
+ // ✅ 適當的錯誤處理
+ private static calculateUserLevel(totalScore: number): string {
+ if (totalScore < 1000) return 'A1';
+ if (totalScore < 3000) return 'A2';
+ if (totalScore < 6000) return 'B1';
+ if (totalScore < 10000) return 'B2';
+ if (totalScore < 15000) return 'C1';
+ return 'C2';
+ }
+}
+```
+
+## 測試規範
+
+### 單元測試
+```typescript
+// ✅ 測試結構 - AAA模式 (Arrange, Act, Assert)
+import { calculateDialogueScore } from '@/utils/scoring';
+
+describe('calculateDialogueScore', () => {
+ it('should calculate correct weighted average score', () => {
+ // Arrange
+ const grammarScore = 90;
+ const semanticScore = 80;
+ const fluencyScore = 85;
+ const expectedScore = 84; // 90*0.3 + 80*0.4 + 85*0.3 = 84
+
+ // Act
+ const result = calculateDialogueScore(grammarScore, semanticScore, fluencyScore);
+
+ // Assert
+ expect(result).toBe(expectedScore);
+ });
+
+ it('should handle edge cases with zero scores', () => {
+ // Arrange & Act
+ const result = calculateDialogueScore(0, 0, 0);
+
+ // Assert
+ expect(result).toBe(0);
+ });
+
+ it('should round to nearest integer', () => {
+ // Arrange
+ const result = calculateDialogueScore(85, 87, 83); // Expected: 85.4 → 85
+
+ // Assert
+ expect(result).toBe(85);
+ });
+});
+```
+
+### 整合測試
+```typescript
+// ✅ API整合測試
+import request from 'supertest';
+import { app } from '@/app';
+import { setupTestDatabase, cleanupTestDatabase } from '@/test/setup';
+
+describe('POST /api/v1/dialogues/start', () => {
+ beforeEach(async () => {
+ await setupTestDatabase();
+ });
+
+ afterEach(async () => {
+ await cleanupTestDatabase();
+ });
+
+ it('should start new dialogue successfully', async () => {
+ // Arrange
+ const requestBody = {
+ scenarioId: 'SC_Restaurant_01',
+ difficultyOverride: 'A2',
+ };
+
+ // Act
+ const response = await request(app)
+ .post('/api/v1/dialogues/start')
+ .set('Authorization', 'Bearer valid-jwt-token')
+ .send(requestBody)
+ .expect(201);
+
+ // Assert
+ expect(response.body.success).toBe(true);
+ expect(response.body.data).toHaveProperty('dialogueId');
+ expect(response.body.data).toHaveProperty('sessionToken');
+ expect(response.body.data.scenarioId).toBe(requestBody.scenarioId);
+ });
+
+ it('should return 400 for invalid scenario ID', async () => {
+ // Act
+ const response = await request(app)
+ .post('/api/v1/dialogues/start')
+ .set('Authorization', 'Bearer valid-jwt-token')
+ .send({ scenarioId: 'INVALID_ID' })
+ .expect(400);
+
+ // Assert
+ expect(response.body.success).toBe(false);
+ expect(response.body.error.code).toBe('INVALID_SCENARIO');
+ });
+});
+```
+
+## 版本控制規範
+
+### Git工作流程
+
+#### 分支策略 (Git Flow)
+```bash
+# ✅ 分支命名規範
+main # 生產環境代碼
+develop # 開發整合分支
+feature/JIRA-123-user-auth # 功能開發
+hotfix/fix-login-bug # 緊急修復
+release/v1.2.0 # 發布準備
+
+# ✅ 功能開發工作流程
+git checkout develop
+git pull origin develop
+git checkout -b feature/JIRA-123-dialogue-analysis
+# 進行開發...
+git add .
+git commit -m "feat: implement dialogue analysis scoring algorithm"
+git push origin feature/JIRA-123-dialogue-analysis
+# 創建Pull Request到develop分支
+```
+
+#### Commit Message規範
+```bash
+# ✅ 使用Conventional Commits格式
+# 類型(範圍): 簡短描述
+
+feat(api): add dialogue analysis endpoint
+fix(ui): resolve button click not working on iOS
+docs(readme): update installation instructions
+style(components): fix linting issues in DialogueChat
+refactor(auth): simplify JWT token validation
+test(dialogue): add unit tests for scoring algorithm
+chore(deps): update React Native to 0.72.4
+
+# ✅ 完整範例
+feat(dialogue): implement AI-powered grammar scoring
+
+- Add OpenAI integration for grammar analysis
+- Implement scoring algorithm with configurable weights
+- Add error handling and retry logic
+- Update dialogue model to store grammar scores
+
+Fixes #123
+```
+
+### Code Review規範
+
+#### PR檢查清單
+```markdown
+## Pull Request Checklist
+
+### 功能性檢查
+- [ ] 功能按需求正確實現
+- [ ] 邊界條件和錯誤處理完善
+- [ ] 相關測試已添加並通過
+- [ ] 不會破壞現有功能
+
+### 代碼品質
+- [ ] 代碼遵循團隊規範
+- [ ] 變數和函數命名清晰
+- [ ] 沒有重複代碼
+- [ ] 效能考量適當
+
+### 文檔和註釋
+- [ ] 複雜邏輯有適當註釋
+- [ ] API文檔已更新
+- [ ] README或相關文檔已更新
+
+### 安全性
+- [ ] 沒有敏感資訊洩漏
+- [ ] 輸入驗證和清理適當
+- [ ] 權限檢查正確
+
+### 其他
+- [ ] 資料庫遷移腳本(如需要)
+- [ ] 環境變數文檔更新
+- [ ] 部署注意事項說明
+```
+
+#### Review回饋準則
+```markdown
+# ✅ 建設性回饋範例
+
+## 主要問題 (Must Fix)
+- 🚨 **安全問題**: SQL注入風險,請使用參數化查詢
+- 🚨 **效能問題**: N+1查詢問題,建議使用JOIN或預加載
+- 🚨 **邏輯錯誤**: 條件判斷有問題,會導致錯誤的計算結果
+
+## 建議改進 (Should Consider)
+- 💡 **代碼組織**: 建議將此邏輯提取到單獨函數提高可讀性
+- 💡 **錯誤處理**: 考慮添加更具體的錯誤訊息
+- 💡 **測試覆蓋**: 建議添加邊界條件測試
+
+## 小問題 (Nice to Have)
+- 🎨 **代碼風格**: 變數命名可以更具描述性
+- 🎨 **註釋**: 複雜算法建議添加註釋說明
+```
+
+## 環境配置標準
+
+### 開發環境設定
+
+#### package.json腳本
+```json
+{
+ "scripts": {
+ "dev": "concurrently \"npm run dev:api\" \"npm run dev:mobile\"",
+ "dev:api": "nodemon --exec ts-node src/server.ts",
+ "dev:mobile": "expo start",
+ "build": "tsc && npm run build:mobile",
+ "build:mobile": "expo build:ios && expo build:android",
+ "test": "jest",
+ "test:watch": "jest --watch",
+ "test:coverage": "jest --coverage",
+ "lint": "eslint src/**/*.{ts,tsx}",
+ "lint:fix": "eslint src/**/*.{ts,tsx} --fix",
+ "type-check": "tsc --noEmit"
+ }
+}
+```
+
+#### 環境變數管理
+```bash
+# ✅ .env.example - 範本文件
+NODE_ENV=development
+PORT=3001
+
+# Database
+DATABASE_URL=postgresql://user:password@localhost:5432/dramaling_dev
+REDIS_URL=redis://localhost:6379
+
+# External APIs
+OPENAI_API_KEY=your_openai_api_key_here
+STRIPE_SECRET_KEY=sk_test_your_stripe_key_here
+
+# JWT
+JWT_SECRET=your_jwt_secret_here
+JWT_EXPIRES_IN=7d
+
+# AWS
+AWS_ACCESS_KEY_ID=your_aws_access_key
+AWS_SECRET_ACCESS_KEY=your_aws_secret_key
+AWS_REGION=ap-northeast-1
+S3_BUCKET_NAME=dramaling-assets-dev
+```
+
+```typescript
+// ✅ 環境變數驗證
+import { z } from 'zod';
+
+const envSchema = z.object({
+ NODE_ENV: z.enum(['development', 'staging', 'production']),
+ PORT: z.string().transform(Number),
+ DATABASE_URL: z.string().url(),
+ OPENAI_API_KEY: z.string().min(1),
+ JWT_SECRET: z.string().min(32),
+});
+
+export const env = envSchema.parse(process.env);
+```
+
+## 文檔撰寫規範
+
+### API文檔標準
+```typescript
+/**
+ * 開始新的對話練習
+ *
+ * @route POST /api/v1/dialogues/start
+ * @param {CreateDialogueRequest} request - 對話創建請求
+ * @param {string} request.scenarioId - 場景ID (必填)
+ * @param {string} [request.difficultyOverride] - 難度覆寫 (可選)
+ * @param {string[]} [request.targetVocabulary] - 目標詞彙列表 (可選)
+ * @returns {Promise} 創建的對話物件
+ *
+ * @throws {ApiError} SCENARIO_NOT_FOUND - 場景不存在
+ * @throws {ApiError} SUBSCRIPTION_REQUIRED - 需要訂閱權限
+ * @throws {ApiError} DAILY_LIMIT_EXCEEDED - 超過每日使用限制
+ *
+ * @example
+ * ```typescript
+ * const dialogue = await DialogueService.startDialogue({
+ * scenarioId: 'SC_Restaurant_01',
+ * difficultyOverride: 'A2',
+ * targetVocabulary: ['reservation', 'menu', 'order']
+ * });
+ * ```
+ */
+export const startDialogue = async (
+ request: CreateDialogueRequest
+): Promise => {
+ // 實現邏輯
+};
+```
+
+### README撰寫規範
+```markdown
+# Drama Ling - 語言學習對話練習應用
+
+## 專案概述
+Drama Ling 是一款結合AI分析的情境對話練習應用,幫助用戶在真實場景中提升語言溝通能力。
+
+## 技術棧
+- **前端**: React Native + TypeScript
+- **後端**: Node.js + Express + TypeScript
+- **資料庫**: PostgreSQL + Redis
+- **AI服務**: OpenAI GPT-4
+- **雲端**: AWS (ECS + RDS + S3)
+
+## 快速開始
+
+### 環境要求
+- Node.js 18+
+- PostgreSQL 15+
+- Redis 7+
+- React Native 0.72+
+
+### 安裝步驟
+1. 複製專案
+ ```bash
+ git clone https://github.com/company/dramaling-app.git
+ cd dramaling-app
+ ```
+
+2. 安裝依賴
+ ```bash
+ npm install
+ ```
+
+3. 設定環境變數
+ ```bash
+ cp .env.example .env
+ # 編輯 .env 填入實際配置
+ ```
+
+4. 資料庫設置
+ ```bash
+ npm run db:migrate
+ npm run db:seed
+ ```
+
+5. 啟動開發服務
+ ```bash
+ npm run dev
+ ```
+
+## 專案結構
+```
+src/
+├── components/ # 共用UI組件
+├── screens/ # 頁面組件
+├── services/ # API和業務邏輯服務
+├── store/ # Redux狀態管理
+├── utils/ # 工具函數
+├── types/ # TypeScript類型定義
+└── constants/ # 常數定義
+```
+
+## 開發流程
+1. 從`develop`分支創建feature分支
+2. 遵循代碼規範和測試要求
+3. 創建Pull Request並等待Review
+4. 合併後自動部署到staging環境
+
+## 測試
+```bash
+npm run test # 執行所有測試
+npm run test:watch # 監視模式
+npm run test:coverage # 測試覆蓋率報告
+```
+
+## 部署
+- **Staging**: 自動部署當develop分支更新時
+- **Production**: 手動部署當release分支創建時
+
+## 貢獻指南
+請閱讀 [CONTRIBUTING.md](CONTRIBUTING.md) 了解詳細的開發和貢獻流程。
+
+## 授權
+本專案採用 MIT 授權 - 詳見 [LICENSE](LICENSE) 文件
+```
+
+---
+
+## 程式碼審查檢查清單
+
+### 自我檢查項目
+- [ ] 代碼遵循團隊規範和風格指南
+- [ ] 所有函數和類都有適當的類型標註
+- [ ] 複雜邏輯有清楚的註釋說明
+- [ ] 錯誤處理和邊界條件考慮周全
+- [ ] 單元測試覆蓋新增功能
+- [ ] 沒有console.log或調試代碼殘留
+- [ ] 沒有TODO或FIXME未處理
+- [ ] 效能考量適當(避免不必要的重新渲染等)
+
+### 團隊審查重點
+- [ ] 架構設計合理性
+- [ ] API設計的一致性
+- [ ] 資料流和狀態管理
+- [ ] 安全性考量
+- [ ] 可維護性和擴展性
+- [ ] 與現有代碼的整合度
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 建立ESLint和Prettier配置文件
+2. [ ] 設置Pre-commit hooks強制代碼格式檢查
+3. [ ] 建立代碼審查模板和流程
+4. [ ] 設置自動化測試的CI流程
+
+### 中優先級
+1. [ ] 建立API文檔自動生成工具
+2. [ ] 設置代碼覆蓋率報告和監控
+3. [ ] 建立效能測試標準和工具
+4. [ ] 制定安全代碼審查檢查清單
+
+### 低優先級
+1. [ ] 研究和引入靜態代碼分析工具
+2. [ ] 建立自動化代碼品質評分系統
+3. [ ] 探索AI輔助代碼審查工具
+4. [ ] 建立團隊技術分享和最佳實踐文檔
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 技術負責人
+**審查週期**: 每月檢討和更新
\ No newline at end of file
diff --git a/docs/03_development/development-workflow.md b/docs/03_development/development-workflow.md
new file mode 100644
index 0000000..c700681
--- /dev/null
+++ b/docs/03_development/development-workflow.md
@@ -0,0 +1,796 @@
+# 開發工作流程
+
+## 概述
+建立標準化的開發工作流程,確保團隊協作效率、代碼品質和專案進度控制。
+
+## 敏捷開發框架
+
+### Scrum工作模式
+- [ ] **Sprint週期**: 2週一個Sprint
+- [ ] **團隊組成**: Product Owner + Scrum Master + 開發團隊
+- [ ] **儀式會議**: 每日站會、Sprint計劃、檢討會、回顧會
+- [ ] **產出物**: Product Backlog、Sprint Backlog、增量產品
+- [ ] **透明度**: 燃盡圖、累積流量圖、速度追蹤
+
+### Sprint工作流程
+
+#### Sprint計劃會議 (每2週一次)
+```markdown
+## Sprint計劃會議議程 (4小時)
+
+### 第一部分: 什麼要做 (2小時)
+- [ ] 檢視Product Backlog優先級
+- [ ] 確認Sprint目標和成功標準
+- [ ] 選擇要完成的User Stories
+- [ ] 確認Definition of Done
+
+### 第二部分: 如何做 (2小時)
+- [ ] 將User Stories分解為具體任務
+- [ ] 估算任務時間和複雜度
+- [ ] 識別依賴關係和風險
+- [ ] 確認團隊容量和可用性
+
+### 產出物
+- Sprint Backlog
+- Sprint目標聲明
+- 風險和依賴關係清單
+```
+
+#### 每日站會 (15分鐘)
+```markdown
+## 每日站會格式
+
+每位團隊成員回答三個問題:
+1. **昨天完成了什麼?**
+ - 完成的任務和達成的目標
+
+2. **今天計劃做什麼?**
+ - 優先處理的任務和預期產出
+
+3. **遇到什麼障礙?**
+ - 需要協助的技術問題
+ - 依賴關係阻礙
+ - 資源不足等問題
+
+## 會後處理
+- Scrum Master記錄和跟進障礙排除
+- 必要時安排專門討論會議
+- 更新燃盡圖和任務狀態
+```
+
+## 開發流程管理
+
+### 任務管理系統
+
+#### Jira/Linear工作流程
+```yaml
+# 故事狀態流程
+story_workflow:
+ - backlog: "產品待辦清單"
+ - ready: "準備開發 (需求明確、設計完成)"
+ - in_progress: "開發中"
+ - code_review: "代碼審查中"
+ - qa_testing: "QA測試中"
+ - staging: "Staging環境驗證"
+ - done: "完成並部署到生產環境"
+
+# 任務優先級
+priority_levels:
+ - critical: "Critical (系統故障、安全問題)"
+ - high: "High (核心功能、用戶影響大)"
+ - medium: "Medium (重要功能、效能優化)"
+ - low: "Low (UI改進、技術債務)"
+```
+
+#### User Story撰寫標準
+```markdown
+## User Story模板
+
+**作為** [角色]
+**我希望** [功能/目標]
+**以便** [商業價值/原因]
+
+### 接受條件
+- [ ] 條件1: 明確的可測試條件
+- [ ] 條件2: 邊界條件和錯誤處理
+- [ ] 條件3: 效能或安全要求
+
+### 定義完成 (Definition of Done)
+- [ ] 功能按接受條件實現
+- [ ] 單元測試覆蓋率 >= 80%
+- [ ] 代碼審查通過
+- [ ] QA測試通過
+- [ ] 文檔更新完成
+
+### 技術任務
+- [ ] 任務1: API端點開發
+- [ ] 任務2: 前端UI實現
+- [ ] 任務3: 資料庫遷移
+- [ ] 任務4: 測試用例編寫
+
+### 估算
+- 故事點數: 5 (基於斐波納契數列: 1,2,3,5,8,13)
+- 預估小時數: 16-20小時
+```
+
+### 版本控制工作流程
+
+#### Git分支策略
+```mermaid
+graph LR
+ A[main] --> B[develop]
+ B --> C[feature/JIRA-123]
+ B --> D[feature/JIRA-124]
+ C --> B
+ D --> B
+ B --> E[release/v1.2.0]
+ E --> A
+ A --> F[hotfix/critical-bug]
+ F --> A
+ F --> B
+```
+
+#### 分支管理規則
+```bash
+# ✅ 分支命名規範
+main # 生產環境代碼,永遠可部署
+develop # 開發整合分支,最新開發進度
+feature/JIRA-123-user-login # 功能開發分支
+hotfix/fix-payment-issue # 緊急修復分支
+release/v1.2.0 # 發布準備分支
+
+# ✅ 功能開發流程
+# 1. 從develop創建feature分支
+git checkout develop
+git pull origin develop
+git checkout -b feature/JIRA-123-dialogue-analysis
+
+# 2. 開發過程中定期提交
+git add .
+git commit -m "feat(dialogue): implement scoring algorithm"
+
+# 3. 開發完成推送並創建PR
+git push origin feature/JIRA-123-dialogue-analysis
+# 在GitHub/GitLab創建Pull Request到develop
+
+# 4. Code Review通過後合併
+git checkout develop
+git pull origin develop
+git branch -d feature/JIRA-123-dialogue-analysis
+```
+
+### Code Review流程
+
+#### PR創建清單
+```markdown
+## Pull Request Template
+
+### 變更摘要
+簡短描述這個PR的主要變更和目的
+
+### 相關票證
+- 修復 #123
+- 關閉 JIRA-456
+
+### 變更類型
+- [ ] 🚀 新功能 (feature)
+- [ ] 🐛 Bug修復 (fix)
+- [ ] 📝 文檔更新 (docs)
+- [ ] 💄 UI/樣式變更 (style)
+- [ ] ♻️ 代碼重構 (refactor)
+- [ ] ⚡ 效能優化 (performance)
+- [ ] ✅ 測試相關 (test)
+- [ ] 🔧 建構/工具變更 (chore)
+
+### 測試
+- [ ] 已新增/更新單元測試
+- [ ] 已新增/更新整合測試
+- [ ] 手動測試已完成
+- [ ] 回歸測試已通過
+
+### 檢查清單
+- [ ] 代碼遵循團隊規範
+- [ ] 自我審查已完成
+- [ ] 相關文檔已更新
+- [ ] 不會破壞現有功能
+```
+
+#### Review要求和流程
+```yaml
+review_requirements:
+ minimum_reviewers: 2
+ required_reviewers:
+ - tech_lead: "技術負責人 (必須)"
+ - domain_expert: "相關領域專家 (建議)"
+
+ review_criteria:
+ - functionality: "功能正確性"
+ - code_quality: "代碼品質和可讀性"
+ - performance: "效能影響評估"
+ - security: "安全性檢查"
+ - testing: "測試覆蓋度"
+ - documentation: "文檔完整性"
+
+ approval_process:
+ - all_required_approved: true
+ - ci_checks_passed: true
+ - conflicts_resolved: true
+ - final_review_by_tech_lead: true
+```
+
+## 品質保證流程
+
+### 自動化測試管道
+
+#### CI/CD Pipeline
+```yaml
+# .github/workflows/ci.yml
+name: Continuous Integration
+
+on:
+ push:
+ branches: [ develop, main ]
+ pull_request:
+ branches: [ develop ]
+
+jobs:
+ # 代碼品質檢查
+ code-quality:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: '18'
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Lint check
+ run: npm run lint
+
+ - name: Type check
+ run: npm run type-check
+
+ - name: Format check
+ run: npm run format:check
+
+ # 單元測試和覆蓋率
+ unit-tests:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: '18'
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Run unit tests
+ run: npm run test:coverage
+
+ - name: Upload coverage to Codecov
+ uses: codecov/codecov-action@v3
+
+ # 整合測試
+ integration-tests:
+ runs-on: ubuntu-latest
+ services:
+ postgres:
+ image: postgres:15
+ env:
+ POSTGRES_PASSWORD: postgres
+ options: >-
+ --health-cmd pg_isready
+ --health-interval 10s
+ --health-timeout 5s
+ --health-retries 5
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: '18'
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Run database migrations
+ run: npm run db:migrate
+ env:
+ DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test
+
+ - name: Run integration tests
+ run: npm run test:integration
+ env:
+ DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test
+
+ # 建構測試
+ build-test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: '18'
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build application
+ run: npm run build
+
+ - name: Test build artifacts
+ run: |
+ ls -la dist/
+ node dist/server.js --version
+```
+
+### 部署流程
+
+#### Staging部署
+```yaml
+# 自動部署到Staging環境
+staging_deployment:
+ trigger: "push到develop分支"
+
+ steps:
+ - code_quality_check: "代碼品質檢查通過"
+ - automated_tests: "所有測試通過"
+ - build_artifacts: "建構產物生成"
+ - deploy_to_staging: "部署到Staging環境"
+ - smoke_tests: "基本功能煙霧測試"
+ - notification: "通知團隊部署完成"
+
+ rollback_conditions:
+ - smoke_tests_fail: "煙霧測試失敗"
+ - health_check_fail: "健康檢查失敗"
+ - error_rate_high: "錯誤率過高"
+```
+
+#### Production部署
+```yaml
+production_deployment:
+ trigger: "手動觸發或release分支創建"
+
+ approval_process:
+ - qa_sign_off: "QA測試通過確認"
+ - product_approval: "產品經理批准"
+ - tech_lead_approval: "技術負責人批准"
+
+ deployment_steps:
+ - pre_deployment_checks: "部署前檢查"
+ - database_migration: "資料庫遷移 (如需要)"
+ - blue_green_deployment: "藍綠部署策略"
+ - health_checks: "健康檢查和監控"
+ - gradual_traffic_shift: "流量逐漸切換"
+ - post_deployment_validation: "部署後驗證"
+
+ rollback_strategy:
+ - automatic_rollback_triggers: "自動回滾觸發條件"
+ - manual_rollback_procedure: "手動回滾程序"
+ - data_recovery_plan: "資料恢復計劃"
+```
+
+## 專案管理工具
+
+### 開發工具整合
+
+#### 必要工具清單
+```yaml
+project_management:
+ - tool: "Jira / Linear"
+ purpose: "需求管理、Sprint規劃、進度追蹤"
+
+ - tool: "Confluence / Notion"
+ purpose: "文檔管理、知識庫、會議記錄"
+
+ - tool: "Slack / Microsoft Teams"
+ purpose: "即時通訊、團隊協作、通知整合"
+
+version_control:
+ - tool: "GitHub / GitLab"
+ purpose: "代碼託管、Code Review、CI/CD"
+
+ - tool: "Git"
+ purpose: "版本控制、分支管理"
+
+development:
+ - tool: "VS Code"
+ purpose: "統一開發環境、擴展套件"
+
+ - tool: "Docker"
+ purpose: "容器化開發環境"
+
+ - tool: "Postman"
+ purpose: "API測試和文檔"
+
+monitoring:
+ - tool: "Sentry"
+ purpose: "錯誤監控和追蹤"
+
+ - tool: "DataDog / New Relic"
+ purpose: "效能監控和分析"
+
+ - tool: "LogRocket"
+ purpose: "前端用戶行為分析"
+```
+
+#### 工具整合配置
+```json
+{
+ "jira_integration": {
+ "commit_message_format": "JIRA-123: commit message",
+ "branch_naming": "feature/JIRA-123-description",
+ "pr_title_format": "[JIRA-123] PR title",
+ "auto_transition": "commit觸發狀態轉換"
+ },
+
+ "slack_notifications": {
+ "pr_created": "#dev-team",
+ "pr_approved": "#dev-team",
+ "deployment_success": "#general",
+ "build_failure": "#dev-alerts",
+ "critical_errors": "#dev-alerts"
+ },
+
+ "monitoring_alerts": {
+ "error_rate_threshold": "5% in 5 minutes",
+ "response_time_threshold": "500ms average",
+ "downtime_alert": "immediate",
+ "deployment_monitoring": "30 minutes post-deploy"
+ }
+}
+```
+
+### 會議和溝通規範
+
+#### 定期會議安排
+```markdown
+## 團隊會議時程表
+
+### 每日會議
+- **每日站會**: 早上 9:30-9:45 (15分鐘)
+ - 地點: 會議室 / Zoom
+ - 參與者: 全體開發團隊
+ - 目的: 同步進度、識別障礙
+
+### 週會議
+- **技術分享會**: 週五 15:00-16:00 (1小時)
+ - 地點: 會議室
+ - 參與者: 技術團隊
+ - 目的: 技術交流、最佳實踐分享
+
+### 雙週會議
+- **Sprint計劃會**: Sprint開始第一天 9:00-13:00 (4小時)
+- **Sprint檢討會**: Sprint最後一天 14:00-15:00 (1小時)
+- **Sprint回顧會**: Sprint最後一天 15:00-16:00 (1小時)
+
+### 月會議
+- **架構審查會**: 每月第一個週三 14:00-16:00 (2小時)
+- **產品路線圖會**: 每月最後一個週五 10:00-12:00 (2小時)
+```
+
+#### 有效會議原則
+```markdown
+## 會議最佳實踐
+
+### 會議前準備
+- [ ] 明確會議目的和議程
+- [ ] 提前分享相關資料
+- [ ] 確認必要參與者
+- [ ] 準備會議室和設備
+
+### 會議進行
+- [ ] 準時開始和結束
+- [ ] 專注議程不偏題
+- [ ] 記錄決議和行動項目
+- [ ] 確保每個人都有發言機會
+
+### 會議後續
+- [ ] 24小時內分享會議記錄
+- [ ] 追蹤行動項目執行
+- [ ] 更新相關文檔和票證
+- [ ] 安排必要的後續會議
+```
+
+## 知識管理和文檔
+
+### 技術文檔管理
+
+#### 文檔類型和負責人
+```yaml
+documentation_types:
+ api_documentation:
+ owner: "後端開發負責人"
+ tools: "Swagger/OpenAPI, Postman"
+ update_frequency: "每個Sprint"
+
+ architecture_documentation:
+ owner: "技術架構師"
+ tools: "Confluence/Notion, Draw.io"
+ update_frequency: "重大變更時"
+
+ user_guides:
+ owner: "產品經理"
+ tools: "Confluence/Notion"
+ update_frequency: "功能發布時"
+
+ runbooks:
+ owner: "DevOps工程師"
+ tools: "Confluence/Notion"
+ update_frequency: "部署流程變更時"
+```
+
+#### 文檔審查和維護
+```markdown
+## 文檔生命週期管理
+
+### 創建階段
+- [ ] 確定文檔類型和模板
+- [ ] 指派文檔負責人
+- [ ] 設定審查時程
+- [ ] 建立版本控制
+
+### 審查階段
+- [ ] 技術準確性審查
+- [ ] 可讀性和結構檢查
+- [ ] 範例和代碼驗證
+- [ ] 相關人員簽字確認
+
+### 維護階段
+- [ ] 定期內容更新
+- [ ] 過時資訊清理
+- [ ] 用戶回饋整合
+- [ ] 存取權限管理
+
+### 退役階段
+- [ ] 標記過時文檔
+- [ ] 建立重導向連結
+- [ ] 通知相關使用者
+- [ ] 歸檔或刪除處理
+```
+
+### 知識分享機制
+
+#### 技術分享會規劃
+```markdown
+## 月度技術分享主題
+
+### 技術深度分享
+- React Native效能優化技巧
+- PostgreSQL查詢最佳化實戰
+- OpenAI API整合經驗分享
+- AWS服務架構設計心得
+
+### 工具和流程分享
+- Git工作流程最佳實踐
+- 自動化測試策略分享
+- 代碼審查技巧和心得
+- 監控和告警系統應用
+
+### 外部學習分享
+- 技術會議參與心得
+- 線上課程學習成果
+- 開源專案貢獻經驗
+- 行業趨勢和新技術調研
+```
+
+## 風險管理和應變
+
+### 常見風險識別
+
+#### 技術風險管控
+```yaml
+technical_risks:
+ dependency_vulnerabilities:
+ monitoring: "Dependabot自動掃描"
+ response_time: "24小時內評估"
+ mitigation: "立即更新或尋找替代方案"
+
+ performance_degradation:
+ monitoring: "持續效能監控"
+ threshold: "API回應時間 > 500ms"
+ response: "自動告警 + 立即調查"
+
+ third_party_service_outage:
+ monitoring: "服務健康檢查"
+ backup_plan: "降級模式或替代服務"
+ communication: "用戶通知和狀態頁面更新"
+
+ data_security_breach:
+ monitoring: "安全性掃描和審計"
+ response_plan: "安全事件回應流程"
+ recovery: "資料恢復和系統加固"
+```
+
+#### 專案風險應對
+```yaml
+project_risks:
+ timeline_delays:
+ early_warning: "Sprint燃盡圖異常"
+ response: "資源重新分配或範圍調整"
+ escalation: "每週向管理層報告"
+
+ team_capacity_shortage:
+ monitoring: "團隊工作負載追蹤"
+ response: "外包支援或功能優先級調整"
+ prevention: "提前識別關鍵技能需求"
+
+ quality_issues:
+ monitoring: "代碼品質指標和用戶回饋"
+ response: "增加測試投入或重構計劃"
+ prevention: "強化代碼審查和自動化測試"
+```
+
+### 緊急事件處理
+
+#### 事件等級分類
+```markdown
+## 事件嚴重程度分級
+
+### P0 - 緊急 (Critical)
+- 描述: 服務完全中斷,影響所有用戶
+- 回應時間: 15分鐘內
+- 解決時間: 1小時內
+- 升級: 立即通知管理層
+- 範例: 主要服務完全無法存取
+
+### P1 - 高 (High)
+- 描述: 重要功能故障,影響大量用戶
+- 回應時間: 30分鐘內
+- 解決時間: 4小時內
+- 升級: 2小時後升級
+- 範例: 支付系統故障
+
+### P2 - 中 (Medium)
+- 描述: 部分功能異常,影響部分用戶
+- 回應時間: 2小時內
+- 解決時間: 24小時內
+- 升級: 標準工作時間處理
+- 範例: 特定功能性能下降
+
+### P3 - 低 (Low)
+- 描述: 輕微問題,不影響核心功能
+- 回應時間: 24小時內
+- 解決時間: 一週內
+- 升級: 正常開發週期處理
+- 範例: UI顯示小問題
+```
+
+#### 事件處理流程
+```mermaid
+flowchart TD
+ A[事件發生] --> B[事件檢測/報告]
+ B --> C[事件分級]
+ C --> D[組建事件響應團隊]
+ D --> E[初步診斷和評估]
+ E --> F[實施緊急修復]
+ F --> G[驗證修復效果]
+ G --> H{問題是否解決?}
+ H -->|否| I[深入調查]
+ I --> F
+ H -->|是| J[事件關閉]
+ J --> K[事後檢討會議]
+ K --> L[改進措施實施]
+```
+
+---
+
+## 持續改進機制
+
+### 團隊回顧和改進
+
+#### Sprint回顧會模板
+```markdown
+## Sprint回顧會議 (Retrospective)
+
+### 會議資訊
+- Sprint: Sprint #12
+- 日期: 2024年9月5日
+- 參與者: 全體開發團隊
+- 主持人: Scrum Master
+
+### 回顧內容
+
+#### 做得好的方面 (Keep)
+- [ ] 項目1: 代碼審查品質提升,bug減少30%
+- [ ] 項目2: 團隊溝通更順暢,每日站會效率提升
+- [ ] 項目3: 自動化測試覆蓋率達到85%
+
+#### 需要改進的方面 (Problem)
+- [ ] 問題1: API文檔更新不及時,影響前端開發
+- [ ] 問題2: 測試環境不穩定,影響QA測試進度
+- [ ] 問題3: 技術債務積累,需要專門時間清理
+
+#### 改進行動項目 (Try)
+- [ ] 行動1: 建立API文檔自動生成流程 (負責人: 後端Lead)
+- [ ] 行動2: 升級測試環境硬體配置 (負責人: DevOps)
+- [ ] 行動3: 每Sprint分配20%時間處理技術債務 (負責人: 技術Lead)
+
+### 下次檢查
+下個Sprint回顧會檢查改進行動的執行情況
+```
+
+### 指標追蹤和改善
+
+#### 開發效率指標
+```yaml
+development_metrics:
+ velocity_tracking:
+ measurement: "每Sprint完成的故事點數"
+ target: "穩定在35-45點之間"
+ trend: "應該保持穩定或略有增長"
+
+ cycle_time:
+ measurement: "從開發開始到部署完成的時間"
+ target: "平均5天以內"
+ trend: "持續降低"
+
+ defect_rate:
+ measurement: "生產環境發現的bug數量"
+ target: "每Sprint < 3個"
+ trend: "持續降低"
+
+ code_quality:
+ test_coverage: "> 80%"
+ code_review_participation: "100%"
+ technical_debt_ratio: "< 5%"
+```
+
+#### 改進策略制定
+```markdown
+## 持續改進策略
+
+### 月度改進檢討
+- [ ] 收集和分析開發效率指標
+- [ ] 識別瓶頸和改進機會
+- [ ] 制定具體改進行動計劃
+- [ ] 分配責任人和時間表
+
+### 季度技術回顧
+- [ ] 評估技術架構和工具選擇
+- [ ] 檢討開發流程和最佳實踐
+- [ ] 規劃技術升級和創新項目
+- [ ] 團隊技能發展規劃
+
+### 年度流程優化
+- [ ] 全面檢視開發工作流程
+- [ ] 對比行業最佳實踐
+- [ ] 制定下年度改進路線圖
+- [ ] 投資新工具和技術培訓
+```
+
+---
+
+## 待完成任務
+
+### 立即執行
+1. [ ] 設置專案管理工具 (Jira/Linear) 和工作流程
+2. [ ] 建立Git分支策略和保護規則
+3. [ ] 設置CI/CD pipeline基礎架構
+4. [ ] 制定代碼審查模板和檢查清單
+
+### 短期目標 (2週內)
+1. [ ] 完成開發環境標準化設置
+2. [ ] 建立自動化測試框架
+3. [ ] 設置監控和告警系統
+4. [ ] 制定文檔管理規範
+
+### 中期目標 (1個月內)
+1. [ ] 建立完整的部署自動化流程
+2. [ ] 設置效能和品質指標監控
+3. [ ] 建立知識分享和培訓機制
+4. [ ] 制定事件回應和處理流程
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: Scrum Master / 技術Lead
+**下次檢討**: 每月月末進行流程檢討和優化
\ No newline at end of file
diff --git a/docs/03_development/project-roadmap.md b/docs/03_development/project-roadmap.md
new file mode 100644
index 0000000..9d27858
--- /dev/null
+++ b/docs/03_development/project-roadmap.md
@@ -0,0 +1,471 @@
+# 專案開發路線圖
+
+## 概述
+基於產品需求和技術架構設計,制定 Drama Ling 應用的完整開發計劃,包含功能優先級、開發里程碑和資源分配。
+
+## 開發原則與策略
+
+### 敏捷開發方法
+- [ ] **迭代週期**: 2週一個Sprint,快速迭代和回饋
+- [ ] **MVP先行**: 優先開發最小可行產品驗證核心概念
+- [ ] **用戶導向**: 每個功能都有明確的用戶價值和成功指標
+- [ ] **技術債務**: 在功能開發和技術優化間保持平衡
+- [ ] **持續整合**: 自動化測試和部署確保代碼品質
+
+### 風險管控策略
+- [ ] **技術驗證**: 高風險技術提前進行概念驗證(PoC)
+- [ ] **並行開發**: 前後端及移動端同步開發減少依賴等待
+- [ ] **備用方案**: 關鍵功能準備技術備案
+- [ ] **績效監控**: 建立關鍵績效指標(KPI)追蹤開發進度
+- [ ] **定期檢討**: 每月里程碑檢討,適時調整開發計劃
+
+## Phase 1: MVP開發 (Month 1-3)
+
+### 目標:建立核心學習體驗
+**核心價值**: 用戶能夠進行基礎對話練習並獲得AI回饋
+
+### Sprint 1-2: 基礎架構 (Week 1-4)
+**後端基礎設施**
+- [ ] 資料庫架構建立 (PostgreSQL + Redis)
+- [ ] 用戶認證系統 (註冊/登入/JWT)
+- [ ] 基礎API框架 (.NET Core Web API)
+- [ ] Entity Framework Core 設定和遷移
+- [ ] AWS基礎設施配置 (ECS + RDS + S3)
+- [ ] CI/CD Pipeline 建立
+
+**前端基礎架構**
+- [ ] Flutter專案初始化 (iOS + Android)
+- [ ] 基礎路由結構設計 (Go Router)
+- [ ] UI元件庫建立 (Material Design 3)
+- [ ] 狀態管理架構 (Riverpod)
+- [ ] API客戶端設置 (Dio + Retrofit)
+
+**預期產出**:
+- 基礎應用框架可運行
+- 用戶註冊登入流程完成
+- 開發環境和部署流程建立
+
+### Sprint 3-4: 核心對話功能 (Week 5-8)
+**對話系統開發**
+- [ ] 基礎場景資料結構設計
+- [ ] 對話流程引擎開發
+- [ ] AI整合 (OpenAI API)
+- [ ] 即時對話介面實現
+- [ ] 基礎評分系統
+
+**內容管理**
+- [ ] 3-5個基礎對話場景 (A1-A2程度)
+- [ ] 場景內容管理後台
+- [ ] 音頻資源處理和存儲
+- [ ] 基礎詞彙庫建立
+
+**預期產出**:
+- 用戶可完成基礎對話練習
+- AI能提供簡單評分和建議
+- 5個可用的學習場景
+
+### Sprint 5-6: 用戶體驗優化 (Week 9-12)
+**學習進度追蹤**
+- [ ] 用戶學習資料記錄
+- [ ] 基礎進度頁面
+- [ ] 學習統計和圖表
+- [ ] 詞彙掌握度追蹤
+
+**介面優化**
+- [ ] UI/UX設計實現和調整
+- [ ] 動畫效果和互動回饋
+- [ ] 響應式設計優化
+- [ ] 無障礙設計實現
+
+**預期產出**:
+- 完整的MVP可供內部測試
+- 用戶學習進度可視化
+- 流暢的使用者體驗
+
+### Phase 1 交付標準
+- [ ] 用戶註冊、登入功能正常
+- [ ] 至少5個對話場景可用
+- [ ] AI評分和回饋功能運作
+- [ ] 基礎學習進度追蹤
+- [ ] 應用穩定性 > 95%
+- [ ] API響應時間 < 500ms
+
+---
+
+## Phase 2: 完整功能開發 (Month 4-8)
+
+### 目標:打造完整學習生態系統
+**核心價值**: 豐富的學習內容和遊戲化機制提升用戶參與度
+
+### Sprint 7-8: 遊戲化系統 (Week 13-16)
+**積分和排行榜**
+- [ ] 積分計算規則實現
+- [ ] 排行榜系統開發
+- [ ] 用戶等級和經驗值
+- [ ] 好友系統基礎功能
+
+**成就系統**
+- [ ] 成就定義和觸發邏輯
+- [ ] 徽章系統和視覺設計
+- [ ] 成就通知和慶祝動畫
+- [ ] 進度追蹤和統計
+
+**預期產出**:
+- 完整的遊戲化激勵機制
+- 用戶參與度提升工具
+- 社交競爭功能
+
+### Sprint 9-10: 內容擴充 (Week 17-20)
+**場景內容**
+- [ ] 15個日常生活場景 (A1-B1)
+- [ ] 12個社交互動場景 (A2-B2)
+- [ ] 場景難度分級和推薦系統
+- [ ] 文化背景介紹內容
+
+**詞彙系統**
+- [ ] 間隔複習演算法實現
+- [ ] 每日複習功能
+- [ ] 詞彙掌握度評估
+- [ ] 個人化複習計劃
+
+**預期產出**:
+- 27+個高品質學習場景
+- 智能複習系統上線
+- 個人化學習推薦
+
+### Sprint 11-12: AI功能增強 (Week 21-24)
+**進階AI分析**
+- [ ] 三維度評分系統精緻化
+- [ ] 詳細錯誤分析和建議
+- [ ] 個人化學習建議
+- [ ] 語音識別整合(基礎)
+
+**對話訂正**
+- [ ] 即時語法檢查
+- [ ] 更好表達方式建議
+- [ ] 文化適應性提示
+- [ ] 發音評估(基礎)
+
+**預期產出**:
+- 高精準度AI分析系統
+- 個人化學習體驗
+- 語音互動基礎功能
+
+### Sprint 13-14: 商業功能 (Week 25-28)
+**訂閱系統**
+- [ ] 訂閱方案管理
+- [ ] 支付系統整合 (Stripe)
+- [ ] 訂閱狀態管理
+- [ ] 免費用戶限制實現
+
+**內容商店**
+- [ ] 付費內容包系統
+- [ ] 購買流程和驗證
+- [ ] 內容解鎖機制
+- [ ] 購買記錄管理
+
+**預期產出**:
+- 完整的變現機制
+- 用戶付費轉換管道
+- 收入追蹤系統
+
+### Sprint 15-16: 品質保證 (Week 29-32)
+**效能優化**
+- [ ] API效能調優
+- [ ] 資料庫查詢最佳化
+- [ ] 前端載入速度優化
+- [ ] 記憶體使用最佳化
+
+**測試完善**
+- [ ] 自動化測試覆蓋率 > 80%
+- [ ] 端到端測試流程
+- [ ] 效能測試和壓力測試
+- [ ] 安全性測試
+
+**預期產出**:
+- 高品質、穩定的應用
+- 完整的測試套件
+- 效能指標達標
+
+### Phase 2 交付標準
+- [ ] 27+個對話場景上線
+- [ ] 完整遊戲化機制運作
+- [ ] 訂閱和付費功能正常
+- [ ] AI分析準確度 > 85%
+- [ ] 用戶留存率 > 30% (7日)
+- [ ] 應用效能指標全面達標
+
+---
+
+## Phase 3: 進階功能與擴展 (Month 9-12)
+
+### 目標:建立競爭優勢和規模化基礎
+**核心價值**: 專業功能和企業服務擴大用戶群體
+
+### Sprint 17-18: 進階學習功能 (Week 33-36)
+**專業場景內容**
+- [ ] 15個應急處理場景 (B1-C1)
+- [ ] 18個專業場景 (B2-C2)
+- [ ] 商務英語特化內容
+- [ ] 考試準備專用場景
+
+**語音功能強化**
+- [ ] 高精度語音識別
+- [ ] 發音評估和矯正
+- [ ] 語調分析
+- [ ] 口語流暢度評測
+
+**預期產出**:
+- 專業級學習內容
+- 完整語音學習體驗
+- 考試備考功能
+
+### Sprint 19-20: 企業功能開發 (Week 37-40)
+**B2B管理平台**
+- [ ] 企業帳戶管理系統
+- [ ] 員工學習進度追蹤
+- [ ] 客製化內容上傳
+- [ ] 學習成效報告系統
+
+**API和整合**
+- [ ] 第三方系統API開發
+- [ ] 單一登入(SSO)整合
+- [ ] 學習資料匯出功能
+- [ ] 企業級安全設定
+
+**預期產出**:
+- 企業客戶服務能力
+- 多系統整合能力
+- 規模化服務基礎
+
+### Sprint 21-22: 多語言支援 (Week 41-44)
+**國際化架構**
+- [ ] 多語言框架建立
+- [ ] 日語學習內容開發
+- [ ] 韓語基礎內容
+- [ ] 本地化管理系統
+
+**文化適應**
+- [ ] 地區化內容調整
+- [ ] 文化背景資料庫
+- [ ] 多語言客服系統
+- [ ] 在地化付費方式
+
+**預期產出**:
+- 多語言產品版本
+- 國際市場進入準備
+- 本地化服務能力
+
+### Sprint 23-24: 數據分析與最佳化 (Week 45-48)
+**資料分析平台**
+- [ ] 用戶行為分析系統
+- [ ] 學習效果追蹤
+- [ ] 商業指標儀表板
+- [ ] 預測性分析模型
+
+**智能推薦**
+- [ ] 個人化內容推薦
+- [ ] 學習路徑最佳化
+- [ ] 困難點預測和介入
+- [ ] 自適應難度調整
+
+**預期產出**:
+- 資料驅動的產品優化
+- 智能化學習體驗
+- 精準營運決策能力
+
+### Phase 3 交付標準
+- [ ] 60+個完整學習場景
+- [ ] 企業客戶服務能力
+- [ ] 多語言版本(英日韓)
+- [ ] 資料分析和推薦系統
+- [ ] 月活躍用戶 > 10,000
+- [ ] 付費轉換率 > 5%
+
+---
+
+## 資源配置計劃
+
+### 團隊組織架構
+
+#### 核心開發團隊 (10-12人)
+```yaml
+frontend_team:
+ - flutter_lead: 1人
+ - flutter_developers: 2-3人
+ - ui_ux_developer: 1人
+
+backend_team:
+ - dotnet_lead: 1人
+ - api_developers: 2人 (.NET Core)
+ - devops_engineer: 1人
+
+product_team:
+ - product_manager: 1人
+ - ui_ux_designer: 1人
+ - qa_engineer: 1人
+
+content_team:
+ - content_manager: 1人 (外包/兼職)
+ - language_experts: 2-3人 (外包)
+```
+
+#### 外部資源
+- [ ] **AI技術顧問**: OpenAI/Anthropic專家
+- [ ] **教育專家**: 語言學習專業顧問
+- [ ] **營運顧問**: 用戶增長和變現專家
+- [ ] **法律顧問**: 隱私合規和智財權
+
+### 預算分配 (年度)
+
+```yaml
+development_costs:
+ personnel: "$800K-1.2M" # 70-75%
+ infrastructure: "$120K-180K" # 10-15%
+ third_party_services: "$60K-120K" # 5-10%
+ marketing_mvp: "$60K-120K" # 5-10%
+ total: "$1.04M-1.62M"
+
+monthly_operational:
+ team_salaries: "$65K-100K"
+ aws_infrastructure: "$5K-15K"
+ ai_api_costs: "$3K-10K"
+ other_services: "$2K-5K"
+ total: "$75K-130K/month"
+```
+
+## 技術里程碑檢查點
+
+### 關鍵技術驗證點
+
+#### Month 2: 技術可行性驗證
+- [ ] AI分析準確度測試 (目標: >80%)
+- [ ] 語音處理延遲測試 (目標: <3秒)
+- [ ] 資料庫效能測試 (目標: <100ms查詢時間)
+- [ ] 移動端效能測試 (目標: <2秒冷啟動)
+
+#### Month 5: 系統穩定性測試
+- [ ] 負載測試 (目標: 1000併發用戶)
+- [ ] 服務可用性 (目標: >99.5%)
+- [ ] 資料一致性測試
+- [ ] 安全性滲透測試
+
+#### Month 8: 商業功能驗證
+- [ ] 支付流程端到端測試
+- [ ] 訂閱生命週期管理
+- [ ] 內容保護和授權驗證
+- [ ] 用戶資料隱私合規
+
+#### Month 11: 擴展性準備
+- [ ] 多語言系統測試
+- [ ] 企業功能整合測試
+- [ ] 資料分析管道驗證
+- [ ] 災難復原流程測試
+
+## 風險管理與應變計劃
+
+### 高風險項目與緩解策略
+
+#### 技術風險
+| 風險項目 | 影響程度 | 應變策略 | 時間buffer |
+|---------|---------|----------|-----------|
+| AI API成本暴增 | 高 | 本地模型備案、使用量控制 | +2週 |
+| 語音識別準確度不足 | 中 | 多供應商整合、降級方案 | +3週 |
+| 資料庫效能瓶頸 | 中 | 早期壓力測試、架構調整 | +2週 |
+| 第三方服務中斷 | 低 | 多供應商策略、本地備案 | +1週 |
+
+#### 產品風險
+| 風險項目 | 影響程度 | 應變策略 | 時間buffer |
+|---------|---------|----------|-----------|
+| 用戶接受度低 | 高 | A/B測試、快速迭代 | +4週 |
+| 內容品質不達標 | 中 | 專家審核、用戶回饋機制 | +3週 |
+| 競爭對手搶先 | 中 | 差異化功能、加速開發 | -2週 |
+| 法規合規問題 | 低 | 法律審查、架構預留 | +2週 |
+
+### 應變計劃啟動標準
+- [ ] **黃色警戒**: 里程碑延遲 >1週
+- [ ] **橙色警戒**: 里程碑延遲 >2週或核心功能風險
+- [ ] **紅色警戒**: 里程碑延遲 >4週或產品方向重大調整
+
+## 成功指標與KPI
+
+### 開發效率指標
+```yaml
+development_kpis:
+ velocity:
+ target: "80% of planned story points completed"
+ measurement: "per sprint"
+
+ quality:
+ bug_rate: "< 5 bugs per 100 story points"
+ test_coverage: "> 80%"
+
+ deployment:
+ deployment_frequency: "> 2 times per week"
+ lead_time: "< 3 days from commit to production"
+
+ reliability:
+ uptime: "> 99.5%"
+ mttr: "< 2 hours"
+```
+
+### 產品成功指標
+```yaml
+product_kpis:
+ user_engagement:
+ dau: "Daily Active Users growth"
+ session_length: "> 10 minutes average"
+ retention_rate: "> 30% (Day 7)"
+
+ learning_effectiveness:
+ completion_rate: "> 70% per dialogue"
+ skill_improvement: "Measurable progress metrics"
+ user_satisfaction: "> 4.2/5.0 rating"
+
+ business_metrics:
+ conversion_rate: "> 3% (free to paid)"
+ churn_rate: "< 10% monthly"
+ ltv_cac_ratio: "> 3:1"
+```
+
+## 持續改進機制
+
+### 定期檢討會議
+- [ ] **每日站會**: 進度同步、障礙排除
+- [ ] **Sprint檢討**: 2週一次,調整開發計劃
+- [ ] **月度里程碑**: 重大決策和方向調整
+- [ ] **季度規劃**: 長期策略和資源調配
+
+### 回饋循環機制
+- [ ] **用戶回饋**: 產品內回饋、用戶訪談、滿意度調查
+- [ ] **資料洞察**: 用戶行為分析、效能監控、業務指標
+- [ ] **團隊回饋**: 回顧會議、改進建議、技術分享
+- [ ] **市場回饋**: 競品分析、市場趨勢、合作夥伴意見
+
+---
+
+## 待完成任務
+
+### 立即執行 (本週)
+1. [ ] 確認開發團隊組織架構和人員配置
+2. [ ] 建立專案管理工具和協作流程 (Jira/Linear)
+3. [ ] 設置開發環境和CI/CD基礎設施
+4. [ ] 開始Sprint 1的技術架構開發
+
+### 短期規劃 (1個月內)
+1. [ ] 完成MVP功能的詳細需求文檔
+2. [ ] 建立代碼審查和品質控制標準
+3. [ ] 設計用戶測試和回饋收集機制
+4. [ ] 制定詳細的內容創作計劃
+
+### 中期規劃 (3個月內)
+1. [ ] 建立完整的監控和告警系統
+2. [ ] 規劃企業客戶服務的銷售和交付流程
+3. [ ] 建立多語言內容的創作和管理流程
+4. [ ] 設計用戶增長和市場推廣策略
+
+---
+
+**最後更新**: 2024年9月5日
+**專案負責人**: 待指定
+**下次檢討**: 2024年9月19日
\ No newline at end of file
diff --git a/docs/04_technical/api-specifications.md b/docs/04_technical/api-specifications.md
new file mode 100644
index 0000000..8a23234
--- /dev/null
+++ b/docs/04_technical/api-specifications.md
@@ -0,0 +1,998 @@
+# API 規格文檔
+
+## 概述
+定義 Drama Ling 應用的完整 RESTful API 規格,基於 `system_structure_design.json` 中定義的14個功能特性和9個數據源設計。
+
+## API 設計原則
+
+### RESTful 設計標準
+- [ ] **資源導向**: API端點基於資源設計而非動作
+- [ ] **HTTP動詞**: 正確使用GET、POST、PUT、DELETE、PATCH
+- [ ] **狀態碼**: 使用標準HTTP狀態碼表示結果
+- [ ] **無狀態**: API設計為無狀態,不依賴server端session
+- [ ] **版本控制**: API版本控制策略 (如 `/api/v1/`)
+
+### API 安全原則
+- [ ] **身份驗證**: JWT Token認證機制
+- [ ] **授權控制**: Role-based權限控制
+- [ ] **資料驗證**: 嚴格的輸入資料驗證
+- [ ] **速率限制**: 防止API濫用的速率控制
+- [ ] **HTTPS強制**: 所有API強制使用HTTPS
+
+### 回應格式標準
+```json
+{
+ "success": boolean,
+ "data": object | array | null,
+ "message": string,
+ "error": {
+ "code": string,
+ "message": string,
+ "details": object
+ },
+ "meta": {
+ "timestamp": "ISO8601",
+ "request_id": "string",
+ "pagination": object
+ }
+}
+```
+
+## 認證與授權 API
+
+### 用戶認證
+```http
+POST /api/v1/auth/register
+Content-Type: application/json
+
+{
+ "email": "user@example.com",
+ "password": "securePassword123",
+ "username": "dramatic_learner",
+ "preferredLanguage": "en",
+ "nativeLanguage": "zh-TW"
+}
+```
+
+```http
+Response 201 Created
+{
+ "success": true,
+ "data": {
+ "userId": "550e8400-e29b-41d4-a716-446655440000",
+ "username": "dramatic_learner",
+ "email": "user@example.com",
+ "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
+ "refreshToken": "550e8400-e29b-41d4-a716-446655440001",
+ "expiresIn": 3600
+ },
+ "message": "User registered successfully",
+ "meta": {
+ "timestamp": "2024-09-05T15:30:00Z",
+ "requestId": "550e8400-e29b-41d4-a716-446655440002"
+ }
+}
+```
+
+### 登入驗證
+```http
+POST /api/v1/auth/login
+{
+ "email": "user@example.com",
+ "password": "securePassword123"
+}
+```
+
+### Token 更新
+```http
+POST /api/v1/auth/refresh
+Authorization: Bearer
+```
+
+### 登出
+```http
+POST /api/v1/auth/logout
+Authorization: Bearer
+```
+
+## 用戶資料管理 API
+
+### 用戶資料 (UserProfile)
+
+#### 獲取用戶資料
+```http
+GET /api/v1/users/profile
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "user_id": "USR_12345",
+ "username": "dramatic_learner",
+ "email": "user@example.com",
+ "avatar_url": "https://cdn.example.com/avatars/12345.jpg",
+ "level": "B1",
+ "total_score": 15680,
+ "streak_days": 15,
+ "joined_date": "2024-01-15T08:00:00Z",
+ "last_active": "2024-09-05T14:30:00Z",
+ "preferences": {
+ "target_language": "en",
+ "native_language": "zh-TW",
+ "difficulty_preference": "adaptive",
+ "daily_goal_minutes": 30,
+ "notifications_enabled": true,
+ "theme": "light"
+ },
+ "subscription": {
+ "plan": "premium",
+ "status": "active",
+ "expires_at": "2025-01-15T08:00:00Z"
+ }
+ }
+}
+```
+
+#### 更新用戶資料
+```http
+PUT /api/v1/users/profile
+Authorization: Bearer
+{
+ "username": "new_username",
+ "avatar_url": "https://cdn.example.com/avatars/new_avatar.jpg",
+ "preferences": {
+ "daily_goal_minutes": 45,
+ "notifications_enabled": false
+ }
+}
+```
+
+#### 用戶學習統計
+```http
+GET /api/v1/users/stats
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "total_dialogues": 245,
+ "total_study_time": 1280, // minutes
+ "vocabulary_learned": 890,
+ "vocabulary_mastered": 650,
+ "scenarios_completed": 35,
+ "achievements_unlocked": 18,
+ "current_streak": 15,
+ "longest_streak": 28,
+ "weekly_progress": {
+ "dialogues_this_week": 12,
+ "minutes_this_week": 180,
+ "goal_completion_rate": 0.85
+ }
+ }
+}
+```
+
+## 學習內容 API
+
+### 課程與場景 (Lesson)
+
+#### 獲取場景列表
+```http
+GET /api/v1/lessons/scenarios
+Authorization: Bearer
+Query Parameters:
+- category: string (daily_life, social, emergency, professional)
+- difficulty: string (A1, A2, B1, B2, C1, C2)
+- limit: integer (default: 20)
+- offset: integer (default: 0)
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "scenarios": [
+ {
+ "scenario_id": "SC_Restaurant_01",
+ "title": "餐廳訂位",
+ "description": "學習如何在餐廳預約座位和點餐",
+ "category": "daily_life",
+ "difficulty": "A2",
+ "estimated_duration": 8, // minutes
+ "thumbnail_url": "https://cdn.example.com/scenarios/restaurant.jpg",
+ "vocabulary_count": 25,
+ "completion_rate": 0.75,
+ "user_completed": true,
+ "user_score": 85,
+ "unlock_condition": null,
+ "is_premium": false
+ }
+ ],
+ "pagination": {
+ "total": 65,
+ "page": 1,
+ "per_page": 20,
+ "total_pages": 4
+ }
+ }
+}
+```
+
+#### 獲取場景詳情
+```http
+GET /api/v1/lessons/scenarios/{scenario_id}
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "scenario_id": "SC_Restaurant_01",
+ "title": "餐廳訂位",
+ "description": "學習如何在餐廳預約座位和點餐",
+ "category": "daily_life",
+ "difficulty": "A2",
+ "learning_objectives": [
+ "學會預約餐廳座位",
+ "掌握點餐相關詞彙",
+ "練習詢問食材和偏好"
+ ],
+ "target_vocabulary": [
+ {
+ "word": "reservation",
+ "phonetic": "/ˌrezəˈveɪʃən/",
+ "translation": "預約",
+ "definition": "an arrangement to have something kept for you"
+ }
+ ],
+ "cultural_notes": "西式餐廳通常需要事先預約,特別是在熱門時段...",
+ "estimated_duration": 8,
+ "prerequisite_scenarios": ["SC_Greeting_01"],
+ "user_progress": {
+ "completed": true,
+ "best_score": 85,
+ "completion_count": 3,
+ "last_completed": "2024-09-03T19:20:00Z"
+ }
+ }
+}
+```
+
+### 詞彙管理 API
+
+#### 獲取詞彙列表
+```http
+GET /api/v1/vocabulary
+Authorization: Bearer
+Query Parameters:
+- category: string (life, academic, business, etc.)
+- difficulty: string (A1-C2)
+- mastery_level: string (learning, practicing, mastered)
+- limit: integer (default: 50)
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "vocabulary": [
+ {
+ "vocab_id": "VOC_0001",
+ "word": "restaurant",
+ "phonetic": "/ˈrestərɑːnt/",
+ "part_of_speech": "noun",
+ "definition": "A place where people pay to sit and eat meals",
+ "translation": "餐廳",
+ "difficulty": "A2",
+ "frequency_rank": 1250,
+ "user_mastery": {
+ "level": "practicing", // learning, practicing, mastered
+ "score": 75,
+ "review_count": 5,
+ "last_reviewed": "2024-09-03T10:15:00Z",
+ "next_review": "2024-09-07T10:15:00Z"
+ },
+ "example_sentences": [
+ {
+ "english": "We made a reservation at the new restaurant.",
+ "chinese": "我們在新餐廳訂了位。"
+ }
+ ]
+ }
+ ]
+ }
+}
+```
+
+#### 詞彙複習API
+```http
+GET /api/v1/vocabulary/review/daily
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "review_session_id": "REV_20240905_USR12345",
+ "total_words": 15,
+ "estimated_time": 5, // minutes
+ "words": [
+ {
+ "vocab_id": "VOC_0001",
+ "word": "restaurant",
+ "review_type": "recognition", // recognition, recall, spelling
+ "options": ["餐廳", "旅館", "商店", "學校"] // for recognition type
+ }
+ ]
+ }
+}
+```
+
+#### 提交複習結果
+```http
+POST /api/v1/vocabulary/review/submit
+Authorization: Bearer
+{
+ "review_session_id": "REV_20240905_USR12345",
+ "results": [
+ {
+ "vocab_id": "VOC_0001",
+ "user_answer": "餐廳",
+ "is_correct": true,
+ "response_time": 2.5, // seconds
+ "confidence": 4 // 1-5 scale
+ }
+ ]
+}
+```
+
+## 對話練習 API
+
+### 對話系統 (Dialogue)
+
+#### 開始對話練習
+```http
+POST /api/v1/dialogues/start
+Authorization: Bearer
+{
+ "scenario_id": "SC_Restaurant_01",
+ "difficulty_override": "A2", // optional
+ "target_vocabulary": ["reservation", "menu", "order"] // optional
+}
+
+Response 201 Created
+{
+ "success": true,
+ "data": {
+ "dialogue_id": "DLG_20240905_001",
+ "scenario_id": "SC_Restaurant_01",
+ "session_token": "session_token_here",
+ "initial_context": {
+ "setting": "高級餐廳內部,晚上8點",
+ "your_role": "客人",
+ "ai_role": "餐廳服務員",
+ "objective": "成功預約並點餐"
+ },
+ "ai_message": {
+ "message": "Good evening! Welcome to Milano Restaurant. Do you have a reservation?",
+ "audio_url": "https://cdn.example.com/audio/dlg001_001.mp3",
+ "suggestions": [
+ "Yes, I have a reservation under Smith.",
+ "No, but could we get a table for two?",
+ "I'd like to make a reservation for tonight."
+ ]
+ }
+ }
+}
+```
+
+#### 發送對話訊息
+```http
+POST /api/v1/dialogues/{dialogue_id}/message
+Authorization: Bearer
+{
+ "message": "Yes, I have a reservation under Chen for 8 PM.",
+ "message_type": "text", // text, audio
+ "audio_url": "https://cdn.example.com/user_audio/msg001.mp3" // if audio
+}
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "ai_response": {
+ "message": "Perfect! Mr. Chen, your table for two is ready. Right this way please.",
+ "audio_url": "https://cdn.example.com/audio/dlg001_002.mp3",
+ "analysis": {
+ "grammar_score": 90,
+ "semantic_score": 95,
+ "fluency_score": 85,
+ "overall_score": 90,
+ "feedback": "Excellent use of formal language for restaurant context!"
+ },
+ "suggestions": [
+ "Thank you. Could we see the menu please?",
+ "Great! What do you recommend today?",
+ "Thank you. We'd like to start with drinks."
+ ]
+ },
+ "dialogue_progress": {
+ "turns_completed": 2,
+ "estimated_turns_remaining": 6,
+ "objectives_completed": ["greeting", "reservation_confirmation"],
+ "objectives_remaining": ["ordering", "payment"]
+ }
+ }
+}
+```
+
+#### 獲取AI分析詳情
+```http
+GET /api/v1/dialogues/{dialogue_id}/analysis
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "dialogue_id": "DLG_20240905_001",
+ "overall_analysis": {
+ "grammar_score": 88,
+ "semantic_score": 92,
+ "fluency_score": 85,
+ "total_score": 88,
+ "completion_percentage": 100
+ },
+ "detailed_feedback": [
+ {
+ "turn_number": 1,
+ "user_message": "Yes, I have a reservation under Chen for 8 PM.",
+ "analysis": {
+ "grammar_issues": [],
+ "semantic_appropriateness": "Excellent - appropriate formality level",
+ "fluency_notes": "Natural and confident delivery",
+ "suggestions": [],
+ "vocabulary_used": [
+ {
+ "word": "reservation",
+ "usage_correctness": "perfect",
+ "context_appropriateness": "excellent"
+ }
+ ]
+ }
+ }
+ ],
+ "improvement_suggestions": [
+ "Consider using more varied vocabulary for ordering",
+ "Practice pronunciation of 'th' sounds"
+ ],
+ "vocabulary_progress": {
+ "words_practiced": 8,
+ "words_used_correctly": 7,
+ "new_words_encountered": 3
+ }
+ }
+}
+```
+
+#### 結束對話
+```http
+POST /api/v1/dialogues/{dialogue_id}/complete
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "dialogue_summary": {
+ "dialogue_id": "DLG_20240905_001",
+ "duration": 420, // seconds
+ "turns_completed": 8,
+ "final_score": 88,
+ "objectives_achieved": 4,
+ "objectives_total": 4,
+ "vocabulary_practiced": 12,
+ "experience_gained": 150,
+ "score_gained": 75
+ },
+ "rewards": {
+ "experience_points": 150,
+ "score_points": 75,
+ "achievements_unlocked": ["First Perfect Dialogue"],
+ "vocabulary_progress": {
+ "words_advanced": 3,
+ "words_mastered": 1
+ }
+ }
+ }
+}
+```
+
+## 任務系統 API
+
+### 任務管理 (Task & TaskReward)
+
+#### 獲取可用任務
+```http
+GET /api/v1/tasks
+Authorization: Bearer
+Query Parameters:
+- type: string (daily, weekly, achievement, challenge)
+- status: string (available, in_progress, completed)
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "tasks": [
+ {
+ "task_id": "TASK_DAILY_001",
+ "type": "daily",
+ "title": "完成3次對話練習",
+ "description": "今天完成任意3次對話練習以獲得獎勵",
+ "objectives": [
+ {
+ "objective_id": "OBJ_001",
+ "description": "完成對話練習",
+ "target_value": 3,
+ "current_value": 1,
+ "unit": "次"
+ }
+ ],
+ "rewards": {
+ "experience": 100,
+ "score": 50,
+ "special_items": ["daily_streak_bonus"]
+ },
+ "deadline": "2024-09-05T23:59:59Z",
+ "status": "in_progress",
+ "created_at": "2024-09-05T00:00:00Z"
+ }
+ ]
+ }
+}
+```
+
+#### 獲取任務詳情
+```http
+GET /api/v1/tasks/{task_id}
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "task_id": "TASK_WEEKLY_001",
+ "type": "weekly",
+ "title": "週練習大師",
+ "description": "本週完成20次對話練習並達到平均85分",
+ "long_description": "挑戰自己在本週內完成20次高品質的對話練習...",
+ "objectives": [
+ {
+ "objective_id": "OBJ_001",
+ "description": "完成對話練習",
+ "target_value": 20,
+ "current_value": 8,
+ "unit": "次"
+ },
+ {
+ "objective_id": "OBJ_002",
+ "description": "平均分數達標",
+ "target_value": 85,
+ "current_value": 87.5,
+ "unit": "分"
+ }
+ ],
+ "rewards": {
+ "experience": 500,
+ "score": 300,
+ "special_items": ["premium_scenario_unlock"],
+ "achievements": ["weekly_master"]
+ },
+ "progress_percentage": 40,
+ "deadline": "2024-09-08T23:59:59Z",
+ "difficulty": "medium"
+ }
+}
+```
+
+#### 領取任務獎勵
+```http
+POST /api/v1/tasks/{task_id}/claim_reward
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "rewards_claimed": {
+ "experience": 500,
+ "score": 300,
+ "special_items": ["premium_scenario_unlock"],
+ "achievements": ["weekly_master"]
+ },
+ "updated_user_stats": {
+ "total_experience": 15680,
+ "total_score": 8950,
+ "level": "B1+",
+ "achievements_count": 19
+ }
+ }
+}
+```
+
+## 排行榜與競爭 API
+
+### 排行榜系統 (Leaderboard)
+
+#### 獲取排行榜
+```http
+GET /api/v1/leaderboard
+Authorization: Bearer
+Query Parameters:
+- type: string (global, weekly, friends, regional)
+- category: string (overall, dialogue_count, vocabulary_mastered)
+- limit: integer (default: 50)
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "leaderboard_type": "global",
+ "category": "overall",
+ "period": "all_time",
+ "updated_at": "2024-09-05T15:30:00Z",
+ "user_rank": {
+ "rank": 1247,
+ "score": 15680,
+ "percentile": 78.5
+ },
+ "top_users": [
+ {
+ "rank": 1,
+ "user_id": "USR_VIP_001",
+ "username": "LanguageMaster",
+ "avatar_url": "https://cdn.example.com/avatars/vip001.jpg",
+ "score": 45680,
+ "level": "C2",
+ "country": "TW",
+ "streak_days": 365,
+ "badges": ["yearly_champion", "perfectionist"]
+ }
+ ],
+ "nearby_users": [
+ // Users around current user's rank
+ ]
+ }
+}
+```
+
+#### 好友排行榜
+```http
+GET /api/v1/leaderboard/friends
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "friends_ranking": [
+ {
+ "rank": 1,
+ "user_id": "USR_12346",
+ "username": "StudyBuddy",
+ "avatar_url": "https://cdn.example.com/avatars/12346.jpg",
+ "score": 18950,
+ "level": "B2",
+ "status": "online",
+ "recent_activity": "完成了商務會議場景 - 2小時前"
+ }
+ ],
+ "current_user": {
+ "rank": 3,
+ "score": 15680,
+ "score_difference": -3270, // difference from rank 1
+ "rank_change": 1 // compared to last week
+ }
+ }
+}
+```
+
+## 訂閱與購買 API
+
+### 訂閱管理 (Subscription)
+
+#### 獲取訂閱方案
+```http
+GET /api/v1/subscriptions/plans
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "plans": [
+ {
+ "plan_id": "PLAN_BASIC",
+ "name": "基礎版",
+ "description": "解鎖基礎功能,享受無廣告體驗",
+ "price": {
+ "monthly": {
+ "amount": 199,
+ "currency": "TWD",
+ "original_price": 199
+ },
+ "yearly": {
+ "amount": 1980,
+ "currency": "TWD",
+ "original_price": 2388,
+ "discount_percentage": 17
+ }
+ },
+ "features": [
+ "無限對話練習",
+ "無廣告體驗",
+ "基礎AI分析",
+ "雲端同步"
+ ],
+ "limitations": [
+ "僅基礎和社交場景",
+ "不含語音識別"
+ ]
+ }
+ ],
+ "current_subscription": {
+ "plan_id": "PLAN_PREMIUM",
+ "status": "active",
+ "expires_at": "2025-01-15T08:00:00Z",
+ "auto_renewal": true,
+ "payment_method": "credit_card"
+ }
+ }
+}
+```
+
+#### 訂閱方案
+```http
+POST /api/v1/subscriptions/subscribe
+Authorization: Bearer
+{
+ "plan_id": "PLAN_PREMIUM",
+ "billing_cycle": "yearly", // monthly, yearly
+ "payment_method_id": "pm_1234567890",
+ "auto_renewal": true
+}
+
+Response 201 Created
+{
+ "success": true,
+ "data": {
+ "subscription_id": "SUB_20240905_001",
+ "plan_id": "PLAN_PREMIUM",
+ "status": "active",
+ "started_at": "2024-09-05T15:30:00Z",
+ "expires_at": "2025-09-05T15:30:00Z",
+ "next_billing_date": "2025-09-05T15:30:00Z",
+ "amount_paid": 3999,
+ "currency": "TWD"
+ }
+}
+```
+
+### 內購系統 (Purchase)
+
+#### 獲取付費內容
+```http
+GET /api/v1/store/content
+Authorization: Bearer
+Query Parameters:
+- category: string (scenario_pack, expert_course, premium_content)
+- price_range: string (0-100, 100-500, 500+)
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "content_packs": [
+ {
+ "content_id": "PACK_TRAVEL_001",
+ "type": "scenario_pack",
+ "title": "旅遊場景包",
+ "description": "包含機場、飯店、觀光等15個實用旅遊場景",
+ "price": {
+ "amount": 149,
+ "currency": "TWD",
+ "original_price": 199,
+ "discount_percentage": 25
+ },
+ "content_preview": {
+ "scenarios_count": 15,
+ "estimated_hours": 8,
+ "difficulty_range": "A2-B2",
+ "preview_scenario": "SC_AIRPORT_001"
+ },
+ "thumbnail_url": "https://cdn.example.com/packs/travel.jpg",
+ "user_owned": false,
+ "special_offer": {
+ "expires_at": "2024-09-10T23:59:59Z",
+ "offer_text": "限時75折優惠!"
+ }
+ }
+ ]
+ }
+}
+```
+
+#### 購買內容
+```http
+POST /api/v1/store/purchase
+Authorization: Bearer
+{
+ "content_id": "PACK_TRAVEL_001",
+ "payment_method_id": "pm_1234567890"
+}
+
+Response 201 Created
+{
+ "success": true,
+ "data": {
+ "purchase_id": "PUR_20240905_001",
+ "content_id": "PACK_TRAVEL_001",
+ "amount_paid": 149,
+ "currency": "TWD",
+ "purchased_at": "2024-09-05T15:45:00Z",
+ "content_unlocked": {
+ "scenarios": ["SC_AIRPORT_001", "SC_HOTEL_001", "..."],
+ "access_expires": null // permanent access
+ }
+ }
+}
+```
+
+### 廣告系統 (AdImpression)
+
+#### 獲取廣告獎勵機會
+```http
+GET /api/v1/ads/opportunities
+Authorization: Bearer
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "available_ads": [
+ {
+ "ad_id": "AD_REWARD_001",
+ "type": "video",
+ "duration": 30, // seconds
+ "reward": {
+ "type": "extra_dialogue",
+ "quantity": 2,
+ "description": "額外2次對話練習機會"
+ },
+ "cooldown_remaining": 0, // seconds until next ad
+ "daily_limit_remaining": 3
+ }
+ ]
+ }
+}
+```
+
+#### 觀看廣告獲得獎勵
+```http
+POST /api/v1/ads/watch
+Authorization: Bearer
+{
+ "ad_id": "AD_REWARD_001",
+ "watch_duration": 30, // seconds actually watched
+ "completion_status": "completed" // completed, skipped, error
+}
+
+Response 200 OK
+{
+ "success": true,
+ "data": {
+ "reward_granted": {
+ "type": "extra_dialogue",
+ "quantity": 2,
+ "expires_at": "2024-09-06T15:45:00Z"
+ },
+ "next_ad_available_at": "2024-09-05T16:15:00Z"
+ }
+}
+```
+
+---
+
+## 錯誤處理
+
+### 標準錯誤碼
+```json
+{
+ "success": false,
+ "error": {
+ "code": "VALIDATION_ERROR",
+ "message": "輸入資料驗證失敗",
+ "details": {
+ "field": "email",
+ "reason": "invalid_format"
+ }
+ }
+}
+```
+
+### 常見錯誤碼
+- `UNAUTHORIZED` (401): 未授權存取
+- `FORBIDDEN` (403): 權限不足
+- `NOT_FOUND` (404): 資源不存在
+- `VALIDATION_ERROR` (400): 資料驗證失敗
+- `RATE_LIMIT_EXCEEDED` (429): 超過速率限制
+- `INTERNAL_SERVER_ERROR` (500): 伺服器內部錯誤
+- `SERVICE_UNAVAILABLE` (503): 服務暫時不可用
+
+### 訂閱相關錯誤
+- `SUBSCRIPTION_REQUIRED`: 需要訂閱才能存取
+- `SUBSCRIPTION_EXPIRED`: 訂閱已過期
+- `PAYMENT_FAILED`: 付款處理失敗
+- `CONTENT_NOT_PURCHASED`: 內容未購買
+
+---
+
+## API 版本控制與部署
+
+### 版本控制策略
+- [ ] **URL版本控制**: `/api/v1/`, `/api/v2/`
+- [ ] **向後相容**: 新版本保持向後相容性
+- [ ] **廢棄通知**: 提前6個月通知API廢棄
+- [ ] **多版本支援**: 同時支援2-3個版本
+- [ ] **版本文檔**: 每個版本維護獨立文檔
+
+### 環境配置
+```bash
+# 開發環境
+API_BASE_URL=https://dev-api.dramaling.com
+API_VERSION=v1
+
+# 測試環境
+API_BASE_URL=https://staging-api.dramaling.com
+API_VERSION=v1
+
+# 生產環境
+API_BASE_URL=https://api.dramaling.com
+API_VERSION=v1
+```
+
+### 效能考量
+- [ ] **回應時間**: 95%的API請求在200ms內回應
+- [ ] **快取策略**: 靜態內容使用CDN,動態內容使用Redis
+- [ ] **資料庫優化**: 適當的索引和查詢優化
+- [ ] **負載平衡**: 水平擴展API服務器
+- [ ] **監控告警**: API效能和錯誤率監控
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 完善所有API端點的詳細規格和範例
+2. [ ] 設計API的認證和授權機制
+3. [ ] 建立API文檔的自動生成和維護流程
+4. [ ] 實現API的錯誤處理和驗證邏輯
+
+### 中優先級
+1. [ ] 設計API的快取和效能優化策略
+2. [ ] 建立API的測試套件和自動化測試
+3. [ ] 規劃API的版本控制和遷移策略
+4. [ ] 設計API的監控和分析系統
+
+### 低優先級
+1. [ ] 研究GraphQL作為REST API的補充
+2. [ ] 探索Real-time API (WebSocket) 的應用場景
+3. [ ] 建立API的開發者工具和SDK
+4. [ ] 設計第三方整合的API授權機制
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 待分配
+**審查週期**: 每兩週檢討一次
\ No newline at end of file
diff --git a/docs/04_technical/database-schema.md b/docs/04_technical/database-schema.md
new file mode 100644
index 0000000..0652707
--- /dev/null
+++ b/docs/04_technical/database-schema.md
@@ -0,0 +1,822 @@
+# 資料庫架構設計
+
+## 概述
+基於 `system_structure_design.json` 中定義的9個數據源設計完整的資料庫架構,支援Drama Ling應用的所有功能需求。
+
+## 資料庫設計原則
+
+### 設計原則
+- [ ] **正規化設計**: 遵循第三正規化原則,減少資料重複
+- [ ] **效能優化**: 針對查詢頻繁的欄位建立適當索引
+- [ ] **擴展性**: 設計支援未來功能擴展的彈性架構
+- [ ] **資料完整性**: 使用外鍵約束確保資料一致性
+- [ ] **安全性**: 敏感資料加密存儲,存取權限控制
+
+### 技術選型
+- [ ] **主資料庫**: PostgreSQL 15+ (關聯式資料庫)
+- [ ] **快取層**: Redis 7+ (高速快取和Session存儲)
+- [ ] **搜尋引擎**: Elasticsearch 8+ (全文檢索和分析)
+- [ ] **檔案存儲**: AWS S3 / MinIO (多媒體檔案存儲)
+- [ ] **時序資料**: InfluxDB (學習行為分析資料)
+
+## 核心資料表設計
+
+### 1. 用戶資料表 (UserProfile)
+
+```sql
+CREATE TABLE users (
+ user_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ username VARCHAR(50) UNIQUE NOT NULL,
+ email VARCHAR(255) UNIQUE NOT NULL,
+ password_hash VARCHAR(255) NOT NULL,
+ salt VARCHAR(50) NOT NULL,
+
+ -- 基本資料
+ avatar_url TEXT,
+ first_name VARCHAR(100),
+ last_name VARCHAR(100),
+ date_of_birth DATE,
+ gender VARCHAR(20),
+ country_code CHAR(2),
+ timezone VARCHAR(50) DEFAULT 'UTC',
+
+ -- 語言設定
+ native_language VARCHAR(10) NOT NULL DEFAULT 'zh-TW',
+ target_languages JSONB DEFAULT '["en"]',
+ current_level VARCHAR(10) DEFAULT 'A1',
+
+ -- 學習統計
+ total_score INTEGER DEFAULT 0,
+ total_experience INTEGER DEFAULT 0,
+ current_streak INTEGER DEFAULT 0,
+ longest_streak INTEGER DEFAULT 0,
+ total_study_time INTEGER DEFAULT 0, -- minutes
+
+ -- 偏好設定
+ preferences JSONB DEFAULT '{}',
+ notification_settings JSONB DEFAULT '{}',
+
+ -- 系統欄位
+ status VARCHAR(20) DEFAULT 'active',
+ email_verified BOOLEAN DEFAULT FALSE,
+ last_login_at TIMESTAMPTZ,
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ -- 索引
+ CONSTRAINT users_username_check CHECK (length(username) >= 3),
+ CONSTRAINT users_email_check CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
+);
+
+-- 索引
+CREATE INDEX idx_users_username ON users(username);
+CREATE INDEX idx_users_email ON users(email);
+CREATE INDEX idx_users_status ON users(status);
+CREATE INDEX idx_users_country ON users(country_code);
+CREATE INDEX idx_users_created_at ON users(created_at);
+```
+
+### 2. 課程場景表 (Lesson)
+
+```sql
+CREATE TABLE lessons (
+ lesson_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ lesson_code VARCHAR(50) UNIQUE NOT NULL, -- SC_Restaurant_01
+
+ -- 基本資訊
+ title VARCHAR(200) NOT NULL,
+ description TEXT,
+ long_description TEXT,
+ category VARCHAR(50) NOT NULL, -- daily_life, social, emergency, professional
+ sub_category VARCHAR(50),
+
+ -- 難度與分級
+ difficulty_level VARCHAR(10) NOT NULL, -- A1, A2, B1, B2, C1, C2
+ estimated_duration INTEGER, -- minutes
+ complexity_score INTEGER DEFAULT 1, -- 1-10
+
+ -- 學習目標
+ learning_objectives JSONB DEFAULT '[]',
+ target_vocabulary JSONB DEFAULT '[]',
+ grammar_points JSONB DEFAULT '[]',
+
+ -- 內容資料
+ scenario_data JSONB NOT NULL, -- 對話流程、角色設定等
+ cultural_notes TEXT,
+ background_audio_url TEXT,
+ thumbnail_url TEXT,
+
+ -- 解鎖條件
+ prerequisite_lessons JSONB DEFAULT '[]',
+ unlock_conditions JSONB DEFAULT '{}',
+ is_premium BOOLEAN DEFAULT FALSE,
+
+ -- 統計資料
+ popularity_score DECIMAL(3,2) DEFAULT 0.00,
+ average_rating DECIMAL(3,2) DEFAULT 0.00,
+ completion_rate DECIMAL(3,2) DEFAULT 0.00,
+
+ -- 系統欄位
+ status VARCHAR(20) DEFAULT 'active',
+ published_at TIMESTAMPTZ,
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT lessons_difficulty_check CHECK (difficulty_level IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')),
+ CONSTRAINT lessons_category_check CHECK (category IN ('daily_life', 'social', 'emergency', 'professional'))
+);
+
+-- 索引
+CREATE INDEX idx_lessons_category ON lessons(category);
+CREATE INDEX idx_lessons_difficulty ON lessons(difficulty_level);
+CREATE INDEX idx_lessons_status ON lessons(status) WHERE status = 'active';
+CREATE INDEX idx_lessons_premium ON lessons(is_premium);
+CREATE INDEX idx_lessons_popularity ON lessons(popularity_score DESC);
+```
+
+### 3. 對話記錄表 (Dialogue)
+
+```sql
+CREATE TABLE dialogues (
+ dialogue_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+ lesson_id UUID REFERENCES lessons(lesson_id) ON DELETE SET NULL,
+
+ -- 對話基本資訊
+ session_token VARCHAR(255) UNIQUE,
+ scenario_context JSONB, -- 場景設定、角色資訊
+
+ -- 對話進度
+ status VARCHAR(20) DEFAULT 'in_progress', -- in_progress, completed, abandoned
+ turn_count INTEGER DEFAULT 0,
+ current_objective VARCHAR(100),
+ objectives_completed JSONB DEFAULT '[]',
+
+ -- 評分與分析
+ grammar_score INTEGER,
+ semantic_score INTEGER,
+ fluency_score INTEGER,
+ overall_score INTEGER,
+ ai_feedback JSONB,
+
+ -- 時間記錄
+ started_at TIMESTAMPTZ DEFAULT NOW(),
+ completed_at TIMESTAMPTZ,
+ total_duration INTEGER, -- seconds
+
+ -- 詞彙使用
+ vocabulary_used JSONB DEFAULT '[]',
+ new_vocabulary_encountered JSONB DEFAULT '[]',
+
+ -- 系統欄位
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT dialogues_status_check CHECK (status IN ('in_progress', 'completed', 'abandoned')),
+ CONSTRAINT dialogues_scores_check CHECK (
+ (grammar_score IS NULL OR grammar_score BETWEEN 0 AND 100) AND
+ (semantic_score IS NULL OR semantic_score BETWEEN 0 AND 100) AND
+ (fluency_score IS NULL OR fluency_score BETWEEN 0 AND 100) AND
+ (overall_score IS NULL OR overall_score BETWEEN 0 AND 100)
+ )
+);
+
+-- 索引
+CREATE INDEX idx_dialogues_user ON dialogues(user_id);
+CREATE INDEX idx_dialogues_lesson ON dialogues(lesson_id);
+CREATE INDEX idx_dialogues_status ON dialogues(status);
+CREATE INDEX idx_dialogues_completed ON dialogues(completed_at) WHERE completed_at IS NOT NULL;
+CREATE INDEX idx_dialogues_score ON dialogues(overall_score) WHERE overall_score IS NOT NULL;
+```
+
+### 4. 對話訊息表 (DialogueMessages)
+
+```sql
+CREATE TABLE dialogue_messages (
+ message_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ dialogue_id UUID REFERENCES dialogues(dialogue_id) ON DELETE CASCADE,
+
+ -- 訊息基本資料
+ turn_number INTEGER NOT NULL,
+ sender_type VARCHAR(10) NOT NULL, -- user, ai
+ message_type VARCHAR(20) DEFAULT 'text', -- text, audio, system
+
+ -- 訊息內容
+ message_text TEXT,
+ audio_url TEXT,
+ metadata JSONB, -- 音調、語速等音頻元資料
+
+ -- AI分析結果 (僅用戶訊息)
+ analysis_result JSONB,
+ corrections JSONB,
+ suggestions JSONB,
+
+ -- 回應時間 (僅用戶訊息)
+ response_time DECIMAL(5,3), -- seconds
+
+ -- 系統欄位
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT msg_sender_check CHECK (sender_type IN ('user', 'ai')),
+ CONSTRAINT msg_type_check CHECK (message_type IN ('text', 'audio', 'system'))
+);
+
+-- 索引
+CREATE INDEX idx_dialogue_messages_dialogue ON dialogue_messages(dialogue_id);
+CREATE INDEX idx_dialogue_messages_turn ON dialogue_messages(dialogue_id, turn_number);
+```
+
+### 5. 任務系統表 (Task & TaskReward)
+
+```sql
+CREATE TABLE tasks (
+ task_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ task_code VARCHAR(100) UNIQUE NOT NULL,
+
+ -- 任務基本資訊
+ task_type VARCHAR(20) NOT NULL, -- daily, weekly, monthly, achievement, special
+ title VARCHAR(200) NOT NULL,
+ description TEXT,
+ long_description TEXT,
+
+ -- 任務條件
+ objectives JSONB NOT NULL, -- 任務目標配置
+ requirements JSONB DEFAULT '{}', -- 完成條件
+ difficulty VARCHAR(20) DEFAULT 'easy', -- easy, medium, hard, expert
+
+ -- 獎勵設定
+ rewards JSONB NOT NULL, -- 經驗值、積分、道具等獎勵
+
+ -- 時間設定
+ duration_hours INTEGER, -- 任務持續時間
+ cooldown_hours INTEGER, -- 重置冷卻時間
+
+ -- 狀態與統計
+ status VARCHAR(20) DEFAULT 'active',
+ completion_rate DECIMAL(5,4) DEFAULT 0.0000,
+ total_attempts INTEGER DEFAULT 0,
+ total_completions INTEGER DEFAULT 0,
+
+ -- 系統欄位
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT tasks_type_check CHECK (task_type IN ('daily', 'weekly', 'monthly', 'achievement', 'special')),
+ CONSTRAINT tasks_difficulty_check CHECK (difficulty IN ('easy', 'medium', 'hard', 'expert'))
+);
+
+CREATE TABLE user_tasks (
+ user_task_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+ task_id UUID REFERENCES tasks(task_id) ON DELETE CASCADE,
+
+ -- 進度追蹤
+ status VARCHAR(20) DEFAULT 'in_progress', -- in_progress, completed, expired, abandoned
+ progress JSONB DEFAULT '{}', -- 各目標的完成進度
+ progress_percentage DECIMAL(5,2) DEFAULT 0.00,
+
+ -- 時間記錄
+ assigned_at TIMESTAMPTZ DEFAULT NOW(),
+ started_at TIMESTAMPTZ,
+ completed_at TIMESTAMPTZ,
+ expires_at TIMESTAMPTZ,
+
+ -- 獎勵狀態
+ reward_claimed BOOLEAN DEFAULT FALSE,
+ reward_claimed_at TIMESTAMPTZ,
+
+ CONSTRAINT user_tasks_status_check CHECK (status IN ('in_progress', 'completed', 'expired', 'abandoned')),
+ UNIQUE(user_id, task_id, assigned_at::date) -- 防止同日重複分配
+);
+
+-- 索引
+CREATE INDEX idx_tasks_type ON tasks(task_type);
+CREATE INDEX idx_tasks_status ON tasks(status);
+CREATE INDEX idx_user_tasks_user ON user_tasks(user_id);
+CREATE INDEX idx_user_tasks_status ON user_tasks(status);
+CREATE INDEX idx_user_tasks_expires ON user_tasks(expires_at) WHERE status = 'in_progress';
+```
+
+### 6. 排行榜系統 (Leaderboard)
+
+```sql
+CREATE TABLE leaderboards (
+ leaderboard_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ leaderboard_type VARCHAR(50) NOT NULL, -- global, weekly, monthly, friends, regional
+ category VARCHAR(50) NOT NULL, -- overall_score, dialogue_count, vocabulary_mastered, streak
+
+ -- 時間範圍
+ period_type VARCHAR(20) NOT NULL, -- all_time, daily, weekly, monthly, yearly
+ period_start DATE,
+ period_end DATE,
+
+ -- 地區設定 (針對regional類型)
+ region_code VARCHAR(10),
+
+ -- 狀態
+ status VARCHAR(20) DEFAULT 'active',
+ last_updated TIMESTAMPTZ DEFAULT NOW(),
+
+ -- 系統欄位
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT lb_type_check CHECK (leaderboard_type IN ('global', 'weekly', 'monthly', 'friends', 'regional')),
+ CONSTRAINT lb_category_check CHECK (category IN ('overall_score', 'dialogue_count', 'vocabulary_mastered', 'streak')),
+ CONSTRAINT lb_period_check CHECK (period_type IN ('all_time', 'daily', 'weekly', 'monthly', 'yearly'))
+);
+
+CREATE TABLE leaderboard_entries (
+ entry_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ leaderboard_id UUID REFERENCES leaderboards(leaderboard_id) ON DELETE CASCADE,
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+
+ -- 排名資料
+ rank_position INTEGER NOT NULL,
+ score INTEGER NOT NULL,
+ previous_rank INTEGER,
+ rank_change INTEGER DEFAULT 0,
+
+ -- 詳細統計 (依leaderboard category而定)
+ detailed_stats JSONB DEFAULT '{}',
+
+ -- 時間戳記
+ calculated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ UNIQUE(leaderboard_id, user_id),
+ UNIQUE(leaderboard_id, rank_position)
+);
+
+-- 索引
+CREATE INDEX idx_leaderboards_type_category ON leaderboards(leaderboard_type, category);
+CREATE INDEX idx_lb_entries_leaderboard ON leaderboard_entries(leaderboard_id);
+CREATE INDEX idx_lb_entries_rank ON leaderboard_entries(leaderboard_id, rank_position);
+CREATE INDEX idx_lb_entries_user ON leaderboard_entries(user_id);
+```
+
+### 7. 訂閱與付費 (Subscription & Purchase)
+
+```sql
+CREATE TABLE subscription_plans (
+ plan_id VARCHAR(50) PRIMARY KEY,
+ plan_name VARCHAR(100) NOT NULL,
+ description TEXT,
+
+ -- 定價
+ monthly_price INTEGER, -- 以分為單位 (TWD)
+ yearly_price INTEGER,
+ currency VARCHAR(3) DEFAULT 'TWD',
+
+ -- 功能權限
+ features JSONB NOT NULL,
+ limitations JSONB DEFAULT '{}',
+
+ -- 狀態
+ status VARCHAR(20) DEFAULT 'active',
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+CREATE TABLE subscriptions (
+ subscription_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+ plan_id VARCHAR(50) REFERENCES subscription_plans(plan_id),
+
+ -- 訂閱狀態
+ status VARCHAR(20) NOT NULL DEFAULT 'active', -- active, expired, cancelled, paused
+ billing_cycle VARCHAR(20) NOT NULL, -- monthly, yearly
+
+ -- 時間管理
+ started_at TIMESTAMPTZ DEFAULT NOW(),
+ current_period_start TIMESTAMPTZ DEFAULT NOW(),
+ current_period_end TIMESTAMPTZ,
+ cancelled_at TIMESTAMPTZ,
+ expires_at TIMESTAMPTZ,
+
+ -- 付費資訊
+ amount INTEGER NOT NULL, -- 以分為單位
+ currency VARCHAR(3) DEFAULT 'TWD',
+ payment_method_id VARCHAR(100),
+ auto_renewal BOOLEAN DEFAULT TRUE,
+
+ -- 外部系統整合
+ external_subscription_id VARCHAR(100), -- Stripe等第三方訂閱ID
+
+ -- 系統欄位
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT sub_status_check CHECK (status IN ('active', 'expired', 'cancelled', 'paused')),
+ CONSTRAINT sub_billing_check CHECK (billing_cycle IN ('monthly', 'yearly'))
+);
+
+CREATE TABLE purchases (
+ purchase_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+
+ -- 購買內容
+ content_type VARCHAR(50) NOT NULL, -- scenario_pack, expert_course, premium_content
+ content_id VARCHAR(100) NOT NULL,
+ content_title VARCHAR(200),
+
+ -- 付費資訊
+ amount INTEGER NOT NULL, -- 以分為單位
+ currency VARCHAR(3) DEFAULT 'TWD',
+ payment_status VARCHAR(20) DEFAULT 'pending', -- pending, completed, failed, refunded
+ payment_method VARCHAR(50),
+
+ -- 外部付費系統
+ external_payment_id VARCHAR(100), -- Stripe Payment Intent ID
+ payment_metadata JSONB DEFAULT '{}',
+
+ -- 時間記錄
+ purchased_at TIMESTAMPTZ DEFAULT NOW(),
+ refunded_at TIMESTAMPTZ,
+
+ -- 系統欄位
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT purchase_status_check CHECK (payment_status IN ('pending', 'completed', 'failed', 'refunded'))
+);
+
+-- 索引
+CREATE INDEX idx_subscriptions_user ON subscriptions(user_id);
+CREATE INDEX idx_subscriptions_status ON subscriptions(status);
+CREATE INDEX idx_subscriptions_expires ON subscriptions(expires_at) WHERE status = 'active';
+CREATE INDEX idx_purchases_user ON purchases(user_id);
+CREATE INDEX idx_purchases_content ON purchases(content_type, content_id);
+```
+
+### 8. 廣告系統 (AdImpression)
+
+```sql
+CREATE TABLE ad_campaigns (
+ campaign_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ campaign_name VARCHAR(200) NOT NULL,
+
+ -- 廣告內容
+ ad_type VARCHAR(20) NOT NULL, -- video, banner, interstitial, rewarded
+ content_url TEXT,
+ duration INTEGER, -- seconds for video ads
+
+ -- 目標設定
+ target_audience JSONB DEFAULT '{}',
+ daily_budget INTEGER, -- 以分為單位
+ max_impressions_per_user INTEGER DEFAULT 5,
+
+ -- 獎勵設定 (針對rewarded ads)
+ reward_type VARCHAR(50),
+ reward_amount INTEGER,
+
+ -- 時間設定
+ starts_at TIMESTAMPTZ,
+ ends_at TIMESTAMPTZ,
+
+ -- 狀態
+ status VARCHAR(20) DEFAULT 'active',
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT ad_type_check CHECK (ad_type IN ('video', 'banner', 'interstitial', 'rewarded'))
+);
+
+CREATE TABLE ad_impressions (
+ impression_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ campaign_id UUID REFERENCES ad_campaigns(campaign_id) ON DELETE CASCADE,
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+
+ -- 展示資訊
+ impression_type VARCHAR(20) NOT NULL, -- impression, click, completion
+ ad_placement VARCHAR(50), -- home_screen, post_dialogue, reward_offer
+
+ -- 用戶行為
+ watch_duration INTEGER DEFAULT 0, -- seconds
+ completion_rate DECIMAL(5,4), -- 0.0000 - 1.0000
+ user_action VARCHAR(20), -- viewed, clicked, skipped, completed
+
+ -- 獎勵發放
+ reward_granted BOOLEAN DEFAULT FALSE,
+ reward_type VARCHAR(50),
+ reward_amount INTEGER,
+
+ -- 系統資訊
+ user_agent TEXT,
+ ip_address INET,
+ country_code CHAR(2),
+
+ -- 時間記錄
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+
+ CONSTRAINT impression_type_check CHECK (impression_type IN ('impression', 'click', 'completion')),
+ CONSTRAINT user_action_check CHECK (user_action IN ('viewed', 'clicked', 'skipped', 'completed'))
+);
+
+-- 索引
+CREATE INDEX idx_ad_impressions_campaign ON ad_impressions(campaign_id);
+CREATE INDEX idx_ad_impressions_user ON ad_impressions(user_id);
+CREATE INDEX idx_ad_impressions_date ON ad_impressions(created_at);
+CREATE INDEX idx_ad_impressions_reward ON ad_impressions(reward_granted) WHERE reward_granted = TRUE;
+```
+
+### 9. 詞彙系統擴展
+
+```sql
+CREATE TABLE vocabulary_bank (
+ vocab_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+
+ -- 基本詞彙資訊
+ word VARCHAR(100) NOT NULL,
+ phonetic VARCHAR(200),
+ part_of_speech VARCHAR(50),
+
+ -- 定義與翻譯
+ definition_en TEXT,
+ definition_native JSONB, -- 支援多語言翻譯
+
+ -- 分類與分級
+ category VARCHAR(50), -- life, academic, business, etc.
+ subcategory VARCHAR(50),
+ difficulty_level VARCHAR(10), -- A1-C2
+ frequency_rank INTEGER,
+
+ -- 學習輔助
+ etymology TEXT, -- 詞源
+ memory_tips JSONB, -- 記憶提示
+ collocations JSONB, -- 常用搭配
+ synonyms JSONB, -- 同義詞
+ antonyms JSONB, -- 反義詞
+
+ -- 多媒體資源
+ audio_url TEXT,
+ image_url TEXT,
+ example_sentences JSONB,
+
+ -- 使用統計
+ usage_frequency INTEGER DEFAULT 0,
+ learning_difficulty DECIMAL(3,2) DEFAULT 5.00, -- 1.00-10.00
+
+ -- 系統欄位
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ UNIQUE(word, part_of_speech)
+);
+
+CREATE TABLE user_vocabulary_progress (
+ progress_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+ vocab_id UUID REFERENCES vocabulary_bank(vocab_id) ON DELETE CASCADE,
+
+ -- 掌握度狀態
+ mastery_level VARCHAR(20) DEFAULT 'learning', -- learning, practicing, mastered, forgotten
+ mastery_score INTEGER DEFAULT 0, -- 0-100
+
+ -- 複習資料
+ review_count INTEGER DEFAULT 0,
+ correct_count INTEGER DEFAULT 0,
+ incorrect_count INTEGER DEFAULT 0,
+
+ -- 間隔複習演算法
+ ease_factor DECIMAL(4,2) DEFAULT 2.50, -- SuperMemo算法參數
+ interval_days INTEGER DEFAULT 1,
+ next_review_date DATE,
+ last_review_quality INTEGER, -- 1-5
+
+ -- 時間記錄
+ first_encountered TIMESTAMPTZ DEFAULT NOW(),
+ last_reviewed TIMESTAMPTZ,
+ mastered_at TIMESTAMPTZ,
+
+ -- 學習情境
+ encountered_in_lessons JSONB DEFAULT '[]',
+ encountered_in_dialogues JSONB DEFAULT '[]',
+
+ UNIQUE(user_id, vocab_id)
+);
+
+-- 索引
+CREATE INDEX idx_vocabulary_word ON vocabulary_bank(word);
+CREATE INDEX idx_vocabulary_category ON vocabulary_bank(category, difficulty_level);
+CREATE INDEX idx_vocabulary_frequency ON vocabulary_bank(frequency_rank);
+CREATE INDEX idx_user_vocab_user ON user_vocabulary_progress(user_id);
+CREATE INDEX idx_user_vocab_mastery ON user_vocabulary_progress(mastery_level);
+CREATE INDEX idx_user_vocab_review ON user_vocabulary_progress(next_review_date) WHERE next_review_date IS NOT NULL;
+```
+
+## 關聯表和輔助表
+
+### 用戶關係表 (Friends/Social)
+
+```sql
+CREATE TABLE user_relationships (
+ relationship_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ requester_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+ addressee_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+
+ relationship_type VARCHAR(20) DEFAULT 'friend', -- friend, blocked, follow
+ status VARCHAR(20) DEFAULT 'pending', -- pending, accepted, rejected
+
+ created_at TIMESTAMPTZ DEFAULT NOW(),
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
+
+ UNIQUE(requester_id, addressee_id),
+ CONSTRAINT no_self_relationship CHECK (requester_id != addressee_id)
+);
+```
+
+### 學習會話表 (Study Sessions)
+
+```sql
+CREATE TABLE study_sessions (
+ session_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID REFERENCES users(user_id) ON DELETE CASCADE,
+
+ -- 會話資料
+ session_type VARCHAR(20) DEFAULT 'dialogue', -- dialogue, vocabulary, review
+ started_at TIMESTAMPTZ DEFAULT NOW(),
+ ended_at TIMESTAMPTZ,
+ duration_seconds INTEGER,
+
+ -- 學習成果
+ activities_completed INTEGER DEFAULT 0,
+ total_score INTEGER DEFAULT 0,
+ experience_gained INTEGER DEFAULT 0,
+
+ -- 詳細活動記錄
+ activity_log JSONB DEFAULT '[]',
+
+ created_at TIMESTAMPTZ DEFAULT NOW()
+);
+```
+
+### 系統設定表
+
+```sql
+CREATE TABLE system_settings (
+ setting_key VARCHAR(100) PRIMARY KEY,
+ setting_value JSONB,
+ setting_type VARCHAR(20) DEFAULT 'string', -- string, number, boolean, json
+ description TEXT,
+ is_public BOOLEAN DEFAULT FALSE, -- 是否對前端公開
+ updated_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+-- 預設設定
+INSERT INTO system_settings (setting_key, setting_value, setting_type, description, is_public) VALUES
+('app_version', '"1.0.0"', 'string', 'Current app version', true),
+('maintenance_mode', 'false', 'boolean', 'System maintenance status', true),
+('max_daily_dialogues_free', '5', 'number', 'Daily dialogue limit for free users', false),
+('vocabulary_review_batch_size', '15', 'number', 'Number of words per review session', false);
+```
+
+## 資料庫最佳化
+
+### 索引策略
+
+```sql
+-- 複合索引
+CREATE INDEX idx_dialogues_user_completed ON dialogues(user_id, completed_at) WHERE completed_at IS NOT NULL;
+CREATE INDEX idx_user_tasks_user_status ON user_tasks(user_id, status);
+CREATE INDEX idx_user_vocab_user_review ON user_vocabulary_progress(user_id, next_review_date) WHERE next_review_date <= CURRENT_DATE;
+
+-- 部分索引
+CREATE INDEX idx_active_users ON users(last_login_at) WHERE status = 'active';
+CREATE INDEX idx_premium_lessons ON lessons(lesson_id) WHERE is_premium = TRUE;
+
+-- 函數索引
+CREATE INDEX idx_users_email_lower ON users(LOWER(email));
+CREATE INDEX idx_lessons_title_search ON lessons USING gin(to_tsvector('english', title));
+```
+
+### 分區策略
+
+```sql
+-- 按日期分區對話記錄表 (適用於大量數據)
+CREATE TABLE dialogues_partitioned (
+ LIKE dialogues INCLUDING ALL
+) PARTITION BY RANGE (created_at);
+
+-- 創建分區
+CREATE TABLE dialogues_2024_q1 PARTITION OF dialogues_partitioned
+ FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
+```
+
+### 視圖 (Views)
+
+```sql
+-- 用戶學習統計視圖
+CREATE VIEW user_learning_stats AS
+SELECT
+ u.user_id,
+ u.username,
+ COUNT(d.dialogue_id) as total_dialogues,
+ AVG(d.overall_score)::INTEGER as average_score,
+ SUM(d.total_duration) as total_study_time,
+ COUNT(DISTINCT d.lesson_id) as unique_lessons_practiced,
+ MAX(d.completed_at) as last_practice_date
+FROM users u
+LEFT JOIN dialogues d ON u.user_id = d.user_id AND d.status = 'completed'
+GROUP BY u.user_id, u.username;
+
+-- 排行榜視圖
+CREATE VIEW global_leaderboard AS
+SELECT
+ ROW_NUMBER() OVER (ORDER BY total_score DESC) as rank,
+ user_id,
+ username,
+ total_score,
+ current_streak,
+ country_code
+FROM users
+WHERE status = 'active'
+ORDER BY total_score DESC
+LIMIT 1000;
+```
+
+## 資料遷移與版本控制
+
+### 遷移腳本範例
+
+```sql
+-- Migration: 001_create_initial_schema.sql
+-- 創建基本表結構
+
+-- Migration: 002_add_vocabulary_system.sql
+-- 新增詞彙系統相關表
+
+-- Migration: 003_add_gamification_features.sql
+-- 新增遊戲化功能表
+```
+
+### 種子資料 (Seed Data)
+
+```sql
+-- 插入基本課程場景
+INSERT INTO lessons (lesson_code, title, description, category, difficulty_level, scenario_data) VALUES
+('SC_Greeting_01', 'Basic Greetings', 'Learn how to greet people in different situations', 'daily_life', 'A1',
+ '{"scenes": [{"type": "greeting", "context": "meeting_stranger"}]}'),
+('SC_Restaurant_01', 'Restaurant Reservation', 'Make a reservation and order food', 'daily_life', 'A2',
+ '{"scenes": [{"type": "phone_call", "context": "restaurant_booking"}]}');
+
+-- 插入詞彙庫基礎資料
+INSERT INTO vocabulary_bank (word, phonetic, part_of_speech, definition_en, definition_native, category, difficulty_level, frequency_rank) VALUES
+('hello', '/həˈloʊ/', 'interjection', 'Used as a greeting', '{"zh-TW": "你好", "ja": "こんにちは"}', 'daily_interaction', 'A1', 50),
+('restaurant', '/ˈrestərɑːnt/', 'noun', 'A place where people pay to sit and eat meals', '{"zh-TW": "餐廳", "ja": "レストラン"}', 'food_dining', 'A2', 1250);
+```
+
+## 備份與災難復原
+
+### 備份策略
+
+```sql
+-- 每日備份腳本
+pg_dump dramaling_db > backup_$(date +%Y%m%d).sql
+
+-- 增量備份設定
+archive_mode = on
+archive_command = 'cp %p /backup/archive/%f'
+```
+
+### 監控查詢
+
+```sql
+-- 慢查詢監控
+SELECT query, mean_time, calls, total_time
+FROM pg_stat_statements
+ORDER BY mean_time DESC
+LIMIT 10;
+
+-- 資料庫大小監控
+SELECT schemaname, tablename,
+ pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
+FROM pg_tables
+WHERE schemaname NOT IN ('information_schema', 'pg_catalog')
+ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
+```
+
+---
+
+## 待完成任務
+
+### 高優先級
+1. [ ] 完善所有表的約束條件和觸發器
+2. [ ] 設計詳細的索引優化策略
+3. [ ] 建立資料庫遷移和版本控制流程
+4. [ ] 實現資料備份和災難復原機制
+
+### 中優先級
+1. [ ] 設計資料庫效能監控和告警系統
+2. [ ] 建立資料隱私和安全性控制機制
+3. [ ] 規劃大數據量情況下的分區和分片策略
+4. [ ] 設計資料倉儲和分析資料庫架構
+
+### 低優先級
+1. [ ] 研究NoSQL資料庫的混合使用場景
+2. [ ] 探索時序資料庫在學習分析中的應用
+3. [ ] 建立自動化資料庫調優和維護系統
+4. [ ] 設計多地區資料同步和一致性策略
+
+---
+
+**最後更新**: 2024年9月5日
+**負責人**: 待分配
+**審查週期**: 每兩週檢討一次
\ No newline at end of file
diff --git a/docs/04_technical/flutter-dotnet-integration.md b/docs/04_technical/flutter-dotnet-integration.md
new file mode 100644
index 0000000..76adfe4
--- /dev/null
+++ b/docs/04_technical/flutter-dotnet-integration.md
@@ -0,0 +1,811 @@
+# Flutter + .NET Core 整合開發指南
+
+## 概述
+針對 Drama Ling 專案使用 Flutter 前端 + .NET Core 後端的技術架構,提供完整的整合開發指引。
+
+## Flutter 前端架構
+
+### 專案結構設計
+```
+lib/
+├── main.dart # 應用程式進入點
+├── app/
+│ ├── app.dart # App主要配置
+│ ├── routes/ # 路由配置
+│ └── themes/ # 主題設定
+├── core/
+│ ├── constants/ # 常數定義
+│ ├── utils/ # 工具類
+│ ├── errors/ # 錯誤處理
+│ └── network/ # 網路層配置
+├── features/ # 功能模組
+│ ├── authentication/ # 用戶認證
+│ ├── dialogue/ # 對話練習
+│ ├── vocabulary/ # 詞彙管理
+│ ├── gamification/ # 遊戲化功能
+│ └── subscription/ # 訂閱功能
+└── shared/
+ ├── widgets/ # 共用元件
+ ├── models/ # 資料模型
+ └── services/ # 共用服務
+```
+
+### 狀態管理架構 (Riverpod)
+```dart
+// ✅ Provider 定義範例
+@riverpod
+class DialogueNotifier extends _$DialogueNotifier {
+ @override
+ DialogueState build() {
+ return const DialogueState.initial();
+ }
+
+ Future startDialogue(String scenarioId) async {
+ state = const DialogueState.loading();
+
+ try {
+ final dialogue = await ref.read(dialogueRepositoryProvider)
+ .startDialogue(scenarioId);
+
+ state = DialogueState.success(dialogue);
+ } catch (error) {
+ state = DialogueState.error(error.toString());
+ }
+ }
+
+ Future sendMessage(String message) async {
+ // 發送訊息邏輯
+ }
+}
+
+// State 類定義
+@freezed
+class DialogueState with _$DialogueState {
+ const factory DialogueState.initial() = _Initial;
+ const factory DialogueState.loading() = _Loading;
+ const factory DialogueState.success(Dialogue dialogue) = _Success;
+ const factory DialogueState.error(String message) = _Error;
+}
+```
+
+### 網路層設計 (Dio + Retrofit)
+```dart
+// ✅ API 客戶端設定
+@RestApi(baseUrl: 'https://api.dramaling.com/api/v1')
+abstract class DramaLingApi {
+ factory DramaLingApi(Dio dio) = _DramaLingApi;
+
+ @POST('/auth/login')
+ Future> login(@Body() LoginRequest request);
+
+ @POST('/dialogues/start')
+ Future> startDialogue(@Body() StartDialogueRequest request);
+
+ @GET('/users/profile')
+ Future> getUserProfile();
+
+ @GET('/vocabulary')
+ Future>> getVocabulary(
+ @Query('category') String? category,
+ @Query('difficulty') String? difficulty,
+ );
+}
+
+// 攔截器設置
+class AuthInterceptor extends Interceptor {
+ @override
+ void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
+ final token = getStoredToken();
+ if (token != null) {
+ options.headers['Authorization'] = 'Bearer $token';
+ }
+ handler.next(options);
+ }
+
+ @override
+ void onError(DioException err, ErrorInterceptorHandler handler) {
+ if (err.response?.statusCode == 401) {
+ // 處理 Token 過期
+ logout();
+ }
+ handler.next(err);
+ }
+}
+```
+
+### 本地存儲設計 (Hive)
+```dart
+// ✅ Hive 資料模型
+@HiveType(typeId: 0)
+class UserProfileLocal extends HiveObject {
+ @HiveField(0)
+ late String userId;
+
+ @HiveField(1)
+ late String username;
+
+ @HiveField(2)
+ late String email;
+
+ @HiveField(3)
+ late int totalScore;
+
+ @HiveField(4)
+ late DateTime lastSyncAt;
+}
+
+// Repository 模式
+abstract class UserRepository {
+ Future getUserProfile();
+ Future saveUserProfile(UserProfile profile);
+ Future clearUserData();
+}
+
+class UserRepositoryImpl implements UserRepository {
+ final DramaLingApi _api;
+ final Box _localBox;
+
+ UserRepositoryImpl(this._api, this._localBox);
+
+ @override
+ Future getUserProfile() async {
+ try {
+ // 嘗試從 API 獲取最新資料
+ final response = await _api.getUserProfile();
+
+ // 存儲到本地
+ final localProfile = UserProfileLocal()
+ ..userId = response.data.userId
+ ..username = response.data.username
+ ..email = response.data.email
+ ..totalScore = response.data.totalScore
+ ..lastSyncAt = DateTime.now();
+
+ await _localBox.put('user_profile', localProfile);
+
+ return response.data;
+ } catch (e) {
+ // API 失敗時使用本地快取
+ final localProfile = _localBox.get('user_profile');
+ if (localProfile != null) {
+ return UserProfile.fromLocal(localProfile);
+ }
+ rethrow;
+ }
+ }
+}
+```
+
+## .NET Core 後端架構
+
+### 專案結構設計
+```
+DramaLing.Api/
+├── DramaLing.Api/ # Web API 專案
+│ ├── Controllers/ # API 控制器
+│ ├── Middleware/ # 自定義中介軟體
+│ ├── Filters/ # 過濾器
+│ └── Program.cs # 應用程式啟動
+├── DramaLing.Core/ # 核心業務邏輯
+│ ├── Entities/ # 實體類別
+│ ├── Interfaces/ # 介面定義
+│ ├── Services/ # 業務服務
+│ └── DTOs/ # 資料傳輸物件
+├── DramaLing.Infrastructure/ # 基礎設施層
+│ ├── Data/ # 資料存取
+│ ├── Repositories/ # Repository 實作
+│ ├── External/ # 外部服務整合
+│ └── Configurations/ # 設定檔
+└── DramaLing.Tests/ # 測試專案
+ ├── Unit/ # 單元測試
+ ├── Integration/ # 整合測試
+ └── Common/ # 測試共用程式碼
+```
+
+### API 控制器設計
+```csharp
+// ✅ RESTful API 控制器範例
+[ApiController]
+[Route("api/v1/[controller]")]
+[Authorize]
+public class DialoguesController : ControllerBase
+{
+ private readonly IDialogueService _dialogueService;
+ private readonly ILogger _logger;
+
+ public DialoguesController(
+ IDialogueService dialogueService,
+ ILogger logger)
+ {
+ _dialogueService = dialogueService;
+ _logger = logger;
+ }
+
+ [HttpPost("start")]
+ public async Task>> StartDialogue(
+ [FromBody] StartDialogueRequest request)
+ {
+ try {
+ var userId = GetCurrentUserId();
+ var dialogue = await _dialogueService.StartDialogueAsync(userId, request);
+
+ return Ok(ApiResponse.Success(dialogue));
+ }
+ catch (ValidationException ex)
+ {
+ return BadRequest(ApiResponse.Error("VALIDATION_ERROR", ex.Message));
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Failed to start dialogue for user {UserId}", GetCurrentUserId());
+ return StatusCode(500, ApiResponse.Error("INTERNAL_ERROR", "Internal server error"));
+ }
+ }
+
+ [HttpPost("{dialogueId}/messages")]
+ public async Task>> SendMessage(
+ Guid dialogueId,
+ [FromBody] SendMessageRequest request)
+ {
+ var userId = GetCurrentUserId();
+ var message = await _dialogueService.SendMessageAsync(userId, dialogueId, request);
+
+ return Ok(ApiResponse.Success(message));
+ }
+
+ private Guid GetCurrentUserId()
+ {
+ var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
+ return Guid.Parse(userIdClaim ?? throw new UnauthorizedAccessException());
+ }
+}
+```
+
+### 業務服務層設計
+```csharp
+// ✅ 業務服務實作範例
+public interface IDialogueService
+{
+ Task StartDialogueAsync(Guid userId, StartDialogueRequest request);
+ Task SendMessageAsync(Guid userId, Guid dialogueId, SendMessageRequest request);
+ Task GetDialogueAnalysisAsync(Guid userId, Guid dialogueId);
+}
+
+public class DialogueService : IDialogueService
+{
+ private readonly IDialogueRepository _dialogueRepository;
+ private readonly ILessonRepository _lessonRepository;
+ private readonly IAiAnalysisService _aiAnalysisService;
+ private readonly IMapper _mapper;
+
+ public DialogueService(
+ IDialogueRepository dialogueRepository,
+ ILessonRepository lessonRepository,
+ IAiAnalysisService aiAnalysisService,
+ IMapper mapper)
+ {
+ _dialogueRepository = dialogueRepository;
+ _lessonRepository = lessonRepository;
+ _aiAnalysisService = aiAnalysisService;
+ _mapper = mapper;
+ }
+
+ public async Task StartDialogueAsync(Guid userId, StartDialogueRequest request)
+ {
+ // 驗證場景是否存在
+ var lesson = await _lessonRepository.GetByCodeAsync(request.ScenarioId)
+ ?? throw new ValidationException($"Scenario {request.ScenarioId} not found");
+
+ // 檢查用戶權限
+ await ValidateUserAccessAsync(userId, lesson);
+
+ // 創建對話實例
+ var dialogue = new Dialogue
+ {
+ UserId = userId,
+ LessonId = lesson.Id,
+ SessionToken = Guid.NewGuid().ToString(),
+ Status = DialogueStatus.InProgress,
+ StartedAt = DateTime.UtcNow
+ };
+
+ await _dialogueRepository.AddAsync(dialogue);
+ await _dialogueRepository.SaveChangesAsync();
+
+ // 生成初始 AI 訊息
+ var initialMessage = await GenerateInitialMessageAsync(dialogue, lesson);
+
+ var dto = _mapper.Map(dialogue);
+ dto.InitialMessage = initialMessage;
+
+ return dto;
+ }
+
+ public async Task SendMessageAsync(
+ Guid userId,
+ Guid dialogueId,
+ SendMessageRequest request)
+ {
+ var dialogue = await _dialogueRepository.GetByIdAsync(dialogueId)
+ ?? throw new NotFoundException($"Dialogue {dialogueId} not found");
+
+ if (dialogue.UserId != userId)
+ throw new ForbiddenException("Access denied");
+
+ // 保存用戶訊息
+ var userMessage = new DialogueMessage
+ {
+ DialogueId = dialogueId,
+ TurnNumber = await GetNextTurnNumberAsync(dialogueId),
+ SenderType = MessageSenderType.User,
+ MessageText = request.Message,
+ CreatedAt = DateTime.UtcNow
+ };
+
+ await _dialogueRepository.AddMessageAsync(userMessage);
+
+ // AI 分析和回應
+ var analysisResult = await _aiAnalysisService.AnalyzeMessageAsync(
+ dialogue, userMessage);
+
+ // 生成 AI 回應
+ var aiResponse = await _aiAnalysisService.GenerateResponseAsync(
+ dialogue, userMessage, analysisResult);
+
+ var aiMessage = new DialogueMessage
+ {
+ DialogueId = dialogueId,
+ TurnNumber = userMessage.TurnNumber,
+ SenderType = MessageSenderType.AI,
+ MessageText = aiResponse.Message,
+ CreatedAt = DateTime.UtcNow
+ };
+
+ await _dialogueRepository.AddMessageAsync(aiMessage);
+ await _dialogueRepository.SaveChangesAsync();
+
+ return _mapper.Map(aiMessage);
+ }
+}
+```
+
+### Entity Framework 配置
+```csharp
+// ✅ DbContext 設定
+public class DramaLingDbContext : DbContext
+{
+ public DbSet Users { get; set; }
+ public DbSet Lessons { get; set; }
+ public DbSet Dialogues { get; set; }
+ public DbSet DialogueMessages { get; set; }
+ public DbSet Vocabularies { get; set; }
+
+ public DramaLingDbContext(DbContextOptions options)
+ : base(options) { }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+
+ // 應用所有配置
+ modelBuilder.ApplyConfigurationsFromAssembly(typeof(DramaLingDbContext).Assembly);
+ }
+}
+
+// ✅ 實體配置範例
+public class DialogueConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.ToTable("dialogues");
+
+ builder.HasKey(d => d.Id);
+
+ builder.Property(d => d.Id)
+ .HasColumnName("dialogue_id")
+ .HasDefaultValueSql("gen_random_uuid()");
+
+ builder.Property(d => d.SessionToken)
+ .HasColumnName("session_token")
+ .HasMaxLength(255)
+ .IsRequired();
+
+ builder.Property(d => d.Status)
+ .HasColumnName("status")
+ .HasConversion();
+
+ // 關聯設定
+ builder.HasOne(d => d.User)
+ .WithMany(u => u.Dialogues)
+ .HasForeignKey(d => d.UserId)
+ .OnDelete(DeleteBehavior.Cascade);
+
+ builder.HasOne(d => d.Lesson)
+ .WithMany()
+ .HasForeignKey(d => d.LessonId)
+ .OnDelete(DeleteBehavior.SetNull);
+
+ // 索引設定
+ builder.HasIndex(d => d.UserId);
+ builder.HasIndex(d => d.SessionToken).IsUnique();
+ builder.HasIndex(d => d.CreatedAt);
+ }
+}
+```
+
+## 前後端整合最佳實踐
+
+### API 回應格式統一
+```csharp
+// ✅ C# API 回應模型
+public class ApiResponse
+{
+ public bool Success { get; set; }
+ public T? Data { get; set; }
+ public string? Message { get; set; }
+ public ApiError? Error { get; set; }
+ public ApiMeta? Meta { get; set; }
+
+ public static ApiResponse Success(T data, string? message = null)
+ {
+ return new ApiResponse
+ {
+ Success = true,
+ Data = data,
+ Message = message,
+ Meta = new ApiMeta
+ {
+ Timestamp = DateTime.UtcNow,
+ RequestId = Activity.Current?.Id ?? Guid.NewGuid().ToString()
+ }
+ };
+ }
+
+ public static ApiResponse Error(string code, string message)
+ {
+ return new ApiResponse
+ {
+ Success = false,
+ Error = new ApiError { Code = code, Message = message }
+ };
+ }
+}
+```
+
+```dart
+// ✅ Flutter API 回應模型
+@freezed
+class ApiResponse with _$ApiResponse {
+ const factory ApiResponse({
+ required bool success,
+ T? data,
+ String? message,
+ ApiError? error,
+ ApiMeta? meta,
+ }) = _ApiResponse;
+
+ factory ApiResponse.fromJson(
+ Map json,
+ T Function(Object? json) fromJsonT,
+ ) => _$ApiResponseFromJson(json, fromJsonT);
+}
+
+@freezed
+class ApiError with _$ApiError {
+ const factory ApiError({
+ required String code,
+ required String message,
+ Map? details,
+ }) = _ApiError;
+
+ factory ApiError.fromJson(Map json) =>
+ _$ApiErrorFromJson(json);
+}
+```
+
+### 錯誤處理機制
+```csharp
+// ✅ C# 全域錯誤處理中介軟體
+public class GlobalExceptionMiddleware
+{
+ private readonly RequestDelegate _next;
+ private readonly ILogger _logger;
+
+ public GlobalExceptionMiddleware(RequestDelegate next, ILogger logger)
+ {
+ _next = next;
+ _logger = logger;
+ }
+
+ public async Task InvokeAsync(HttpContext context)
+ {
+ try
+ {
+ await _next(context);
+ }
+ catch (Exception ex)
+ {
+ await HandleExceptionAsync(context, ex);
+ }
+ }
+
+ private async Task HandleExceptionAsync(HttpContext context, Exception exception)
+ {
+ _logger.LogError(exception, "An unhandled exception occurred");
+
+ var response = exception switch
+ {
+ ValidationException validationEx => ApiResponse