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 }