topfans/docs/superpowers/specs/2026-05-14-activity-ranking-modal-design.md
zheng020 63b0b0423d docs: 添加活动榜单弹窗设计文档
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 12:39:44 +08:00

77 lines
2.1 KiB
Markdown
Raw 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-05-14
**状态**: 已批准
## 概述
新建 `ActivityRankingModal.vue` 弹窗组件,从 `ThemeBanner` 点击触发,专门显示单活动的排名数据。
## 核心功能
1. **TOP3 展示** - 排名前三用户卡片(头像、昵称、人气值)
2. **排名列表** - 第4名及以后支持滚动加载更多
3. **当前用户栏** - 固定底部,显示当前用户排名和贡献值
4. **下拉刷新** - 支持 pull-to-refresh 刷新数据
5. **单活动模式** - 直接使用传入的 `activityId` 获取数据,无需活动切换
## 组件接口
### Props
| 属性 | 类型 | 必填 | 说明 |
|------|------|------|------|
| visible | Boolean | 是 | 弹窗显示状态 |
| activityId | String \| Number | 是 | 活动ID |
| starId | String \| Number | 否 | 明星ID默认从 storage 获取 |
| currentUser | Object | 否 | 当前用户数据 |
### Emits
| 事件 | 参数 | 说明 |
|------|------|------|
| update:visible | Boolean | 关闭弹窗 |
| visit | { userId, nickname } | 拜访按钮点击 |
| view-profile | userId | 查看用户资料 |
| view-artwork | { artworkId, userId } | 查看作品 |
## API 调用(独立实现)
使用 `getActivityRankingApi(activityId, starId, page, pageSize)` 获取活动排名数据。
响应数据格式复用 RankingModal 的 `transformActivityRankingData` 逻辑:
```javascript
{
rank: Number,
userId: String,
avatar: String,
nickname: String,
popularityScore: Number, // total_contribution
artworkImage: String
}
```
## 页面结构
```
ActivityRankingModal
├── 遮罩层(点击关闭)
├── 弹窗容器
│ ├── 背景
│ ├── 头部(活动名称 + 关闭按钮)
│ ├── 滚动内容区
│ │ ├── 加载中/错误/空状态
│ │ ├── TOP3 卡片区
│ │ ├── 排名列表
│ │ └── 加载更多
│ └── 当前用户栏(固定底部)
```
## 样式
复用 `RankingModal.vue` 的现有样式主题(渐变背景、卡片样式等)。
## 触发方式
`ThemeBanner` 组件上添加点击事件,打开 `ActivityRankingModal`