From 3696b666f42fccceee74d53c07bfb874f63dc461 Mon Sep 17 00:00:00 2001 From: 安浩浩 <1036606149@qq.com> Date: Wed, 13 Mar 2024 21:43:05 +0800 Subject: [PATCH] 修改:im 模块简单实现 --- pom.xml | 2 -- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java | 93 --------------------------------------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPageReqVO.java | 43 ------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationRespVO.java | 47 ----------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationSaveReqVO.java | 40 ---------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java | 8 ++++---- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java | 99 --------------------------------------------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePageReqVO.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java | 58 ---------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageRespVO.java | 67 ------------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageSaveReqVO.java | 61 ------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java | 56 -------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java | 42 ------------------------------------------ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java | 76 ---------------------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java | 26 +++++++++++++------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java | 18 +++++++++--------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java | 35 +++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java | 35 ----------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java | 54 ------------------------------------------------------ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java | 70 ---------------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java | 6 +++--- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java | 10 +++++----- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java | 60 ------------------------------------------------------------ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java | 75 --------------------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java | 12 ++++++------ yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java | 14 +++++++++----- yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/message/ImMessageMapper.xml | 12 ++++++++++++ yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/message/MessageMapper.xml | 12 ------------ yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImplTest.java | 154 ---------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImplTest.java | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java | 21 +++++++-------------- yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImplTest.java | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImplTest.java | 174 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java | 5 +++++ yudao-server/src/main/resources/application-local.yaml | 16 ++++++++-------- yudao-server/src/main/resources/application.yaml | 2 +- 51 files changed, 1428 insertions(+), 1391 deletions(-) delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPageReqVO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationRespVO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationSaveReqVO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePageReqVO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageRespVO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageSaveReqVO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/message/ImMessageMapper.xml delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/message/MessageMapper.xml delete mode 100755 yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImplTest.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImplTest.java create mode 100755 yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImplTest.java delete mode 100755 yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImplTest.java diff --git a/pom.xml b/pom.xml index bb462a7..f50a519 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,6 @@ yudao-module-system yudao-module-infra - yudao-module-im - yudao-module-im/yudao-module-im-api diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java deleted file mode 100755 index 266c026..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.conversation; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationRespVO; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; -import cn.iocoder.yudao.module.im.service.conversation.ConversationService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Tag(name = "管理后台 - 会话") -@RestController -@RequestMapping("/im/conversation") -@Validated -public class ConversationController { - - @Resource - private ConversationService conversationService; - - @PostMapping("/create") - @Operation(summary = "创建会话") - @PreAuthorize("@ss.hasPermission('im:conversation:create')") - public CommonResult createConversation(@Valid @RequestBody ConversationSaveReqVO createReqVO) { - return success(conversationService.createConversation(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新会话") - @PreAuthorize("@ss.hasPermission('im:conversation:update')") - public CommonResult updateConversation(@Valid @RequestBody ConversationSaveReqVO updateReqVO) { - conversationService.updateConversation(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除会话") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('im:conversation:delete')") - public CommonResult deleteConversation(@RequestParam("id") Long id) { - conversationService.deleteConversation(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得会话") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('im:conversation:query')") - public CommonResult getConversation(@RequestParam("id") Long id) { - ConversationDO conversation = conversationService.getConversation(id); - return success(BeanUtils.toBean(conversation, ConversationRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得会话分页") - @PreAuthorize("@ss.hasPermission('im:conversation:query')") - public CommonResult> getConversationPage(@Valid ConversationPageReqVO pageReqVO) { - PageResult pageResult = conversationService.getConversationPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, ConversationRespVO.class)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出会话 Excel") - @PreAuthorize("@ss.hasPermission('im:conversation:export')") - @OperateLog(type = EXPORT) - public void exportConversationExcel(@Valid ConversationPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = conversationService.getConversationPage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "会话.xls", "数据", ConversationRespVO.class, - BeanUtils.toBean(list, ConversationRespVO.class)); - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java new file mode 100755 index 0000000..c704cbc --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.im.controller.admin.conversation; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; +import cn.iocoder.yudao.module.im.service.conversation.ImConversationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 会话") +@RestController +@RequestMapping("/im/conversation") +@Validated +public class ImConversationController { + + @Resource + private ImConversationService imConversationService; + + @PostMapping("/create") + @Operation(summary = "创建会话") + @PreAuthorize("@ss.hasPermission('im:conversation:create')") + public CommonResult createConversation(@Valid @RequestBody ImConversationSaveReqVO createReqVO) { + return success(imConversationService.createConversation(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新会话") + @PreAuthorize("@ss.hasPermission('im:conversation:update')") + public CommonResult updateConversation(@Valid @RequestBody ImConversationSaveReqVO updateReqVO) { + imConversationService.updateConversation(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除会话") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('im:conversation:delete')") + public CommonResult deleteConversation(@RequestParam("id") Long id) { + imConversationService.deleteConversation(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得会话") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('im:conversation:query')") + public CommonResult getConversation(@RequestParam("id") Long id) { + ImConversationDO conversation = imConversationService.getConversation(id); + return success(BeanUtils.toBean(conversation, ImConversationRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得会话分页") + @PreAuthorize("@ss.hasPermission('im:conversation:query')") + public CommonResult> getConversationPage(@Valid ImConversationPageReqVO pageReqVO) { + PageResult pageResult = imConversationService.getConversationPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ImConversationRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出会话 Excel") + @PreAuthorize("@ss.hasPermission('im:conversation:export')") + @OperateLog(type = EXPORT) + public void exportConversationExcel(@Valid ImConversationPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = imConversationService.getConversationPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "会话.xls", "数据", ImConversationRespVO.class, + BeanUtils.toBean(list, ImConversationRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPageReqVO.java deleted file mode 100755 index 3325a64..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPageReqVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -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 = "管理后台 - 会话分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ConversationPageReqVO extends PageParam { - - @Schema(description = "所属用户", example = "11545") - private Long userId; - - @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", example = "1") - private Boolean conversationType; - - @Schema(description = "单聊时,用户编号;群聊时,群编号", example = "21454") - private String targetId; - - @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId") - private String no; - - @Schema(description = "是否置顶 0否 1是") - private Boolean pinned; - - @Schema(description = "最后已读时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] lastReadTime; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationRespVO.java deleted file mode 100755 index 6ffbb7c..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationRespVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 会话 Response VO") -@Data -@ExcelIgnoreUnannotated -public class ConversationRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13905") - @ExcelProperty("编号") - private Long id; - - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "11545") - @ExcelProperty("所属用户") - private Long userId; - - @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("类型:1 单聊;2 群聊;4 通知会话(预留)") - private Boolean conversationType; - - @Schema(description = "单聊时,用户编号;群聊时,群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21454") - @ExcelProperty("单聊时,用户编号;群聊时,群编号") - private String targetId; - - @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId") - private String no; - - @Schema(description = "是否置顶 0否 1是", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("是否置顶 0否 1是") - private Boolean pinned; - - @Schema(description = "最后已读时间") - @ExcelProperty("最后已读时间") - private LocalDateTime lastReadTime; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationSaveReqVO.java deleted file mode 100755 index 932fd5b..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationSaveReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 会话新增/修改 Request VO") -@Data -public class ConversationSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13905") - private Long id; - - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "11545") - @NotNull(message = "所属用户不能为空") - private Long userId; - - @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "类型:1 单聊;2 群聊;4 通知会话(预留)不能为空") - private Boolean conversationType; - - @Schema(description = "单聊时,用户编号;群聊时,群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21454") - @NotEmpty(message = "单聊时,用户编号;群聊时,群编号不能为空") - private String targetId; - - @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId不能为空") - private String no; - - @Schema(description = "是否置顶 0否 1是", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "是否置顶 0否 1是不能为空") - private Boolean pinned; - - @Schema(description = "最后已读时间") - private LocalDateTime lastReadTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java new file mode 100755 index 0000000..152be29 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +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 = "管理后台 - 会话分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ImConversationPageReqVO extends PageParam { + + @Schema(description = "所属用户", example = "11545") + private Long userId; + + @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", example = "1") + private Integer conversationType; + + @Schema(description = "单聊时,用户编号;群聊时,群编号", example = "21454") + private String targetId; + + @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId") + private String no; + + @Schema(description = "是否置顶 0否 1是") + private Boolean pinned; + + @Schema(description = "最后已读时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] lastReadTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java new file mode 100755 index 0000000..682ce2e --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会话 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ImConversationRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13905") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "11545") + @ExcelProperty("所属用户") + private Long userId; + + @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("类型:1 单聊;2 群聊;4 通知会话(预留)") + private Integer conversationType; + + @Schema(description = "单聊时,用户编号;群聊时,群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21454") + @ExcelProperty("单聊时,用户编号;群聊时,群编号") + private String targetId; + + @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId") + private String no; + + @Schema(description = "是否置顶 0否 1是", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("是否置顶 0否 1是") + private Boolean pinned; + + @Schema(description = "最后已读时间") + @ExcelProperty("最后已读时间") + private LocalDateTime lastReadTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java new file mode 100755 index 0000000..4282846 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会话新增/修改 Request VO") +@Data +public class ImConversationSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13905") + private Long id; + + @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "11545") + @NotNull(message = "所属用户不能为空") + private Long userId; + + @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "类型:1 单聊;2 群聊;4 通知会话(预留)不能为空") + private Integer conversationType; + + @Schema(description = "单聊时,用户编号;群聊时,群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21454") + @NotEmpty(message = "单聊时,用户编号;群聊时,群编号不能为空") + private String targetId; + + @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId不能为空") + private String no; + + @Schema(description = "是否置顶 0否 1是", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否置顶 0否 1是不能为空") + private Boolean pinned; + + @Schema(description = "最后已读时间") + private LocalDateTime lastReadTime; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java index 03e6083..63a62f1 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxPageReqVO; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxRespVO; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; import cn.iocoder.yudao.module.im.service.inbox.InboxService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -65,7 +65,7 @@ public class InboxController { @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('im:inbox:query')") public CommonResult getInbox(@RequestParam("id") Long id) { - InboxDO inbox = inboxService.getInbox(id); + ImInboxDO inbox = inboxService.getInbox(id); return success(BeanUtils.toBean(inbox, InboxRespVO.class)); } @@ -73,7 +73,7 @@ public class InboxController { @Operation(summary = "获得收件箱分页") @PreAuthorize("@ss.hasPermission('im:inbox:query')") public CommonResult> getInboxPage(@Valid InboxPageReqVO pageReqVO) { - PageResult pageResult = inboxService.getInboxPage(pageReqVO); + PageResult pageResult = inboxService.getInboxPage(pageReqVO); return success(BeanUtils.toBean(pageResult, InboxRespVO.class)); } @@ -84,7 +84,7 @@ public class InboxController { public void exportInboxExcel(@Valid InboxPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = inboxService.getInboxPage(pageReqVO).getList(); + List list = inboxService.getInboxPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "收件箱.xls", "数据", InboxRespVO.class, BeanUtils.toBean(list, InboxRespVO.class)); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java new file mode 100755 index 0000000..f0ca03d --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.module.im.controller.admin.message; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessagePageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSaveReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; +import cn.iocoder.yudao.module.im.service.message.ImMessageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 消息") +@RestController +@RequestMapping("/im/message") +@Validated +public class ImMessageController { + + @Resource + private ImMessageService imMessageService; + + @PostMapping("/create") + @Operation(summary = "创建消息") + @PreAuthorize("@ss.hasPermission('im:message:create')") + public CommonResult createMessage(@Valid @RequestBody ImMessageSaveReqVO createReqVO) { + return success(imMessageService.createMessage(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新消息") + @PreAuthorize("@ss.hasPermission('im:message:update')") + public CommonResult updateMessage(@Valid @RequestBody ImMessageSaveReqVO updateReqVO) { + imMessageService.updateMessage(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除消息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('im:message:delete')") + public CommonResult deleteMessage(@RequestParam("id") Long id) { + imMessageService.deleteMessage(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得消息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('im:message:query')") + public CommonResult getMessage(@RequestParam("id") Long id) { + ImMessageDO message = imMessageService.getMessage(id); + return success(BeanUtils.toBean(message, ImMessageRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得消息分页") + @PreAuthorize("@ss.hasPermission('im:message:query')") + public CommonResult> getMessagePage(@Valid ImMessagePageReqVO pageReqVO) { + PageResult pageResult = imMessageService.getMessagePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ImMessageRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出消息 Excel") + @PreAuthorize("@ss.hasPermission('im:message:export')") + @OperateLog(type = EXPORT) + public void exportMessageExcel(@Valid ImMessagePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = imMessageService.getMessagePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "消息.xls", "数据", ImMessageRespVO.class, + BeanUtils.toBean(list, ImMessageRespVO.class)); + } + + @PostMapping("/send") + @Operation(summary = "发送私聊消息") + public CommonResult sendMessage(@Valid @RequestBody ImMessageSaveReqVO imMessageSaveReqVO) { + return success(imMessageService.sendPrivateMessage(imMessageSaveReqVO)); + } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java deleted file mode 100755 index 788488a..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageRespVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; -import cn.iocoder.yudao.module.im.service.message.MessageService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Tag(name = "管理后台 - 消息") -@RestController -@RequestMapping("/im/message") -@Validated -public class MessageController { - - @Resource - private MessageService messageService; - - @PostMapping("/create") - @Operation(summary = "创建消息") - @PreAuthorize("@ss.hasPermission('im:message:create')") - public CommonResult createMessage(@Valid @RequestBody MessageSaveReqVO createReqVO) { - return success(messageService.createMessage(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新消息") - @PreAuthorize("@ss.hasPermission('im:message:update')") - public CommonResult updateMessage(@Valid @RequestBody MessageSaveReqVO updateReqVO) { - messageService.updateMessage(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除消息") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('im:message:delete')") - public CommonResult deleteMessage(@RequestParam("id") Long id) { - messageService.deleteMessage(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得消息") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('im:message:query')") - public CommonResult getMessage(@RequestParam("id") Long id) { - MessageDO message = messageService.getMessage(id); - return success(BeanUtils.toBean(message, MessageRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得消息分页") - @PreAuthorize("@ss.hasPermission('im:message:query')") - public CommonResult> getMessagePage(@Valid MessagePageReqVO pageReqVO) { - PageResult pageResult = messageService.getMessagePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, MessageRespVO.class)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出消息 Excel") - @PreAuthorize("@ss.hasPermission('im:message:export')") - @OperateLog(type = EXPORT) - public void exportMessageExcel(@Valid MessagePageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = messageService.getMessagePage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "消息.xls", "数据", MessageRespVO.class, - BeanUtils.toBean(list, MessageRespVO.class)); - } - - @PostMapping("/send") - @Operation(summary = "发送私聊消息") - public CommonResult sendMessage(@Valid @RequestBody MessageSaveReqVO messageSaveReqVO) { - return success(messageService.sendPrivateMessage(messageSaveReqVO)); - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePageReqVO.java new file mode 100755 index 0000000..78649d1 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessagePageReqVO.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.im.controller.admin.message.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +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 = "管理后台 - 消息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ImMessagePageReqVO extends PageParam { + + @Schema(description = "客户端消息编号 uuid,用于排重", example = "3331") + private String clientMessageId; + + @Schema(description = "发送人编号", example = "23239") + private Long senderId; + + @Schema(description = "接收人编号", example = "32494") + private Long receiverId; + + @Schema(description = "发送人昵称", example = "李四") + private String senderNickname; + + @Schema(description = "发送人头像") + private String senderAvatar; + + @Schema(description = "会话类型", example = "2") + private Integer conversationType; + + @Schema(description = "会话标志") + private String conversationNo; + + @Schema(description = "消息类型", example = "1") + private Integer contentType; + + @Schema(description = "消息内容") + private String content; + + @Schema(description = "发送时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] sendTime; + + @Schema(description = "消息来源 100-用户发送;200-系统发送(一般是通知);") + private Integer sendFrom; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java new file mode 100755 index 0000000..e732c94 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.im.controller.admin.message.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 消息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ImMessageRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30713") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") + @ExcelProperty("客户端消息编号 uuid,用于排重") + private String clientMessageId; + + @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23239") + @ExcelProperty("发送人编号") + private Long senderId; + + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") + @ExcelProperty("接收人编号") + private Long receiverId; + + @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @ExcelProperty("发送人昵称") + private String senderNickname; + + @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("发送人头像") + private String senderAvatar; + + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("会话类型") + private Integer conversationType; + + @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("会话标志") + private String conversationNo; + + @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("消息类型") + private Integer contentType; + + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("消息内容") + private String content; + + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("发送时间") + private LocalDateTime sendTime; + + @Schema(description = "消息来源 100-用户发送;200-系统发送(一般是通知);", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("消息来源 100-用户发送;200-系统发送(一般是通知);") + private Integer sendFrom; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java new file mode 100755 index 0000000..cea5573 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.im.controller.admin.message.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 消息新增/修改 Request VO") +@Data +public class ImMessageSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30713") + private Long id; + + @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") + @NotEmpty(message = "客户端消息编号 uuid,用于排重不能为空") + private String clientMessageId; + + @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23239") + @NotNull(message = "发送人编号不能为空") + private Long senderId; + + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") + @NotNull(message = "接收人编号不能为空") + private Long receiverId; + + @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotEmpty(message = "发送人昵称不能为空") + private String senderNickname; + + @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "发送人头像不能为空") + private String senderAvatar; + + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "会话类型不能为空") + private Integer conversationType; + + @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "会话标志不能为空") + private String conversationNo; + + @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "消息类型不能为空") + private Integer contentType; + + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "消息内容不能为空") + private String content; + + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime sendTime; + + @Schema(description = "消息来源 100-用户发送;200-系统发送(一般是通知);", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "消息来源 100-用户发送;200-系统发送(一般是通知);不能为空") + private Integer sendFrom; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java deleted file mode 100755 index 96ffd87..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -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 = "管理后台 - 消息分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MessagePageReqVO extends PageParam { - - @Schema(description = "客户端消息编号 uuid,用于排重", example = "3331") - private String clientMessageId; - - @Schema(description = "发送人编号", example = "23239") - private Long senderId; - - @Schema(description = "接收人编号", example = "32494") - private Long receiverId; - - @Schema(description = "发送人昵称", example = "李四") - private String senderNickname; - - @Schema(description = "发送人头像") - private String senderAvatar; - - @Schema(description = "会话类型", example = "2") - private Boolean conversationType; - - @Schema(description = "会话标志") - private String conversationNo; - - @Schema(description = "消息类型", example = "1") - private Boolean contentType; - - @Schema(description = "消息内容") - private String content; - - @Schema(description = "发送时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] sendTime; - - @Schema(description = "消息来源 100-用户发送;200-系统发送(一般是通知);") - private Boolean sendFrom; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageRespVO.java deleted file mode 100755 index 2949ade..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageRespVO.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 消息 Response VO") -@Data -@ExcelIgnoreUnannotated -public class MessageRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30713") - @ExcelProperty("编号") - private Long id; - - @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") - @ExcelProperty("客户端消息编号 uuid,用于排重") - private String clientMessageId; - - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23239") - @ExcelProperty("发送人编号") - private Long senderId; - - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") - @ExcelProperty("接收人编号") - private Long receiverId; - - @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @ExcelProperty("发送人昵称") - private String senderNickname; - - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("发送人头像") - private String senderAvatar; - - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @ExcelProperty("会话类型") - private Boolean conversationType; - - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("会话标志") - private String conversationNo; - - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("消息类型") - private Boolean contentType; - - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("消息内容") - private String content; - - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("发送时间") - private LocalDateTime sendTime; - - @Schema(description = "消息来源 100-用户发送;200-系统发送(一般是通知);", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("消息来源 100-用户发送;200-系统发送(一般是通知);") - private Boolean sendFrom; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageSaveReqVO.java deleted file mode 100755 index 55ccd14..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageSaveReqVO.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 消息新增/修改 Request VO") -@Data -public class MessageSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30713") - private Long id; - - @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") - @NotEmpty(message = "客户端消息编号 uuid,用于排重不能为空") - private String clientMessageId; - - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23239") - @NotNull(message = "发送人编号不能为空") - private Long senderId; - - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") - @NotNull(message = "接收人编号不能为空") - private Long receiverId; - - @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotEmpty(message = "发送人昵称不能为空") - private String senderNickname; - - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "发送人头像不能为空") - private String senderAvatar; - - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "会话类型不能为空") - private Boolean conversationType; - - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "会话标志不能为空") - private String conversationNo; - - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "消息类型不能为空") - private Boolean contentType; - - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "消息内容不能为空") - private String content; - - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "发送时间不能为空") - private LocalDateTime sendTime; - - @Schema(description = "消息来源 100-用户发送;200-系统发送(一般是通知);", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "消息来源 100-用户发送;200-系统发送(一般是通知);不能为空") - private Boolean sendFrom; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java deleted file mode 100755 index 12a0832..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.iocoder.yudao.module.im.dal.dataobject.conversation; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.time.LocalDateTime; - -/** - * 会话 DO - * - * @author 芋道源码 - */ -@TableName("im_conversation") -@KeySequence("im_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ConversationDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 所属用户 - */ - private Long userId; - /** - * 类型:1 单聊;2 群聊;4 通知会话(预留) - */ - private Boolean conversationType; - /** - * 单聊时,用户编号;群聊时,群编号 - */ - private String targetId; - /** - * 会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId - */ - private String no; - /** - * 是否置顶 0否 1是 - */ - private Boolean pinned; - /** - * 最后已读时间 - */ - private LocalDateTime lastReadTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java new file mode 100755 index 0000000..822b78f --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.im.dal.dataobject.conversation; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 会话 DO + * + * @author 芋道源码 + */ +@TableName("im_conversation") +@KeySequence("im_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImConversationDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 所属用户 + */ + private Long userId; + /** + * 类型:1 单聊;2 群聊;4 通知会话(预留) + */ + private Integer conversationType; + /** + * 单聊时,用户编号;群聊时,群编号 + */ + private String targetId; + /** + * 会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId + */ + private String no; + /** + * 是否置顶 0否 1是 + */ + private Boolean pinned; + /** + * 最后已读时间 + */ + private LocalDateTime lastReadTime; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java new file mode 100755 index 0000000..20dd94c --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.im.dal.dataobject.inbox; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 收件箱 DO + * + * @author 芋道源码 + */ +@TableName("im_inbox") +@KeySequence("im_inbox_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImInboxDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 消息编号 + */ + private Long messageId; + /** + * 序号,按照 user 递增 + */ + private Long sequence; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java deleted file mode 100755 index fd60ea1..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.yudao.module.im.dal.dataobject.inbox; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 收件箱 DO - * - * @author 芋道源码 - */ -@TableName("im_inbox") -@KeySequence("im_inbox_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class InboxDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 用户编号 - */ - private Long userId; - /** - * 消息编号 - */ - private Long messageId; - /** - * 序号,按照 user 递增 - */ - private Long sequence; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java new file mode 100755 index 0000000..14e88c1 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.im.dal.dataobject.message; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 消息 DO + * + * @author 芋道源码 + */ +@TableName("im_message") +@KeySequence("im_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImMessageDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 客户端消息编号 uuid,用于排重 + */ + private String clientMessageId; + /** + * 发送人编号 + */ + private Long senderId; + /** + * 接收人编号 + */ + private Long receiverId; + /** + * 发送人昵称 + */ + private String senderNickname; + /** + * 发送人头像 + */ + private String senderAvatar; + /** + * 会话类型 + */ + private Integer conversationType; + /** + * 会话标志 + */ + private String conversationNo; + /** + * 消息类型 + */ + private Integer contentType; + /** + * 消息内容 + */ + private String content; + /** + * 发送时间 + */ + private LocalDateTime sendTime; + /** + * 消息来源 100-用户发送;200-系统发送(一般是通知); + */ + private Integer sendFrom; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java deleted file mode 100755 index 98a289c..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.iocoder.yudao.module.im.dal.dataobject.message; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.time.LocalDateTime; - -/** - * 消息 DO - * - * @author 芋道源码 - */ -@TableName("im_message") -@KeySequence("im_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MessageDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 客户端消息编号 uuid,用于排重 - */ - private String clientMessageId; - /** - * 发送人编号 - */ - private Long senderId; - /** - * 接收人编号 - */ - private Long receiverId; - /** - * 发送人昵称 - */ - private String senderNickname; - /** - * 发送人头像 - */ - private String senderAvatar; - /** - * 会话类型 - */ - private Boolean conversationType; - /** - * 会话标志 - */ - private String conversationNo; - /** - * 消息类型 - */ - private Boolean contentType; - /** - * 消息内容 - */ - private String content; - /** - * 发送时间 - */ - private LocalDateTime sendTime; - /** - * 消息来源 100-用户发送;200-系统发送(一般是通知); - */ - private Boolean sendFrom; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java index e371d99..a93257f 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.im.dal.mysql.conversation; 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.conversation.vo.ConversationPageReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationPageReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; import org.apache.ibatis.annotations.Mapper; /** @@ -13,18 +13,18 @@ import org.apache.ibatis.annotations.Mapper; * @author 芋道源码 */ @Mapper -public interface ConversationMapper extends BaseMapperX { +public interface ConversationMapper extends BaseMapperX { - default PageResult selectPage(ConversationPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(ConversationDO::getUserId, reqVO.getUserId()) - .eqIfPresent(ConversationDO::getConversationType, reqVO.getConversationType()) - .eqIfPresent(ConversationDO::getTargetId, reqVO.getTargetId()) - .eqIfPresent(ConversationDO::getNo, reqVO.getNo()) - .eqIfPresent(ConversationDO::getPinned, reqVO.getPinned()) - .betweenIfPresent(ConversationDO::getLastReadTime, reqVO.getLastReadTime()) - .betweenIfPresent(ConversationDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(ConversationDO::getId)); + default PageResult selectPage(ImConversationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ImConversationDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ImConversationDO::getConversationType, reqVO.getConversationType()) + .eqIfPresent(ImConversationDO::getTargetId, reqVO.getTargetId()) + .eqIfPresent(ImConversationDO::getNo, reqVO.getNo()) + .eqIfPresent(ImConversationDO::getPinned, reqVO.getPinned()) + .betweenIfPresent(ImConversationDO::getLastReadTime, reqVO.getLastReadTime()) + .betweenIfPresent(ImConversationDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ImConversationDO::getId)); } } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java index 1b0822b..fe861c5 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java @@ -4,7 +4,7 @@ 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.inbox.vo.InboxPageReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; import org.apache.ibatis.annotations.Mapper; /** @@ -13,15 +13,15 @@ import org.apache.ibatis.annotations.Mapper; * @author 芋道源码 */ @Mapper -public interface InboxMapper extends BaseMapperX { +public interface InboxMapper extends BaseMapperX { - default PageResult selectPage(InboxPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(InboxDO::getUserId, reqVO.getUserId()) - .eqIfPresent(InboxDO::getMessageId, reqVO.getMessageId()) - .eqIfPresent(InboxDO::getSequence, reqVO.getSequence()) - .betweenIfPresent(InboxDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(InboxDO::getId)); + default PageResult selectPage(InboxPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ImInboxDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ImInboxDO::getMessageId, reqVO.getMessageId()) + .eqIfPresent(ImInboxDO::getSequence, reqVO.getSequence()) + .betweenIfPresent(ImInboxDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ImInboxDO::getId)); } } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java new file mode 100755 index 0000000..6fee364 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.im.dal.mysql.message; + +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.message.vo.ImMessagePageReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 消息 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface ImMessageMapper extends BaseMapperX { + + default PageResult selectPage(ImMessagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ImMessageDO::getClientMessageId, reqVO.getClientMessageId()) + .eqIfPresent(ImMessageDO::getSenderId, reqVO.getSenderId()) + .eqIfPresent(ImMessageDO::getReceiverId, reqVO.getReceiverId()) + .likeIfPresent(ImMessageDO::getSenderNickname, reqVO.getSenderNickname()) + .eqIfPresent(ImMessageDO::getSenderAvatar, reqVO.getSenderAvatar()) + .eqIfPresent(ImMessageDO::getConversationType, reqVO.getConversationType()) + .eqIfPresent(ImMessageDO::getConversationNo, reqVO.getConversationNo()) + .eqIfPresent(ImMessageDO::getContentType, reqVO.getContentType()) + .eqIfPresent(ImMessageDO::getContent, reqVO.getContent()) + .betweenIfPresent(ImMessageDO::getSendTime, reqVO.getSendTime()) + .eqIfPresent(ImMessageDO::getSendFrom, reqVO.getSendFrom()) + .betweenIfPresent(ImMessageDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ImMessageDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java deleted file mode 100755 index ac54b46..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.im.dal.mysql.message; - -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.message.vo.MessagePageReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 消息 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MessageMapper extends BaseMapperX { - - default PageResult selectPage(MessagePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MessageDO::getClientMessageId, reqVO.getClientMessageId()) - .eqIfPresent(MessageDO::getSenderId, reqVO.getSenderId()) - .eqIfPresent(MessageDO::getReceiverId, reqVO.getReceiverId()) - .likeIfPresent(MessageDO::getSenderNickname, reqVO.getSenderNickname()) - .eqIfPresent(MessageDO::getSenderAvatar, reqVO.getSenderAvatar()) - .eqIfPresent(MessageDO::getConversationType, reqVO.getConversationType()) - .eqIfPresent(MessageDO::getConversationNo, reqVO.getConversationNo()) - .eqIfPresent(MessageDO::getContentType, reqVO.getContentType()) - .eqIfPresent(MessageDO::getContent, reqVO.getContent()) - .betweenIfPresent(MessageDO::getSendTime, reqVO.getSendTime()) - .eqIfPresent(MessageDO::getSendFrom, reqVO.getSendFrom()) - .betweenIfPresent(MessageDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MessageDO::getId)); - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java deleted file mode 100755 index 61175b1..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.module.im.service.conversation; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; -import jakarta.validation.Valid; - -/** - * 会话 Service 接口 - * - * @author 芋道源码 - */ -public interface ConversationService { - - /** - * 创建会话 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createConversation(@Valid ConversationSaveReqVO createReqVO); - - /** - * 更新会话 - * - * @param updateReqVO 更新信息 - */ - void updateConversation(@Valid ConversationSaveReqVO updateReqVO); - - /** - * 删除会话 - * - * @param id 编号 - */ - void deleteConversation(Long id); - - /** - * 获得会话 - * - * @param id 编号 - * @return 会话 - */ - ConversationDO getConversation(Long id); - - /** - * 获得会话分页 - * - * @param pageReqVO 分页查询 - * @return 会话分页 - */ - PageResult getConversationPage(ConversationPageReqVO pageReqVO); - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java deleted file mode 100755 index 9ede7d5..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.iocoder.yudao.module.im.service.conversation; - -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.conversation.vo.ConversationPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; -import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.CONVERSATION_NOT_EXISTS; - -/** - * 会话 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class ConversationServiceImpl implements ConversationService { - - @Resource - private ConversationMapper conversationMapper; - - @Override - public Long createConversation(ConversationSaveReqVO createReqVO) { - // 插入 - ConversationDO conversation = BeanUtils.toBean(createReqVO, ConversationDO.class); - conversationMapper.insert(conversation); - // 返回 - return conversation.getId(); - } - - @Override - public void updateConversation(ConversationSaveReqVO updateReqVO) { - // 校验存在 - validateConversationExists(updateReqVO.getId()); - // 更新 - ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class); - conversationMapper.updateById(updateObj); - } - - @Override - public void deleteConversation(Long id) { - // 校验存在 - validateConversationExists(id); - // 删除 - conversationMapper.deleteById(id); - } - - private void validateConversationExists(Long id) { - if (conversationMapper.selectById(id) == null) { - throw exception(CONVERSATION_NOT_EXISTS); - } - } - - @Override - public ConversationDO getConversation(Long id) { - return conversationMapper.selectById(id); - } - - @Override - public PageResult getConversationPage(ConversationPageReqVO pageReqVO) { - return conversationMapper.selectPage(pageReqVO); - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java new file mode 100755 index 0000000..0980a92 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.im.service.conversation; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; +import jakarta.validation.Valid; + +/** + * 会话 Service 接口 + * + * @author 芋道源码 + */ +public interface ImConversationService { + + /** + * 创建会话 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createConversation(@Valid ImConversationSaveReqVO createReqVO); + + /** + * 更新会话 + * + * @param updateReqVO 更新信息 + */ + void updateConversation(@Valid ImConversationSaveReqVO updateReqVO); + + /** + * 删除会话 + * + * @param id 编号 + */ + void deleteConversation(Long id); + + /** + * 获得会话 + * + * @param id 编号 + * @return 会话 + */ + ImConversationDO getConversation(Long id); + + /** + * 获得会话分页 + * + * @param pageReqVO 分页查询 + * @return 会话分页 + */ + PageResult getConversationPage(ImConversationPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java new file mode 100755 index 0000000..8ff1514 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.im.service.conversation; + +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.conversation.vo.ImConversationPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; +import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.CONVERSATION_NOT_EXISTS; + +/** + * 会话 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ImConversationServiceImpl implements ImConversationService { + + @Resource + private ConversationMapper conversationMapper; + + @Override + public Long createConversation(ImConversationSaveReqVO createReqVO) { + // 插入 + ImConversationDO conversation = BeanUtils.toBean(createReqVO, ImConversationDO.class); + conversationMapper.insert(conversation); + // 返回 + return conversation.getId(); + } + + @Override + public void updateConversation(ImConversationSaveReqVO updateReqVO) { + // 校验存在 + validateConversationExists(updateReqVO.getId()); + // 更新 + ImConversationDO updateObj = BeanUtils.toBean(updateReqVO, ImConversationDO.class); + conversationMapper.updateById(updateObj); + } + + @Override + public void deleteConversation(Long id) { + // 校验存在 + validateConversationExists(id); + // 删除 + conversationMapper.deleteById(id); + } + + private void validateConversationExists(Long id) { + if (conversationMapper.selectById(id) == null) { + throw exception(CONVERSATION_NOT_EXISTS); + } + } + + @Override + public ImConversationDO getConversation(Long id) { + return conversationMapper.selectById(id); + } + + @Override + public PageResult getConversationPage(ImConversationPageReqVO pageReqVO) { + return conversationMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java index c61af65..ba28404 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.service.inbox; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxPageReqVO; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; import jakarta.validation.Valid; /** @@ -41,7 +41,7 @@ public interface InboxService { * @param id 编号 * @return 收件箱 */ - InboxDO getInbox(Long id); + ImInboxDO getInbox(Long id); /** * 获得收件箱分页 @@ -49,6 +49,6 @@ public interface InboxService { * @param pageReqVO 分页查询 * @return 收件箱分页 */ - PageResult getInboxPage(InboxPageReqVO pageReqVO); + PageResult getInboxPage(InboxPageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java index 35d1191..350cde3 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java @@ -4,7 +4,7 @@ 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.inbox.vo.InboxPageReqVO; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -28,7 +28,7 @@ public class InboxServiceImpl implements InboxService { @Override public Long createInbox(InboxSaveReqVO createReqVO) { // 插入 - InboxDO inbox = BeanUtils.toBean(createReqVO, InboxDO.class); + ImInboxDO inbox = BeanUtils.toBean(createReqVO, ImInboxDO.class); inboxMapper.insert(inbox); // 返回 return inbox.getId(); @@ -39,7 +39,7 @@ public class InboxServiceImpl implements InboxService { // 校验存在 validateInboxExists(updateReqVO.getId()); // 更新 - InboxDO updateObj = BeanUtils.toBean(updateReqVO, InboxDO.class); + ImInboxDO updateObj = BeanUtils.toBean(updateReqVO, ImInboxDO.class); inboxMapper.updateById(updateObj); } @@ -58,12 +58,12 @@ public class InboxServiceImpl implements InboxService { } @Override - public InboxDO getInbox(Long id) { + public ImInboxDO getInbox(Long id) { return inboxMapper.selectById(id); } @Override - public PageResult getInboxPage(InboxPageReqVO pageReqVO) { + public PageResult getInboxPage(InboxPageReqVO pageReqVO) { return inboxMapper.selectPage(pageReqVO); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java new file mode 100755 index 0000000..37af3a1 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.im.service.message; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessagePageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSaveReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; +import jakarta.validation.Valid; + +/** + * 消息 Service 接口 + * + * @author 芋道源码 + */ +public interface ImMessageService { + + /** + * 创建消息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMessage(@Valid ImMessageSaveReqVO createReqVO); + + /** + * 更新消息 + * + * @param updateReqVO 更新信息 + */ + void updateMessage(@Valid ImMessageSaveReqVO updateReqVO); + + /** + * 删除消息 + * + * @param id 编号 + */ + void deleteMessage(Long id); + + /** + * 获得消息 + * + * @param id 编号 + * @return 消息 + */ + ImMessageDO getMessage(Long id); + + /** + * 获得消息分页 + * + * @param pageReqVO 分页查询 + * @return 消息分页 + */ + PageResult getMessagePage(ImMessagePageReqVO pageReqVO); + + /** + * 发送私聊消息 + * @param imMessageSaveReqVO 消息信息 + * @return 消息编号 + */ + Long sendPrivateMessage(ImMessageSaveReqVO imMessageSaveReqVO); +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java new file mode 100755 index 0000000..81ab538 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.im.service.message; + +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.message.vo.ImMessagePageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSaveReqVO; +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; +import cn.iocoder.yudao.module.im.dal.mysql.message.ImMessageMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.MESSAGE_NOT_EXISTS; + +/** + * 消息 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class ImMessageServiceImpl implements ImMessageService { + + @Resource + private ImMessageMapper imMessageMapper; + + @Override + public Long createMessage(ImMessageSaveReqVO createReqVO) { + // 插入 + ImMessageDO message = BeanUtils.toBean(createReqVO, ImMessageDO.class); + imMessageMapper.insert(message); + // 返回 + return message.getId(); + } + + @Override + public void updateMessage(ImMessageSaveReqVO updateReqVO) { + // 校验存在 + validateMessageExists(updateReqVO.getId()); + // 更新 + ImMessageDO updateObj = BeanUtils.toBean(updateReqVO, ImMessageDO.class); + imMessageMapper.updateById(updateObj); + } + + @Override + public void deleteMessage(Long id) { + // 校验存在 + validateMessageExists(id); + // 删除 + imMessageMapper.deleteById(id); + } + + private void validateMessageExists(Long id) { + if (imMessageMapper.selectById(id) == null) { + throw exception(MESSAGE_NOT_EXISTS); + } + } + + @Override + public ImMessageDO getMessage(Long id) { + return imMessageMapper.selectById(id); + } + + @Override + public PageResult getMessagePage(ImMessagePageReqVO pageReqVO) { + return imMessageMapper.selectPage(pageReqVO); + } + + @Override + public Long sendPrivateMessage(ImMessageSaveReqVO imMessageSaveReqVO) { + return 0L; + } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java deleted file mode 100755 index 5981dbd..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.yudao.module.im.service.message; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; -import jakarta.validation.Valid; - -/** - * 消息 Service 接口 - * - * @author 芋道源码 - */ -public interface MessageService { - - /** - * 创建消息 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createMessage(@Valid MessageSaveReqVO createReqVO); - - /** - * 更新消息 - * - * @param updateReqVO 更新信息 - */ - void updateMessage(@Valid MessageSaveReqVO updateReqVO); - - /** - * 删除消息 - * - * @param id 编号 - */ - void deleteMessage(Long id); - - /** - * 获得消息 - * - * @param id 编号 - * @return 消息 - */ - MessageDO getMessage(Long id); - - /** - * 获得消息分页 - * - * @param pageReqVO 分页查询 - * @return 消息分页 - */ - PageResult getMessagePage(MessagePageReqVO pageReqVO); - - /** - * 发送私聊消息 - * @param messageSaveReqVO 消息信息 - * @return 消息编号 - */ - Long sendPrivateMessage(MessageSaveReqVO messageSaveReqVO); -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java deleted file mode 100755 index 350d6c4..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.iocoder.yudao.module.im.service.message; - -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.message.vo.MessagePageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; -import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.MESSAGE_NOT_EXISTS; - -/** - * 消息 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class MessageServiceImpl implements MessageService { - - @Resource - private MessageMapper messageMapper; - - @Override - public Long createMessage(MessageSaveReqVO createReqVO) { - // 插入 - MessageDO message = BeanUtils.toBean(createReqVO, MessageDO.class); - messageMapper.insert(message); - // 返回 - return message.getId(); - } - - @Override - public void updateMessage(MessageSaveReqVO updateReqVO) { - // 校验存在 - validateMessageExists(updateReqVO.getId()); - // 更新 - MessageDO updateObj = BeanUtils.toBean(updateReqVO, MessageDO.class); - messageMapper.updateById(updateObj); - } - - @Override - public void deleteMessage(Long id) { - // 校验存在 - validateMessageExists(id); - // 删除 - messageMapper.deleteById(id); - } - - private void validateMessageExists(Long id) { - if (messageMapper.selectById(id) == null) { - throw exception(MESSAGE_NOT_EXISTS); - } - } - - @Override - public MessageDO getMessage(Long id) { - return messageMapper.selectById(id); - } - - @Override - public PageResult getMessagePage(MessagePageReqVO pageReqVO) { - return messageMapper.selectPage(pageReqVO); - } - - @Override - public Long sendPrivateMessage(MessageSaveReqVO messageSaveReqVO) { - return 0L; - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java index 0dd9bb1..b035884 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java @@ -4,9 +4,15 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener; import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender; import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSaveReqVO; import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; +import cn.iocoder.yudao.module.im.service.conversation.ImConversationService; +import cn.iocoder.yudao.module.im.service.message.ImMessageService; import cn.iocoder.yudao.module.im.websocket.message.ImReceiveMessage; import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; @@ -21,19 +27,65 @@ public class ImWebSocketMessageListener implements WebSocketMessageListener + + + + + + \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/message/MessageMapper.xml b/yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/message/MessageMapper.xml deleted file mode 100755 index 46521ed..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/message/MessageMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImplTest.java deleted file mode 100755 index a108224..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImplTest.java +++ /dev/null @@ -1,154 +0,0 @@ -package cn.iocoder.yudao.module.im.service.conversation; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; - -import jakarta.annotation.Resource; - -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; - -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.*; -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; -import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import jakarta.annotation.Resource; -import org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.*; -import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -/** - * {@link ConversationServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(ConversationServiceImpl.class) -public class ConversationServiceImplTest extends BaseDbUnitTest { - - @Resource - private ConversationServiceImpl conversationService; - - @Resource - private ConversationMapper conversationMapper; - - @Test - public void testCreateConversation_success() { - // 准备参数 - ConversationSaveReqVO createReqVO = randomPojo(ConversationSaveReqVO.class).setId(null); - - // 调用 - Long conversationId = conversationService.createConversation(createReqVO); - // 断言 - assertNotNull(conversationId); - // 校验记录的属性是否正确 - ConversationDO conversation = conversationMapper.selectById(conversationId); - assertPojoEquals(createReqVO, conversation, "id"); - } - - @Test - public void testUpdateConversation_success() { - // mock 数据 - ConversationDO dbConversation = randomPojo(ConversationDO.class); - conversationMapper.insert(dbConversation);// @Sql: 先插入出一条存在的数据 - // 准备参数 - ConversationSaveReqVO updateReqVO = randomPojo(ConversationSaveReqVO.class, o -> { - o.setId(dbConversation.getId()); // 设置更新的 ID - }); - - // 调用 - conversationService.updateConversation(updateReqVO); - // 校验是否更新正确 - ConversationDO conversation = conversationMapper.selectById(updateReqVO.getId()); // 获取最新的 - assertPojoEquals(updateReqVO, conversation); - } - - @Test - public void testUpdateConversation_notExists() { - // 准备参数 - ConversationSaveReqVO updateReqVO = randomPojo(ConversationSaveReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> conversationService.updateConversation(updateReqVO), CONVERSATION_NOT_EXISTS); - } - - @Test - public void testDeleteConversation_success() { - // mock 数据 - ConversationDO dbConversation = randomPojo(ConversationDO.class); - conversationMapper.insert(dbConversation);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbConversation.getId(); - - // 调用 - conversationService.deleteConversation(id); - // 校验数据不存在了 - assertNull(conversationMapper.selectById(id)); - } - - @Test - public void testDeleteConversation_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> conversationService.deleteConversation(id), CONVERSATION_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetConversationPage() { - // mock 数据 - ConversationDO dbConversation = randomPojo(ConversationDO.class, o -> { // 等会查询到 - o.setUserId(null); - o.setConversationType(null); - o.setTargetId(null); - o.setNo(null); - o.setPinned(null); - o.setLastReadTime(null); - o.setCreateTime(null); - }); - conversationMapper.insert(dbConversation); - // 测试 userId 不匹配 - conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setUserId(null))); - // 测试 conversationType 不匹配 - conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setConversationType(null))); - // 测试 targetId 不匹配 - conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setTargetId(null))); - // 测试 no 不匹配 - conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setNo(null))); - // 测试 pinned 不匹配 - conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setPinned(null))); - // 测试 lastReadTime 不匹配 - conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setLastReadTime(null))); - // 测试 createTime 不匹配 - conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setCreateTime(null))); - // 准备参数 - ConversationPageReqVO reqVO = new ConversationPageReqVO(); - reqVO.setUserId(null); - reqVO.setConversationType(null); - reqVO.setTargetId(null); - reqVO.setNo(null); - reqVO.setPinned(null); - reqVO.setLastReadTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = conversationService.getConversationPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbConversation, pageResult.getList().get(0)); - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImplTest.java new file mode 100755 index 0000000..9b5de48 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImplTest.java @@ -0,0 +1,147 @@ +package cn.iocoder.yudao.module.im.service.conversation; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import jakarta.annotation.Resource; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.*; +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; +import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link ImConversationServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +@Import(ImConversationServiceImpl.class) +public class ImConversationServiceImplTest extends BaseDbUnitTest { + + @Resource + private ImConversationServiceImpl conversationService; + + @Resource + private ConversationMapper conversationMapper; + + @Test + public void testCreateConversation_success() { + // 准备参数 + ImConversationSaveReqVO createReqVO = randomPojo(ImConversationSaveReqVO.class).setId(null); + + // 调用 + Long conversationId = conversationService.createConversation(createReqVO); + // 断言 + assertNotNull(conversationId); + // 校验记录的属性是否正确 + ImConversationDO conversation = conversationMapper.selectById(conversationId); + assertPojoEquals(createReqVO, conversation, "id"); + } + + @Test + public void testUpdateConversation_success() { + // mock 数据 + ImConversationDO dbConversation = randomPojo(ImConversationDO.class); + conversationMapper.insert(dbConversation);// @Sql: 先插入出一条存在的数据 + // 准备参数 + ImConversationSaveReqVO updateReqVO = randomPojo(ImConversationSaveReqVO.class, o -> { + o.setId(dbConversation.getId()); // 设置更新的 ID + }); + + // 调用 + conversationService.updateConversation(updateReqVO); + // 校验是否更新正确 + ImConversationDO conversation = conversationMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, conversation); + } + + @Test + public void testUpdateConversation_notExists() { + // 准备参数 + ImConversationSaveReqVO updateReqVO = randomPojo(ImConversationSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> conversationService.updateConversation(updateReqVO), CONVERSATION_NOT_EXISTS); + } + + @Test + public void testDeleteConversation_success() { + // mock 数据 + ImConversationDO dbConversation = randomPojo(ImConversationDO.class); + conversationMapper.insert(dbConversation);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConversation.getId(); + + // 调用 + conversationService.deleteConversation(id); + // 校验数据不存在了 + assertNull(conversationMapper.selectById(id)); + } + + @Test + public void testDeleteConversation_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> conversationService.deleteConversation(id), CONVERSATION_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetConversationPage() { + // mock 数据 + ImConversationDO dbConversation = randomPojo(ImConversationDO.class, o -> { // 等会查询到 + o.setUserId(null); + o.setConversationType(null); + o.setTargetId(null); + o.setNo(null); + o.setPinned(null); + o.setLastReadTime(null); + o.setCreateTime(null); + }); + conversationMapper.insert(dbConversation); + // 测试 userId 不匹配 + conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setUserId(null))); + // 测试 conversationType 不匹配 + conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setConversationType(null))); + // 测试 targetId 不匹配 + conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setTargetId(null))); + // 测试 no 不匹配 + conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setNo(null))); + // 测试 pinned 不匹配 + conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setPinned(null))); + // 测试 lastReadTime 不匹配 + conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setLastReadTime(null))); + // 测试 createTime 不匹配 + conversationMapper.insert(cloneIgnoreId(dbConversation, o -> o.setCreateTime(null))); + // 准备参数 + ImConversationPageReqVO reqVO = new ImConversationPageReqVO(); + reqVO.setUserId(null); + reqVO.setConversationType(null); + reqVO.setTargetId(null); + reqVO.setNo(null); + reqVO.setPinned(null); + reqVO.setLastReadTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = conversationService.getConversationPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbConversation, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java index 5df121c..229448b 100755 --- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java +++ b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java @@ -2,31 +2,24 @@ package cn.iocoder.yudao.module.im.service.inbox; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; import jakarta.annotation.Resource; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.*; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import jakarta.annotation.Resource; import org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; -import static cn.hutool.core.util.RandomUtil.*; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; /** * {@link InboxServiceImpl} 的单元测试类 @@ -52,14 +45,14 @@ public class InboxServiceImplTest extends BaseDbUnitTest { // 断言 assertNotNull(inboxId); // 校验记录的属性是否正确 - InboxDO inbox = inboxMapper.selectById(inboxId); + ImInboxDO inbox = inboxMapper.selectById(inboxId); assertPojoEquals(createReqVO, inbox, "id"); } @Test public void testUpdateInbox_success() { // mock 数据 - InboxDO dbInbox = randomPojo(InboxDO.class); + ImInboxDO dbInbox = randomPojo(ImInboxDO.class); inboxMapper.insert(dbInbox);// @Sql: 先插入出一条存在的数据 // 准备参数 InboxSaveReqVO updateReqVO = randomPojo(InboxSaveReqVO.class, o -> { @@ -69,7 +62,7 @@ public class InboxServiceImplTest extends BaseDbUnitTest { // 调用 inboxService.updateInbox(updateReqVO); // 校验是否更新正确 - InboxDO inbox = inboxMapper.selectById(updateReqVO.getId()); // 获取最新的 + ImInboxDO inbox = inboxMapper.selectById(updateReqVO.getId()); // 获取最新的 assertPojoEquals(updateReqVO, inbox); } @@ -85,7 +78,7 @@ public class InboxServiceImplTest extends BaseDbUnitTest { @Test public void testDeleteInbox_success() { // mock 数据 - InboxDO dbInbox = randomPojo(InboxDO.class); + ImInboxDO dbInbox = randomPojo(ImInboxDO.class); inboxMapper.insert(dbInbox);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbInbox.getId(); @@ -109,7 +102,7 @@ public class InboxServiceImplTest extends BaseDbUnitTest { @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 public void testGetInboxPage() { // mock 数据 - InboxDO dbInbox = randomPojo(InboxDO.class, o -> { // 等会查询到 + ImInboxDO dbInbox = randomPojo(ImInboxDO.class, o -> { // 等会查询到 o.setUserId(null); o.setMessageId(null); o.setSequence(null); @@ -132,7 +125,7 @@ public class InboxServiceImplTest extends BaseDbUnitTest { reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); // 调用 - PageResult pageResult = inboxService.getInboxPage(reqVO); + PageResult pageResult = inboxService.getInboxPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImplTest.java new file mode 100755 index 0000000..cfd13e5 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImplTest.java @@ -0,0 +1,167 @@ +package cn.iocoder.yudao.module.im.service.message; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import jakarta.annotation.Resource; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.im.controller.admin.message.vo.*; +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; +import cn.iocoder.yudao.module.im.dal.mysql.message.ImMessageMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link ImMessageServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +@Import(ImMessageServiceImpl.class) +public class ImMessageServiceImplTest extends BaseDbUnitTest { + + @Resource + private ImMessageServiceImpl messageService; + + @Resource + private ImMessageMapper imMessageMapper; + + @Test + public void testCreateMessage_success() { + // 准备参数 + ImMessageSaveReqVO createReqVO = randomPojo(ImMessageSaveReqVO.class).setId(null); + + // 调用 + Long messageId = messageService.createMessage(createReqVO); + // 断言 + assertNotNull(messageId); + // 校验记录的属性是否正确 + ImMessageDO message = imMessageMapper.selectById(messageId); + assertPojoEquals(createReqVO, message, "id"); + } + + @Test + public void testUpdateMessage_success() { + // mock 数据 + ImMessageDO dbMessage = randomPojo(ImMessageDO.class); + imMessageMapper.insert(dbMessage);// @Sql: 先插入出一条存在的数据 + // 准备参数 + ImMessageSaveReqVO updateReqVO = randomPojo(ImMessageSaveReqVO.class, o -> { + o.setId(dbMessage.getId()); // 设置更新的 ID + }); + + // 调用 + messageService.updateMessage(updateReqVO); + // 校验是否更新正确 + ImMessageDO message = imMessageMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, message); + } + + @Test + public void testUpdateMessage_notExists() { + // 准备参数 + ImMessageSaveReqVO updateReqVO = randomPojo(ImMessageSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> messageService.updateMessage(updateReqVO), MESSAGE_NOT_EXISTS); + } + + @Test + public void testDeleteMessage_success() { + // mock 数据 + ImMessageDO dbMessage = randomPojo(ImMessageDO.class); + imMessageMapper.insert(dbMessage);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbMessage.getId(); + + // 调用 + messageService.deleteMessage(id); + // 校验数据不存在了 + assertNull(imMessageMapper.selectById(id)); + } + + @Test + public void testDeleteMessage_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> messageService.deleteMessage(id), MESSAGE_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetMessagePage() { + // mock 数据 + ImMessageDO dbMessage = randomPojo(ImMessageDO.class, o -> { // 等会查询到 + o.setClientMessageId(null); + o.setSenderId(null); + o.setReceiverId(null); + o.setSenderNickname(null); + o.setSenderAvatar(null); + o.setConversationType(null); + o.setConversationNo(null); + o.setContentType(null); + o.setContent(null); + o.setSendTime(null); + o.setSendFrom(null); + o.setCreateTime(null); + }); + imMessageMapper.insert(dbMessage); + // 测试 clientMessageId 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setClientMessageId(null))); + // 测试 senderId 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSenderId(null))); + // 测试 receiverId 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setReceiverId(null))); + // 测试 senderNickname 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSenderNickname(null))); + // 测试 senderAvatar 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSenderAvatar(null))); + // 测试 conversationType 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setConversationType(null))); + // 测试 conversationNo 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setConversationNo(null))); + // 测试 contentType 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setContentType(null))); + // 测试 content 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setContent(null))); + // 测试 sendTime 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSendTime(null))); + // 测试 sendFrom 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSendFrom(null))); + // 测试 createTime 不匹配 + imMessageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setCreateTime(null))); + // 准备参数 + ImMessagePageReqVO reqVO = new ImMessagePageReqVO(); + reqVO.setClientMessageId(null); + reqVO.setSenderId(null); + reqVO.setReceiverId(null); + reqVO.setSenderNickname(null); + reqVO.setSenderAvatar(null); + reqVO.setConversationType(null); + reqVO.setConversationNo(null); + reqVO.setContentType(null); + reqVO.setContent(null); + reqVO.setSendTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + reqVO.setSendFrom(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = messageService.getMessagePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbMessage, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImplTest.java deleted file mode 100755 index 22713bd..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImplTest.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.iocoder.yudao.module.im.service.message; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; - -import jakarta.annotation.Resource; - -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; - -import cn.iocoder.yudao.module.im.controller.admin.message.vo.*; -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; -import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import jakarta.annotation.Resource; -import org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.*; -import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -/** - * {@link MessageServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(MessageServiceImpl.class) -public class MessageServiceImplTest extends BaseDbUnitTest { - - @Resource - private MessageServiceImpl messageService; - - @Resource - private MessageMapper messageMapper; - - @Test - public void testCreateMessage_success() { - // 准备参数 - MessageSaveReqVO createReqVO = randomPojo(MessageSaveReqVO.class).setId(null); - - // 调用 - Long messageId = messageService.createMessage(createReqVO); - // 断言 - assertNotNull(messageId); - // 校验记录的属性是否正确 - MessageDO message = messageMapper.selectById(messageId); - assertPojoEquals(createReqVO, message, "id"); - } - - @Test - public void testUpdateMessage_success() { - // mock 数据 - MessageDO dbMessage = randomPojo(MessageDO.class); - messageMapper.insert(dbMessage);// @Sql: 先插入出一条存在的数据 - // 准备参数 - MessageSaveReqVO updateReqVO = randomPojo(MessageSaveReqVO.class, o -> { - o.setId(dbMessage.getId()); // 设置更新的 ID - }); - - // 调用 - messageService.updateMessage(updateReqVO); - // 校验是否更新正确 - MessageDO message = messageMapper.selectById(updateReqVO.getId()); // 获取最新的 - assertPojoEquals(updateReqVO, message); - } - - @Test - public void testUpdateMessage_notExists() { - // 准备参数 - MessageSaveReqVO updateReqVO = randomPojo(MessageSaveReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> messageService.updateMessage(updateReqVO), MESSAGE_NOT_EXISTS); - } - - @Test - public void testDeleteMessage_success() { - // mock 数据 - MessageDO dbMessage = randomPojo(MessageDO.class); - messageMapper.insert(dbMessage);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbMessage.getId(); - - // 调用 - messageService.deleteMessage(id); - // 校验数据不存在了 - assertNull(messageMapper.selectById(id)); - } - - @Test - public void testDeleteMessage_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> messageService.deleteMessage(id), MESSAGE_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetMessagePage() { - // mock 数据 - MessageDO dbMessage = randomPojo(MessageDO.class, o -> { // 等会查询到 - o.setClientMessageId(null); - o.setSenderId(null); - o.setReceiverId(null); - o.setSenderNickname(null); - o.setSenderAvatar(null); - o.setConversationType(null); - o.setConversationNo(null); - o.setContentType(null); - o.setContent(null); - o.setSendTime(null); - o.setSendFrom(null); - o.setCreateTime(null); - }); - messageMapper.insert(dbMessage); - // 测试 clientMessageId 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setClientMessageId(null))); - // 测试 senderId 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSenderId(null))); - // 测试 receiverId 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setReceiverId(null))); - // 测试 senderNickname 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSenderNickname(null))); - // 测试 senderAvatar 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSenderAvatar(null))); - // 测试 conversationType 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setConversationType(null))); - // 测试 conversationNo 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setConversationNo(null))); - // 测试 contentType 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setContentType(null))); - // 测试 content 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setContent(null))); - // 测试 sendTime 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSendTime(null))); - // 测试 sendFrom 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setSendFrom(null))); - // 测试 createTime 不匹配 - messageMapper.insert(cloneIgnoreId(dbMessage, o -> o.setCreateTime(null))); - // 准备参数 - MessagePageReqVO reqVO = new MessagePageReqVO(); - reqVO.setClientMessageId(null); - reqVO.setSenderId(null); - reqVO.setReceiverId(null); - reqVO.setSenderNickname(null); - reqVO.setSenderAvatar(null); - reqVO.setConversationType(null); - reqVO.setConversationNo(null); - reqVO.setContentType(null); - reqVO.setContent(null); - reqVO.setSendTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - reqVO.setSendFrom(null); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = messageService.getMessagePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbMessage, pageResult.getList().get(0)); - } - -} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java index ac13c3a..7eab4fa 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java @@ -41,4 +41,9 @@ public class AdminUserRespDTO { */ private String mobile; + /** + * 用户头像 + */ + private String avatar; + } diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index e293460..76f8b3b 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -47,14 +47,14 @@ spring: datasource: master: name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://chaojiniu.top:23306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 # url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例 - username: root - password: 123456 + username: ruoyi-vue-pro + password: ruoyi-@h2ju02hebp # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # username: SYSDBA # DM 连接的示例 @@ -62,23 +62,23 @@ spring: slave: # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro lazy: true # 开启懒加载,保证启动速度 - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://chaojiniu.top:23306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 - username: root - password: 123456 + username: ruoyi-vue-pro + password: ruoyi-@h2ju02hebp # username: sa # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 data: redis: - host: 127.0.0.1 # 地址 + host: chaojiniu.top # 地址 port: 6379 # 端口 database: 0 # 数据库索引 -# password: dev # 密码,建议生产环境开启 + password: fsknKD7UvQYZsyf2hXXn # 密码,建议生产环境开启 --- #################### 定时任务相关配置 #################### diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index fd61e0c..ed3f827 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -185,7 +185,7 @@ yudao: - cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants - cn.iocoder.yudao.module.im.enums.ErrorCodeConstants tenant: # 多租户相关配置项 - enable: true + enable: false ignore-urls: - /admin-api/system/tenant/get-id-by-name # 基于名字获取租户,不许带租户编号 - /admin-api/system/tenant/get-by-website # 基于域名获取租户,不许带租户编号 -- libgit2 0.21.4