111 lines
2.9 KiB
Go
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 }
|
|
|