Files
ai_english/serve/internal/models/test.go
2025-11-17 14:09:17 +08:00

191 lines
8.0 KiB
Go

package models
import (
"time"
)
// TestType 测试类型
type TestType string
const (
TestTypeQuick TestType = "quick" // 快速测试
TestTypeComprehensive TestType = "comprehensive" // 综合测试
TestTypeDaily TestType = "daily" // 每日测试
TestTypeCustom TestType = "custom" // 自定义测试
)
// TestDifficulty 测试难度
type TestDifficulty string
const (
TestDifficultyBeginner TestDifficulty = "beginner" // 初级
TestDifficultyIntermediate TestDifficulty = "intermediate" // 中级
TestDifficultyAdvanced TestDifficulty = "advanced" // 高级
)
// TestStatus 测试状态
type TestStatus string
const (
TestStatusPending TestStatus = "pending" // 待开始
TestStatusInProgress TestStatus = "in_progress" // 进行中
TestStatusPaused TestStatus = "paused" // 已暂停
TestStatusCompleted TestStatus = "completed" // 已完成
TestStatusAbandoned TestStatus = "abandoned" // 已放弃
)
// SkillType 技能类型
type SkillType string
const (
SkillTypeVocabulary SkillType = "vocabulary" // 词汇
SkillTypeGrammar SkillType = "grammar" // 语法
SkillTypeReading SkillType = "reading" // 阅读
SkillTypeListening SkillType = "listening" // 听力
SkillTypeSpeaking SkillType = "speaking" // 口语
SkillTypeWriting SkillType = "writing" // 写作
)
// QuestionType 题目类型
type QuestionType string
const (
QuestionTypeSingleChoice QuestionType = "single_choice" // 单选题
QuestionTypeMultipleChoice QuestionType = "multiple_choice" // 多选题
QuestionTypeTrueFalse QuestionType = "true_false" // 判断题
QuestionTypeFillBlank QuestionType = "fill_blank" // 填空题
QuestionTypeShortAnswer QuestionType = "short_answer" // 简答题
)
// TestTemplate 测试模板
type TestTemplate struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(36)"`
Title string `json:"title" gorm:"type:varchar(255);not null"`
Description string `json:"description" gorm:"type:text"`
Type TestType `json:"type" gorm:"type:varchar(50);not null"`
Difficulty TestDifficulty `json:"difficulty" gorm:"type:varchar(50)"`
Duration int `json:"duration" gorm:"comment:测试时长(秒)"`
TotalQuestions int `json:"total_questions" gorm:"comment:总题目数"`
PassingScore int `json:"passing_score" gorm:"comment:及格分数"`
MaxScore int `json:"max_score" gorm:"comment:最高分数"`
QuestionConfig string `json:"question_config" gorm:"type:json;comment:题目配置"`
SkillDistribution string `json:"skill_distribution" gorm:"type:json;comment:技能分布"`
IsActive bool `json:"is_active" gorm:"default:true"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// TableName 指定表名
func (TestTemplate) TableName() string {
return "test_templates"
}
// TestQuestion 测试题目
type TestQuestion struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(36)"`
TemplateID string `json:"template_id" gorm:"type:varchar(36);index"`
QuestionType QuestionType `json:"question_type" gorm:"type:varchar(50);not null"`
SkillType SkillType `json:"skill_type" gorm:"type:varchar(50);not null"`
Difficulty TestDifficulty `json:"difficulty" gorm:"type:varchar(50)"`
Content string `json:"content" gorm:"type:text;not null;comment:题目内容"`
Options string `json:"options" gorm:"type:json;comment:选项(JSON数组)"`
CorrectAnswer string `json:"correct_answer" gorm:"type:text;comment:正确答案"`
Explanation string `json:"explanation" gorm:"type:text;comment:答案解析"`
Points int `json:"points" gorm:"default:1;comment:分值"`
OrderIndex int `json:"order_index" gorm:"comment:题目顺序"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// TableName 指定表名
func (TestQuestion) TableName() string {
return "test_questions"
}
// TestSession 测试会话
type TestSession struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(36)"`
TemplateID string `json:"template_id" gorm:"type:varchar(36);not null;index"`
UserID string `json:"user_id" gorm:"type:varchar(36);not null;index"`
Status TestStatus `json:"status" gorm:"type:varchar(50);not null;default:'pending'"`
StartTime *time.Time `json:"start_time"`
EndTime *time.Time `json:"end_time"`
PausedAt *time.Time `json:"paused_at"`
TimeRemaining int `json:"time_remaining" gorm:"comment:剩余时间(秒)"`
CurrentQuestionIndex int `json:"current_question_index" gorm:"default:0"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
// 关联
Template *TestTemplate `json:"template,omitempty" gorm:"foreignKey:TemplateID"`
Questions []TestQuestion `json:"questions,omitempty" gorm:"many2many:test_session_questions"`
Answers []TestAnswer `json:"answers,omitempty" gorm:"foreignKey:SessionID"`
}
// TableName 指定表名
func (TestSession) TableName() string {
return "test_sessions"
}
// TestAnswer 测试答案
type TestAnswer struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(36)"`
SessionID string `json:"session_id" gorm:"type:varchar(36);not null;index"`
QuestionID string `json:"question_id" gorm:"type:varchar(36);not null;index"`
Answer string `json:"answer" gorm:"type:text;comment:用户答案"`
IsCorrect *bool `json:"is_correct" gorm:"comment:是否正确"`
Score int `json:"score" gorm:"default:0;comment:得分"`
TimeSpent int `json:"time_spent" gorm:"comment:答题用时(秒)"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
// 关联
Question *TestQuestion `json:"question,omitempty" gorm:"foreignKey:QuestionID"`
}
// TableName 指定表名
func (TestAnswer) TableName() string {
return "test_answers"
}
// TestResult 测试结果
type TestResult struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(36)"`
SessionID string `json:"session_id" gorm:"type:varchar(36);not null;unique;index"`
UserID string `json:"user_id" gorm:"type:varchar(36);not null;index"`
TemplateID string `json:"template_id" gorm:"type:varchar(36);not null;index"`
TotalScore int `json:"total_score" gorm:"comment:总得分"`
MaxScore int `json:"max_score" gorm:"comment:最高分"`
Percentage float64 `json:"percentage" gorm:"type:decimal(5,2);comment:得分百分比"`
CorrectCount int `json:"correct_count" gorm:"comment:正确题数"`
WrongCount int `json:"wrong_count" gorm:"comment:错误题数"`
SkippedCount int `json:"skipped_count" gorm:"comment:跳过题数"`
TimeSpent int `json:"time_spent" gorm:"comment:总用时(秒)"`
SkillScores string `json:"skill_scores" gorm:"type:json;comment:各技能得分"`
Passed bool `json:"passed" gorm:"comment:是否通过"`
CompletedAt time.Time `json:"completed_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
// 关联
Session *TestSession `json:"session,omitempty" gorm:"foreignKey:SessionID"`
Template *TestTemplate `json:"template,omitempty" gorm:"foreignKey:TemplateID"`
}
// TableName 指定表名
func (TestResult) TableName() string {
return "test_results"
}
// TestSessionQuestion 测试会话题目关联表
type TestSessionQuestion struct {
SessionID string `gorm:"primaryKey;type:varchar(36)"`
QuestionID string `gorm:"primaryKey;type:varchar(36)"`
OrderIndex int `gorm:"comment:题目顺序"`
}
// TableName 指定表名
func (TestSessionQuestion) TableName() string {
return "test_session_questions"
}