util.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package util
  2. import (
  3. "bytes"
  4. "crypto/md5"
  5. "crypto/rand"
  6. "database/sql"
  7. "encoding/hex"
  8. "fmt"
  9. "image"
  10. "io/ioutil"
  11. "math/big"
  12. "net/http"
  13. "regexp"
  14. "strings"
  15. "time"
  16. "authService/cache"
  17. "authService/model"
  18. "authService/model/types"
  19. "github.com/gin-gonic/gin"
  20. "github.com/joho/godotenv"
  21. jsoniter "github.com/json-iterator/go"
  22. "github.com/speps/go-hashids/v2"
  23. )
  24. // php序列化的对象转map之后,key值会有特定的字节前缀导致无法解析,需要去掉
  25. func PhpMap2Go(in map[string]interface{}) map[string]interface{} {
  26. result := make(map[string]interface{})
  27. for i, v := range in {
  28. tmpi := []byte(i)
  29. if tmpi[0] == 0 && tmpi[1] == 42 && tmpi[2] == 0 {
  30. result[string(tmpi[3:])] = v
  31. } else {
  32. result[i] = v
  33. }
  34. }
  35. return result
  36. }
  37. func GetRequestParam(c *gin.Context, key string) string {
  38. if c.Request.Method == http.MethodGet {
  39. return c.Query(key)
  40. } else {
  41. // 如果是Json格式
  42. if c.Request.Header.Get("Content-Type") == "application/json" {
  43. JsonData := GetRequestJsonData(c)
  44. // 判断类型
  45. if _, ok := JsonData[key].(string); !ok {
  46. return ""
  47. }
  48. return JsonData[key].(string)
  49. }
  50. return c.PostForm(key)
  51. }
  52. }
  53. func GetRequestJsonData(c *gin.Context) map[string]any {
  54. data, _ := c.GetRawData()
  55. var body map[string]any
  56. _ = json.Unmarshal(data, &body)
  57. c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data))
  58. return body
  59. }
  60. func GetPostFormParams(c *gin.Context) (map[string]any, error) {
  61. var postMap = make(map[string]any, len(c.Request.PostForm))
  62. for k, v := range c.Request.PostForm {
  63. if len(v) > 1 {
  64. postMap[k] = v
  65. } else if len(v) == 1 {
  66. postMap[k] = v[0]
  67. }
  68. }
  69. return postMap, nil
  70. }
  71. // 将ID编译为HashId
  72. func GetHashId(id int64, salt string) string {
  73. hd := hashids.NewData()
  74. hd.Salt = salt
  75. hd.MinLength = 8
  76. h, _ := hashids.NewWithData(hd)
  77. hashId, _ := h.Encode([]int{int(id)})
  78. return hashId
  79. }
  80. // 根据HashId获取真实ID
  81. func GetIdByHashId(hashId string, salt string) (int64, error) {
  82. hd := hashids.NewData()
  83. hd.Salt = salt
  84. hd.MinLength = 8
  85. h, _ := hashids.NewWithData(hd)
  86. d, err := h.DecodeWithError(hashId)
  87. if err != nil {
  88. return 0, err
  89. }
  90. return int64(d[0]), nil
  91. }
  92. func GetFromGinContext[T any](ctx *gin.Context, key string) (T, bool) {
  93. var some T
  94. value, exist := ctx.Get(key)
  95. if !exist {
  96. return some, false
  97. }
  98. some, ok := value.(T)
  99. if !ok {
  100. return some, false
  101. }
  102. return some, true
  103. }
  104. // MD5加密
  105. func Md5(src string) string {
  106. m := md5.New()
  107. m.Write([]byte(src + "3OTBF91KlFGMdrDn"))
  108. res := hex.EncodeToString(m.Sum(nil))
  109. return res
  110. }
  111. // 获取随机数
  112. func GetRandomNumber() string {
  113. result, _ := rand.Int(rand.Reader, big.NewInt(9999))
  114. return fmt.Sprintf("%04d", result)
  115. }
  116. // 转为sql.NullTime
  117. func ToNullTime(t time.Time) types.NullTime {
  118. return types.NullTime{NullTime: sql.NullTime{Time: t, Valid: !t.IsZero()}}
  119. }
  120. // 数据脱敏
  121. func HideStar(str string) (result string) {
  122. if str == "" {
  123. return ""
  124. }
  125. if strings.Contains(str, "@") { // 邮箱
  126. res := strings.Split(str, "@")
  127. if len(res[0]) < 3 {
  128. resString := "***"
  129. result = resString + "@" + res[1]
  130. } else {
  131. res2 := Substr2(str, 0, 3)
  132. resString := res2 + "***"
  133. result = resString + "@" + res[1]
  134. }
  135. return result
  136. } else {
  137. reg := `^1[0-9]\d{9}$`
  138. rgx := regexp.MustCompile(reg)
  139. mobileMatch := rgx.MatchString(str)
  140. if mobileMatch { // 手机号
  141. result = Substr2(str, 0, 3) + "****" + Substr2(str, 7, 11)
  142. } else {
  143. nameRune := []rune(str)
  144. lens := len(nameRune)
  145. if lens <= 1 {
  146. result = "***"
  147. } else if lens == 2 {
  148. result = string(nameRune[:1]) + "*"
  149. } else if lens == 3 {
  150. result = string(nameRune[:1]) + "*" + string(nameRune[2:3])
  151. } else if lens == 4 {
  152. result = string(nameRune[:1]) + "**" + string(nameRune[lens-1:lens])
  153. } else if lens > 4 {
  154. result = string(nameRune[:2]) + "***" + string(nameRune[lens-2:lens])
  155. }
  156. }
  157. return
  158. }
  159. }
  160. func Substr2(str string, start int, end int) string {
  161. rs := []rune(str)
  162. return string(rs[start:end])
  163. }
  164. // 读取远程文件
  165. func ReadImageData(url string) image.Image {
  166. resp, err := http.Get(url)
  167. if err != nil {
  168. return nil
  169. }
  170. defer resp.Body.Close()
  171. img, _, err := image.Decode(resp.Body)
  172. if err != nil {
  173. return nil
  174. }
  175. return img
  176. }
  177. // 获取随机字符串
  178. func RandString(n int) string {
  179. var longLetters = []byte("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ=_")
  180. if n <= 0 {
  181. return ""
  182. }
  183. b := make([]byte, n)
  184. arc := uint8(0)
  185. if _, err := rand.Read(b[:]); err != nil {
  186. return ""
  187. }
  188. for i, x := range b {
  189. arc = x & 63
  190. b[i] = longLetters[arc]
  191. }
  192. return string(b)
  193. }
  194. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  195. func JsonEncode(v interface{}) string {
  196. str, _ := json.MarshalToString(v)
  197. return str
  198. }
  199. func Println(v interface{}) string {
  200. var str string
  201. // 判断是否是string类型
  202. str = JsonEncode(str)
  203. return str
  204. }
  205. func InArrayString(val string, arr []string) bool {
  206. for _, v := range arr {
  207. if v == val {
  208. return true
  209. }
  210. }
  211. return false
  212. }
  213. func InitTest() {
  214. // 加载dotEnv环境
  215. loadEnvErr := godotenv.Load("/Users/huang/Desktop/hys/authService/.env")
  216. if loadEnvErr != nil {
  217. fmt.Println("ENV环境加载Error")
  218. return
  219. }
  220. // 开始初始化数据库
  221. model.Construct(false)
  222. // 开始初始化缓存
  223. cache.InitRedis()
  224. }
  225. // 手机号
  226. func RegexMobile(mobile string) bool {
  227. if matched, _ := regexp.MatchString(`^1[3456789]\d{9}$`, mobile); matched {
  228. return true
  229. }
  230. return false
  231. }