119 lines
2.5 KiB
Go
119 lines
2.5 KiB
Go
package pkg
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"os"
|
||
"reflect"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
type ()
|
||
|
||
func DefaultLogPath(jobName string) (string, error) {
|
||
path, err := os.Getwd()
|
||
path = fmt.Sprintf("%s/%s/%s", path, "log/export", jobName)
|
||
err = CheckDir(path)
|
||
return path, err
|
||
}
|
||
|
||
func CheckDir(path string) error {
|
||
// 判断目录是否存在
|
||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||
// 如果目录不存在,则创建它
|
||
err = os.MkdirAll(path, os.ModePerm)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
} else if err != nil {
|
||
// 如果Stat返回了其他错误(比如权限问题)
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func CreateTaskId() string {
|
||
return fmt.Sprintf("%d", time.Now().UnixNano())
|
||
}
|
||
|
||
// toMap 将结构体转换为map[string]interface{}
|
||
// StructToMap 将一个struct转换为map[string]interface{}
|
||
func StructToMap(obj interface{}) map[string]interface{} {
|
||
// 获取obj的类型
|
||
val := reflect.ValueOf(obj)
|
||
if val.Kind() == reflect.Ptr {
|
||
val = val.Elem()
|
||
}
|
||
|
||
// 确保obj是一个struct
|
||
if val.Kind() != reflect.Struct {
|
||
return nil
|
||
}
|
||
|
||
// 创建一个map来保存结果
|
||
data := make(map[string]interface{})
|
||
|
||
// 遍历struct的字段
|
||
for i := 0; i < val.NumField(); i++ {
|
||
// 获取字段的类型和值
|
||
valueField := val.Field(i)
|
||
typeField := val.Type().Field(i)
|
||
jsonTag := typeField.Tag.Get("json")
|
||
if idx := strings.Index(jsonTag, ","); idx != -1 {
|
||
// 如果有逗号,则取逗号之前的部分
|
||
jsonTag = jsonTag[:idx]
|
||
}
|
||
// 忽略未导出的字段(字段名首字母小写)
|
||
if !typeField.IsExported() {
|
||
continue
|
||
}
|
||
|
||
// 将字段名和值添加到map中
|
||
data[jsonTag] = valueField.Interface()
|
||
}
|
||
|
||
return data
|
||
}
|
||
|
||
func GetData(data interface{}) (out []map[string]interface{}) {
|
||
|
||
switch data.(type) {
|
||
case []map[string]interface{}:
|
||
for _, item := range data.([]map[string]interface{}) {
|
||
out = append(out, item)
|
||
}
|
||
|
||
case []map[string]string:
|
||
for _, maps := range data.([]map[string]string) {
|
||
newMap := make(map[string]interface{})
|
||
for key, item := range maps {
|
||
newMap[key] = item
|
||
}
|
||
out = append(out, newMap)
|
||
}
|
||
case []interface{}:
|
||
for _, item := range data.([]interface{}) {
|
||
dataMap := StructToMap(item)
|
||
if dataMap == nil {
|
||
return nil
|
||
}
|
||
out = append(out, dataMap)
|
||
}
|
||
case string:
|
||
err := json.Unmarshal([]byte(data.(string)), &out)
|
||
if err != nil {
|
||
return nil
|
||
}
|
||
case []byte:
|
||
err := json.Unmarshal(data.([]byte), &out)
|
||
if err != nil {
|
||
return nil
|
||
}
|
||
default:
|
||
return nil
|
||
}
|
||
|
||
return
|
||
}
|