@@ -0,0 +1,47 @@
|
||||
package v10
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"sync"
|
||||
|
||||
"github.com/gin-gonic/gin/binding"
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
type DefaultValidator struct {
|
||||
once sync.Once
|
||||
validate *validator.Validate
|
||||
}
|
||||
|
||||
var _ binding.StructValidator = &DefaultValidator{}
|
||||
|
||||
func (v *DefaultValidator) ValidateStruct(obj interface{}) error {
|
||||
if kindOfData(obj) == reflect.Struct {
|
||||
v.lazyinit()
|
||||
if err := v.validate.Struct(obj); err != nil {
|
||||
return error(err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v *DefaultValidator) Engine() interface{} {
|
||||
v.lazyinit()
|
||||
return v.validate
|
||||
}
|
||||
|
||||
func (v *DefaultValidator) lazyinit() {
|
||||
v.once.Do(func() {
|
||||
v.validate = validator.New()
|
||||
v.validate.SetTagName("binding")
|
||||
})
|
||||
}
|
||||
|
||||
func kindOfData(data interface{}) reflect.Kind {
|
||||
value := reflect.ValueOf(data)
|
||||
valueType := value.Kind()
|
||||
if valueType == reflect.Ptr {
|
||||
valueType = value.Elem().Kind()
|
||||
}
|
||||
return valueType
|
||||
}
|
||||
@@ -0,0 +1,168 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user