package utils import ( "context" "encoding/base64" "encoding/json" uuid2 "github.com/google/uuid" "image/png" "net/url" "os" "qnc-server/db" "strings" "time" "unicode" "unicode/utf8" ) func IsJSON(s string) bool { var js interface{} return json.Unmarshal([]byte(s), &js) == nil } // 校验统一社会信用代码的函数 func ValidateUnifiedSocialCreditCode(code string) bool { if len(code) != 18 { return false } // 定义字符与对应的数值映射 charValues := map[rune]int{ '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24, 'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30, } // 定义权重因子 weights := []int{1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28} // 计算前 17 位与权重因子的乘积之和 sum := 0 for i, char := range code[:17] { if value, ok := charValues[char]; ok { sum += value * weights[i] } else { return false // 包含非法字符 } } // 计算校验码 mod := sum % 31 checkChar := '0' for k, v := range charValues { if v == (31-mod)%31 { checkChar = k break } } return unicode.ToUpper(rune(code[17])) == checkChar } func EncryptName(name string) string { // 获取名字的字符长度 nameLength := utf8.RuneCountInString(name) // 如果名字只有一个字,返回原始名字 if nameLength <= 1 { return name } // 将名字转换为rune切片 runes := []rune(name) // 如果名字是两个字,保留第一个字,第二个字加密 if nameLength == 2 { return string(runes[0]) + "*" } // 如果名字有三个或更多字,保留第一个和最后一个字,中间的加密 firstChar := string(runes[0]) lastChar := string(runes[nameLength-1]) // 中间的字用*代替 middleChars := strings.Repeat("*", nameLength-2) return firstChar + middleChars + lastChar } func EncryptIDCard(idCard string) string { if len(idCard) < 8 { return idCard // 如果身份证号码长度不足8位,则不进行加密 } midStart := (len(idCard) - 8) / 2 midEnd := midStart + 8 return idCard[:midStart] + "********" + idCard[midEnd:] } // 解析时间字符串为 time.Time func ParseTime(t string) (time.Time, error) { return time.Parse("15:04", t) } // 判断当前时间是否在指定时间范围内 func IsInTimeRange(start, end time.Time) bool { now := time.Now() start = time.Date(now.Year(), now.Month(), now.Day(), start.Hour(), start.Minute(), 0, 0, now.Location()) end = time.Date(now.Year(), now.Month(), now.Day(), end.Hour(), end.Minute(), 0, 0, now.Location()) if end.Before(start) { end = end.Add(24 * time.Hour) // 处理跨午夜的情况 } return now.After(start) && now.Before(end) } // decodeBase64ToPNG 将 Base64 字符串解码为 PNG 图片并保存为临时文件 func DecodeBase64ToPNG(encodedBase64Str string, fileName string) (string, error) { // 去掉 Base64 前缀,如 "data:image/png;base64," encodedBase64Str = strings.TrimPrefix(encodedBase64Str, "data:image/png;base64,") // 进行 URL 解码,恢复 encodeURIComponent 编码的数据 base64Str, err := url.QueryUnescape(encodedBase64Str) if err != nil { return "", err } // 解码 Base64 数据 data, err := base64.StdEncoding.DecodeString(base64Str) if err != nil { return "", err } // 创建 PNG 文件 file, err := os.Create(fileName) if err != nil { return "", err } defer file.Close() // 将解码后的字节流写入图片文件 img, err := png.Decode(strings.NewReader(string(data))) if err != nil { return "", err } // 将 PNG 编码写入文件 err = png.Encode(file, img) if err != nil { return "", err } return fileName, nil } func SetCacheData(ctx context.Context, data interface{}) (uuid string) { jsonData, _ := json.Marshal(data) // 生成一个唯一的UUID uniqueID := uuid2.New().String() db.RedisClient.Set(ctx, uniqueID, jsonData, 5*time.Minute) return uniqueID } func GetCacheData(ctx context.Context, uniqueID string) (data interface{}, err error) { val, err := db.RedisClient.Get(ctx, uniqueID).Result() if err != nil { return nil, err } err = json.Unmarshal([]byte(val), &data) if err != nil { return nil, err } return data, nil }