90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
package mysql
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/google/uuid"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"myschools.me/heritage/heritage-api/model"
|
|
)
|
|
|
|
func Bootstrap() {
|
|
if os.Getenv("MYSQL_INIT") != "true" {
|
|
return
|
|
}
|
|
|
|
db, err := newDB()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err := db.AutoMigrate(&model.Role{}, &model.Permission{}, &model.User{}); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var roleCount int64
|
|
if err := db.Model(&model.Role{}).Count(&roleCount).Error; err != nil {
|
|
panic(err)
|
|
}
|
|
var permissionCount int64
|
|
if err := db.Model(&model.Permission{}).Count(&permissionCount).Error; err != nil {
|
|
panic(err)
|
|
}
|
|
var userCount int64
|
|
if err := db.Model(&model.User{}).Count(&userCount).Error; err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var defaultRole model.Role
|
|
if roleCount == 0 {
|
|
defaultRole = model.Role{
|
|
ID: newID(),
|
|
Code: "admin",
|
|
Name: "管理员",
|
|
}
|
|
if err := db.Create(&defaultRole).Error; err != nil {
|
|
panic(err)
|
|
}
|
|
} else {
|
|
if err := db.Where("code = ?", "admin").First(&defaultRole).Error; err != nil {
|
|
if err := db.First(&defaultRole).Error; err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
if permissionCount == 0 {
|
|
p := model.Permission{
|
|
ID: newID(),
|
|
RoleID: defaultRole.ID,
|
|
Code: "*",
|
|
Name: "全部权限",
|
|
}
|
|
if err := db.Create(&p).Error; err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
if userCount == 0 {
|
|
defaultPwd := "admin"
|
|
h, err := bcrypt.GenerateFromPassword([]byte(defaultPwd), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
u := model.User{
|
|
ID: newID(),
|
|
UserName: "admin",
|
|
PasswordHash: string(h),
|
|
RoleID: defaultRole.ID,
|
|
}
|
|
if err := db.Create(&u).Error; err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func newID() string {
|
|
id := uuid.Must(uuid.NewV7()).String()
|
|
return strings.ReplaceAll(id, "-", "")
|
|
}
|