Commit 012dc01182366e3b78911bef22620360d2c23a94
1 parent
f360040a
✨ feat(im): 初始化群名片 v0.1:第一次评审
Showing
6 changed files
with
146 additions
and
9 deletions
sql/mysql/im/alter_message_content_8192.sql
0 → 100644
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImConversationTypeEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.im.enums; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.core.ArrayValuable; | |
| 4 | +import lombok.Getter; | |
| 5 | +import lombok.RequiredArgsConstructor; | |
| 6 | + | |
| 7 | +import java.util.Arrays; | |
| 8 | +import java.util.Objects; | |
| 9 | + | |
| 10 | +/** | |
| 11 | + * IM 会话类型枚举 | |
| 12 | + * | |
| 13 | + * @author 芋道源码 | |
| 14 | + */ | |
| 15 | +@RequiredArgsConstructor | |
| 16 | +@Getter | |
| 17 | +public enum ImConversationTypeEnum implements ArrayValuable<Integer> { | |
| 18 | + | |
| 19 | + PRIVATE(1, "私聊"), // 私聊 | |
| 20 | + GROUP(2, "群聊"); // 群聊 | |
| 21 | + | |
| 22 | + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImConversationTypeEnum::getType).toArray(Integer[]::new); | |
| 23 | + | |
| 24 | + /** | |
| 25 | + * 类型 | |
| 26 | + */ | |
| 27 | + private final Integer type; | |
| 28 | + /** | |
| 29 | + * 名字 | |
| 30 | + */ | |
| 31 | + private final String name; | |
| 32 | + | |
| 33 | + @Override | |
| 34 | + public Integer[] array() { | |
| 35 | + return ARRAYS; | |
| 36 | + } | |
| 37 | + | |
| 38 | + public static boolean isPrivate(Integer type) { | |
| 39 | + return Objects.equals(PRIVATE.type, type); | |
| 40 | + } | |
| 41 | + | |
| 42 | + public static boolean isGroup(Integer type) { | |
| 43 | + return Objects.equals(GROUP.type, type); | |
| 44 | + } | |
| 45 | + | |
| 46 | +} | ... | ... |
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java
| ... | ... | @@ -44,9 +44,14 @@ public enum ImMessageTypeEnum implements ArrayValuable<Integer> { |
| 44 | 44 | */ |
| 45 | 45 | FILE(105, "文件", true, true), |
| 46 | 46 | /** |
| 47 | - * 对应 OpenIM:Card 108 | |
| 47 | + * 对应 OpenIM:Merger 107 | |
| 48 | + * 对应自己的类:MergeMessage | |
| 49 | + */ | |
| 50 | + MERGE(107, "合并转发", true, true), | |
| 51 | + /** | |
| 52 | + * 对应 OpenIM:Card 108(OpenIM 仅用户名片;本系统扩展为用户 / 群双类型,按 targetType 区分) | |
| 48 | 53 | * 对应自己的类:CardMessage |
| 49 | - * 场景:把好友名片推荐给其他会话,对端点击名片可打开 UserInfoCard | |
| 54 | + * 场景:把用户名片 / 群名片推荐给其他会话;用户名片点击打开 UserInfoCard,群名片点击「已加群跳会话 / 未加群弹申请加群」 | |
| 50 | 55 | */ |
| 51 | 56 | CARD(108, "名片", true, true), |
| 52 | 57 | /** | ... | ... |
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/CardMessage.java
| 1 | 1 | package cn.iocoder.yudao.module.im.service.websocket.dto.message; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | +import cn.iocoder.yudao.module.im.enums.ImConversationTypeEnum; | |
| 5 | +import jakarta.validation.constraints.NotBlank; | |
| 6 | +import jakarta.validation.constraints.NotNull; | |
| 3 | 7 | import lombok.Data; |
| 4 | 8 | |
| 5 | 9 | /** |
| 6 | 10 | * 名片消息内容 |
| 11 | + * <p> | |
| 12 | + * 支持两类名片,按 targetType 区分: | |
| 13 | + * 1. 用户名片(targetType = PRIVATE):targetId = 用户编号,name = 用户昵称 | |
| 14 | + * 2. 群名片(targetType = GROUP):targetId = 群编号,name = 群名,可带 memberCount | |
| 7 | 15 | */ |
| 8 | 16 | @Data |
| 9 | 17 | public class CardMessage { |
| 10 | 18 | |
| 11 | 19 | /** |
| 12 | - * 用户编号 | |
| 20 | + * 名片对象类型 | |
| 21 | + * <p> | |
| 22 | + * 枚举 {@link ImConversationTypeEnum} | |
| 13 | 23 | */ |
| 14 | - private Long userId; | |
| 24 | + private Integer targetType; | |
| 15 | 25 | /** |
| 16 | - * 用户昵称 | |
| 26 | + * 目标对象编号:PRIVATE 时 = 用户编号;GROUP 时 = 群编号 | |
| 17 | 27 | */ |
| 18 | - private String nickname; | |
| 28 | + private Long targetId; | |
| 19 | 29 | /** |
| 20 | - * 用户头像 | |
| 30 | + * 显示名快照:PRIVATE 时 = 用户昵称;GROUP 时 = 群名 | |
| 31 | + */ | |
| 32 | + private String name; | |
| 33 | + /** | |
| 34 | + * 头像(快照) | |
| 21 | 35 | */ |
| 22 | 36 | private String avatar; |
| 37 | + /** | |
| 38 | + * 群成员数(仅 targetType = GROUP;接收端展示「N 人群聊」) | |
| 39 | + */ | |
| 40 | + private Integer memberCount; | |
| 23 | 41 | |
| 24 | 42 | /** |
| 25 | 43 | * 引用消息(可选) | ... | ... |
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/MergeMessage.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.im.service.websocket.dto.message; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.im.enums.message.ImMessageTypeEnum; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +import java.util.List; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * 合并转发消息内容 | |
| 10 | + * <p> | |
| 11 | + * payload 内嵌完整快照,原消息撤回 / 删除不影响已转发的合并消息 | |
| 12 | + */ | |
| 13 | +@Data | |
| 14 | +public class MergeMessage { | |
| 15 | + | |
| 16 | + /** | |
| 17 | + * 合并标题 | |
| 18 | + */ | |
| 19 | + private String title; | |
| 20 | + /** | |
| 21 | + * 内嵌的完整消息快照 | |
| 22 | + */ | |
| 23 | + private List<Item> messages; | |
| 24 | + | |
| 25 | + /** | |
| 26 | + * 单条内嵌消息快照 | |
| 27 | + */ | |
| 28 | + @Data | |
| 29 | + public static class Item { | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * 原消息编号 | |
| 33 | + */ | |
| 34 | + private Long messageId; | |
| 35 | + /** | |
| 36 | + * 发送人编号 | |
| 37 | + */ | |
| 38 | + private Long senderId; | |
| 39 | + /** | |
| 40 | + * 发送人昵称快照;接收方可能不在原会话里,无法实时查到 | |
| 41 | + */ | |
| 42 | + private String senderNickname; | |
| 43 | + /** | |
| 44 | + * 发送人头像快照 | |
| 45 | + */ | |
| 46 | + private String senderAvatar; | |
| 47 | + /** | |
| 48 | + * 消息类型 | |
| 49 | + * <p> | |
| 50 | + * 枚举 {@link ImMessageTypeEnum} | |
| 51 | + */ | |
| 52 | + private Integer type; | |
| 53 | + /** | |
| 54 | + * 原消息 content(JSON) | |
| 55 | + */ | |
| 56 | + private String content; | |
| 57 | + /** | |
| 58 | + * 发送时间戳(毫秒) | |
| 59 | + */ | |
| 60 | + private Long sendTime; | |
| 61 | + | |
| 62 | + } | |
| 63 | + | |
| 64 | +} | ... | ... |
yudao-module-im/src/test/resources/sql/create_tables.sql
| ... | ... | @@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS "im_private_message" ( |
| 4 | 4 | "sender_id" bigint NOT NULL COMMENT '发送人编号', |
| 5 | 5 | "receiver_id" bigint NOT NULL COMMENT '接收人编号', |
| 6 | 6 | "type" smallint NOT NULL COMMENT '消息类型', |
| 7 | - "content" varchar(4096) DEFAULT NULL COMMENT '消息内容', | |
| 7 | + "content" varchar(8192) DEFAULT NULL COMMENT '消息内容', | |
| 8 | 8 | "status" tinyint NOT NULL COMMENT '消息状态', |
| 9 | 9 | "send_time" timestamp NOT NULL COMMENT '发送时间', |
| 10 | 10 | "creator" varchar(64) DEFAULT '', |
| ... | ... | @@ -22,7 +22,7 @@ CREATE TABLE IF NOT EXISTS "im_group_message" ( |
| 22 | 22 | "sender_id" bigint NOT NULL COMMENT '发送人编号', |
| 23 | 23 | "group_id" bigint NOT NULL COMMENT '群编号', |
| 24 | 24 | "type" smallint NOT NULL COMMENT '消息类型', |
| 25 | - "content" varchar(4096) DEFAULT NULL COMMENT '消息内容', | |
| 25 | + "content" varchar(8192) DEFAULT NULL COMMENT '消息内容', | |
| 26 | 26 | "status" tinyint NOT NULL COMMENT '消息状态', |
| 27 | 27 | "send_time" timestamp NOT NULL COMMENT '发送时间', |
| 28 | 28 | "receiver_user_ids" varchar(1024) DEFAULT NULL COMMENT '定向接收用户编号列表', | ... | ... |