gf框架之gvalid – 強大靈活的數據校驗/表單校驗模塊

文章來源:http://gf.johng.cn/494378git

gf提供了很是強大易用的數據校驗功能,經過gvalid包提供,封裝了40種經常使用的校驗規則,支持單數據多規則校驗、多數據多規則批量校驗、自定義錯誤信息、自定義正則校驗等特性。因爲gf是模塊化、低耦合設計,gvalid包也能夠在項目中單獨引入使用。shell

使用方式:json

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.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                             說明:公民身份證號碼
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(長度參數爲整形)
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                                  說明:判斷數據格式爲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

校驗方法

校驗方法列表:less

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

Check*方法只有在返回nil的狀況下,表示數據校驗成功,不然返回校驗出錯的數據項(CheckMap)以及對應的規則和錯誤信息的map,具體請查看後續示例代碼才能更好理解。dom

使用示例

下面咱們來舉幾個例子,看看如何使用gvalid來實現數據校驗。模塊化

單數據校驗 - Check

一、校驗數據長度,使用默認的錯誤提示post

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個字符]

二、校驗數據類型及大小,而且使用自定義的錯誤提示ui

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地址]

三、使用自定義正則校驗數據格式,使用默認錯誤提示

// 參數長度至少爲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方法實現。

一、多數據多規則校驗,使用默認錯誤提示

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:字段值不合法]]

二、多數據多規則校驗,使用自定義錯誤提示

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"                : "字段值不合法",
}
相關文章
相關標籤/搜索