123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- 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
- }
|