diff --git a/internal/consts/redis.go b/internal/consts/redis.go index e64bd55..16973b9 100644 --- a/internal/consts/redis.go +++ b/internal/consts/redis.go @@ -2,8 +2,9 @@ package consts // 用户 const ( - UserBindPhoneKey = "user:bindPhone:%s" - UserCodeExpire = 5 * 60 + UserBindPhoneKey = "user:bindPhone:%s" + UserBindPhoneLimitKey = "user:bindPhoneLimit:%s" + UserCodeExpire = 5 * 60 ) const ( diff --git a/internal/logic/user/user.go b/internal/logic/user/user.go index e23ab34..3a487b6 100644 --- a/internal/logic/user/user.go +++ b/internal/logic/user/user.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/grand" "server/internal/consts" @@ -164,6 +165,23 @@ func (s *sUser) Info(ctx context.Context, in *model.UserInfoIn) (out *model.User } func (s *sUser) Code(ctx context.Context, in *model.GetPhoneCodeIn) (out *model.GetPhoneCodeOut, err error) { + + // 限制 1min只能调用一次 + get, err := g.Redis().Get(ctx, fmt.Sprintf(consts.UserBindPhoneLimitKey, in.Phone)) + if err != nil { + glog.Errorf(ctx, "Redis 获取绑定手机限制失败: %v", err) + return nil, ecode.Fail.Sub("Redis 获取绑定手机限制失败") + } + if get.IsEmpty() { + err = g.Redis().SetEX(ctx, fmt.Sprintf(consts.UserBindPhoneLimitKey, in.Phone), "1", consts.UserCodeExpire) + if err != nil { + glog.Errorf(ctx, "Redis 设置绑定手机限制失败: %v", err) + return nil, ecode.Fail.Sub("Redis 设置绑定手机限制失败") + } + } else { + return nil, ecode.InvalidOperation.Sub("请勿重复请求绑定手机验证码") + } + code := grand.Digits(6) // 存入 redis