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
174 lines
3.5 KiB
package util
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"math/rand"
|
|
"net/http"
|
|
"os"
|
|
"reflect"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
// 生成邀请码
|
|
func GenerateInviteCode() string {
|
|
alphabet := []byte("123456789ABCDEFGHIJKLMNPQRSTUVWXYZ")
|
|
codes := make([]byte, 0)
|
|
for i := 0; i < 6; i++ {
|
|
s := rand.NewSource(time.Now().UnixNano())
|
|
r := rand.New(s)
|
|
index := r.Intn(len(alphabet))
|
|
codes = append(codes, alphabet[index])
|
|
}
|
|
|
|
return string(codes)
|
|
}
|
|
|
|
// 获取环境变量
|
|
func GetEnv(key, defaultValue string) string {
|
|
value := os.Getenv(key)
|
|
if value == "" {
|
|
return defaultValue
|
|
}
|
|
return value
|
|
}
|
|
|
|
// 生成密码
|
|
func GeneratePwd(pwd string) string {
|
|
hash, _ := bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.DefaultCost)
|
|
return string(hash)
|
|
}
|
|
|
|
// 校验密码
|
|
func ValidatePwd(encodePwd, pwd string) bool {
|
|
err := bcrypt.CompareHashAndPassword([]byte(encodePwd), []byte(pwd))
|
|
if err != nil {
|
|
return false
|
|
} else {
|
|
return true
|
|
}
|
|
}
|
|
|
|
// 校验手机号
|
|
func VerifyMobile(mobile string) bool {
|
|
pattern := "^((13[0-9])|(14[0-9])|(15[0-9])|(17[0-9])|(18[0-9])|(16[0-9])|198|199)\\d{8}$"
|
|
reg := regexp.MustCompile(pattern)
|
|
return reg.MatchString(mobile)
|
|
}
|
|
|
|
// 校验邮箱
|
|
func VerifyEmail(email string) bool {
|
|
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}$`
|
|
reg := regexp.MustCompile(pattern)
|
|
return reg.MatchString(email)
|
|
}
|
|
|
|
// 获取机器码
|
|
func GetMachineUUID() (uuid string, err error) {
|
|
var (
|
|
url string
|
|
resp *http.Response
|
|
body []byte
|
|
data map[string]map[string]interface{}
|
|
ok bool
|
|
cliHost string
|
|
cliPort string
|
|
)
|
|
|
|
cliHost = GetEnv("CLI_HOST", "192.168.1.252")
|
|
cliPort = GetEnv("CLI_PORT", "8686")
|
|
|
|
url = fmt.Sprintf("http://%s:%s", cliHost, cliPort)
|
|
log.Printf("获取机器特征码 url: %s", url)
|
|
|
|
resp, err = http.Get(url)
|
|
|
|
if err != nil {
|
|
log.Printf("http.Get: %v", err)
|
|
err = errors.New("获取服务器特征码失败")
|
|
return
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode == 200 {
|
|
body, err = ioutil.ReadAll(resp.Body)
|
|
err = json.Unmarshal(body, &data)
|
|
if err != nil {
|
|
log.Printf("json.Unmarshal: %v", err)
|
|
err = errors.New("获取服务器特征码失败")
|
|
return
|
|
}
|
|
|
|
uuid, ok = data["machine"]["uuid"].(string)
|
|
if !ok {
|
|
log.Printf("assert err: %v", err)
|
|
err = errors.New("获取服务器特征码失败")
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func Md5(str string) string {
|
|
hash := md5.New()
|
|
hash.Write([]byte(str))
|
|
return hex.EncodeToString(hash.Sum(nil))
|
|
}
|
|
|
|
func InArray(needle interface{}, haystack interface{}) bool {
|
|
val := reflect.ValueOf(haystack)
|
|
switch val.Kind() {
|
|
case reflect.Slice, reflect.Array:
|
|
for i := 0; i < val.Len(); i++ {
|
|
if reflect.DeepEqual(needle, val.Index(i).Interface()) {
|
|
return true
|
|
}
|
|
}
|
|
case reflect.Map:
|
|
for _, k := range val.MapKeys() {
|
|
if reflect.DeepEqual(needle, val.MapIndex(k).Interface()) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func ArrayIntersect(array1, array2 []string) []string {
|
|
var res []string
|
|
for _, v := range array1 {
|
|
if InArray(v, array2) {
|
|
res = append(res, v)
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
//
|
|
func RegNumberInString(str string) (float64, error) {
|
|
reg, _ := regexp.Compile(`^\d+`)
|
|
if reg != nil {
|
|
s := reg.FindAllString(str, -1)
|
|
if len(s) == 0 {
|
|
return 0, nil
|
|
}
|
|
info := strings.TrimSpace(s[0])
|
|
//
|
|
f, e := strconv.ParseFloat(info, 64)
|
|
return f, e
|
|
}
|
|
return 0, errors.New("unknown param")
|
|
}
|