Browse Source

im:提交部分 API 接口的 vo

YunaiV 1 year ago
parent
commit
0a4683deca
22 changed files with 370 additions and 21 deletions
  1. 27 0
      yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java
  2. 37 0
      yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java
  3. 0 5
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/ImController.http
  4. 0 16
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/ImController.java
  5. 15 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
  6. 31 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java
  7. 15 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
  8. 32 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java
  9. 24 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
  10. 7 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java
  11. 27 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImAudioMessageBody.java
  12. 27 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImFileMessageBody.java
  13. 26 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImImageMessageBody.java
  14. 28 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImLocationMessageBody.java
  15. 7 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImMessageBody.java
  16. 18 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImTextMessageBody.java
  17. 27 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImVideoMessageBody.java
  18. 4 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/package-info.java
  19. 4 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/package-info.java
  20. 9 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/package-info.java
  21. 4 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/package-info.java
  22. 1 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/package-info.java

+ 27 - 0
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.im.enums.conversation;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * IM 会话的类型枚举
+ *
+ * @author 芋道源码
+ */
+@Getter
+@AllArgsConstructor
+public enum ImConversationTypeEnum {
+
+    PRIVATE(1, "单聊"),
+    GROUP(2, "群聊");
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+    /**
+     * 名字
+     */
+    private final String name;
+
+}

+ 37 - 0
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.im.enums.message;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * IM 消息的类型枚举
+ *
+ * 参考 <a href="https://doc.yunxin.163.com/messaging/docs/zg3NzA3NTA?platform=web#消息类型">“消息类型”</a> 文档
+ *
+ * @author 芋道源码
+ */
+@Getter
+@AllArgsConstructor
+public enum ImMessageTypeEnum {
+
+    TEXT(1, "文本"), // 消息内容为普通文本
+    IMAGE(2, "图片"), // 消息内容为图片 URL 地址、尺寸、图片大小等信息
+    AUDIO(3, "语音"), // 消息内容为语音文件的 URL 地址、时长、大小、格式等信息
+    VIDEO(4, "视频"), // 消息内容为视频文件的 URL 地址、时长、大小、格式等信息
+    FILE(5, "文件"), // 消息内容为文件的 URL 地址、大小、格式等信息
+    LOCATION(6, "地理位置"), // 消息内容为地理位置标题、经度、纬度信息
+    // TODO @芋艿:下面两种,貌似企业微信设计的更好:https://developer.work.weixin.qq.com/document/path/90240
+    TIP(7, "提示"), // 又叫做 Tip 消息,没有推送和通知栏提醒,主要用于会话内的通知提醒,例如进入会话时出现的欢迎消息,或是会话过程中命中敏感词后的提示消息等场景
+    NOTIFICATION(8, "通知"), // 主要用于群组、聊天室和超大群的事件通知,由服务端下发,客户端无法发送事件通知消息。通知类消息有在线、离线、漫游机制;没有通知栏提醒
+    ;
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+    /**
+     * 名字
+     */
+    private final String name;
+
+}

+ 0 - 5
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/ImController.http

@@ -1,5 +0,0 @@
-### 请求 /bpm/oa/leave/create 接口 => 成功
-GET {{baseUrl}}/im/hello/echo
-Content-Type: application/json
-tenant-id: 1
-Authorization: Bearer {{token}}

+ 0 - 16
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/ImController.java

@@ -1,16 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/im/hello")
-public class ImController {
-
-    @GetMapping("/echo")
-    public String echo() {
-        return "success";
-    }
-
-}

+ 15 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.im.controller.admin.conversation;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Tag(name = "管理后台 - IM 会话")
+@RestController
+@RequestMapping("/im/conversation")
+@Validated
+@Slf4j
+public class ImConversationController {
+}

+ 31 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
+
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 会话 Response VO")
+@Data
+public class ImConversationRespVO {
+
+    @Schema(description = "会话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long id;
+
+    @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer type; // 对应 ImConversationTypeEnum 枚举
+
+    @Schema(description = "聊天对象,用户编号或群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    private Long toId; // 根据 type 区分
+
+    @Schema(description = "会话的最后一条消息", requiredMode = Schema.RequiredMode.REQUIRED)
+    private ImMessageRespVO lastMessage;
+
+    // TODO 芋艿:还有如下字段
+//    updateTime: 会话更新的时间
+//    unread: 未读数
+//    msgReceiptTime: 消息已读回执时间戳, 如果有此字段, 说明此时间戳之前的所有消息对方均已读
+
+}
+
+
+

+ 15 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.im.controller.admin.message;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Tag(name = "管理后台 - IM 聊天")
+@RestController
+@RequestMapping("/im/message")
+@Validated
+@Slf4j
+public class ImMessageController {
+}

+ 32 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.im.controller.admin.message.vo;
+
+import cn.iocoder.yudao.module.im.dal.dataobject.message.body.ImMessageBody;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 消息 Response VO")
+@Data
+public class ImMessageRespVO {
+
+    @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long id;
+
+    @Schema(description = "发送人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long fromId;
+
+    @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer type; // 参见 ImMessageTypeEnum 枚举
+
+    @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
+    private ImMessageBody body;
+
+    @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+    // TODO 芋艿:网易有这 2 字段?看着存储需要,vo 不需要 https://doc.yunxin.163.com/messaging/docs/DE0MTk0OTY?platform=server
+//    "fromclienttype": 2, //1:android、2:iOS、4:PC、16:WEB、32:REST、64:MAC
+//    "msgidclient": "3bfd9660665a14bce4ec95e1b1d3afed",
+
+}

+ 24 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.im.controller.admin.message.vo;
+
+import cn.iocoder.yudao.module.im.dal.dataobject.message.body.ImMessageBody;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+// TODO 关联 https://doc.yunxin.163.com/messaging/docs/DQ2NTg4ODE?platform=server
+@Schema(description = "管理后台 - 消息发送 Request VO")
+@Data
+public class ImMessageSendReqVO {
+
+    @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer conversationType; // 对应 ImConversationTypeEnum 枚举
+
+    @Schema(description = "聊天对象,用户编号或群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long toId;  // 根据 conversationType 区分
+
+    @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer type; // 参见 ImMessageTypeEnum 枚举
+
+    @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
+    private ImMessageBody body;
+
+}

+ 7 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java

@@ -0,0 +1,7 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message;
+
+/**
+ * TODO 芋艿,要去看看怎么存储 bod
+ */
+public class ImMessageDO {
+}

+ 27 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImAudioMessageBody.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message.body;
+
+import lombok.Data;
+
+/**
+ * 语音消息的 {@link ImMessageBody}
+ *
+ * @author 芋道源码
+ */
+@Data
+public class ImAudioMessageBody implements ImMessageBody {
+
+    /**
+     * 语音 URL
+     */
+    private String url;
+    /**
+     * 语音格式,例如说 arm、mp3、speex 等
+     */
+    private String format;
+
+    // TODO 芋艿:要不要以下字段?待定;云信有、企业微信没有
+//"dur":4551,		//语音持续时长ms
+//        "md5":"87b94a090dec5c58f242b7132a530a01",	//语音文件的md5值,按照字节流加密
+//        "size":16420		//语音文件大小,单位为字节(Byte)
+
+}

+ 27 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImFileMessageBody.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message.body;
+
+import lombok.Data;
+
+/**
+ * 文件消息的 {@link ImMessageBody}
+ *
+ * @author 芋道源码
+ */
+@Data
+public class ImFileMessageBody implements ImMessageBody {
+
+    /**
+     * 文件名
+     */
+    private String name;
+    /**
+     * 文件 URL
+     */
+    private String url;
+
+    // TODO 芋艿:要不要以下字段?待定;云信有、企业微信没有
+//  "md5":"79d62a35fa3d34c367b20c66afc2a500", //文件MD5,按照字节流加密
+//  "ext":"ttf",	//文件后缀类型
+//  "size":91680	//大小,单位为字节(Byte)
+
+}

+ 26 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImImageMessageBody.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message.body;
+
+import lombok.Data;
+
+/**
+ * 图片消息的 {@link ImMessageBody}
+ *
+ * @author 芋道源码
+ */
+@Data
+public class ImImageMessageBody implements ImMessageBody {
+
+    /**
+     * 图片地址
+     */
+    private String url;
+
+    // TODO 芋艿:要不要以下字段?待定;云信有、企业微信没有
+//    "name":"图片发送于2015-05-07 13:59",   //图片name
+//            "md5":"9894907e4ad9de4678091277509361f7",	//图片文件md5,按照字节流加密
+//            "ext":"jpg",	//图片后缀
+//            "w":6814,	//宽,单位为像素
+//            "h":2332,	//高,单位为像素
+//            "size":388245	//图片文件大小,单位为字节(Byte)
+
+}

+ 28 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImLocationMessageBody.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message.body;
+
+import lombok.Data;
+
+/**
+ * 地址位置消息的 {@link ImMessageBody}
+ *
+ * @author 芋道源码
+ */
+@Data
+public class ImLocationMessageBody implements ImMessageBody {
+
+    /**
+     * 地理位置
+     *
+     * 例如说:中国 浙江省 杭州市 网商路 599号
+     */
+    private String address;
+    /**
+     * 经度
+     */
+    private Double longitude;
+    /**
+     * 纬度
+     */
+    private Double latitude;
+
+}

+ 7 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImMessageBody.java

@@ -0,0 +1,7 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message.body;
+
+/**
+ * IM 消息的 body 内容
+ */
+public interface ImMessageBody {
+}

+ 18 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImTextMessageBody.java

@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message.body;
+
+import lombok.Data;
+
+/**
+ * 文本消息的 {@link ImMessageBody}
+ *
+ * @author 芋道源码
+ */
+@Data
+public class ImTextMessageBody implements ImMessageBody {
+
+    /**
+     * 文本消息内容
+     */
+    private String content;
+
+}

+ 27 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/body/ImVideoMessageBody.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message.body;
+
+import lombok.Data;
+
+/**
+ * 视频消息的 {@link ImMessageBody}
+ *
+ * @author 芋道源码
+ */
+@Data
+public class ImVideoMessageBody implements ImMessageBody {
+
+    /**
+     * 视频地址
+     */
+    private String url;
+
+    // TODO 芋艿:要不要以下字段?待定;云信有、企业微信没有
+//  "dur":8003,		//视频持续时长ms
+//          "md5":"da2cef3e5663ee9c3547ef5d127f7e3e",	//视频文件的md5值,按照字节流加密
+//          "w":360,	//宽,单位为像素
+//          "h":480,	//高,单位为像素
+//          "size":16420	//视频文件大小,单位为字节(Byte)】
+//      "ext":"mp4",	//视频格式
+
+
+}

+ 4 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * TODO 占位符
+ */
+package cn.iocoder.yudao.module.im.dal.dataobject;

+ 4 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * TODO 占位符
+ */
+package cn.iocoder.yudao.module.im.dal.mysql;

+ 9 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/package-info.java

@@ -0,0 +1,9 @@
+/**
+ * DAL = Data Access Layer 数据访问层
+ * 1. data object:数据对象
+ * 2. redis:Redis 的 CRUD 操作
+ * 3. mysql:MySQL 的 CRUD 操作
+ *
+ * 其中,MySQL 的表以 im_ 作为前缀
+ */
+package cn.iocoder.yudao.module.im.dal;

+ 4 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * TODO 占位符
+ */
+package cn.iocoder.yudao.module.im.dal.redis;

+ 1 - 0
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/package-info.java

@@ -0,0 +1 @@
+package cn.iocoder.yudao.module.im.service;