169 lines
4.5 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|