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

This commit is contained in:
YunaiV
2026-04-29 22:03:55 +08:00
parent 96f2d1a12f
commit d0fbab8f73
5 changed files with 153 additions and 6 deletions

View File

@ -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<ImGroupMemberRespVO> getGroupMember(@RequestParam("id") Long id) {
ImGroupMemberDO groupMember = groupMemberService.getGroupMember(id);
return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class));
public CommonResult<ImGroupMemberRespVO> 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<ImGroupMemberDO> 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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}