71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
package system
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"git.echol.cn/loser/Go-Web-Template/server/global"
|
|
sysModel "git.echol.cn/loser/Go-Web-Template/server/model/system"
|
|
systemReq "git.echol.cn/loser/Go-Web-Template/server/model/system/request"
|
|
"git.echol.cn/loser/Go-Web-Template/server/utils"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type PublicRegisterService struct{}
|
|
|
|
var PublicRegisterServiceApp = new(PublicRegisterService)
|
|
|
|
func (s *PublicRegisterService) Register(_ *gin.Context, req systemReq.PublicRegister, mode RegisterMode) error {
|
|
username := strings.TrimSpace(req.Username)
|
|
password := req.Password
|
|
welcome := strings.TrimSpace(req.WelcomePhrase)
|
|
|
|
if username == "" || password == "" || welcome == "" {
|
|
return errors.New("参数不完整")
|
|
}
|
|
if len(welcome) > 255 {
|
|
return errors.New("欢迎词过长")
|
|
}
|
|
|
|
if mode == RegisterModeInvite && strings.TrimSpace(req.InviteCode) == "" {
|
|
return errors.New("邀请码不能为空")
|
|
}
|
|
|
|
return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
|
|
// 用户名唯一校验
|
|
var existed sysModel.SysUser
|
|
if err := tx.Where("username = ?", username).First(&existed).Error; err == nil {
|
|
return errors.New("用户名已注册")
|
|
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return err
|
|
}
|
|
|
|
user := sysModel.SysUser{
|
|
UUID: uuid.New(),
|
|
Username: username,
|
|
Password: utils.BcryptHash(password),
|
|
NickName: username,
|
|
WelcomePhrase: welcome,
|
|
AuthorityId: 9528, // 用户已选择:注册用户默认绑定现有 9528 角色
|
|
Enable: 1,
|
|
}
|
|
if err := tx.Create(&user).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
if mode == RegisterModeInvite {
|
|
if _, err := InviteCodeServiceApp.ConsumeByPlainCode(tx, req.InviteCode, user.ID); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Authorities 关联:保持与原系统一致,给用户绑定其 AuthorityId 对应角色
|
|
if err := tx.Model(&user).Association("Authorities").Replace([]sysModel.SysAuthority{{AuthorityId: user.AuthorityId}}); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
}
|