Explorar o código

fix:移动热词随机展示逻辑修改

duxin hai 1 ano
pai
achega
1e1ef78358

+ 1 - 0
jyBXCore/api/bxcore.api

@@ -212,6 +212,7 @@ type (
 		AppId   string `header:"appId"`
 		UserId  string `header:"userId,optional"`
 		Refresh int64  `json:"refresh,optional"`
+		Word    string `json:"word,optional"`
 	}
 )
 service bxcore-api {

+ 21 - 9
jyBXCore/api/internal/logic/mobilehotwordlogic.go

@@ -10,6 +10,7 @@ import (
 	"jyBXCore/api/internal/svc"
 	"jyBXCore/api/internal/types"
 	"jyBXCore/api/internal/util"
+	"strings"
 )
 
 type MobileHotWordLogic struct {
@@ -31,21 +32,32 @@ func (l *MobileHotWordLogic) MobileHotWord(req *types.MobileHotWordReq) (resp *t
 	if req.Refresh == 0 { //非刷新动作 自动获取默认缓存热词 5分钟更新一次
 		rsData = MC.If(req.UserId == "", IC.HotKeyArrUnLogin, IC.HotKeyArrLoginEd).([]string)
 	} else { // 刷新热词 需过滤已经看过的热词
+		var reqWord []string
+		if req.Word != "" {
+			reqWord = strings.Split(req.Word, ",")
+		}
 		redisKey := MC.If(req.UserId == "", "mobileHotWordUnLogin", fmt.Sprintf("mobileHotWordLogin_%s", req.UserId)).(string)
 		rData, _ := redis.Get("newother", redisKey).([]interface{})
-		defaultWord := MC.If(req.UserId == "", IC.HotKeyArrUnLogin, IC.HotKeyArrLoginEd).([]string) //排除默认词
-		redisWord := MC.ObjArrToStringArr(rData)
+		redisWord := MC.ObjArrToStringArr(rData) //已浏览热词
+		if redisWord != nil {
+			reqWord = append(reqWord, redisWord...)
+		}
+
 		aData := MC.If(req.UserId == "", IC.C.MobileIndexHotKeyUnLogin, IC.C.MobileIndexHotKey).([]string)
-		if len(defaultWord)+len(redisWord) >= len(aData)-int(IC.C.MobileIndexHotKeyLimit) { //剩余热词已经不足 重新获取
-			rsData = util.FilterWord(aData, append(defaultWord, redisWord...), int(IC.C.MobileIndexHotKeyLimit))
-			redis.Put("newother", redisKey, rsData, 60*60)
+		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 {
-			rsData = util.FilterWord(aData, append(defaultWord, redisWord...), int(IC.C.MobileIndexHotKeyLimit))
-			redisWord = append(redisWord, rsData...)
-			redis.Put("newother", redisKey, redisWord, 60*60)
+			redis.Put("newother", redisKey, reqWord, 60*60*2)
 		}
 	}
+	var rDataArr []map[string]interface{}
+	for _, datum := range rsData {
+		rDataArr = append(rDataArr, map[string]interface{}{
+			"keyword": datum,
+		})
+	}
 	return &types.CommonResp{
-		Data: rsData,
+		Data: rDataArr,
 	}, nil
 }

+ 1 - 0
jyBXCore/api/internal/types/types.go

@@ -208,4 +208,5 @@ type MobileHotWordReq struct {
 	AppId   string `header:"appId"`
 	UserId  string `header:"userId,optional"`
 	Refresh int64  `json:"refresh,optional"`
+	Word    string `json:"word,optional"`
 }

+ 43 - 7
jyBXCore/api/internal/util/util.go

@@ -3,8 +3,10 @@ package util
 import (
 	MC "app.yhyue.com/moapp/jybase/common"
 	"fmt"
+	"math/rand"
 	"net/http"
 	"regexp"
+	"sort"
 	"strings"
 	"time"
 )
@@ -73,11 +75,10 @@ func GetFlag(r *http.Request, w http.ResponseWriter, limitFlag string) (string,
 
 // aData 词库 rData过滤词 count数量
 func FilterWord(aData, fData []string, count int) []string {
-	var rsData []string
+	var (
+		rsData, rData []string
+	)
 	for _, datum := range aData {
-		if len(rsData) >= count {
-			break
-		}
 		var isExist bool
 		for _, datum1 := range fData {
 			if datum == datum1 {
@@ -89,9 +90,44 @@ func FilterWord(aData, fData []string, count int) []string {
 			rsData = append(rsData, datum)
 		}
 	}
+	switch len(rsData) >= count {
+	case true:
+		for _, i2 := range GenerateRandomNumber(0, len(rsData), count) {
+			rData = append(rData, rsData[i2])
+		}
+	case false:
+		for _, i2 := range GenerateRandomNumber(0, len(aData), count) {
+			rData = append(rData, aData[i2])
+		}
+	}
+	return rData
+}
 
-	if ct := count - len(rsData); ct > 0 && len(aData) >= ct {
-		rsData = append(rsData, aData[:ct]...) //追加
+// 生成count个[start,end)结束的不重复的随机数
+func GenerateRandomNumber(start int, end int, count int) []int {
+	//范围检查
+	if end < start || (end-start) < count {
+		return nil
+	}
+	//存放结果的slice
+	nums := make([]int, 0)
+	//随机数生成器,加入时间戳保证每次生成的随机数不一样
+	r := rand.New(rand.NewSource(time.Now().UnixNano()))
+	for len(nums) < count {
+		//生成随机数
+		num := r.Intn(end-start) + start
+		//查重
+		exist := false
+		for _, v := range nums {
+			if v == num {
+				exist = true
+				break
+			}
+		}
+		if !exist {
+			nums = append(nums, num)
+		}
 	}
-	return rsData
+	sort.Ints(nums)
+	return nums
 }