Skip to content

画面設計: 単語学習・クイズ

関連: 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/:id
  • POST /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択:意味 → 単語、単語 → 意味
  • 記述:ひらがな入力
  • リスニング:音声 → 単語(任意)

フロー

  1. クイズ開始時、POST /learner/quizzes/:quizId/attemptsQuizAttempt を生成
    • :quizIdCurriculumItem または VocabularySet から導出(GET /learner/vocab-sets/:setId 応答に quizId を含める)
    • Idempotency-Key ヘッダ必須。重複送信時は同一 attempt を返す
  2. 各設問ごと POST /learner/quiz-attempts/:attemptId/answersIdempotency-Key 必須)
  3. 完了時 POST /learner/quiz-attempts/:attemptId/submit(冪等。既に submit 済なら 200)
  4. 結果画面 /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)
  • リスニング音声の収録方法・多声対応

Internal — thriveJobs