You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package CheckHandler
import (
"github.com/bluesky335/IDCheck/IdNumber"
"github.com/gin-gonic/gin"
"strings"
)
//在注释标签中声明的标识字符串X-IdCardLimit
var idcardLimit = "x-idcardlimit"
//形成一个map,用于O(1)速度获取到一个接口是不是需要进行判断拦截注意一个接口可以存在post+get两种形式所以map里面是一个数组需要遍历
type idcardLimitStruct struct {
parameterName string
httpType string
must bool
}
//长度限制的map,以string为key(key的命名是接口名+"_get" 或者 接口名+"_post"),里面是idcardLimitStruct形式的数组
var idcardLimitMap = make(map[string][]idcardLimitStruct)
/**
功能:功能函数,添当前的检查字典里
*/
func idcardAddToMap(d map[string]interface{}, t map[string]interface{}, k string, httpType string) {
var idcardLimitArray []idcardLimitStruct
d = t[httpType].(map[string]interface{})
if d != nil && d[idcardLimit] != nil {
for _, value := range d[idcardLimit].([]interface{}) {
var t idcardLimitStruct
t.parameterName = value.(string)
t.httpType = httpType
//此参数是否为必填写项
for _, v2 := range d["parameters"].([]interface{}) {
c2 := v2.(map[string]interface{})
for k2, v2 := range c2 {
if k2 == "required" {
t.must = v2.(bool) //标识是否是必须项
}
}
}
idcardLimitArray = append(idcardLimitArray, t)
}
idcardLimitMap[k+"_"+httpType] = idcardLimitArray
}
}
/**
功能:初始化身份证限制字典
*/
func idcardLimitInit(inter interface{}) map[string][]idcardLimitStruct {
//参数检查器
m := inter.(map[string]interface{})
n := m["paths"].(map[string]interface{})
for k, v := range n {
t := v.(map[string]interface{})
//参数长度检查器
var d map[string]interface{}
if t["get"] != nil {
idcardAddToMap(d, t, k, "get")
}
if t["post"] != nil {
idcardAddToMap(d, t, k, "post")
}
}
return idcardLimitMap
}
/**
功能:检查字符串是否是合法身份证号
作者:黄海
时间2020-03-17
*/
func idcardLimitIsLegal(c *gin.Context, interName string) (bool, ResultStruct) {
var resultStruct ResultStruct
//接口传入的请求方式:get?post?
codeHttpType := strings.ToLower(c.Request.Method)
//1、如果此接口地址需要进行参数长度检查
if emailLimitMap[interName+"_"+codeHttpType] != nil {
arr := idcardLimitMap[interName+"_"+codeHttpType]
resultStruct.InterfaceName = interName
//遍历arr
for i := 0; i < len(arr); i++ {
parameterName := arr[i].parameterName
httpType := arr[i].httpType
var p string
if httpType == "get" {
p = c.Query(parameterName)
} else {
p = c.PostForm(parameterName)
}
resultStruct.Parameter = parameterName
//为空,不需要检查,通过
if p == "" && !arr[i].must {
return true, resultStruct
}
//为空,需要检查,禁止
if p == "" && arr[i].must{
resultStruct.Message = "参数没有找到!"
return false, resultStruct
}
var id = IdNumber.New(p)
if !id.IsValid() {
resultStruct.HttpType = httpType
resultStruct.Message = "不是合法身份证号!"
return false, resultStruct
}
}
}
return true, resultStruct
}