- 新增基于结构体标签的验证器实现 - 实现必填和最小值验证规则- 在名称处理器中集成验证逻辑 - 添加验证错误页面模板- 注册默认验证服务 - 创建名称输入表单模板 - 为 NewName 结构体添加验证标签
57 lines
1.5 KiB
Go
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
|
|
}
|