6.1 KiB
6.1 KiB
好友功能设计确认总结
日期:2026-01-06
状态:✅ 所有问题已确认,设计方案已完成
📝 问题与答案汇总
问题 1:好友数量限制
答案:后续会引入规则表进行动态限制好友个数,目前暂不考虑
实现:
- 在
friend_config.go中预留了FriendLimitConfig结构体 Enabled = false(默认不启用)- 后续可通过规则表根据用户等级、会员状态等动态配置
问题 2:重复请求冷却期
答案:7天可以再次发送,并且30天的过期时间、7天这类的时间限制目前需要放在一个地方统一配置、以便后续有可能会直接迁移到规则表的情况
实现:
- ✅ 创建了
backend/services/friendService/config/friend_config.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个索引):
uk_friendships_user_friend_star- 唯一索引(防重复)idx_friendships_user_star_status- 基础查询索引idx_friendships_user_star_created- 时间排序索引idx_friendships_list_query- 覆盖索引(避免回表)
friend_requests 表(5个索引):
idx_friend_requests_to_status- 收到的请求查询idx_friend_requests_from_status- 发出的请求查询idx_friend_requests_star- 明星筛选idx_friend_requests_expires- 过期扫描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:数据层
- 创建
Friendship和FriendRequest模型 - 实现
FriendRepository接口 - 创建数据库迁移脚本
- 添加所有索引
阶段 2:服务层
- 定义 Proto 文件
- 实现所有 Service 方法
- 创建 userService RPC 客户端
- 创建 friendService 主程序
阶段 3:网关层
- 创建 DTO 和转换器
- 实现 Controller
- 配置路由
阶段 4:测试与优化
- 单元测试
- 集成测试
- 性能测试
📚 相关文档
- 完整设计方案:
backend/docs/好友功能设计方案.md - 决策汇总:
backend/docs/好友功能设计决策汇总.md - 配置文件:
backend/services/friendService/config/friend_config.go
确认人:用户
确认日期:2026-01-06
状态:✅ 已确认,可以开始实现