refactor(valid): 重构验证模块使用Goframe验证器

- 移除原有的validator和国际化翻译相关代码
- 使用Goframe的g.Validator进行参数验证
- 简化ValidAndStruct函数实现
- 更新依赖包从validator切换到gogf
- 删除不再使用的ValidateError工具函数
- 移除init函数中的翻译器初始化逻辑
This commit is contained in:
2026-02-04 14:18:10 +08:00
parent 8743f40739
commit a1a2785c71
3 changed files with 13 additions and 266 deletions
-1
View File
@@ -1 +0,0 @@
package valid
+11 -64
View File
@@ -1,72 +1,19 @@
package valid
import (
"errors"
"reflect"
"strings"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zh_translations "github.com/go-playground/validator/v10/translations/zh"
"github.com/gin-gonic/gin"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
)
// -------------------------- 全局变量(翻译器+验证器) --------------------------
var (
trans ut.Translator // 全局中文翻译器
validate *validator.Validate // 全局验证器实例
found bool
)
// -------------------------- 初始化全局验证器+中文翻译器(关键:与Gin关联) --------------------------
func init() {
// 1. 初始化中文本地化
zhLocale := zh.New()
uni := ut.New(zhLocale, zhLocale)
// 2. 获取中文翻译器
var err error
trans, found = uni.GetTranslator("zh")
if !found {
panic("获取中文翻译器失败")
// ValidAndStruct 验证参数并返回结构体
func ValidAndStruct[T any](c *gin.Context) (object *T) {
object = new(T)
if err := c.BindJSON(object); err != nil {
panic(err)
}
// 3. 关键:获取 Gin 内置的 validator 实例(而非手动创建 new(validator.Validate))
// 保证 Gin 绑定参数时使用的是我们注册了翻译的这个验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
validate = v
} else {
panic("获取 Gin 内置验证器失败")
if err := g.Validator().Data(object).Run(c); err != nil {
panic(gerror.Current(err).Error())
}
// 4. 注册中文翻译(核心:将验证器与中文翻译器绑定)
err = zh_translations.RegisterDefaultTranslations(validate, trans)
if err != nil {
panic("注册中文翻译失败:" + err.Error())
}
// 5. 注册字段名映射:用 json 标签替换结构体字段名(解决报错中的 Title -> title 问题)
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
// 提取 json 标签,忽略 ,omitempty 等附加选项
jsonTag := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if jsonTag == "-" {
return ""
}
return jsonTag
})
}
// ValidateError -------------------------- 工具函数:解析第一条验证错误(中文翻译) --------------------------
func ValidateError(err error) string {
// 1. 断言错误类型为 validator.ValidationErrors
var validateErrors validator.ValidationErrors
ok := errors.As(err, &validateErrors)
if !ok {
// 非参数验证错误,直接返回
return "参数格式错误:" + err.Error()
}
// 2. 只返回第一条中文翻译错误
return validateErrors[0].Translate(trans)
return
}