This commit is contained in:
2025-08-27 22:19:19 +08:00
parent 4031277a91
commit 5051aea55c
93 changed files with 2025 additions and 1168 deletions

View File

@@ -3,6 +3,7 @@ package validator
import (
"fmt"
"strings"
"sync"
"tyapi-server/internal/shared/interfaces"
@@ -14,6 +15,58 @@ import (
zh_translations "github.com/go-playground/validator/v10/translations/zh"
)
// 全局变量声明
var (
globalValidator *validator.Validate
globalTranslator ut.Translator
once sync.Once
)
// InitGlobalValidator 初始化全局校验器(线程安全)
func InitGlobalValidator() {
once.Do(func() {
// 1. 创建新的校验器实例
globalValidator = validator.New()
// 2. 创建中文翻译器
zhLocale := zh.New()
uni := ut.New(zhLocale, zhLocale)
globalTranslator, _ = uni.GetTranslator("zh")
// 3. 注册官方中文翻译
zh_translations.RegisterDefaultTranslations(globalValidator, globalTranslator)
// 4. 注册自定义校验规则
RegisterCustomValidators(globalValidator)
// 5. 注册自定义中文翻译
RegisterCustomTranslations(globalValidator, globalTranslator)
// 6. 设置到Gin全局校验器确保Gin使用我们的校验器
if binding.Validator.Engine() != nil {
// 如果Gin已经初始化则替换其校验器
ginValidator := binding.Validator.Engine().(*validator.Validate)
*ginValidator = *globalValidator
}
})
}
// GetGlobalValidator 获取全局校验器实例
func GetGlobalValidator() *validator.Validate {
if globalValidator == nil {
InitGlobalValidator()
}
return globalValidator
}
// GetGlobalTranslator 获取全局翻译器实例
func GetGlobalTranslator() ut.Translator {
if globalTranslator == nil {
InitGlobalValidator()
}
return globalTranslator
}
// RequestValidator HTTP请求验证器
type RequestValidator struct {
response interfaces.ResponseBuilder
@@ -23,29 +76,13 @@ type RequestValidator struct {
// NewRequestValidator 创建HTTP请求验证器
func NewRequestValidator(response interfaces.ResponseBuilder) interfaces.RequestValidator {
// 创建中文locale
zhLocale := zh.New()
uni := ut.New(zhLocale, zhLocale)
// 获取中文翻译器
trans, _ := uni.GetTranslator("zh")
// 获取gin默认的validator实例
ginValidator := binding.Validator.Engine().(*validator.Validate)
// 注册官方中文翻译
zh_translations.RegisterDefaultTranslations(ginValidator, trans)
// 注册自定义验证器到gin的全局validator
RegisterCustomValidators(ginValidator)
// 注册自定义翻译
RegisterCustomTranslations(ginValidator, trans)
// 确保全局校验器已初始化
InitGlobalValidator()
return &RequestValidator{
response: response,
translator: trans,
validator: ginValidator,
translator: globalTranslator, // 使用全局翻译器
validator: globalValidator, // 使用全局校验器
}
}