99 lines
2.5 KiB
Go
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()
|
|
}
|