package main import ( "dianshang/internal/config" "dianshang/internal/model" "dianshang/internal/router" "dianshang/pkg/jwt" "dianshang/pkg/logger" "fmt" "log" "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" gormlogger "gorm.io/gorm/logger" ) func main() { // 加载配置 cfg := config.Load() // 初始化日志 logConfig := logger.LogConfig{ Level: cfg.Log.Level, Filename: cfg.Log.Filename, MaxSize: cfg.Log.MaxSize, MaxAge: cfg.Log.MaxAge, MaxBackups: cfg.Log.MaxBackups, EnableConsole: cfg.Log.EnableConsole, EnableFile: cfg.Log.EnableFile, Format: cfg.Log.Format, EnableCaller: cfg.Log.EnableCaller, EnableOperation: cfg.Log.EnableOperation, EnablePerf: cfg.Log.EnablePerf, PerfThreshold: cfg.Log.PerfThreshold, } logger.Init(logConfig) // 初始化JWT jwt.Init(cfg.JWT) // 初始化数据库 db := initDB(cfg.Database) // 根据配置决定是否自动迁移数据库表 if cfg.Database.AutoMigrate { logger.Info("开始数据库自动迁移...") if err := autoMigrate(db); err != nil { logger.Warn("数据库迁移警告: " + err.Error()) // 继续启动服务,忽略外键约束错误 } else { logger.Info("数据库迁移完成") } } else { logger.Info("数据库自动迁移已禁用(生产环境)") } // 设置Gin模式 gin.SetMode(cfg.Server.Mode) // 初始化路由 r := router.Setup(db, cfg) // 启动服务器 addr := fmt.Sprintf(":%d", cfg.Server.Port) logger.Info("服务器启动在端口: %d", cfg.Server.Port) if err := r.Run(addr); err != nil { log.Fatalf("服务器启动失败: %v", err) } } // initDB 初始化数据库连接 func initDB(cfg config.DatabaseConfig) *gorm.DB { dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%t&loc=%s", cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.DBName, cfg.Charset, cfg.ParseTime, cfg.Loc, ) log.Printf("🔗 [数据库连接] DSN: %s:***@tcp(%s:%d)/%s", cfg.Username, cfg.Host, cfg.Port, cfg.DBName) // 根据配置设置GORM日志级别 var logLevel gormlogger.LogLevel switch cfg.LogLevel { case "silent": logLevel = gormlogger.Silent case "error": logLevel = gormlogger.Error case "warn": logLevel = gormlogger.Warn case "info": logLevel = gormlogger.Info default: logLevel = gormlogger.Warn } log.Printf("🔧 [GORM配置] 日志级别: %s", cfg.LogLevel) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: gormlogger.Default.LogMode(logLevel), }) if err != nil { log.Fatalf("数据库连接失败: %v", err) } // 测试数据库连接并显示当前数据库信息 var dbName string db.Raw("SELECT DATABASE()").Scan(&dbName) log.Printf("✅ [数据库连接] 成功连接到数据库: %s", dbName) logger.Info("数据库连接成功") return db } // autoMigrate 自动迁移数据库表 func autoMigrate(db *gorm.DB) error { return db.AutoMigrate( &model.User{}, &model.UserAddress{}, &model.Category{}, &model.Product{}, &model.ProductSpec{}, &model.ProductImage{}, &model.Cart{}, &model.Order{}, &model.OrderItem{}, &model.Coupon{}, &model.UserCoupon{}, &model.ProductReview{}, &model.UserFavorite{}, &model.SystemLog{}, &model.SystemConfig{}, &model.Notification{}, &model.FileUpload{}, &model.AdminUser{}, &model.AdminRole{}, &model.OperationLog{}, &model.DataStatistics{}, ) }