Appearance
画面設計: 単語学習・クイズ
関連: api.md §3 / data-model.md §3.5, §3.5b
URL
/app/vocab— 単語セット一覧/app/vocab/:setId— 単語リスト・フラッシュカード学習/app/vocab/:setId/quiz— クイズ(新規開始 or 進行中 attempt 再開)/app/vocab/:setId/result?attemptId=...— 結果(attemptId 必須、指定なしは最新を自動解決し 302)
1. 単語セット一覧 /app/vocab
- 担当セット一覧(進捗率、残語数)
- フィルタ:全て / 未修了 / 継続学習
- API:
GET /learner/vocab-sets
2. 単語リスト /app/vocab/:setId
レイアウト
- カード形式(1語/画面をスワイプ)
- 表:見出し語・読み(ひらがな/ローマ字)
- 裏:意味(日本語→ベトナム語)、例文、音声(任意)
- アクション:「覚えた」「もう一度」「クイズへ」
API
GET /learner/vocab-sets/:idPOST /learner/vocab-sets/:id/progress(ボディ:{ vocabularyId, status })
データ
VocabularyProgress.status:new | learning | mastered | forgotten- レスポンス時間の記録:
response_time_ms(次回の優先度決定用)
3. クイズ /app/vocab/:setId/quiz
レイアウト
- 進捗バー(1/10)
- 問題文(例:意味選択 / 聞き取り / 穴埋め)
- 選択肢 4つ or テキスト入力
- 残時間(任意制限)
種類
- 4択:意味 → 単語、単語 → 意味
- 記述:ひらがな入力
- リスニング:音声 → 単語(任意)
フロー
- クイズ開始時、
POST /learner/quizzes/:quizId/attemptsでQuizAttemptを生成:quizIdはCurriculumItemまたはVocabularySetから導出(GET /learner/vocab-sets/:setId応答にquizIdを含める)- Idempotency-Key ヘッダ必須。重複送信時は同一 attempt を返す
- 各設問ごと
POST /learner/quiz-attempts/:attemptId/answers(Idempotency-Key必須) - 完了時
POST /learner/quiz-attempts/:attemptId/submit(冪等。既に submit 済なら 200) - 結果画面
/app/vocab/:setId/result?attemptId=...へ遷移
データ
- 回答の
response_time_msを必ず記録(一貫性指標の入力) - 途中離脱 →
status: abandonedとして保持(再開可否は別途)
エッジケース
- 通信断:ローカルに暫定保存(IndexedDB)、復帰時に
Idempotency-Key付きで再送 - タブ切替:送信中の回答は保持
- 重複 submit:サーバは同一 attempt で 1 回のみ確定、2 回目以降は確定済みレスポンスを返す
- attempt 再開:同一 quizId で
in_progressの attempt があれば、新規生成せず再開
4. 結果 /app/vocab/:setId/result
- スコア表示(x/y 正解)
- 誤答一覧(正解と解説)
- 「単語リストで復習」ボタン
- 「ホームへ戻る」
- 肯定的表現:「間違えた問題は宝物」等
アクセシビリティ
- 音声問題には字幕・テキスト版代替
- キーボード操作:1-4 キーで選択肢選択、Enter 送信
モック(M1)
- 10 問の静的クイズデータ
- 回答は localStorage に保存(サーバ連携なし)
RBAC
- LR のみアクセス可(自分のクイズ)
- API は
api.md §1.0の LR スコープに従う
未確定
- 間隔反復アルゴリズム(SM-2 系 or Leitner)
- リスニング音声の収録方法・多声対応