535 lines
10 KiB
Markdown
535 lines
10 KiB
Markdown
# 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 測試框架 |