topfans/backend/docs/好友功能-设计确认总结.md
2026-04-07 22:29:48 +08:00

232 lines
6.1 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-01-06
> **状态**:✅ 所有问题已确认,设计方案已完成
---
## 📝 问题与答案汇总
### 问题 1好友数量限制
**答案**:后续会引入规则表进行动态限制好友个数,目前暂不考虑
**实现**
-`friend_config.go` 中预留了 `FriendLimitConfig` 结构体
- `Enabled = false`(默认不启用)
- 后续可通过规则表根据用户等级、会员状态等动态配置
---
### 问题 2重复请求冷却期
**答案**7天可以再次发送并且30天的过期时间、7天这类的时间限制目前需要放在一个地方统一配置、以便后续有可能会直接迁移到规则表的情况
**实现**
- ✅ 创建了 `backend/services/friendService/config/friend_config.go`
- ✅ 统一管理所有时间限制配置
- ✅ 提供了丰富的辅助方法
**配置内容**
```go
TimeConstraints: TimeConstraints{
RejectionCooldownDays: 7, // 7天冷却期
RequestExpiryDays: 30, // 30天过期时间
RejectionCooldownMillis: 7 * 24 * 60 * 60 * 1000,
RequestExpiryMillis: 30 * 24 * 60 * 60 * 1000,
}
```
---
### 问题 3请求过期时间
**答案**30天
**实现**
- 配置在 `friend_config.go`
- 创建请求时自动计算 `expires_at`
- 定时任务扫描过期请求
---
### 问题 4删除好友通知
**答案**:删除好友不通知对方
**实现**
- 静默删除,不发送任何推送通知
- 不在对方界面显示"已解除好友关系"
---
### 问题 5好友关系的数据保留
**答案**:完全删除
**实现**
- 物理删除,不使用软删除
- 同时删除双向关系A→B 和 B→A
- 更新 `fan_profiles` 表的 `social` 字段
---
### 问题 6好友列表查询优化
**答案**:好友列表需要支持分页查询,并且你需要做一些设计,添加合适的数据库索引来优化查询性能
**实现**
- ✅ 支持分页查询(`page` 和 `page_size` 参数)
- ✅ 支持关键词搜索(搜索昵称或备注)
- ✅ 添加了完整的数据库索引设计
**索引设计**
**friendships 表**4个索引
1. `uk_friendships_user_friend_star` - 唯一索引(防重复)
2. `idx_friendships_user_star_status` - 基础查询索引
3. `idx_friendships_user_star_created` - 时间排序索引
4. `idx_friendships_list_query` - 覆盖索引(避免回表)
**friend_requests 表**5个索引
1. `idx_friend_requests_to_status` - 收到的请求查询
2. `idx_friend_requests_from_status` - 发出的请求查询
3. `idx_friend_requests_star` - 明星筛选
4. `idx_friend_requests_expires` - 过期扫描
5. `idx_friend_requests_users_star` - 防骚扰机制查询
---
### 问题 7并发控制
**答案**:使用数据库事务保证原子性
**实现**
- ✅ 唯一索引防止重复记录
- ✅ 使用数据库事务包裹关键操作
- ✅ 接受好友请求:事务包含(更新请求状态 + 创建双向关系 + 更新 social
- ✅ 删除好友:事务包含(删除双向关系 + 更新 social
---
### 问题 8跨服务调用
**答案**:通过 Dubbo RPC 调用
**实现**
- ✅ 创建 userService RPC 客户端
- ✅ 实现 `ValidateUser` 方法
- ✅ 实现 `ValidateFanProfile` 方法
- ✅ 实现 `GetUsersByIDs` 批量查询方法
---
## 📦 已创建的文件
### 1. 配置文件
**文件**`backend/services/friendService/config/friend_config.go`
**内容**
-`FriendConfig` 结构体
-`TimeConstraints` 时间约束配置
-`FriendLimitConfig` 好友数量限制配置(预留)
- ✅ 丰富的辅助方法(计算剩余天数、检查是否过期等)
**行数**183 行
---
### 2. 设计文档更新
**文件**`backend/docs/好友功能设计方案.md`
**更新内容**
- ✅ 将"待讨论问题"章节改为"设计决策(已确认)"
- ✅ 补充了所有8个问题的最终决策和实现要点
- ✅ 完善了数据库索引设计
- ✅ 更新了文档状态为"设计已确认"
- ✅ 添加了变更历史
**总行数**1259 行
---
### 3. 决策汇总文档
**文件**`backend/docs/好友功能设计决策汇总.md`
**内容**
- ✅ 设计决策快速索引表
- ✅ 详细的业务逻辑决策说明
- ✅ 详细的技术实现决策说明
- ✅ 配置文件使用说明
- ✅ 错误码定义
- ✅ 实现检查清单
- ✅ 后续优化方向
**总行数**:约 400 行
---
## 🎯 核心设计亮点
### 1. 统一配置管理 ⭐
- 所有时间限制配置集中在 `friend_config.go`
- 便于后续迁移到规则表
- 提供了丰富的辅助方法
### 2. 完善的索引设计 ⭐
- friendships 表4个索引覆盖所有查询场景
- friend_requests 表5个索引支持防骚扰机制
- 覆盖索引避免回表,性能优异
### 3. 防骚扰机制 ⭐
- 7天冷却期防止重复骚扰
- 查询历史请求记录,智能判断
- 友好的错误提示(显示剩余天数)
### 4. 事务保证原子性 ⭐
- 接受好友请求3步操作在一个事务中
- 删除好友2步操作在一个事务中
- 确保数据一致性
### 5. 跨服务调用 ⭐
- 通过 Dubbo RPC 调用 userService
- 批量查询避免 N+1 问题
- 完善的错误处理
---
## ✅ 下一步工作
设计方案已全部确认,可以开始实现了!
**实现顺序**(按照设计文档的实现步骤):
### 阶段 1数据层
1. 创建 `Friendship``FriendRequest` 模型
2. 实现 `FriendRepository` 接口
3. 创建数据库迁移脚本
4. 添加所有索引
### 阶段 2服务层
1. 定义 Proto 文件
2. 实现所有 Service 方法
3. 创建 userService RPC 客户端
4. 创建 friendService 主程序
### 阶段 3网关层
1. 创建 DTO 和转换器
2. 实现 Controller
3. 配置路由
### 阶段 4测试与优化
1. 单元测试
2. 集成测试
3. 性能测试
---
## 📚 相关文档
1. **完整设计方案**`backend/docs/好友功能设计方案.md`
2. **决策汇总**`backend/docs/好友功能设计决策汇总.md`
3. **配置文件**`backend/services/friendService/config/friend_config.go`
---
**确认人**:用户
**确认日期**2026-01-06
**状态**:✅ 已确认,可以开始实现