140 lines
4.1 KiB
Go
140 lines
4.1 KiB
Go
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
|
||
}
|