utils.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package utils
  2. import (
  3. "crypto/md5"
  4. "crypto/sha1"
  5. "encoding/hex"
  6. "encoding/json"
  7. "fmt"
  8. "github.com/jinzhu/copier"
  9. "github.com/joho/godotenv"
  10. "io"
  11. "log"
  12. "os"
  13. "reflect"
  14. "sort"
  15. "strings"
  16. "zhiyuan/pkg/config"
  17. "zhiyuan/pkg/logger"
  18. )
  19. func GetEnv(envName string) string {
  20. err := godotenv.Load()
  21. if err != nil {
  22. log.Fatal("Error loading .env file")
  23. }
  24. return os.Getenv(envName)
  25. }
  26. func PowInt(x int, y int) int {
  27. if y <= 0 {
  28. return 1
  29. } else {
  30. if y%2 == 0 {
  31. sqrt := PowInt(x, y/2)
  32. return sqrt * sqrt
  33. } else {
  34. return PowInt(x, y-1) * x
  35. }
  36. }
  37. }
  38. func MergeMap(src, dest map[string]interface{}) map[string]interface{} {
  39. for k, v := range dest {
  40. src[k] = v
  41. }
  42. return src
  43. }
  44. func StructToMapViaJson(data interface{}) (map[string]interface{}, error) {
  45. dataBytes, err := json.Marshal(data)
  46. if err != nil {
  47. return nil, err
  48. }
  49. mapData := make(map[string]interface{})
  50. err = json.Unmarshal(dataBytes, &mapData)
  51. if err != nil {
  52. return nil, err
  53. }
  54. return mapData, nil
  55. }
  56. func StructToMapViaReflect(target interface{}, useTag string) map[string]interface{} {
  57. if nil == target {
  58. return nil
  59. }
  60. v := reflect.ValueOf(target)
  61. for v.Kind() == reflect.Ptr {
  62. v = v.Elem()
  63. }
  64. if v.Kind() != reflect.Struct {
  65. return nil
  66. }
  67. t := v.Type()
  68. result := make(map[string]interface{})
  69. for i := 0; i < t.NumField(); i++ {
  70. keyName := t.Field(i).Tag.Get(useTag)
  71. if keyName == "" {
  72. keyName = t.Field(i).Name
  73. } else {
  74. keyName = strings.TrimSpace(strings.Split(keyName, ",")[0])
  75. }
  76. result[keyName] = v.Field(i).Interface()
  77. }
  78. return result
  79. }
  80. func JsonToString(v interface{}) string {
  81. res, err := json.Marshal(v)
  82. if err != nil {
  83. logger.Log.Fatal("Error json")
  84. }
  85. return string(res)
  86. }
  87. func RemoveRepeatByLoop(arr []string) []string {
  88. newArr := make([]string, 0)
  89. for i := 0; i < len(arr); i++ {
  90. repeat := false
  91. for j := i + 1; j < len(arr); j++ {
  92. if arr[i] == arr[j] {
  93. repeat = true
  94. break
  95. }
  96. }
  97. if !repeat {
  98. newArr = append(newArr, arr[i])
  99. }
  100. }
  101. return newArr
  102. }
  103. func RemoveRepeatByMap(arr []string) []string {
  104. newArr := make([]string, 0)
  105. tempMap := make(map[string]interface{}, 0)
  106. for _, v := range arr {
  107. if tempMap[v] == nil {
  108. newArr = append(newArr, v)
  109. tempMap[v] = v
  110. }
  111. }
  112. return newArr
  113. }
  114. func RemoveRepeat(arr []string) []string {
  115. if len(arr) < 1024 {
  116. return RemoveRepeatByLoop(arr)
  117. } else {
  118. return RemoveRepeatByMap(arr)
  119. }
  120. }
  121. func ParseSliceMap(value interface{}, mapKey string) map[string]map[string]interface{} {
  122. res := make(map[string]map[string]interface{}, 0)
  123. if valueMap, ok := value.([]map[string]interface{}); ok {
  124. for _, v := range valueMap {
  125. res[ToStr(v[mapKey])] = v
  126. }
  127. } else if valueSlice, ok := value.([]interface{}); ok {
  128. for _, v := range valueSlice {
  129. mapV := StructToMapViaReflect(v, "json")
  130. res[ToStr(mapV[mapKey])] = mapV
  131. }
  132. } else if reflect.TypeOf(value).Kind() == reflect.Slice {
  133. s := reflect.ValueOf(value)
  134. for i := 0; i < s.Len(); i++ {
  135. mapV := StructToMapViaReflect(s.Index(i).Interface(), "json")
  136. res[ToStr(mapV[mapKey])] = mapV
  137. }
  138. }
  139. return res
  140. }
  141. func JoinSliceMap(value interface{}, mapKey string, joinStr string) string {
  142. var strList []string
  143. if valueMap, ok := value.([]map[string]interface{}); ok {
  144. for _, v := range valueMap {
  145. strList = append(strList, ToStr(v[mapKey]))
  146. }
  147. } else if valueSlice, ok := value.([]interface{}); ok {
  148. for _, v := range valueSlice {
  149. mapV := StructToMapViaReflect(v, "json")
  150. strList = append(strList, ToStr(mapV[mapKey]))
  151. }
  152. } else if reflect.TypeOf(value).Kind() == reflect.Slice {
  153. s := reflect.ValueOf(value)
  154. for i := 0; i < s.Len(); i++ {
  155. mapV := StructToMapViaReflect(s.Index(i).Interface(), "json")
  156. strList = append(strList, ToStr(mapV[mapKey]))
  157. }
  158. }
  159. return strings.Join(strList, joinStr)
  160. }
  161. func JoinIntSlice(a []int, delim string) string {
  162. return strings.Trim(strings.Replace(fmt.Sprint(a), " ", delim, -1), "[]")
  163. //return strings.Trim(strings.Join(strings.Split(fmt.Sprint(a), " "), delim), "[]")
  164. //return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(a)), delim), "[]")
  165. }
  166. func MD5(s string) string {
  167. h := md5.New()
  168. h.Write([]byte(s))
  169. return hex.EncodeToString(h.Sum(nil))
  170. }
  171. func SHA1(data string) string {
  172. t := sha1.New()
  173. io.WriteString(t, data)
  174. return fmt.Sprintf("%x", t.Sum(nil))
  175. }
  176. func IsContain(sliceData interface{}, sliceItem interface{}) bool {
  177. itemType := reflect.TypeOf(sliceItem).Kind()
  178. if reflect.TypeOf(sliceData).Kind() == reflect.Slice {
  179. s := reflect.ValueOf(sliceData)
  180. for i := 0; i < s.Len(); i++ {
  181. itemVal := s.Index(i).Interface()
  182. if itemType == reflect.Map || itemType == reflect.Slice {
  183. if reflect.DeepEqual(itemVal, sliceItem) {
  184. return true
  185. }
  186. } else if itemVal == sliceItem {
  187. return true
  188. }
  189. }
  190. }
  191. return false
  192. }
  193. func AppendUniqueInt(sliceData []int, sliceItem int) []int {
  194. if !IsContain(sliceData, sliceItem) {
  195. return append(sliceData, sliceItem)
  196. }
  197. return sliceData
  198. }
  199. func AppendUniqueInterface(sliceData []interface{}, sliceItem interface{}) []interface{} {
  200. if !IsContain(sliceData, sliceItem) {
  201. return append(sliceData, sliceItem)
  202. }
  203. return sliceData
  204. }
  205. func DeepCopy(toValue interface{}, fromValue interface{}) error {
  206. return copier.Copy(toValue, fromValue)
  207. }
  208. func GenTree(value interface{}, id string, pid string, child string, filterID int) []map[string]interface{} {
  209. res := make([]map[string]interface{}, 0)
  210. if valueSlice, ok := value.([]interface{}); ok {
  211. for _, v := range valueSlice {
  212. res = append(res, StructToMapViaReflect(v, "json"))
  213. }
  214. } else if valueMap, ok := value.([]map[string]interface{}); ok {
  215. res = valueMap
  216. } else if reflect.TypeOf(value).Kind() == reflect.Slice {
  217. s := reflect.ValueOf(value)
  218. for i := 0; i < s.Len(); i++ {
  219. res = append(res, StructToMapViaReflect(s.Index(i).Interface(), "json"))
  220. }
  221. }
  222. items := make(map[string]interface{})
  223. tree := make([]map[string]interface{}, 0)
  224. keys := make([]int, 0)
  225. for _, v := range res {
  226. vNew := make(map[string]interface{})
  227. DeepCopy(&vNew, &v)
  228. keys = append(keys, ToInt(vNew[id]))
  229. items[ToStr(vNew[id])] = vNew
  230. }
  231. sort.Ints(keys)
  232. for _, v := range keys {
  233. v := items[ToStr(v)].(map[string]interface{})
  234. parentInfo := items[ToStr(v[pid])]
  235. if parentInfo != nil {
  236. parentInfo := parentInfo.(map[string]interface{})
  237. if parentInfo[child] == nil {
  238. parentInfo[child] = make([]interface{}, 0)
  239. }
  240. parentInfo[child] = append(parentInfo[child].([]interface{}), v)
  241. } else {
  242. if filterID == 0 || v[id] == filterID {
  243. tree = append(tree, v)
  244. }
  245. }
  246. }
  247. return tree
  248. }
  249. func Min(x, y int) int {
  250. if x <= y {
  251. return x
  252. }
  253. return y
  254. }
  255. func Max(x, y int) int {
  256. if x <= y {
  257. return y
  258. }
  259. return x
  260. }
  261. func Between(x, min, max int) int {
  262. if x <= min {
  263. return min
  264. } else if x >= max {
  265. return max
  266. } else {
  267. return x
  268. }
  269. }
  270. func GetType(val interface{}) string {
  271. return reflect.ValueOf(val).Kind().String()
  272. }
  273. func GetSlice(sliceData interface{}, sliceIndex int, sliceDefault interface{}) interface{} {
  274. if reflect.TypeOf(sliceData).Kind() == reflect.Slice {
  275. s := reflect.ValueOf(sliceData)
  276. if sliceIndex >= s.Len() {
  277. return sliceDefault
  278. }
  279. return s.Index(sliceIndex).Interface()
  280. } else {
  281. return sliceDefault
  282. }
  283. }
  284. func ParseImgStr(imgStr string) []string {
  285. if imgStr == "" {
  286. return make([]string, 0)
  287. }
  288. imgUrlList := strings.Split(imgStr, ",")
  289. for k, v := range imgUrlList {
  290. imgUrlList[k] = ParseImg(v)
  291. }
  292. return imgUrlList
  293. }
  294. func ParseImg(imgUrl string) string {
  295. if imgUrl == "" {
  296. return imgUrl
  297. }
  298. return config.Cfg.App.ImgHost + imgUrl
  299. }
  300. func GetRootPath() string {
  301. return config.GetRootPath()
  302. }