Files
Go-Web-Template/server/service/system/public_register.go
2026-04-23 15:29:07 +08:00

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
})
}