From bcf1ac7a243094a056eb9084a10159120766c93d Mon Sep 17 00:00:00 2001 From: Havoc412 <2993167370@qq.com> Date: Sat, 2 Nov 2024 11:06:27 +0800 Subject: [PATCH] update #1 --- .../controller/web/encounter_controller.go | 3 +- app/http/validator/web/encounter/list.go | 7 +- app/model/animal_like.go | 19 ++++++ app/model/encounter.go | 67 +++++++++++++------ app/model/encounter_animal_link.go | 1 + app/service/encounter/curd/encounter_curd.go | 13 +++- 6 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 app/model/encounter_animal_link.go diff --git a/app/http/controller/web/encounter_controller.go b/app/http/controller/web/encounter_controller.go index 83190ba..f7434ed 100644 --- a/app/http/controller/web/encounter_controller.go +++ b/app/http/controller/web/encounter_controller.go @@ -62,8 +62,9 @@ func (e *Encounters) List(context *gin.Context) { num := context.GetFloat64(consts.ValidatorPrefix + "num") skip := context.GetFloat64(consts.ValidatorPrefix + "skip") user_id := context.GetFloat64(consts.ValidatorPrefix + "user_id") + mode := context.GetString(consts.ValidatorPrefix + "mode") - encounters := curd.CreateEncounterCurdFactory().List(int(num), int(skip), int(user_id)) + encounters := curd.CreateEncounterCurdFactory().List(int(num), int(skip), int(user_id), mode) if encounters != nil { response.Success(context, consts.CurdStatusOkMsg, encounters) } else { diff --git a/app/http/validator/web/encounter/list.go b/app/http/validator/web/encounter/list.go index 71b0384..84c8b5c 100644 --- a/app/http/validator/web/encounter/list.go +++ b/app/http/validator/web/encounter/list.go @@ -10,9 +10,10 @@ import ( ) type List struct { - Num int `form:"num" json:"num"` - Skip int `form:"skip" json:"skip"` - UserId int `form:"user_id" json:"user_id"` + Num int `form:"num" json:"num"` + Skip int `form:"skip" json:"skip"` + UserId int `form:"user_id" json:"user_id"` + Mode string `form:"mode" json:"mode"` } func (l List) CheckParams(context *gin.Context) { diff --git a/app/model/animal_like.go b/app/model/animal_like.go index 7d0b54a..ab77724 100644 --- a/app/model/animal_like.go +++ b/app/model/animal_like.go @@ -62,3 +62,22 @@ func (a *AnimalLike) LikedBatch(userId int, animalIds []int) ([]bool, error) { return likedResults, nil } + +/** + * @description: 获取所有关注的猫咪id + * @param {int} userId + * @return {*} + */ +func (a *AnimalLike) LikedCats(userId int) (res []int) { + var results []AnimalLike + db := a.Select("animal_id").Where("user_id = ?", userId).Find(&results) + if db.Error != nil { + return nil + } + + for _, result := range results { + res = append(res, result.AnimalId) + } + + return +} diff --git a/app/model/encounter.go b/app/model/encounter.go index 6d79505..0bb930c 100644 --- a/app/model/encounter.go +++ b/app/model/encounter.go @@ -4,6 +4,7 @@ import ( "catface/app/global/variable" "catface/app/utils/data_bind" "log" + "strings" "github.com/gin-gonic/gin" "go.uber.org/zap" @@ -57,31 +58,12 @@ func (e *Encounter) InsertDate(c *gin.Context) bool { return false } -func (e *Encounter) Show(num, skip, user_id int) (temp []EncounterList) { - sql := ` - SELECT e.id, e.user_id, title, avatar, avatar_height, avatar_width, e.updated_at, user_name, user_avatar, - EXISTS ( - SELECT 1 - FROM encounter_likes l - WHERE l.user_id = ? AND l.encounter_id = e.id AND l.is_del = 0 - ) AS ue_like - FROM encounters e - JOIN tb_users u ON e.user_id = u.id - LIMIT ? OFFSET ? - ` - // err := e.Raw(sql, user_id, num, skip).Scan(&temp).Error - // fmt.Println(err) - - var rows *gorm.DB - if rows = e.Raw(sql, user_id, num, skip); rows.Error != nil { - log.Println("查询失败:", rows.Error) - return nil - } +func formatEncounterList(rows *gorm.DB) (temp []EncounterList, err error) { // 获取底层的 sql.Rows 对象 sqlRows, err := rows.Rows() if err != nil { log.Println("获取 sql.Rows 失败:", err) - return nil + return nil, err } defer sqlRows.Close() @@ -102,6 +84,49 @@ func (e *Encounter) Show(num, skip, user_id int) (temp []EncounterList) { return } +func (e *Encounter) Show(num, skip, user_id int, animals_id []int) (temp []EncounterList) { + // SATGE - 1:build SQL + var sqlBuilder strings.Builder + + // 构建基础查询 + sqlBuilder.WriteString(` + SELECT e.id, e.user_id, title, avatar, avatar_height, avatar_width, e.updated_at, user_name, user_avatar, + EXISTS ( + SELECT 1 + FROM encounter_likes l + WHERE l.user_id = ? AND l.encounter_id = e.id AND l.is_del = 0 + ) AS ue_like + FROM encounters e + JOIN tb_users u ON e.user_id = u.id + `) + + // 动态插入 animals_id 条件 + if len(animals_id) > 0 { + sqlBuilder.WriteString("WHERE e.animal_id IN (?)") + } + + // 添加排序和分页 + sqlBuilder.WriteString(` + ORDER BY e.updated_at DESC + LIMIT ? OFFSET ? + `) + + sql := sqlBuilder.String() // 获取到 SQL; + + // STAGE - 2: Exe SQL + var rows *gorm.DB + if rows = e.Raw(sql, user_id, num, skip); rows.Error != nil { + log.Println("查询失败:", rows.Error) + return nil + } + var err error + if temp, err = formatEncounterList(rows); err != nil { + log.Println("格式化数据失败:", err) + return nil + } + return +} + func (e *Encounter) ShowByID(id int64) (temp *Encounter, err error) { // 1. search encounter if err = e.Where("id = ?", id).First(&temp).Error; err != nil { diff --git a/app/model/encounter_animal_link.go b/app/model/encounter_animal_link.go new file mode 100644 index 0000000..8b53790 --- /dev/null +++ b/app/model/encounter_animal_link.go @@ -0,0 +1 @@ +package model diff --git a/app/service/encounter/curd/encounter_curd.go b/app/service/encounter/curd/encounter_curd.go index ad5b468..8ea767b 100644 --- a/app/service/encounter/curd/encounter_curd.go +++ b/app/service/encounter/curd/encounter_curd.go @@ -14,11 +14,18 @@ type EncounterCurd struct { encounter *model.Encounter } -func (e *EncounterCurd) List(num, skip, user_id int) []model.EncounterList { +func (e *EncounterCurd) List(num, skip, user_id int, mode string) (result []model.EncounterList) { if num == 0 { - num = 15 + num = 10 } - return model.CreateEncounterFactory("").Show(num, skip, user_id) + + var likedAnimalIds []int + switch mode { + case "liked": + likedAnimalIds = model.CreateAnimalLikeFactory("").LikedCats(user_id) + } + result = model.CreateEncounterFactory("").Show(num, skip, user_id, likedAnimalIds) + return } func (e *EncounterCurd) Detail(id string) *model.EncounterDetail {