mobilehotwordlogic.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package logic
  2. import (
  3. MC "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/redis"
  5. IC "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/init"
  6. "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/internal/svc"
  7. "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/internal/types"
  8. "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/internal/util"
  9. "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/rpc/type/bxcore"
  10. "context"
  11. "fmt"
  12. "github.com/zeromicro/go-zero/core/logx"
  13. "strings"
  14. )
  15. type MobileHotWordLogic struct {
  16. logx.Logger
  17. ctx context.Context
  18. svcCtx *svc.ServiceContext
  19. }
  20. func NewMobileHotWordLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MobileHotWordLogic {
  21. return &MobileHotWordLogic{
  22. Logger: logx.WithContext(ctx),
  23. ctx: ctx,
  24. svcCtx: svcCtx,
  25. }
  26. }
  27. func (l *MobileHotWordLogic) MobileHotWord(req *types.MobileHotWordReq) (resp *types.CommonResp, err error) {
  28. var rsData []string
  29. var baseKeys = func() []string {
  30. if req.Mold > 0 {
  31. keys, err := l.svcCtx.BxCore.SearchHotKey(l.ctx, &bxcore.HotKeysReq{
  32. AppId: req.AppId,
  33. UserId: req.UserId,
  34. Mold: int64(req.Mold),
  35. })
  36. if err == nil && len(keys.Keys) > 0 {
  37. return keys.Keys
  38. }
  39. }
  40. return MC.If(req.UserId == "", IC.C.MobileIndexHotKeyUnLogin, IC.C.MobileIndexHotKey).([]string)
  41. }
  42. if req.Refresh == 0 { //非刷新动作 自动获取默认缓存热词 5分钟更新一次
  43. rsData = baseKeys()
  44. } else { // 刷新热词 需过滤已经看过的热词
  45. var (
  46. reqWord []string
  47. mold = req.Mold
  48. )
  49. if req.Word != "" {
  50. reqWord = strings.Split(req.Word, ",")
  51. }
  52. redisKey := MC.If(req.UserId == "", fmt.Sprintf("mobileHotWordUnLogin_%d", mold), fmt.Sprintf("mobileHotWordLogin_%s_%d", req.UserId, mold)).(string)
  53. rData, _ := redis.Get("newother", redisKey).([]interface{})
  54. redisWord := MC.ObjArrToStringArr(rData) //已浏览热词
  55. if redisWord != nil {
  56. reqWord = append(reqWord, redisWord...)
  57. }
  58. var aData = baseKeys()
  59. rsData = util.FilterWord(aData, reqWord, int(IC.C.MobileIndexHotKeyLimit))
  60. if len(reqWord) >= len(aData)-int(IC.C.MobileIndexHotKeyLimit) { //剩余热词已经不足 重新获取
  61. redis.Put("newother", redisKey, nil, 60*60*2) //剩余热词不足 重置
  62. } else {
  63. redis.Put("newother", redisKey, reqWord, 60*60*2)
  64. }
  65. }
  66. var rDataArr []map[string]interface{}
  67. for rk, rv := range rsData {
  68. if rk >= int(IC.C.MobileIndexHotKeyLimit) {
  69. break
  70. }
  71. rDataArr = append(rDataArr, map[string]interface{}{
  72. "keyword": rv,
  73. })
  74. }
  75. return &types.CommonResp{
  76. Data: rDataArr,
  77. }, nil
  78. }