123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package utils
  2. import (
  3. "encoding/base64"
  4. "math/rand"
  5. "net/http"
  6. "os"
  7. "path/filepath"
  8. "runtime"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. // 客户端类型
  14. const (
  15. ClientAdmin = "client-admin"
  16. ClientWechat = "client-wechat"
  17. ClientMini = "client-mini"
  18. )
  19. // 一些 UA 列表
  20. const (
  21. UAWechat = "micromessenger"
  22. UAMiniProgram = "miniprogram"
  23. )
  24. // GetClientType 获取客户端类型
  25. // 默认返回是 管理端
  26. func GetClientType(r *http.Request) string {
  27. ua := strings.ToLower(r.Header.Get("User-Agent"))
  28. if strings.Index(ua, UAWechat) > -1 {
  29. // if strings.Index(ua, UAMiniProgram) > -1 {
  30. // return ClientMini
  31. // }
  32. return ClientWechat
  33. }
  34. return ClientAdmin
  35. }
  36. // StrSliceIndexOf slice indexof
  37. func StrSliceIndexOf(s []string, t string) int64 {
  38. if s == nil || len(s) == 0 {
  39. return -1
  40. }
  41. for k, v := range s {
  42. if v == t {
  43. return int64(k)
  44. }
  45. }
  46. return -1
  47. }
  48. // GUIID2IntString guid 转 int 字符串
  49. func GUIID2IntString(id string) []string {
  50. if id == "" {
  51. return nil
  52. }
  53. res := make([]string, 0)
  54. for _, part := range strings.Split(id, "-") {
  55. sum := 0
  56. for _, r := range []rune(part) {
  57. sum += int(r)
  58. }
  59. res = append(res, strconv.Itoa(sum))
  60. }
  61. return res
  62. }
  63. // EncodeBase64TrimTail base64 加密, 去除末尾 =
  64. func EncodeBase64TrimTail(src string) string {
  65. if src == "" {
  66. return ""
  67. }
  68. enStr := base64.StdEncoding.EncodeToString([]byte(src))
  69. return strings.TrimRight(enStr, "=")
  70. }
  71. // DecodeBase64NoTail base64解密, 位数不够的, 自动补全
  72. func DecodeBase64NoTail(src string) string {
  73. if src == "" {
  74. return ""
  75. }
  76. pd := 4 - len(src)%4
  77. if pd > 0 && pd != 4 {
  78. src += strings.Repeat("=", pd)
  79. }
  80. res, err := base64.StdEncoding.DecodeString(src)
  81. if err != nil {
  82. LogError("解密 Base64 字串失败: " + err.Error())
  83. return ""
  84. }
  85. return string(res)
  86. }
  87. // GetPageNaviLimit 获取 mysql limit 限定
  88. func GetPageNaviLimit(params ...int) []int {
  89. page := 1
  90. pagesize := 10
  91. if params != nil {
  92. pl := len(params)
  93. if pl > 0 {
  94. page = params[0]
  95. if page < 1 {
  96. page = 1
  97. }
  98. }
  99. if pl > 1 {
  100. pagesize = params[1]
  101. }
  102. }
  103. return []int{
  104. pagesize,
  105. (page - 1) * pagesize,
  106. }
  107. }
  108. // GenerateQRCode 生成二维码数字
  109. func GenerateQRCode() string {
  110. var temp1 int = rand.Intn(9)*87 + 11
  111. var temp2 int = rand.Intn(9)*89 + 13
  112. nano := time.Now().UnixNano()
  113. var nanostr string = strconv.FormatInt(nano, 10)
  114. var temp3 string = nanostr[11:]
  115. var temp4 string = "6"
  116. var temp5 int = rand.Intn(9)*7 + 17
  117. var code string = "66" + strconv.Itoa(temp1) + temp4 + strconv.Itoa(temp2) + temp3 + strconv.Itoa(temp5)
  118. return code
  119. }
  120. // GetFiveSeconds 获取 5 秒钟的时间
  121. func GetFiveSeconds(t time.Time) string {
  122. str := t.Format("20060102150405")
  123. strLen := len(str)
  124. lastNum, _ := strconv.Atoi(str[strLen-1:])
  125. if lastNum < 5 {
  126. lastNum = 0
  127. } else {
  128. lastNum = 5
  129. }
  130. return str[:strLen-1] + strconv.Itoa(lastNum)
  131. }
  132. // 当前运行环境
  133. var processEnv string
  134. var appRoot string
  135. // GetAppRoot 获取系统根目录
  136. func GetAppRoot() string {
  137. if appRoot != "" {
  138. return appRoot
  139. }
  140. if processEnv == "" {
  141. for _, arg := range os.Args {
  142. if strings.Index(arg, "-test.run") > -1 {
  143. processEnv = "test"
  144. break
  145. }
  146. }
  147. if processEnv == "" {
  148. processEnv = "production"
  149. }
  150. }
  151. if processEnv == "test" {
  152. _, file, _, _ := runtime.Caller(1)
  153. appRoot, _ = filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator))))
  154. } else {
  155. appRoot, _ = filepath.Abs(filepath.Dir(os.Args[0]))
  156. }
  157. return appRoot
  158. }