package database import ( "log" "time" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/models" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/utils" "gorm.io/gorm" ) // stringPtr 返回字符串指针 func stringPtr(s string) *string { return &s } // SeedData 初始化种子数据 func SeedData(db *gorm.DB) error { log.Println("开始初始化种子数据...") // 检查是否已有数据 var userCount int64 db.Model(&models.User{}).Count(&userCount) if userCount > 0 { log.Println("数据库已有数据,跳过种子数据初始化") return nil } // 创建词汇分类 if err := createVocabularyCategories(db); err != nil { return err } // 创建示例词汇 if err := createSampleVocabularies(db); err != nil { return err } // 创建测试用户 if err := createTestUsers(db); err != nil { return err } // 创建听力材料 if err := createListeningMaterials(db); err != nil { return err } // 创建阅读材料 if err := createReadingMaterials(db); err != nil { return err } // 创建写作提示 if err := createWritingPrompts(db); err != nil { return err } // 创建口语场景 if err := createSpeakingScenarios(db); err != nil { return err } log.Println("种子数据初始化完成") return nil } // createVocabularyCategories 创建词汇分类 func createVocabularyCategories(db *gorm.DB) error { categories := []models.VocabularyCategory{ { ID: utils.GenerateUUID(), Name: "日常生活", Description: stringPtr("日常生活中常用的词汇"), Level: "beginner", IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Name: "商务英语", Description: stringPtr("商务场景中使用的专业词汇"), Level: "intermediate", IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Name: "学术英语", Description: stringPtr("学术研究和论文写作中的词汇"), Level: "advanced", IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Name: "旅游英语", Description: stringPtr("旅游出行相关的实用词汇"), Level: "beginner", IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Name: "科技英语", Description: stringPtr("科技和互联网相关词汇"), Level: "intermediate", IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, } for _, category := range categories { if err := db.Create(&category).Error; err != nil { return err } } log.Println("词汇分类创建完成") return nil } // createSampleVocabularies 创建示例词汇 func createSampleVocabularies(db *gorm.DB) error { // 获取第一个分类ID var category models.VocabularyCategory if err := db.First(&category).Error; err != nil { return err } vocabularies := []struct { Word string Phonetic string Level string Frequency int Definitions []models.VocabularyDefinition Examples []models.VocabularyExample }{ { Word: "hello", Phonetic: "/həˈloʊ/", Level: "beginner", Frequency: 100, Definitions: []models.VocabularyDefinition{ { PartOfSpeech: "interjection", Definition: "used as a greeting or to begin a phone conversation", Translation: "你好", SortOrder: 0, CreatedAt: time.Now(), }, }, Examples: []models.VocabularyExample{ { Example: "Hello, how are you?", Translation: "你好,你好吗?", SortOrder: 0, CreatedAt: time.Now(), }, }, }, { Word: "world", Phonetic: "/wɜːrld/", Level: "beginner", Frequency: 95, Definitions: []models.VocabularyDefinition{ { PartOfSpeech: "noun", Definition: "the earth, together with all of its countries and peoples", Translation: "世界", SortOrder: 0, CreatedAt: time.Now(), }, }, Examples: []models.VocabularyExample{ { Example: "The world is a beautiful place.", Translation: "世界是一个美丽的地方。", SortOrder: 0, CreatedAt: time.Now(), }, }, }, { Word: "learn", Phonetic: "/lɜːrn/", Level: "beginner", Frequency: 90, Definitions: []models.VocabularyDefinition{ { PartOfSpeech: "verb", Definition: "acquire knowledge of or skill in something", Translation: "学习", SortOrder: 0, CreatedAt: time.Now(), }, }, Examples: []models.VocabularyExample{ { Example: "I want to learn English.", Translation: "我想学习英语。", SortOrder: 0, CreatedAt: time.Now(), }, }, }, { Word: "study", Phonetic: "/ˈstʌdi/", Level: "beginner", Frequency: 85, Definitions: []models.VocabularyDefinition{ { PartOfSpeech: "verb", Definition: "devote time and attention to acquiring knowledge", Translation: "学习,研究", SortOrder: 0, CreatedAt: time.Now(), }, }, Examples: []models.VocabularyExample{ { Example: "She studies hard every day.", Translation: "她每天都努力学习。", SortOrder: 0, CreatedAt: time.Now(), }, }, }, { Word: "practice", Phonetic: "/ˈpræktɪs/", Level: "intermediate", Frequency: 80, Definitions: []models.VocabularyDefinition{ { PartOfSpeech: "verb", Definition: "perform an activity repeatedly to improve one's skill", Translation: "练习", SortOrder: 0, CreatedAt: time.Now(), }, }, Examples: []models.VocabularyExample{ { Example: "Practice makes perfect.", Translation: "熟能生巧。", SortOrder: 0, CreatedAt: time.Now(), }, }, }, } for _, vocabData := range vocabularies { // 检查词汇是否已存在 var existingVocab models.Vocabulary if err := db.Where("word = ?", vocabData.Word).First(&existingVocab).Error; err == nil { // 词汇已存在,跳过 log.Printf("词汇 '%s' 已存在,跳过创建", vocabData.Word) continue } // 创建词汇 vocab := models.Vocabulary{ Word: vocabData.Word, Phonetic: &vocabData.Phonetic, Level: vocabData.Level, Frequency: vocabData.Frequency, IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), } if err := db.Create(&vocab).Error; err != nil { return err } // 关联分类 if err := db.Model(&vocab).Association("Categories").Append(&category); err != nil { return err } // 创建定义 for _, def := range vocabData.Definitions { def.VocabularyID = vocab.ID if err := db.Create(&def).Error; err != nil { return err } } // 创建例句 for _, example := range vocabData.Examples { example.VocabularyID = vocab.ID if err := db.Create(&example).Error; err != nil { return err } } } log.Println("示例词汇创建完成") return nil } // createTestUsers 创建测试用户 func createTestUsers(db *gorm.DB) error { users := []models.User{ { ID: 0, // 让数据库自动生成 Username: "testuser", Email: "test@example.com", PasswordHash: "$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi", // password Nickname: stringPtr("测试用户"), Avatar: stringPtr("https://via.placeholder.com/150"), Gender: stringPtr("other"), BirthDate: nil, Location: stringPtr("北京"), Bio: stringPtr("这是一个测试用户"), EmailVerified: true, Status: "active", CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: 0, // 让数据库自动生成 Username: "demo", Email: "demo@example.com", PasswordHash: "$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi", // password Nickname: stringPtr("演示用户"), Avatar: stringPtr("https://via.placeholder.com/150"), Gender: stringPtr("other"), BirthDate: nil, Location: stringPtr("上海"), Bio: stringPtr("这是一个演示用户"), EmailVerified: true, Status: "active", CreatedAt: time.Now(), UpdatedAt: time.Now(), }, } for _, user := range users { if err := db.Create(&user).Error; err != nil { return err } // 创建用户偏好设置 preference := models.UserPreference{ ID: 0, // 让数据库自动生成 UserID: user.ID, DailyGoal: 30, WeeklyGoal: 210, ReminderEnabled: true, ReminderTime: stringPtr("09:00:00"), DifficultyLevel: "intermediate", LearningMode: "casual", PreferredTopics: stringPtr("[\"vocabulary\", \"listening\"]"), NotificationSettings: stringPtr("{\"email\": true, \"push\": true}"), PrivacySettings: stringPtr("{\"profile_public\": false}"), CreatedAt: time.Now(), UpdatedAt: time.Now(), } if err := db.Create(&preference).Error; err != nil { return err } } log.Println("测试用户创建完成") return nil } // createListeningMaterials 创建听力材料 func createListeningMaterials(db *gorm.DB) error { materials := []models.ListeningMaterial{ { ID: utils.GenerateUUID(), Title: "Daily Conversation", Description: stringPtr("Basic daily conversation practice"), Level: "beginner", Duration: 180, // 3 minutes AudioURL: "https://example.com/audio/daily-conversation.mp3", Transcript: stringPtr("A: Hello, how are you today? B: I'm fine, thank you. How about you?"), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Title: "Business Meeting", Description: stringPtr("Business meeting discussion"), Level: "intermediate", Duration: 300, // 5 minutes AudioURL: "https://example.com/audio/business-meeting.mp3", Transcript: stringPtr("Let's discuss the quarterly report and our future plans."), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, } for _, material := range materials { if err := db.Create(&material).Error; err != nil { return err } } log.Println("听力材料创建完成") return nil } // intPtr 返回整数指针 func intPtr(i int) *int { return &i } // createReadingMaterials 创建阅读材料 func createReadingMaterials(db *gorm.DB) error { materials := []models.ReadingMaterial{ { ID: utils.GenerateUUID(), Title: "The Benefits of Reading", Content: "Reading is one of the most beneficial activities for the human mind. It improves vocabulary, enhances critical thinking, and provides entertainment.", Level: "beginner", WordCount: 25, Summary: stringPtr("这是一篇关于阅读益处的文章"), Source: stringPtr("Education Weekly"), Author: stringPtr("Reading Expert"), Tags: stringPtr("[\"reading\", \"education\"]"), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Title: "Climate Change and Technology", Content: "Climate change represents one of the most pressing challenges of our time. Technology plays a crucial role in both contributing to and solving environmental problems.", Level: "intermediate", WordCount: 30, Summary: stringPtr("这是一篇关于气候变化与科技的文章"), Source: stringPtr("Science Today"), Author: stringPtr("Climate Researcher"), Tags: stringPtr("[\"climate\", \"technology\"]"), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, } for _, material := range materials { if err := db.Create(&material).Error; err != nil { return err } } log.Println("阅读材料创建完成") return nil } // createWritingPrompts 创建写作提示 func createWritingPrompts(db *gorm.DB) error { prompts := []models.WritingPrompt{ { ID: utils.GenerateUUID(), Title: "My Daily Routine", Prompt: "Describe your daily routine from morning to evening. Include what you do, when you do it, and why.", Level: "beginner", MinWords: intPtr(100), MaxWords: intPtr(200), TimeLimit: intPtr(1800), // 30 minutes Instructions: stringPtr("Write a clear and descriptive essay"), Tags: stringPtr("[\"daily\", \"routine\"]"), SampleAnswer: stringPtr("Every morning, I wake up at 7 AM and start my day..."), Rubric: stringPtr("{\"grammar\": 25, \"vocabulary\": 25, \"coherence\": 25, \"content\": 25}"), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Title: "The Impact of Social Media", Prompt: "Discuss the positive and negative impacts of social media on modern society. Provide specific examples and your personal opinion.", Level: "intermediate", MinWords: intPtr(250), MaxWords: intPtr(400), TimeLimit: intPtr(2700), // 45 minutes Instructions: stringPtr("Write a balanced argumentative essay"), Tags: stringPtr("[\"social media\", \"society\"]"), SampleAnswer: stringPtr("Social media has transformed how we communicate..."), Rubric: stringPtr("{\"grammar\": 30, \"vocabulary\": 20, \"coherence\": 25, \"content\": 25}"), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, } for _, prompt := range prompts { if err := db.Create(&prompt).Error; err != nil { return err } } log.Println("写作提示创建完成") return nil } // createSpeakingScenarios 创建口语场景 func createSpeakingScenarios(db *gorm.DB) error { scenarios := []models.SpeakingScenario{ { ID: utils.GenerateUUID(), Title: "Restaurant Ordering", Description: "You are at a restaurant and want to order food. The waiter will take your order.", Level: "beginner", Context: stringPtr("You are at a restaurant with friends"), Tags: stringPtr("[\"restaurant\", \"food\"]"), Dialogue: stringPtr("[{\"speaker\": \"waiter\", \"text\": \"Good evening, welcome to our restaurant!\"}]"), KeyPhrases: stringPtr("[\"I'd like to order\", \"Could I have\", \"The bill, please\"]"), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, { ID: utils.GenerateUUID(), Title: "Job Interview", Description: "You are in a job interview for a position you really want. Answer the interviewer's questions confidently.", Level: "intermediate", Context: stringPtr("You are applying for a job"), Tags: stringPtr("[\"interview\", \"job\"]"), Dialogue: stringPtr("[{\"speaker\": \"interviewer\", \"text\": \"Tell me about yourself\"}]"), KeyPhrases: stringPtr("[\"I have experience in\", \"My strengths are\", \"I'm interested in\"]"), IsActive: true, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, } for _, scenario := range scenarios { if err := db.Create(&scenario).Error; err != nil { return err } } log.Println("口语场景创建完成") return nil }