util.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package util
  2. import (
  3. MC "app.yhyue.com/moapp/jybase/common"
  4. "fmt"
  5. "math/rand"
  6. "net/http"
  7. "regexp"
  8. "sort"
  9. "strings"
  10. "time"
  11. "unicode"
  12. )
  13. var (
  14. mobileReg = regexp.MustCompile("(?i)(Android|Mobile|Phone)")
  15. )
  16. func CheckPlatform(r *http.Request) (p string) {
  17. p = "PC"
  18. if CheckIsMobile(r) {
  19. if CheckWxBrowser(r) {
  20. p = "WX"
  21. } else {
  22. p = "APP"
  23. }
  24. }
  25. return
  26. }
  27. // 判断是否是微信访问
  28. func CheckWxBrowser(Request *http.Request) bool {
  29. if strings.Index(Request.UserAgent(), "MicroMessenger") > -1 || strings.Index(Request.UserAgent(), "Wechat") > -1 {
  30. return true
  31. } else {
  32. return false
  33. }
  34. }
  35. // 是否是移动端
  36. func CheckIsMobile(r *http.Request) bool {
  37. client := r.UserAgent()
  38. if mobileReg.MatchString(client) {
  39. return true
  40. }
  41. return false
  42. }
  43. func GetFlag(r *http.Request, w http.ResponseWriter, limitFlag string) (string, bool) {
  44. if limitFlag == "" {
  45. c, _ := r.Cookie("limitSearchTextFlag")
  46. if c != nil {
  47. limitFlag = c.Value
  48. if limitFlag == "" {
  49. sid, _ := r.Cookie("SESSIONID")
  50. limitFlag = sid.Value
  51. //limitFlag, _ = s.Get("limitSearchTextFlag").(string)
  52. }
  53. }
  54. }
  55. if limitFlag != "" {
  56. return limitFlag, true
  57. }
  58. limitFlag = MC.GetLetterRandom(5) + fmt.Sprint(time.Now().UnixNano())
  59. //s.Set("limitSearchTextFlag", limitFlag)
  60. c := &http.Cookie{
  61. Name: "limitSearchTextFlag",
  62. Value: limitFlag,
  63. Path: "/",
  64. HttpOnly: false,
  65. MaxAge: 2592000, //一个月
  66. }
  67. http.SetCookie(w, c)
  68. return limitFlag, false
  69. }
  70. // aData 词库 rData过滤词 count数量
  71. func FilterWord(aData, fData []string, count int) []string {
  72. var (
  73. rsData, rData []string
  74. )
  75. for _, datum := range aData {
  76. var isExist bool
  77. for _, datum1 := range fData {
  78. if datum == datum1 {
  79. isExist = true
  80. break
  81. }
  82. }
  83. if !isExist {
  84. rsData = append(rsData, datum)
  85. }
  86. }
  87. switch len(rsData) >= count {
  88. case true:
  89. for _, i2 := range GenerateRandomNumber(0, len(rsData), count) {
  90. rData = append(rData, rsData[i2])
  91. }
  92. case false:
  93. for _, i2 := range GenerateRandomNumber(0, len(aData), count) {
  94. rData = append(rData, aData[i2])
  95. }
  96. }
  97. return rData
  98. }
  99. // 生成count个[start,end)结束的不重复的随机数
  100. func GenerateRandomNumber(start int, end int, count int) []int {
  101. //范围检查
  102. if end < start || (end-start) < count {
  103. return nil
  104. }
  105. //存放结果的slice
  106. nums := make([]int, 0)
  107. //随机数生成器,加入时间戳保证每次生成的随机数不一样
  108. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  109. for len(nums) < count {
  110. //生成随机数
  111. num := r.Intn(end-start) + start
  112. //查重
  113. exist := false
  114. for _, v := range nums {
  115. if v == num {
  116. exist = true
  117. break
  118. }
  119. }
  120. if !exist {
  121. nums = append(nums, num)
  122. }
  123. }
  124. sort.Ints(nums)
  125. return nums
  126. }
  127. // RemoveInvisibleChars 移除控制字符和不可见字符
  128. func RemoveInvisibleChars(s string) string {
  129. return strings.Map(func(r rune) rune {
  130. // 保留普通字符、中文、标点等可见字符
  131. if unicode.IsGraphic(r) && !unicode.IsControl(r) {
  132. return r
  133. }
  134. return -1
  135. }, s)
  136. }