diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java index c967166..22d879d 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; @@ -51,11 +52,25 @@ public class ImGroupMemberController { @GetMapping("/get") @Operation(summary = "获得群成员") - @Parameter(name = "id", description = "编号", required = true, example = "1024") + @Parameters({ + @Parameter(name = "id", description = "编号(与 groupId + userId 二选一)", example = "1024"), + @Parameter(name = "groupId", description = "群编号(与 userId 配合查)", example = "1"), + @Parameter(name = "userId", description = "用户编号(与 groupId 配合查)", example = "100") + }) @PreAuthorize("@ss.hasPermission('im:group-member:query')") - public CommonResult getGroupMember(@RequestParam("id") Long id) { - ImGroupMemberDO groupMember = groupMemberService.getGroupMember(id); - return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class)); + public CommonResult getGroupMember(@RequestParam(value = "id", required = false) Long id, + @RequestParam(value = "groupId", required = false) Long groupId, + @RequestParam(value = "userId", required = false) Long userId) { + ImGroupMemberDO member; + if (id != null) { + member = groupMemberService.getGroupMember(id); + } else if (groupId != null && userId != null) { + member = groupMemberService.getGroupMember(groupId, userId); + } else { + // 避免 selectByGroupIdAndUserId 收到 null 参数走全表扫 / 抛 SQL 异常 + throw new IllegalArgumentException("参数缺失:需传 id 或 (groupId, userId)"); + } + return success(BeanUtils.toBean(member, ImGroupMemberRespVO.class)); } @GetMapping("/list") @@ -67,8 +82,8 @@ public class ImGroupMemberController { List members = groupMemberService.getGroupMemberListByGroupId(groupId); // 1.2 校验当前登录用户是否为群的有效成员,非成员不可查看 Long loginUserId = getLoginUserId(); - if (CollUtil.findOne(members, m -> loginUserId.equals(m.getUserId()) - && CommonStatusEnum.ENABLE.getStatus().equals(m.getStatus())) == null) { + if (CollUtil.findOne(members, member -> loginUserId.equals(member.getUserId()) + && CommonStatusEnum.ENABLE.getStatus().equals(member.getStatus())) == null) { throw exception(GROUP_MEMBER_NOT_IN_GROUP); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerBanReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerBanReqVO.java new file mode 100644 index 0000000..a4fb819 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerBanReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Schema(description = "管理后台 - IM 群聊封禁 Request VO") +@Data +public class ImGroupManagerBanReqVO { + + @Schema(description = "群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "群编号不能为空") + private Long id; + + @Schema(description = "封禁原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "违规内容") + @NotBlank(message = "封禁原因不能为空") + @Size(max = 200, message = "封禁原因长度不能超过 200") + private String reason; + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerPageReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerPageReqVO.java new file mode 100644 index 0000000..1efdc15 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerPageReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - IM 群聊分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class ImGroupManagerPageReqVO extends PageParam { + + @Schema(description = "群名称,模糊匹配", example = "技术交流群") + private String name; + + @Schema(description = "群主用户编号", example = "1024") + private Long ownerUserId; + + @Schema(description = "群状态,参见 CommonStatusEnum 枚举类(0 正常 / 1 已解散)", example = "0") + private Integer status; + + @Schema(description = "是否封禁", example = "false") + private Boolean banned; + + // TODO DONE @AI:这个不太对,参考别的模块 + @Schema(description = "创建时间", example = "[2026-04-01 00:00:00, 2026-04-30 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerRespVO.java new file mode 100644 index 0000000..22649fd --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerRespVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - IM 群聊 Response VO") +@Data +public class ImGroupManagerRespVO { + + @Schema(description = "群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "群名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "技术交流群") + private String name; + + @Schema(description = "群头像") + private String avatar; + + @Schema(description = "群公告") + private String notice; + + @Schema(description = "群主用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long ownerUserId; + + @Schema(description = "群主昵称", example = "张三") + private String ownerNickname; + + @Schema(description = "群成员数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") + private Integer memberCount; + + @Schema(description = "群状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer status; // 参见 CommonStatusEnum 枚举类 + + @Schema(description = "解散时间") + private LocalDateTime dissolvedTime; + + @Schema(description = "是否封禁", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean banned; + + @Schema(description = "封禁原因") + private String bannedReason; + + @Schema(description = "封禁时间") + private LocalDateTime bannedTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} 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 new file mode 100644 index 0000000..3c93ca2 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo.member; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - IM 群成员 Response VO") +@Data +public class ImGroupMemberManagerRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long userId; + + @Schema(description = "用户昵称", example = "张三") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + + @Schema(description = "入群时间") + private LocalDateTime joinTime; + +}