| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- from pydantic import BaseModel
- from typing import Optional, List, Dict
- from enum import Enum
- from datetime import datetime
- class LearningPath(str, Enum):
- FRONTEND = "frontend"
- BACKEND = "backend"
- FULLSTACK = "fullstack"
- class ModuleStatus(str, Enum):
- NOT_STARTED = "not_started"
- IN_PROGRESS = "in_progress"
- COMPLETED = "completed"
- LOCKED = "locked"
- class UserLevel(str, Enum):
- BEGINNER = "beginner"
- INTERMEDIATE = "intermediate"
- ADVANCED = "advanced"
- class LearningModule(BaseModel):
- id: str
- title: str
- description: str
- icon: str
- order: int
- lessons: List["LearningLesson"]
- status: ModuleStatus = ModuleStatus.NOT_STARTED
- progress: float = 0.0 # 0-100
- class LearningLesson(BaseModel):
- id: str
- title: str
- description: str
- type: str # "theory", "practice", "quiz", "project"
- duration_minutes: int
- is_completed: bool = False
- content_markdown: Optional[str] = None # Markdown格式的课程内容
- class LearningPathData(BaseModel):
- path: LearningPath
- title: str
- description: str
- icon: str
- modules: List[LearningModule]
- total_lessons: int = 0
- completed_lessons: int = 0
- progress: float = 0.0
- class AssessmentResult(BaseModel):
- """水平检测结果"""
- user_id: str = "default"
- path_type: str # LearningPath value
- total_questions: int
- correct_count: int
- score: float # 0-100
- level: UserLevel
- category_scores: Dict[str, float] # 各分类得分 {"html_css": 80, "javascript": 60, ...}
- recommended_start_module: str # 推荐开始的模块ID
- completed_at: datetime
- is_current: bool = True # 是否为当前有效结果
- class UserProgress(BaseModel):
- user_id: str = "default"
- current_path: Optional[LearningPath] = None
- completed_modules: List[str] = []
- completed_lessons: List[str] = []
- current_module: Optional[str] = None
- current_lesson: Optional[str] = None
- started_at: Optional[datetime] = None
- last_activity_at: Optional[datetime] = None
- total_study_minutes: int = 0
- assessments: List[AssessmentResult] = [] # 测试结果历史
- skill_levels: Dict[str, float] = {} # 各分类水平 0-100
- learning_plan: Optional[str] = None # AI生成的个性化学习计划
- last_session: Optional[dict] = None # 用户最近的会话数据
- class CodeSubmission(BaseModel):
- """代码提交记录"""
- id: str
- user_id: str = "default"
- code: str
- language: str = "python"
- output: str = ""
- error: str = ""
- success: bool = True
- exit_code: int = 0
- lesson_id: Optional[str] = None
- feedback: str = ""
- created_at: datetime
- class CoachRecommendation(BaseModel):
- type: str # "next_lesson", "review", "practice", "challenge"
- title: str
- description: str
- module_id: Optional[str] = None
- lesson_id: Optional[str] = None
- priority: int = 1 # 1-5
- class GamificationProfile(BaseModel):
- """游戏化个人档案"""
- user_id: str = "default"
- total_xp: int = 0
- level: int = 1
- streak: int = 0 # 连续学习天数
- last_active_date: str = "" # "YYYY-MM-DD"
- badges: List[str] = [] # 已获得的徽章ID列表
- xp_log: List[dict] = [] # XP变动记录 [{amount, reason, timestamp}]
- class CoachResponse(BaseModel):
- greeting: str
- recommendations: List[CoachRecommendation]
- encouragement: str
- stats: dict
- learning_plan: Optional[str] = None # AI生成的个性化学习计划
- # ===== 水平检测相关模型 =====
- class AssessmentQuestion(BaseModel):
- """检测题目"""
- id: str
- category: str # "html_css", "javascript", "python", "vue", "system_design"
- difficulty: int # 1-5
- content: str
- question_type: str = "choice" # "choice" | "code_output" | "code_fill" | "bug_fix"
- code_snippet: Optional[str] = None # 代码片段(用于代码类题目)
- options: List[str] # 选择题选项
- correct_answer: str # "A", "B", "C", "D"
- explanation: str
- class AssessmentStartRequest(BaseModel):
- """开始检测请求"""
- path_type: str # LearningPath value
- user_id: str = "default"
- class AssessmentAnswerRequest(BaseModel):
- """提交答案请求"""
- session_id: str
- question_id: str
- answer: str # "A", "B", "C", "D"
- path_type: str
- user_id: str = "default"
- class AssessmentCompleteRequest(BaseModel):
- """完成检测请求"""
- session_id: str
- path_type: str
- user_id: str = "default"
- class AssessmentStartResponse(BaseModel):
- """开始检测响应"""
- session_id: str
- question: AssessmentQuestion
- current_index: int
- total_questions: int
- class AssessmentAnswerResponse(BaseModel):
- """提交答案响应"""
- is_correct: bool
- correct_answer: str
- explanation: str
- next_question: Optional[AssessmentQuestion]
- current_index: int
- total_questions: int
- is_completed: bool
|