stringutil.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package utils
  2. import (
  3. "crypto/md5"
  4. cryptoRand "crypto/rand"
  5. "encoding/hex"
  6. "fmt"
  7. "io"
  8. "math/big"
  9. "math/rand"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "github.com/dchest/captcha"
  14. )
  15. func FilterXSS(str string) string {
  16. str = strings.Replace(str, "<", "&#60;", -1)
  17. str = strings.Replace(str, ">", "&#62;", -1)
  18. str = strings.Replace(str, "%3C", "&#60;", -1)
  19. str = strings.Replace(str, "%3E", "&#62;", -1)
  20. str = strings.Replace(str, "expression", "expression", -1)
  21. str = strings.Replace(str, "javascript", "javascript", -1)
  22. return str
  23. }
  24. func MakeSimpleCaptcha(n int) string {
  25. var idChars = []byte("0123456789")
  26. b := captcha.RandomDigits(n)
  27. for i, c := range b {
  28. b[i] = idChars[c]
  29. }
  30. return string(b)
  31. }
  32. /**
  33. 获取当前时间的毫秒值
  34. */
  35. func Now4Millis() int64 {
  36. return time.Now().UnixNano() / 1e6
  37. }
  38. /*产生n以内的随机数*/
  39. func MakeIntRand(n int) int {
  40. rand.Seed(time.Now().UnixNano())
  41. return rand.Intn(n)
  42. }
  43. //生成32位md5字串
  44. func GetMd5String(s string) string {
  45. h := md5.New()
  46. h.Write([]byte(s))
  47. return hex.EncodeToString(h.Sum(nil))
  48. }
  49. func GenerateSimpleToken() string {
  50. rand.Seed(time.Now().UnixNano())
  51. str := fmt.Sprintf("%d%d", time.Now().UnixNano(), rand.Intn(999999))
  52. h := md5.New()
  53. h.Write([]byte(str))
  54. return hex.EncodeToString(h.Sum(nil))
  55. }
  56. //var pool = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@#$"
  57. //获取复杂的随机数
  58. func GetLetterRandom(length int, flag ...bool) string {
  59. var idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
  60. var mod byte = 52
  61. if len(flag) > 0 && flag[0] {
  62. idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  63. mod = 26
  64. }
  65. b := make([]byte, length)
  66. maxrb := byte(256 - (256 % int(mod)))
  67. i := 0
  68. EXIT:
  69. for {
  70. r := make([]byte, length+(length/4))
  71. if _, err := io.ReadFull(cryptoRand.Reader, r); err != nil {
  72. panic("GetLetterRandom: error reading random source: " + err.Error())
  73. }
  74. for _, c := range r {
  75. if c > maxrb {
  76. continue
  77. }
  78. b[i] = c % mod
  79. i++
  80. if i == length {
  81. break EXIT
  82. }
  83. }
  84. }
  85. for i, c := range b {
  86. b[i] = idChars[c]
  87. }
  88. return string(b)
  89. }
  90. /*获取复杂的随机数,数字和字母的组合
  91. * c > 2 数字的个数和字母的个数随机分配
  92. * n 数字的个数
  93. * l 字母的个数
  94. */
  95. func GetComplexRandom(c, n, l int) string {
  96. if c < 2 && (n < 1 || l < 1) {
  97. return "--"
  98. }
  99. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  100. myCommonMethod := func(flag bool) int {
  101. if flag {
  102. return r.Intn(c-1) + 1
  103. } else {
  104. return r.Intn(c)
  105. }
  106. }
  107. if c >= 2 {
  108. n = myCommonMethod(true)
  109. l = c - n
  110. } else {
  111. c = l + n
  112. }
  113. value := MakeSimpleCaptcha(n) + GetLetterRandom(l)
  114. var array = strings.Split(value, "")
  115. for i := 0; i < c/2; i++ {
  116. r1 := myCommonMethod(false)
  117. r2 := myCommonMethod(false)
  118. o := array[r1]
  119. array[r1] = array[r2]
  120. array[r2] = o
  121. }
  122. return strings.Join(array, "")
  123. }
  124. func GetRandom(n int) string {
  125. var idChars = []byte("0123456789")
  126. b := captcha.RandomDigits(n)
  127. for i, c := range b {
  128. b[i] = idChars[c]
  129. }
  130. return string(b)
  131. }
  132. func ObjToString(old interface{}) string {
  133. if nil == old {
  134. return ""
  135. } else {
  136. r, _ := old.(string)
  137. return r
  138. }
  139. }
  140. func IntAll(num interface{}) int {
  141. return IntAllDef(num, 0)
  142. }
  143. func IntAllDef(num interface{}, defaultNum int) int {
  144. if i, ok := num.(int); ok {
  145. return int(i)
  146. } else if i0, ok0 := num.(int32); ok0 {
  147. return int(i0)
  148. } else if i1, ok1 := num.(float64); ok1 {
  149. return int(i1)
  150. } else if i2, ok2 := num.(int64); ok2 {
  151. return int(i2)
  152. } else if i3, ok3 := num.(float32); ok3 {
  153. return int(i3)
  154. } else if i4, ok4 := num.(string); ok4 {
  155. in, _ := strconv.Atoi(i4)
  156. return int(in)
  157. } else if i5, ok5 := num.(int16); ok5 {
  158. return int(i5)
  159. } else if i6, ok6 := num.(int8); ok6 {
  160. return int(i6)
  161. } else if i7, ok7 := num.(*big.Int); ok7 {
  162. in, _ := strconv.Atoi(fmt.Sprint(i7))
  163. return int(in)
  164. } else if i8, ok8 := num.(*big.Float); ok8 {
  165. in, _ := strconv.Atoi(fmt.Sprint(i8))
  166. return int(in)
  167. } else {
  168. return defaultNum
  169. }
  170. }
  171. func ObjArrToMapArr(old []interface{}) []map[string]interface{} {
  172. if old != nil {
  173. new := make([]map[string]interface{}, len(old))
  174. for i, v := range old {
  175. new[i], _ = v.(map[string]interface{})
  176. }
  177. return new
  178. } else {
  179. return nil
  180. }
  181. }
  182. /**
  183. 产生一般订单编号方法
  184. */
  185. func CreateOrderCode() string {
  186. return fmt.Sprint(time.Now().Unix()) + fmt.Sprint(GetRandom(6))
  187. }
  188. func GetDayMinMax(t time.Time) (int64, int64) {
  189. min := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local).Unix()
  190. return min, min + 86400
  191. }