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 }