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

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")
}