qnc-server-old/utils/veriryCode.go
2024-09-14 10:48:09 +08:00

79 lines
1.8 KiB
Go

package utils
import (
"context"
"errors"
"fmt"
"github.com/redis/go-redis/v9"
"math/rand"
"qnc-server/config"
"qnc-server/db"
"regexp"
"time"
)
var ctx = context.Background()
func GenerateVerificationCode() string {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
code := fmt.Sprintf("%06d", r.Intn(1000000))
return code
}
// 验证手机号码格式的函数
func IsValidPhoneNumber(phone string) bool {
re := regexp.MustCompile(`^1[3-9]\d{9}$`)
return re.MatchString(phone)
}
// StoreVerificationCode 存储验证码到 Redis
func StoreVerificationCode(phoneNumber, code string) error {
err := db.RedisClient.Set(ctx, phoneNumber, code, config.ConfigData.VerifyCode.Expiration).Err()
if err != nil {
return err
}
err = SetThrottle(phoneNumber)
if err != nil {
return err
}
return nil
}
// VerifyCode 验证验证码
func VerifyCode(phoneNumber, code string) (bool, error) {
//if phoneNumber == "18276151590" {
// return true, nil
//}
storedCode, err := db.RedisClient.Get(ctx, phoneNumber).Result()
if errors.Is(err, redis.Nil) {
return false, fmt.Errorf("验证码不存在或已过期")
} else if err != nil {
return false, err
}
if storedCode == code {
return true, nil
} else {
return false, nil
}
}
// CanRequestCode 检查用户是否可以请求新的验证码
func CanRequestCode(phoneNumber string) (bool, error) {
key := "throttle:" + phoneNumber
exists, err := db.RedisClient.Exists(ctx, key).Result()
if err != nil {
return false, err
}
return exists == 1, nil
}
// SetThrottle 设置用户请求的节流
func SetThrottle(phoneNumber string) error {
key := "throttle:" + phoneNumber
err := db.RedisClient.Set(ctx, key, "1", config.ConfigData.VerifyCode.ThrottleTime).Err()
if err != nil {
return err
}
return nil
}