Commit 012dc01182366e3b78911bef22620360d2c23a94

Authored by YunaiV
1 parent f360040a

✨ feat(im): 初始化群名片 v0.1:第一次评审

sql/mysql/im/alter_message_content_8192.sql 0 → 100644
  1 +-- 消息表 content 列长度与 MESSAGE_CONTENT_MAX_LENGTH 保持一致
  2 +
  3 +ALTER TABLE `im_private_message` MODIFY COLUMN `content` varchar(8192) DEFAULT NULL COMMENT '消息内容,JSON 格式';
  4 +ALTER TABLE `im_group_message` MODIFY COLUMN `content` varchar(8192) DEFAULT NULL COMMENT '消息内容,JSON 格式';
... ...
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&lt;Integer&gt; {
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 &quot;im_private_message&quot; (
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 &quot;im_group_message&quot; (
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 '定向接收用户编号列表',
... ...