topfans/docs/PRD.md
2026-04-07 22:28:50 +08:00

574 lines
15 KiB
Markdown

# TopFans 产品需求文档 (PRD)
## 文档信息
| 项目 | 内容 |
|------|------|
| 项目名称 | TopFans |
| 版本 | V1.0 |
| 文档类型 | 产品需求文档 |
| 生成日期 | 2026-03-11 |
---
## 1. 项目概述
### 1.1 产品定位
TopFans 是一款基于 NFT 数字藏品技术的粉丝社交应用,连接明星与粉丝,提供藏品铸造、展馆展示、社交互动等核心功能。
### 1.2 目标用户
- 明星粉丝群体
- 数字藏品爱好者
- 社交娱乐用户
### 1.3 技术架构
#### 前端技术栈
| 技术 | 说明 |
|------|------|
| uni-app | 跨平台应用框架 |
| Vue 3 | 前端框架 |
| Vuex 4 | 状态管理 |
| HBuilderX | 构建工具 |
#### 后端技术栈
| 技术 | 说明 |
|------|------|
| Go 1.25.5 | 开发语言 |
| Gin | HTTP 网关 |
| Dubbo-go | 微服务框架 (Triple协议) |
| PostgreSQL | 数据库 |
| GORM | ORM框架 |
| JWT | 认证 |
| 阿里云 OSS | 对象存储 |
#### 微服务架构
```
┌─────────────────────────────────────────────────────────────────────────┐
│ Mobile App (uni-app) │
└─────────────────────────────────┬───────────────────────────────────────┘
│ HTTP
┌─────────────────────────────────────────────────────────────────────────┐
│ API Gateway (Gin :8080) │
│ • JWT认证 • 请求路由 • Swagger文档 │
└─────────┬──────────────────────┬───────────────────────┬───────────────┘
│ │ │
│ Dubbo RPC │ Dubbo RPC │ Dubbo RPC
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ User Service │ │ Social Service │ │ Asset Service │
│ (:20000) │ │ (:20001) │ │ (:20003) │
│ │ │ │ │ │
│ • 注册/登录 │ │ • 好友管理 │ │ • 藏品铸造 │
│ • 粉丝身份 │ │ • 用户搜索 │ │ • OSS上传 │
│ • 密码管理 │ │ • 点赞功能 │ │ • 藏品查询 │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
└─────────────────────┼──────────────────────┘
│ Dubbo RPC
┌─────────────────────────┐
│ Gallery Service │
│ (:20004) │
│ │
│ • 展馆管理 │
│ • 展位管理 │
│ • 藏品展示 │
└─────────────────────────┘
┌─────────────────────────┐
│ PostgreSQL │
│ + GORM │
└─────────────────────────┘
```
---
## 2. 功能模块总览
| 模块 | 核心功能 | 状态 |
|------|----------|------|
| 认证系统 | 注册、登录、Token管理 | ✅ 已实现 |
| 粉丝身份系统 | 身份选择、多身份切换 | ✅ 已实现 |
| 藏品系统 | 铸造、上传、详情、点赞 | ✅ 已实现 |
| 展馆系统 | 展位管理、藏品展示 | ✅ 已实现 |
| 社交系统 | 好友搜索、申请、删除 | ✅ 已实现 |
| 任务系统 | 任务列表、奖励领取 | 🔄 部分实现 |
| 新手引导 | 引导流程、状态管理 | 🔄 部分实现 |
---
## 3. 详细功能需求
### 3.1 认证系统 (Auth)
#### 3.1.1 用户注册
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/auth/register |
| 认证 | 无需认证 |
| 请求参数 | uid(手机号), password, fan_identity_id, nickname |
| 返回 | access_token, user基础信息, 当前身份信息 |
| 说明 | 注册时必须选择一个粉丝身份(nickname唯一性?) |
#### 3.1.2 用户登录
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/auth/login |
| 认证 | 无需认证 |
| 请求参数 | uid, password |
| 返回 | access_token, user基础信息 |
#### 3.1.3 获取当前用户
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/auth/me |
| 认证 | JWT Token |
| 返回 | uid, nickname, current_identity |
#### 3.1.4 修改密码
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/account/password |
| 认证 | JWT Token |
| 请求参数 | old_password, new_password |
#### 3.1.5 退出登录
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/auth/logout |
| 认证 | JWT Token |
#### 3.1.6 注销账号
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/user/delete-account |
| 认证 | JWT Token |
---
### 3.2 粉丝身份系统 (Fan Identity)
#### 3.2.1 获取可选粉丝身份列表
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/fan-identities |
| 认证 | 无需认证 |
| 查询参数 | keyword, page, page_size |
| 返回 | star_id, identity_id, name, tag |
#### 3.2.2 新增粉丝身份
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/my/fan-identities |
| 认证 | JWT Token |
| 请求参数 | identity_id |
| 说明 | 最多绑定2个身份 |
#### 3.2.3 获取我的粉丝身份列表
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/my/fan-identities |
| 认证 | JWT Token |
#### 3.2.4 切换粉丝身份
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/my/fan-identities/switch |
| 认证 | JWT Token |
| 请求参数 | new_star_id |
| 返回 | 新token, current_identity信息 |
---
### 3.3 个人信息 (Profile)
#### 3.3.1 获取个人信息
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/me/profile |
| 认证 | JWT Token |
| 返回 | uid, nickname, fan_identity, fan_level, starbook_limit, slot_limit, assets_num, crystal_balance |
#### 3.3.2 修改昵称
| 项目 | 内容 |
|------|------|
| 接口 | PUT /api/v1/me/nickname |
| 认证 | JWT Token |
| 请求参数 | nickname |
#### 3.3.3 更新头像
| 项目 | 内容 |
|------|------|
| 接口 | PUT /api/v1/me/avatar |
| 认证 | JWT Token |
| 请求参数 | avatar_url |
---
### 3.4 藏品系统 (Asset/Mint)
#### 3.4.1 获取OSS上传签名
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/assets/oss/signature |
| 认证 | JWT Token |
| 返回 | OSS上传所需的签名信息 |
#### 3.4.2 获取OSS预签名URL
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/assets/oss/presigned-url |
| 认证 | JWT Token |
| 请求参数 | object_key |
#### 3.4.3 创建铸造订单
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/assets/mints |
| 认证 | JWT Token |
| 请求参数 | name, type, pic_url, material |
| 返回 | mint_id, status, asset_id |
#### 3.4.4 删除铸造订单
| 项目 | 内容 |
|------|------|
| 接口 | DELETE /api/v1/assets/mints/{orderId} |
| 认证 | JWT Token |
#### 3.4.5 获取我的藏品列表
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/assets/me/items |
| 认证 | JWT Token |
| 查询参数 | page, page_size |
| 返回 | asset_id, name, cover_url, like_count, mint_status, on_chain |
#### 3.4.6 获取藏品详情
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/assets/{assetId} |
| 认证 | 公开 |
| 返回 | asset_id, name, type, cover_url, owner_uid, owner_nickname, like_count, on_chain |
#### 3.4.7 点赞藏品
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/social/assets/{assetId}/like |
| 认证 | JWT Token |
| 返回 | liked, like_count |
#### 3.4.8 取消点赞
| 项目 | 内容 |
|------|------|
| 接口 | DELETE /api/v1/social/assets/{assetId}/like |
| 认证 | JWT Token |
| 返回 | liked, like_count |
---
### 3.5 展馆系统 (Gallery)
#### 3.5.1 获取我的展馆
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/mygalleries |
| 认证 | JWT Token |
| 返回 | gallery_owner_id, slot_total, slots(含asset信息) |
#### 3.5.2 获取他人展馆
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/galleries/{targetUid} |
| 认证 | JWT Token |
| 返回 | 同上 |
| 说明 | 需校验粉丝身份一致才能访问 |
#### 3.5.3 展位展示藏品
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/galleries/place |
| 认证 | JWT Token |
| 请求参数 | asset_id, gallery_owner_id, slot_id |
| 返回 | status, occupied_until, occupier_uid |
#### 3.5.4 下架展位藏品
| 项目 | 内容 |
|------|------|
| 接口 | DELETE /api/v1/galleries/slots/{slotId}/asset |
| 认证 | JWT Token |
---
### 3.6 社交系统 (Social)
#### 3.6.1 搜索用户
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/social/search-user |
| 认证 | JWT Token |
| 查询参数 | keyword |
| 返回 | uid, nickname, is_friend |
#### 3.6.2 获取好友列表
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/social/friends |
| 认证 | JWT Token |
| 查询参数 | page, page_size |
| 返回 | uid, nickname, fan_level |
#### 3.6.3 发送好友请求
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/social/friend-requests |
| 认证 | JWT Token |
| 请求参数 | target_uid |
#### 3.6.4 获取已发送好友请求
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/social/friend-requests |
| 认证 | JWT Token |
| 查询参数 | type=sent |
#### 3.6.5 获取收到的好友请求
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/social/friend-requests |
| 认证 | JWT Token |
| 查询参数 | type=received |
#### 3.6.6 处理好友请求
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/social/friend-requests/handle |
| 认证 | JWT Token |
| 请求参数 | request_id, action(accept/reject) |
#### 3.6.7 删除好友
| 项目 | 内容 |
|------|------|
| 接口 | DELETE /api/v1/social/friends |
| 认证 | JWT Token |
| 请求参数 | friend_uid |
---
### 3.7 任务系统 (Task)
#### 3.7.1 获取任务列表
| 项目 | 内容 |
|------|------|
| 接口 | GET /api/v1/tasks |
| 认证 | JWT Token |
| 返回 | task_id, title, status, reward |
#### 3.7.2 领取任务奖励
| 项目 | 内容 |
|------|------|
| 接口 | POST /api/v1/tasks/claim |
| 认证 | JWT Token |
| 请求参数 | task_id |
---
## 4. 数据库模型
### 4.1 核心数据表
| 表名 | 说明 |
|------|------|
| users | 用户表 |
| stars | 明星信息表 |
| fan_profiles | 粉丝档案表(用户-明星关联) |
| assets | 资产/藏品表 |
| mint_orders | 铸造订单表 |
| asset_likes | 点赞记录表 |
| friendships | 好友关系表 |
| friend_requests | 好友请求表 |
| booth_slots | 展位表 |
| exhibitions | 展品展示表 |
---
## 5. 用户界面结构
### 5.1 页面路由
| 路由 | 页面 | 说明 |
|------|------|------|
| /pages/login/login | 登录页 | 用户登录 |
| /pages/register/register | 注册页 | 用户注册 |
| /pages/profile/setNickname | 设置昵称 | 注册时设置昵称 |
| /pages/profile/selectRole | 选择角色 | 选择粉丝身份 |
| /pages/profile/profile | 个人中心 | 用户资料管理 |
| /pages/square/square | 广场首页 | 主页面 |
| /pages/exhibition/exhibition | 展馆页 | 展馆/展位管理 |
| /pages/castlove/success | 铸造成功 | 铸造成功展示 |
### 5.2 主要组件
| 组件 | 说明 |
|------|------|
| SquareContent | 广场主内容区(切换广场/好友/星册/铸爱/装扮) |
| FriendsContent | 好友列表与社交功能 |
| StarbookContent | 我的藏品/星册 |
| CastloveContent | 铸造功能 |
| DressupContent | 装扮功能 |
| NftCard | 藏品卡片 |
| NftDetailModal | 藏品详情弹窗 |
| Avatar | 头像组件 |
| Header | 顶部导航栏 |
| BottomNav | 底部导航栏 |
| TaskModal | 任务弹窗 |
---
## 6. 业务规则
### 6.1 粉丝身份隔离
- 每个用户可绑定最多2个粉丝身份
- 切换身份后,藏品、展馆、好友等数据按身份隔离
- Token中包含user_id和star_id
### 6.2 展馆规则
- 初始展位: 3个
- 可解锁/购买更多展位
- 可展示藏品到他人展馆空位
- 抢展位: 4小时后自动下架
### 6.3 好友规则
- 需双向确认才能成为好友
- 默认上限: 50个
- 可随等级解锁更多
### 6.4 铸造规则
- 支持平台素材或用户上传
- 需审核和AI生成封面
- 铸造后生成链上确权
---
## 7. 安全要求
### 7.1 认证
- JWT Token认证
- Token有效期: 7天
- 从Header提取: Authorization: Bearer \<token\>
### 7.2 响应格式
```json
{
"code": 200,
"message": "ok",
"data": {}
}
```
### 7.3 分页格式
```json
{
"code": 200,
"message": "ok",
"data": {
"items": [],
"page": 1,
"page_size": 20,
"total": 100
}
}
```
---
## 8. 外部依赖
| 服务 | 说明 |
|------|------|
| 阿里云OSS | 藏品图片存储 |
| PostgreSQL | 数据持久化 |
| (区块链) | 数字藏品上链(待实现) |
---
## 9. 待实现功能
根据代码分析,以下功能标记为待实现或部分实现:
1. **广场推荐** - 广场小屋列表、TOP藏品展板
2. **任务系统** - 完整任务列表和奖励领取
3. **新手引导** - 引导流程和状态管理
4. **踢走占位** - 被占位者踢走占领者
5. **解锁展位** - 等级解锁或货币购买
6. **系统推荐好友** - 推荐好友列表
---
## 10. 附录
### 10.1 错误码定义
| 错误码 | 说明 |
|--------|------|
| 200 | 成功 |
| 401 | Token失效/未认证 |
| 400 | 请求参数错误 |
| 500 | 服务器内部错误 |
### 10.2 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| V1.0 | 2026-03-11 | 初始版本(基于代码分析) |
---
*本文档基于代码分析自动生成,如需更新请参考实际实现。*