diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java index af509b8..2e17b51 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java @@ -21,7 +21,7 @@ public class ImFriendRespVO { private Long friendUserId; @Schema(description = "是否免打扰", example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "好友展示备注(仅自己可见)", example = "老张") private String displayName; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java index f48266b..8eee96f 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java @@ -14,7 +14,7 @@ public class ImFriendUpdateReqVO { private Long friendUserId; @Schema(description = "是否免打扰;不传表示不修改", example = "true") - private Boolean muted; + private Boolean silent; @Schema(description = "好友展示备注(仅自己可见);不传表示不修改,传空串表示清空", example = "老张") @Size(max = 16, message = "好友备注最多 16 个字符") diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java index 087bf6c..9aee3c4 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java @@ -25,7 +25,7 @@ public class ImGroupMemberRespVO { private String groupRemark; @Schema(description = "是否免打扰") - private Boolean muted; + private Boolean silent; @Schema(description = "成员状态", example = "0") private Integer status; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java index 62c34fe..8c2c6fd 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java @@ -21,6 +21,6 @@ public class ImGroupMemberUpdateReqVO { private String groupRemark; @Schema(description = "是否免打扰") - private Boolean muted; + private Boolean silent; } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java index d31517e..54b5dcc 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java @@ -25,7 +25,7 @@ public class ImFriendManagerPageReqVO extends PageParam { private Integer status; // 参见 CommonStatusEnum 枚举类 @Schema(description = "是否免打扰", example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "添加好友时间", example = "[2026-04-01 00:00:00, 2026-04-30 23:59:59]") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java index 270b326..1b21920 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java @@ -28,7 +28,7 @@ public class ImFriendManagerRespVO { private String displayName; @Schema(description = "是否免打扰", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "好友状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") private Integer status; // 参见 CommonStatusEnum 枚举类 diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java index 5a6f56a..e564f1d 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java @@ -25,7 +25,7 @@ public class ImGroupMemberManagerRespVO { private String groupRemark; @Schema(description = "是否免打扰", example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "成员状态", example = "0") private Integer status; // 参见 CommonStatusEnum 枚举类 diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java index 8832ebe..db9543a 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java @@ -15,7 +15,7 @@ import java.time.LocalDateTime; * 业务语义: * - 双向关系:A-B 互为好友会存 2 条记录(userId=A, friendUserId=B 和 userId=B, friendUserId=A) * - 状态管理:{@link #status} 使用 {@link CommonStatusEnum},ENABLE=正常,DISABLE=已删除 - * - 免打扰:{@link #muted} 控制是否屏蔽来自该好友的通知 + * - 免打扰:{@link #silent} 控制是否屏蔽来自该好友的通知 * - 联系人置顶:{@link #pinned} 单边,影响联系人 / 会话排序 * - 黑名单:{@link #blocked} 弱关联 friend,单边屏蔽对方消息(必须先是好友) * @@ -51,7 +51,7 @@ public class ImFriendDO extends BaseDO { /** * 是否免打扰 */ - private Boolean muted; + private Boolean silent; /** * 好友展示备注 */ diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java index 7af3412..dd8816f 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java @@ -53,7 +53,7 @@ public class ImGroupMemberDO extends BaseDO { /** * 是否免打扰 */ - private Boolean muted; + private Boolean silent; /** * 成员状态 *
diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java
index 4714cc1..6268fb3 100644
--- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java
+++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java
@@ -50,7 +50,7 @@ public interface ImFriendMapper extends BaseMapperX
+ * 各子模块用嵌套 inner class 区分(friend / 后续 group / sensitive 等),
+ * yaml 路径保持 yudao.im.{module}.{key} 与原有部署保持兼容
+ *
+ * @author 芋道源码
+ */
+@Component
+@ConfigurationProperties(prefix = "yudao.im")
+@Data
+public class ImProperties {
+
+ private Friend friend = new Friend();
+
+ /**
+ * 好友模块配置
+ */
+ @Data
+ public static class Friend {
+
+ /**
+ * 是否自动通过所有好友申请(全局开关)
+ *
+ * 默认 false,普通用户必须走申请-审批流程;开启后所有用户的好友申请会立即同意,主要用于全员开放型 IM 部署。
+ * 如需细化到「仅特定用户自动通过」(如机器人 / AI 账号),请在 system 用户表加字段,并在 applyFriend 内按用户级开关短路
+ */
+ private boolean autoAccept = false;
+
+ }
+
+}
diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java
index f6edef8..c47ad40 100644
--- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java
+++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java
@@ -95,7 +95,7 @@ public class ImFriendServiceImpl implements ImFriendService {
@Override
public void updateFriend(Long userId, ImFriendUpdateReqVO reqVO) {
// 1.1 校验:至少改一个字段(无字段变更,直接结束)
- if (reqVO.getDisplayName() == null && reqVO.getMuted() == null && reqVO.getPinned() == null) {
+ if (reqVO.getDisplayName() == null && reqVO.getSilent() == null && reqVO.getPinned() == null) {
return;
}
// 1.2 校验好友关系存在
@@ -106,13 +106,11 @@ public class ImFriendServiceImpl implements ImFriendService {
// 2. 更新好友属性(备注 / 免打扰 / 联系人置顶)
friendMapper.updateById(new ImFriendDO().setId(friend.getId())
- .setMuted(reqVO.getMuted())
- .setDisplayName(reqVO.getDisplayName())
- .setPinned(reqVO.getPinned()));
+ .setSilent(reqVO.getSilent()).setDisplayName(reqVO.getDisplayName()).setPinned(reqVO.getPinned()));
// 3. 推 FRIEND_UPDATE 给 A 多端:所有单边属性变更合并为单条通知,避免多通知顺序竞争
FriendUpdateNotification payload = (FriendUpdateNotification) new FriendUpdateNotification()
- .setDisplayName(reqVO.getDisplayName()).setMuted(reqVO.getMuted()).setPinned(reqVO.getPinned())
+ .setDisplayName(reqVO.getDisplayName()).setSilent(reqVO.getSilent()).setPinned(reqVO.getPinned())
.setOperatorUserId(userId).setFriendUserId(reqVO.getFriendUserId());
websocketService.sendPrivateMessageAsync(userId, ImPrivateMessageDTO.ofFriendNotification(
ImMessageTypeEnum.FRIEND_UPDATE.getType(), userId, userId, payload));
@@ -245,7 +243,7 @@ public class ImFriendServiceImpl implements ImFriendService {
/**
* 单向绑定好友关系(内部方法,被 {@link #becomeFriends} / {@link #silentReAddFriend} 调用):
- * - 情况一:已存在记录(含 ENABLE / DISABLE)→ 复用并恢复 ENABLE,muted / pinned / blocked 一并重置为 false
+ * - 情况一:已存在记录(含 ENABLE / DISABLE)→ 复用并恢复 ENABLE,silent / pinned / blocked 一并重置为 false
* - 情况二:不存在记录 → 直接插入新记录
*
* 并发安全:agree 路径由 {@code friend_request.handle_result} 的乐观锁单边推进;
@@ -255,11 +253,11 @@ public class ImFriendServiceImpl implements ImFriendService {
*/
public void addFriend0(Long userId, Long friendUserId, String displayName, Integer addSource) {
ImFriendDO exists = friendMapper.selectByUserIdAndFriendUserId(userId, friendUserId);
- // 情况一:复用旧记录 → 恢复 ENABLE + 重置 muted / pinned / blocked 与首次新增对齐
+ // 情况一:复用旧记录 → 恢复 ENABLE + 重置 silent / pinned / blocked 与首次新增对齐
if (exists != null) {
ImFriendDO update = new ImFriendDO().setId(exists.getId())
.setStatus(CommonStatusEnum.ENABLE.getStatus()).setAddTime(LocalDateTime.now())
- .setMuted(false).setPinned(false).setBlocked(false);
+ .setSilent(false).setPinned(false).setBlocked(false);
if (displayName != null) {
update.setDisplayName(displayName);
}
@@ -271,7 +269,7 @@ public class ImFriendServiceImpl implements ImFriendService {
}
// 情况二:不存在记录 → 直接插入新记录
ImFriendDO friend = ImFriendDO.builder().userId(userId).friendUserId(friendUserId)
- .muted(false).pinned(false).blocked(false)
+ .silent(false).pinned(false).blocked(false)
.displayName(displayName).addSource(addSource)
.status(CommonStatusEnum.ENABLE.getStatus()).addTime(LocalDateTime.now()).build();
friendMapper.insert(friend);
diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java
index b1ef7ca..8320ea5 100644
--- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java
+++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java
@@ -222,14 +222,14 @@ public class ImGroupMemberServiceImpl implements ImGroupMemberService {
groupMessageService.sendGroupMessage(userId, ImGroupMessageSendDTO.ofGroupMemberNicknameUpdate(
groupId, userId, updateReqVO.getDisplayUserName()));
}
- // 3.2 muted / groupRemark 是个人字段,仅推自己做多端同步;与旧值都相同跳过
- boolean mutedChanged = updateReqVO.getMuted() != null
- && ObjUtil.notEqual(updateReqVO.getMuted(), member.getMuted());
+ // 3.2 silent / groupRemark 是个人字段,仅推自己做多端同步;与旧值都相同跳过
+ boolean silentChanged = updateReqVO.getSilent() != null
+ && ObjUtil.notEqual(updateReqVO.getSilent(), member.getSilent());
boolean groupRemarkChanged = updateReqVO.getGroupRemark() != null
&& ObjUtil.notEqual(updateReqVO.getGroupRemark(), member.getGroupRemark());
- if (mutedChanged || groupRemarkChanged) {
+ if (silentChanged || groupRemarkChanged) {
groupMessageService.sendGroupMessage(userId, List.of(userId), ImGroupMessageSendDTO.ofGroupMemberSettingUpdate(
- groupId, userId, updateReqVO.getMuted(), updateReqVO.getGroupRemark()));
+ groupId, userId, updateReqVO.getSilent(), updateReqVO.getGroupRemark()));
}
}
diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java
index 1403d51..d4f28db 100644
--- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java
+++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java
@@ -136,8 +136,7 @@ public class ImGroupMessageSendDTO {
public static ImGroupMessageSendDTO ofGroupNoticeUpdate(Long groupId, Long operatorUserId, String oldNotice, String newNotice) {
GroupNoticeUpdateNotification notification = new GroupNoticeUpdateNotification();
notification.setOperatorUserId(operatorUserId);
- notification.setOldNotice(oldNotice);
- notification.setNewNotice(newNotice);
+ notification.setOldNotice(oldNotice).setNewNotice(newNotice);
return new ImGroupMessageSendDTO().setGroupId(groupId)
.setType(ImMessageTypeEnum.GROUP_NOTICE_UPDATE.getType()).setContent(notification);
}
@@ -145,17 +144,15 @@ public class ImGroupMessageSendDTO {
public static ImGroupMessageSendDTO ofGroupNameUpdate(Long groupId, Long operatorUserId, String oldName, String newName) {
GroupNameUpdateNotification notification = new GroupNameUpdateNotification();
notification.setOperatorUserId(operatorUserId);
- notification.setOldName(oldName);
- notification.setNewName(newName);
+ notification.setOldName(oldName).setNewName(newName);
return new ImGroupMessageSendDTO().setGroupId(groupId)
.setType(ImMessageTypeEnum.GROUP_NAME_UPDATE.getType()).setContent(notification);
}
- public static ImGroupMessageSendDTO ofGroupMemberSettingUpdate(Long groupId, Long operatorUserId, Boolean muted, String groupRemark) {
+ public static ImGroupMessageSendDTO ofGroupMemberSettingUpdate(Long groupId, Long operatorUserId, Boolean silent, String groupRemark) {
GroupMemberSettingUpdateNotification notification = new GroupMemberSettingUpdateNotification();
notification.setOperatorUserId(operatorUserId);
- notification.setMuted(muted);
- notification.setGroupRemark(groupRemark);
+ notification.setSilent(silent).setGroupRemark(groupRemark);
return new ImGroupMessageSendDTO().setGroupId(groupId)
.setType(ImMessageTypeEnum.GROUP_MEMBER_SETTING_UPDATE.getType()).setContent(notification);
}
@@ -164,8 +161,7 @@ public class ImGroupMessageSendDTO {
cn.iocoder.yudao.module.im.dal.dataobject.message.ImGroupMessageDO message) {
GroupMessagePinNotification notification = new GroupMessagePinNotification();
notification.setOperatorUserId(operatorUserId);
- notification.setMessageId(message.getId());
- notification.setMessage(message);
+ notification.setMessageId(message.getId()).setMessage(message);
return new ImGroupMessageSendDTO().setGroupId(groupId)
.setType(ImMessageTypeEnum.GROUP_MESSAGE_PIN.getType()).setContent(notification);
}
diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java
index 24cf533..a1a52d6 100644
--- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java
+++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java
@@ -18,7 +18,7 @@ public class FriendUpdateNotification extends BaseFriendNotification {
/**
* 免打扰;不为空则更新
*/
- private Boolean muted;
+ private Boolean silent;
/**
* 联系人置顶;不为空则更新
*/
diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java
index 949be97..e7eefcb 100644
--- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java
+++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java
@@ -5,7 +5,7 @@ import lombok.Data;
/**
* 群成员个人设置变更事件通知(个人多端同步)
*
- * muted / groupRemark 字段 null 表示本次未变更,前端按非 null 局部更新
+ * silent / groupRemark 字段 null 表示本次未变更,前端按非 null 局部更新
*/
@Data
public class GroupMemberSettingUpdateNotification extends BaseGroupNotification {
@@ -13,7 +13,7 @@ public class GroupMemberSettingUpdateNotification extends BaseGroupNotification
/**
* 群免打扰
*/
- private Boolean muted;
+ private Boolean silent;
/**
* 群备注
*/
diff --git a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java
index ee95561..9edeedd 100644
--- a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java
+++ b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java
@@ -81,19 +81,19 @@ public class ImFriendServiceImplTest extends BaseMockitoUnitTest {
// 准备
ImFriendUpdateReqVO reqVO = new ImFriendUpdateReqVO();
reqVO.setFriendUserId(2L);
- reqVO.setMuted(true);
+ reqVO.setSilent(true);
ImFriendDO friend = ImFriendDO.builder().id(100L).userId(1L).friendUserId(2L)
- .muted(false).status(CommonStatusEnum.ENABLE.getStatus()).build();
+ .silent(false).status(CommonStatusEnum.ENABLE.getStatus()).build();
when(imFriendMapper.selectByUserIdAndFriendUserId(1L, 2L)).thenReturn(friend);
// 调用
friendService.updateFriend(1L, reqVO);
- // 断言:更新了 muted 字段
+ // 断言:更新了 silent 字段
ArgumentCaptor