From bed0a463f51168f11227864d98174969dd31fff9 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 6 May 2026 20:50:56 +0800 Subject: [PATCH] ✨ feat(im): 初始化表情包 v0.1:第二把 review --- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFacePackController.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFaceUserItemController.java | 17 ++++------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFacePackUserRespVO.java | 46 ---------------------------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemRespVO.java | 26 -------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemSaveReqVO.java | 34 ---------------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/pack/ImFacePackUserRespVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemRespVO.java | 26 ++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemSaveReqVO.java | 34 ++++++++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackItemManagerController.java | 6 +++--- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackManagerController.java | 6 +++--- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemPageReqVO.java | 23 ----------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemRespVO.java | 40 ---------------------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemSaveReqVO.java | 46 ---------------------------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackPageReqVO.java | 28 ---------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackRespVO.java | 30 ------------------------------ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackSaveReqVO.java | 33 --------------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemPageReqVO.java | 23 +++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemRespVO.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemSaveReqVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackPageReqVO.java | 28 ++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackRespVO.java | 30 ++++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackSaveReqVO.java | 33 +++++++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackItemMapper.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackMapper.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemService.java | 16 ++++++++++++++-- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemServiceImpl.java | 34 ++++++++++++++++++++++++---------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackService.java | 4 ++-- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackServiceImpl.java | 25 ++++++++++++++----------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemService.java | 17 ++++++----------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemServiceImpl.java | 62 +++++++++++++++++++++----------------------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/FaceMessage.java | 7 +++---- 31 files changed, 403 insertions(+), 409 deletions(-) delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFacePackUserRespVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemRespVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemSaveReqVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/pack/ImFacePackUserRespVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemRespVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemSaveReqVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemPageReqVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemRespVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemSaveReqVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackPageReqVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackRespVO.java delete mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackSaveReqVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemPageReqVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemRespVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemSaveReqVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackPageReqVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackRespVO.java create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackSaveReqVO.java diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFacePackController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFacePackController.java index 1e9dbb4..ea90824 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFacePackController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFacePackController.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.controller.admin.face; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.face.vo.ImFacePackUserRespVO; +import cn.iocoder.yudao.module.im.controller.admin.face.vo.pack.ImFacePackUserRespVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackDO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackItemDO; import cn.iocoder.yudao.module.im.service.face.ImFacePackItemService; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFaceUserItemController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFaceUserItemController.java index 612609d..c070983 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFaceUserItemController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/ImFaceUserItemController.java @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.im.controller.admin.face; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.face.vo.ImFaceUserItemRespVO; -import cn.iocoder.yudao.module.im.controller.admin.face.vo.ImFaceUserItemSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.face.vo.userItem.ImFaceUserItemRespVO; +import cn.iocoder.yudao.module.im.controller.admin.face.vo.userItem.ImFaceUserItemSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFaceUserItemDO; import cn.iocoder.yudao.module.im.service.face.ImFaceUserItemService; import io.swagger.v3.oas.annotations.Operation; @@ -30,8 +30,8 @@ public class ImFaceUserItemController { @GetMapping("/list") @Operation(summary = "获得我的个人表情列表") - public CommonResult> getMyFaceUserItemList() { - List items = faceUserItemService.getMyFaceUserItemList(getLoginUserId()); + public CommonResult> getFaceUserItemList() { + List items = faceUserItemService.getFaceUserItemList(getLoginUserId()); return success(BeanUtils.toBean(items, ImFaceUserItemRespVO.class)); } @@ -49,13 +49,4 @@ public class ImFaceUserItemController { return success(true); } - // TODO @AI:个人应该没批量删除把?应该就一个一个删除呢。 - @DeleteMapping("/delete-list") - @Operation(summary = "批量删除个人表情") - @Parameter(name = "ids", description = "编号列表", required = true) - public CommonResult deleteFaceUserItemList(@RequestParam("ids") List ids) { - faceUserItemService.deleteFaceUserItemList(getLoginUserId(), ids); - return success(true); - } - } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFacePackUserRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFacePackUserRespVO.java deleted file mode 100644 index 30bca68..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFacePackUserRespVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.face.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "IM 表情包(用户端) Response VO") -@Data -public class ImFacePackUserRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "表情包名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "猫主子") - private String name; - - @Schema(description = "表情包图标 URL", example = "https://cdn.example.com/face/pack/cat.png") - private String iconUrl; - - @Schema(description = "表情列表", requiredMode = Schema.RequiredMode.REQUIRED) - private List items; - - @Schema(description = "IM 表情包项(用户端)") - @Data - public static class Item { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long id; - - @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, - example = "https://cdn.example.com/face/pack/cat-001.png") - private String url; - - @Schema(description = "表情名", example = "狗头") - private String name; - - @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer width; - - @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer height; - - } - -} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemRespVO.java deleted file mode 100644 index 0357f8c..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.face.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "IM 个人表情 Response VO") -@Data -public class ImFaceUserItemRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") - private Long id; - - @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, - example = "https://cdn.example.com/face/user/abc.gif") - private String url; - - @Schema(description = "表情名", example = "狗头") - private String name; - - @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer width; - - @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer height; - -} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemSaveReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemSaveReqVO.java deleted file mode 100644 index 0d5c9ec..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/ImFaceUserItemSaveReqVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.face.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 ImFaceUserItemSaveReqVO { - - @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, - example = "https://cdn.example.com/face/user/abc.gif") - @NotBlank(message = "表情图 URL 不能为空") - @Size(max = 512, message = "表情图 URL 长度不能超过 512") - private String url; - - @Schema(description = "表情名", example = "狗头") - @Size(max = 64, message = "表情名长度不能超过 64") - private String name; - - @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - @NotNull(message = "渲染宽度不能为空") - private Integer width; - - @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - @NotNull(message = "渲染高度不能为空") - private Integer height; - - @Schema(description = "来源消息编号(从消息「添加到表情」时传入;自己上传则不传)", example = "10086") - private Long sourceMessageId; - -} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/pack/ImFacePackUserRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/pack/ImFacePackUserRespVO.java new file mode 100644 index 0000000..40b2b36 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/pack/ImFacePackUserRespVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.im.controller.admin.face.vo.pack; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "IM 表情包(用户端) Response VO") +@Data +public class ImFacePackUserRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "表情包名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "猫主子") + private String name; + + @Schema(description = "表情包图标 URL", example = "https://cdn.example.com/face/pack/cat.png") + private String iconUrl; + + @Schema(description = "表情列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List items; + + @Schema(description = "IM 表情包项(用户端)") + @Data + public static class Item { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private Long id; + + @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, + example = "https://cdn.example.com/face/pack/cat-001.png") + private String url; + + @Schema(description = "表情名", example = "狗头") + private String name; + + @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + private Integer width; + + @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + private Integer height; + + } + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemRespVO.java new file mode 100644 index 0000000..b2a4846 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemRespVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.im.controller.admin.face.vo.userItem; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "IM 个人表情 Response VO") +@Data +public class ImFaceUserItemRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") + private Long id; + + @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, + example = "https://cdn.example.com/face/user/abc.gif") + private String url; + + @Schema(description = "表情名", example = "狗头") + private String name; + + @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + private Integer width; + + @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + private Integer height; + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemSaveReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemSaveReqVO.java new file mode 100644 index 0000000..c51eb4b --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/face/vo/userItem/ImFaceUserItemSaveReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.im.controller.admin.face.vo.userItem; + +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 ImFaceUserItemSaveReqVO { + + @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, + example = "https://cdn.example.com/face/user/abc.gif") + @NotBlank(message = "表情图 URL 不能为空") + @Size(max = 512, message = "表情图 URL 长度不能超过 512") + private String url; + + @Schema(description = "表情名", example = "狗头") + @Size(max = 64, message = "表情名长度不能超过 64") + private String name; + + @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @NotNull(message = "渲染宽度不能为空") + private Integer width; + + @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @NotNull(message = "渲染高度不能为空") + private Integer height; + + @Schema(description = "来源消息编号(从消息「添加到表情」时传入;自己上传则不传)", example = "10086") + private Long sourceMessageId; + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackItemManagerController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackItemManagerController.java index 637cd47..22b35be 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackItemManagerController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackItemManagerController.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.im.controller.admin.manager.face; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemRespVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemRespVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackItemDO; import cn.iocoder.yudao.module.im.service.face.ImFacePackItemService; import io.swagger.v3.oas.annotations.Operation; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackManagerController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackManagerController.java index 0fabe93..0179243 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackManagerController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/ImFacePackManagerController.java @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.im.controller.admin.manager.face; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackRespVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackRespVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackDO; import cn.iocoder.yudao.module.im.service.face.ImFacePackService; import io.swagger.v3.oas.annotations.Operation; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemPageReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemPageReqVO.java deleted file mode 100644 index 39fd7a6..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemPageReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -// TODO @AI:拆分到 vo/item 目录下,如果是 item 的话;更简练; -@Schema(description = "管理后台 - IM 表情包项分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class ImFacePackItemPageReqVO extends PageParam { - - @Schema(description = "所属表情包编号", example = "1024") - private Long packId; - - @Schema(description = "表情名,模糊匹配", example = "狗") - private String name; - - @Schema(description = "状态", example = "0") - private Integer status; // 参见 CommonStatusEnum 枚举类 - -} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemRespVO.java deleted file mode 100644 index 3ff0949..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemRespVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - IM 表情包项 Response VO") -@Data -public class ImFacePackItemRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long id; - - @Schema(description = "所属表情包编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long packId; - - @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, - example = "https://cdn.example.com/face/pack/cat-001.png") - private String url; - - @Schema(description = "表情名", example = "狗头") - private String name; - - @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer width; - - @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Integer height; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer sort; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer status; // 参见 CommonStatusEnum 枚举类 - - @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/face/vo/ImFacePackItemSaveReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemSaveReqVO.java deleted file mode 100644 index c8a2b9a..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackItemSaveReqVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.manager.face.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 ImFacePackItemSaveReqVO { - - @Schema(description = "编号(修改时必填)", example = "2048") - private Long id; - - @Schema(description = "所属表情包编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - @NotNull(message = "表情包编号不能为空") - private Long packId; - - @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, - example = "https://cdn.example.com/face/pack/cat-001.png") - @NotBlank(message = "表情图 URL 不能为空") - @Size(max = 512, message = "表情图 URL 长度不能超过 512") - private String url; - - @Schema(description = "表情名", example = "狗头") - @Size(max = 64, message = "表情名长度不能超过 64") - private String name; - - @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - @NotNull(message = "渲染宽度不能为空") - private Integer width; - - @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - @NotNull(message = "渲染高度不能为空") - private Integer height; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "排序不能为空") - private Integer sort; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "状态不能为空") - private Integer status; // 参见 CommonStatusEnum 枚举类(0 启用 / 1 禁用) - -} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackPageReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackPageReqVO.java deleted file mode 100644 index 13c63c2..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackPageReqVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.manager.face.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 ImFacePackPageReqVO extends PageParam { - - @Schema(description = "表情包名称,模糊匹配", example = "猫") - private String name; - - @Schema(description = "状态", example = "0") - private Integer status; // 参见 CommonStatusEnum 枚举类 - - @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/face/vo/ImFacePackRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackRespVO.java deleted file mode 100644 index 33bd208..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackRespVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - IM 表情包 Response VO") -@Data -public class ImFacePackRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "表情包名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "猫主子") - private String name; - - @Schema(description = "表情包图标 URL", example = "https://cdn.example.com/face/pack/cat.png") - private String iconUrl; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer sort; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Integer status; // 参见 CommonStatusEnum 枚举类 - - @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/face/vo/ImFacePackSaveReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackSaveReqVO.java deleted file mode 100644 index 915b89e..0000000 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/ImFacePackSaveReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.manager.face.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 ImFacePackSaveReqVO { - - @Schema(description = "编号(修改时必填)", example = "1024") - private Long id; - - @Schema(description = "表情包名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "猫主子") - @NotBlank(message = "表情包名称不能为空") - @Size(max = 64, message = "表情包名称长度不能超过 64") - private String name; - - @Schema(description = "表情包图标 URL", example = "https://cdn.example.com/face/pack/cat.png") - @Size(max = 512, message = "图标 URL 长度不能超过 512") - private String iconUrl; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "排序不能为空") - private Integer sort; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "状态不能为空") - private Integer status; // 参见 CommonStatusEnum 枚举类(0 启用 / 1 禁用) - -} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemPageReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemPageReqVO.java new file mode 100644 index 0000000..6b64242 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemPageReqVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +// TODO @AI:拆分到 vo/item 目录下,如果是 item 的话;更简练; +@Schema(description = "管理后台 - IM 表情包项分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class ImFacePackItemPageReqVO extends PageParam { + + @Schema(description = "所属表情包编号", example = "1024") + private Long packId; + + @Schema(description = "表情名,模糊匹配", example = "狗") + private String name; + + @Schema(description = "状态", example = "0") + private Integer status; // 参见 CommonStatusEnum 枚举类 + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemRespVO.java new file mode 100644 index 0000000..817348f --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemRespVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - IM 表情包项 Response VO") +@Data +public class ImFacePackItemRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private Long id; + + @Schema(description = "所属表情包编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long packId; + + @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, + example = "https://cdn.example.com/face/pack/cat-001.png") + private String url; + + @Schema(description = "表情名", example = "狗头") + private String name; + + @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + private Integer width; + + @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + private Integer height; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer sort; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer status; // 参见 CommonStatusEnum 枚举类 + + @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/face/vo/item/ImFacePackItemSaveReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemSaveReqVO.java new file mode 100644 index 0000000..4da316b --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/item/ImFacePackItemSaveReqVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item; + +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 ImFacePackItemSaveReqVO { + + @Schema(description = "编号(修改时必填)", example = "2048") + private Long id; + + @Schema(description = "所属表情包编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "表情包编号不能为空") + private Long packId; + + @Schema(description = "表情图 URL", requiredMode = Schema.RequiredMode.REQUIRED, + example = "https://cdn.example.com/face/pack/cat-001.png") + @NotBlank(message = "表情图 URL 不能为空") + @Size(max = 512, message = "表情图 URL 长度不能超过 512") + private String url; + + @Schema(description = "表情名", example = "狗头") + @Size(max = 64, message = "表情名长度不能超过 64") + private String name; + + @Schema(description = "渲染宽度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @NotNull(message = "渲染宽度不能为空") + private Integer width; + + @Schema(description = "渲染高度(像素)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @NotNull(message = "渲染高度不能为空") + private Integer height; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "排序不能为空") + private Integer sort; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "状态不能为空") + private Integer status; // 参见 CommonStatusEnum 枚举类(0 启用 / 1 禁用) + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackPageReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackPageReqVO.java new file mode 100644 index 0000000..e7320fe --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackPageReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack; + +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 ImFacePackPageReqVO extends PageParam { + + @Schema(description = "表情包名称,模糊匹配", example = "猫") + private String name; + + @Schema(description = "状态", example = "0") + private Integer status; // 参见 CommonStatusEnum 枚举类 + + @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/face/vo/pack/ImFacePackRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackRespVO.java new file mode 100644 index 0000000..142ed65 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackRespVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - IM 表情包 Response VO") +@Data +public class ImFacePackRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "表情包名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "猫主子") + private String name; + + @Schema(description = "表情包图标 URL", example = "https://cdn.example.com/face/pack/cat.png") + private String iconUrl; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer sort; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer status; // 参见 CommonStatusEnum 枚举类 + + @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/face/vo/pack/ImFacePackSaveReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackSaveReqVO.java new file mode 100644 index 0000000..01c0358 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/face/vo/pack/ImFacePackSaveReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack; + +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 ImFacePackSaveReqVO { + + @Schema(description = "编号(修改时必填)", example = "1024") + private Long id; + + @Schema(description = "表情包名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "猫主子") + @NotBlank(message = "表情包名称不能为空") + @Size(max = 64, message = "表情包名称长度不能超过 64") + private String name; + + @Schema(description = "表情包图标 URL", example = "https://cdn.example.com/face/pack/cat.png") + @Size(max = 512, message = "图标 URL 长度不能超过 512") + private String iconUrl; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "排序不能为空") + private Integer sort; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "状态不能为空") + private Integer status; // 参见 CommonStatusEnum 枚举类(0 启用 / 1 禁用) + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackItemMapper.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackItemMapper.java index 1fa2922..548b610 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackItemMapper.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackItemMapper.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.face; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackItemDO; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackMapper.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackMapper.java index f1e339b..2864d61 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackMapper.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/face/ImFacePackMapper.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.face; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackDO; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemService.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemService.java index d57d0b2..7ae94f6 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemService.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemService.java @@ -1,14 +1,16 @@ package cn.iocoder.yudao.module.im.service.face; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackItemDO; import jakarta.validation.Valid; import java.util.Collection; import java.util.List; +// TODO @AI:已经分了用户端、和管理后台,注释上就不用写【用户端】【【管理后台】】了。。。 +// TODO @AI:注释的风格,参考下别的模块,一些 params、return 都要写呀; /** * IM 表情包项 Service 接口 * @@ -23,6 +25,16 @@ public interface ImFacePackItemService { */ List getEnabledItemListByPackIds(Collection packIds); + /** + * 取某个表情包下的表情数量;ImFacePackService 删除前校验「包下无项」用 + */ + Long getFacePackItemCount(Long packId); + + /** + * 取多个表情包下的表情数量合计;ImFacePackService 批量删除前校验用 + */ + Long getFacePackItemCount(Collection packIds); + // ==================== 管理后台 ==================== /** diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemServiceImpl.java index 8eef861..9f8d545 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackItemServiceImpl.java @@ -4,8 +4,8 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackItemSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.item.ImFacePackItemSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackItemDO; import cn.iocoder.yudao.module.im.dal.mysql.face.ImFacePackItemMapper; import jakarta.annotation.Resource; @@ -43,6 +43,19 @@ public class ImFacePackItemServiceImpl implements ImFacePackItemService { return facePackItemMapper.selectListByPackIdsAndStatus(packIds, CommonStatusEnum.ENABLE.getStatus()); } + @Override + public Long getFacePackItemCount(Long packId) { + return facePackItemMapper.selectCountByPackId(packId); + } + + @Override + public Long getFacePackItemCount(Collection packIds) { + if (CollUtil.isEmpty(packIds)) { + return 0L; + } + return facePackItemMapper.selectCountByPackIds(packIds); + } + // ==================== 管理后台 ==================== @Override @@ -57,32 +70,33 @@ public class ImFacePackItemServiceImpl implements ImFacePackItemService { @Override public Long createFacePackItem(ImFacePackItemSaveReqVO reqVO) { - // 校验所属表情包存在 + // 1. 校验所属表情包存在 facePackService.validateFacePackExists(reqVO.getPackId()); - ImFacePackItemDO item = BeanUtils.toBean(reqVO, ImFacePackItemDO.class); - // TODO @AI:注释风格,和别的模块一致 + // 2. 入库 + ImFacePackItemDO item = BeanUtils.toBean(reqVO, ImFacePackItemDO.class); facePackItemMapper.insert(item); return item.getId(); } @Override public void updateFacePackItem(ImFacePackItemSaveReqVO reqVO) { - // TODO @AI:注释风格,和别的模块一致 + // 1.1 校验存在 validateFacePackItemExists(reqVO.getId()); - // TODO @AI:注释风格,和别的模块一致 + // 1.2 校验所属表情包存在 facePackService.validateFacePackExists(reqVO.getPackId()); - // TODO @AI:注释风格,和别的模块一致 + // 2. 更新 ImFacePackItemDO updateObj = BeanUtils.toBean(reqVO, ImFacePackItemDO.class); facePackItemMapper.updateById(updateObj); } @Override public void deleteFacePackItem(Long id) { - // TODO @AI:注释风格,和别的模块一致 + // 1. 校验存在 validateFacePackItemExists(id); - // TODO @AI:注释风格,和别的模块一致 + + // 2. 删除 facePackItemMapper.deleteById(id); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackService.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackService.java index 7683b6f..a05596b 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackService.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackService.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.im.service.face; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackDO; import jakarta.validation.Valid; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackServiceImpl.java index 950cb05..e86a397 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFacePackServiceImpl.java @@ -4,12 +4,12 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.ImFacePackSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.manager.face.vo.pack.ImFacePackSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFacePackDO; -import cn.iocoder.yudao.module.im.dal.mysql.face.ImFacePackItemMapper; import cn.iocoder.yudao.module.im.dal.mysql.face.ImFacePackMapper; import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -31,9 +31,12 @@ public class ImFacePackServiceImpl implements ImFacePackService { @Resource private ImFacePackMapper facePackMapper; - // TODO @AI:跨模块操作,需要调用对方 service; + /** + * @Lazy 解决与 ImFacePackItemServiceImpl 的循环依赖(item.create / update 校验所属包存在 → 反向调用本类) + */ @Resource - private ImFacePackItemMapper facePackItemMapper; + @Lazy + private ImFacePackItemService facePackItemService; // ==================== 用户端 ==================== @@ -72,10 +75,10 @@ public class ImFacePackServiceImpl implements ImFacePackService { @Override public void updateFacePack(ImFacePackSaveReqVO reqVO) { - // TODO @AI:注释,参考别的模块 + // 1. 校验存在 validateFacePackExists(reqVO.getId()); - // TODO @AI:注释,参考别的模块 + // 2. 更新 ImFacePackDO updateObj = BeanUtils.toBean(reqVO, ImFacePackDO.class); facePackMapper.updateById(updateObj); } @@ -85,7 +88,7 @@ public class ImFacePackServiceImpl implements ImFacePackService { // 1.1 校验存在 validateFacePackExists(id); // 1.2 校验表情包下没有表情;防止误删表情包导致历史 face 消息无法回查归属 - if (facePackItemMapper.selectCountByPackId(id) > 0) { + if (facePackItemService.getFacePackItemCount(id) > 0) { throw exception(FACE_PACK_HAS_ITEMS); } @@ -95,15 +98,15 @@ public class ImFacePackServiceImpl implements ImFacePackService { @Override public void deleteFacePackList(List ids) { + // 1. 任一存在表情则拒绝整批删除,避免「只删一半」的中间态 if (CollUtil.isEmpty(ids)) { return; } - // 任一存在表情则拒绝整批删除,避免「只删一半」的中间态 - if (facePackItemMapper.selectCountByPackIds(ids) > 0) { + if (facePackItemService.getFacePackItemCount(ids) > 0) { throw exception(FACE_PACK_HAS_ITEMS); } - // 执行删除 + // 2. 删除 facePackMapper.deleteByIds(ids); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemService.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemService.java index 8284f0f..a421024 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemService.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.im.service.face; -import cn.iocoder.yudao.module.im.controller.admin.face.vo.ImFaceUserItemSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.face.vo.userItem.ImFaceUserItemSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFaceUserItemDO; import jakarta.validation.Valid; @@ -14,25 +14,20 @@ import java.util.List; public interface ImFaceUserItemService { /** - * 获取我的个人表情列表 + * 获取指定用户的个人表情列表 */ - List getMyFaceUserItemList(Long userId); + List getFaceUserItemList(Long userId); /** - * 添加个人表情;返回新增 id(已存在则直接返回旧 id) + * 添加个人表情;返回新增记录 id *

- * 同 URL 重复添加时返回旧记录 id,不报错 + * 同 URL 重复添加抛 FACE_USER_ITEM_DUPLICATED;表上 (user_id, url) 唯一约束兜底并发 race */ Long createFaceUserItem(Long userId, @Valid ImFaceUserItemSaveReqVO reqVO); /** - * 删除我的某条个人表情 + * 删除指定用户的某条个人表情 */ void deleteFaceUserItem(Long userId, Long id); - /** - * 批量删除我的个人表情 - */ - void deleteFaceUserItemList(Long userId, List ids); - } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemServiceImpl.java index 7625def..853dd22 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/face/ImFaceUserItemServiceImpl.java @@ -1,17 +1,19 @@ package cn.iocoder.yudao.module.im.service.face; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.face.vo.ImFaceUserItemSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.face.vo.userItem.ImFaceUserItemSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.face.ImFaceUserItemDO; import cn.iocoder.yudao.module.im.dal.mysql.face.ImFaceUserItemMapper; import jakarta.annotation.Resource; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.FACE_USER_ITEM_DUPLICATED; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.FACE_USER_ITEM_NOT_EXISTS; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.FACE_USER_ITEM_NOT_OWN; @@ -27,66 +29,44 @@ public class ImFaceUserItemServiceImpl implements ImFaceUserItemService { @Resource private ImFaceUserItemMapper faceUserItemMapper; - // TODO @AI:传递了 userid,就不用写 myXXX 了; @Override - public List getMyFaceUserItemList(Long userId) { + public List getFaceUserItemList(Long userId) { return faceUserItemMapper.selectListByUserId(userId); } @Override public Long createFaceUserItem(Long userId, ImFaceUserItemSaveReqVO reqVO) { - // 1. 同 URL 已添加:直接返回旧 id;避免一张图反复添加占额度,并保证「添加到表情」幂等 - // TODO @AI:是不是提示下,已经有这个标签库了。。。 - ImFaceUserItemDO exist = faceUserItemMapper.selectByUserIdAndUrl(userId, reqVO.getUrl()); - if (exist != null) { - return exist.getId(); + // 1. 同 URL 已存在则报错;前端 catch 后 toast「已添加过」 + if (faceUserItemMapper.selectByUserIdAndUrl(userId, reqVO.getUrl()) != null) { + throw exception(FACE_USER_ITEM_DUPLICATED); } - // 2. 入库 - // TODO @AI:链式调用 - ImFaceUserItemDO item = BeanUtils.toBean(reqVO, ImFaceUserItemDO.class); - item.setUserId(userId); - item.setSort(0); - faceUserItemMapper.insert(item); + // 2. 入库;表 (user_id, url, tenant_id) 唯一约束兜底并发 race —— 两个请求同时过 step 1 时 DB 拦截 + // TODO @AI:不加唯一索引。不然删除后恢复麻烦。按照我说的来。 + ImFaceUserItemDO item = BeanUtils.toBean(reqVO, ImFaceUserItemDO.class) + .setUserId(userId); + try { + faceUserItemMapper.insert(item); + } catch (DuplicateKeyException ignored) { + throw exception(FACE_USER_ITEM_DUPLICATED); + } return item.getId(); } @Override public void deleteFaceUserItem(Long userId, Long id) { + // 1.1 校验存在 ImFaceUserItemDO item = faceUserItemMapper.selectById(id); if (item == null) { throw exception(FACE_USER_ITEM_NOT_EXISTS); } - // 防止 A 用户传 B 用户的表情 id 删除别人的表情 - // TODO @AI:notEquals; - if (!item.getUserId().equals(userId)) { + // 1.2 校验归属:防止 A 用户传 B 用户的表情 id 删别人的 + if (ObjectUtil.notEqual(item.getUserId(), userId)) { throw exception(FACE_USER_ITEM_NOT_OWN); } - // TODO @AI:注释 + // 2. 删除 faceUserItemMapper.deleteById(id); } - @Override - public void deleteFaceUserItemList(Long userId, List ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 一次性查全部待删项;任一不属于当前用户则整批拒绝 - // TODO @AI:过滤掉,不属于自己的; - List items = faceUserItemMapper.selectByIds(ids); - // TODO @AI:不存在的,直接跳过; - if (CollUtil.size(items) != CollUtil.size(ids)) { - throw exception(FACE_USER_ITEM_NOT_EXISTS); - } - for (ImFaceUserItemDO item : items) { - if (!item.getUserId().equals(userId)) { - throw exception(FACE_USER_ITEM_NOT_OWN); - } - } - - // TODO @AI:注释 - faceUserItemMapper.deleteByIds(ids); - } - } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/FaceMessage.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/FaceMessage.java index 2c1b044..f5c6b6c 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/FaceMessage.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/FaceMessage.java @@ -14,15 +14,14 @@ public class FaceMessage { * 表情图 URL */ private String url; - // TODO @AI:openim 有这个字段么?不是一般 url 就足够了呀。 /** - * 渲染宽度(像素) + * 渲染宽度(像素,可选) *

- * 客户端渲染时按此尺寸占位,避免图片加载完成后的布局抖动 + * 客户端渲染时按此尺寸占位,避免图片加载完成后的布局抖动;缺失时由客户端 CSS max-width 兜底 */ private Integer width; /** - * 渲染高度(像素) + * 渲染高度(像素,可选) */ private Integer height; /** -- libgit2 0.21.4