58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
import random
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
|
|
from backend.auth import get_current_user
|
|
from backend.database import get_db
|
|
from backend.models import Question
|
|
from backend.schemas import PracticeCheckRequest, PracticeStartRequest
|
|
|
|
router = APIRouter(dependencies=[Depends(get_current_user)])
|
|
|
|
|
|
@router.post("/start")
|
|
def start_practice(payload: PracticeStartRequest, db: Session = Depends(get_db)) -> dict:
|
|
query = db.query(Question)
|
|
if payload.chapter:
|
|
query = query.filter(Question.chapter == payload.chapter)
|
|
if payload.secondary_knowledge:
|
|
query = query.filter(Question.secondary_knowledge == payload.secondary_knowledge)
|
|
if payload.question_type:
|
|
query = query.filter(Question.question_type == payload.question_type)
|
|
if payload.difficulty:
|
|
query = query.filter(Question.difficulty == payload.difficulty)
|
|
items = query.all()
|
|
if payload.random_mode:
|
|
random.shuffle(items)
|
|
items = items[: payload.limit]
|
|
return {
|
|
"total": len(items),
|
|
"items": [
|
|
{
|
|
"id": i.id,
|
|
"stem": i.stem,
|
|
"option_a": i.option_a,
|
|
"option_b": i.option_b,
|
|
"option_c": i.option_c,
|
|
"option_d": i.option_d,
|
|
"question_type": i.question_type,
|
|
}
|
|
for i in items
|
|
],
|
|
}
|
|
|
|
|
|
@router.post("/check")
|
|
def check_answer(payload: PracticeCheckRequest, db: Session = Depends(get_db)) -> dict:
|
|
item = db.get(Question, payload.question_id)
|
|
if not item:
|
|
return {"correct": False, "message": "题目不存在"}
|
|
user_answer = payload.user_answer.strip().upper()
|
|
right_answer = item.answer.strip().upper()
|
|
return {
|
|
"correct": user_answer == right_answer,
|
|
"right_answer": right_answer,
|
|
"explanation": item.explanation,
|
|
}
|