表结构:
CREATE TABLE `t_chat_record` (
`id` bigint(20) NOT NULL,
`send_user_id` bigint(20) DEFAULT NULL COMMENT '发送人',
`receive_user_id` bigint(20) DEFAULT NULL COMMENT '接收人',
`msg_type` char(1) DEFAULT '0' COMMENT '消息类型:0:文字 1:图片',
`msg_content` text DEFAULT NULL COMMENT '消息内容',
`send_user_readed` char(1) DEFAULT '0' COMMENT '是否已读:0:未读 1:已读',
`receive_user_readed` char(1) DEFAULT '0' COMMENT '是否已读:0:未读 1:已读',
`del_flag` char(1) DEFAULT '0' COMMENT '逻辑删除0:未删除 2:已删除',
`create_by` varchar(255) DEFAULT '' COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(255) DEFAULT '' COMMENT '更新人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='聊天记录表';
CREATE TABLE `chat_user_relate` (
`id` bigint(20) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
`relate_user_id` bigint(20) DEFAULT NULL COMMENT '对话用户id',
`user_no_read` bigint(20) DEFAULT 0 COMMENT '用户未读聊天用户发消息的数量',
`last_msg_type` char(1) DEFAULT '' COMMENT '最新消息类型',
`last_msg_content` text DEFAULT NULL COMMENT '最新消息内容',
`last_msg_time` datetime DEFAULT NULL COMMENT '最新消息发送时间',
`del_flag` char(1) DEFAULT '0' COMMENT '逻辑删除0:未删除 2:已删除',
`create_by` varchar(255) DEFAULT '' COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(255) DEFAULT '' COMMENT '更新人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT="用户的聊天用户关系表';
聊天逻辑:
/**
* 新增聊天记录
*
* @param chatRecord 聊天记录
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int insertChatRecord(ChatRecord chatRecord) {
MsgBody msgBody = new MsgBody();
if (StrUtil.isNotBlank(chatRecord.getMsgType())) {
if (chatRecord.getMsgType().equals(MsgTypeEnum.TEXT.getMsgType())) {
msgBody.setMsgType(MsgBody.MsgType.text);
} else if (chatRecord.getMsgType().equals(MsgTypeEnum.IMG.getMsgType())) {
msgBody.setMsgType(MsgBody.MsgType.img);
if (chatRecord.getMsgContent().contains("base64")){
MultipartFile file = FileUtils.base64ToMultipartFile(chatRecord.getMsgContent());
try {
if(file != null){
// 上传文件路径
String filePath = SpringAutumnComeBlogConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName" , fileName);
msgBody.setMsgContent(String.valueOf(ajax.get("fileName")));
chatRecord.setMsgContent(String.valueOf(ajax.get("fileName")));
}
} catch (Exception e) {
}
}
}
}
msgBody.setMsgContent(chatRecord.getMsgContent());
chatRecord.setMsgContent(chatRecord.getMsgContent());
chatRecord.setId(IdUtils.getLongId());
chatRecord.setCreateTime(DateUtils.getNowDate());
msgBody.setCreateTime(chatRecord.getCreateTime());
int insert = chatRecordMapper.insertChatRecord(chatRecord);
//记录用户聊天用户关系表.方面后面查询
//发送方的聊天用户列表逻辑
ChatUserRelate chatUserRelate = chatUserRelateService.getOne(new LambdaQueryWrapper()
.eq(ChatUserRelate::getUserId, chatRecord.getSendUserId())
.eq(ChatUserRelate::getRelateUserId, chatRecord.getReceiveUserId()));
if (chatUserRelate != null) {
chatUserRelate.setLastMsgContent(chatRecord.getMsgContent());
chatUserRelate.setLastMsgType(chatRecord.getMsgType());
chatUserRelate.setLastMsgTime(chatRecord.getCreateTime());
chatUserRelate.setUpdateTime(new Date());
chatUserRelate.setUpdateBy(chatRecord.getSendUserId().toString());
insert = chatUserRelateService.updateChatUserRelate(chatUserRelate);
} else {
ChatUserRelate chatUserRelateNew = new ChatUserRelate();
chatUserRelateNew.setUserId(chatRecord.getSendUserId());
chatUserRelateNew.setRelateUserId(chatRecord.getReceiveUserId());
chatUserRelateNew.setLastMsgContent(chatRecord.getMsgContent());
chatUserRelateNew.setLastMsgType(chatRecord.getMsgType());
chatUserRelateNew.setLastMsgTime(chatRecord.getCreateTime());
chatUserRelateNew.setCreateTime(new Date());
chatUserRelateNew.setCreateBy(chatRecord.getSendUserId().toString());
insert = chatUserRelateService.insertChatUserRelate(chatUserRelateNew);
}
//接收方的聊天用户列表逻辑
ChatUserRelate chatUserRelate2 = chatUserRelateService.getOne(new LambdaQueryWrapper()
.eq(ChatUserRelate::getUserId, chatRecord.getReceiveUserId())
.eq(ChatUserRelate::getRelateUserId, chatRecord.getSendUserId()));
if (chatUserRelate2 != null) {
chatUserRelate2.setLastMsgContent(chatRecord.getMsgContent());
chatUserRelate2.setLastMsgType(chatRecord.getMsgType());
chatUserRelate2.setLastMsgTime(chatRecord.getCreateTime());
chatUserRelate2.setUpdateTime(new Date());
chatUserRelate2.setUpdateBy(chatRecord.getSendUserId().toString());
long count = chatRecordMapper.selectCount(new LambdaQueryWrapper()
.select(ChatRecord::getId)
.eq(ChatRecord::getSendUserId, chatRecord.getSendUserId())
.eq(ChatRecord::getReceiveUserId, chatRecord.getReceiveUserId())
.eq(ChatRecord::getReceiveUserReaded, "0"));
chatUserRelate2.setUserNoRead(count);
insert = chatUserRelateService.updateChatUserRelate(chatUserRelate2);
} else {
ChatUserRelate chatUserRelateNew = new ChatUserRelate();
chatUserRelateNew.setUserId(chatRecord.getReceiveUserId());
chatUserRelateNew.setRelateUserId(chatRecord.getSendUserId());
chatUserRelateNew.setLastMsgContent(chatRecord.getMsgContent());
chatUserRelateNew.setLastMsgType(chatRecord.getMsgType());
chatUserRelateNew.setLastMsgTime(chatRecord.getCreateTime());
chatUserRelateNew.setCreateTime(new Date());
chatUserRelateNew.setUserNoRead(1L);
chatUserRelateNew.setCreateBy(chatRecord.getSendUserId().toString());
insert = chatUserRelateService.insertChatUserRelate(chatUserRelateNew);
}
if (insert > 0) {
msgBody.setType(MsgBody.Type.self);
webSocketChannelPool.sendToUser(chatRecord.getSendUserId().toString(), msgBody);
msgBody.setType(MsgBody.Type.other);
msgBody.setSendUserId(chatRecord.getSendUserId());
msgBody.setChatRecordId(chatRecord.getId());
webSocketChannelPool.sendToUser(chatRecord.getReceiveUserId().toString(), msgBody);
}
return insert;
}
/**
* 修改聊天记录的阅读数量
*
* @param chatRecord 聊天记录
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int updateChatRecord(ChatRecord chatRecord) {
ChatRecord record = chatRecordMapper.selectById(chatRecord.getId());
if (record != null){
//同时更新关系表的未读数量
ChatUserRelate chatUserRelate = new ChatUserRelate();
chatUserRelate.setUserId(record.getReceiveUserId());
chatUserRelate.setRelateUserId(record.getSendUserId());
ChatUserRelate one = chatUserRelateService.getOne(new LambdaQueryWrapper()
.eq(ChatUserRelate::getUserId,chatUserRelate.getUserId())
.eq(ChatUserRelate::getRelateUserId,chatUserRelate.getRelateUserId()));
if (one != null){
one.setUserNoRead(one.getUserNoRead() - 1);
chatUserRelateService.updateChatUserRelate(one);
}
}
chatRecord.setUpdateTime(DateUtils.getNowDate());
return chatRecordMapper.updateChatRecord(chatRecord);
}
其他查询逻辑及前端数据渲染这里省略.......