init
This commit is contained in:
146
server/cmd/main.go
Normal file
146
server/cmd/main.go
Normal file
@@ -0,0 +1,146 @@
|
||||
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{},
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user