Files
huangguo_server/common/v10/validate.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

169 lines
4.5 KiB
Go

package v10
import (
"reflect"
"regexp"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
"github.com/nyaruka/phonenumbers"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// IsPureChar 匹配中文、字母、数字
func IsPureChar(src string) bool {
return regexp.MustCompile("^[a-z0-9A-Z\u4e00-\u9fa5]+$").MatchString(src)
}
// IsPureChineseChar 匹配中文
func IsPureChineseChar(src string) bool {
return regexp.MustCompile("[\u4e00-\u9fa5]").MatchString(src)
}
// 提取文字 包括数字 英文 不包含符号
func ExtractPureEngChar(src string) string {
pureArray := regexp.MustCompile("[a-z0-9A-Z\u005f]").FindAllString(src, -1)
return strings.Join(pureArray, "")
}
// 提取文字 包括中文 数字 英文 不包含符号
func ExtractPureChar(src string) string {
src = strings.TrimSpace(src)
pureArray := regexp.MustCompile("[a-z0-9A-Z\u4e00-\u9fa5]+").FindAllString(src, -1)
return strings.Join(pureArray, "")
}
// IsPhoneNumber 匹配所有国际化的手机号码(手机卡 + 上网卡)
func IsGlobalizationPhoneNumber(phoneNumber string) bool {
num, _ := phonenumbers.Parse(phoneNumber, "CN")
return phonenumbers.IsValidNumber(num)
}
// IsEn 是否是英文的正则表达式验证
func IsEn(data string) bool {
return regexp.MustCompile(`^[a-zA-Z]+$`).MatchString(data)
}
// IsEnZh 是否是中英文的正则表达式验证
func IsEnZh(data string) bool {
return regexp.MustCompile("^[a-zA-Z|\u4e00-\u9fa5]+$").MatchString(data)
}
// IsEnNum 是否是英文数字的正则表达式验证
func IsEnNum(data string) bool {
return regexp.MustCompile(`^[a-zA-Z0-9]+$`).MatchString(data)
}
// IsEnNumSpe 是否是英文数字特殊符号的验证
func IsEnNumSpe(data string) bool {
return regexp.MustCompile(`^[a-zA-Z0-9|~!@#$%^&*()/\|,.<>?"'();:_+-=\[\]{}]+$`).MatchString(data)
}
// IsObjectID 是否objectID的验证
func IsObjectID(data string) bool {
if _, err := primitive.ObjectIDFromHex(data); err != nil {
return false
}
return true
}
// IsLengthBetween 判断data字符串长度是否在范围内
func IsLengthBetween(data string, min int, max int) bool {
return len(data) >= min && len(data) <= max
}
// IsNil nil判断
func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}
// Phone 验证手机号码
func Phone(
v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value,
field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string,
) bool {
if data, ok := field.Interface().(string); ok {
if len(data) <= 10 || len(data) >= 15 {
return false
}
if !IsGlobalizationPhoneNumber(data) {
return false
}
return true
}
return false
}
// Time_Utc 转换成UTC时间
func Time_Utc(fl validator.FieldLevel) bool {
timeParse, err := time.Parse(time.RFC3339, fl.Field().String())
if err != nil {
return false
}
timevalue := reflect.ValueOf(timeParse)
fl.Field().Set(timevalue)
return true
}
// StrLength 验证长度
func StrLength(
v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value,
field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string,
) bool {
num, err := strconv.Atoi(param)
if err != nil {
return false
}
if data, ok := field.Interface().(string); ok {
if len(data) == num {
return true
}
}
return false
}
// NeedType 需要类型
func NeedType(
v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value,
field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string,
) bool {
if data, ok := field.Interface().(string); ok {
switch param {
case "en": // 英文
return IsEn(data)
case "enZh": // 中英文
return IsEnZh(data)
case "enNum": // 英文数字
return IsEnNum(data)
case "enNumSpe": // 英文数字特殊符号
return IsEnNumSpe(data)
case "objectID": // 是否为mongo的id
return IsObjectID(data)
}
}
return false
}
// RegisterValidator 注解自定义参数验证
func RegisterValidator() gin.HandlerFunc {
return func(c *gin.Context) {
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
//v.RegisterValidation("phone", Phone)
// v.RegisterValidation("len", StrLength)
// v.RegisterValidation("min", validator.IsGte)
// v.RegisterValidation("max", validator.IsLte)
// v.RegisterValidation("eq", validator.IsEq)
// v.RegisterValidation("type", NeedType)
_ = v.RegisterValidation("time_utc", Time_Utc)
}
}
}