|
@@ -0,0 +1,442 @@
|
|
|
+package lib
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+
|
|
|
+ "go.mongodb.org/mongo-driver/bson"
|
|
|
+
|
|
|
+ "math/rand"
|
|
|
+
|
|
|
+ "reflect"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func init() {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const Success = 200
|
|
|
+const Error = 201
|
|
|
+
|
|
|
+type JSONR struct {
|
|
|
+ //必须的大写开头
|
|
|
+ Code int16
|
|
|
+ Msg string
|
|
|
+ Data interface{} // 泛型
|
|
|
+}
|
|
|
+type JSONS struct {
|
|
|
+ //必须的大写开头
|
|
|
+ Code int16
|
|
|
+ Msg string
|
|
|
+ List interface{}
|
|
|
+ Total int16
|
|
|
+ PageIndex int
|
|
|
+ PageSize int
|
|
|
+}
|
|
|
+
|
|
|
+func C_Page(list interface{}, PageIndex, PageSize int, Total int64) (Jsons JSONS) {
|
|
|
+ Jsons.List = list
|
|
|
+ Jsons.Total = int16(Total)
|
|
|
+ Jsons.PageIndex = PageIndex
|
|
|
+ Jsons.PageSize = PageSize
|
|
|
+ //Jsons.PageSize = int16(math.Ceil(float64(Total) / float64(PageSize)))
|
|
|
+ return Jsons
|
|
|
+}
|
|
|
+
|
|
|
+func Strval(value interface{}) string {
|
|
|
+ var key string
|
|
|
+ if value == nil {
|
|
|
+ return key
|
|
|
+ }
|
|
|
+
|
|
|
+ switch value.(type) {
|
|
|
+ case float64:
|
|
|
+ ft := value.(float64)
|
|
|
+ key = strconv.FormatFloat(ft, 'f', -1, 64)
|
|
|
+ case float32:
|
|
|
+ ft := value.(float32)
|
|
|
+ key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
|
|
|
+ case int:
|
|
|
+ it := value.(int)
|
|
|
+ key = strconv.Itoa(it)
|
|
|
+ case uint:
|
|
|
+ it := value.(uint)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int8:
|
|
|
+ it := value.(int8)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case uint8:
|
|
|
+ it := value.(uint8)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int16:
|
|
|
+ it := value.(int16)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case uint16:
|
|
|
+ it := value.(uint16)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int32:
|
|
|
+ it := value.(int32)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case uint32:
|
|
|
+ it := value.(uint32)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int64:
|
|
|
+ it := value.(int64)
|
|
|
+ key = strconv.FormatInt(it, 10)
|
|
|
+ case uint64:
|
|
|
+ it := value.(uint64)
|
|
|
+ key = strconv.FormatUint(it, 10)
|
|
|
+ case string:
|
|
|
+ key = value.(string)
|
|
|
+ case []byte:
|
|
|
+ key = string(value.([]byte))
|
|
|
+ default:
|
|
|
+ newValue, _ := json.Marshal(value)
|
|
|
+ key = string(newValue)
|
|
|
+ }
|
|
|
+
|
|
|
+ return key
|
|
|
+}
|
|
|
+
|
|
|
+// 取一个
|
|
|
+func Take_one(a, b string) string {
|
|
|
+ if len(a) == 0 {
|
|
|
+ return b
|
|
|
+ }
|
|
|
+ return a
|
|
|
+}
|
|
|
+
|
|
|
+func To_int(value interface{}) int {
|
|
|
+ var key int
|
|
|
+ if value == nil {
|
|
|
+ return key
|
|
|
+ }
|
|
|
+ switch value.(type) {
|
|
|
+ case float64:
|
|
|
+ key = int(value.(float64))
|
|
|
+ case float32:
|
|
|
+ key = int(value.(float32))
|
|
|
+ case int:
|
|
|
+ key = int(value.(int))
|
|
|
+ case uint:
|
|
|
+ key = int(value.(uint))
|
|
|
+ case int8:
|
|
|
+ key = int(value.(int8))
|
|
|
+ case uint8:
|
|
|
+ key = int(value.(uint8))
|
|
|
+ case int16:
|
|
|
+ key = int(value.(int16))
|
|
|
+ case uint16:
|
|
|
+ key = int(value.(uint16))
|
|
|
+ case int32:
|
|
|
+ key = int(value.(int32))
|
|
|
+ case uint32:
|
|
|
+ key = int(value.(uint32))
|
|
|
+ case int64:
|
|
|
+ key = int(value.(int64))
|
|
|
+ case uint64:
|
|
|
+ key = int(value.(uint64))
|
|
|
+ case string:
|
|
|
+ key, _ = strconv.Atoi(value.(string))
|
|
|
+ case []byte:
|
|
|
+ key, _ = strconv.Atoi(string(value.([]byte)))
|
|
|
+ default:
|
|
|
+ newValue, _ := json.Marshal(value)
|
|
|
+ key, _ = strconv.Atoi(string(newValue))
|
|
|
+ }
|
|
|
+ return key
|
|
|
+}
|
|
|
+func To_int64(value interface{}) int64 {
|
|
|
+ var key int64
|
|
|
+ if value == nil {
|
|
|
+ return key
|
|
|
+ }
|
|
|
+ switch value.(type) {
|
|
|
+ case float64:
|
|
|
+ key = int64(value.(float64))
|
|
|
+ case float32:
|
|
|
+ key = int64(value.(float32))
|
|
|
+ case int:
|
|
|
+ key = int64(value.(int))
|
|
|
+ case uint:
|
|
|
+ key = int64(value.(uint))
|
|
|
+ case int8:
|
|
|
+ key = int64(value.(int8))
|
|
|
+ case uint8:
|
|
|
+ key = int64(value.(uint8))
|
|
|
+ case int16:
|
|
|
+ key = int64(value.(int16))
|
|
|
+ case uint16:
|
|
|
+ key = int64(value.(uint16))
|
|
|
+ case int32:
|
|
|
+ key = int64(value.(int32))
|
|
|
+ case uint32:
|
|
|
+ key = int64(value.(uint32))
|
|
|
+ case int64:
|
|
|
+ key = int64(value.(int64))
|
|
|
+ case uint64:
|
|
|
+ key = int64(value.(uint64))
|
|
|
+ case string:
|
|
|
+ key, _ = strconv.ParseInt(value.(string), 10, 64)
|
|
|
+ case []byte:
|
|
|
+ key, _ = strconv.ParseInt(string(value.([]byte)), 10, 64)
|
|
|
+ default:
|
|
|
+ newValue, _ := json.Marshal(value)
|
|
|
+ key, _ = strconv.ParseInt(string(newValue), 10, 64)
|
|
|
+ }
|
|
|
+ return key
|
|
|
+}
|
|
|
+
|
|
|
+func To_float32(value interface{}) float32 {
|
|
|
+ var key float32
|
|
|
+ if value == nil {
|
|
|
+ return key
|
|
|
+ }
|
|
|
+
|
|
|
+ switch value.(type) {
|
|
|
+ case float64:
|
|
|
+ key = float32(value.(float64))
|
|
|
+ case float32:
|
|
|
+ key = float32(value.(float32))
|
|
|
+ case int:
|
|
|
+ key = float32(value.(int))
|
|
|
+ case uint:
|
|
|
+ key = float32(value.(uint))
|
|
|
+ case int8:
|
|
|
+ key = float32(value.(int8))
|
|
|
+ case uint8:
|
|
|
+ key = float32(value.(uint8))
|
|
|
+ case int16:
|
|
|
+ key = float32(value.(int16))
|
|
|
+ case uint16:
|
|
|
+ key = float32(value.(uint16))
|
|
|
+ case int32:
|
|
|
+ key = float32(value.(int32))
|
|
|
+ case uint32:
|
|
|
+ key = float32(value.(uint32))
|
|
|
+ case int64:
|
|
|
+ key = float32(value.(int64))
|
|
|
+ case uint64:
|
|
|
+ key = float32(value.(uint64))
|
|
|
+ case string:
|
|
|
+ key_float64, _ := strconv.ParseFloat(value.(string), 32/64)
|
|
|
+ key = float32(key_float64)
|
|
|
+ case []byte:
|
|
|
+ key_float64, _ := strconv.ParseFloat(string(value.([]byte)), 32/64)
|
|
|
+ key = float32(key_float64)
|
|
|
+ default:
|
|
|
+ newValue, _ := json.Marshal(value)
|
|
|
+ key_float64, _ := strconv.ParseFloat(string(newValue), 32/64)
|
|
|
+ key = float32(key_float64)
|
|
|
+ }
|
|
|
+
|
|
|
+ key_float64, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", key), 32/64)
|
|
|
+ key = float32(key_float64)
|
|
|
+
|
|
|
+ return key
|
|
|
+}
|
|
|
+
|
|
|
+func To_string(value interface{}) string {
|
|
|
+ var key string
|
|
|
+ if value == nil {
|
|
|
+ return key
|
|
|
+ }
|
|
|
+
|
|
|
+ switch value.(type) {
|
|
|
+ case float64:
|
|
|
+ ft := value.(float64)
|
|
|
+ key = strconv.FormatFloat(ft, 'f', -1, 64)
|
|
|
+ case float32:
|
|
|
+ ft := value.(float32)
|
|
|
+ key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
|
|
|
+ case int:
|
|
|
+ it := value.(int)
|
|
|
+ key = strconv.Itoa(it)
|
|
|
+ case uint:
|
|
|
+ it := value.(uint)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int8:
|
|
|
+ it := value.(int8)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case uint8:
|
|
|
+ it := value.(uint8)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int16:
|
|
|
+ it := value.(int16)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case uint16:
|
|
|
+ it := value.(uint16)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int32:
|
|
|
+ it := value.(int32)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case uint32:
|
|
|
+ it := value.(uint32)
|
|
|
+ key = strconv.Itoa(int(it))
|
|
|
+ case int64:
|
|
|
+ it := value.(int64)
|
|
|
+ key = strconv.FormatInt(it, 10)
|
|
|
+ case uint64:
|
|
|
+ it := value.(uint64)
|
|
|
+ key = strconv.FormatUint(it, 10)
|
|
|
+ case string:
|
|
|
+ key = value.(string)
|
|
|
+ case []byte:
|
|
|
+ key = string(value.([]byte))
|
|
|
+ default:
|
|
|
+ newValue, _ := json.Marshal(value)
|
|
|
+ key = string(newValue)
|
|
|
+ }
|
|
|
+ return key
|
|
|
+}
|
|
|
+
|
|
|
+func Random(min, max int) int {
|
|
|
+ rand.Seed(time.Now().Unix()) //Seed生成的随机数
|
|
|
+ return rand.Intn(max-min) + min
|
|
|
+}
|
|
|
+
|
|
|
+// #取得随机字符串:通过打乱slice来操作
|
|
|
+func GetRandstring(length int, char string, rand_x int64) string {
|
|
|
+ if length < 1 {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(char) <= 6 || len(char) <= length {
|
|
|
+ char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
|
+ }
|
|
|
+
|
|
|
+ charArr := strings.Split(char, "")
|
|
|
+ ran := rand.New(rand.NewSource(time.Now().Unix() + rand_x))
|
|
|
+
|
|
|
+ l := len(charArr)
|
|
|
+ for i := l - 1; i > 0; i-- {
|
|
|
+ r := ran.Intn(i)
|
|
|
+ charArr[r], charArr[i] = charArr[i], charArr[r]
|
|
|
+ }
|
|
|
+ rchar := charArr[:length]
|
|
|
+ return strings.Join(rchar, "")
|
|
|
+}
|
|
|
+
|
|
|
+// 判断时间是当年的第几周
|
|
|
+func WeekByDate() string {
|
|
|
+ t := time.Now()
|
|
|
+ yearDay := t.YearDay()
|
|
|
+ yearFirstDay := t.AddDate(0, 0, -yearDay+1)
|
|
|
+ firstDayInWeek := int(yearFirstDay.Weekday())
|
|
|
+
|
|
|
+ //今年第一周有几天
|
|
|
+ firstWeekDays := 1
|
|
|
+ if firstDayInWeek != 0 {
|
|
|
+ firstWeekDays = 7 - firstDayInWeek + 1
|
|
|
+ }
|
|
|
+ var week int
|
|
|
+ if yearDay <= firstWeekDays {
|
|
|
+ week = 1
|
|
|
+ } else {
|
|
|
+ week = (yearDay-firstWeekDays)/7 + 2
|
|
|
+ }
|
|
|
+ return fmt.Sprintf("%d%02d", t.Year()%100, week) // 2253
|
|
|
+}
|
|
|
+
|
|
|
+// 将 时间格式为 bson.M 时间格式
|
|
|
+func MongdbJsonHtime(ArticleSlide bson.M) bson.M {
|
|
|
+ bson_M := bson.M{}
|
|
|
+ for key, value := range ArticleSlide {
|
|
|
+ //logs.Println(reflect.TypeOf(value).String())
|
|
|
+ switch reflect.TypeOf(value).String() {
|
|
|
+ case "map[string]interface {}":
|
|
|
+ jsonFind_M := bson.M{}
|
|
|
+ data, _ := json.Marshal(value.(map[string]interface{}))
|
|
|
+ err := json.Unmarshal(data, &jsonFind_M)
|
|
|
+ if err == nil {
|
|
|
+ bson_M[key] = MongdbJsonHtime(jsonFind_M)
|
|
|
+ }
|
|
|
+
|
|
|
+ break
|
|
|
+ case "[]interface {}":
|
|
|
+ bson_M_list := []bson.M{}
|
|
|
+ for _, valuex := range value.([]interface{}) {
|
|
|
+ if reflect.TypeOf(valuex).String() == "map[string]interface {}" {
|
|
|
+ jsonFind_M := bson.M{}
|
|
|
+ data, _ := json.Marshal(valuex.(map[string]interface{}))
|
|
|
+ err := json.Unmarshal(data, &jsonFind_M)
|
|
|
+ if err == nil {
|
|
|
+ bson_M_list = append(bson_M_list, MongdbJsonHtime(jsonFind_M))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ bson_M[key] = bson_M_list
|
|
|
+ //return json_r
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ t1, err := time.ParseInLocation("2006-01-02 15:04:05", value.(string), time.Local) // +8 时差
|
|
|
+ if err == nil {
|
|
|
+ bson_M[key] = t1
|
|
|
+ } else {
|
|
|
+ bson_M[key] = value
|
|
|
+ }
|
|
|
+
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return bson_M
|
|
|
+}
|
|
|
+
|
|
|
+// 判断字符串是否在数组中
|
|
|
+func StringExistsInSlice(str string, slice []string) bool {
|
|
|
+ for _, s := range slice {
|
|
|
+ if s == str {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+// 获取 JSON 指定位置 field : "AAA.BBB.d_name"
|
|
|
+func JsonGetField(data map[string]interface{}, field string) interface{} {
|
|
|
+ fields := strings.Split(field, ".")
|
|
|
+ result := data
|
|
|
+ for _, f := range fields {
|
|
|
+ if val, ok := result[f]; ok {
|
|
|
+ switch val.(type) {
|
|
|
+ case map[string]interface{}:
|
|
|
+ result = val.(map[string]interface{})
|
|
|
+ default:
|
|
|
+ return val
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result
|
|
|
+}
|
|
|
+
|
|
|
+// 获取 JSON 指定位置 data:修改的field必须存在 field : "AAA.BBB.d_name" value: 123
|
|
|
+func JsonSetField(data map[string]interface{}, field string, value interface{}) {
|
|
|
+ fields := strings.Split(field, ".")
|
|
|
+ current := data
|
|
|
+ for i, fieldv := range fields {
|
|
|
+ if i == len(fields)-1 {
|
|
|
+ current[fieldv] = value
|
|
|
+ } else {
|
|
|
+ next, ok := current[fieldv].(map[string]interface{})
|
|
|
+ if !ok {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ current = next
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 复制一份 Map
|
|
|
+func CopyMap(inputMap map[string]interface{}) map[string]interface{} {
|
|
|
+ copiedMap := make(map[string]interface{})
|
|
|
+ for key, value := range inputMap {
|
|
|
+ copiedMap[key] = value
|
|
|
+ }
|
|
|
+ return copiedMap
|
|
|
+}
|