1 Star 0 Fork 25

泊舟 / gfstudy

forked from goflyfox / gfstudy 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
15.GoFrame登录实战之数据校验.md 8.15 KB
一键复制 编辑 原始数据 按行查看 历史
zcool321@sina.com 提交于 2020-04-19 02:42 . update gvalid doc

GoFrame登录实战之数据校验

一、校验规则

gvalid模块实现了非常强大的数据校验功能,封装了40种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、支持struct tag规则及提示信息绑定等特性,是目前功能最强大的Go数据校验模块。

校验规则:

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.02
date-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                             说明:公民身份证号码
luhn                 格式:luhn                                  说明:银行号验证
qq                   格式:qq                                    说明:腾讯QQ号码
ip                   格式:ip                                    说明:IPv4/IPv6地址
ipv4                 格式:ipv4                                  说明:IPv4地址
ipv6                 格式:ipv6                                  说明:IPv6地址
mac                  格式:mac                                   说明:MAC地址
url                  格式:url                                   说明:URL
domain               格式:domain                                说明:域名
length               格式:length:min,max                        说明:参数长度为min到max(长度参数为整形),注意中文一个汉字占3字节
min-length           格式:min-length:min                        说明:参数长度最小为min(长度参数为整形),注意中文一个汉字占3字节
max-length           格式:max-length:max                        说明:参数长度最大为max(长度参数为整形),注意中文一个汉字占3字节
between              格式:between:min,max                       说明:参数大小为min到max(支持整形和浮点类型参数)
min                  格式:min:min                               说明:参数最小为min(支持整形和浮点类型参数)
max                  格式:max:max                               说明:参数最大为max(支持整形和浮点类型参数)
json                 格式:json                                  说明:判断数据格式为JSON
integer              格式: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

二、校验方法

  1. Check方法用于单条数据校验,比较简单;
  2. CheckMap方法用于多条数据校验,校验的主体变量为map类型;
  3. CheckStruct方法用于多条数据校验,校验的主体变量为结构体对象类型;
  4. Check*方法只有在返回nil的情况下,表示数据校验成功,否则返回校验出错的错误信息对象指针*Error

三、校验结果

校验结果为一个Error对象指针。以下为对象方法:

  1. FirstItem 在有多个键名/属性校验错误的时候,用以获取出错的第一个键名,以及其对应的出错规则和错误信息;其顺序性只有使用顺序校验规则时有效,否则返回的结果是随机的;
  2. FirstRule 会返回FirstItem中得第一条出错的规则及错误信息;
  3. FirstString 会返回FirstRule中得第一条规则错误信息;
  4. Map 会返回FirstItem中得出错自规则及对应错误信息map;
  5. Maps 会返回所有的出错键名及对应的出错规则及对应的错误信息(map[string]map[string]string);
  6. String 会返回所有的错误信息,构成一条字符串返回,多个规则错误信息之间以;符号连接;
  7. Strings 会返回所有的错误信息,构成[]string类型返回;

四、示例

valid_test.go

package main

import (
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gvalid"
	"testing"
)

// 单条校验
func TestCheck(t *testing.T) {
	rule := "length:6,16"
	if m := gvalid.Check("12345", rule, nil); m != nil {
		t.Log(m)
	} else {
		t.Log("check ok!")
	}
}

// map校验
func TestCheckMap(t *testing.T) {
	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":     "两次密码输入不相等",
		},
	}
	if e := gvalid.CheckMap(params, rules, msgs); e != nil {
		g.Dump(e.Map())
		g.Dump(e.Maps())
	} else {
		t.Log("check ok!")
	}
}

// 对象校验
func TestCheckStruct(t *testing.T) {
	type User struct {
		Uid   int    `gvalid:"uid      @integer|min:1#用户UID不能为空"`
		Name  string `gvalid:"name     @required|length:6,30#请输入用户名称|用户名称长度非法"`
	}

	user := &User{
		Name:  "john",
	}

	// 使用结构体定义的校验规则和错误提示进行校验
	g.Dump(gvalid.CheckStruct(user, nil).Map())

}
1
https://gitee.com/ylmtest/gfstudy.git
git@gitee.com:ylmtest/gfstudy.git
ylmtest
gfstudy
gfstudy
master

搜索帮助