216 lines
13 KiB
Go
216 lines
13 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// ListeningMaterial 听力材料模型
|
|
type ListeningMaterial struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:材料ID"`
|
|
Title string `json:"title" gorm:"type:varchar(200);not null;comment:标题"`
|
|
Description *string `json:"description" gorm:"type:text;comment:描述"`
|
|
AudioURL string `json:"audio_url" gorm:"type:varchar(500);not null;comment:音频URL"`
|
|
Transcript *string `json:"transcript" gorm:"type:longtext;comment:音频文本"`
|
|
Duration int `json:"duration" gorm:"type:int;comment:时长(秒)"`
|
|
Level string `json:"level" gorm:"type:enum('beginner','intermediate','advanced');not null;comment:难度级别"`
|
|
Category string `json:"category" gorm:"type:varchar(50);comment:分类"`
|
|
Tags *string `json:"tags" gorm:"type:json;comment:标签(JSON数组)"`
|
|
IsActive bool `json:"is_active" gorm:"type:boolean;default:true;comment:是否启用"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"`
|
|
|
|
// 关联关系
|
|
ListeningRecords []ListeningRecord `json:"listening_records,omitempty" gorm:"foreignKey:MaterialID"`
|
|
}
|
|
|
|
// ListeningRecord 听力练习记录模型
|
|
type ListeningRecord struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:记录ID"`
|
|
UserID string `json:"user_id" gorm:"type:varchar(36);not null;index;comment:用户ID"`
|
|
MaterialID string `json:"material_id" gorm:"type:varchar(36);not null;index;comment:材料ID"`
|
|
Score *float64 `json:"score" gorm:"type:decimal(5,2);comment:得分"`
|
|
Accuracy *float64 `json:"accuracy" gorm:"type:decimal(5,2);comment:准确率"`
|
|
CompletionRate *float64 `json:"completion_rate" gorm:"type:decimal(5,2);comment:完成率"`
|
|
TimeSpent int `json:"time_spent" gorm:"type:int;comment:用时(秒)"`
|
|
Answers *string `json:"answers" gorm:"type:json;comment:答案(JSON对象)"`
|
|
Feedback *string `json:"feedback" gorm:"type:text;comment:AI反馈"`
|
|
StartedAt time.Time `json:"started_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:开始时间"`
|
|
CompletedAt *time.Time `json:"completed_at" gorm:"type:timestamp;comment:完成时间"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
|
|
// 关联关系
|
|
User User `json:"-" gorm:"foreignKey:UserID"`
|
|
Material ListeningMaterial `json:"-" gorm:"foreignKey:MaterialID"`
|
|
}
|
|
|
|
// ReadingMaterial 阅读材料模型
|
|
type ReadingMaterial struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:材料ID"`
|
|
Title string `json:"title" gorm:"type:varchar(200);not null;comment:标题"`
|
|
Content string `json:"content" gorm:"type:longtext;not null;comment:内容"`
|
|
Summary *string `json:"summary" gorm:"type:text;comment:摘要"`
|
|
WordCount int `json:"word_count" gorm:"type:int;comment:字数"`
|
|
Level string `json:"level" gorm:"type:enum('beginner','intermediate','advanced');not null;comment:难度级别"`
|
|
Category string `json:"category" gorm:"type:varchar(50);comment:分类"`
|
|
Tags *string `json:"tags" gorm:"type:json;comment:标签(JSON数组)"`
|
|
Source *string `json:"source" gorm:"type:varchar(200);comment:来源"`
|
|
Author *string `json:"author" gorm:"type:varchar(100);comment:作者"`
|
|
IsActive bool `json:"is_active" gorm:"type:boolean;default:true;comment:是否启用"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"`
|
|
|
|
// 关联关系
|
|
ReadingRecords []ReadingRecord `json:"reading_records,omitempty" gorm:"foreignKey:MaterialID"`
|
|
}
|
|
|
|
// ReadingRecord 阅读练习记录模型
|
|
type ReadingRecord struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:记录ID"`
|
|
UserID string `json:"user_id" gorm:"type:varchar(36);not null;index;comment:用户ID"`
|
|
MaterialID string `json:"material_id" gorm:"type:varchar(36);not null;index;comment:材料ID"`
|
|
ReadingTime int `json:"reading_time" gorm:"type:int;comment:阅读时间(秒)"`
|
|
ComprehensionScore *float64 `json:"comprehension_score" gorm:"type:decimal(5,2);comment:理解得分"`
|
|
ReadingSpeed *float64 `json:"reading_speed" gorm:"type:decimal(8,2);comment:阅读速度(词/分钟)"`
|
|
Progress float64 `json:"progress" gorm:"type:decimal(5,2);default:0;comment:阅读进度"`
|
|
Bookmarks *string `json:"bookmarks" gorm:"type:json;comment:书签(JSON数组)"`
|
|
Notes *string `json:"notes" gorm:"type:text;comment:笔记"`
|
|
QuizAnswers *string `json:"quiz_answers" gorm:"type:json;comment:测验答案(JSON对象)"`
|
|
StartedAt time.Time `json:"started_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:开始时间"`
|
|
CompletedAt *time.Time `json:"completed_at" gorm:"type:timestamp;comment:完成时间"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
|
|
// 关联关系
|
|
User User `json:"-" gorm:"foreignKey:UserID"`
|
|
Material ReadingMaterial `json:"-" gorm:"foreignKey:MaterialID"`
|
|
}
|
|
|
|
// WritingPrompt 写作题目模型
|
|
type WritingPrompt struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:题目ID"`
|
|
Title string `json:"title" gorm:"type:varchar(200);not null;comment:标题"`
|
|
Prompt string `json:"prompt" gorm:"type:text;not null;comment:题目内容"`
|
|
Instructions *string `json:"instructions" gorm:"type:text;comment:写作要求"`
|
|
MinWords *int `json:"min_words" gorm:"type:int;comment:最少字数"`
|
|
MaxWords *int `json:"max_words" gorm:"type:int;comment:最多字数"`
|
|
TimeLimit *int `json:"time_limit" gorm:"type:int;comment:时间限制(分钟)"`
|
|
Level string `json:"level" gorm:"type:enum('beginner','intermediate','advanced');not null;comment:难度级别"`
|
|
Category string `json:"category" gorm:"type:varchar(50);comment:分类"`
|
|
Tags *string `json:"tags" gorm:"type:json;comment:标签(JSON数组)"`
|
|
SampleAnswer *string `json:"sample_answer" gorm:"type:longtext;comment:参考答案"`
|
|
Rubric *string `json:"rubric" gorm:"type:json;comment:评分标准(JSON对象)"`
|
|
IsActive bool `json:"is_active" gorm:"type:boolean;default:true;comment:是否启用"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"`
|
|
|
|
// 关联关系
|
|
WritingSubmissions []WritingSubmission `json:"writing_submissions,omitempty" gorm:"foreignKey:PromptID"`
|
|
}
|
|
|
|
// WritingSubmission 写作提交模型
|
|
type WritingSubmission struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:提交ID"`
|
|
UserID string `json:"user_id" gorm:"type:varchar(36);not null;index;comment:用户ID"`
|
|
PromptID string `json:"prompt_id" gorm:"type:varchar(36);not null;index;comment:题目ID"`
|
|
Content string `json:"content" gorm:"type:longtext;not null;comment:写作内容"`
|
|
WordCount int `json:"word_count" gorm:"type:int;comment:字数"`
|
|
TimeSpent int `json:"time_spent" gorm:"type:int;comment:用时(秒)"`
|
|
Score *float64 `json:"score" gorm:"type:decimal(5,2);comment:总分"`
|
|
GrammarScore *float64 `json:"grammar_score" gorm:"type:decimal(5,2);comment:语法得分"`
|
|
VocabScore *float64 `json:"vocab_score" gorm:"type:decimal(5,2);comment:词汇得分"`
|
|
CoherenceScore *float64 `json:"coherence_score" gorm:"type:decimal(5,2);comment:连贯性得分"`
|
|
Feedback *string `json:"feedback" gorm:"type:longtext;comment:AI反馈"`
|
|
Suggestions *string `json:"suggestions" gorm:"type:json;comment:改进建议(JSON数组)"`
|
|
StartedAt time.Time `json:"started_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:开始时间"`
|
|
SubmittedAt *time.Time `json:"submitted_at" gorm:"type:timestamp;comment:提交时间"`
|
|
GradedAt *time.Time `json:"graded_at" gorm:"type:timestamp;comment:批改时间"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
|
|
// 关联关系
|
|
User User `json:"-" gorm:"foreignKey:UserID"`
|
|
Prompt WritingPrompt `json:"-" gorm:"foreignKey:PromptID"`
|
|
}
|
|
|
|
// SpeakingScenario 口语场景模型
|
|
type SpeakingScenario struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:场景ID"`
|
|
Title string `json:"title" gorm:"type:varchar(200);not null;comment:标题"`
|
|
Description string `json:"description" gorm:"type:text;not null;comment:场景描述"`
|
|
Context *string `json:"context" gorm:"type:text;comment:背景信息"`
|
|
Level string `json:"level" gorm:"type:enum('beginner','intermediate','advanced');not null;comment:难度级别"`
|
|
Category string `json:"category" gorm:"type:varchar(50);comment:分类"`
|
|
Tags *string `json:"tags" gorm:"type:json;comment:标签(JSON数组)"`
|
|
Dialogue *string `json:"dialogue" gorm:"type:json;comment:对话模板(JSON数组)"`
|
|
KeyPhrases *string `json:"key_phrases" gorm:"type:json;comment:关键短语(JSON数组)"`
|
|
IsActive bool `json:"is_active" gorm:"type:boolean;default:true;comment:是否启用"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"`
|
|
|
|
// 关联关系
|
|
SpeakingRecords []SpeakingRecord `json:"speaking_records,omitempty" gorm:"foreignKey:ScenarioID"`
|
|
}
|
|
|
|
// SpeakingRecord 口语练习记录模型
|
|
type SpeakingRecord struct {
|
|
ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:记录ID"`
|
|
UserID string `json:"user_id" gorm:"type:varchar(36);not null;index;comment:用户ID"`
|
|
ScenarioID string `json:"scenario_id" gorm:"type:varchar(36);not null;index;comment:场景ID"`
|
|
AudioURL *string `json:"audio_url" gorm:"type:varchar(500);comment:录音URL"`
|
|
Transcript *string `json:"transcript" gorm:"type:longtext;comment:语音识别文本"`
|
|
Duration int `json:"duration" gorm:"type:int;comment:录音时长(秒)"`
|
|
PronunciationScore *float64 `json:"pronunciation_score" gorm:"type:decimal(5,2);comment:发音得分"`
|
|
FluencyScore *float64 `json:"fluency_score" gorm:"type:decimal(5,2);comment:流利度得分"`
|
|
AccuracyScore *float64 `json:"accuracy_score" gorm:"type:decimal(5,2);comment:准确度得分"`
|
|
OverallScore *float64 `json:"overall_score" gorm:"type:decimal(5,2);comment:总分"`
|
|
Feedback *string `json:"feedback" gorm:"type:longtext;comment:AI反馈"`
|
|
Suggestions *string `json:"suggestions" gorm:"type:json;comment:改进建议(JSON数组)"`
|
|
StartedAt time.Time `json:"started_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:开始时间"`
|
|
CompletedAt *time.Time `json:"completed_at" gorm:"type:timestamp;comment:完成时间"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
|
|
|
|
// 关联关系
|
|
User User `json:"-" gorm:"foreignKey:UserID"`
|
|
Scenario SpeakingScenario `json:"-" gorm:"foreignKey:ScenarioID"`
|
|
}
|
|
|
|
// TableName 指定表名
|
|
func (ListeningMaterial) TableName() string {
|
|
return "ai_listening_materials"
|
|
}
|
|
|
|
func (ListeningRecord) TableName() string {
|
|
return "ai_listening_records"
|
|
}
|
|
|
|
func (ReadingMaterial) TableName() string {
|
|
return "ai_reading_materials"
|
|
}
|
|
|
|
func (ReadingRecord) TableName() string {
|
|
return "ai_reading_records"
|
|
}
|
|
|
|
func (WritingPrompt) TableName() string {
|
|
return "ai_writing_prompts"
|
|
}
|
|
|
|
func (WritingSubmission) TableName() string {
|
|
return "ai_writing_submissions"
|
|
}
|
|
|
|
func (SpeakingScenario) TableName() string {
|
|
return "ai_speaking_scenarios"
|
|
}
|
|
|
|
func (SpeakingRecord) TableName() string {
|
|
return "ai_speaking_records"
|
|
} |