library-picturebook-activity/docs/design/public/like-favorite.md
aid f246b38fc1 Day5: 超管端内容管理模块全面优化 + 广场推荐作品展示
作品审核:
- 批量通过/批量拒绝 + 撤销审核机制
- 默认筛选待审核,表格加描述预览+审核时间列
- 详情Drawer加上一个/下一个导航,审核后自动跳下一个
- 操作日志时间线展示,筛选下拉自动查询

作品管理:
- 修复筛选/排序失效,新增推荐中筛选
- 下架改为弹窗选择原因,取消推荐二次确认
- 详情Drawer补全描述/标签/操作按钮/操作日志
- 统计卡片可点击筛选,下架自动取消推荐

标签管理:
- 按分类分组卡片式展示,分类改为下拉选择
- 新增标签颜色字段(预设色+自定义)
- 上移/下移排序按钮,使用次数可点击跳转作品管理
- 新增/编辑时实时预览用户端标签效果

广场推荐:
- 新增推荐作品列表接口 GET /public/gallery/recommended
- 广场顶部新增「编辑推荐」横向滚动栏

文档更新:内容管理设计文档补充实施记录,UGC开发计划P1-1标记已完成

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 15:21:21 +08:00

123 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 点赞 & 收藏功能设计
> 所属端:公众端 + 超管端联动
> 状态:已实现
> 创建日期2026-03-31
> 最后更新2026-03-31
## 概述
为 UGC 绘本创作社区的作品添加点赞和收藏交互能力,提升用户参与感和内容发现效率。
## 现状
- 数据库:`user_work_likes` 和 `user_work_favorites` 表已存在(含唯一约束)
- `UserWork` 表已有 `likeCount`、`favoriteCount` 冗余计数字段
- 前端Gallery 和 Detail 页面已展示计数数字,但无交互按钮
- 后端:无任何点赞/收藏 API
## API 设计
### 公众端 API
| 方法 | 路径 | 说明 | 鉴权 |
|------|------|------|------|
| POST | `/api/public/works/:id/like` | 点赞/取消点赞toggle | 需登录 |
| POST | `/api/public/works/:id/favorite` | 收藏/取消收藏toggle | 需登录 |
| GET | `/api/public/works/:id/interaction` | 查询当前用户对该作品的交互状态 | 需登录 |
| GET | `/api/public/mine/favorites` | 我的收藏列表 | 需登录 |
### 请求/响应
#### POST /works/:id/like
```json
// Response
{ "liked": true, "likeCount": 42 }
```
#### POST /works/:id/favorite
```json
// Response
{ "favorited": true, "favoriteCount": 18 }
```
#### GET /works/:id/interaction
```json
// Response
{ "liked": true, "favorited": false }
```
#### GET /mine/favorites
```json
// Response
{
"list": [
{
"id": 1,
"workId": 10,
"createTime": "2026-03-31T...",
"work": {
"id": 10, "title": "...", "coverUrl": "...",
"likeCount": 42, "viewCount": 100,
"creator": { "id": 1, "nickname": "...", "avatar": "..." }
}
}
],
"total": 5, "page": 1, "pageSize": 12
}
```
## 后端实现
### 新增文件
- `backend/src/public/interaction.service.ts` — 交互服务
### 核心逻辑
**点赞 toggle**
1. 查询 `UserWorkLike` 是否存在该记录
2. 存在 → 删除记录 + `likeCount` 减 1
3. 不存在 → 创建记录 + `likeCount` 加 1
4. 使用事务保证一致性
**收藏 toggle**:同上逻辑,操作 `UserWorkFavorite``favoriteCount`
**交互状态查询**
- 批量查询 like + favorite 记录是否存在
- 广场详情接口中嵌入调用(已登录时返回交互状态)
## 前端改动
### 作品详情页 (Detail.vue)
- stats-row 改为交互按钮栏:点赞按钮 + 收藏按钮
- 已点赞/收藏时图标实心 + 主题色高亮
- 点击触发 toggle API乐观更新计数
### 广场页 (Gallery.vue)
- 卡片 stats 区域的心形图标改为可点击
- 点击点赞(阻止冒泡,不跳转详情)
- 乐观更新 + 简单动效
### 新增页面
- `/p/mine/favorites` — 我的收藏页面
- 个人中心 Index.vue 增加「我的收藏」菜单入口
### API 定义
```typescript
// api/public.ts
export const publicInteractionApi = {
like: (workId: number) => publicApi.post(`/public/works/${workId}/like`),
favorite: (workId: number) => publicApi.post(`/public/works/${workId}/favorite`),
getInteraction: (workId: number) => publicApi.get(`/public/works/${workId}/interaction`),
myFavorites: (params?: { page?: number; pageSize?: number }) =>
publicApi.get('/public/mine/favorites', { params }),
}
```
## 交互细节
- 未登录用户点击点赞/收藏 → 跳转登录页
- 乐观更新:点击后立即更新 UIAPI 失败时回滚
- 点赞按钮动效:心形图标缩放弹跳
- 自己的作品也可以点赞/收藏(不做限制)