84 lines
2.6 KiB
Go
84 lines
2.6 KiB
Go
|
|
// main.go
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"log"
|
||
|
|
|
||
|
|
"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/api"
|
||
|
|
"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/config"
|
||
|
|
"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/database"
|
||
|
|
"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/logger"
|
||
|
|
)
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
// 加载配置
|
||
|
|
config.LoadConfig()
|
||
|
|
if config.GlobalConfig == nil {
|
||
|
|
log.Fatal("Failed to load configuration")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 初始化日志系统
|
||
|
|
loggerConfig := logger.LogConfig{
|
||
|
|
Level: config.GlobalConfig.Log.Level,
|
||
|
|
Format: config.GlobalConfig.Log.Format,
|
||
|
|
Output: config.GlobalConfig.Log.Output,
|
||
|
|
FilePath: config.GlobalConfig.Log.FilePath,
|
||
|
|
MaxSize: config.GlobalConfig.Log.MaxSize,
|
||
|
|
MaxBackups: config.GlobalConfig.Log.MaxBackups,
|
||
|
|
MaxAge: config.GlobalConfig.Log.MaxAge,
|
||
|
|
Compress: config.GlobalConfig.Log.Compress,
|
||
|
|
}
|
||
|
|
logger.InitLogger(loggerConfig)
|
||
|
|
|
||
|
|
// 初始化数据库
|
||
|
|
database.InitDatabase()
|
||
|
|
defer database.CloseDatabase()
|
||
|
|
|
||
|
|
// 检查是否为生产环境
|
||
|
|
isProduction := config.GlobalConfig.App.Environment == "production"
|
||
|
|
|
||
|
|
// 生产环境下跳过数据库迁移和初始化操作
|
||
|
|
if !isProduction {
|
||
|
|
// 执行合并后的SQL以创建视图/触发器/扩展表(若尚未存在)
|
||
|
|
if err := database.ApplyMergedSchemaIfNeeded(database.GetDB()); err != nil {
|
||
|
|
log.Printf("Warning: Failed to apply merged schema: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 运行数据库迁移
|
||
|
|
if err := database.AutoMigrate(database.GetDB()); err != nil {
|
||
|
|
log.Fatalf("Failed to migrate database: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 创建索引
|
||
|
|
if err := database.CreateIndexes(database.GetDB()); err != nil {
|
||
|
|
log.Printf("Warning: Failed to create indexes: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 初始化种子数据
|
||
|
|
if err := database.SeedData(database.GetDB()); err != nil {
|
||
|
|
log.Printf("Warning: Failed to seed data: %v", err)
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
log.Println("Production environment detected, skipping database migration and initialization")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 记录启动信息
|
||
|
|
logger.WithFields(map[string]interface{}{
|
||
|
|
"app_name": config.GlobalConfig.App.Name,
|
||
|
|
"app_version": config.GlobalConfig.App.Version,
|
||
|
|
"environment": config.GlobalConfig.App.Environment,
|
||
|
|
"port": config.GlobalConfig.Server.Port,
|
||
|
|
}).Info("Starting AI English Learning Server")
|
||
|
|
|
||
|
|
// 从 api 包获取配置好的路由引擎
|
||
|
|
router := api.SetupRouter()
|
||
|
|
|
||
|
|
// 启动服务
|
||
|
|
port := fmt.Sprintf(":%s", config.GlobalConfig.Server.Port)
|
||
|
|
logger.Infof("Server is running on port %s", config.GlobalConfig.Server.Port)
|
||
|
|
if err := router.Run(port); err != nil {
|
||
|
|
logger.Fatalf("Failed to start server: %v", err)
|
||
|
|
}
|
||
|
|
}
|