utils.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package utils
  2. import (
  3. "crypto/md5"
  4. "crypto/sha1"
  5. "database/sql"
  6. "encoding/hex"
  7. "fmt"
  8. "io"
  9. "mime/multipart"
  10. "os"
  11. "strings"
  12. "time"
  13. )
  14. const (
  15. Person = iota + 1 // 个人版
  16. std //标准版
  17. ent //企业版
  18. cluster // 分布式
  19. lite = 6 //敏捷版本
  20. )
  21. func SwitchLicenseType(license string) int {
  22. switch {
  23. case strings.Contains(license, "标准"):
  24. return std
  25. case strings.Contains(license, "分布式"):
  26. return cluster
  27. case strings.Contains(license, "企业"):
  28. return ent
  29. case strings.Contains(license, "敏捷"):
  30. return lite
  31. case strings.Contains(license, "个人"):
  32. return Person
  33. default:
  34. return 0
  35. }
  36. }
  37. const maxFileNameLength = 255
  38. // GenerateFileName 生成新的文件名并确保不超过最大长度限制
  39. func GenerateFileName(name, timestamp, ext string) string {
  40. newFileName := name + "_" + timestamp + ext
  41. if len(newFileName) > maxFileNameLength {
  42. trimLength := len(newFileName) - maxFileNameLength
  43. if len(name) > trimLength {
  44. name = name[:len(name)-trimLength]
  45. } else {
  46. name = ""
  47. }
  48. newFileName = name + "_" + timestamp + ext
  49. }
  50. return newFileName
  51. }
  52. // CalculateFileMd5 计算文件的 MD5 值
  53. func CalculateFileMd5(filePath string) (string, error) {
  54. file, err := os.Open(filePath)
  55. if err != nil {
  56. return "", err
  57. }
  58. defer file.Close()
  59. hash := md5.New()
  60. if _, err := io.Copy(hash, file); err != nil {
  61. return "", err
  62. }
  63. return hex.EncodeToString(hash.Sum(nil)), nil
  64. }
  65. // calculateFileHeaderMd5 计算 *multipart.FileHeader 的 MD5 值
  66. func CalculateFileHeaderMd5(fileHeader *multipart.FileHeader) (string, error) {
  67. file, err := fileHeader.Open()
  68. if err != nil {
  69. return "", err
  70. }
  71. defer file.Close()
  72. hash := md5.New()
  73. if _, err := io.Copy(hash, file); err != nil {
  74. return "", err
  75. }
  76. return hex.EncodeToString(hash.Sum(nil)), nil
  77. }
  78. func GenerateShortIdentifier(username, email, telephone string) string {
  79. input := fmt.Sprintf("%s%s%s", username, email, telephone)
  80. hasher := sha1.New()
  81. hasher.Write([]byte(input))
  82. return hex.EncodeToString(hasher.Sum(nil))[:12] // 截取前8位作为唯一标识符
  83. }
  84. func ToString(ns sql.NullString) string {
  85. if ns.Valid {
  86. return ns.String
  87. }
  88. return ""
  89. }
  90. func ToInt64(ni sql.NullInt64) int64 {
  91. if ni.Valid {
  92. return ni.Int64
  93. }
  94. return 0
  95. }
  96. func ToTimeString(nt sql.NullTime) string {
  97. if nt.Valid {
  98. return nt.Time.Format(time.RFC3339)
  99. }
  100. return ""
  101. }
  102. // StringToNullString 将字符串转换为 sql.NullString
  103. func StringToNullString(s string) sql.NullString {
  104. if s == "" {
  105. return sql.NullString{
  106. String: "",
  107. Valid: false,
  108. }
  109. }
  110. return sql.NullString{
  111. String: s,
  112. Valid: true,
  113. }
  114. }
  115. // IntToNullInt64 将 int64 转换为 sql.NullInt64
  116. func IntToNullInt64(i int64) sql.NullInt64 {
  117. return sql.NullInt64{
  118. Int64: i,
  119. Valid: true,
  120. }
  121. }