cockpit-source/backend/internal/seed/seed.go
2026-04-02 14:12:43 +08:00

111 lines
2.9 KiB
Go

package seed
import (
"time"
"cockpit/internal/domain"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
func MustSeed(db *gorm.DB) {
if err := db.AutoMigrate(
&domain.User{},
&domain.Role{},
&domain.Permission{},
&domain.UserRole{},
&domain.RolePermission{},
&domain.RefreshToken{},
&domain.Customer{},
&domain.Status{},
&domain.Order{},
&domain.ImportJob{},
&domain.ImportJobError{},
); err != nil {
panic(err)
}
seedPermissions(db)
seedAdmin(db)
seedDefaultStatuses(db)
}
func seedPermissions(db *gorm.DB) {
perms := []domain.Permission{
{Code: "overview:view", Name: "查看总览", Type: "api"},
{Code: "orders:read", Name: "查看订单", Type: "api"},
{Code: "orders:write", Name: "编辑订单", Type: "api"},
{Code: "import:preview", Name: "导入预览", Type: "api"},
{Code: "import:commit", Name: "导入入库", Type: "api"},
{Code: "dict:read", Name: "查看字典", Type: "api"},
{Code: "dict:write", Name: "维护字典", Type: "api"},
{Code: "admin:*", Name: "系统管理", Type: "api"},
}
for _, p := range perms {
var existing domain.Permission
if err := db.Where("code = ?", p.Code).First(&existing).Error; err == nil {
continue
}
_ = db.Create(&p).Error
}
}
func seedAdmin(db *gorm.DB) {
// role
var adminRole domain.Role
if err := db.Where("name = ?", "admin").First(&adminRole).Error; err != nil {
adminRole = domain.Role{Name: "admin", Description: "系统管理员"}
_ = db.Create(&adminRole).Error
}
// user
var admin domain.User
if err := db.Where("username = ?", "admin").First(&admin).Error; err != nil {
hash, _ := bcrypt.GenerateFromPassword([]byte("admin123"), bcrypt.DefaultCost)
admin = domain.User{
Username: "admin",
PasswordHash: string(hash),
DisplayName: "管理员",
Enabled: true,
LastLoginAt: ptrTime(time.Now()),
}
_ = db.Create(&admin).Error
}
// user_roles
var ur domain.UserRole
if err := db.Where("user_id = ? AND role_id = ?", admin.ID, adminRole.ID).First(&ur).Error; err != nil {
_ = db.Create(&domain.UserRole{UserID: admin.ID, RoleID: adminRole.ID}).Error
}
// role_permissions: grant all existing permissions to admin
var perms []domain.Permission
_ = db.Find(&perms).Error
for _, p := range perms {
var rp domain.RolePermission
if err := db.Where("role_id = ? AND permission_id = ?", adminRole.ID, p.ID).First(&rp).Error; err == nil {
continue
}
_ = db.Create(&domain.RolePermission{RoleID: adminRole.ID, PermissionID: p.ID}).Error
}
}
func seedDefaultStatuses(db *gorm.DB) {
defaults := []domain.Status{
{Name: "未出货", SortOrder: 1, Color: "#ef4444"},
{Name: "部分出货", SortOrder: 2, Color: "#f59e0b"},
{Name: "已出货", SortOrder: 3, Color: "#22c55e"},
}
for _, s := range defaults {
var existing domain.Status
if err := db.Where("name = ?", s.Name).First(&existing).Error; err == nil {
continue
}
_ = db.Create(&s).Error
}
}
func ptrTime(t time.Time) *time.Time { return &t }