553 lines
16 KiB
Go
553 lines
16 KiB
Go
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
|
||
} |