博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gf框架之gvalid – 强大灵活的数据校验/表单校验模块
阅读量:6495 次
发布时间:2019-06-24

本文共 9115 字,大约阅读时间需要 30 分钟。

文章来源:

gf提供了非常强大易用的数据校验功能,通过gvalid包提供,封装了40种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验等特性。由于gf是模块化、低耦合设计,gvalid包也可以在项目中单独引入使用。

使用方式:

import "gitee.com/johng/gf/g/util/gvalid"

校验规则

40种常用的校验规则:

required             格式:required                              说明:必需参数required-if          格式:required-if:field,value,...           说明:必需参数(当任意所给定字段值与所给值相等时,即:当field字段的值为value时,当前验证字段为必须参数)required-unless      格式:required-unless:field,value,...       说明:必需参数(当所给定字段值与所给值都不相等时,即:当field字段的值不为value时,当前验证字段为必须参数)required-with        格式:required-with:field1,field2,...       说明:必需参数(当所给定任意字段值不为空时)required-with-all    格式:required-with-all:field1,field2,...   说明:必须参数(当所给定所有字段值都不为空时)required-without     格式:required-without:field1,field2,...    说明:必需参数(当所给定任意字段值为空时)required-without-all 格式:required-without-all:field1,field2,...说明:必须参数(当所给定所有字段值都为空时)date                 格式:date                                  说明:参数为常用日期类型,格式:2006-01-02, 20060102, 2006.01.02date-format          格式:date-format:format                    说明:判断日期是否为指定的日期格式,format为Go日期格式(可以包含时间)email                格式:email                                 说明:EMAIL邮箱地址phone                格式:phone                                 说明:手机号telephone            格式:telephone                             说明:国内座机电话号码,"XXXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"、"XXXXXXXX"passport             格式:passport                              说明:通用帐号规则(字母开头,只能包含字母、数字和下划线,长度在6~18之间)password             格式:password                              说明:通用密码(任意可见字符,长度在6~18之间)password2            格式:password2                             说明:中等强度密码(在弱密码的基础上,必须包含大小写字母和数字)password3            格式:password3                             说明:强等强度密码(在弱密码的基础上,必须包含大小写字母、数字和特殊字符)postcode             格式:postcode                              说明:中国邮政编码id-number            格式:id-number                             说明:公民身份证号码qq                   格式:qq                                    说明:腾讯QQ号码ip                   格式:ip                                    说明:IPv4/IPv6地址ipv4                 格式:ipv4                                  说明:IPv4地址ipv6                 格式:ipv6                                  说明:IPv6地址mac                  格式:mac                                   说明:MAC地址url                  格式:url                                   说明:URLdomain               格式:domain                                说明:域名length               格式:length:min,max                        说明:参数长度为min到max(长度参数为整形)min-length           格式:min-length:min                        说明:参数长度最小为min(长度参数为整形)max-length           格式:max-length:max                        说明:参数长度最大为max(长度参数为整形)between              格式:between:min,max                       说明:参数大小为min到max(支持整形和浮点类型参数)min                  格式:min:min                               说明:参数最小为min(支持整形和浮点类型参数)max                  格式:max:max                               说明:参数最大为max(支持整形和浮点类型参数)json                 格式:json                                  说明:判断数据格式为JSONinteger              格式:integer                               说明:整数float                格式:float                                 说明:浮点数boolean              格式:boolean                               说明:布尔值(1,true,on,yes:true | 0,false,off,no,"":false)same                 格式:same:field                            说明:参数值必需与field参数的值相同different            格式:different:field                       说明:参数值不能与field参数的值相同in                   格式:in:value1,value2,...                  说明:参数值应该在value1,value2,...中(字符串匹配)not-in               格式:not-in:value1,value2,...              说明:参数值不应该在value1,value2,...中(字符串匹配)regex                格式:regex:pattern                         说明:参数值应当满足正则匹配规则pattern

校验方法

校验方法列表:

func Check(val interface{}, rules string, msgs interface{}, params ...map[string]interface{}) map[string]stringfunc CheckMap(params map[string]interface{}, rules map[string]string, msgs ...map[string]interface{}) map[string]map[string]stringfunc CheckObject(object interface{}, rules map[string]string, msgs ...map[string]interface{}) map[string]map[string]stringfunc SetDefaultErrorMsgs(msgs map[string]string)

Check*方法只有在返回nil的情况下,表示数据校验成功,否则返回校验出错的数据项(CheckMap)以及对应的规则和错误信息的map,具体请查看后续示例代码才能更好理解。

使用示例

下面我们来举几个例子,看看如何使用gvalid来实现数据校验。

单数据校验 - Check

1、校验数据长度,使用默认的错误提示

rule := "length:6,16"if m := gvalid.Check("123456", rule);  m != nil {    fmt.Println(m)}if m := gvalid.Check("12345", rule);  m != nil {    fmt.Println(m)}// 输出: map[length:字段长度为6到16个字符]

2、校验数据类型及大小,并且使用自定义的错误提示

rule := "integer|between:6,16"msgs := "请输入一个整数|参数大小不对啊老铁"fmt.Println(gvalid.Check(5.66, rule, msgs))// 输出: map[integer:请输入一个整数 between:参数大小不对啊老铁]

可以看到,多个规则以及多个自定义错误提示之间使用英文“|”号进行分割,注意自定义错误提示的顺序和多规则的顺序一一对应。msgs参数除了支持string类型以外,还支持map[string]string类型,请看以下例子:

rule := "url|min-length:11"msgs := map[string]string{    "url"       : "请输入正确的URL地址",    "minlength" : "地址长度至少为:min位"}fmt.Println(gvalid.Check("http://johngcn", rule, msgs))// 输出: map[url:请输入正确的URL地址]

3、使用自定义正则校验数据格式,使用默认错误提示

// 参数长度至少为6个数字或者6个字母,但是总长度不能超过16个字符rule := `regex:\d{6,}|\D{6,}|max-length:16`if m := gvalid.Check("123456", rule);  m != nil {    fmt.Println(m)}if m := gvalid.Check("abcde6", rule);  m != nil {    fmt.Println(m)}// 输出: map[regex:字段值不合法]

多数据校验 - CheckMap

gvalid支持对多数据进行校验,支持map和struct类型,分别使用CheckMap和CheckObject方法实现。

1、多数据多规则校验,使用默认错误提示

params := map[string]interface{} {    "passport"  : "john",    "password"  : "123456",    "password2" : "1234567",}rules := map[string]string {    "passport"  : "required|length:6,16",    "password"  : "required|length:6,16|same:password2",    "password2" : "required|length:6,16",}fmt.Println(gvalid.CheckMap(params, rules))// 输出: map[passport:map[length:字段长度为6到16个字符] password:map[same:字段值不合法]]

2、多数据多规则校验,使用自定义错误提示

params := map[string]interface{} {    "passport"  : "john",    "password"  : "123456",    "password2" : "1234567",}rules := map[string]string {    "passport"  : "required|length:6,16",    "password"  : "required|length:6,16|same:password2",    "password2" : "required|length:6,16",}msgs  := map[string]interface{} {    "passport" : "账号不能为空|账号长度应当在:min到:max之间",    "password" : map[string]string {        "required" : "密码不能为空",        "same"     : "两次密码输入不相等",    },}fmt.Println(gvalid.CheckMap(params, rules, msgs))// 输出: map[passport:map[length:账号长度应当在6到16之间] password:map[same:两次密码输入不相等]]

该示例同时也展示了自定义错误传递的两种数据类型,string或者map[string]string。其中map[string]string类型参数需要指定对应字段、对应规则的错误提示信息,是一个二维的“关联数组”。

多数据校验 - CheckObject

CheckObject的使用方式同CheckMap,除了第一个参数为struct类型的对象(也可以是对象指针)。但是需要注意的一个细节是,struct的属性会有默认值,因此某些情况下会引起required规则的失效,因此根据实际情况配合多种规则一起校验会是一个比较严谨的做法。

type Object struct {    Name string    Age  int}rules := map[string]string {    "Name" : "required|length:6,16",    "Age"  : "between:18,30",}msgs  := map[string]interface{} {    "Name" : map[string]string {        "required" : "名称不能为空",        "length"   : "名称长度为:min到:max个字符",    },    "Age"  : "年龄为18到30周岁",}obj := Object{Name : "john"}// 也可以是// obj := &Object{Name : "john"}fmt.Println(gvalid.CheckObject(obj, rules, msgs))// 输出: map[Age:map[between:年龄为18到30周岁] Name:map[length:名称长度为6到16个字符]]

在以上示例中,Age属性由于默认值0的存在,因此会引起required规则的失效,因此这里没有使用required规则而是使用between规则来进行校验。

错误提示

任何时候,我们都可以通过gvalid.SetDefaultErrorMsgs方法来批量设置默认的错误提示信息(特别是针对多语言环境中),但是需要注意的是,修改是全局变化的,请注意可能会对其他模块校验信息的影响。通常建议为针对特定的校验单独配置不同的校验错误提示信息。默认的错误提示如下:

var defaultMessages = map[string]string {    "required"             : "字段不能为空",    "required-if"          : "字段不能为空",    "required-unless"      : "字段不能为空",    "required-with"        : "字段不能为空",    "required-with-all"    : "字段不能为空",    "required-without"     : "字段不能为空",    "required-without-all" : "字段不能为空",    "date"                 : "日期格式不正确",    "date-format"          : "日期格式不正确",    "email"                : "邮箱地址格式不正确",    "phone"                : "手机号码格式不正确",    "telephone"            : "电话号码格式不正确",    "passport"             : "账号格式不合法,必需以字母开头,只能包含字母、数字和下划线,长度在6~18之间",    "password"             : "密码格式不合法,密码格式为任意6-18位的可见字符",    "password2"            : "密码格式不合法,密码格式为任意6-18位的可见字符,必须包含大小写字母和数字",    "password3"            : "密码格式不合法,密码格式为任意6-18位的可见字符,必须包含大小写字母、数字和特殊字符",    "postcode"             : "邮政编码不正确",    "id-number"            : "身份证号码不正确",    "qq"                   : "QQ号码格式不正确",    "ip"                   : "IP地址格式不正确",    "ipv4"                 : "IPv4地址格式不正确",    "ipv6"                 : "IPv6地址格式不正确",    "mac"                  : "MAC地址格式不正确",    "url"                  : "URL地址格式不正确",    "domain"               : "域名格式不正确",    "length"               : "字段长度为:min到:max个字符",    "min-length"           : "字段最小长度为:min",    "max-length"           : "字段最大长度为:max",    "between"              : "字段大小为:min到:max",    "min"                  : "字段最小值为:min",    "max"                  : "字段最大值为:max",    "json"                 : "字段应当为JSON格式",    "xml"                  : "字段应当为XML格式",    "array"                : "字段应当为数组",    "integer"              : "字段应当为整数",    "float"                : "字段应当为浮点数",    "boolean"              : "字段应当为布尔值",    "same"                 : "字段值不合法",    "different"            : "字段值不合法",    "in"                   : "字段值不合法",    "not-in"               : "字段值不合法",    "regex"                : "字段值不合法",}

转载地址:http://douyo.baihongyu.com/

你可能感兴趣的文章
Solr启动和结束命令
查看>>
thymeleaf 知多少
查看>>
1.12 xshell密钥认证
查看>>
3.2 用户组管理
查看>>
awk
查看>>
AliOS Things SMP系统及其在esp32上实现示例
查看>>
关于用户的操作:添加用户,删除用户,更改用户属性
查看>>
定制rpm包及搭建yum仓库
查看>>
zabbix 报警小案例
查看>>
CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器
查看>>
shell ping 网段 多进程(很简单,喜欢就拿去用)
查看>>
枚举类、单实例
查看>>
正则参考
查看>>
C语言及程序设计 实践项目——C语言程序初体验
查看>>
我的友情链接
查看>>
Windows下如何卸载一个服务
查看>>
使用Spring AOP切面解决数据库读写分离
查看>>
【java集合框架源码剖析系列】java源码剖析之HashSet
查看>>
《梦断代码》读书笔记一
查看>>
1_node.js
查看>>