好友关系、好友申请
这篇解决什么
互加好友怎么存两行、申请状态机怎么走。读完能对上 im_friend / im_friend_request,以及 yudao.im.friend.auto-accept。
默认端口 48080。先开模块见 IM 功能设计。
示意图:默认要对方同意。自动通过打开后,申请会立刻落成好友。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| C 端好友 | @RequestMapping("/im/friend") | ruoyi-office/yudao-module-im/.../friend/ImFriendController.java |
| C 端申请 | /im/friend-request | ImFriendRequestController |
| 运营关系 | /im/manager/friend | ImFriendManagerController |
| 运营申请 | /im/manager/friend-request | ImFriendRequestManagerController |
| 关系表 | im_friend | ImFriendDO |
| 申请表 | im_friend_request | ImFriendRequestDO |
用户页:views/im/home/pages/contact/、friend-add-dialog.vue。运营页:views/im/manager/friend/。
申请:POST /apply,PUT /agree,PUT /refuse。列表 GET /list(maxId 游标),离线补偿 GET /pull。
A、B 互为好友存两行:(userId=A, friendUserId=B) 和反过来。silent / pinned / blocked 都是单边。拉黑必须先是好友。status 用 CommonStatusEnum:0 正常,1 已删除(同时写 deleteTime)。
ImFriendRequestHandleResultEnum:0 未处理,1 同意,2 拒绝。同意后发起方 displayName、addSource 写入 A 侧好友行,B 侧备注不动。
ImFriendAddSourceEnum:1 搜索,2 群聊,3 扫码,4 名片。当前入口主要是搜索和群成员主页;扫码 / 名片枚举已占位。
yudao.im.friend.auto-accept 默认 false。打开后所有申请立即同意,适合全员开放部署。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
userId / friendUserId | 关系两端 | ImFriendDO |
displayName / addSource | 备注、来源 | 同上 |
silent / pinned / blocked | 免打扰、置顶、拉黑 | 同上 |
fromUserId / toUserId | 申请双方 | ImFriendRequestDO |
applyContent / handleResult | 理由、结果 | 同上 |
删好友不是物理删行
status=1 且写 deleteTime。不要按「查不到行」判断从未加过。
自动通过是全局开关
没有按用户的机器人字段。要只放行部分账号,得在 applyFriend 里自己加短路,配置类注释也是这么写的。
按本仓库 DO 生成的 ER。通过后才出现两行好友。
配置与操作
用户页在 views/im/home/pages/contact/,申请 POST /im/friend-request/apply,对方 PUT /agree 或 /refuse。运营看 views/im/manager/friend/。互为好友存两行。silent / pinned / blocked 都是单边。YAML yudao.im.friend.auto-accept 默认 false,打开后所有申请立即同意。
保存后同意侧写入 im_friend。删好友是 status=1 并写 deleteTime,不是物理删行。拉黑必须先是好友。没有按用户的自动通过字段。运营台账在 好友列表(7520,/im/private/friend)。开启见 IM 功能设计。

本系统截图:IM 即时通讯 → 私聊管理 → 好友列表。互加两行落 im_friend。
