sharecommon.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package share
  2. import (
  3. qu "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/redis"
  5. "app.yhyue.com/moapp/message/config"
  6. "app.yhyue.com/moapp/message/db"
  7. "bytes"
  8. cr "crypto/rand"
  9. "math/big"
  10. "math/rand"
  11. "regexp"
  12. "strings"
  13. "sync"
  14. "time"
  15. )
  16. var PhoneReg = regexp.MustCompile("^[1][3-9][0-9]{9}$")
  17. //获取用户头像,手机号
  18. func GetInfo(userid string) map[string]interface{} {
  19. rdata, ok := db.Mgo.FindById("user", userid, `{"s_headimageurl":1,"s_headimage":1,"s_phone":1,"s_m_phone":1,"s_nickname":1,"l_registedate":1}`)
  20. if ok && len(*rdata) > 0 && rdata != nil {
  21. nickname, headimageurl := "", ""
  22. if s_phone, _ := (*rdata)["s_phone"].(string); s_phone != "" {
  23. nickname = s_phone
  24. } else if s_m_phone, _ := (*rdata)["s_m_phone"].(string); s_m_phone != "" {
  25. nickname = s_m_phone
  26. } else if s_nickname, _ := (*rdata)["s_nickname"].(string); s_nickname != "" {
  27. nickname = s_nickname
  28. }
  29. if IsPhone(nickname) {
  30. nickname = string(nickname[0:3]) + "****" + string(nickname[len(nickname)-4:])
  31. }
  32. if s_headimageurl, _ := (*rdata)["s_headimageurl"].(string); s_headimageurl != "" {
  33. headimageurl = s_headimageurl
  34. } else if s_headimage, _ := (*rdata)["s_headimage"].(string); s_headimage != "" {
  35. headimageurl = config.PushConfig.Webdomain + s_headimage
  36. }
  37. return map[string]interface{}{
  38. "nickname": nickname,
  39. "headimageurl": headimageurl,
  40. "createtime": (*rdata)["l_registedate"],
  41. }
  42. }
  43. return nil
  44. }
  45. //手机号校验
  46. func IsPhone(phone string) bool {
  47. return PhoneReg.MatchString(phone)
  48. }
  49. //到期时间
  50. func timeOut() int {
  51. now := time.Now()
  52. return int(now.AddDate(0, 0, 7).Unix() - now.Unix())
  53. }
  54. type UserInfo struct {
  55. HeadImg interface{} `json:"headimg"`
  56. Name interface{} `json:"name"`
  57. Createtime interface{} `json:"createtime"`
  58. }
  59. func Info(data *[]map[string]interface{}) []*UserInfo {
  60. userinfo := []*UserInfo{}
  61. if len(*data) > 0 {
  62. for _, v := range *data {
  63. sharedId := qu.ObjToString(v["shared_uid"])
  64. if rdata := GetInfo(sharedId); rdata != nil {
  65. userinfo = append(userinfo, &UserInfo{
  66. HeadImg: rdata["headimageurl"],
  67. Name: rdata["nickname"],
  68. Createtime: rdata["createtime"],
  69. })
  70. }
  71. }
  72. }
  73. return userinfo
  74. }
  75. var VarLSCPool = &LSCPool{
  76. JobQueue: make(chan string, 10),
  77. WorkerNum: 10,
  78. Lock: &sync.Mutex{},
  79. Randoms: "",
  80. }
  81. type LSCPool struct {
  82. JobQueue chan string //待取的口令
  83. WorkerNum int //当前工作的协程数
  84. Lock *sync.Mutex //口令锁
  85. Randoms string //口令集合
  86. }
  87. func (this *LSCPool) GetJob() string {
  88. return <-this.JobQueue
  89. }
  90. var r *rand.Rand
  91. func init() {
  92. r = rand.New(rand.NewSource(time.Now().Unix()))
  93. for i := 0; i < VarLSCPool.WorkerNum/2; i++ {
  94. go func() {
  95. for {
  96. VarLSCPool.JobQueue <- VarLSCPool.GetRandom()
  97. }
  98. }()
  99. }
  100. }
  101. //获取随机字符串
  102. func (this *LSCPool) GetRandom() string {
  103. this.Lock.Lock()
  104. defer this.Lock.Unlock()
  105. //如果使用过了 重新获取
  106. for {
  107. LSC := this.SpecialChar(0) + this.LetterRandom(8)
  108. if strings.Contains(this.Randoms, LSC) {
  109. continue
  110. }
  111. this.Randoms += LSC + "|"
  112. ok, _ := redis.Exists("other", "shareId_"+LSC)
  113. if ok {
  114. continue
  115. }
  116. return LSC
  117. }
  118. return ""
  119. }
  120. //字母随机串
  121. func (this *LSCPool) LetterRandom(LL int) (LR string) {
  122. bytes := make([]byte, LL)
  123. for i := 0; i < LL; i++ {
  124. b := r.Intn(26) + 65
  125. bytes[i] = byte(b)
  126. }
  127. LR = string(bytes)
  128. return
  129. }
  130. //特殊字符随机串
  131. func (this *LSCPool) SpecialChar(LL int) (SC string) {
  132. var str = "$#"
  133. b := bytes.NewBufferString(str)
  134. length := b.Len()
  135. bigInt := big.NewInt(int64(length))
  136. for i := 0; i < LL; i++ {
  137. randomInt, _ := cr.Int(cr.Reader, bigInt)
  138. SC += string(str[randomInt.Int64()])
  139. }
  140. return
  141. }