diff --git a/acquaintances/acquaintances b/acquaintances/acquaintances index 8e8b2f2..c5e2bff 100644 Binary files a/acquaintances/acquaintances and b/acquaintances/acquaintances differ diff --git a/acquaintances/biz/dal/mysql/user.go b/acquaintances/biz/dal/mysql/user.go index 1db483d..696ca48 100644 --- a/acquaintances/biz/dal/mysql/user.go +++ b/acquaintances/biz/dal/mysql/user.go @@ -3,16 +3,39 @@ package mysql import ( "acquaintances/biz/model" "acquaintances/biz/model/user" + "acquaintances/biz/utils" "encoding/base64" "errors" "fmt" "golang.org/x/crypto/scrypt" "gorm.io/gorm" + "log" "time" "github.com/cloudwego/hertz/pkg/common/hlog" ) +// CheckPhone 校验手机号是否已存在于系统中 +// 参数:phone 待检查的手机号 +// 返回:存在返回true,不存在返回false;如果发生错误则返回错误信息 +func CheckPhone(phone string) (bool, error) { + // 先简单验证手机号格式,避免无效查询 + if !utils.IsValidPhone(phone) { + return false, fmt.Errorf("无效的手机号格式: %s", phone) + } + + var count int64 + // 只查询记录数,不需要返回完整用户信息,提高性能 + result := DB.Model(&model.User{}).Where("mobile = ?", phone).Count(&count) + if result.Error != nil { + // 记录错误日志,方便排查问题 + log.Printf("检查手机号存在性失败: %v, 手机号: %s", result.Error, phone) + return false, fmt.Errorf("查询用户信息失败: %w", result.Error) + } + + return count > 0, nil +} + func CreateUser(users []*model.User) error { errTransaction := DB.Transaction(func(tx *gorm.DB) error { //创建用户信息表记录 diff --git a/acquaintances/biz/handler/user/user_service.go b/acquaintances/biz/handler/user/user_service.go index 627a769..9eebab8 100644 --- a/acquaintances/biz/handler/user/user_service.go +++ b/acquaintances/biz/handler/user/user_service.go @@ -8,10 +8,14 @@ import ( user "acquaintances/biz/model/user" "acquaintances/biz/utils" "context" + "fmt" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/common/hlog" "github.com/cloudwego/hertz/pkg/protocol/consts" + "log" + "regexp" "strconv" + "time" ) // UpdateUser . @@ -181,3 +185,178 @@ func LoginUser(ctx context.Context, c *app.RequestContext) { resp.UserInfo = resData c.JSON(consts.StatusOK, resp) } + +// SmsUser 处理用户短信请求(注册、登录等场景的验证码发送) +// @router /v1/user/sms/ [POST] +func SmsUser(ctx context.Context, c *app.RequestContext) { + var err error + var req user.SmsRequest + err = c.BindAndValidate(&req) + if err != nil { + c.String(consts.StatusBadRequest, err.Error()) + return + } + + // 验证手机号格式 + if !utils.IsValidPhone(req.Phone) { + c.String(consts.StatusBadRequest, "无效的手机号格式") + return + } + + // 生成6位数字验证码 + code := utils.GenerateVerificationCode() + + // 根据短信类型处理不同业务逻辑 + var message string + switch req.Type { + case model.SmsRegister: + // 注册场景:检查手机号是否已注册 + exists, err := mysql.CheckPhone(req.Phone) + if err != nil { + c.String(consts.StatusInternalServerError, "查询用户信息失败") + return + } + if exists { + c.String(consts.StatusBadRequest, "该手机号已注册") + return + } + message = fmt.Sprintf("您的注册验证码是:%s,有效期5分钟。", code) + + case model.SmsLongin: + // 登录场景:可以不需要检查手机号是否存在 + message = fmt.Sprintf("您的登录验证码是:%s,有效期5分钟。", code) + + default: + c.String(consts.StatusBadRequest, "不支持的短信类型") + return + } + + // 存储验证码到缓存(如Redis),设置5分钟过期 + err = storeVerificationCode(req.Phone, req.Type, code, 5*time.Minute) + if err != nil { + c.String(consts.StatusInternalServerError, "存储验证码失败") + return + } + + // 调用短信发送服务 + err = utils.SendSms(req.Phone, message) + if err != nil { + // 发送失败时删除已存储的验证码 + deleteVerificationCode(req.Phone, req.Type) + c.String(consts.StatusInternalServerError, "发送短信失败:"+err.Error()) + return + } + + resp := &user.SmsResponse{ + Msg: "验证码已发送", + } + + c.JSON(consts.StatusOK, resp) +} + +func storeVerificationCode(phone, typ, code string, expiration time.Duration) error { + // TODO实现存储验证码到缓存的逻辑 + return nil +} + +func deleteVerificationCode(phone, typ string) error { + // TODO实现删除验证码的逻辑 + return nil +} + +// CheckOtp 校验验证码是否正确 +// @router /v1/user/check_otp/ [POST] +func CheckOtp(ctx context.Context, c *app.RequestContext) { + var err error + var req user.CheckOtpRequest + err = c.BindAndValidate(&req) + if err != nil { + c.String(consts.StatusBadRequest, err.Error()) + return + } + + // 验证手机号格式 + if !utils.IsValidPhone(req.Phone) { + c.String(consts.StatusBadRequest, "无效的手机号格式") + return + } + + // 验证验证码格式(通常是6位数字) + //if !isValidOtp(req.Otp) { + // c.String(consts.StatusBadRequest, "验证码格式不正确") + // return + //} + + // 验证验证码类型 + if !isValidOtpType(req.Type) { + c.String(consts.StatusBadRequest, "不支持的验证码类型") + return + } + + // 从缓存中获取存储的验证码 + //storedOtp, err := getStoredVerificationCode(req.Phone, req.Type) + //if err != nil { + // c.String(consts.StatusInternalServerError, "获取验证码信息失败") + // return + //} + + // 检查验证码是否存在(可能已过期或未发送) + //if storedOtp == "" { + // c.String(consts.StatusBadRequest, "验证码不存在或已过期") + // return + //} + + // 验证验证码是否匹配 + //if req.Otp != storedOtp { + // resp := &user.CheckOtpResponse{ + // Code: consts.StatusBadRequest, + // Msg: "验证码不正确", + // } + // c.JSON(consts.StatusOK, resp) + // return + //} + + // 验证码验证成功后,根据类型执行不同业务逻辑 + switch req.Type { + case model.SmsRegister: + + case model.SmsLongin: + + } + + // 验证成功后删除已使用的验证码,防止重复使用 + err = deleteVerificationCode(req.Phone, req.Type) + if err != nil { + // 这里只记录警告,不影响主流程 + log.Printf("删除验证码失败: %v, 手机号: %s, 类型: %s", err, req.Phone, req.Type) + } + + resp := &user.CheckOtpResponse{ + Msg: "验证码验证成功", + } + + c.JSON(consts.StatusOK, resp) +} + +// 辅助函数:验证验证码格式(6位数字) +func isValidOtp(otp string) bool { + pattern := `^\d{6}$` + return regexp.MustCompile(pattern).MatchString(otp) +} + +// 辅助函数:验证验证码类型是否合法 +func isValidOtpType(typ string) bool { + switch typ { + case model.SmsRegister, model.SmsLongin: + return true + default: + return false + } +} + +// 以下是需要根据实际项目实现的函数 +func getStoredVerificationCode(phone, typ string) (string, error) { + // 从缓存中获取验证码的逻辑 + // 例如: return redisClient.Get(ctx, getOtpCacheKey(phone, typ)).Result() + return "", nil +} diff --git a/acquaintances/biz/model/user.go b/acquaintances/biz/model/user.go index f119639..697c455 100644 --- a/acquaintances/biz/model/user.go +++ b/acquaintances/biz/model/user.go @@ -9,6 +9,11 @@ import ( "time" ) +const ( + SmsLongin = "sms_longin" + SmsRegister = "sms_register" +) + var UserSync *sync.Mutex type User struct { diff --git a/acquaintances/biz/model/user/user.go b/acquaintances/biz/model/user/user.go index d879fdf..e41b7b1 100644 --- a/acquaintances/biz/model/user/user.go +++ b/acquaintances/biz/model/user/user.go @@ -1825,7 +1825,7 @@ type CreateUserRequest struct { Name string `thrift:"name,1" form:"name" json:"name" vd:"(len($) > 0 && len($) < 100)"` Gender Gender `thrift:"gender,2" form:"gender" json:"gender" vd:"($ == 1||$ == 2)"` Age int64 `thrift:"age,3" form:"age" json:"age" vd:"$>0"` - Mobile string `thrift:"mobile,4" form:"mobile" json:"mobile" vd:"(len($) > 0 && len($) < 12)"` + Mobile string `thrift:"mobile,4" form:"mobile" form:"mobile" json:"mobile" vd:"(len($) > 0 && len($) < 12)"` Area int64 `thrift:"area,5" form:"area" json:"area" vd:"$>0"` UserPassword string `thrift:"user_password,6" form:"user_password" json:"user_password" vd:"(len($) > 0 && len($) < 15)"` } @@ -4677,6 +4677,787 @@ func (p *LoginUserRequest) String() string { } +type SmsRequest struct { + Phone string `thrift:"phone,1" form:"phone" json:"phone" path:"phone"` + Type string `thrift:"type,2" form:"type" json:"type" path:"type"` +} + +func NewSmsRequest() *SmsRequest { + return &SmsRequest{} +} + +func (p *SmsRequest) InitDefault() { +} + +func (p *SmsRequest) GetPhone() (v string) { + return p.Phone +} + +func (p *SmsRequest) GetType() (v string) { + return p.Type +} + +var fieldIDToName_SmsRequest = map[int16]string{ + 1: "phone", + 2: "type", +} + +func (p *SmsRequest) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 1: + if fieldTypeId == thrift.STRING { + if err = p.ReadField1(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + case 2: + if fieldTypeId == thrift.STRING { + if err = p.ReadField2(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_SmsRequest[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *SmsRequest) ReadField1(iprot thrift.TProtocol) error { + + var _field string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = v + } + p.Phone = _field + return nil +} +func (p *SmsRequest) ReadField2(iprot thrift.TProtocol) error { + + var _field string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = v + } + p.Type = _field + return nil +} + +func (p *SmsRequest) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("SmsRequest"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField1(oprot); err != nil { + fieldId = 1 + goto WriteFieldError + } + if err = p.writeField2(oprot); err != nil { + fieldId = 2 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *SmsRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("phone", thrift.STRING, 1); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(p.Phone); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 end error: ", p), err) +} +func (p *SmsRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("type", thrift.STRING, 2); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(p.Type); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 end error: ", p), err) +} + +func (p *SmsRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("SmsRequest(%+v)", *p) + +} + +type SmsResponse struct { + Code Code `thrift:"code,1" form:"code" json:"code" query:"code"` + Msg string `thrift:"msg,2" form:"msg" json:"msg" query:"msg"` +} + +func NewSmsResponse() *SmsResponse { + return &SmsResponse{} +} + +func (p *SmsResponse) InitDefault() { +} + +func (p *SmsResponse) GetCode() (v Code) { + return p.Code +} + +func (p *SmsResponse) GetMsg() (v string) { + return p.Msg +} + +var fieldIDToName_SmsResponse = map[int16]string{ + 1: "code", + 2: "msg", +} + +func (p *SmsResponse) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 1: + if fieldTypeId == thrift.I32 { + if err = p.ReadField1(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + case 2: + if fieldTypeId == thrift.STRING { + if err = p.ReadField2(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_SmsResponse[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *SmsResponse) ReadField1(iprot thrift.TProtocol) error { + + var _field Code + if v, err := iprot.ReadI32(); err != nil { + return err + } else { + _field = Code(v) + } + p.Code = _field + return nil +} +func (p *SmsResponse) ReadField2(iprot thrift.TProtocol) error { + + var _field string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = v + } + p.Msg = _field + return nil +} + +func (p *SmsResponse) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("SmsResponse"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField1(oprot); err != nil { + fieldId = 1 + goto WriteFieldError + } + if err = p.writeField2(oprot); err != nil { + fieldId = 2 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *SmsResponse) writeField1(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("code", thrift.I32, 1); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteI32(int32(p.Code)); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 end error: ", p), err) +} +func (p *SmsResponse) writeField2(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("msg", thrift.STRING, 2); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(p.Msg); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 end error: ", p), err) +} + +func (p *SmsResponse) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("SmsResponse(%+v)", *p) + +} + +type CheckOtpRequest struct { + Phone string `thrift:"phone,1" form:"phone" json:"phone" path:"phone"` + Otp string `thrift:"otp,2" form:"otp" json:"otp" path:"otp"` + Type string `thrift:"type,3" form:"type" json:"type" path:"type"` +} + +func NewCheckOtpRequest() *CheckOtpRequest { + return &CheckOtpRequest{} +} + +func (p *CheckOtpRequest) InitDefault() { +} + +func (p *CheckOtpRequest) GetPhone() (v string) { + return p.Phone +} + +func (p *CheckOtpRequest) GetOtp() (v string) { + return p.Otp +} + +func (p *CheckOtpRequest) GetType() (v string) { + return p.Type +} + +var fieldIDToName_CheckOtpRequest = map[int16]string{ + 1: "phone", + 2: "otp", + 3: "type", +} + +func (p *CheckOtpRequest) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 1: + if fieldTypeId == thrift.STRING { + if err = p.ReadField1(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + case 2: + if fieldTypeId == thrift.STRING { + if err = p.ReadField2(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + case 3: + if fieldTypeId == thrift.STRING { + if err = p.ReadField3(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_CheckOtpRequest[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *CheckOtpRequest) ReadField1(iprot thrift.TProtocol) error { + + var _field string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = v + } + p.Phone = _field + return nil +} +func (p *CheckOtpRequest) ReadField2(iprot thrift.TProtocol) error { + + var _field string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = v + } + p.Otp = _field + return nil +} +func (p *CheckOtpRequest) ReadField3(iprot thrift.TProtocol) error { + + var _field string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = v + } + p.Type = _field + return nil +} + +func (p *CheckOtpRequest) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("CheckOtpRequest"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField1(oprot); err != nil { + fieldId = 1 + goto WriteFieldError + } + if err = p.writeField2(oprot); err != nil { + fieldId = 2 + goto WriteFieldError + } + if err = p.writeField3(oprot); err != nil { + fieldId = 3 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *CheckOtpRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("phone", thrift.STRING, 1); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(p.Phone); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 end error: ", p), err) +} +func (p *CheckOtpRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("otp", thrift.STRING, 2); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(p.Otp); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 end error: ", p), err) +} +func (p *CheckOtpRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("type", thrift.STRING, 3); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(p.Type); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 3 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 3 end error: ", p), err) +} + +func (p *CheckOtpRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("CheckOtpRequest(%+v)", *p) + +} + +type CheckOtpResponse struct { + Code Code `thrift:"code,1" form:"code" json:"code" query:"code"` + Msg string `thrift:"msg,2" form:"msg" json:"msg" query:"msg"` +} + +func NewCheckOtpResponse() *CheckOtpResponse { + return &CheckOtpResponse{} +} + +func (p *CheckOtpResponse) InitDefault() { +} + +func (p *CheckOtpResponse) GetCode() (v Code) { + return p.Code +} + +func (p *CheckOtpResponse) GetMsg() (v string) { + return p.Msg +} + +var fieldIDToName_CheckOtpResponse = map[int16]string{ + 1: "code", + 2: "msg", +} + +func (p *CheckOtpResponse) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 1: + if fieldTypeId == thrift.I32 { + if err = p.ReadField1(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + case 2: + if fieldTypeId == thrift.STRING { + if err = p.ReadField2(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_CheckOtpResponse[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *CheckOtpResponse) ReadField1(iprot thrift.TProtocol) error { + + var _field Code + if v, err := iprot.ReadI32(); err != nil { + return err + } else { + _field = Code(v) + } + p.Code = _field + return nil +} +func (p *CheckOtpResponse) ReadField2(iprot thrift.TProtocol) error { + + var _field string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = v + } + p.Msg = _field + return nil +} + +func (p *CheckOtpResponse) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("CheckOtpResponse"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField1(oprot); err != nil { + fieldId = 1 + goto WriteFieldError + } + if err = p.writeField2(oprot); err != nil { + fieldId = 2 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *CheckOtpResponse) writeField1(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("code", thrift.I32, 1); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteI32(int32(p.Code)); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 end error: ", p), err) +} +func (p *CheckOtpResponse) writeField2(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("msg", thrift.STRING, 2); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(p.Msg); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 2 end error: ", p), err) +} + +func (p *CheckOtpResponse) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("CheckOtpResponse(%+v)", *p) + +} + /** 用户好友关系 **/ @@ -17497,6 +18278,10 @@ type UserService interface { FindUser(ctx context.Context, req *FindUserRequest) (r *FindUserResponse, err error) LoginUser(ctx context.Context, req *LoginUserRequest) (r *LoginUserResponse, err error) + + SmsUser(ctx context.Context, req *SmsRequest) (r *SmsResponse, err error) + + CheckOtp(ctx context.Context, req *CheckOtpRequest) (r *CheckOtpResponse, err error) } type UserServiceClient struct { @@ -17579,6 +18364,24 @@ func (p *UserServiceClient) LoginUser(ctx context.Context, req *LoginUserRequest } return _result.GetSuccess(), nil } +func (p *UserServiceClient) SmsUser(ctx context.Context, req *SmsRequest) (r *SmsResponse, err error) { + var _args UserServiceSmsUserArgs + _args.Req = req + var _result UserServiceSmsUserResult + if err = p.Client_().Call(ctx, "SmsUser", &_args, &_result); err != nil { + return + } + return _result.GetSuccess(), nil +} +func (p *UserServiceClient) CheckOtp(ctx context.Context, req *CheckOtpRequest) (r *CheckOtpResponse, err error) { + var _args UserServiceCheckOtpArgs + _args.Req = req + var _result UserServiceCheckOtpResult + if err = p.Client_().Call(ctx, "CheckOtp", &_args, &_result); err != nil { + return + } + return _result.GetSuccess(), nil +} type UserRelationsService interface { DeleteUserRelations(ctx context.Context, req *DeleteUserRelationsReq) (r *DeleteUserRelationsRes, err error) @@ -17988,6 +18791,8 @@ func NewUserServiceProcessor(handler UserService) *UserServiceProcessor { self.AddToProcessorMap("CreateUser", &userServiceProcessorCreateUser{handler: handler}) self.AddToProcessorMap("FindUser", &userServiceProcessorFindUser{handler: handler}) self.AddToProcessorMap("LoginUser", &userServiceProcessorLoginUser{handler: handler}) + self.AddToProcessorMap("SmsUser", &userServiceProcessorSmsUser{handler: handler}) + self.AddToProcessorMap("CheckOtp", &userServiceProcessorCheckOtp{handler: handler}) return self } func (p *UserServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { @@ -18296,6 +19101,102 @@ func (p *userServiceProcessorLoginUser) Process(ctx context.Context, seqId int32 return true, err } +type userServiceProcessorSmsUser struct { + handler UserService +} + +func (p *userServiceProcessorSmsUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := UserServiceSmsUserArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("SmsUser", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush(ctx) + return false, err + } + + iprot.ReadMessageEnd() + var err2 error + result := UserServiceSmsUserResult{} + var retval *SmsResponse + if retval, err2 = p.handler.SmsUser(ctx, args.Req); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing SmsUser: "+err2.Error()) + oprot.WriteMessageBegin("SmsUser", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush(ctx) + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("SmsUser", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(ctx); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type userServiceProcessorCheckOtp struct { + handler UserService +} + +func (p *userServiceProcessorCheckOtp) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := UserServiceCheckOtpArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("CheckOtp", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush(ctx) + return false, err + } + + iprot.ReadMessageEnd() + var err2 error + result := UserServiceCheckOtpResult{} + var retval *CheckOtpResponse + if retval, err2 = p.handler.CheckOtp(ctx, args.Req); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing CheckOtp: "+err2.Error()) + oprot.WriteMessageBegin("CheckOtp", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush(ctx) + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("CheckOtp", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(ctx); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + type UserServiceUpdateUserArgs struct { Req *UpdateUserRequest `thrift:"req,1"` } @@ -20048,6 +20949,590 @@ func (p *UserServiceLoginUserResult) String() string { } +type UserServiceSmsUserArgs struct { + Req *SmsRequest `thrift:"req,1"` +} + +func NewUserServiceSmsUserArgs() *UserServiceSmsUserArgs { + return &UserServiceSmsUserArgs{} +} + +func (p *UserServiceSmsUserArgs) InitDefault() { +} + +var UserServiceSmsUserArgs_Req_DEFAULT *SmsRequest + +func (p *UserServiceSmsUserArgs) GetReq() (v *SmsRequest) { + if !p.IsSetReq() { + return UserServiceSmsUserArgs_Req_DEFAULT + } + return p.Req +} + +var fieldIDToName_UserServiceSmsUserArgs = map[int16]string{ + 1: "req", +} + +func (p *UserServiceSmsUserArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *UserServiceSmsUserArgs) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 1: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField1(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_UserServiceSmsUserArgs[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *UserServiceSmsUserArgs) ReadField1(iprot thrift.TProtocol) error { + _field := NewSmsRequest() + if err := _field.Read(iprot); err != nil { + return err + } + p.Req = _field + return nil +} + +func (p *UserServiceSmsUserArgs) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("SmsUser_args"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField1(oprot); err != nil { + fieldId = 1 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *UserServiceSmsUserArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + goto WriteFieldBeginError + } + if err := p.Req.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 end error: ", p), err) +} + +func (p *UserServiceSmsUserArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("UserServiceSmsUserArgs(%+v)", *p) + +} + +type UserServiceSmsUserResult struct { + Success *SmsResponse `thrift:"success,0,optional"` +} + +func NewUserServiceSmsUserResult() *UserServiceSmsUserResult { + return &UserServiceSmsUserResult{} +} + +func (p *UserServiceSmsUserResult) InitDefault() { +} + +var UserServiceSmsUserResult_Success_DEFAULT *SmsResponse + +func (p *UserServiceSmsUserResult) GetSuccess() (v *SmsResponse) { + if !p.IsSetSuccess() { + return UserServiceSmsUserResult_Success_DEFAULT + } + return p.Success +} + +var fieldIDToName_UserServiceSmsUserResult = map[int16]string{ + 0: "success", +} + +func (p *UserServiceSmsUserResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *UserServiceSmsUserResult) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 0: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField0(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_UserServiceSmsUserResult[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *UserServiceSmsUserResult) ReadField0(iprot thrift.TProtocol) error { + _field := NewSmsResponse() + if err := _field.Read(iprot); err != nil { + return err + } + p.Success = _field + return nil +} + +func (p *UserServiceSmsUserResult) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("SmsUser_result"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField0(oprot); err != nil { + fieldId = 0 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *UserServiceSmsUserResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err = oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + goto WriteFieldBeginError + } + if err := p.Success.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 0 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 0 end error: ", p), err) +} + +func (p *UserServiceSmsUserResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("UserServiceSmsUserResult(%+v)", *p) + +} + +type UserServiceCheckOtpArgs struct { + Req *CheckOtpRequest `thrift:"req,1"` +} + +func NewUserServiceCheckOtpArgs() *UserServiceCheckOtpArgs { + return &UserServiceCheckOtpArgs{} +} + +func (p *UserServiceCheckOtpArgs) InitDefault() { +} + +var UserServiceCheckOtpArgs_Req_DEFAULT *CheckOtpRequest + +func (p *UserServiceCheckOtpArgs) GetReq() (v *CheckOtpRequest) { + if !p.IsSetReq() { + return UserServiceCheckOtpArgs_Req_DEFAULT + } + return p.Req +} + +var fieldIDToName_UserServiceCheckOtpArgs = map[int16]string{ + 1: "req", +} + +func (p *UserServiceCheckOtpArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *UserServiceCheckOtpArgs) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 1: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField1(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_UserServiceCheckOtpArgs[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *UserServiceCheckOtpArgs) ReadField1(iprot thrift.TProtocol) error { + _field := NewCheckOtpRequest() + if err := _field.Read(iprot); err != nil { + return err + } + p.Req = _field + return nil +} + +func (p *UserServiceCheckOtpArgs) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("CheckOtp_args"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField1(oprot); err != nil { + fieldId = 1 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *UserServiceCheckOtpArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err = oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + goto WriteFieldBeginError + } + if err := p.Req.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 end error: ", p), err) +} + +func (p *UserServiceCheckOtpArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("UserServiceCheckOtpArgs(%+v)", *p) + +} + +type UserServiceCheckOtpResult struct { + Success *CheckOtpResponse `thrift:"success,0,optional"` +} + +func NewUserServiceCheckOtpResult() *UserServiceCheckOtpResult { + return &UserServiceCheckOtpResult{} +} + +func (p *UserServiceCheckOtpResult) InitDefault() { +} + +var UserServiceCheckOtpResult_Success_DEFAULT *CheckOtpResponse + +func (p *UserServiceCheckOtpResult) GetSuccess() (v *CheckOtpResponse) { + if !p.IsSetSuccess() { + return UserServiceCheckOtpResult_Success_DEFAULT + } + return p.Success +} + +var fieldIDToName_UserServiceCheckOtpResult = map[int16]string{ + 0: "success", +} + +func (p *UserServiceCheckOtpResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *UserServiceCheckOtpResult) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 0: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField0(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_UserServiceCheckOtpResult[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *UserServiceCheckOtpResult) ReadField0(iprot thrift.TProtocol) error { + _field := NewCheckOtpResponse() + if err := _field.Read(iprot); err != nil { + return err + } + p.Success = _field + return nil +} + +func (p *UserServiceCheckOtpResult) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("CheckOtp_result"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField0(oprot); err != nil { + fieldId = 0 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *UserServiceCheckOtpResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err = oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + goto WriteFieldBeginError + } + if err := p.Success.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 0 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 0 end error: ", p), err) +} + +func (p *UserServiceCheckOtpResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("UserServiceCheckOtpResult(%+v)", *p) + +} + type UserRelationsServiceProcessor struct { processorMap map[string]thrift.TProcessorFunction handler UserRelationsService diff --git a/acquaintances/biz/router/user/middleware.go b/acquaintances/biz/router/user/middleware.go index 5604281..5b373c3 100644 --- a/acquaintances/biz/router/user/middleware.go +++ b/acquaintances/biz/router/user/middleware.go @@ -315,3 +315,23 @@ func _user0Mw() []app.HandlerFunc { // your code... return nil } + +func _smsMw() []app.HandlerFunc { + // your code... + return nil +} + +func _smsuserMw() []app.HandlerFunc { + // your code... + return nil +} + +func _check_otpMw() []app.HandlerFunc { + // your code... + return nil +} + +func _checkotpMw() []app.HandlerFunc { + // your code... + return nil +} diff --git a/acquaintances/biz/router/user/user.go b/acquaintances/biz/router/user/user.go index 74b7145..897ee9d 100644 --- a/acquaintances/biz/router/user/user.go +++ b/acquaintances/biz/router/user/user.go @@ -81,6 +81,10 @@ func Register(r *server.Hertz) { _user0.GET("/", append(_infouserMw(), user.InfoUser)...) _user0.POST("/", append(_createuserMw(), user.CreateUser)...) _user0.PUT("/", append(_updateuserMw(), user.UpdateUser)...) + { + _check_otp := _user0.Group("/check_otp", _check_otpMw()...) + _check_otp.POST("/", append(_checkotpMw(), user.CheckOtp)...) + } { _find := _user0.Group("/find", _findMw()...) _find.GET("/", append(_finduserMw(), user.FindUser)...) @@ -102,6 +106,10 @@ func Register(r *server.Hertz) { _relation.POST("/", append(_createuserrelationsMw(), user.CreateUserRelations)...) _relation.PUT("/", append(_updateuserrelationsMw(), user.UpdateUserRelations)...) } + { + _sms := _user0.Group("/sms", _smsMw()...) + _sms.POST("/", append(_smsuserMw(), user.SmsUser)...) + } } } } diff --git a/acquaintances/biz/utils/utils.go b/acquaintances/biz/utils/utils.go index 51c3a01..0ed56c3 100644 --- a/acquaintances/biz/utils/utils.go +++ b/acquaintances/biz/utils/utils.go @@ -8,6 +8,7 @@ import ( "fmt" "github.com/cloudwego/hertz/pkg/common/hlog" "golang.org/x/crypto/scrypt" + "regexp" "sync" "time" ) @@ -171,3 +172,22 @@ func trimBase64Padding(s string) string { } return s } + +// SendSms 短信发送 +func SendSms(phone, message string) error { + // TODO + return nil +} + +// IsValidPhone 辅助函数:验证手机号格式 +func IsValidPhone(phone string) bool { + // 简单的手机号验证正则,可根据实际需求调整 + pattern := `^\+?[1-9]\d{6,14}$` + reg := regexp.MustCompile(pattern) + return reg.MatchString(phone) +} + +// GenerateVerificationCode 生成6位数字验证码 +func GenerateVerificationCode() string { + return "" +} diff --git a/acquaintances/idl/user.thrift b/acquaintances/idl/user.thrift index 6828fba..b772873 100644 --- a/acquaintances/idl/user.thrift +++ b/acquaintances/idl/user.thrift @@ -134,14 +134,35 @@ struct LoginUserRequest{ 2: string password (api.path="password",api.body="password") } +struct SmsRequest{ + 1: string phone (api.path="phone",api.body="phone") + 2: string type (api.path="type",api.body="type") +} + +struct SmsResponse{ + 1: Code code + 2: string msg +} + +struct CheckOtpRequest{ + 1: string phone (api.path="phone",api.body="phone") + 2: string otp (api.path="otp",api.body="otp") +} + +struct CheckOtpResponse{ + 1: Code code + 2: string msg +} service UserService { - UpdateUserResponse UpdateUser(1:UpdateUserRequest req)(api.put="/v1/user/") - DeleteUserResponse DeleteUser(1:DeleteUserRequest req)(api.delete="/v1/user/") - QueryUserResponse InfoUser(1: InfoUserRequest req)(api.get="/v1/user/") - CreateUserResponse CreateUser(1:CreateUserRequest req)(api.post="/v1/user/") - FindUserResponse FindUser(1:FindUserRequest req)(api.get="/v1/user/find/") - LoginUserResponse LoginUser(1:LoginUserRequest req)(api.post="/v1/user/login/") + UpdateUserResponse UpdateUser(1:UpdateUserRequest req)(api.put="/v1/user/") //更新用户信息 + DeleteUserResponse DeleteUser(1:DeleteUserRequest req)(api.delete="/v1/user/") //删除用户 + QueryUserResponse InfoUser(1: InfoUserRequest req)(api.get="/v1/user/") //查询用户信息 + CreateUserResponse CreateUser(1:CreateUserRequest req)(api.post="/v1/user/") //注册用户 + FindUserResponse FindUser(1:FindUserRequest req)(api.get="/v1/user/find/") //精确查询用户 + LoginUserResponse LoginUser(1:LoginUserRequest req)(api.post="/v1/user/login/") //用户登录 + SmsResponse SmsUser(1:SmsRequest req)(api.post="/v1/user/sms/") //用户短信 + CheckOtpResponse CheckOtp(1:CheckOtpRequest req)(api.post="/v1/user/check_otp/") //验证码校验 }