Files
yanzuoguang 61ea4a3f35 feat(validation): 添加表单验证功能并集成到名称处理器
- 新增基于结构体标签的验证器实现
- 实现必填和最小值验证规则- 在名称处理器中集成验证逻辑
- 添加验证错误页面模板- 注册默认验证服务
- 创建名称输入表单模板
- 为 NewName 结构体添加验证标签
2025-11-06 21:58:21 +08:00

57 lines
1.5 KiB
Go

package validation
import (
"fmt"
"strconv"
)
type Validator interface {
Validate(data interface{}) (ok bool, errs []ValidatorError)
}
// ValidatorError 验证错误
type ValidatorError struct {
FieldName string
Error error
}
type ValidatorFunc func(fieldName string, value interface{}, arg string) (bool, error)
func DefaultValidators() map[string]ValidatorFunc {
return map[string]ValidatorFunc{
"required": required,
"min": minValue,
}
}
func required(fieldName string, value interface{}, arg string) (valid bool, err error) {
if str, ok := value.(string); ok {
valid = str != ""
err = fmt.Errorf("字段 %v 不能为空", fieldName)
return
} else {
err = fmt.Errorf("字段 %v 必须为字符串", fieldName)
}
return
}
func minValue(fieldName string, value interface{}, arg string) (valid bool, err error) {
minVal, err := strconv.Atoi(arg)
if err != nil {
err = fmt.Errorf("字段 %v 的配置参数 %v 必须为数字", fieldName, arg)
return
}
if iVal, iValOk := value.(int); iValOk {
valid = iVal >= minVal
err = fmt.Errorf("字段 %v 的值不能小于 %v", fieldName, minVal)
} else if fVal, fValOk := value.(float64); fValOk {
valid = fVal >= float64(minVal)
err = fmt.Errorf("字段 %v 的值不能小于 %v", fieldName, minVal)
} else if sVal, sValOk := value.(string); sValOk {
err = fmt.Errorf("字段 %v 的值长度不能小于 %v", fieldName, minVal)
valid = len(sVal) >= minVal
} else {
err = fmt.Errorf("字段 %v 的值类型必须为int,float,string", fieldName)
}
return
}