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