| @ -0,0 +1,63 @@ | |||||
| package helper | |||||
| import ( | |||||
| "net/http" | |||||
| "strings" | |||||
| ) | |||||
| /** | |||||
| * 取访问主机名 | |||||
| */ | |||||
| func GetHost(req *http.Request) string { | |||||
| var hostlist []string = req.Header.Values("X-Forwarded-Host") | |||||
| var host string | |||||
| if len(hostlist) > 1 { | |||||
| host = hostlist[len(hostlist)-1] //取最后一次转发的 | |||||
| } else if len(hostlist) == 1 { | |||||
| host = hostlist[0] | |||||
| } else { | |||||
| host = "" | |||||
| } | |||||
| if host != "" { | |||||
| hosts := strings.Split(host, ",") | |||||
| host = strings.Trim(hosts[len(hosts)-1], " ") | |||||
| } | |||||
| if host == "" { | |||||
| host = req.Host | |||||
| } | |||||
| return host | |||||
| } | |||||
| /** | |||||
| * 取域名 | |||||
| */ | |||||
| func GetDomain(req *http.Request) string { | |||||
| scheme := "http://" | |||||
| if req.TLS != nil { | |||||
| scheme = "https://" | |||||
| } | |||||
| if strings.Contains(req.Referer(), "https://") { | |||||
| scheme = "https://" | |||||
| } | |||||
| var host string = GetHost(req) | |||||
| host = strings.Split(host, ":")[0] | |||||
| var w strings.Builder | |||||
| w.WriteString(scheme) | |||||
| w.WriteString(host) | |||||
| return w.String() | |||||
| } | |||||
| func SetHeader(w http.ResponseWriter, resp *http.Request) { | |||||
| w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域 | |||||
| w.Header().Add("Access-Control-Allow-Headers", "Content-Type,x-csrf-token,x-requested-with,token") //header的类型 | |||||
| w.Header().Set("Access-Control-Allow-Methods", "POST,GET,OPTIONS") | |||||
| w.Header().Set("content-type", "application/json") //返回数据格式是json | |||||
| // w.Header().Set("Content-Length", resp.Header.Get("Content-Length")) | |||||
| } | |||||
| @ -0,0 +1,63 @@ | |||||
| package helper | |||||
| import ( | |||||
| "errors" | |||||
| ) | |||||
| func MergeStringMap(x, y map[string]string) map[string]string { | |||||
| n := make(map[string]string) | |||||
| for i, v := range x { | |||||
| for j, w := range y { | |||||
| if i == j { | |||||
| n[i] = w | |||||
| } else { | |||||
| if _, ok := n[i]; !ok { | |||||
| n[i] = v | |||||
| } | |||||
| if _, ok := n[j]; !ok { | |||||
| n[j] = w | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return n | |||||
| } | |||||
| /** | |||||
| * 转换为map string数组 | |||||
| * 2021/1/5 | |||||
| * gz | |||||
| */ | |||||
| func ToMapStringArray(x interface{}) ([]map[string]string, error) { | |||||
| list, ok := x.([]interface{}) | |||||
| if !ok { | |||||
| return []map[string]string{}, errors.New("type error") | |||||
| } | |||||
| if len(list) < 1 { | |||||
| return []map[string]string{}, nil | |||||
| } | |||||
| var ret []map[string]string = make([]map[string]string, len(list)) | |||||
| var tmp map[string]interface{} | |||||
| var map_tmp map[string]string | |||||
| var err error | |||||
| for key, item := range list { | |||||
| if tmp, ok = item.(map[string]interface{}); ok { | |||||
| map_tmp = make(map[string]string) | |||||
| for k, v := range tmp { | |||||
| map_tmp[k] = ToStr(v) | |||||
| } | |||||
| ret[key] = map_tmp | |||||
| } else { | |||||
| err = errors.New("data type error") | |||||
| break | |||||
| } | |||||
| } | |||||
| return ret, err | |||||
| } | |||||
| @ -0,0 +1,131 @@ | |||||
| package helper | |||||
| import ( | |||||
| "fmt" | |||||
| "math/big" | |||||
| "strconv" | |||||
| ) | |||||
| //字节自动转换为B/KB/MB/GB | |||||
| func ByteToUnitSize(Size interface{}) (float64, string) { | |||||
| var unit string | |||||
| var iFloat, mb, gb float64 = 0, 1024, 1024 * 1024 | |||||
| iSize, _ := ToFloat64(Size) | |||||
| rSize := iSize / 1024 | |||||
| if rSize >= 0 && rSize < 1 { | |||||
| iFloat, unit = iSize, "B" | |||||
| } else if rSize >= 1 && rSize < mb { | |||||
| iFloat, unit = rSize, "KB" | |||||
| } else if rSize >= mb && rSize < gb { | |||||
| iFloat, unit = rSize/1024, "MB" | |||||
| } else if rSize >= gb { | |||||
| iFloat, unit = rSize/1024/1024, "GB" | |||||
| } | |||||
| return iFloat, unit | |||||
| } | |||||
| /** | |||||
| * 数值相加 | |||||
| * @param str 加数,加数... | |||||
| * 2020/05/22 | |||||
| * gz | |||||
| */ | |||||
| func FloatAdd(str ...interface{}) float64 { | |||||
| length := len(str) | |||||
| if length < 1 { | |||||
| return 0 | |||||
| } | |||||
| var i int = 0 | |||||
| var result, tmp float64 = 0, 0 | |||||
| var err error | |||||
| for i < length { | |||||
| tmp, err = ToFloat64(str[i]) | |||||
| if err == nil { | |||||
| result, _ = new(big.Float).Add(new(big.Float).SetFloat64(result), new(big.Float).SetFloat64(tmp)).Float64() | |||||
| } | |||||
| i++ | |||||
| } | |||||
| result, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", result), 64) | |||||
| return result | |||||
| } | |||||
| /** | |||||
| * float相减 | |||||
| * @param str 被减数,减数... | |||||
| * 2020/05/22 | |||||
| * gz | |||||
| */ | |||||
| func FloatSub(str ...interface{}) float64 { | |||||
| length := len(str) | |||||
| if length < 1 { | |||||
| return 0 | |||||
| } | |||||
| var i int = 1 | |||||
| result, err := ToFloat64(str[0]) | |||||
| var tmp float64 = 0 | |||||
| for i < length { | |||||
| tmp, err = ToFloat64(str[i]) | |||||
| if err == nil { | |||||
| result, _ = new(big.Float).Sub(new(big.Float).SetFloat64(result), new(big.Float).SetFloat64(tmp)).Float64() | |||||
| } | |||||
| i++ | |||||
| } | |||||
| result, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", result), 64) | |||||
| return result | |||||
| } | |||||
| /** | |||||
| * float相乘 | |||||
| * @param str 被除数,除数,保留小数位数 | |||||
| * 2020/05/25 | |||||
| * gz | |||||
| */ | |||||
| func FloatMul(str ...interface{}) float64 { | |||||
| if len(str) < 2 { | |||||
| return 0 | |||||
| } | |||||
| places := "2" //默认两位小数 | |||||
| if len(str) > 2 { | |||||
| places = ToString(str[2]) | |||||
| } | |||||
| float_1, _ := ToFloat64(str[0]) | |||||
| float_2, _ := ToFloat64(str[1]) | |||||
| ret, _ := new(big.Float).Mul(new(big.Float).SetFloat64(float_1), new(big.Float).SetFloat64(float_2)).Float64() | |||||
| ret, _ = strconv.ParseFloat(fmt.Sprintf("%."+places+"f", ret), 64) | |||||
| return ret | |||||
| } | |||||
| /** | |||||
| * float相除 | |||||
| * @param str 被除数,除数,保留小数位数 | |||||
| * 2020/05/25 | |||||
| * gz | |||||
| */ | |||||
| func FloatQuo(str ...interface{}) float64 { | |||||
| if len(str) < 2 { | |||||
| return 0 | |||||
| } | |||||
| places := "2" //默认两位小数 | |||||
| if len(str) > 2 { | |||||
| places = ToString(str[2]) | |||||
| } | |||||
| float_1, _ := ToFloat64(str[0]) | |||||
| float_2, _ := ToFloat64(str[1]) | |||||
| if float_2 <= 0 { | |||||
| return 0 | |||||
| } | |||||
| ret, _ := new(big.Float).Quo(new(big.Float).SetFloat64(float_1), new(big.Float).SetFloat64(float_2)).Float64() | |||||
| ret, _ = strconv.ParseFloat(fmt.Sprintf("%."+places+"f", ret), 64) | |||||
| return ret | |||||
| } | |||||
| @ -0,0 +1,44 @@ | |||||
| package helper | |||||
| import ( | |||||
| "strings" | |||||
| "testing" | |||||
| ) | |||||
| func Test_FloadAdd(t *testing.T) { | |||||
| // str1 := 4 | |||||
| str2 := "5" | |||||
| str3 := 6.5 | |||||
| // str4 := 1 | |||||
| ret := FloatAdd(str3, str2) | |||||
| t.Log(ret) | |||||
| percentage := "8:2:1" | |||||
| price := strings.Split(percentage, ":") | |||||
| ret = FloatAdd(price[0], price[1], price[2]) | |||||
| t.Log(ret) | |||||
| } | |||||
| func Test_FloatSub(t *testing.T) { | |||||
| str1 := 4.25 | |||||
| str2 := "5.33" | |||||
| ret := FloatSub(str1, str2) | |||||
| t.Log(ret) | |||||
| } | |||||
| func Test_FloatMul(t *testing.T) { | |||||
| str1 := 4.25 | |||||
| str2 := "5.33" | |||||
| ret := FloatMul(str1, str2, 1) | |||||
| t.Log(ret) | |||||
| } | |||||
| func Test_FloatQuo(t *testing.T) { | |||||
| str1 := 6 | |||||
| str2 := "7" | |||||
| ret := FloatQuo(str1, str2, 3) | |||||
| t.Log(ret) | |||||
| } | |||||
| @ -0,0 +1,48 @@ | |||||
| package helper | |||||
| import ( | |||||
| "strings" | |||||
| ) | |||||
| /** | |||||
| * 处理传递的参数 | |||||
| * @param param | |||||
| * @return | |||||
| * 2020/05/15 | |||||
| * gz | |||||
| */ | |||||
| func ParamsString(param string) string { | |||||
| if strings.Contains(param, " ") { | |||||
| return "" | |||||
| } | |||||
| return param | |||||
| } | |||||
| /** | |||||
| * 根据第几页计算从第几行开始 | |||||
| * @param pageNum 第几页 | |||||
| * @param pageSize 每页几行 | |||||
| * @return from,offset 开始行数,偏移量 | |||||
| * 2020/05/15 | |||||
| * gz | |||||
| */ | |||||
| func GetPage(pageNum, pageSize interface{}) (string, string) { | |||||
| var from string | |||||
| var offset int = ToInt(pageSize) | |||||
| var pageNumInt, pageSizeInt int = ToInt(pageNum), ToInt(pageSize) | |||||
| if pageNumInt < 1 { | |||||
| pageNumInt = 1 | |||||
| } | |||||
| if pageSizeInt < 1 { | |||||
| offset = 10 | |||||
| pageSizeInt = 10 | |||||
| } | |||||
| from = ToString((pageNumInt - 1) * pageSizeInt) | |||||
| return from, ToString(offset) | |||||
| } | |||||
| @ -0,0 +1,13 @@ | |||||
| package helper | |||||
| import ( | |||||
| "testing" | |||||
| ) | |||||
| func Test_GetPage(t *testing.T) { | |||||
| // var page, page_size string = "0", "10" | |||||
| from, offset := GetPage(2, 10) | |||||
| t.Log(from) | |||||
| t.Log(offset) | |||||
| } | |||||
| @ -0,0 +1,252 @@ | |||||
| /* | |||||
| * string functions | |||||
| */ | |||||
| package helper | |||||
| import ( | |||||
| "errors" | |||||
| "fmt" | |||||
| "log" | |||||
| "math/rand" | |||||
| "regexp" | |||||
| "strconv" | |||||
| "strings" | |||||
| "time" | |||||
| ) | |||||
| func ToString(v interface{}) string { | |||||
| var value string | |||||
| switch v.(type) { | |||||
| case string: | |||||
| value = v.(string) | |||||
| case int: | |||||
| value = strconv.Itoa(v.(int)) | |||||
| case float64: | |||||
| value = strconv.FormatFloat(v.(float64), 'f', 2, 64) | |||||
| case float32: | |||||
| value = strconv.FormatFloat(float64(v.(float32)), 'f', 2, 64) | |||||
| case int64: | |||||
| value = strconv.FormatInt(v.(int64), 10) | |||||
| case []uint8: | |||||
| value = string(v.([]uint8)) | |||||
| // case []byte: | |||||
| // value = string(v.([]byte)) | |||||
| case interface{}: | |||||
| value = v.(string) | |||||
| case nil: | |||||
| value = "" | |||||
| default: | |||||
| log.Println("参数值类型错误", v, "not in string|int|float64|interface|int64") | |||||
| } | |||||
| return strings.Trim(value, " ") | |||||
| } | |||||
| func ToStr(v interface{}) string { | |||||
| var value string | |||||
| switch v.(type) { | |||||
| case string: | |||||
| value = v.(string) | |||||
| case int: | |||||
| value = strconv.Itoa(v.(int)) | |||||
| case float64: | |||||
| value = strconv.FormatFloat(v.(float64), 'f', 0, 64) | |||||
| case float32: | |||||
| value = strconv.FormatFloat(float64(v.(float32)), 'f', 0, 64) | |||||
| case int64: | |||||
| value = strconv.FormatInt(v.(int64), 10) | |||||
| case []uint8: | |||||
| value = string(v.([]uint8)) | |||||
| // case []byte: | |||||
| // value = string(v.([]byte)) | |||||
| case interface{}: | |||||
| value = v.(string) | |||||
| case nil: | |||||
| value = "" | |||||
| default: | |||||
| log.Println("参数值类型错误", v, "not in string|int|float64|interface|int64") | |||||
| } | |||||
| return strings.Trim(value, " ") | |||||
| } | |||||
| func ToFloat64(v interface{}) (float64, error) { | |||||
| var value float64 | |||||
| var err error = nil | |||||
| switch v.(type) { | |||||
| case string: | |||||
| v_tmp := v.(string) | |||||
| value, _ = strconv.ParseFloat(v_tmp, 64) | |||||
| case int: | |||||
| value = float64(v.(int)) | |||||
| case int64: | |||||
| value = float64(v.(int64)) | |||||
| case float64: | |||||
| value = v.(float64) | |||||
| case interface{}: | |||||
| value = v.(float64) | |||||
| case nil: | |||||
| value = 0 | |||||
| default: | |||||
| err = errors.New("参数值类型错误") | |||||
| log.Println("参数值类型错误", v, "not in string|int|float64|interface|int64") | |||||
| } | |||||
| return value, err | |||||
| } | |||||
| func ToInt(inter interface{}) int { | |||||
| var value int | |||||
| switch inter.(type) { | |||||
| case string: | |||||
| value, _ = strconv.Atoi(inter.(string)) | |||||
| case int: | |||||
| value = inter.(int) | |||||
| case int64: | |||||
| value = int(inter.(int64)) | |||||
| case float64: | |||||
| value, _ = strconv.Atoi(fmt.Sprintf("%1.0f", inter)) | |||||
| case nil: | |||||
| value = 0 | |||||
| case interface{}: | |||||
| value = inter.(int) | |||||
| default: | |||||
| log.Println("参数值类型错误", inter, "not in string|int|float64|interface|int64") | |||||
| } | |||||
| return value | |||||
| } | |||||
| func ToInt64(inter interface{}) int64 { | |||||
| var value int64 | |||||
| switch inter.(type) { | |||||
| case string: | |||||
| value, _ = strconv.ParseInt(inter.(string), 10, 64) | |||||
| case int: | |||||
| value = int64(inter.(int)) | |||||
| case int64: | |||||
| value = inter.(int64) | |||||
| case float64: | |||||
| value_int, _ := strconv.Atoi(fmt.Sprintf("%1.0f", inter)) | |||||
| value = int64(value_int) | |||||
| case nil: | |||||
| value = 0 | |||||
| case interface{}: | |||||
| if _, ok := inter.(int64); !ok { | |||||
| value = inter.(int64) | |||||
| } | |||||
| default: | |||||
| log.Println("参数值类型错误", inter, "not in string|int|float64|interface|int64") | |||||
| } | |||||
| return value | |||||
| } | |||||
| //生成随机字符串 | |||||
| func GetRandomString(length int) string { | |||||
| str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" | |||||
| bytes := []byte(str) | |||||
| result := []byte{} | |||||
| r := rand.New(rand.NewSource(time.Now().UnixNano())) | |||||
| for i := 0; i < length; i++ { | |||||
| result = append(result, bytes[r.Intn(len(bytes))]) | |||||
| } | |||||
| return string(result) | |||||
| } | |||||
| //生成随机数字 | |||||
| func GetRandomNumber(length int) string { | |||||
| str := "0123456789" | |||||
| bytes := []byte(str) | |||||
| result := []byte{} | |||||
| r := rand.New(rand.NewSource(time.Now().UnixNano())) | |||||
| for i := 0; i < length; i++ { | |||||
| result = append(result, bytes[r.Intn(len(bytes))]) | |||||
| } | |||||
| return string(result) | |||||
| } | |||||
| /** | |||||
| * 字符串转大驼峰 ios_bbbbbbbb -> IosBbbbbbbbb | |||||
| */ | |||||
| func StrFirstToUpper(str string) string { | |||||
| temp := strings.Split(str, "_") | |||||
| var upperStr string | |||||
| for y := 0; y < len(temp); y++ { | |||||
| vv := []rune(temp[y]) | |||||
| for i := 0; i < len(vv); i++ { | |||||
| if i == 0 { | |||||
| vv[i] -= 32 | |||||
| upperStr += string(vv[i]) | |||||
| } else { | |||||
| upperStr += string(vv[i]) | |||||
| } | |||||
| } | |||||
| } | |||||
| return upperStr | |||||
| } | |||||
| /** | |||||
| * 是否存在在字符切片中 | |||||
| */ | |||||
| func IsInStringArray(arr []string, str string) bool { | |||||
| var isIn bool = false | |||||
| length := len(arr) | |||||
| if length < 1 { | |||||
| return false | |||||
| } | |||||
| for _, item := range arr { | |||||
| if item == str { | |||||
| isIn = true | |||||
| break | |||||
| } | |||||
| } | |||||
| return isIn | |||||
| } | |||||
| /* | |||||
| * 删除多余空格 | |||||
| * 2019/05/05 | |||||
| */ | |||||
| func DeleteExtraSpace(s string) string { | |||||
| s1 := strings.Replace(s, " ", " ", -1) //替换tab | |||||
| regstr := "\\s{2,}" //两个及两个以上空格的正则表达式 | |||||
| reg, _ := regexp.Compile(regstr) //编译正则表达式 | |||||
| s2 := make([]byte, len(s1)) | |||||
| copy(s2, s1) | |||||
| spc_index := reg.FindStringIndex(string(s2)) //在字符串中搜索 | |||||
| for len(spc_index) > 0 { | |||||
| s2 = append(s2[:spc_index[0]+1], s2[spc_index[1]:]...) //删除多余空格 | |||||
| spc_index = reg.FindStringIndex(string(s2)) | |||||
| } | |||||
| return string(s2) | |||||
| } | |||||
| /* | |||||
| * 连接多个字符串 | |||||
| * 2019/05/05 | |||||
| */ | |||||
| func StringJoin(s ...string) string { | |||||
| var build strings.Builder | |||||
| if len(s) > 0 { | |||||
| for _, v := range s { | |||||
| build.WriteString(v) | |||||
| } | |||||
| } | |||||
| return build.String() | |||||
| } | |||||
| /* | |||||
| * 连接url | |||||
| * 2019/05/05 | |||||
| */ | |||||
| func UrlJoin(host, url string) string { | |||||
| if strings.Contains(url, "http://") { | |||||
| return url | |||||
| } | |||||
| if strings.Contains(url, "https://") { | |||||
| return url | |||||
| } | |||||
| return StringJoin(host, url) | |||||
| } | |||||
| @ -0,0 +1,48 @@ | |||||
| package helper | |||||
| import ( | |||||
| "testing" | |||||
| ) | |||||
| func Test_ToInt64(t *testing.T) { | |||||
| var str interface{} = 45.00 | |||||
| ret := ToInt64(str) | |||||
| t.Log(ret) | |||||
| } | |||||
| func Test_GetRandomNumber(t *testing.T) { | |||||
| rand := GetRandomNumber(8) | |||||
| fmt.Println(rand) | |||||
| } | |||||
| func Test_GetRandomString(t *testing.T) { | |||||
| rand := GetRandomString(25) | |||||
| fmt.Println(rand) | |||||
| } | |||||
| func Test_DeleteExtraSpace(t *testing.T) { | |||||
| s := "c s dfdf dff df x" | |||||
| s2 := DeleteExtraSpace(s) | |||||
| t.Log(s2) | |||||
| } | |||||
| func Test_StringJoin(t *testing.T) { | |||||
| s1 := "testing" | |||||
| s2 := "测试一" | |||||
| s3 := "二" | |||||
| s4 := " ,s e" | |||||
| fmt.Println(StringJoin(s1, s2, s3, s4)) | |||||
| } | |||||
| func Test_ToString(t *testing.T) { | |||||
| var str float64 = 0.15 | |||||
| t.Log(str) | |||||
| ret := ToString(str) | |||||
| t.Log(ret) | |||||
| } | |||||
| func Test_ToInt(t *testing.T) { | |||||
| var str interface{} = 45 | |||||
| ret := ToInt(str) | |||||
| t.Log(ret) | |||||
| } | |||||
| @ -0,0 +1,478 @@ | |||||
| /* | |||||
| * System info | |||||
| */ | |||||
| package helper | |||||
| import ( | |||||
| "bytes" | |||||
| "errors" | |||||
| "fmt" | |||||
| "io/ioutil" | |||||
| "log" | |||||
| "os/exec" | |||||
| "regexp" | |||||
| "strconv" | |||||
| "strings" | |||||
| ) | |||||
| func CpuUsage() string { | |||||
| cmd := exec.Command("ps", "aux") | |||||
| var out bytes.Buffer | |||||
| cmd.Stdout = &out | |||||
| err := cmd.Run() | |||||
| if err != nil { | |||||
| return "" | |||||
| } | |||||
| var all float64 | |||||
| for { | |||||
| line, err := out.ReadString('\n') | |||||
| if err != nil { | |||||
| break | |||||
| } | |||||
| tokens := strings.Split(line, " ") | |||||
| ft := make([]string, 0) | |||||
| for _, t := range tokens { | |||||
| if t != "" && t != "\t" { | |||||
| ft = append(ft, t) | |||||
| } | |||||
| } | |||||
| if ft[2] == "%CPU" { | |||||
| continue | |||||
| } | |||||
| cpu, err := strconv.ParseFloat(ft[2], 64) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| all += cpu | |||||
| } | |||||
| return fmt.Sprintf("%.2f", all) | |||||
| } | |||||
| /* | |||||
| * disk usage of path/disk | |||||
| */ | |||||
| //func DiskUsage(path string) map[string]string { | |||||
| // mDisk := make(map[string]string) | |||||
| // sFs := syscall.Statfs_t{} | |||||
| // Err := syscall.Statfs(path, &sFs) | |||||
| // if Err != nil { | |||||
| // log.Println("ERROR", "170060|查询磁盘使用情况出错", Err.Error()) | |||||
| // return mDisk | |||||
| // } | |||||
| // All := sFs.Blocks * uint64(sFs.Bsize) / 1024 / 1024 | |||||
| // Free := sFs.Bfree * uint64(sFs.Bsize) / 1024 / 1024 | |||||
| // mDisk["All"] = strconv.FormatUint(All, 10) | |||||
| // mDisk["Free"] = strconv.FormatUint(Free, 10) | |||||
| // mDisk["Used"] = strconv.FormatUint((All - Free), 10) | |||||
| // return mDisk | |||||
| //} | |||||
| //func MemStat() map[string]string { | |||||
| // //系统占用,仅linux/mac下有效 | |||||
| // //system memory usage | |||||
| // mMem := make(map[string]string) | |||||
| // sysInfo := new(syscall.Sysinfo_t) | |||||
| // Err := syscall.Sysinfo(sysInfo) | |||||
| // if Err == nil { | |||||
| // All := sysInfo.Totalram / 1024 / 1024 | |||||
| // Free := sysInfo.Freeram / 1024 / 1024 | |||||
| // Swap := sysInfo.Totalswap / 1024 / 1024 | |||||
| // SwapFree := sysInfo.Freeswap / 1024 / 1024 | |||||
| // mMem["All"] = strconv.FormatUint(All, 10) //* uint64(syscall.Getpagesize()) | |||||
| // mMem["Free"] = strconv.FormatUint(Free, 10) //* uint64(syscall.Getpagesize()) | |||||
| // mMem["Used"] = strconv.FormatUint(All-Free, 10) | |||||
| // mMem["Swap"] = strconv.FormatUint(Swap, 10) | |||||
| // mMem["SwapFree"] = strconv.FormatUint(SwapFree, 10) | |||||
| // mMem["SwapUsed"] = strconv.FormatUint(Swap-SwapFree, 10) | |||||
| // day := sysInfo.Uptime / 86400 | |||||
| // hour := sysInfo.Uptime % 86400 / 3600 | |||||
| // minute := sysInfo.Uptime % 86400 % 3600 / 60 | |||||
| // tTime := time.Now().Unix() - sysInfo.Uptime | |||||
| // tNow := time.Unix(tTime, 10) | |||||
| // mMem["StartTime"] = tNow.Format("2006") + "-" + tNow.Format("01") + "-" + tNow.Format("02") + " " + tNow.Format("15") + ":" + tNow.Format("04") + ":" + tNow.Format("05") | |||||
| // mMem["Runtime"] = strconv.FormatInt(day, 10) + "天" + strconv.FormatInt(hour, 10) + "小时" + strconv.FormatInt(minute, 10) + "分钟" | |||||
| // | |||||
| // } else { | |||||
| // log.Println("ERROR", "170060|查询内存使用情况出错", Err.Error()) | |||||
| // } | |||||
| // return mMem | |||||
| //} | |||||
| /** | |||||
| * IO读写 | |||||
| */ | |||||
| func IoUsage() map[string]string { | |||||
| cmd := exec.Command("iostat") | |||||
| var out bytes.Buffer | |||||
| cmd.Stdout = &out | |||||
| err := cmd.Run() | |||||
| mIo := make(map[string]string) | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170061|系统命令iostat 执行错误", err.Error()) | |||||
| return mIo | |||||
| } | |||||
| for { | |||||
| line, err := out.ReadString('\n') | |||||
| if err != nil { | |||||
| break | |||||
| } | |||||
| tokens := strings.Split(line, " ") | |||||
| ft := make([]string, 0) | |||||
| for _, t := range tokens { | |||||
| if t != "" && t != "\t" { | |||||
| fi := strings.Trim(t, "\n\t") | |||||
| ft = append(ft, fi) | |||||
| } | |||||
| } | |||||
| if ft[0] == "sda" { | |||||
| mIo["ReadSpd"] = ft[2] | |||||
| mIo["WriteSpd"] = ft[3] | |||||
| mIo["Read"] = ft[4] | |||||
| mIo["Write"] = ft[5] | |||||
| } | |||||
| } | |||||
| return mIo | |||||
| } | |||||
| /** | |||||
| *文件系统使用率 | |||||
| */ | |||||
| func FileUsage() []interface{} { | |||||
| cmd := exec.Command("df", "-h") | |||||
| var out bytes.Buffer | |||||
| cmd.Stdout = &out | |||||
| err := cmd.Run() | |||||
| mList := make([]interface{}, 0) | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170061|系统命令df -h执行错误", err.Error()) | |||||
| return mList | |||||
| } | |||||
| var mRet map[string]string | |||||
| for { | |||||
| line, err := out.ReadString('\n') | |||||
| if err != nil { | |||||
| break | |||||
| } | |||||
| tokens := strings.Split(line, " ") | |||||
| ft := make([]string, 0) | |||||
| for _, t := range tokens { | |||||
| if t != "" && t != "\t" { | |||||
| fi := strings.Trim(t, "\n\t") | |||||
| ft = append(ft, fi) | |||||
| } | |||||
| } | |||||
| if ft[0] != "Filesystem" { | |||||
| mRet = make(map[string]string) | |||||
| mRet["FileSystem"] = ft[0] | |||||
| mRet["All"] = ft[1] | |||||
| mRet["Used"] = ft[2] | |||||
| mRet["Free"] = ft[3] | |||||
| mRet["UsePercent"] = ft[4] | |||||
| mRet["Mounted"] = ft[5] | |||||
| mList = append(mList, mRet) | |||||
| } | |||||
| } | |||||
| return mList | |||||
| } | |||||
| /** | |||||
| *系统负载1 5 10 分钟 | |||||
| */ | |||||
| func LoadAverage() map[string]string { | |||||
| cmd := exec.Command("uptime") | |||||
| var out bytes.Buffer | |||||
| cmd.Stdout = &out | |||||
| err := cmd.Run() | |||||
| mRet := make(map[string]string) | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170061|系统命令uptime执行错误", err.Error()) | |||||
| return mRet | |||||
| } | |||||
| sLine, err := out.ReadString('\n') | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170060|读取系统负载数据出错", err.Error()) | |||||
| return mRet | |||||
| } | |||||
| //正则表达获取1 5 15 分钟系统负载数据 | |||||
| sRegs := "\\d+\\.\\d+" | |||||
| sReg := regexp.MustCompile(sRegs) | |||||
| sLoadAverage := sReg.FindAllString(sLine, 3) | |||||
| if len(sLoadAverage) >= 3 { | |||||
| mRet["OneMin"] = sLoadAverage[0] | |||||
| mRet["FivMin"] = sLoadAverage[1] | |||||
| mRet["TenfivMin"] = sLoadAverage[2] | |||||
| } else { | |||||
| return mRet | |||||
| } | |||||
| return mRet | |||||
| } | |||||
| /** | |||||
| *网卡使用情况 | |||||
| */ | |||||
| func NetUsage() []interface{} { | |||||
| var Net struct { | |||||
| NetCard string | |||||
| Rbytes string | |||||
| Rpackets string | |||||
| Rerrors string | |||||
| Rpck string | |||||
| Sbytes string | |||||
| Spackets string | |||||
| Serrors string | |||||
| Spck string | |||||
| } | |||||
| cmd := exec.Command("ifconfig") | |||||
| var out bytes.Buffer | |||||
| cmd.Stdout = &out | |||||
| err := cmd.Run() | |||||
| aNetList := make([]interface{}, 0) | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170060|查询网卡使用情况出错", err.Error()) | |||||
| return aNetList | |||||
| } | |||||
| for { | |||||
| line, err := out.ReadString('\n') | |||||
| if err != nil { | |||||
| break | |||||
| } | |||||
| tokens := strings.Split(line, " ") | |||||
| ft := make([]string, 0) | |||||
| for _, t := range tokens { | |||||
| if t != "" && t != "\t" { | |||||
| fi := strings.Trim(t, "\n\t") | |||||
| ft = append(ft, fi) | |||||
| } | |||||
| } | |||||
| if ft[0] != "" { | |||||
| if ft[1] == "Link" { | |||||
| Net.NetCard = ft[0] | |||||
| sPck := NetBytes(ft[0]) | |||||
| if len(sPck) >= 2 { | |||||
| Net.Rpck = sPck[0] | |||||
| Net.Spck = sPck[1] | |||||
| } else { | |||||
| Net.Rpck = "0.0" | |||||
| Net.Spck = "0.0" | |||||
| } | |||||
| } | |||||
| if ft[0] == "RX" { | |||||
| if strings.Contains(ft[1], "packets") { | |||||
| sPackets := strings.SplitAfter(ft[1], ":") | |||||
| Net.Rpackets = sPackets[1] | |||||
| sErrors := strings.SplitAfter(ft[2], ":") | |||||
| Net.Rerrors = sErrors[1] | |||||
| } | |||||
| if strings.Contains(ft[1], "bytes") { | |||||
| rBytes := strings.SplitAfter(ft[1], ":") | |||||
| Net.Rbytes = rBytes[1] | |||||
| sBytes := strings.SplitAfter(ft[5], ":") | |||||
| Net.Sbytes = sBytes[1] | |||||
| aNetList = append(aNetList, Net) | |||||
| } | |||||
| } | |||||
| if ft[0] == "TX" { | |||||
| if strings.Contains(ft[1], "packets") { | |||||
| sPackets := strings.SplitAfter(ft[1], ":") | |||||
| Net.Spackets = sPackets[1] | |||||
| sErrors := strings.SplitAfter(ft[2], ":") | |||||
| Net.Serrors = sErrors[1] | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return aNetList | |||||
| } | |||||
| /** | |||||
| *网卡实时流量 | |||||
| */ | |||||
| func NetBytes(Iface string) []string { | |||||
| aBytesInfo := make([]string, 0) | |||||
| cmd := exec.Command("sar", "-n", "DEV", "1", "1") | |||||
| var out bytes.Buffer | |||||
| cmd.Stdout = &out | |||||
| err := cmd.Run() | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170060|查询实时流量情况出错", err.Error()) | |||||
| return aBytesInfo | |||||
| } | |||||
| for { | |||||
| line, err := out.ReadString('\n') | |||||
| if err != nil { | |||||
| break | |||||
| } | |||||
| tokens := strings.Split(line, " ") | |||||
| ft := make([]string, 0) | |||||
| for _, t := range tokens { | |||||
| if t != "" && t != "\t" { | |||||
| fi := strings.Trim(t, "\n\t") | |||||
| ft = append(ft, fi) | |||||
| } | |||||
| } | |||||
| if ft[0] == "Average:" { | |||||
| if ft[1] == Iface { | |||||
| aBytesInfo = append(aBytesInfo, ft[2]) | |||||
| aBytesInfo = append(aBytesInfo, ft[3]) | |||||
| } | |||||
| } | |||||
| } | |||||
| return aBytesInfo | |||||
| } | |||||
| /** | |||||
| *网络配置 | |||||
| */ | |||||
| func GetNetConfig() []interface{} { | |||||
| aNetCard := make([]interface{}, 0) | |||||
| cmd := exec.Command("cat", "/etc/network/interfaces") | |||||
| var out bytes.Buffer | |||||
| cmd.Stdout = &out | |||||
| err := cmd.Run() | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170050|查询网卡配置信息出错", err.Error()) | |||||
| return aNetCard | |||||
| } | |||||
| var mNetConfig map[string]string | |||||
| mNetConfig = make(map[string]string) | |||||
| for { | |||||
| line, err := out.ReadString('\n') | |||||
| if err != nil { | |||||
| break | |||||
| } | |||||
| nline := strings.Replace(line, "\t", " ", -1) | |||||
| tokens := strings.Split(nline, " ") | |||||
| ft := make([]string, 0) | |||||
| for _, t := range tokens { | |||||
| if t != "" { | |||||
| fi := strings.Trim(t, "\n") | |||||
| ft = append(ft, fi) | |||||
| } | |||||
| } | |||||
| switch ft[0] { | |||||
| case "auto": | |||||
| if len(ft) < 2 { | |||||
| ft = append(ft, " ") | |||||
| } | |||||
| if ft[1] != "lo" { | |||||
| mNetConfig["NetCard"] = ft[1] | |||||
| } | |||||
| case "netmask": | |||||
| if len(ft) < 2 { | |||||
| ft = append(ft, " ") | |||||
| } | |||||
| mNetConfig["NetMask"] = ft[1] | |||||
| case "gateway": | |||||
| if len(ft) < 2 { | |||||
| ft = append(ft, " ") | |||||
| } | |||||
| mNetConfig["GateWay"] = ft[1] | |||||
| case "address": | |||||
| if len(ft) < 2 { | |||||
| ft = append(ft, " ") | |||||
| } | |||||
| mNetConfig["Ip"] = ft[1] | |||||
| case "dns-nameservers": | |||||
| if len(ft) < 2 { | |||||
| ft = append(ft, "") | |||||
| } | |||||
| mNetConfig["Dns"] = ft[1] | |||||
| case "dns-nameserver": | |||||
| if len(ft) < 2 { | |||||
| ft = append(ft, "") | |||||
| } | |||||
| mNetConfig["Dns"] = ft[1] | |||||
| } | |||||
| if len(mNetConfig) == 5 { | |||||
| aNetCard = append(aNetCard, mNetConfig) | |||||
| mNetConfig = make(map[string]string) | |||||
| } | |||||
| } | |||||
| return aNetCard | |||||
| } | |||||
| /** | |||||
| *修改网络配置 | |||||
| */ | |||||
| func PutNetConfig(mString map[string]string) error { | |||||
| bFile, err := ioutil.ReadFile("/etc/network/interfaces") | |||||
| if err != nil { | |||||
| log.Println("ERROR", "170050|读取网卡配置文件出错", err.Error()) | |||||
| return err | |||||
| } | |||||
| var sName, sRegs string | |||||
| var Reg *regexp.Regexp | |||||
| mNetCard := make(map[string]string, 0) | |||||
| for i, v := range mString { | |||||
| var err error | |||||
| if v == "" { | |||||
| err = errors.New("参数值为空") | |||||
| return err | |||||
| } | |||||
| switch i { | |||||
| case "Ip": | |||||
| mNetCard["address"] = v | |||||
| case "GateWay": | |||||
| mNetCard["gateway"] = v | |||||
| case "Dns": | |||||
| mNetCard["dns-nameserver"] = v | |||||
| case "NetMask": | |||||
| mNetCard["netmask"] = v | |||||
| } | |||||
| } | |||||
| for i, v := range mNetCard { | |||||
| sName = i | |||||
| sRegs = sName + "\\s+\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" | |||||
| Reg = regexp.MustCompile(sRegs) | |||||
| bOld := Reg.Find(bFile) | |||||
| bFile = bytes.Replace(bFile, bOld, []byte(i+" "+v), 1) | |||||
| } | |||||
| err = ioutil.WriteFile("/etc/network/interfaces", bFile, 644) | |||||
| if err != nil { | |||||
| panic(err) | |||||
| log.Println("ERROR", "170051|写入网卡配置文件出错", err.Error()) | |||||
| return err | |||||
| } | |||||
| return nil | |||||
| } | |||||
| @ -0,0 +1,21 @@ | |||||
| package helper | |||||
| import ( | |||||
| "strconv" | |||||
| "time" | |||||
| ) | |||||
| func FormatDateTime(str string) string { | |||||
| date, err := strconv.ParseInt(str, 10, 64) | |||||
| if err != nil { | |||||
| return "" | |||||
| } | |||||
| return time.Unix(date, 0).Format("2006-01-02 15:04:05") | |||||
| } | |||||
| func FormatDate(str string) string { | |||||
| date, err := strconv.ParseInt(str, 10, 64) | |||||
| if err != nil { | |||||
| return "" | |||||
| } | |||||
| return time.Unix(date, 0).Format("2006-01-02") | |||||
| } | |||||
| @ -0,0 +1,17 @@ | |||||
| package helper | |||||
| import ( | |||||
| "testing" | |||||
| "time" | |||||
| ) | |||||
| func Test_FormatDate(t *testing.T) { | |||||
| str := "1110" | |||||
| strconv := FormatDate(str) | |||||
| t.Log(strconv) | |||||
| timing := "2019/1/1 8:28" | |||||
| ret, err := time.ParseInLocation("2006/1/2 15:04", timing, time.Local) | |||||
| t.Log(ret.Unix()) | |||||
| t.Log(err) | |||||
| } | |||||
| @ -0,0 +1,71 @@ | |||||
| package helper | |||||
| import ( | |||||
| "crypto/rand" | |||||
| "encoding/hex" | |||||
| "fmt" | |||||
| ) | |||||
| // Simple call | |||||
| func NewUUID() string { | |||||
| uuid, _ := GenerateUUID() | |||||
| return uuid | |||||
| } | |||||
| // GenerateRandomBytes is used to generate random bytes of given size. | |||||
| func GenerateRandomBytes(size int) ([]byte, error) { | |||||
| buf := make([]byte, size) | |||||
| if _, err := rand.Read(buf); err != nil { | |||||
| return nil, fmt.Errorf("failed to read random bytes: %v", err) | |||||
| } | |||||
| return buf, nil | |||||
| } | |||||
| const uuidLen = 16 | |||||
| // GenerateUUID is used to generate a random UUID | |||||
| func GenerateUUID() (string, error) { | |||||
| buf, err := GenerateRandomBytes(uuidLen) | |||||
| if err != nil { | |||||
| return "", err | |||||
| } | |||||
| return FormatUUID(buf) | |||||
| } | |||||
| func FormatUUID(buf []byte) (string, error) { | |||||
| if buflen := len(buf); buflen != uuidLen { | |||||
| return "", fmt.Errorf("wrong length byte slice (%d)", buflen) | |||||
| } | |||||
| return fmt.Sprintf("%x-%x-%x-%x-%x", | |||||
| buf[0:4], | |||||
| buf[4:6], | |||||
| buf[6:8], | |||||
| buf[8:10], | |||||
| buf[10:16]), nil | |||||
| } | |||||
| func ParseUUID(uuid string) ([]byte, error) { | |||||
| if len(uuid) != 2*uuidLen+4 { | |||||
| return nil, fmt.Errorf("uuid string is wrong length") | |||||
| } | |||||
| if uuid[8] != '-' || | |||||
| uuid[13] != '-' || | |||||
| uuid[18] != '-' || | |||||
| uuid[23] != '-' { | |||||
| return nil, fmt.Errorf("uuid is improperly formatted") | |||||
| } | |||||
| hexStr := uuid[0:8] + uuid[9:13] + uuid[14:18] + uuid[19:23] + uuid[24:36] | |||||
| ret, err := hex.DecodeString(hexStr) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if len(ret) != uuidLen { | |||||
| return nil, fmt.Errorf("decoded hex is the wrong length") | |||||
| } | |||||
| return ret, nil | |||||
| } | |||||
| @ -0,0 +1,69 @@ | |||||
| package helper | |||||
| import ( | |||||
| "errors" | |||||
| "regexp" | |||||
| "strings" | |||||
| ) | |||||
| /** | |||||
| * 验证 | |||||
| * 2020/08/10 | |||||
| */ | |||||
| type Validate struct { | |||||
| Data []interface{} | |||||
| Title []string | |||||
| Rule []string //多个规则使用逗号(,)隔开 | |||||
| } | |||||
| func (v *Validate) Check() error { | |||||
| if len(v.Data) == 0 { | |||||
| return nil | |||||
| } | |||||
| if len(v.Data) != len(v.Title) || len(v.Data) != len(v.Rule) { | |||||
| return errors.New("验证参数不对应") | |||||
| } | |||||
| msg := make([]string, 0) | |||||
| var ok bool | |||||
| for key, data := range v.Data { | |||||
| rules := strings.Split(v.Rule[key], ",") //分隔所有规则 | |||||
| for _, rule := range rules { | |||||
| switch rule { | |||||
| case "require": | |||||
| ok = require(data) | |||||
| if !ok { | |||||
| msg = append(msg, StringJoin(v.Title[key], "不能为空")) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| if len(msg) == 0 { | |||||
| return nil | |||||
| } | |||||
| return errors.New(strings.Join(msg, ",")) | |||||
| } | |||||
| func require(data interface{}) bool { | |||||
| if ToString(data) == "" { | |||||
| return false | |||||
| } | |||||
| return true | |||||
| } | |||||
| // 判断手机号码 | |||||
| func IsMobile(mobile string) bool { | |||||
| result, _ := regexp.MatchString(`^(1[3|4|5|6|7|8]\d{9})$`, mobile) | |||||
| if result { | |||||
| return true | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| } | |||||
| // 判断邮箱 | |||||
| func IsEmail(email string) bool { | |||||
| pattern := `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*` //匹配电子邮箱 | |||||
| reg := regexp.MustCompile(pattern) | |||||
| return reg.MatchString(email) | |||||
| } | |||||
| @ -0,0 +1,15 @@ | |||||
| package helper | |||||
| import ( | |||||
| "testing" | |||||
| ) | |||||
| func Test_IsMobile(t *testing.T) { | |||||
| s := "1344456907s" | |||||
| ret := IsMobile(s) | |||||
| t.Log(ret) | |||||
| s = "+1@ee.22" | |||||
| ret = IsEmail(s) | |||||
| t.Log(ret) | |||||
| } | |||||