mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-18 01:06:39 +08:00
156 lines
3.5 KiB
Go
156 lines
3.5 KiB
Go
package utils
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
|
||
"golang.org/x/crypto/sha3"
|
||
"math/rand"
|
||
"reflect"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// RandString generate rand string with specified length
|
||
func RandString(length int) string {
|
||
str := "0123456789abcdefghijklmnopqrstuvwxyz"
|
||
data := []byte(str)
|
||
var result []byte
|
||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||
for i := 0; i < length; i++ {
|
||
result = append(result, data[r.Intn(len(data))])
|
||
}
|
||
return string(result)
|
||
}
|
||
|
||
func RandomNumber(bit int) int {
|
||
rand.Seed(time.Now().UnixNano())
|
||
min := 1 // min value
|
||
max := 1 //max value
|
||
for i := 0; i < bit; i++ {
|
||
min = min * 10
|
||
max = max * 10
|
||
}
|
||
max = max * 10
|
||
return rand.Intn(max-min+1) + min
|
||
}
|
||
|
||
func ContainsStr(slice []string, item string) bool {
|
||
for _, e := range slice {
|
||
if e == item {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
// Stamp2str 时间戳转字符串
|
||
func Stamp2str(timestamp int64) string {
|
||
if timestamp == 0 {
|
||
return ""
|
||
}
|
||
return time.Unix(timestamp, 0).Format("2006-01-02 15:04:05")
|
||
}
|
||
|
||
// Str2stamp 字符串转时间戳
|
||
func Str2stamp(str string) int64 {
|
||
layout := "2006-01-02 15:04:05"
|
||
t, err := time.Parse(layout, str)
|
||
if err != nil {
|
||
return 0
|
||
}
|
||
return t.Unix()
|
||
}
|
||
|
||
func GenPassword(pass string, salt string) string {
|
||
data := []byte(pass + salt)
|
||
hash := sha3.Sum256(data)
|
||
return fmt.Sprintf("%x", hash)
|
||
}
|
||
|
||
func JsonEncode(value interface{}) string {
|
||
bytes, err := json.Marshal(value)
|
||
if err != nil {
|
||
return ""
|
||
}
|
||
return string(bytes)
|
||
}
|
||
|
||
func JsonDecode(src string, dest interface{}) error {
|
||
return json.Unmarshal([]byte(src), dest)
|
||
}
|
||
|
||
// CopyObject 拷贝对象
|
||
func CopyObject(src interface{}, dst interface{}) error {
|
||
|
||
srcType := reflect.TypeOf(src)
|
||
srcValue := reflect.ValueOf(src)
|
||
dstValue := reflect.ValueOf(dst).Elem()
|
||
reflect.TypeOf(dst)
|
||
for i := 0; i < srcType.NumField(); i++ {
|
||
field := srcType.Field(i)
|
||
value := dstValue.FieldByName(field.Name)
|
||
if !value.IsValid() {
|
||
continue
|
||
}
|
||
// 数据类型相同,直接赋值
|
||
v := srcValue.FieldByName(field.Name)
|
||
if value.Type() == field.Type {
|
||
value.Set(v)
|
||
} else {
|
||
// src data type is string,dst data type is slice, map, struct
|
||
// use json decode the data
|
||
if field.Type.Kind() == reflect.String && (value.Type().Kind() == reflect.Struct ||
|
||
value.Type().Kind() == reflect.Map ||
|
||
value.Type().Kind() == reflect.Slice) {
|
||
pType := reflect.New(value.Type())
|
||
v2 := pType.Interface()
|
||
err := json.Unmarshal([]byte(v.String()), &v2)
|
||
if err == nil {
|
||
value.Set(reflect.ValueOf(v2).Elem())
|
||
}
|
||
// string to map, struct, slice
|
||
} else if (field.Type.Kind() == reflect.Struct ||
|
||
field.Type.Kind() == reflect.Map ||
|
||
field.Type.Kind() == reflect.Slice) && value.Type().Kind() == reflect.String {
|
||
ba, err := json.Marshal(v.Interface())
|
||
if err == nil {
|
||
value.Set(reflect.ValueOf(string(ba)))
|
||
}
|
||
} else { // 简单数据类型的强制类型转换
|
||
switch value.Kind() {
|
||
case reflect.Int:
|
||
case reflect.Int8:
|
||
case reflect.Int16:
|
||
case reflect.Int32:
|
||
case reflect.Int64:
|
||
value.SetInt(v.Int())
|
||
break
|
||
case reflect.Float32:
|
||
case reflect.Float64:
|
||
value.SetFloat(v.Float())
|
||
break
|
||
case reflect.Bool:
|
||
value.SetBool(v.Bool())
|
||
break
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
func Ip2Region(searcher *xdb.Searcher, ip string) string {
|
||
str, err := searcher.SearchByStr(ip)
|
||
if err != nil {
|
||
return ""
|
||
}
|
||
arr := strings.Split(str, "|")
|
||
if len(arr) < 3 {
|
||
return arr[0]
|
||
}
|
||
return fmt.Sprintf("%s-%s-%s", arr[0], arr[2], arr[3])
|
||
}
|