Files
ai_english/serve/internal/database/seed.go
2025-11-17 13:39:05 +08:00

553 lines
16 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}