package util import ( "bytes" "crypto/md5" "crypto/rand" "database/sql" "encoding/hex" "fmt" "image" "io/ioutil" "math/big" "net/http" "regexp" "strings" "time" "authService/cache" "authService/model" "authService/model/types" "github.com/gin-gonic/gin" "github.com/joho/godotenv" jsoniter "github.com/json-iterator/go" "github.com/speps/go-hashids/v2" ) // php序列化的对象转map之后,key值会有特定的字节前缀导致无法解析,需要去掉 func PhpMap2Go(in map[string]interface{}) map[string]interface{} { result := make(map[string]interface{}) for i, v := range in { tmpi := []byte(i) if tmpi[0] == 0 && tmpi[1] == 42 && tmpi[2] == 0 { result[string(tmpi[3:])] = v } else { result[i] = v } } return result } func GetRequestParam(c *gin.Context, key string) string { if c.Request.Method == http.MethodGet { return c.Query(key) } else { // 如果是Json格式 if c.Request.Header.Get("Content-Type") == "application/json" { JsonData := GetRequestJsonData(c) // 判断类型 if _, ok := JsonData[key].(string); !ok { return "" } return JsonData[key].(string) } return c.PostForm(key) } } func GetRequestJsonData(c *gin.Context) map[string]any { data, _ := c.GetRawData() var body map[string]any _ = json.Unmarshal(data, &body) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) return body } func GetPostFormParams(c *gin.Context) (map[string]any, error) { var postMap = make(map[string]any, len(c.Request.PostForm)) for k, v := range c.Request.PostForm { if len(v) > 1 { postMap[k] = v } else if len(v) == 1 { postMap[k] = v[0] } } return postMap, nil } // 将ID编译为HashId func GetHashId(id int64, salt string) string { hd := hashids.NewData() hd.Salt = salt hd.MinLength = 8 h, _ := hashids.NewWithData(hd) hashId, _ := h.Encode([]int{int(id)}) return hashId } // 根据HashId获取真实ID func GetIdByHashId(hashId string, salt string) (int64, error) { hd := hashids.NewData() hd.Salt = salt hd.MinLength = 8 h, _ := hashids.NewWithData(hd) d, err := h.DecodeWithError(hashId) if err != nil { return 0, err } return int64(d[0]), nil } func GetFromGinContext[T any](ctx *gin.Context, key string) (T, bool) { var some T value, exist := ctx.Get(key) if !exist { return some, false } some, ok := value.(T) if !ok { return some, false } return some, true } // MD5加密 func Md5(src string) string { m := md5.New() m.Write([]byte(src + "3OTBF91KlFGMdrDn")) res := hex.EncodeToString(m.Sum(nil)) return res } // 获取随机数 func GetRandomNumber() string { result, _ := rand.Int(rand.Reader, big.NewInt(9999)) return fmt.Sprintf("%04d", result) } // 转为sql.NullTime func ToNullTime(t time.Time) types.NullTime { return types.NullTime{NullTime: sql.NullTime{Time: t, Valid: !t.IsZero()}} } // 数据脱敏 func HideStar(str string) (result string) { if str == "" { return "" } if strings.Contains(str, "@") { // 邮箱 res := strings.Split(str, "@") if len(res[0]) < 3 { resString := "***" result = resString + "@" + res[1] } else { res2 := Substr2(str, 0, 3) resString := res2 + "***" result = resString + "@" + res[1] } return result } else { reg := `^1[0-9]\d{9}$` rgx := regexp.MustCompile(reg) mobileMatch := rgx.MatchString(str) if mobileMatch { // 手机号 result = Substr2(str, 0, 3) + "****" + Substr2(str, 7, 11) } else { nameRune := []rune(str) lens := len(nameRune) if lens <= 1 { result = "***" } else if lens == 2 { result = string(nameRune[:1]) + "*" } else if lens == 3 { result = string(nameRune[:1]) + "*" + string(nameRune[2:3]) } else if lens == 4 { result = string(nameRune[:1]) + "**" + string(nameRune[lens-1:lens]) } else if lens > 4 { result = string(nameRune[:2]) + "***" + string(nameRune[lens-2:lens]) } } return } } func Substr2(str string, start int, end int) string { rs := []rune(str) return string(rs[start:end]) } // 读取远程文件 func ReadImageData(url string) image.Image { resp, err := http.Get(url) if err != nil { return nil } defer resp.Body.Close() img, _, err := image.Decode(resp.Body) if err != nil { return nil } return img } // 获取随机字符串 func RandString(n int) string { var longLetters = []byte("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ=_") if n <= 0 { return "" } b := make([]byte, n) arc := uint8(0) if _, err := rand.Read(b[:]); err != nil { return "" } for i, x := range b { arc = x & 63 b[i] = longLetters[arc] } return string(b) } var json = jsoniter.ConfigCompatibleWithStandardLibrary func JsonEncode(v interface{}) string { str, _ := json.MarshalToString(v) return str } func Println(v interface{}) string { var str string // 判断是否是string类型 str = JsonEncode(str) return str } func InArrayString(val string, arr []string) bool { for _, v := range arr { if v == val { return true } } return false } func InitTest() { // 加载dotEnv环境 loadEnvErr := godotenv.Load("/Users/huang/Desktop/hys/authService/.env") if loadEnvErr != nil { fmt.Println("ENV环境加载Error") return } // 开始初始化数据库 model.Construct(false) // 开始初始化缓存 cache.InitRedis() } // 手机号 func RegexMobile(mobile string) bool { if matched, _ := regexp.MatchString(`^1[3456789]\d{9}$`, mobile); matched { return true } return false }