dramaling-vocab-learning/智能複習系統串接計劃.md

201 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 智能複習系統前後端串接計劃
## 目標
將前端現有的Mock智能複習系統與後端真實API進行串接實現完整的智能複習功能。
## 評估結果
### 前端現狀learn/page.tsx
**完整功能已實現**
- 支援7種複習題型翻卡記憶、詞彙選擇、詞彙聽力、例句填空、例句重組、例句聽力、例句口說
- 使用Mock數據展示四情境自動適配效果A1學習者、簡單詞彙、適中詞彙、困難詞彙
- 已整合題型指示器和熟悉度計算
- 提供豐富的演示說明和進度追蹤
### 後端現狀API
**核心API已完成**
- FlashcardsController智能複習相關端點
- ReviewTypeSelectorService四情境智能題型選擇
- SpacedRepetitionService間隔重複算法
- StudyController學習會話管理
### 介面對接需求分析
**前端期望的API呼叫**
1. `getDueFlashcards()``/api/flashcards/due`
2. `getOptimalReviewMode()``/api/flashcards/{id}/optimal-review-mode`
3. `submitReview()``/api/flashcards/{id}/review`
4. `generateQuestionOptions()``/api/flashcards/{id}/question`
**後端已提供的API**
-`GET /api/flashcards/due` - 取得到期詞卡
-`POST /api/flashcards/{id}/optimal-review-mode` - 智能選擇題型
-`POST /api/flashcards/{id}/review` - 提交復習結果
-`POST /api/flashcards/{id}/question` - 生成題目選項
## 串接計劃
### 階段一基礎串接優先級HIGH
#### 1.1 修改前端服務層
**檔案**`frontend/lib/services/flashcards.ts`
**修改點**
```typescript
// 將Mock數據切換為真實API呼叫
async getDueFlashcards(limit = 50): Promise<ApiResponse<ExtendedFlashcard[]>> {
// 從 Mock 改為真實 API
return await this.makeRequest<ApiResponse<ExtendedFlashcard[]>>(`/flashcards/due?limit=${limit}`);
}
```
**預期結果**:前端能夠從後端取得真實的到期詞卡數據
#### 1.2 資料格式對齊
**問題**:前端 `ExtendedFlashcard` 介面與後端回傳格式需要對齊
**解決方案**
- 後端回傳增加 `userLevel`, `wordLevel` 等擴展欄位
- 前端介面保持與現有Mock格式相容
#### 1.3 環境變數設定
**設定 API 基礎 URL**
```bash
# 確保 .env.local 包含
NEXT_PUBLIC_API_URL=http://localhost:5008
```
### 階段二智能題型選擇整合優先級HIGH
#### 2.1 替換前端智能選擇邏輯
**檔案**`frontend/app/learn/page.tsx`
**修改前**
```typescript
// 前端本地邏輯
const selectedMode = await selectOptimalReviewMode(card);
```
**修改後**
```typescript
// 呼叫後端智能選擇API
const modeResult = await flashcardsService.getOptimalReviewMode(
card.id, card.userLevel || 50, card.wordLevel || 50
);
const selectedMode = modeResult.data?.selectedMode || 'flip-memory';
```
#### 2.2 題型映射對應
**確保前後端題型名稱一致**
- `flip-memory``flip-memory`
- `vocab-choice``vocab-choice`
- `vocab-listening``vocab-listening`
- `sentence-fill``sentence-fill`
- `sentence-reorder``sentence-reorder`
- `sentence-speaking``sentence-speaking`
- `sentence-listening``sentence-listening`
### 階段三復習結果提交優先級HIGH
#### 3.1 整合復習結果API
**修改所有復習結果提交**
```typescript
// frontend/app/learn/page.tsx
const submitReviewResult = async (isCorrect: boolean, userAnswer?: string) => {
const result = await flashcardsService.submitReview(currentCard.id, {
isCorrect,
questionType: mode,
userAnswer,
timeTaken: responseTime // 實際計算
});
// 更新前端狀態
if (result.success && result.data) {
updateCardMastery(result.data);
}
}
```
### 階段四題目生成整合優先級MEDIUM
#### 4.1 動態選項生成
**目前**:前端硬編碼生成選擇題選項
**改為**:呼叫後端生成智能選項
```typescript
// 替換現有的 useEffect 邏輯
const generateQuizOptions = async () => {
const response = await flashcardsService.generateQuestionOptions(
currentCard.id, mode
);
if (response.success) {
setQuizOptions(response.data.options);
}
}
```
### 階段五錯誤處理與用戶體驗優先級MEDIUM
#### 5.1 Loading狀態管理
- 保留現有的載入狀態提示
- 添加API請求失敗的錯誤處理
- 提供離線模式回退到Mock數據
#### 5.2 性能優化
- 實現詞卡預載入
- 添加本地快取機制
- 智能重試邏輯
## 實施順序
### Week 1基礎串接
1. **Day 1-2**:修改 flashcards.ts 服務層,整合 `/due` 端點
2. **Day 3-4**:測試並修復數據格式差異
3. **Day 5**:驗證基礎詞卡載入功能
### Week 2智能功能整合
1. **Day 1-2**整合智能題型選擇API
2. **Day 3-4**整合復習結果提交API
3. **Day 5**:端到端功能測試
### Week 3優化與完善
1. **Day 1-2**整合題目生成API可選
2. **Day 3-4**:錯誤處理和性能優化
3. **Day 5**:最終測試和文檔更新
## 風險評估與緩解
### 高風險項目
1. **API認證問題**
- 風險後端需要JWT認證前端暫未實現
- 緩解確認後端暫時關閉認證AllowAnonymous逐步添加認證
2. **數據格式不匹配**
- 風險:前後端介面定義可能有差異
- 緩解:制定詳細的介面規格,逐步測試
### 中風險項目
1. **性能問題**
- 風險API請求延遲影響用戶體驗
- 緩解:添加載入狀態,實施快取策略
2. **錯誤處理**
- 風險:網路錯誤導致功能中斷
- 緩解實現優雅降級保留Mock數據作為備案
## 成功指標
### 技術指標
- [ ] 所有Mock數據呼叫成功替換為API呼叫
- [ ] 智能題型選擇準確率 > 95%
- [ ] API回應時間 < 500ms
- [ ] 錯誤率 < 1%
### 用戶體驗指標
- [ ] 頁面載入時間與Mock版本相當
- [ ] 無明顯的功能變化或異常
- [ ] 智能適配效果符合四情境設計
## 備註
- 後端已實現完整的智能複習核心功能
- 前端架構良好串接工作主要為呼叫方式的切換
- 建議保留Mock數據作為開發測試和演示用途