diff --git a/frontend/app/generate/page.tsx b/frontend/app/generate/page.tsx index b124919..fc0ecf3 100644 --- a/frontend/app/generate/page.tsx +++ b/frontend/app/generate/page.tsx @@ -25,6 +25,21 @@ const getTargetLearningRange = (userLevel: string): string => { return ranges[userLevel] || 'B1-B2' } +const compareCEFRLevels = (level1: string, level2: string, operator: '>' | '<' | '==='): boolean => { + const levels = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2'] + const index1 = levels.indexOf(level1) + const index2 = levels.indexOf(level2) + + if (index1 === -1 || index2 === -1) return false + + switch (operator) { + case '>': return index1 > index2 + case '<': return index1 < index2 + case '===': return index1 === index2 + default: return false + } +} + interface GrammarCorrection { hasErrors: boolean; originalText: string; @@ -333,10 +348,7 @@ function GenerateContent() {
- 重點提示: - 標有星星的詞彙和慣用語是 - 常用、高頻詞彙 - ,建議優先學習和保存到詞卡庫! + ⭐ 為常用高頻詞彙,建議優先學習!
@@ -469,6 +481,7 @@ function GenerateContent() { {(() => { // 只有當慣用語為常用且不是簡單慣用語時才顯示星星 // 簡單慣用語定義:學習者CEFR > 慣用語CEFR + const userLevel = localStorage.getItem('userEnglishLevel') || 'A2' const isHighFrequency = idiom?.frequency === 'high' const idiomCefr = idiom?.cefrLevel || 'A1' const isNotSimpleIdiom = !compareCEFRLevels(userLevel, idiomCefr, '>') diff --git a/詞卡管理功能產品需求規格.md b/詞卡管理功能產品需求規格.md new file mode 100644 index 0000000..5f8c043 --- /dev/null +++ b/詞卡管理功能產品需求規格.md @@ -0,0 +1,450 @@ +# DramaLing 詞卡管理功能產品需求規格書 + +## 1. 概述 + +### 1.1 文檔目的 +本文檔定義了 DramaLing 詞卡管理功能的詳細產品需求規格,涵蓋詞卡的創建、編輯、組織、搜尋、篩選和管理等核心功能。 + +### 1.2 功能簡介 +詞卡管理是 DramaLing 的核心功能之一,為用戶提供完整的詞卡生命週期管理,包括: +- 📝 詞卡新增與編輯 +- 🔍 智能搜尋與篩選 +- ⭐ 收藏與分類管理 +- 📊 學習進度追蹤 +- 🔄 批量操作功能 + +## 2. 功能需求分析 + +### 2.1 核心功能模組 + +#### 2.1.1 詞卡展示頁面 (FlashcardsPage) +- **位置**: `/flashcards` +- **主要功能**: 集中管理和展示所有詞卡 + +##### 頁面佈局設計 +1. **頁面標題區域** + - 顯示 "我的詞卡" 標題 + - 新增詞卡按鈕 (手動創建) + - AI 生成詞卡按鈕 (跳轉至 `/generate`) + +2. **分頁標籤系統** + - **所有詞卡**: 顯示用戶全部詞卡 (顯示詞卡總數) + - **收藏詞卡**: 顯示已收藏的詞卡 (顯示收藏總數,⭐ 圖標) + +3. **搜尋與篩選區域** + - 主要搜尋框:支援詞彙、翻譯、定義的全文搜尋 + - 進階篩選選項 (可展開/收起) + - 快速篩選按鈕組 + - 搜尋結果統計 + +#### 2.1.2 詞卡顯示格式 +每個詞卡採用橫向卡片佈局,包含: + +##### 左側區域 +- **例句圖片**: 54x36 像素,展示詞彙使用情境 +- **詞彙信息**: + - 詞彙本身 (大字體粗體顯示) + - 詞性標籤 (noun, verb, adjective 等) + - 中文翻譯 (中等字體) + - 發音符號與播放按鈕 + +##### 右上角 +- **CEFR 難度標籤**: A1-C2 等級,使用顏色區分 + - A1: 綠色 (基礎) + - A2: 藍色 (基礎) + - B1: 黃色 (中級) + - B2: 橙色 (中高級) + - C1: 紅色 (高級) + - C2: 紫色 (精通) + +##### 右側操作區域 +- **收藏按鈕**: 星星圖標,已收藏顯示黃色實心 +- **編輯按鈕**: 編輯圖標,開啟編輯表單 +- **刪除按鈕**: 垃圾桶圖標,需二次確認 +- **詳細按鈕**: 箭頭圖標,導航至詞卡詳細頁面 + +##### 底部統計信息 +- 創建日期 +- 掌握度百分比 + +### 2.2 搜尋與篩選功能 + +#### 2.2.1 主要搜尋功能 +```typescript +// 搜尋範圍 +- 詞彙本身 (word) +- 中文翻譯 (translation) +- 英文定義 (definition) +- 例句內容 (example) +``` + +##### 搜尋增強功能 +- **即時搜尋**: 輸入時即時過濾結果 +- **高亮顯示**: 搜尋關鍵字在結果中高亮標示 +- **清除功能**: 一鍵清除搜尋條件 (ESC 鍵或 X 按鈕) +- **結果統計**: 顯示找到的詞卡數量 + +#### 2.2.2 進階篩選選項 + +##### CEFR 等級篩選 +```typescript +enum CEFRLevel { + A1 = "A1 - 基礎", + A2 = "A2 - 基礎", + B1 = "B1 - 中級", + B2 = "B2 - 中高級", + C1 = "C1 - 高級", + C2 = "C2 - 精通" +} +``` + +##### 詞性篩選 +```typescript +enum PartOfSpeech { + noun = "名詞 (noun)", + verb = "動詞 (verb)", + adjective = "形容詞 (adjective)", + adverb = "副詞 (adverb)", + preposition = "介詞 (preposition)", + interjection = "感嘆詞 (interjection)" +} +``` + +##### 掌握程度篩選 +```typescript +enum MasteryLevel { + high = "已熟練 (80%+)", // >= 80% + medium = "學習中 (60-79%)", // 60-79% + low = "需加強 (<60%)" // < 60% +} +``` + +##### 收藏狀態篩選 +- 檢查框選項:"僅顯示收藏詞卡" +- 與星星圖標配合顯示 + +#### 2.2.3 快速篩選按鈕 +提供常用篩選組合的快速按鈕: +- **需加強詞卡**: 自動設定掌握度 < 60% +- **收藏詞卡**: 自動篩選收藏項目 +- **高級詞彙**: 自動設定 CEFR 等級為 C1/C2 +- **清除全部**: 重置所有篩選條件 + +### 2.3 詞卡操作功能 + +#### 2.3.1 CRUD 操作 + +##### 新增詞卡 +- **觸發方式**: + - 手動新增按鈕 (開啟表單) + - AI 生成詞卡 (從 `/generate` 頁面) + - 批量導入 (未來功能) + +##### 編輯詞卡 +- **可編輯欄位**: + ```typescript + interface EditableFlashcard { + word: string; // 詞彙 + translation: string; // 中文翻譯 + definition: string; // 英文定義 + pronunciation: string; // 發音符號 + partOfSpeech: string; // 詞性 + example: string; // 例句 + difficultyLevel: string; // CEFR 等級 + } + ``` + +##### 刪除詞卡 +- **安全機制**: + - 二次確認對話框 + - 顯示詞彙名稱確認 + - 軟刪除機制 (可恢復,未來功能) + +#### 2.3.2 收藏功能 +- **收藏狀態切換**: 點擊星星圖標 +- **視覺反饋**: + - 未收藏: 灰色空心星星 + - 已收藏: 黃色實心星星 +- **操作反饋**: 顯示操作成功/失敗訊息 +- **收藏統計**: 在收藏分頁顯示總數 + +#### 2.3.3 詞卡詳細頁面 +- **導航路徑**: `/flashcards/[id]` +- **顯示內容**: + - 完整詞卡信息 + - 學習記錄統計 + - 複習歷史 + - 錯誤回報記錄 + +### 2.4 學習進度管理 + +#### 2.4.1 掌握度系統 +```typescript +interface MasteryTracking { + masteryLevel: number; // 0-100% 掌握度 + timesReviewed: number; // 複習次數 + nextReviewDate: string; // 下次複習日期 + lastReviewDate?: string; // 上次複習日期 + consecutiveCorrect: number; // 連續答對次數 +} +``` + +#### 2.4.2 學習狀態指示 +- **掌握度顏色編碼**: + - < 60%: 紅色 (需加強) + - 60-79%: 黃色 (學習中) + - >= 80%: 綠色 (已熟練) + +### 2.5 資料結構定義 + +#### 2.5.1 詞卡核心資料結構 +```typescript +interface Flashcard { + // 基本識別信息 + id: string; // 唯一識別碼 + createdAt: string; // 創建時間 + updatedAt?: string; // 更新時間 + + // 詞彙基本信息 + word: string; // 詞彙本身 + translation: string; // 中文翻譯 + definition: string; // 英文定義 + pronunciation: string; // 發音符號 (IPA) + partOfSpeech: string; // 詞性 + + // 學習相關 + example: string; // 例句 + exampleTranslation?: string; // 例句翻譯 + difficultyLevel: string; // CEFR 難度等級 + + // 學習追蹤 + masteryLevel: number; // 掌握度 (0-100) + timesReviewed: number; // 複習次數 + nextReviewDate: string; // 下次複習日期 + + // 用戶偏好 + isFavorite: boolean; // 是否收藏 +} +``` + +#### 2.5.2 API 服務結構 +```typescript +class FlashcardsService { + // 查詢操作 + getFlashcards(search?: string, favoritesOnly?: boolean): Promise> + getFlashcard(id: string): Promise> + + // 修改操作 + createFlashcard(data: CreateFlashcardRequest): Promise> + updateFlashcard(id: string, data: CreateFlashcardRequest): Promise> + deleteFlashcard(id: string): Promise> + + // 特殊操作 + toggleFavorite(id: string): Promise> +} +``` + +## 3. 用戶介面規格 + +### 3.1 響應式設計要求 + +#### 3.1.1 桌面版 (>1024px) +- 詞卡列表:單欄佈局,每個詞卡橫向顯示 +- 搜尋區域:完整展示所有篩選選項 +- 操作按鈕:完整文字標籤 + +#### 3.1.2 平板版 (768-1024px) +- 詞卡圖片:適度縮小但保持清晰 +- 篩選選項:可收縮式設計 +- 操作按鈕:保持圖標+文字 + +#### 3.1.3 手機版 (<768px) +- 詞卡佈局:調整為垂直堆疊 +- 搜尋功能:優先顯示主搜尋框 +- 操作按鈕:僅顯示圖標,提供 tooltip + +### 3.2 互動設計規範 + +#### 3.2.1 狀態回饋 +- **載入狀態**: 顯示 "載入中..." 提示 +- **空狀態**: 友善的空狀態提示 + 引導操作 +- **錯誤狀態**: 清楚的錯誤信息 + 重試選項 + +#### 3.2.2 操作回饋 +- **成功操作**: 綠色提示訊息,自動消失 +- **失敗操作**: 紅色錯誤訊息,需手動關閉 +- **確認操作**: 模態對話框,清楚的確認/取消選項 + +### 3.3 可訪問性要求 +- **鍵盤導航**: 支援 Tab/Enter/Escape 鍵操作 +- **螢幕閱讀器**: 適當的 ARIA 標籤和角色 +- **對比度**: 符合 WCAG 2.1 AA 標準 +- **文字大小**: 支援縮放至 200% 而不影響功能 + +## 4. 技術實現規格 + +### 4.1 前端技術架構 +- **框架**: Next.js 15 with App Router +- **語言**: TypeScript +- **樣式**: Tailwind CSS +- **狀態管理**: React useState/useEffect hooks +- **API 通信**: Fetch API with error handling + +### 4.2 資料處理流程 + +#### 4.2.1 詞卡載入流程 +```typescript +// 載入流程 +loadFlashcards() -> flashcardsService.getFlashcards() -> setFlashcards(data) + +// 錯誤處理 +catch(error) -> setError(message) -> 顯示錯誤狀態 +``` + +#### 4.2.2 搜尋篩選流程 +```typescript +// 即時篩選 +filteredCards = allCards.filter(card => { + // 文字搜尋 + matchesText = word/translation/definition 包含關鍵字 + + // 篩選條件 + matchesCEFR = 符合CEFR等級篩選 + matchesPartOfSpeech = 符合詞性篩選 + matchesMastery = 符合掌握度篩選 + matchesFavorite = 符合收藏狀態篩選 + + return matchesText && matchesCEFR && ... +}) +``` + +### 4.3 效能優化策略 + +#### 4.3.1 資料載入優化 +- **分頁載入**: 避免一次載入過多詞卡 +- **快取機制**: 本地快取搜尋結果 +- **延遲載入**: 圖片使用 lazy loading + +#### 4.3.2 搜尋效能優化 +- **防抖處理**: 搜尋輸入 300ms 延遲 +- **索引優化**: 預處理搜尋索引 +- **記憶化**: 使用 useMemo 快取篩選結果 + +## 5. 資料存儲規格 + +### 5.1 後端 API 端點 +``` +GET /api/flashcards # 取得詞卡列表 +GET /api/flashcards/{id} # 取得單一詞卡 +POST /api/flashcards # 創建新詞卡 +PUT /api/flashcards/{id} # 更新詞卡 +DELETE /api/flashcards/{id} # 刪除詞卡 +POST /api/flashcards/{id}/favorite # 切換收藏狀態 +``` + +### 5.2 資料庫結構 (SQLite) +```sql +CREATE TABLE flashcards ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + word TEXT NOT NULL, + translation TEXT NOT NULL, + definition TEXT NOT NULL, + pronunciation TEXT, + part_of_speech TEXT, + example TEXT, + example_translation TEXT, + difficulty_level TEXT, + mastery_level INTEGER DEFAULT 0, + times_reviewed INTEGER DEFAULT 0, + is_favorite BOOLEAN DEFAULT FALSE, + next_review_date TEXT, + created_at TEXT NOT NULL, + updated_at TEXT, + + FOREIGN KEY (user_id) REFERENCES users(id) +); +``` + +## 6. 測試規格 + +### 6.1 功能測試用例 + +#### 6.1.1 詞卡顯示測試 +- [ ] 詞卡列表正確載入和顯示 +- [ ] CEFR 等級顏色正確顯示 +- [ ] 收藏狀態正確顯示 +- [ ] 掌握度百分比正確顯示 + +#### 6.1.2 搜尋功能測試 +- [ ] 文字搜尋功能正常 +- [ ] 搜尋結果高亮顯示 +- [ ] 進階篩選功能正常 +- [ ] 快速篩選按鈕功能正常 +- [ ] 清除篩選功能正常 + +#### 6.1.3 詞卡操作測試 +- [ ] 新增詞卡功能正常 +- [ ] 編輯詞卡功能正常 +- [ ] 刪除詞卡功能正常 (包含二次確認) +- [ ] 收藏切換功能正常 +- [ ] 詳細頁面導航正常 + +### 6.2 效能測試要求 +- [ ] 1000+ 詞卡載入時間 < 2秒 +- [ ] 搜尋響應時間 < 300ms +- [ ] 篩選操作響應時間 < 100ms +- [ ] 記憶體使用合理 (< 100MB) + +### 6.3 可用性測試要求 +- [ ] 新用戶能在 5 分鐘內完成基本操作 +- [ ] 搜尋功能直觀易用 +- [ ] 錯誤訊息清楚明確 +- [ ] 空狀態引導有效 + +## 7. 未來功能規劃 + +### 7.1 短期功能 (1-2個月) +- [ ] **批量操作**: 多選詞卡進行批量刪除、編輯 +- [ ] **標籤系統**: 自定義標籤分類詞卡 +- [ ] **排序功能**: 按創建時間、掌握度、複習頻率排序 +- [ ] **匯入匯出**: CSV/JSON 格式的詞卡匯入匯出 + +### 7.2 中期功能 (3-6個月) +- [ ] **智能推薦**: 基於學習進度推薦複習詞卡 +- [ ] **學習統計**: 詳細的學習進度圖表分析 +- [ ] **協作功能**: 詞卡分享和協作編輯 +- [ ] **離線功能**: 離線瀏覽和學習詞卡 + +### 7.3 長期功能 (6個月+) +- [ ] **AI 輔助**: 智能錯誤檢測和內容優化建議 +- [ ] **多媒體支援**: 音訊、影片例句 +- [ ] **社群功能**: 公共詞卡庫和評分系統 +- [ ] **API 開放**: 第三方整合 API + +## 8. 成功指標 + +### 8.1 功能完成度指標 +- [ ] 所有核心功能 100% 實現 +- [ ] 所有測試用例 100% 通過 +- [ ] 零阻塞性 Bug + +### 8.2 用戶體驗指標 +- [ ] 詞卡載入時間 < 2秒 +- [ ] 搜尋響應時間 < 300ms +- [ ] 用戶操作成功率 > 95% +- [ ] 錯誤恢復時間 < 5秒 + +### 8.3 業務指標 +- [ ] 用戶詞卡創建數量增長 +- [ ] 搜尋功能使用頻率 +- [ ] 收藏功能使用率 +- [ ] 用戶留存率提升 + +--- + +**文檔版本**: v1.0 +**最後更新**: 2025-09-24 +**文檔狀態**: 待審核 +**負責人**: AI Assistant +**審核人**: 待指定 \ No newline at end of file