Commit d0fbab8f7334bd4cd4e148dbe88236a2a0c72cfb

Authored by YunaiV
1 parent 96f2d1a1

✨ feat(im): 完善 friend、group 相关的本地存储(疯狂优化)

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;
13 13 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
14 14 import io.swagger.v3.oas.annotations.Operation;
15 15 import io.swagger.v3.oas.annotations.Parameter;
  16 +import io.swagger.v3.oas.annotations.Parameters;
16 17 import io.swagger.v3.oas.annotations.tags.Tag;
17 18 import jakarta.annotation.Resource;
18 19 import jakarta.validation.Valid;
... ... @@ -51,11 +52,25 @@ public class ImGroupMemberController {
51 52  
52 53 @GetMapping("/get")
53 54 @Operation(summary = "获得群成员")
54   - @Parameter(name = "id", description = "编号", required = true, example = "1024")
  55 + @Parameters({
  56 + @Parameter(name = "id", description = "编号(与 groupId + userId 二选一)", example = "1024"),
  57 + @Parameter(name = "groupId", description = "群编号(与 userId 配合查)", example = "1"),
  58 + @Parameter(name = "userId", description = "用户编号(与 groupId 配合查)", example = "100")
  59 + })
55 60 @PreAuthorize("@ss.hasPermission('im:group-member:query')")
56   - public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam("id") Long id) {
57   - ImGroupMemberDO groupMember = groupMemberService.getGroupMember(id);
58   - return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class));
  61 + public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam(value = "id", required = false) Long id,
  62 + @RequestParam(value = "groupId", required = false) Long groupId,
  63 + @RequestParam(value = "userId", required = false) Long userId) {
  64 + ImGroupMemberDO member;
  65 + if (id != null) {
  66 + member = groupMemberService.getGroupMember(id);
  67 + } else if (groupId != null && userId != null) {
  68 + member = groupMemberService.getGroupMember(groupId, userId);
  69 + } else {
  70 + // 避免 selectByGroupIdAndUserId 收到 null 参数走全表扫 / 抛 SQL 异常
  71 + throw new IllegalArgumentException("参数缺失:需传 id 或 (groupId, userId)");
  72 + }
  73 + return success(BeanUtils.toBean(member, ImGroupMemberRespVO.class));
59 74 }
60 75  
61 76 @GetMapping("/list")
... ... @@ -67,8 +82,8 @@ public class ImGroupMemberController {
67 82 List<ImGroupMemberDO> members = groupMemberService.getGroupMemberListByGroupId(groupId);
68 83 // 1.2 校验当前登录用户是否为群的有效成员,非成员不可查看
69 84 Long loginUserId = getLoginUserId();
70   - if (CollUtil.findOne(members, m -> loginUserId.equals(m.getUserId())
71   - && CommonStatusEnum.ENABLE.getStatus().equals(m.getStatus())) == null) {
  85 + if (CollUtil.findOne(members, member -> loginUserId.equals(member.getUserId())
  86 + && CommonStatusEnum.ENABLE.getStatus().equals(member.getStatus())) == null) {
72 87 throw exception(GROUP_MEMBER_NOT_IN_GROUP);
73 88 }
74 89  
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerBanReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotBlank;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import jakarta.validation.constraints.Size;
  7 +import lombok.Data;
  8 +
  9 +@Schema(description = "管理后台 - IM 群聊封禁 Request VO")
  10 +@Data
  11 +public class ImGroupManagerBanReqVO {
  12 +
  13 + @Schema(description = "群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  14 + @NotNull(message = "群编号不能为空")
  15 + private Long id;
  16 +
  17 + @Schema(description = "封禁原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "违规内容")
  18 + @NotBlank(message = "封禁原因不能为空")
  19 + @Size(max = 200, message = "封禁原因长度不能超过 200")
  20 + private String reason;
  21 +
  22 +}
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import java.time.LocalDateTime;
  10 +
  11 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  12 +
  13 +@Schema(description = "管理后台 - IM 群聊分页 Request VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class ImGroupManagerPageReqVO extends PageParam {
  17 +
  18 + @Schema(description = "群名称,模糊匹配", example = "技术交流群")
  19 + private String name;
  20 +
  21 + @Schema(description = "群主用户编号", example = "1024")
  22 + private Long ownerUserId;
  23 +
  24 + @Schema(description = "群状态,参见 CommonStatusEnum 枚举类(0 正常 / 1 已解散)", example = "0")
  25 + private Integer status;
  26 +
  27 + @Schema(description = "是否封禁", example = "false")
  28 + private Boolean banned;
  29 +
  30 + // TODO DONE @AI:这个不太对,参考别的模块
  31 + @Schema(description = "创建时间", example = "[2026-04-01 00:00:00, 2026-04-30 23:59:59]")
  32 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  33 + private LocalDateTime[] createTime;
  34 +
  35 +}
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/ImGroupManagerRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - IM 群聊 Response VO")
  9 +@Data
  10 +public class ImGroupManagerRespVO {
  11 +
  12 + @Schema(description = "群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  13 + private Long id;
  14 +
  15 + @Schema(description = "群名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "技术交流群")
  16 + private String name;
  17 +
  18 + @Schema(description = "群头像")
  19 + private String avatar;
  20 +
  21 + @Schema(description = "群公告")
  22 + private String notice;
  23 +
  24 + @Schema(description = "群主用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  25 + private Long ownerUserId;
  26 +
  27 + @Schema(description = "群主昵称", example = "张三")
  28 + private String ownerNickname;
  29 +
  30 + @Schema(description = "群成员数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
  31 + private Integer memberCount;
  32 +
  33 + @Schema(description = "群状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  34 + private Integer status; // 参见 CommonStatusEnum 枚举类
  35 +
  36 + @Schema(description = "解散时间")
  37 + private LocalDateTime dissolvedTime;
  38 +
  39 + @Schema(description = "是否封禁", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  40 + private Boolean banned;
  41 +
  42 + @Schema(description = "封禁原因")
  43 + private String bannedReason;
  44 +
  45 + @Schema(description = "封禁时间")
  46 + private LocalDateTime bannedTime;
  47 +
  48 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  49 + private LocalDateTime createTime;
  50 +
  51 +}
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.im.controller.admin.manager.group.vo.member;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - IM 群成员 Response VO")
  9 +@Data
  10 +public class ImGroupMemberManagerRespVO {
  11 +
  12 + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  13 + private Long userId;
  14 +
  15 + @Schema(description = "用户昵称", example = "张三")
  16 + private String nickname;
  17 +
  18 + @Schema(description = "用户头像")
  19 + private String avatar;
  20 +
  21 + @Schema(description = "入群时间")
  22 + private LocalDateTime joinTime;
  23 +
  24 +}
... ...