package validator import ( "net/url" "regexp" "github.com/go-playground/validator/v10" ) // RegisterCustomValidators 注册所有自定义验证器 func RegisterCustomValidators(validate *validator.Validate) { // 手机号验证器 validate.RegisterValidation("phone", validatePhone) // 用户名验证器(字母开头,允许字母数字下划线,3-20位) validate.RegisterValidation("username", validateUsername) // 强密码验证器(至少8位,包含大小写字母和数字) validate.RegisterValidation("strong_password", validateStrongPassword) // 统一社会信用代码验证器 validate.RegisterValidation("social_credit_code", validateSocialCreditCode) // 身份证号验证器 validate.RegisterValidation("id_card", validateIDCard) // 价格验证器(非负数) validate.RegisterValidation("price", validatePrice) // 排序方向验证器 validate.RegisterValidation("sort_order", validateSortOrder) // 产品代码验证器(字母数字下划线连字符,3-50位) validate.RegisterValidation("product_code", validateProductCode) // UUID验证器 validate.RegisterValidation("uuid", validateUUID) // URL验证器 validate.RegisterValidation("url", validateURL) } // validatePhone 手机号验证 func validatePhone(fl validator.FieldLevel) bool { phone := fl.Field().String() matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, phone) return matched } // validateUsername 用户名验证 func validateUsername(fl validator.FieldLevel) bool { username := fl.Field().String() matched, _ := regexp.MatchString(`^[a-zA-Z][a-zA-Z0-9_]{2,19}$`, username) return matched } // validateStrongPassword 强密码验证 func validateStrongPassword(fl validator.FieldLevel) bool { password := fl.Field().String() if len(password) < 8 { return false } hasUpper := regexp.MustCompile(`[A-Z]`).MatchString(password) hasLower := regexp.MustCompile(`[a-z]`).MatchString(password) hasDigit := regexp.MustCompile(`\d`).MatchString(password) return hasUpper && hasLower && hasDigit } // validateSocialCreditCode 统一社会信用代码验证 func validateSocialCreditCode(fl validator.FieldLevel) bool { code := fl.Field().String() matched, _ := regexp.MatchString(`^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$`, code) return matched } // validateIDCard 身份证号验证 func validateIDCard(fl validator.FieldLevel) bool { idCard := fl.Field().String() matched, _ := regexp.MatchString(`^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[\dXx]$`, idCard) return matched } // validatePrice 价格验证 func validatePrice(fl validator.FieldLevel) bool { price := fl.Field().Float() return price >= 0 } // validateSortOrder 排序方向验证 func validateSortOrder(fl validator.FieldLevel) bool { sortOrder := fl.Field().String() return sortOrder == "" || sortOrder == "asc" || sortOrder == "desc" } // validateProductCode 产品代码验证 func validateProductCode(fl validator.FieldLevel) bool { code := fl.Field().String() matched, _ := regexp.MatchString(`^[a-zA-Z0-9_-]{3,50}$`, code) return matched } // validateUUID UUID验证 func validateUUID(fl validator.FieldLevel) bool { uuid := fl.Field().String() matched, _ := regexp.MatchString(`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`, uuid) return matched } // validateURL URL验证 func validateURL(fl validator.FieldLevel) bool { urlStr := fl.Field().String() _, err := url.ParseRequestURI(urlStr) return err == nil }