Files
2024-08-30 11:55:19 +08:00

140 lines
4.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package request
import (
"encoding/json"
req_validator "energy-management-system/request/validator"
"energy-management-system/utils/code"
"energy-management-system/utils/exception"
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
"strconv"
)
// Trans 定义一个全局翻译器T
//var trans ut.Translator
//var validate *validator.Validate
//var ok bool
// InitTrans 初始化翻译器
//func InitTrans(locale ...string) {
// if len(locale) == 0 {
// locale = []string{"zh"}
// }
// // 修改gin框架中的Validator引擎属性实现自定制
// if validate, ok = binding.Validator.Engine().(*validator.Validate); ok {
//
// // zi
// //validate.SetTagName("ss")
//
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
// if name == "-" || name == "_" {
// return ""
// }
// return name
// })
//
// // 第一个参数是备用fallback的语言环境
// uni := ut.New(en.New(), zh.New())
// trans, _ = uni.FindTranslator(locale[0])
// // 注册翻译器
// err := zhTranslations.RegisterDefaultTranslations(validate, trans)
//
// // 注册自定义验证
// validate.RegisterValidation("mobile", func(fl validator.FieldLevel) bool {
// regRuler := "^1[3456789]{1}\\d{9}$"
// reg := regexp.MustCompile(regRuler)
// return reg.MatchString(fl.Field().String())
// })
//
// // 注册自定义验证的翻译
// validate.RegisterTranslation("mobile", trans, func(ut ut.Translator) error {
// return ut.Add("mobile", "手机号错误!", true)
// }, func(ut ut.Translator, fe validator.FieldError) string {
// t, _ := ut.T("mobile", fe.Field())
// return t
// })
//
// if err != nil {
// fmt.Printf("[-]自定义gin验证器失败: %s \n", err)
// os.Exit(0)
// }
// }
//}
//func BindJson(c *gin.Context, f interface{}) {
// dealWithError(c.ShouldBindJSON(f), "JSON")
//}
//func BindJsonWith(c *gin.Context, f interface{}) {
// dealWithError(c.ShouldBindBodyWith(f, binding.JSON), "JSON")
//}
//func BindParam(c *gin.Context, f interface{}) {
// dealWithError(c.ShouldBindQuery(f), "FORM")
//}
//
//func dealWithError(err error, t string) {
// if err != nil {
// var validationErrors validator.ValidationErrors
// var unmarshalTypeError *json.UnmarshalTypeError
// var numError *strconv.NumError
// switch {
// case errors.As(err, &validationErrors):
// exception.PanicMsg(removeTopStruct(err.(validator.ValidationErrors).Translate(trans)))
// case errors.As(err, &unmarshalTypeError):
// exception.PanicCodeMsg(code.PARAMETER_ERROR, err.(*json.UnmarshalTypeError).Field+": 类型错误")
// case errors.As(err, &numError):
// exception.PanicCodeMsg(code.PARAMETER_ERROR, err.(*strconv.NumError).Num+": 类型错误")
// default:
// exception.PanicCodeMsg(code.PARAMETER_ERROR, fmt.Sprintf("请将参数放于%s中传递: ", t)+err.Error())
// }
// }
//}
//
//func removeTopStruct(fields map[string]string) (re []string) {
// for _, err := range fields {
// re = append(re, err)
// }
// return
//}
func BindJson(c *gin.Context, f any) {
err := c.ShouldBindJSON(f)
//if gin.IsDebugging() {
// c.Set("_req", f)
//doc.SetReq(c, f)
//}
DealValidError(err, "JSON")
}
func BindJsonWith(c *gin.Context, f any) {
DealValidError(c.ShouldBindBodyWith(f, binding.JSON), "JSON")
}
func BindParam(c *gin.Context, f any) {
err := c.ShouldBindQuery(f)
//doc.SetReq(c, f)
DealValidError(err, "FORM")
}
func DealValidError(err error, t string) {
if err != nil {
switch err.(type) {
case validator.ValidationErrors:
exception.PM(RemoveTopStruct(err.(validator.ValidationErrors).Translate(req_validator.Trans)))
case *json.UnmarshalTypeError:
exception.PMC(err.(*json.UnmarshalTypeError).Field+": 类型错误", code.PARAMETER_ERROR)
case *strconv.NumError:
exception.PMC(err.(*strconv.NumError).Num+": 类型错误", code.PARAMETER_ERROR)
default:
exception.PMC(fmt.Sprintf("请将参数放于%s中传递: ", t)+err.Error(), code.PARAMETER_ERROR)
}
}
}
func RemoveTopStruct(fields map[string]string) (re []string) {
for _, err := range fields {
re = append(re, err)
}
return
}