2024-11-09 14:59:27 +08:00
|
|
|
package validate
|
|
|
|
|
|
|
|
import (
|
|
|
|
"yitao/ecode"
|
|
|
|
|
|
|
|
"github.com/go-playground/locales/zh"
|
|
|
|
ut "github.com/go-playground/universal-translator"
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
|
|
"github.com/kataras/iris/v12"
|
|
|
|
)
|
|
|
|
|
|
|
|
var validate *validator.Validate
|
|
|
|
var trans ut.Translator
|
|
|
|
|
2024-11-13 16:30:51 +08:00
|
|
|
type ParamInterface interface {
|
|
|
|
Default()
|
|
|
|
}
|
|
|
|
|
2024-11-09 14:59:27 +08:00
|
|
|
func InitValidator() {
|
|
|
|
validate = validator.New()
|
|
|
|
eng := zh.New()
|
|
|
|
uni := ut.New(eng, eng)
|
|
|
|
trans, _ = uni.GetTranslator("zh")
|
|
|
|
|
|
|
|
addTranslation("min", "{0} 长度必须至少为 {1} 个字符")
|
|
|
|
addTranslation("max", "{0} 长度不能超过 {1} 个字符")
|
|
|
|
addTranslation("len", "{0} 长度应该为 {1} 个字符")
|
2024-11-13 16:30:51 +08:00
|
|
|
addTranslation("required", "{0} 不能为空")
|
2024-11-09 14:59:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func addTranslation(tag string, tr string) {
|
|
|
|
validate.RegisterTranslation(tag, trans, func(ut ut.Translator) error {
|
|
|
|
return ut.Add(tag, tr, true)
|
|
|
|
}, func(ut ut.Translator, fe validator.FieldError) string {
|
|
|
|
t, _ := ut.T(tag, fe.Field(), fe.Param())
|
|
|
|
return t
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetValidator() *validator.Validate {
|
|
|
|
return validate
|
|
|
|
}
|
|
|
|
|
2024-11-13 16:30:51 +08:00
|
|
|
func ReadJSON(ctx iris.Context, result ParamInterface) *ecode.Ecode {
|
2024-11-09 14:59:27 +08:00
|
|
|
ctx.ReadBody(result)
|
|
|
|
err := GetValidator().Struct(result)
|
|
|
|
if err != nil {
|
|
|
|
validateErr := err.(validator.ValidationErrors)
|
|
|
|
firstValue := ""
|
|
|
|
for _, v := range validateErr.Translate(trans) {
|
|
|
|
firstValue = v
|
|
|
|
break // 退出循环,确保只获取第一个元素
|
|
|
|
}
|
|
|
|
return ecode.Set(255, firstValue)
|
|
|
|
}
|
2024-11-13 16:30:51 +08:00
|
|
|
// 填充默认值
|
|
|
|
result.Default()
|
|
|
|
return ecode.OK()
|
|
|
|
}
|
|
|
|
|
|
|
|
func ReadQuery(ctx iris.Context, result ParamInterface) *ecode.Ecode {
|
|
|
|
ctx.ReadQuery(result)
|
|
|
|
err := GetValidator().Struct(result)
|
|
|
|
if err != nil {
|
|
|
|
validateErr := err.(validator.ValidationErrors)
|
|
|
|
firstValue := ""
|
|
|
|
for _, v := range validateErr.Translate(trans) {
|
|
|
|
firstValue = v
|
|
|
|
break // 退出循环,确保只获取第一个元素
|
|
|
|
}
|
|
|
|
return ecode.Set(255, firstValue)
|
|
|
|
}
|
|
|
|
result.Default()
|
2024-11-09 14:59:27 +08:00
|
|
|
return ecode.OK()
|
|
|
|
}
|