232 lines
6.1 KiB
Markdown
232 lines
6.1 KiB
Markdown
# 好友功能设计确认总结
|
||
|
||
> **日期**: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
|
||
**状态**:✅ 已确认,可以开始实现
|
||
|