checksearchlogic.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package logic
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. "bytes"
  5. "context"
  6. "crypto/md5"
  7. "fmt"
  8. IC "jyBXBase/rpc/init"
  9. "log"
  10. "net/url"
  11. "sort"
  12. "strings"
  13. "jyBXBase/rpc/bxbase"
  14. "jyBXBase/rpc/internal/svc"
  15. "github.com/zeromicro/go-zero/core/logx"
  16. )
  17. type CheckSearchLogic struct {
  18. ctx context.Context
  19. svcCtx *svc.ServiceContext
  20. logx.Logger
  21. }
  22. func NewCheckSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckSearchLogic {
  23. return &CheckSearchLogic{
  24. ctx: ctx,
  25. svcCtx: svcCtx,
  26. Logger: logx.WithContext(ctx),
  27. }
  28. }
  29. // 校验搜索列表
  30. func (l *CheckSearchLogic) CheckSearch(in *bxbase.AddSearchReq) (res *bxbase.CheckRes, err error) {
  31. // todo: add your logic here and delete this line
  32. res = new(bxbase.CheckRes)
  33. if in.UserId == "" {
  34. res.ErrCode = 1
  35. res.ErrMsg = "用户未登录"
  36. return
  37. }
  38. if in.Keywords == "" {
  39. res.ErrCode = 1
  40. res.ErrMsg = "请先输入关键词"
  41. return
  42. }
  43. log.Println("校验搜索列表:", in)
  44. in.NotKey = strings.Replace(in.NotKey, " ", ",", -1)
  45. in.Keywords = strings.Replace(in.Keywords, " ", ",", -1)
  46. query := map[string]interface{}{
  47. "user_id": in.UserId,
  48. }
  49. if IC.Mgo.Count("search_condition", query) > 0 {
  50. res.ErrCode = 1
  51. res.ErrMsg = "对不起,最多可保存10个筛选条件。"
  52. return
  53. }
  54. in.Keywords = ValueSort(in.Keywords)
  55. in.Area = ValueSort(in.Area)
  56. in.City = ValueSort(in.City)
  57. in.Subtype = ValueSort(in.Subtype)
  58. in.Industry = ValueSort(in.Industry)
  59. in.SelectType = ValueSort(in.SelectType)
  60. in.BuyerClass = ValueSort(in.BuyerClass)
  61. in.NotKey = ValueSort(in.NotKey)
  62. inMap := common.StructToMapMore(in)
  63. inKey := GetKeysByParam(inMap)
  64. query["in_key"] = inKey
  65. res.ErrMsg = inKey
  66. if IC.Mgo.Count("search_condition", query) > 0 {
  67. res.ErrCode = 1
  68. res.ErrMsg = "该条件已保存,无需重复添加。"
  69. }
  70. return
  71. }
  72. func ValueSort(v string) string {
  73. vs := strings.Split(v, ",")
  74. sort.Slice(vs, func(i, j int) bool {
  75. return vs[i] < vs[j]
  76. })
  77. return strings.Join(vs, ",")
  78. }
  79. func GetKeysByParam(param map[string]interface{}) string {
  80. ps := &paramSorter{[]string{}, []string{}}
  81. for k, v := range param {
  82. ps.Keys = append(ps.Keys, k)
  83. ps.Vals = append(ps.Vals, common.ObjToString(v))
  84. }
  85. ps.Sort()
  86. reqStr := ps.String()
  87. str := percentEncode(reqStr)
  88. str = SP(str, "%3A", "%253A", -1)
  89. return MD5(str)
  90. }
  91. func MD5(str string) string {
  92. data := []byte(str)
  93. has := md5.Sum(data)
  94. md5str := fmt.Sprintf("%x", has)
  95. return md5str
  96. }
  97. var SP = strings.Replace
  98. func percentEncode(str string) string {
  99. str = url.QueryEscape(str)
  100. str = SP(SP(SP(str, "+", "%20", -1), "*", "%2A", -1), "%7E", "~", -1)
  101. return str
  102. }
  103. type paramSorter struct {
  104. Keys []string
  105. Vals []string
  106. }
  107. func (ps *paramSorter) String() string {
  108. str := ""
  109. for n, k := range ps.Keys {
  110. str += k + "=" + ps.Vals[n]
  111. if n < len(ps.Keys)-1 {
  112. str += "&"
  113. }
  114. }
  115. return str
  116. }
  117. func (ps *paramSorter) Sort() {
  118. sort.Sort(ps)
  119. }
  120. func (ps *paramSorter) Len() int {
  121. return len(ps.Vals)
  122. }
  123. func (ps *paramSorter) Less(i, j int) bool {
  124. return bytes.Compare([]byte(ps.Keys[i]), []byte(ps.Keys[j])) < 0
  125. }
  126. func (ps *paramSorter) Swap(i, j int) {
  127. ps.Vals[i], ps.Vals[j] = ps.Vals[j], ps.Vals[i]
  128. ps.Keys[i], ps.Keys[j] = ps.Keys[j], ps.Keys[i]
  129. }