package logic import ( MC "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/redis" IC "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/init" "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/internal/svc" "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/internal/types" "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/api/internal/util" "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/rpc/type/bxcore" "context" "fmt" "github.com/zeromicro/go-zero/core/logx" "strings" ) type MobileHotWordLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewMobileHotWordLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MobileHotWordLogic { return &MobileHotWordLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *MobileHotWordLogic) MobileHotWord(req *types.MobileHotWordReq) (resp *types.CommonResp, err error) { var rsData []string var baseKeys = func() []string { if req.Mold > 0 { keys, err := l.svcCtx.BxCore.SearchHotKey(l.ctx, &bxcore.HotKeysReq{ AppId: req.AppId, UserId: req.UserId, Mold: int64(req.Mold), }) if err == nil && len(keys.Keys) > 0 { return keys.Keys } } return MC.If(req.UserId == "", IC.C.MobileIndexHotKeyUnLogin, IC.C.MobileIndexHotKey).([]string) } if req.Refresh == 0 { //非刷新动作 自动获取默认缓存热词 5分钟更新一次 rsData = baseKeys() } else { // 刷新热词 需过滤已经看过的热词 var ( reqWord []string mold = req.Mold ) if req.Word != "" { reqWord = strings.Split(req.Word, ",") } redisKey := MC.If(req.UserId == "", fmt.Sprintf("mobileHotWordUnLogin_%d", mold), fmt.Sprintf("mobileHotWordLogin_%s_%d", req.UserId, mold)).(string) rData, _ := redis.Get("newother", redisKey).([]interface{}) redisWord := MC.ObjArrToStringArr(rData) //已浏览热词 if redisWord != nil { reqWord = append(reqWord, redisWord...) } var aData = baseKeys() rsData = util.FilterWord(aData, reqWord, int(IC.C.MobileIndexHotKeyLimit)) if len(reqWord) >= len(aData)-int(IC.C.MobileIndexHotKeyLimit) { //剩余热词已经不足 重新获取 redis.Put("newother", redisKey, nil, 60*60*2) //剩余热词不足 重置 } else { redis.Put("newother", redisKey, reqWord, 60*60*2) } } var rDataArr []map[string]interface{} for rk, rv := range rsData { if rk >= int(IC.C.MobileIndexHotKeyLimit) { break } rDataArr = append(rDataArr, map[string]interface{}{ "keyword": rv, }) } return &types.CommonResp{ Data: rDataArr, }, nil }