146 lines
3.4 KiB
Go
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{},
|
||
|
|
)
|
||
|
|
}
|