diff --git a/domain/model/recommend_m/gift.go b/domain/model/recommend_m/gift.go new file mode 100644 index 0000000000000000000000000000000000000000..11a71070feeb01fb9443c9607529a79d891198ca --- /dev/null +++ b/domain/model/recommend_m/gift.go @@ -0,0 +1,34 @@ +package recommend_m + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/resource/mysql" + "github.com/bluele/gcache" + "time" +) + +// 推荐用户送礼 +type recommendUserGift struct { + SendUserId mysql.ID + SendUserDiamond mysql.Num +} + +var recommendUserGiftKey = "recommendUserGiftKey" +var recommendUserGiftCache = gcache.New(1).LRU().Build() + +// 推荐最近送礼的50人,最近12小时赠送礼物大于100k的用户 +// 先lru cache,后db +// ttl: 5min +func GetPastTop50SendGiftUsers(model *domain.Model) []recommendUserGift { + if data, err := recommendUserGiftCache.Get(recommendUserGiftKey); err == nil { + return data.([]recommendUserGift) + } + var res []recommendUserGift + if err := model.DB().Table("gift_operate").Select("send_user_id,SUM(send_user_diamond) send_user_diamond"). + Where("created_time >= ?", time.Now().Add(-time.Hour*12)).Group("send_user_id"). + Having("send_user_diamond > 100000").Order("send_user_diamond DESC").Limit(50).Find(&res).Error; err != nil { + model.Log.Errorf("GetPastTop50SendGiftUsers fail:%v", err) + } + recommendUserGiftCache.SetWithExpire(recommendUserGiftKey, res, time.Minute*5) + return res +} diff --git a/route/recommend_r/gift.go b/route/recommend_r/gift.go new file mode 100644 index 0000000000000000000000000000000000000000..eca04f752cca8918b884a7be37346c5a48d6c100 --- /dev/null +++ b/route/recommend_r/gift.go @@ -0,0 +1,42 @@ +package recommend_r + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/mycontext" + "git.hilo.cn/hilo-common/resource/mysql" + "github.com/gin-gonic/gin" + "hilo-user/cv/user_cv" + "hilo-user/domain/model/recommend_m" + "hilo-user/domain/model/user_m" + "hilo-user/resp" +) + +// @Tags 用户推荐 +// @Summary 推荐最近送礼的50人,最近12小时赠送礼物大于100k的用户 +// @Param token header string true "token" +// @Success 200 {object} []user_cv.UserTiny +// @Router /v1/recommend/user/gift [get] +func UserRecommendGift(c *gin.Context) (*mycontext.MyContext, error) { + myContext := mycontext.CreateMyContext(c.Keys) + model := domain.CreateModelContext(myContext) + // 获取推荐 + recommendUser := recommend_m.GetPastTop50SendGiftUsers(model) + var response = make([]*user_cv.UserTiny, 0) + if len(recommendUser) <= 0 { + resp.ResponseOk(c, response) + return myContext, nil + } + var userIds []mysql.ID + for _, v := range recommendUser { + userIds = append(userIds, v.SendUserId) + } + users, err := user_m.GetUserMapByIds(model, userIds) + if err != nil { + return myContext, err + } + for _, v := range recommendUser { + response = append(response, user_cv.UserToTiny(users[v.SendUserId])) + } + resp.ResponseOk(c, response) + return myContext, nil +} diff --git a/route/router.go b/route/router.go index fb972135486992952ccc87cb32648b9dbd907295..63608103ebca434027c8f6ca5a48ae6a85c0e805 100755 --- a/route/router.go +++ b/route/router.go @@ -12,6 +12,7 @@ import ( "hilo-user/domain/model/msg_m" "hilo-user/resp" "hilo-user/route/cp_r" + "hilo-user/route/recommend_r" "hilo-user/route/user_r" ) @@ -52,6 +53,10 @@ func InitRouter() *gin.Engine { //cp.GET("/relation/detail", wrapper(cp_r.CpDetailPage)) cp.GET("/im/check", wrapper(cp_r.CheckCpImExpire)) } + recommend := v1.Group("recommend") + { + recommend.GET("/user/gift", wrapper(recommend_r.UserRecommendGift)) + } inner := r.Group("/inner") inner.Use(ExceptionHandle, LoggerHandle) innerUser := inner.Group("/user")