参数验证 规则中,required表示必传参数,有无值则是另外一回事 验证规则有以下(大小写不敏感): 1、required 参数必传,有无值则是另外一回事,使用示例:"required" 1、unempty 值不能为空,使用示例:"unempty" 2、min 最小值验证,使用示例:"min:1" 3、max 最大值验证,使用示例:"max:1000" 4、minlen、mincount 最小长度验证,使用示例:"minlen:2" 说明:count是字符个数校验,len是字节个数校验,如"地球",如果是len,则是6个
(params url.Values, rules map[string][]string)
| 77 | //@return 返回验证后通过的数据 |
| 78 | //@return 返回错误的map |
| 79 | func Valid(params url.Values, rules map[string][]string) (map[string]interface{}, map[string]string) { |
| 80 | var ( |
| 81 | data map[string]interface{} |
| 82 | err error |
| 83 | errmsg map[string]string |
| 84 | //可以执行类型转换的数据类型 |
| 85 | typeConvertStr = "int,int8,int32,int64,float32,float64,string" |
| 86 | ) |
| 87 | data = make(map[string]interface{}) |
| 88 | errmsg = make(map[string]string) |
| 89 | |
| 90 | //为0的字符串和不为0的字符串做数字解析后为0,两种效果是不一样的 |
| 91 | for key, slice := range rules { |
| 92 | var errs []string |
| 93 | //如果没有验证规则,则值有则接收,无则不理会 |
| 94 | l := len(slice) |
| 95 | if l == 0 { |
| 96 | //如果这个key没有对应规则,key存在,则取值,不存在,则不取 |
| 97 | if v, ok := params[key]; ok { |
| 98 | data[key] = v[0] |
| 99 | } |
| 100 | } else { |
| 101 | //是否必传 |
| 102 | IsReuqired := false |
| 103 | for _, v := range slice { |
| 104 | v = strings.ToLower(v) |
| 105 | if v == "required" { |
| 106 | IsReuqired = true |
| 107 | break |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | //必填字段,也就是key必须传递过来 |
| 112 | if IsReuqired { |
| 113 | if v, ok := params[key]; ok { |
| 114 | data[key] = v[0] |
| 115 | } else { |
| 116 | errs = append(errs, fmt.Sprintf("%v参数必传", key)) |
| 117 | } |
| 118 | } |
| 119 | //非必须的情况下,有传递则直接验证 |
| 120 | if param, ok := params[key]; ok { |
| 121 | v := param[0] |
| 122 | //数据验证 |
| 123 | for _, item := range slice { |
| 124 | //规则切分,如range:1:10 |
| 125 | itemSlice := strings.Split(item, ":") |
| 126 | err = execValid(v, itemSlice[0], itemSlice[1:]...) |
| 127 | if err == nil { |
| 128 | data[key] = v |
| 129 | } else { |
| 130 | errs = append(errs, err.Error()) |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | //类型转换 |
| 135 | for _, item := range slice { |
| 136 | //规则切分,如range:1:10 |
nothing calls this directly
no test coverage detected