Add word-book practice, iOS app shell, and fix embedded WebView blank screen.

Ship dual-track learning (daily accumulation vs textbook),沪教/商务词书 APIs and UI, native iOS wrapper with bundled H5, and production book import on deploy.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-06-06 21:09:27 +08:00
parent 2fae90b597
commit e76fa586f1
76 changed files with 47488 additions and 445 deletions
+9 -4
View File
@@ -1,4 +1,6 @@
from fastapi import APIRouter, Depends
from typing import Literal, Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from auth import get_current_user
@@ -17,19 +19,21 @@ router = APIRouter(prefix="/api/quiz", tags=["quiz"])
@router.get("/daily", response_model=DailyQuizResponse)
def daily_quiz(
track: Literal["accumulation", "book"] = Query("accumulation"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
result = quiz_service.get_daily_quiz(db, current_user)
result = quiz_service.get_daily_quiz(db, current_user, track=track)
return DailyQuizResponse(**result)
@router.get("/spell", response_model=DailyQuizResponse)
def spell_quiz(
track: Literal["accumulation", "book"] = Query("accumulation"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
result = quiz_service.get_spell_quiz(db, current_user)
result = quiz_service.get_spell_quiz(db, current_user, track=track)
return DailyQuizResponse(**result)
@@ -53,7 +57,8 @@ def submit_answer(
@router.get("/stats", response_model=QuizStatsResponse)
def quiz_stats(
track: Literal["accumulation", "book"] = Query("accumulation"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
return quiz_service.get_stats(db, current_user)
return quiz_service.get_stats(db, current_user, track=track)