package database import ( "fmt" "log" "os" "path/filepath" "sync" "github.com/glebarez/sqlite" "gorm.io/gorm" "soda-api/backend/internal/models" ) var ( db *gorm.DB once sync.Once ) func GetDB() *gorm.DB { if db == nil { log.Fatal("database not initialized") } return db } func InitDB() { once.Do(func() { if err := os.MkdirAll("data", 0o755); err != nil { log.Fatalf("failed to create data dir: %v", err) } dbPath := filepath.Join("data", "coffee_mall.db") conn, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) if err != nil { log.Fatalf("failed to open database: %v", err) } if err := conn.AutoMigrate( &models.User{}, &models.Product{}, &models.Order{}, &models.Member{}, &models.PointTransaction{}, &models.Ticket{}, ); err != nil { log.Fatalf("auto migrate failed: %v", err) } seed(conn) db = conn }) } func seed(conn *gorm.DB) { var count int64 conn.Model(&models.User{}).Count(&count) if count == 0 { demo := models.User{Username: "demo", Role: "admin"} demo.PasswordHash = "$2a$10$XolaU8xmPKzW0fvkYlEY/.0z6zJGa16q5j6XSxFX5GZDL8apALgxC" // demo123 if err := conn.Create(&demo).Error; err != nil { log.Printf("seed user failed: %v", err) } } conn.Model(&models.Product{}).Count(&count) if count == 0 { products := []models.Product{ {Name: "旗舰商用咖啡机 X1", Category: "全自动", Description: "双锅炉、触控屏、适合大型连锁", Price: 29999, Inventory: 10, ImageURL: "/images/x1.png"}, {Name: "智能胶囊咖啡机 C2", Category: "胶囊", Description: "智能联网、支持积分兑换", Price: 8999, Inventory: 25, ImageURL: "/images/c2.png"}, {Name: "经典意式咖啡机 M5", Category: "半自动", Description: "配备专业蒸汽棒", Price: 15999, Inventory: 15, ImageURL: "/images/m5.png"}, } if err := conn.Create(&products).Error; err != nil { log.Printf("seed products failed: %v", err) } } conn.Model(&models.Member{}).Count(&count) if count == 0 { members := []models.Member{ {Name: "星咖科技", Email: "contact@starcoffee.cn", Phone: "13800001111", Tier: "VIP", Points: 5200}, {Name: "啡享连锁", Email: "sales@coffeeplus.com", Phone: "13900002222", Tier: "Gold", Points: 3200}, } if err := conn.Create(&members).Error; err != nil { log.Printf("seed members failed: %v", err) } } } func Close() { if db == nil { return } sqlDB, err := db.DB() if err != nil { fmt.Printf("close db err: %v\n", err) return } sqlDB.Close() }