From 7b53b832853955c2df41721a91fbab20b6516061 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 11 Jul 2023 11:16:45 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat=EF=BC=9A=E7=94=A8=E6=88=B7=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/recommend_m/gift.go | 34 ++++++++++++++++++++++++++ route/recommend_r/gift.go | 42 ++++++++++++++++++++++++++++++++ route/router.go | 5 ++++ 3 files changed, 81 insertions(+) create mode 100644 domain/model/recommend_m/gift.go create mode 100644 route/recommend_r/gift.go diff --git a/domain/model/recommend_m/gift.go b/domain/model/recommend_m/gift.go new file mode 100644 index 0000000..11a7107 --- /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 0000000..eca04f7 --- /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 fb97213..6360810 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") -- 2.22.0 From d3f8d8fe0dfc7d6e03777e4e3b0bb5a1306891c5 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 11 Jul 2023 11:41:41 +0800 Subject: [PATCH 2/8] Update gift.go --- route/recommend_r/gift.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/route/recommend_r/gift.go b/route/recommend_r/gift.go index eca04f7..40373b1 100644 --- a/route/recommend_r/gift.go +++ b/route/recommend_r/gift.go @@ -6,22 +6,28 @@ import ( "git.hilo.cn/hilo-common/resource/mysql" "github.com/gin-gonic/gin" "hilo-user/cv/user_cv" + "hilo-user/domain/model/group_m" "hilo-user/domain/model/recommend_m" "hilo-user/domain/model/user_m" "hilo-user/resp" ) +type RecommendUser struct { + *user_cv.UserTiny `json:",inline"` + CurrentRoom string `json:"currentRoom"` // 当前用户所在房间(产品叫“群组”) +} + // @Tags 用户推荐 // @Summary 推荐最近送礼的50人,最近12小时赠送礼物大于100k的用户 // @Param token header string true "token" -// @Success 200 {object} []user_cv.UserTiny +// @Success 200 {object} []RecommendUser // @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) + var response = make([]RecommendUser, 0) if len(recommendUser) <= 0 { resp.ResponseOk(c, response) return myContext, nil @@ -34,8 +40,12 @@ func UserRecommendGift(c *gin.Context) (*mycontext.MyContext, error) { if err != nil { return myContext, err } + rooms, err := group_m.RoomLivingUserIdFilter(model, userIds) + if err != nil { + return nil, err + } for _, v := range recommendUser { - response = append(response, user_cv.UserToTiny(users[v.SendUserId])) + response = append(response, RecommendUser{user_cv.UserToTiny(users[v.SendUserId]), rooms[v.SendUserId]}) } resp.ResponseOk(c, response) return myContext, nil -- 2.22.0 From 82632d1b1b2031b78f8a1d7ce1e38747076f583d Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 11 Jul 2023 15:00:12 +0800 Subject: [PATCH 3/8] Update gift.go --- route/recommend_r/gift.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/route/recommend_r/gift.go b/route/recommend_r/gift.go index 40373b1..b782a42 100644 --- a/route/recommend_r/gift.go +++ b/route/recommend_r/gift.go @@ -13,8 +13,8 @@ import ( ) type RecommendUser struct { - *user_cv.UserTiny `json:",inline"` - CurrentRoom string `json:"currentRoom"` // 当前用户所在房间(产品叫“群组”) + User *user_cv.UserTiny `json:"user"` + CurrentRoom string `json:"currentRoom"` // 当前用户所在房间(产品叫“群组”) } // @Tags 用户推荐 -- 2.22.0 From a60fd9275e476a88f8a3714cf113a53020d95732 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 13 Jul 2023 18:44:26 +0800 Subject: [PATCH 4/8] Update user.go --- cv/user_cv/user.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cv/user_cv/user.go b/cv/user_cv/user.go index 6e09de7..a795e18 100644 --- a/cv/user_cv/user.go +++ b/cv/user_cv/user.go @@ -29,6 +29,7 @@ type UserTiny struct { Country string `json:"country"` CountryIcon string `json:"countryIcon"` IsPrettyCode bool `json:"isPrettyCode"` // 是否靓号 + Birthday uint64 `json:"birthday"` } func UserToTiny(user user_m.User) *UserTiny { @@ -42,6 +43,7 @@ func UserToTiny(user user_m.User) *UserTiny { Country: user.Country, CountryIcon: user.CountryIcon, IsPrettyCode: user.IsPrettyCode(), + Birthday: user.Birthday, } } -- 2.22.0 From 312d9a7acaa13a64423620353a4af8de69ac4e47 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 14 Jul 2023 10:44:59 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=96=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cv/user_cv/user.go | 5 ++++- domain/model/user_m/user.go | 5 +++++ domain/service/user_s/user.go | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cv/user_cv/user.go b/cv/user_cv/user.go index a795e18..82e053d 100644 --- a/cv/user_cv/user.go +++ b/cv/user_cv/user.go @@ -84,7 +84,8 @@ type CvUserBase struct { //邀请码 Code *string `json:"code"` IsPrettyCode bool `json:"isPrettyCode"` // 是否靓号 - IsLogout bool `json:"isLogout"` //是否注销 + IsNew bool `json:"isNew"` // 是否新用户 + IsLogout bool `json:"isLogout"` // 是否注销 //生日,如果是其它人用户信息,年龄则按照是否展示显示,如果是本人,年龄则按照是否存在展示 Birthday *uint64 `json:"birthday"` //是否展示年龄, 是本人才有数据,看其他用户均为nil @@ -201,6 +202,7 @@ func GetUserBases(userIds []mysql.ID, myUserId mysql.ID) ([]*CvUserBase, error) CountryIcon: StrNil(user.CountryIcon), Code: StrToString(&user.Code), IsPrettyCode: user.IsPrettyCode(), + IsNew: user.IsNew(), IsVip: vips[user.ID] != nil, IsOfficialStaff: superManagerMap[user.ID], Medals: IfLogoutMedals(IfLogout(user.LogoutTime), []uint32{}, medals[user.ID]), @@ -301,6 +303,7 @@ func GetUserBasesForCp(userIds []mysql.ID) ([]*CvUserBase, error) { CountryIcon: StrNil(user.CountryIcon), Code: StrToString(&user.Code), IsPrettyCode: user.IsPrettyCode(), + IsNew: user.IsNew(), IsVip: vips[user.ID] != nil, Noble: noble_cv.CvNoble{ Level: nobles[user.ID].Level, diff --git a/domain/model/user_m/user.go b/domain/model/user_m/user.go index a9863ca..afdf317 100755 --- a/domain/model/user_m/user.go +++ b/domain/model/user_m/user.go @@ -52,6 +52,11 @@ func (u User) IsPrettyCode() bool { return u.Code != u.OriginCode } +// 七天内注册 +func (u User) IsNew() bool { + return time.Now().Sub(u.CreatedTime).Hours() < 24*7 +} + //获取用户 func GetUser(model *domain.Model, id mysql.ID) (*User, error) { var user User diff --git a/domain/service/user_s/user.go b/domain/service/user_s/user.go index de797c4..fd67094 100644 --- a/domain/service/user_s/user.go +++ b/domain/service/user_s/user.go @@ -285,6 +285,7 @@ func userToDetailOne(model *domain.Model, user *user_m.User, myUserId mysql.ID, CountryIcon: StrNil(user.CountryIcon), Code: StrToString(&user.Code), IsPrettyCode: user.IsPrettyCode(), + IsNew: user.IsNew(), IsVip: isVip, IsOfficialStaff: isOfficialStaff, VipExpireTime: vipExpireTime, -- 2.22.0 From 95bd280f99a26675201e8fac5951556f7ec7c113 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 18 Jul 2023 11:00:43 +0800 Subject: [PATCH 6/8] to txGroupIds --- domain/model/group_m/groupInfo.go | 12 ++++++++++++ route/recommend_r/gift.go | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/domain/model/group_m/groupInfo.go b/domain/model/group_m/groupInfo.go index cf0c798..13441e6 100644 --- a/domain/model/group_m/groupInfo.go +++ b/domain/model/group_m/groupInfo.go @@ -76,6 +76,18 @@ func ToTxGroupId(model *domain.Model, imGroupId string) (string, error) { return gi.TxGroupId, nil } +func ToTxGroupIdMap(model *domain.Model, imGroupIds []string) (map[string]string, error) { + var res = make(map[string]string) + var rows []GroupInfo + if err := model.DB().Model(GroupInfo{}).Where("im_group_id in ?", imGroupIds).Find(&rows).Error; err != nil { + return res, err + } + for _, v := range rows { + res[v.ImGroupId] = v.TxGroupId + } + return res, nil +} + func ToImGroupId(model *domain.Model, txGroupId string) (string, error) { if len(txGroupId) <= 0 { return "", nil diff --git a/route/recommend_r/gift.go b/route/recommend_r/gift.go index b782a42..0258156 100644 --- a/route/recommend_r/gift.go +++ b/route/recommend_r/gift.go @@ -43,6 +43,16 @@ func UserRecommendGift(c *gin.Context) (*mycontext.MyContext, error) { rooms, err := group_m.RoomLivingUserIdFilter(model, userIds) if err != nil { return nil, err + } else if len(rooms) > 0 { + // to txGroupIds + var imGroupIds []string + for _, imGroupId := range rooms { + imGroupIds = append(imGroupIds, imGroupId) + } + txGroupIdsMap, _ := group_m.ToTxGroupIdMap(model, imGroupIds) + for uid, room := range rooms { + rooms[uid] = txGroupIdsMap[room] + } } for _, v := range recommendUser { response = append(response, RecommendUser{user_cv.UserToTiny(users[v.SendUserId]), rooms[v.SendUserId]}) -- 2.22.0 From fc9387a9c7c07cfe9d223a2530ab8a1489ebcb33 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 18 Jul 2023 11:05:18 +0800 Subject: [PATCH 7/8] Update gift.go --- domain/model/recommend_m/gift.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/model/recommend_m/gift.go b/domain/model/recommend_m/gift.go index 11a7107..d18db69 100644 --- a/domain/model/recommend_m/gift.go +++ b/domain/model/recommend_m/gift.go @@ -26,7 +26,7 @@ func GetPastTop50SendGiftUsers(model *domain.Model) []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 { + Having("send_user_diamond > 100000").Order("send_user_diamond DESC").Limit(30).Find(&res).Error; err != nil { model.Log.Errorf("GetPastTop50SendGiftUsers fail:%v", err) } recommendUserGiftCache.SetWithExpire(recommendUserGiftKey, res, time.Minute*5) -- 2.22.0 From e8c186bedc576a5659e787112564c2e4afdb2744 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 18 Jul 2023 18:04:08 +0800 Subject: [PATCH 8/8] Update gift.go --- domain/model/recommend_m/gift.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/model/recommend_m/gift.go b/domain/model/recommend_m/gift.go index d18db69..0ca4f3f 100644 --- a/domain/model/recommend_m/gift.go +++ b/domain/model/recommend_m/gift.go @@ -26,7 +26,7 @@ func GetPastTop50SendGiftUsers(model *domain.Model) []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(30).Find(&res).Error; err != nil { + Having("send_user_diamond > 100000").Order("send_user_diamond DESC").Limit(34).Find(&res).Error; err != nil { model.Log.Errorf("GetPastTop50SendGiftUsers fail:%v", err) } recommendUserGiftCache.SetWithExpire(recommendUserGiftKey, res, time.Minute*5) -- 2.22.0