test/backend/internal/database/database.go
2025-11-21 16:03:52 +08:00

99 lines
2.5 KiB
Go

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()
}