初始
This commit is contained in:
308
api/v1/common/tool/tool.go
Normal file
308
api/v1/common/tool/tool.go
Normal file
@ -0,0 +1,308 @@
|
||||
package tool
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/md5"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
/*
|
||||
判断文件或文件夹是否存在
|
||||
如果返回的错误为nil,说明文件或文件夹存在
|
||||
如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
|
||||
如果返回的错误为其它类型,则不确定是否在存在
|
||||
*/
|
||||
func PathExists(path string) bool {
|
||||
|
||||
_, err := os.Stat(path)
|
||||
if err == nil {
|
||||
return true
|
||||
}
|
||||
if os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/*
|
||||
检查字符串是否在某一数组中
|
||||
*/
|
||||
func IsContainStr(items []string, item string) bool {
|
||||
for _, eachItem := range items {
|
||||
if eachItem == item {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 调用os.MkdirAll递归创建文件夹
|
||||
func CreateDir(dirPath string) {
|
||||
if !isExist(dirPath) {
|
||||
fmt.Println("路径不存在,创建路径", dirPath)
|
||||
_ = os.MkdirAll(dirPath, os.ModePerm)
|
||||
}
|
||||
}
|
||||
|
||||
// 判断所给路径文件/文件夹是否存在(返回true是存在)
|
||||
func isExist(path string) bool {
|
||||
_, err := os.Stat(path) //os.Stat获取文件信息
|
||||
if err != nil {
|
||||
if os.IsExist(err) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/*获取uuid*/
|
||||
func GetUuid() string {
|
||||
str := GetRandstring(32)
|
||||
time.Sleep(time.Nanosecond)
|
||||
return strings.ToLower(Md5V(str))
|
||||
}
|
||||
|
||||
// #取得随机字符串:使用字符串拼接
|
||||
func GetRandstring(lenNum int) string {
|
||||
var CHARS = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
|
||||
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
|
||||
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}
|
||||
str := strings.Builder{}
|
||||
length := len(CHARS)
|
||||
for i := 0; i < lenNum; i++ {
|
||||
l := CHARS[rand.Intn(length)]
|
||||
str.WriteString(l)
|
||||
}
|
||||
return str.String()
|
||||
|
||||
}
|
||||
|
||||
// 获取当前执行程序所在的绝对路径
|
||||
func GetCurrentAbPathByExecutable() string {
|
||||
exePath, err := os.Executable()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))
|
||||
return res
|
||||
}
|
||||
|
||||
/*结构体转map且首字母小写*/
|
||||
func Struct2Map(obj interface{}) map[string]interface{} {
|
||||
t := reflect.TypeOf(obj)
|
||||
v := reflect.ValueOf(obj)
|
||||
var data = make(map[string]interface{})
|
||||
for i := 0; i < t.NumField(); i++ {
|
||||
data[strings.ToLower(string(t.Field(i).Name[0]))+t.Field(i).Name[1:]] = v.Field(i).Interface()
|
||||
//data[t.Field(i).Name] = v.Field(i).Interface()
|
||||
}
|
||||
return data
|
||||
}
|
||||
func PortInUse(port int) int {
|
||||
checkStatement := fmt.Sprintf("lsof -i:%d ", port)
|
||||
output, _ := exec.Command("sh", "-c", checkStatement).CombinedOutput()
|
||||
fmt.Println(output)
|
||||
if len(output) > 0 {
|
||||
return 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
/*检测端口是否在使用中*/
|
||||
// 传入查询的端口号
|
||||
// 返回端口号对应的进程PID,若没有找到相关进程,返回-1
|
||||
func portInUse(portNumber int) int {
|
||||
res := -1
|
||||
var outBytes bytes.Buffer
|
||||
sysType := runtime.GOOS
|
||||
fmt.Println(sysType)
|
||||
var cmdStr = ""
|
||||
if sysType == "linux" {
|
||||
cmdStr = fmt.Sprintf("lsof -i:%d ", portNumber)
|
||||
}
|
||||
//
|
||||
if sysType == "windows" {
|
||||
cmdStr = fmt.Sprintf("netstat -ano -p tcp | findstr %d", portNumber)
|
||||
}
|
||||
//checkStatement := fmt.Sprintf("lsof -i:%d ", portNumber)
|
||||
fmt.Println(cmdStr)
|
||||
cmd := exec.Command("cmd", "/c", cmdStr)
|
||||
cmd.Stdout = &outBytes
|
||||
cmd.Run()
|
||||
resStr := outBytes.String()
|
||||
fmt.Println(resStr)
|
||||
r := regexp.MustCompile(`\s\d+\s`).FindAllString(resStr, -1)
|
||||
if len(r) > 0 {
|
||||
pid, err := strconv.Atoi(strings.TrimSpace(r[0]))
|
||||
if err != nil {
|
||||
res = -1
|
||||
} else {
|
||||
res = pid
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func GetUnUsePort(port int) int {
|
||||
isInUse := PortInUse(port)
|
||||
if isInUse != -1 {
|
||||
fmt.Println("端口:" + strconv.Itoa(port) + " 被占用")
|
||||
port++
|
||||
port = GetUnUsePort(port)
|
||||
return port
|
||||
} else {
|
||||
return port
|
||||
}
|
||||
}
|
||||
|
||||
// WeekIntervalTime 获取某周的开始和结束时间,week为0本周,-1上周,1下周以此类推
|
||||
func WeekIntervalTime(week int) (startTime, endTime string) {
|
||||
now := time.Now()
|
||||
offset := int(time.Monday - now.Weekday())
|
||||
//周日做特殊判断 因为time.Monday = 0
|
||||
if offset > 0 {
|
||||
offset = -6
|
||||
}
|
||||
|
||||
year, month, day := now.Date()
|
||||
thisWeek := time.Date(year, month, day, 0, 0, 0, 0, time.Local)
|
||||
startTime = thisWeek.AddDate(0, 0, offset+7*week).Format("2006-01-02") + " 00:00:00"
|
||||
endTime = thisWeek.AddDate(0, 0, offset+6+7*week).Format("2006-01-02") + " 23:59:59"
|
||||
|
||||
return startTime, endTime
|
||||
}
|
||||
|
||||
// GetCurrentTime 获取当前系统时间
|
||||
func GetCurrentTime() string {
|
||||
return time.Now().Format("2006-01-02 15:04:05")
|
||||
}
|
||||
|
||||
/*删除文件或文件夹*/
|
||||
func RemoveFile(path string) {
|
||||
if isExist(path) {
|
||||
err := os.Remove(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 检查参数
|
||||
func Md5V(str string) string {
|
||||
h := md5.New()
|
||||
h.Write([]byte(str))
|
||||
return hex.EncodeToString(h.Sum(nil))
|
||||
}
|
||||
|
||||
// download file会将url下载到本地文件,它会在下载时写入,而不是将整个文件加载到内存中。
|
||||
func DownloadFile(filepath string, url string) error {
|
||||
|
||||
// Get the data
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
// Create the file
|
||||
out, err := os.Create(filepath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
// Write the body to file
|
||||
_, err = io.Copy(out, resp.Body)
|
||||
return err
|
||||
}
|
||||
|
||||
// 通用排序
|
||||
// 结构体排序,必须重写数组Len() Swap() Less()函数
|
||||
type body_wrapper struct {
|
||||
Bodys []interface{}
|
||||
by func(p, q *interface{}) bool //内部Less()函数会用到
|
||||
}
|
||||
type SortBodyBy func(p, q *interface{}) bool //定义一个函数类型
|
||||
|
||||
// 数组长度Len()
|
||||
func (acw body_wrapper) Len() int {
|
||||
return len(acw.Bodys)
|
||||
}
|
||||
|
||||
// 元素交换
|
||||
func (acw body_wrapper) Swap(i, j int) {
|
||||
acw.Bodys[i], acw.Bodys[j] = acw.Bodys[j], acw.Bodys[i]
|
||||
}
|
||||
|
||||
// 比较函数,使用外部传入的by比较函数
|
||||
func (acw body_wrapper) Less(i, j int) bool {
|
||||
return acw.by(&acw.Bodys[i], &acw.Bodys[j])
|
||||
}
|
||||
|
||||
// 自定义排序字段,参考SortBodyByCreateTime中的传入函数
|
||||
func SortBody(bodys []interface{}, by SortBodyBy) {
|
||||
sort.Sort(body_wrapper{bodys, by})
|
||||
}
|
||||
|
||||
// 格式化时间
|
||||
type LocalTime time.Time
|
||||
|
||||
func (t *LocalTime) MarshalJSON() ([]byte, error) {
|
||||
tTime := time.Time(*t)
|
||||
return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
|
||||
}
|
||||
|
||||
// 写入文件,保存
|
||||
func WriteFile(path string, base64_image_content string) (error, string) {
|
||||
|
||||
//b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, base64_image_content)
|
||||
//if !b {
|
||||
// return errors.New(""), ""
|
||||
//}
|
||||
base64_image_content = "data:image/png;base64," + base64_image_content
|
||||
re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`)
|
||||
allData := re.FindAllSubmatch([]byte(base64_image_content), 2)
|
||||
fileType := string(allData[0][1]) //png ,jpeg 后缀获取
|
||||
|
||||
base64Str := re.ReplaceAllString(base64_image_content, "")
|
||||
|
||||
//date := time.Now().Format("2006-01-02")
|
||||
//if ok := IsFileExist(path + "/" + date); !ok {
|
||||
// os.Mkdir(path+"/"+date, 0666)
|
||||
//}
|
||||
|
||||
curFileStr := strconv.FormatInt(time.Now().UnixNano(), 10)
|
||||
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
n := r.Intn(99999)
|
||||
var filename = curFileStr + strconv.Itoa(n) + "." + fileType
|
||||
var file = path + "/" + filename
|
||||
byte, _ := base64.StdEncoding.DecodeString(base64Str)
|
||||
|
||||
err := ioutil.WriteFile(file, byte, 0666)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
return err, filename
|
||||
}
|
||||
|
||||
func UploadsFile() {
|
||||
|
||||
}
|
Reference in New Issue
Block a user