dramaling-vocab-learning/00_starter/old/mvp-feature-spec.md

535 lines
10 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.

# LinguaForge MVP 功能規格書
## 1. 產品概述
**產品名稱**LinguaForge MVP
**版本**0.1.0
**目標用戶**:想要高效學習英文詞彙的台灣用戶
**核心價值**AI 自動生成個人化詞卡 + 科學化間隔複習
## 2. 用戶故事 (User Stories)
### 2.1 核心用戶故事P0 - 必做)
```gherkin
Feature: 用戶註冊與登入
As a 新用戶
I want to 創建帳號並登入
So that 我可以保存我的學習進度
Scenario: Email 註冊
Given 我是新用戶
When 我輸入 email 和密碼
Then 系統創建帳號並自動登入
Feature: AI 詞卡生成
As a 用戶
I want to 從句子中生成詞卡
So that 我可以學習新單字
Scenario: 生成詞卡
Given 我輸入一個英文句子
When 我選擇要學習的單字
Then AI 生成包含定義和例句的詞卡
Feature: 間隔重複複習
As a 用戶
I want to 按照科學方法複習
So that 我可以長期記住單字
Scenario: 每日複習
Given 我有待複習的詞卡
When 我打開 App
Then 我看到今日需要複習的詞卡列表
```
### 2.2 次要用戶故事P1 - 可選)
```gherkin
Feature: 學習統計
As a 用戶
I want to 查看我的學習進度
So that 我可以了解學習成效
Feature: 詞卡管理
As a 用戶
I want to 管理我的詞卡
So that 我可以整理學習內容
```
## 3. 功能規格詳述
### 3.1 用戶系統
#### 註冊流程
```yaml
輸入欄位:
- Email (必填,驗證格式)
- 密碼 (必填,最少 8 字元)
- 暱稱 (選填)
流程:
1. 用戶填寫表單
2. 前端驗證
3. 發送到 Firebase Auth
4. 創建 Supabase 用戶資料
5. 自動登入
6. 導向首頁
錯誤處理:
- Email 已存在
- 密碼太弱
- 網路錯誤
```
#### 登入流程
```yaml
輸入欄位:
- Email
- 密碼
功能:
- 記住我 (選項)
- 忘記密碼 (連結)
流程:
1. 輸入憑證
2. Firebase Auth 驗證
3. 取得 Token
4. 載入用戶資料
5. 導向首頁
```
### 3.2 AI 詞卡生成
#### 生成介面
```yaml
步驟一: 輸入句子
- 文字輸入框 (最多 200 字元)
- 範例句子提示
- 清除按鈕
步驟二: 選擇單字
- 自動標記可選單字
- 點擊選擇 (最多 5 個)
- 已選單字列表
步驟三: 生成詞卡
- 生成按鈕
- 載入動畫 (預估 3-5 秒)
- 錯誤重試
步驟四: 預覽確認
- 顯示生成結果
- 編輯選項
- 儲存/放棄
```
#### 詞卡資料結構
```json
{
"id": "uuid",
"word": "abandon",
"pronunciation": "/əˈbændən/",
"definition": "停止支持或照顧;放棄",
"partOfSpeech": "verb",
"examples": [
{
"english": "He abandoned his car in the snow.",
"chinese": "他把車遺棄在雪地裡。"
}
],
"sourceSentence": "原始句子",
"difficulty": "intermediate",
"createdAt": "2024-01-15T10:00:00Z",
"nextReviewDate": "2024-01-16T10:00:00Z",
"reviewCount": 0,
"easinessFactor": 2.5
}
```
### 3.3 複習系統
#### 複習流程
```yaml
進入複習:
- 顯示待複習數量
- 開始複習按鈕
複習介面:
第一步: 顯示單字
- 單字
- 發音
- 思考時間
第二步: 顯示答案
- 翻轉卡片動畫
- 完整定義
- 例句
第三步: 自評難度
- 完全不記得 (1)
- 有點印象 (2)
- 想了一下 (3)
- 記得 (4)
- 非常熟悉 (5)
第四步: 下一張
- 更新複習時間
- 載入下張詞卡
```
#### SM-2 演算法實現
```typescript
interface ReviewResult {
quality: number; // 1-5
easinessFactor: number;
interval: number;
repetition: number;
}
function calculateNextReview(
quality: number,
currentEF: number,
currentInterval: number,
repetitions: number
): ReviewResult {
let newEF = currentEF;
let newInterval = currentInterval;
let newRepetitions = repetitions;
if (quality < 3) {
// 重置
newInterval = 1;
newRepetitions = 0;
} else {
// 計算新 EF
newEF = currentEF + (0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02));
newEF = Math.max(1.3, newEF);
// 計算間隔
if (repetitions === 0) {
newInterval = 1;
} else if (repetitions === 1) {
newInterval = 6;
} else {
newInterval = Math.round(currentInterval * newEF);
}
newRepetitions++;
}
return {
quality,
easinessFactor: newEF,
interval: newInterval,
repetition: newRepetitions
};
}
```
### 3.4 詞卡管理
#### 列表檢視
```yaml
顯示內容:
- 詞卡列表 (分頁,每頁 20)
- 搜尋框
- 排序選項 (新到舊/舊到新/字母)
- 篩選 (全部/待複習/已掌握)
詞卡項目:
- 單字
- 定義摘要
- 下次複習時間
- 掌握程度圖示
```
#### 詞卡詳情
```yaml
顯示內容:
- 完整單字資訊
- 學習歷史
- 編輯按鈕
- 刪除按鈕
編輯功能:
- 修改定義
- 修改例句
- 重設複習進度
```
### 3.5 學習統計
#### 儀表板
```yaml
今日數據:
- 新增詞卡數
- 複習詞卡數
- 正確率
- 學習時間
總體統計:
- 總詞卡數
- 連續學習天數
- 本週學習時間
- 掌握程度分布
視覺化:
- 7 日學習趨勢圖
- 詞彙掌握度圓餅圖
```
## 4. UI/UX 規格
### 4.1 設計系統
#### 顏色規範
```yaml
主色:
primary: #4F46E5 (靛藍)
primaryDark: #3730A3
primaryLight: #818CF8
輔助色:
success: #10B981 (綠)
warning: #F59E0B (橙)
error: #EF4444 (紅)
info: #3B82F6 (藍)
中性色:
background: #F9FAFB
surface: #FFFFFF
text: #111827
textSecondary: #6B7280
border: #E5E7EB
```
#### 字體規範
```yaml
標題:
H1: 28px, bold
H2: 24px, semibold
H3: 20px, semibold
內文:
body: 16px, regular
caption: 14px, regular
small: 12px, regular
按鈕:
button: 16px, medium
```
### 4.2 主要畫面
#### 首頁
```
┌────────────────────┐
│ LinguaForge │
├────────────────────┤
│ 歡迎回來,用戶! │
│ │
│ 今日待複習: 15 │
│ [開始複習] │
│ │
│ 快速操作: │
│ [+ 新增詞卡] │
│ │
│ 學習統計 │
│ 連續 7 天 🔥 │
│ 本週 120 詞 │
└────────────────────┘
[首頁][詞卡][統計][我]
```
#### 詞卡生成
```
┌────────────────────┐
│ 新增詞卡 │
├────────────────────┤
│ 輸入句子: │
│ ┌────────────────┐ │
│ │ │ │
│ └────────────────┘ │
│ │
│ 選擇單字: │
│ [word1][word2] │
│ │
│ [生成詞卡] │
└────────────────────┘
```
## 5. 資料庫設計
### 5.1 資料表結構
#### users 表
```sql
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
email VARCHAR(255) UNIQUE NOT NULL,
nickname VARCHAR(50),
created_at TIMESTAMP DEFAULT NOW(),
last_login TIMESTAMP,
preferences JSONB DEFAULT '{}'
);
```
#### cards 表
```sql
CREATE TABLE cards (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
word VARCHAR(100) NOT NULL,
pronunciation VARCHAR(100),
definition TEXT NOT NULL,
part_of_speech VARCHAR(20),
examples JSONB DEFAULT '[]',
source_sentence TEXT,
difficulty VARCHAR(20),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
-- 複習相關
next_review_date TIMESTAMP DEFAULT NOW(),
easiness_factor DECIMAL(3,2) DEFAULT 2.5,
interval_days INTEGER DEFAULT 0,
repetition_count INTEGER DEFAULT 0,
INDEX idx_user_review (user_id, next_review_date)
);
```
#### review_logs 表
```sql
CREATE TABLE review_logs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
card_id UUID REFERENCES cards(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
quality INTEGER CHECK (quality BETWEEN 1 AND 5),
reviewed_at TIMESTAMP DEFAULT NOW(),
time_spent INTEGER, -- 秒數
INDEX idx_user_date (user_id, reviewed_at)
);
```
## 6. API 規格
### 6.1 端點列表
```yaml
認證相關:
POST /auth/register - 註冊
POST /auth/login - 登入
POST /auth/logout - 登出
POST /auth/refresh - 更新 token
詞卡相關:
GET /cards - 取得詞卡列表
POST /cards - 新增詞卡
GET /cards/:id - 取得單一詞卡
PUT /cards/:id - 更新詞卡
DELETE /cards/:id - 刪除詞卡
POST /cards/generate - AI 生成詞卡
複習相關:
GET /review/today - 今日待複習
POST /review/submit - 提交複習結果
統計相關:
GET /stats/summary - 學習統計摘要
GET /stats/history - 歷史記錄
```
### 6.2 Gemini API 呼叫規格
#### Request
```javascript
const prompt = `
你是一個英語教學助手。請根據以下句子和目標單字,生成詞彙學習卡片。
句子:${sentence}
目標單字:${targetWord}
請以 JSON 格式返回:
{
"word": "單字",
"pronunciation": "IPA 音標",
"definition": "中文定義",
"partOfSpeech": "詞性",
"examples": [
{
"english": "英文例句",
"chinese": "中文翻譯"
}
],
"difficulty": "beginner/intermediate/advanced"
}
`;
const response = await geminiAPI.generateContent(prompt);
```
## 7. 效能需求
### 7.1 回應時間
- 頁面載入:< 2
- API 回應< 1
- AI 生成< 5
- 資料庫查詢< 100ms
### 7.2 容量規劃
- 單用戶詞卡上限1000
- 每日 API 呼叫100 /用戶
- 圖片大小< 500KB
- App 大小< 50MB
## 8. 測試需求
### 8.1 功能測試
- [ ] 註冊流程完整測試
- [ ] 登入各種情境
- [ ] AI 生成 20+ 測試案例
- [ ] 複習演算法驗證
- [ ] 資料 CRUD 操作
### 8.2 相容性測試
- [ ] iOS 14+
- [ ] Android 8+
- [ ] 各種螢幕尺寸
- [ ] 橫豎屏切換
### 8.3 效能測試
- [ ] 1000 張詞卡載入
- [ ] 離線模式
- [ ] 記憶體使用
- [ ] 電池消耗
## 9. 成功指標
### 9.1 技術指標
- 崩潰率 < 1%
- 冷啟動 < 3
- API 成功率 > 99%
### 9.2 產品指標
- D1 留存 > 60%
- D7 留存 > 40%
- 日均使用 > 10 分鐘
- 每用戶日均新增 > 3 詞卡
## 10. 未來擴展預留
### 10.1 Phase 2 功能
- 語音評估
- 訂閱系統
- 社群分享
- 詞卡分類
- 學習計劃
### 10.2 技術預留
- 多語言架構
- 主題切換架構
- 插件系統架構
- A/B 測試框架