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) } } }