user_progress.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from typing import Optional
  2. from datetime import datetime, timezone
  3. from sqlalchemy import Column, String, Text, Integer, Float, DateTime, Boolean, ForeignKey, JSON, func
  4. from sqlalchemy.orm import Mapped, mapped_column
  5. from app.models.user import Base
  6. class UserProgress(Base):
  7. __tablename__ = "user_progress"
  8. id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
  9. user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False, index=True)
  10. subject: Mapped[Optional[str]] = mapped_column(String(64), index=True)
  11. chapter_id: Mapped[Optional[str]] = mapped_column(String(64), index=True)
  12. knowledge_point_id: Mapped[Optional[str]] = mapped_column(String(64), index=True)
  13. questions_answered: Mapped[int] = mapped_column(default=0)
  14. questions_correct: Mapped[int] = mapped_column(default=0)
  15. study_seconds: Mapped[int] = mapped_column(default=0)
  16. last_study_at: Mapped[Optional[datetime]] = mapped_column(
  17. DateTime(timezone=True)
  18. )
  19. created_at: Mapped[datetime] = mapped_column(
  20. DateTime(timezone=True), server_default=func.now()
  21. )
  22. updated_at: Mapped[datetime] = mapped_column(
  23. DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
  24. )
  25. class AnswerRecord(Base):
  26. __tablename__ = "answer_records"
  27. id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
  28. user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False, index=True)
  29. question_id: Mapped[str] = mapped_column(String(64), nullable=False, index=True)
  30. user_answer: Mapped[str] = mapped_column(String(16), nullable=False)
  31. is_correct: Mapped[bool] = mapped_column(nullable=False)
  32. study_mode: Mapped[str] = mapped_column(String(32), default="practice") # practice / exam
  33. created_at: Mapped[datetime] = mapped_column(
  34. DateTime(timezone=True), server_default=func.now()
  35. )