package models import ( "time" "gorm.io/gorm" ) // VocabularyCategory 词汇分类模型 type VocabularyCategory struct { ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:分类ID"` Name string `json:"name" gorm:"type:varchar(100);not null;comment:分类名称"` Description *string `json:"description" gorm:"type:text;comment:分类描述"` Level string `json:"level" gorm:"type:enum('beginner','intermediate','advanced');not null;comment:难度级别"` Icon *string `json:"icon" gorm:"type:varchar(255);comment:图标URL"` Color *string `json:"color" gorm:"type:varchar(7);comment:主题色"` SortOrder int `json:"sort_order" gorm:"type:int;default:0;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:更新时间"` // 关联关系 Vocabularies []Vocabulary `json:"vocabularies,omitempty" gorm:"many2many:ai_vocabulary_category_relations;foreignKey:ID;joinForeignKey:CategoryID;References:ID;joinReferences:VocabularyID;"` } // Vocabulary 词汇模型 type Vocabulary struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement;comment:词汇ID"` Word string `json:"word" gorm:"column:word;type:varchar(100);uniqueIndex;not null;comment:单词"` Phonetic *string `json:"phonetic" gorm:"column:phonetic;type:varchar(200);comment:音标"` AudioURL *string `json:"audio_url" gorm:"column:audio_url;type:varchar(500);comment:音频URL"` Level string `json:"level" gorm:"column:level;type:enum('beginner','intermediate','advanced');not null;comment:难度级别"` Frequency int `json:"frequency" gorm:"column:frequency;type:int;default:0;comment:使用频率"` IsActive bool `json:"is_active" gorm:"column:is_active;type:boolean;default:true;comment:是否启用"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at;type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"` UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at;type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"` DeletedAt gorm.DeletedAt `json:"-" gorm:"column:deleted_at;index;comment:删除时间"` // 关联关系 Definitions []VocabularyDefinition `json:"definitions,omitempty" gorm:"foreignKey:VocabularyID"` Examples []VocabularyExample `json:"examples,omitempty" gorm:"foreignKey:VocabularyID"` Images []VocabularyImage `json:"images,omitempty" gorm:"foreignKey:VocabularyID"` Categories []VocabularyCategory `json:"categories,omitempty" gorm:"many2many:ai_vocabulary_category_relations;foreignKey:ID;joinForeignKey:VocabularyID;References:ID;joinReferences:CategoryID;"` UserProgress []UserVocabularyProgress `json:"user_progress,omitempty" gorm:"foreignKey:VocabularyID"` } // VocabularyDefinition 词汇定义模型 type VocabularyDefinition struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement;comment:定义ID"` VocabularyID int64 `json:"vocabulary_id" gorm:"column:vocabulary_id;not null;index;comment:词汇ID"` PartOfSpeech string `json:"part_of_speech" gorm:"column:part_of_speech;type:varchar(20);not null;comment:词性"` Definition string `json:"definition" gorm:"column:definition_en;type:text;not null;comment:英文定义"` Translation string `json:"translation" gorm:"column:definition_cn;type:text;not null;comment:中文翻译"` SortOrder int `json:"sort_order" gorm:"column:sort_order;type:int;default:0;comment:排序"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at;type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"` // 关联关系 Vocabulary Vocabulary `json:"-" gorm:"foreignKey:VocabularyID"` } // VocabularyExample 词汇例句模型 type VocabularyExample struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement;comment:例句ID"` VocabularyID int64 `json:"vocabulary_id" gorm:"column:vocabulary_id;not null;index;comment:词汇ID"` Example string `json:"example" gorm:"column:sentence_en;type:text;not null;comment:英文例句"` Translation string `json:"translation" gorm:"column:sentence_cn;type:text;not null;comment:中文翻译"` AudioURL *string `json:"audio_url" gorm:"column:audio_url;type:varchar(500);comment:音频URL"` SortOrder int `json:"sort_order" gorm:"column:sort_order;type:int;default:0;comment:排序"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at;type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"` // 关联关系 Vocabulary Vocabulary `json:"-" gorm:"foreignKey:VocabularyID"` } // VocabularyImage 词汇图片模型 type VocabularyImage struct { ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:图片ID"` VocabularyID string `json:"vocabulary_id" gorm:"type:varchar(36);not null;index;comment:词汇ID"` ImageURL string `json:"image_url" gorm:"type:varchar(500);not null;comment:图片URL"` AltText *string `json:"alt_text" gorm:"type:varchar(255);comment:替代文本"` Caption *string `json:"caption" gorm:"type:text;comment:图片说明"` SortOrder int `json:"sort_order" gorm:"type:int;default:0;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:更新时间"` // 关联关系 Vocabulary Vocabulary `json:"-" gorm:"foreignKey:VocabularyID"` } // VocabularyCategoryRelation 词汇分类关系模型 type VocabularyCategoryRelation struct { VocabularyID string `json:"vocabulary_id" gorm:"type:varchar(36);primaryKey;comment:词汇ID"` CategoryID string `json:"category_id" gorm:"type:varchar(36);primaryKey;comment:分类ID"` CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"` } // UserVocabularyProgress 用户词汇学习进度模型 type UserVocabularyProgress struct { ID int64 `json:"id" gorm:"type:bigint;primaryKey;autoIncrement;comment:进度ID"` UserID int64 `json:"user_id" gorm:"type:bigint;not null;index;comment:用户ID"` VocabularyID string `json:"vocabulary_id" gorm:"type:varchar(36);not null;index;comment:词汇ID"` MasteryLevel int `json:"mastery_level" gorm:"type:int;default:0;comment:掌握程度(0-100)"` StudyCount int `json:"study_count" gorm:"type:int;default:0;comment:学习次数"` CorrectCount int `json:"correct_count" gorm:"type:int;default:0;comment:正确次数"` IncorrectCount int `json:"incorrect_count" gorm:"type:int;default:0;comment:错误次数"` LastStudiedAt *time.Time `json:"last_studied_at" gorm:"type:timestamp;comment:最后学习时间"` NextReviewAt *time.Time `json:"next_review_at" gorm:"type:timestamp;comment:下次复习时间"` IsMarkedDifficult bool `json:"is_marked_difficult" gorm:"type:boolean;default:false;comment:是否标记为困难"` IsFavorite bool `json:"is_favorite" gorm:"type:boolean;default:false;comment:是否收藏"` Notes *string `json:"notes" gorm:"type:text;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"` Vocabulary Vocabulary `json:"-" gorm:"foreignKey:VocabularyID"` } // UserWordProgress 用户单词学习进度模型 type UserWordProgress struct { ID int64 `json:"id" gorm:"type:bigint;primaryKey;autoIncrement;comment:进度ID"` UserID int64 `json:"user_id" gorm:"type:bigint;not null;index:idx_user_vocab;comment:用户ID"` VocabularyID int64 `json:"vocabulary_id" gorm:"type:bigint;not null;index:idx_user_vocab;comment:单词ID"` Status string `json:"status" gorm:"type:varchar(20);default:'not_started';comment:学习状态"` StudyCount int `json:"study_count" gorm:"type:int;default:0;comment:学习次数"` CorrectCount int `json:"correct_count" gorm:"type:int;default:0;comment:正确次数"` WrongCount int `json:"wrong_count" gorm:"type:int;default:0;comment:错误次数"` Proficiency int `json:"proficiency" gorm:"type:int;default:0;comment:熟练度(0-100)"` IsFavorite bool `json:"is_favorite" gorm:"type:boolean;default:false;comment:是否收藏"` NextReviewAt *time.Time `json:"next_review_at" gorm:"type:timestamp;comment:下次复习时间"` ReviewInterval int `json:"review_interval" gorm:"type:int;default:1;comment:复习间隔(天)"` FirstStudiedAt time.Time `json:"first_studied_at" gorm:"type:timestamp;comment:首次学习时间"` LastStudiedAt time.Time `json:"last_studied_at" gorm:"type:timestamp;comment:最后学习时间"` MasteredAt *time.Time `json:"mastered_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"` Vocabulary Vocabulary `json:"-" gorm:"foreignKey:VocabularyID"` } // VocabularyTest 词汇测试模型 type VocabularyTest struct { ID int64 `json:"id" gorm:"type:bigint;primaryKey;autoIncrement;comment:测试ID"` UserID int64 `json:"user_id" gorm:"type:bigint;not null;index;comment:用户ID"` TestType string `json:"test_type" gorm:"type:enum('placement','progress','review');not null;comment:测试类型"` Level string `json:"level" gorm:"type:enum('beginner','intermediate','advanced');comment:测试级别"` TotalWords int `json:"total_words" gorm:"type:int;not null;comment:总词汇数"` CorrectWords int `json:"correct_words" gorm:"type:int;default:0;comment:正确词汇数"` Score float64 `json:"score" gorm:"type:decimal(5,2);comment:得分"` Duration int `json:"duration" gorm:"type:int;comment:测试时长(秒)"` 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"` } // TableName 指定表名 func (VocabularyCategory) TableName() string { return "ai_vocabulary_categories" } func (Vocabulary) TableName() string { return "ai_vocabulary" } func (VocabularyDefinition) TableName() string { return "ai_vocabulary_definitions" } func (VocabularyExample) TableName() string { return "ai_vocabulary_examples" } func (VocabularyImage) TableName() string { return "ai_vocabulary_images" } func (VocabularyCategoryRelation) TableName() string { return "ai_vocabulary_category_relations" } func (UserVocabularyProgress) TableName() string { return "ai_user_vocabulary_progress" } func (VocabularyTest) TableName() string { return "ai_vocabulary_tests" } // VocabularyBook 词汇书模型 type VocabularyBook struct { ID string `json:"id" gorm:"type:varchar(36);primaryKey;comment:词汇书ID"` Name string `json:"name" gorm:"type:varchar(200);not null;comment:词汇书名称"` Description *string `json:"description" gorm:"type:text;comment:词汇书描述"` Category string `json:"category" gorm:"type:varchar(100);not null;comment:分类"` Level string `json:"level" gorm:"type:enum('beginner','elementary','intermediate','advanced','expert');not null;comment:难度级别"` TotalWords int `json:"total_words" gorm:"type:int;default:0;comment:总单词数"` CoverImage *string `json:"cover_image" gorm:"type:varchar(500);comment:封面图片URL"` Icon *string `json:"icon" gorm:"type:varchar(255);comment:图标"` Color *string `json:"color" gorm:"type:varchar(7);comment:主题色"` IsSystem bool `json:"is_system" gorm:"type:boolean;default:true;comment:是否系统词汇书"` IsActive bool `json:"is_active" gorm:"type:boolean;default:true;comment:是否启用"` SortOrder int `json:"sort_order" gorm:"type:int;default:0;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:更新时间"` // 关联关系(不使用外键约束) Words []VocabularyBookWord `json:"words,omitempty" gorm:"-"` } // VocabularyBookWord 词汇书单词关联模型 type VocabularyBookWord struct { ID int64 `json:"id" gorm:"type:bigint;primaryKey;autoIncrement;comment:关联ID"` BookID string `json:"book_id" gorm:"type:varchar(36);not null;index;comment:词汇书ID"` VocabularyID string `json:"vocabulary_id" gorm:"type:varchar(36);not null;index;comment:词汇ID"` SortOrder int `json:"sort_order" gorm:"type:int;default:0;comment:排序"` CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间"` // 关联关系(不使用外键约束) Book VocabularyBook `json:"-" gorm:"-"` Vocabulary *Vocabulary `json:"word,omitempty" gorm:"-"` } func (VocabularyBook) TableName() string { return "ai_vocabulary_books" } func (VocabularyBookWord) TableName() string { return "ai_vocabulary_book_words" } func (UserWordProgress) TableName() string { return "ai_user_word_progress" } // LearningSession 学习会话模型 type LearningSession struct { ID int64 `json:"id" gorm:"type:bigint;primaryKey;autoIncrement;comment:会话ID"` UserID int64 `json:"user_id" gorm:"type:bigint;not null;index;comment:用户ID"` BookID string `json:"book_id" gorm:"type:varchar(36);not null;index;comment:词汇书ID"` DailyGoal int `json:"daily_goal" gorm:"type:int;default:20;comment:每日学习目标"` NewWordsCount int `json:"new_words_count" gorm:"type:int;default:0;comment:新学单词数"` ReviewCount int `json:"review_count" gorm:"type:int;default:0;comment:复习单词数"` MasteredCount int `json:"mastered_count" gorm:"type:int;default:0;comment:掌握单词数"` StartedAt time.Time `json:"started_at" gorm:"type: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:更新时间"` } func (LearningSession) TableName() string { return "ai_learning_sessions" } // UserVocabularyBookProgress 用户词汇书学习进度 type UserVocabularyBookProgress struct { ID int64 `gorm:"primaryKey;autoIncrement" json:"id"` UserID int64 `gorm:"not null;index:idx_user_book" json:"user_id"` BookID string `gorm:"type:varchar(36);not null;index:idx_user_book" json:"book_id"` LearnedWords int `gorm:"default:0" json:"learned_words"` MasteredWords int `gorm:"default:0" json:"mastered_words"` ProgressPercentage float64 `gorm:"type:decimal(5,2);default:0.00" json:"progress_percentage"` StreakDays int `gorm:"default:0" json:"streak_days"` TotalStudyDays int `gorm:"default:0" json:"total_study_days"` AverageDailyWords float64 `gorm:"type:decimal(5,2);default:0.00" json:"average_daily_words"` EstimatedCompletionDate *time.Time `json:"estimated_completion_date"` IsCompleted bool `gorm:"default:false" json:"is_completed"` CompletedAt *time.Time `json:"completed_at"` StartedAt time.Time `gorm:"not null" json:"started_at"` LastStudiedAt time.Time `json:"last_studied_at"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` } func (UserVocabularyBookProgress) TableName() string { return "user_vocabulary_book_progress" }