package account import ( model3 "SciencesServer/app/api/enterprise/model" model2 "SciencesServer/app/common/model" "SciencesServer/app/handle" "SciencesServer/serve/orm" "SciencesServer/utils" "errors" "gorm.io/gorm" ) type Register struct{ local string } type RegisterHandle func(local string) *Register type ( RegisterParams struct { Name, Mobile, Captcha, Password, RepeatPass string } ) func (c *RegisterParams) checkPassword() bool { return c.Password == c.RepeatPass } func (c *RegisterParams) checkCaptcha() (bool, error) { return handle.NewCaptcha().Validate(&handle.CaptchaSms{Captcha: c.Captcha, Mobile: c.Mobile}) } func (c *RegisterParams) checkUserExist(mUserInstance *model2.UserInstance, local string) (bool, error) { var count int64 if err := model2.Count(mUserInstance, &count, model2.NewWhere("mobile", c.Mobile)); //model2.NewWhere("local", local) err != nil { return false, err } return count <= 0, nil } // Launch 发起注册 func (c *Register) Launch(params *RegisterParams) (*InstanceLoginReturn, error) { // 验证密码 if !params.checkPassword() { return nil, errors.New("两次密码不一致") } // 验证验证码 pass, err := params.checkCaptcha() if err != nil { return nil, err } else if !pass { return nil, errors.New("验证码错误或已过期") } // 验证账号信息 mUserInstance := model3.NewUserInstance() if pass, err = params.checkUserExist(mUserInstance.UserInstance, c.local); err != nil { return nil, err } else if !pass { return nil, errors.New("当前手机号码已注册") } if params.Name == "" { params.Name = params.Mobile } mUserInstance.Source = model2.UserInstanceSourceForLocal mUserInstance.Password = utils.GetRandomString(12) mUserInstance.Mobile = params.Mobile mUserInstance.Name = params.Name mUserInstance.Password = params.Password if err = orm.GetDB().Transaction(func(tx *gorm.DB) error { if err = model2.Create(mUserInstance.UserInstance, tx); err != nil { return err } return nil }); err != nil { return nil, err } return NewInstance()().Login()(&InstanceLoginParams{ UID: mUserInstance.UUID, Name: mUserInstance.Name, Mobile: mUserInstance.Mobile, Identity: mUserInstance.Identity, }), err } func NewRegister() RegisterHandle { return func(local string) *Register { return &Register{local: local} } }