Files
ai_dianshang/server/cmd/main.go
2025-11-17 14:11:46 +08:00

146 lines
3.4 KiB
Go

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{},
)
}