You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
3.5 KiB

2 years ago
  1. package util
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "io/ioutil"
  9. "log"
  10. "math/rand"
  11. "net/http"
  12. "os"
  13. "reflect"
  14. "regexp"
  15. "strconv"
  16. "strings"
  17. "time"
  18. "golang.org/x/crypto/bcrypt"
  19. )
  20. // 生成邀请码
  21. func GenerateInviteCode() string {
  22. alphabet := []byte("123456789ABCDEFGHIJKLMNPQRSTUVWXYZ")
  23. codes := make([]byte, 0)
  24. for i := 0; i < 6; i++ {
  25. s := rand.NewSource(time.Now().UnixNano())
  26. r := rand.New(s)
  27. index := r.Intn(len(alphabet))
  28. codes = append(codes, alphabet[index])
  29. }
  30. return string(codes)
  31. }
  32. // 获取环境变量
  33. func GetEnv(key, defaultValue string) string {
  34. value := os.Getenv(key)
  35. if value == "" {
  36. return defaultValue
  37. }
  38. return value
  39. }
  40. // 生成密码
  41. func GeneratePwd(pwd string) string {
  42. hash, _ := bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.DefaultCost)
  43. return string(hash)
  44. }
  45. // 校验密码
  46. func ValidatePwd(encodePwd, pwd string) bool {
  47. err := bcrypt.CompareHashAndPassword([]byte(encodePwd), []byte(pwd))
  48. if err != nil {
  49. return false
  50. } else {
  51. return true
  52. }
  53. }
  54. // 校验手机号
  55. func VerifyMobile(mobile string) bool {
  56. pattern := "^((13[0-9])|(14[0-9])|(15[0-9])|(17[0-9])|(18[0-9])|(16[0-9])|198|199)\\d{8}$"
  57. reg := regexp.MustCompile(pattern)
  58. return reg.MatchString(mobile)
  59. }
  60. // 校验邮箱
  61. func VerifyEmail(email string) bool {
  62. pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$`
  63. reg := regexp.MustCompile(pattern)
  64. return reg.MatchString(email)
  65. }
  66. // 获取机器码
  67. func GetMachineUUID() (uuid string, err error) {
  68. var (
  69. url string
  70. resp *http.Response
  71. body []byte
  72. data map[string]map[string]interface{}
  73. ok bool
  74. cliHost string
  75. cliPort string
  76. )
  77. cliHost = GetEnv("CLI_HOST", "192.168.1.252")
  78. cliPort = GetEnv("CLI_PORT", "8686")
  79. url = fmt.Sprintf("http://%s:%s", cliHost, cliPort)
  80. log.Printf("获取机器特征码 url: %s", url)
  81. resp, err = http.Get(url)
  82. if err != nil {
  83. log.Printf("http.Get: %v", err)
  84. err = errors.New("获取服务器特征码失败")
  85. return
  86. }
  87. defer resp.Body.Close()
  88. if resp.StatusCode == 200 {
  89. body, err = ioutil.ReadAll(resp.Body)
  90. err = json.Unmarshal(body, &data)
  91. if err != nil {
  92. log.Printf("json.Unmarshal: %v", err)
  93. err = errors.New("获取服务器特征码失败")
  94. return
  95. }
  96. uuid, ok = data["machine"]["uuid"].(string)
  97. if !ok {
  98. log.Printf("assert err: %v", err)
  99. err = errors.New("获取服务器特征码失败")
  100. return
  101. }
  102. }
  103. return
  104. }
  105. func Md5(str string) string {
  106. hash := md5.New()
  107. hash.Write([]byte(str))
  108. return hex.EncodeToString(hash.Sum(nil))
  109. }
  110. func InArray(needle interface{}, haystack interface{}) bool {
  111. val := reflect.ValueOf(haystack)
  112. switch val.Kind() {
  113. case reflect.Slice, reflect.Array:
  114. for i := 0; i < val.Len(); i++ {
  115. if reflect.DeepEqual(needle, val.Index(i).Interface()) {
  116. return true
  117. }
  118. }
  119. case reflect.Map:
  120. for _, k := range val.MapKeys() {
  121. if reflect.DeepEqual(needle, val.MapIndex(k).Interface()) {
  122. return true
  123. }
  124. }
  125. }
  126. return false
  127. }
  128. func ArrayIntersect(array1, array2 []string) []string {
  129. var res []string
  130. for _, v := range array1 {
  131. if InArray(v, array2) {
  132. res = append(res, v)
  133. }
  134. }
  135. return res
  136. }
  137. //
  138. func RegNumberInString(str string) (float64, error) {
  139. reg, _ := regexp.Compile(`^\d+`)
  140. if reg != nil {
  141. s := reg.FindAllString(str, -1)
  142. if len(s) == 0 {
  143. return 0, nil
  144. }
  145. info := strings.TrimSpace(s[0])
  146. //
  147. f, e := strconv.ParseFloat(info, 64)
  148. return f, e
  149. }
  150. return 0, errors.New("unknown param")
  151. }