Files
jiu/backend/main.go
T
wangjia 31ea370cea fix(backend): JWT config mapstructure tag 修复 + 模型从 hotel 重构为 shop
- 修复 JWTConfig 缺少 mapstructure tag 导致 access_expire_min 解析为 0,
  token 签发即过期,所有 API 请求返回 401
- 全部 config struct 补齐 mapstructure tag(secret/dsn/hmac_secret 等)
- 模型层从 hotel/HotelID 统一重命名为 shop/ShopID
- 删除旧 migrations(001-004),新增 001_init 综合迁移文件
- 更新 schema.sql、testutil、handler/service/model 相关引用

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 22:20:12 +08:00

104 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"github.com/wangjia/jiu/backend/config"
"github.com/wangjia/jiu/backend/internal/model"
"github.com/wangjia/jiu/backend/internal/router"
)
func main() {
// 加载配置
config.Load()
// 初始化数据库
db := initDB()
// 自动迁移(开发环境用,生产使用 golang-migrate
if config.C.Server.Mode == "debug" {
autoMigrate(db)
}
// 启动 Gin
gin.SetMode(config.C.Server.Mode)
r := gin.New()
r.Use(gin.Logger(), gin.Recovery())
// CORS(开发期间允许所有来源)
r.Use(func(c *gin.Context) {
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
c.Header("Access-Control-Allow-Headers", "Authorization,Content-Type")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
c.Next()
})
router.Setup(r, db)
addr := fmt.Sprintf(":%s", config.C.Server.Port)
log.Printf("Server starting on %s (mode: %s)", addr, config.C.Server.Mode)
if err := r.Run(addr); err != nil {
log.Fatalf("Server failed: %v", err)
}
}
func initDB() *gorm.DB {
dsn := config.C.Database.DSN
if dsn == "" {
log.Fatal("database.dsn is required in config")
}
logLevel := logger.Silent
if config.C.Server.Mode == "debug" {
logLevel = logger.Info
}
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logLevel),
})
if err != nil {
log.Fatalf("failed to connect database: %v", err)
}
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
return db
}
func autoMigrate(db *gorm.DB) {
err := db.AutoMigrate(
&model.Shop{},
&model.User{},
&model.License{},
&model.ProductCategory{},
&model.Product{},
&model.Warehouse{},
&model.Partner{},
&model.StockInOrder{},
&model.StockInItem{},
&model.StockOutOrder{},
&model.StockOutItem{},
&model.Inventory{},
&model.InventoryLog{},
&model.InventoryCheck{},
&model.InventoryCheckItem{},
&model.FinanceRecord{},
&model.NumberRule{},
)
if err != nil {
log.Fatalf("auto migrate failed: %v", err)
}
log.Println("AutoMigrate completed")
}