Files
ai_english/serve/internal/models/learning.go

216 lines
13 KiB
Go
Raw Normal View History

2025-11-17 13:39:05 +08:00
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"
}