models.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """
  2. SQLModel 表模型:关系库实体定义,与业务模块一一对应。
  3. """
  4. from __future__ import annotations
  5. from datetime import datetime
  6. from enum import Enum
  7. from typing import Optional
  8. from uuid import UUID, uuid4
  9. from sqlalchemy import Column, Text
  10. from sqlmodel import Field, SQLModel
  11. #角色枚举:教师/学生
  12. class UserRole(str, Enum):
  13. teacher = "teacher"
  14. student = "student"
  15. #用户表
  16. class User(SQLModel, table=True):
  17. id: UUID = Field(default_factory=uuid4, primary_key=True)
  18. username: str = Field(index=True, unique=True)
  19. password_hash: str
  20. role: UserRole = Field(index=True)
  21. created_at: datetime = Field(default_factory=datetime.utcnow)
  22. #知识点表
  23. class KnowledgePoint(SQLModel, table=True):
  24. id: UUID = Field(default_factory=uuid4, primary_key=True)
  25. subject: str = Field(default="math", index=True) #学科
  26. grade: str = Field(default="junior", index=True) #年级
  27. name: str = Field(index=True) #知识点名称
  28. code: str = Field(index=True, unique=True) #知识点编码(唯一)
  29. #习题表
  30. class Exercise(SQLModel, table=True):
  31. id: UUID = Field(default_factory=uuid4, primary_key=True)
  32. title: str
  33. body: str
  34. # 题目元数据(教师维护)
  35. question_type: Optional[str] = Field(default=None, index=True) # "选择" | "填空" | "计算" | "判断"
  36. correct_answer: Optional[str] = Field(default=None, sa_column=Column(Text, nullable=True))
  37. resolution: Optional[str] = Field(default=None, sa_column=Column(Text, nullable=True)) # 题目解析
  38. # 由主knowledge_code从Neo4j回填,便于筛选与学情统计
  39. knowledge_grade: Optional[str] = Field(default=None, index=True)
  40. knowledge_category: Optional[str] = Field(default=None, index=True)
  41. knowledge_point_name: Optional[str] = Field(default=None, index=True)
  42. knowledge_code: Optional[str] = Field(default=None, index=True)
  43. difficulty: Optional[int] = Field(default=None, index=True) # 1-5
  44. # 个性化权重:答错+1,答对-1(不低于 0),供推荐排序
  45. weight: int = Field(default=0, index=True)
  46. #做题记录表
  47. class ExerciseAttempt(SQLModel, table=True):
  48. id: UUID = Field(default_factory=uuid4, primary_key=True)
  49. user_id: UUID = Field(index=True)
  50. exercise_id: UUID = Field(index=True)
  51. answer: str
  52. is_correct: Optional[bool] = Field(default=None, index=True)
  53. score: Optional[float] = Field(default=None)
  54. created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
  55. #数字人会话记录表
  56. class ChatSession(SQLModel, table=True):
  57. id: UUID = Field(default_factory=uuid4, primary_key=True)
  58. user_id: UUID = Field(index=True)
  59. topic: Optional[str] = Field(default=None, index=True)
  60. created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
  61. class ChatMessage(SQLModel, table=True):
  62. """会话消息表。"""
  63. id: UUID = Field(default_factory=uuid4, primary_key=True)
  64. session_id: UUID = Field(index=True)
  65. sender: str = Field(index=True)
  66. content: str = Field(sa_column=Column(Text, nullable=False))
  67. created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
  68. #推荐记录表
  69. class RecommendationItem(SQLModel, table=True):
  70. id: UUID = Field(default_factory=uuid4, primary_key=True)
  71. user_id: UUID = Field(index=True)
  72. item_type: str = Field(index=True)
  73. item_ref: str = Field(index=True)
  74. reason: Optional[str] = None
  75. created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
  76. #错题本
  77. class WrongBookItem(SQLModel, table=True):
  78. id: UUID = Field(default_factory=uuid4, primary_key=True)
  79. user_id: UUID = Field(index=True)
  80. exercise_id: UUID = Field(index=True)
  81. knowledge_code: str = Field(index=True)
  82. wrong_answer: str
  83. correct_answer: Optional[str] = None
  84. created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
  85. #模块登记表
  86. class ModuleService(SQLModel, table=True):
  87. id: UUID = Field(default_factory=uuid4, primary_key=True)
  88. name: str = Field(index=True, unique=True)
  89. base_url: str
  90. is_enabled: bool = Field(default=True, index=True)
  91. updated_at: datetime = Field(default_factory=datetime.utcnow, index=True)