4.0 KiB
4.0 KiB
name, overview, todos
| name | overview | todos | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 收藏单条状态查询接口 | 参照点赞的 GET /like/:targetUUID,为收藏新增 GET /collect/:targetUUID 单条收藏状态查询接口(返回 is_collected + collect_count),补齐前端进入穿搭详情时的收藏状态初始化能力。 |
|
用户需求
收藏状态无法正确初始化——后端缺少「单条收藏状态」查询接口。点赞已有 GET /like/:targetUUID(返回 is_liked + like_count),收藏仅有 POST /collect(收藏/取消)和 GET /collect(我的收藏列表),前端进入穿搭详情时无法获知当前用户是否已收藏该穿搭。
核心功能
参照点赞接口,为收藏补齐 GET /collect/:targetUUID 单条状态查询:
- 返回当前用户是否已收藏(
is_collected)与该穿搭收藏总数(collect_count) - Redis 优先、异常回落 MySQL,与点赞查询策略严格对称
- 校验穿搭存在性与可见性(非本人仅可查询公开可见穿搭)
技术栈
- Go 1.27 + Gin + GORM + go-redis,沿用现有分层(handler → service → dao / redisdao)
- 复用现有收藏底层能力,不新增 DAO/Redis 方法
实现方式
严格对齐点赞 GET /like/:targetUUID 的实现模式,新增收藏单条状态查询链路。
关键决策
- 字段命名对称:点赞
is_liked/like_count,收藏用is_collected/collect_count。 - 路径参数命名对齐:
targetUUID(驼峰,与点赞一致),避免前端两套传参方式不一致。 - 回落策略一致:是否已收藏与收藏总数均 Redis 优先;Redis 出错或计数为 0 时回落 MySQL 兜底,保证缓存冷启动/漂移时数据正确。
- 仅新增不改旧:收藏的收藏/取消与列表逻辑保持不动,降低回归风险。
数据流
GET /collect/:targetUUID → handler 取 targetUUID → service 校验穿搭(存在 + 可见性)→ Redis 查收藏状态/计数 → 异常回落 MySQL → 返回 {is_collected, collect_count}
目录结构
zt-closet-backend/
├── internal/
│ ├── dto/
│ │ └── collect.go # [MODIFY] 新增 CollectGetByTargetRequest/Response
│ ├── service/
│ │ └── collect.go # [MODIFY] 新增 GetByTarget 方法
│ └── routers/
│ ├── router.go # [MODIFY] 注册 GET /collect/:targetUUID
│ └── api/v1/
│ └── collect.go # [MODIFY] 新增 GetByTarget handler
├── README.md # [MODIFY] API 概览收藏小节新增接口行
└── 接口文档.md # [MODIFY] 接口总表与 5.8 节新增接口说明
实现细节
- DTO 定义与点赞完全对应:
CollectGetByTargetRequest{ TargetUUID string json:"target_uuid" binding:"required" }、CollectGetByTargetResponse{ UserIsCollected bool json:"is_collected"; CollectCount int64 json:"collect_count" }。 - Service
GetByTarget内部逻辑:先OutfitGetByUUID(不存在返回TargetNotFound、非本人且未公开返回OutfitNoPermission),再取targetID,随后CollectIsMember(Redis 优先,err 回落CollectGetByTargetAndUser判断Status == InteractStatusOn),最后CollectCount(Redis 优先,err != nil || count == 0回落CollectCountByTarget)。 - Handler 与路由均对齐点赞:path 参数
targetUUID,空值返回InvalidParams;路由注册在鉴权组内,/collect(精确路径)与/collect/:targetUUID(参数路径)在 Gin 路由树中可共存。