diff --git a/docs/01_requirement/requirements.md b/docs/01_requirement/requirements.md
index 666a760..7d3a795 100644
--- a/docs/01_requirement/requirements.md
+++ b/docs/01_requirement/requirements.md
@@ -4,44 +4,88 @@
Drama Ling 是一款結合情境對話訓練、遊戲化機制和智能詞彙複習系統的外語學習應用程式。採用語言習得方法,透過多樣化劇本模擬真實溝通場景,搭配排行榜和闖關機制,解決傳統語言學習缺乏實戰練習、動機不足、無法持續的核心問題,讓學習者真正達到「會說、會用」的溝通目標。
## feature_demand
-1. **情境對話訓練模組**
- - 多場景劇本系統(車禍、購物、餐廳等)
- - 開場對話引導
- - 任務清單系統(安撫、報警、說明等)
- - 指定詞彙練習
- - 限時對話挑戰
-2. **AI 互動分析系統**
- - 即時訊息分析與翻譯
- - 回覆範例提供
- - 語法、語意、流暢度三維度評分
- - 對話訂正功能
+### 1. 用戶認證與引導系統 (ENT - 13個介面)
+**完整的用戶入門體驗**
+ - **社群登入整合**:支援 Apple ID 和 Google 帳號快速登入
+ - **個人化引導流程**:新用戶完整的 7 步驟設定流程
+ - 學習目的選擇(FormPurpose)
+ - 語言程度評估(FormLevel)
+ - 學習時段偏好(FormTimeSlot)
+ - 學習頻率設定(FormFrequency)
+ - 重要提醒和使用須知(Notice)
+ - 個人化建議生成(Result)
+ - **帳號管理功能**:多帳號切換、密碼重設、用戶資料管理
-3. **遊戲化學習機制**
- - 闖關系統設計
- - 排行榜競爭機制
- - 學習進度追蹤
- - 成就系統
+### 2. 核心學習功能 (CORE - 23個介面)
+**深度個人化學習體驗**
+ - **完整個人中心系統**:
+ - 詳細學習統計和成就展示
+ - 社群好友系統(好友列表、搜尋、互動)
+ - 個人設定管理
+ - 他人資料瀏覽
+ - **社群競爭機制**:
+ - 即時排行榜系統
+ - 好友間學習競賽
+ - 訪客提醒機制
+ - **語言程度評估**:
+ - 專業程度測試系統
+ - 詳細結果分析和建議
+ - **多元結果展示系統**:
+ - 成功結果頁面(2種變化)
+ - 失敗分析頁面(2種變化)
+ - 詳細分數總結(2種展示方式)
+ - 對話評分分析
+ - 訂正結果展示
+ - 獎勵確認和小獎勵系統
-4. **智能詞彙複習系統**
- - 間隔複習演算法
- - 每日複習清單(5分鐘完成)
- - 詞彙掌握度評估
- - 複習遊戲化整合
+### 3. 學習任務與活動 (TASK - 32個介面)
+**沉浸式學習體驗核心**
+ - **完整場景對話系統**(9個相關介面):
+ - 挑戰關卡地圖導航
+ - 多種關卡選擇彈窗(包含鎖定狀態)
+ - 沉浸式場景對話主介面
+ - 目標詳情、角色詳情、關鍵詞詳情
+ - 智能回覆指南和輸入協助
+ - 即時回覆結果分析
+ - 成本確認和資源不足提醒
+ - **三階段詞彙學習系統**(8個介面):
+ - **詞彙介紹階段**:卡片介紹、選擇練習、結果回饋
+ - **流暢度訓練**:圖像配對、句子重組、結果評估
+ - **複習鞏固**:間隔複習主系統
+ - **AI對話訂正系統**(6個介面):
+ - 語法錯誤解釋和重試
+ - 流暢度改進建議和練習
+ - 通過/重試結果處理
+ - **遊戲化機制**:
+ - 額外任務系統
+ - 時間門票券機制
+ - 遊戲生活模擬
+ - 個人詳情追蹤
+
+### 4. 商業模式功能 (BIZ - 3個介面)
+**完整營收系統**
+ - **道具商店系統**:
+ - 分類齊全的道具商店(加時道具、補命道具、時光卷)
+ - 購買確認和價格透明化
+ - **訂閱服務管理**:
+ - 訂閱結果確認和狀態管理
## target_user
**主要目標用戶**:
- 已具備基礎外語能力(A1-B1程度)的學習者
-- 希望提升實際對話能力,而非僅考試成績
-- 喜歡遊戲化體驗,需要外在動機驅動學習
+- 希望透過情境對話提升實際溝通能力
+- 偏好個人化學習體驗和詳細進度追蹤
+- 喜歡社群互動和競爭機制的學習環境
+- 需要完整引導和多元回饋的深度學習體驗
- 工作或生活中需要外語溝通能力
-- 重視學習效率,偏好碎片化時間學習
**用戶特徵**:
- 年齡:18-45歲
-- 學習目的:實用溝通而非考試
-- 學習時間:每日10分鐘至數小時彈性安排
-- 技術接受度:中高,熟悉手機應用操作
+- 學習目的:實用溝通和流暢度提升
+- 學習時間:每日20分鐘至1小時的沉浸式學習
+- 技術接受度:高,期待豐富的互動功能
+- 願意投資時間進行系統性的能力建構
## core_value
**核心價值**:
@@ -50,19 +94,24 @@ Drama Ling 是一款結合情境對話訓練、遊戲化機制和智能詞彙複
- 透過遊戲化維持長期學習動機
**差異化優勢**:
-- 同時具備遊戲動力與實戰情境,超越純題庫練習
-- 相較自律型AI練習,增加排行榜競爭機制提升持續率
-- 透過訂正對話功能,確保學習者掌握表達細節
-- 結合衝榜上癮與對話痛點雙重動機驅動
+- **完整學習生態系統**:從引導到精熟的67個介面完整體驗
+- **深度個人化**:7步驟引導流程和詳細學習分析
+- **多維度評估系統**:語法、流暢度、對話技巧三重評估
+- **社群競爭機制**:好友系統和排行榜雙重激勵
+- **專業AI訂正**:即時語法和流暢度改進建議
+- **商業模式多元**:道具系統和訂閱服務雙軌營收
## revenue_model
**主要營收來源**:
-1. **訂閱制服務**:月費/年費無限使用進階功能
-2. **免費增值模式**:基礎功能免費,進階功能付費
+1. **遊戲道具系統**:
+ - 加時道具(1個/5個裝包)
+ - 補命道具(1個/5個裝包)
+ - 時光卷(挑戰重置和階段解鎖)
+2. **訂閱制服務**:月費/年費完整功能和內容存取
3. **內容付費**:特殊情境劇本包、專業領域對話包
4. **企業客戶**:公司內訓、語言培訓機構合作
5. **廣告收入**:免費用戶觀看廣告解鎖功能
-6. **數據服務**:匿名化學習數據分析服務(TODO:需評估可行性)
+6. **數據服務**:匿名化學習效果分析報告
## customer_relationship
**客戶關係策略**:
@@ -128,14 +177,16 @@ Drama Ling 是一款結合情境對話訓練、遊戲化機制和智能詞彙複
| 競爭對手 | 我們的優勢 |
|---------|-----------|
-| **出國留學** | 成本更低、風險更小、彈性更高,但保持實戰情境練習 |
-| **Duolingo** | 更進階的實戰對話訓練,不僅限於基礎入門 |
-| **Speak AI** | 增加遊戲化競爭機制,提升持續學習動機 |
+| **出國留學** | 67個介面完整學習系統,成本更低但體驗更系統化 |
+| **Duolingo** | 深度對話訓練和AI即時訂正,超越基礎遊戲化 |
+| **Speak AI** | 完整社群競爭和好友系統,增強持續學習動機 |
+| **HelloTalk** | 結構化學習進程和專業評估系統,不僅是聊天 |
**核心差異化**:
-- 唯一結合「衝榜競爭」與「意圖對話訓練」的產品
-- 填補遊戲化入門工具與純AI練習之間的市場空白
-- 針對中級學習者提供更有效的進階方案
+- **唯一的完整生態系統**:從引導到精熟67個介面一條龍體驗
+- **三維度評估創新**:語法+流暢度+對話技巧全方位分析
+- **深度個人化引導**:7步驟設定流程打造專屬學習路徑
+- **社群競爭機制**:好友排行榜和道具系統雙重激勵
## retention_mechanism
**留存策略設計**:
diff --git a/docs/design/ai-algorithm-specs.md b/docs/design/ai-algorithm-specs.md
deleted file mode 100644
index 76893ed..0000000
--- a/docs/design/ai-algorithm-specs.md
+++ /dev/null
@@ -1,183 +0,0 @@
-# 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/design/business-logic-rules.md b/docs/design/business-logic-rules.md
deleted file mode 100644
index 59ea811..0000000
--- a/docs/design/business-logic-rules.md
+++ /dev/null
@@ -1,298 +0,0 @@
-# 商業邏輯與營收規則
-
-## 概述
-定義 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/design/content-management-specs.md b/docs/design/content-management-specs.md
deleted file mode 100644
index 4e8935c..0000000
--- a/docs/design/content-management-specs.md
+++ /dev/null
@@ -1,395 +0,0 @@
-# 內容管理規格文件
-
-## 概述
-定義 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/design/gamification-mechanics.md b/docs/design/gamification-mechanics.md
deleted file mode 100644
index d49df2f..0000000
--- a/docs/design/gamification-mechanics.md
+++ /dev/null
@@ -1,268 +0,0 @@
-# 遊戲化機制設計規格
-
-## 概述
-定義 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/design/ui-ux-guidelines.md b/docs/design/ui-ux-guidelines.md
deleted file mode 100644
index ee2c82b..0000000
--- a/docs/design/ui-ux-guidelines.md
+++ /dev/null
@@ -1,521 +0,0 @@
-# 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/development/coding-standards.md b/docs/development/coding-standards.md
deleted file mode 100644
index 7acfe8b..0000000
--- a/docs/development/coding-standards.md
+++ /dev/null
@@ -1,993 +0,0 @@
-# 程式碼規範與開發標準
-
-## 概述
-建立統一的程式碼撰寫規範和開發流程標準,確保團隊協作效率和代碼品質。
-
-## 通用開發原則
-
-### 代碼品質原則
-- [ ] **可讀性優先**: 代碼應該容易閱讀和理解
-- [ ] **一致性**: 遵循統一的命名和格式規範
-- [ ] **簡潔性**: 避免過度複雜的解決方案
-- [ ] **可測試性**: 代碼結構便於單元測試
-- [ ] **可維護性**: 考慮未來修改和擴展的便利性
-
-### 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/development/development-workflow.md b/docs/development/development-workflow.md
deleted file mode 100644
index c700681..0000000
--- a/docs/development/development-workflow.md
+++ /dev/null
@@ -1,796 +0,0 @@
-# 開發工作流程
-
-## 概述
-建立標準化的開發工作流程,確保團隊協作效率、代碼品質和專案進度控制。
-
-## 敏捷開發框架
-
-### 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/development/project-roadmap.md b/docs/development/project-roadmap.md
deleted file mode 100644
index 9d27858..0000000
--- a/docs/development/project-roadmap.md
+++ /dev/null
@@ -1,471 +0,0 @@
-# 專案開發路線圖
-
-## 概述
-基於產品需求和技術架構設計,制定 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/technical/api-specifications.md b/docs/technical/api-specifications.md
deleted file mode 100644
index 8a23234..0000000
--- a/docs/technical/api-specifications.md
+++ /dev/null
@@ -1,998 +0,0 @@
-# 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/technical/database-schema.md b/docs/technical/database-schema.md
deleted file mode 100644
index 0652707..0000000
--- a/docs/technical/database-schema.md
+++ /dev/null
@@ -1,822 +0,0 @@
-# 資料庫架構設計
-
-## 概述
-基於 `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/technical/flutter-dotnet-integration.md b/docs/technical/flutter-dotnet-integration.md
deleted file mode 100644
index 76adfe4..0000000
--- a/docs/technical/flutter-dotnet-integration.md
+++ /dev/null
@@ -1,811 +0,0 @@
-# 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