80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package util
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
qrcode "github.com/skip2/go-qrcode"
|
|
"github.com/spf13/cast"
|
|
"math/rand"
|
|
"regexp"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func RandomStr(length int) string {
|
|
str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
bytes := []byte(str)
|
|
result := []byte{}
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
for i := 0; i < length; i++ {
|
|
result = append(result, bytes[r.Intn(len(bytes))])
|
|
}
|
|
return string(result)
|
|
}
|
|
|
|
func CutTail(str string, length int) string {
|
|
if len(str) <= length {
|
|
return str
|
|
}
|
|
|
|
return str[0:length]
|
|
}
|
|
|
|
func FloatCut(f float64) float64 {
|
|
return cast.ToFloat64(fmt.Sprintf("%.2f", f))
|
|
}
|
|
|
|
func CreateQrcodeBase64V2(content string, level qrcode.RecoveryLevel, size int) (string, error) {
|
|
var png []byte
|
|
//固定方法
|
|
png, err := qrcode.Encode(content, level, size)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
//文件流需要使用base64编码后才可使用
|
|
return base64.StdEncoding.EncodeToString(png), nil
|
|
}
|
|
|
|
// ValidateIDCard 校验 18 位身份证号码
|
|
func ValidateIDCard(idCard string) bool {
|
|
// 检查长度是否为 18 位
|
|
if len(idCard) != 18 {
|
|
return false
|
|
}
|
|
// 检查前 17 位是否为数字
|
|
pattern := `^\d{17}[0-9Xx]$`
|
|
match, _ := regexp.MatchString(pattern, idCard)
|
|
if !match {
|
|
return false
|
|
}
|
|
// 加权因子
|
|
weight := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
|
|
// 校验码对应值
|
|
checkCodeList := []string{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}
|
|
// 计算前 17 位加权和
|
|
sum := 0
|
|
for i := 0; i < 17; i++ {
|
|
num, _ := strconv.Atoi(string(idCard[i]))
|
|
sum += num * weight[i]
|
|
}
|
|
// 计算校验码
|
|
index := sum % 11
|
|
checkCode := checkCodeList[index]
|
|
// 比较校验码
|
|
lastChar := string(idCard[17])
|
|
if lastChar == "x" {
|
|
lastChar = "X"
|
|
}
|
|
return lastChar == checkCode
|
|
}
|