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

10 KiB
Raw Blame History

LinguaForge MVP 功能規格書

1. 產品概述

產品名稱LinguaForge MVP 版本0.1.0 目標用戶:想要高效學習英文詞彙的台灣用戶 核心價值AI 自動生成個人化詞卡 + 科學化間隔複習

2. 用戶故事 (User Stories)

2.1 核心用戶故事P0 - 必做)

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 - 可選)

Feature: 學習統計
  As a 用戶
  I want to 查看我的學習進度
  So that 我可以了解學習成效

Feature: 詞卡管理
  As a 用戶
  I want to 管理我的詞卡
  So that 我可以整理學習內容

3. 功能規格詳述

3.1 用戶系統

註冊流程

輸入欄位:
  - Email (必填,驗證格式)
  - 密碼 (必填,最少 8 字元)
  - 暱稱 (選填)

流程:
  1. 用戶填寫表單
  2. 前端驗證
  3. 發送到 Firebase Auth
  4. 創建 Supabase 用戶資料
  5. 自動登入
  6. 導向首頁

錯誤處理:
  - Email 已存在
  - 密碼太弱
  - 網路錯誤

登入流程

輸入欄位:
  - Email
  - 密碼

功能:
  - 記住我 (選項)
  - 忘記密碼 (連結)

流程:
  1. 輸入憑證
  2. Firebase Auth 驗證
  3. 取得 Token
  4. 載入用戶資料
  5. 導向首頁

3.2 AI 詞卡生成

生成介面

步驟一: 輸入句子
  - 文字輸入框 (最多 200 字元)
  - 範例句子提示
  - 清除按鈕

步驟二: 選擇單字
  - 自動標記可選單字
  - 點擊選擇 (最多 5 個)
  - 已選單字列表

步驟三: 生成詞卡
  - 生成按鈕
  - 載入動畫 (預估 3-5 秒)
  - 錯誤重試

步驟四: 預覽確認
  - 顯示生成結果
  - 編輯選項
  - 儲存/放棄

詞卡資料結構

{
  "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 複習系統

複習流程

進入複習:
  - 顯示待複習數量
  - 開始複習按鈕

複習介面:
  第一步: 顯示單字
    - 單字
    - 發音
    - 思考時間

  第二步: 顯示答案
    - 翻轉卡片動畫
    - 完整定義
    - 例句

  第三步: 自評難度
    - 完全不記得 (1)
    - 有點印象 (2)
    - 想了一下 (3)
    - 記得 (4)
    - 非常熟悉 (5)

  第四步: 下一張
    - 更新複習時間
    - 載入下張詞卡

SM-2 演算法實現

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 詞卡管理

列表檢視

顯示內容:
  - 詞卡列表 (分頁,每頁 20)
  - 搜尋框
  - 排序選項 (新到舊/舊到新/字母)
  - 篩選 (全部/待複習/已掌握)

詞卡項目:
  - 單字
  - 定義摘要
  - 下次複習時間
  - 掌握程度圖示

詞卡詳情

顯示內容:
  - 完整單字資訊
  - 學習歷史
  - 編輯按鈕
  - 刪除按鈕

編輯功能:
  - 修改定義
  - 修改例句
  - 重設複習進度

3.5 學習統計

儀表板

今日數據:
  - 新增詞卡數
  - 複習詞卡數
  - 正確率
  - 學習時間

總體統計:
  - 總詞卡數
  - 連續學習天數
  - 本週學習時間
  - 掌握程度分布

視覺化:
  - 7 日學習趨勢圖
  - 詞彙掌握度圓餅圖

4. UI/UX 規格

4.1 設計系統

顏色規範

主色:
  primary: #4F46E5 (靛藍)
  primaryDark: #3730A3
  primaryLight: #818CF8

輔助色:
  success: #10B981 (綠)
  warning: #F59E0B (橙)
  error: #EF4444 (紅)
  info: #3B82F6 (藍)

中性色:
  background: #F9FAFB
  surface: #FFFFFF
  text: #111827
  textSecondary: #6B7280
  border: #E5E7EB

字體規範

標題:
  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 表

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 表

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 表

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 端點列表

認證相關:
  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

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 測試框架