updete
Some checks failed
Build Multi-Platform Binaries / build-frontend (push) Successful in 30s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Successful in 1m4s
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Successful in 45s
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Successful in 1m29s
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Successful in 45s
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Successful in 1m27s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Successful in 50s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Successful in 1m42s
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Has been cancelled
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Has been cancelled
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Has been cancelled
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Has been cancelled

This commit is contained in:
2026-01-02 01:59:44 +08:00
parent 82c1a6a266
commit f46741a84b
44 changed files with 10502 additions and 1486 deletions

View File

@@ -0,0 +1,106 @@
package router
import (
"errors"
"net/http"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// ValidationError 验证错误详情
type ValidationError struct {
Field string `json:"field"` // 字段名
Message string `json:"message"` // 错误消息
}
// HandleValidationError 处理验证错误并返回统一格式
func HandleValidationError(c *gin.Context, err error) {
var ve validator.ValidationErrors
if errors.As(err, &ve) {
errs := make([]ValidationError, len(ve))
for i, fe := range ve {
errs[i] = ValidationError{
Field: fe.Field(),
Message: getValidationMessage(fe),
}
}
c.JSON(http.StatusBadRequest, Response{
Code: CodeBadRequest,
Message: "validation failed",
Data: errs,
})
return
}
// 非验证错误,返回通用错误消息
BadRequest(c, err.Error())
}
// getValidationMessage 根据验证标签返回友好的错误消息
func getValidationMessage(fe validator.FieldError) string {
switch fe.Tag() {
case "required":
return "this field is required"
case "min":
return "value is too short or too small"
case "max":
return "value is too long or too large"
case "email":
return "invalid email format"
case "url":
return "invalid URL format"
case "oneof":
return "value must be one of: " + fe.Param()
case "alphanum":
return "must contain only letters and numbers"
case "alphanumunicode":
return "must contain only letters, numbers and unicode characters"
case "ip":
return "invalid IP address"
case "hostname":
return "invalid hostname"
case "clientid":
return "must be 1-64 alphanumeric characters, underscore or hyphen"
case "gte":
return "value must be greater than or equal to " + fe.Param()
case "lte":
return "value must be less than or equal to " + fe.Param()
case "gt":
return "value must be greater than " + fe.Param()
case "lt":
return "value must be less than " + fe.Param()
default:
return "validation failed on " + fe.Tag()
}
}
// BindJSON 绑定 JSON 并自动处理验证错误
// 返回 true 表示绑定成功false 表示已处理错误响应
func BindJSON(c *gin.Context, obj interface{}) bool {
if err := c.ShouldBindJSON(obj); err != nil {
HandleValidationError(c, err)
return false
}
return true
}
// BindQuery 绑定查询参数并自动处理验证错误
// 返回 true 表示绑定成功false 表示已处理错误响应
func BindQuery(c *gin.Context, obj interface{}) bool {
if err := c.ShouldBindQuery(obj); err != nil {
HandleValidationError(c, err)
return false
}
return true
}
// BindURI 绑定 URI 参数并自动处理验证错误
// 返回 true 表示绑定成功false 表示已处理错误响应
func BindURI(c *gin.Context, obj interface{}) bool {
if err := c.ShouldBindUri(obj); err != nil {
HandleValidationError(c, err)
return false
}
return true
}