聊天相关表结构及业务逻辑

2023-10-26

表结构:

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<ChatUserRelate>()
                .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<ChatUserRelate>()
                .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<ChatRecord>()
                    .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<ChatUserRelate>()
                    .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);
    }

其他查询逻辑及前端数据渲染这里省略.......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聊天相关表结构及业务逻辑 的相关文章

  • 使用 java 从 XML 元素中删除空格

    我有一个 JSON 如下 String str Emp name JSON Emp id 1 Salary 20997 00 我想使用 java 将此 JSON 转换为 XML 我的 java 代码在这里 JSON json JSONSer
  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • Javadoc 链接到其他类中的方法

    目前我正在使用以下 Javadoc 语法引用其他类中的方法 see link com my package Class method 据我从文档中了解到 这是执行此操作的正确方法 但现在到了有趣的部分 或者说令人沮丧的部分 当我生成这个 j
  • 有没有一种干净的方法将泛型类型的类分配给变量?

    鉴于此代码 List
  • Netbeans 雷达插件配置

    我使用的是 Netbeans 8 0 1 在提交到 SVN 之前 我需要从 IDE 运行并检查 SonarQube 分析 我已经安装了 Netbeans Radar 插件 用于启动本地分析并检查结果 这个插件有一个名为 Get Issues
  • 在 Selenium Grid 中注册 PhantomJS 节点时出错

    我有以下问题 我成功启动了 Selenium Grid hub java jar selenium server standalone 2 53 0 jar role hub 之后我尝试使用以下命令启动 PhantomJS 节点 phant
  • Java TCP Echo 服务器 - 广播

    我有一个简单的回显服务器 我希望当连接的用户向服务器键入任何内容时 所有其他客户端和该客户端都会收到消息 MOD 它现在不会发送给所有客户端 但它应该发送 而且我只是不知道我的代码出了什么问题 所以现在它只会将消息 MOD 发送给发送消息的
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision
  • 如何在 WebSphere Liberty Batch 中配置事务超时?

    的作用是什么javax transaction global timeout 我是否需要实施检查点 超时 中的方法检查点算法 服务器配置级别有什么东西吗 它如何与应用程序级别的设置进行交互 2016年12月2日编辑 重新设计并解释了为应用程
  • CompletableFuture SupplyAsync

    我刚刚开始探索 Java 8 的一些并发特性 让我有点困惑的一件事是这两个静态方法 CompletableFuture
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 如何使用 Java Streams API 将 Map 列表与列表值合并?

    我怎样才能减少Map
  • 谷歌的Json解析Gson库:JsonElement和JsonObject有什么区别?

    public abstract class JsonElement extends Object 表示 Json 元素的类 它可以是 JsonObject JsonArray JsonPrimitive 或 JsonNull public
  • 将 JPanel 添加到 JFrame

    我有一个程序 其中将 JPanel 添加到 JFrame public class Test Test2 test new Test2 JFrame frame new JFrame Test frame setLayout new Bor
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • 确保 MAVEN_HOME 设置正确

    这里是 Java 和 Maven 菜鸟 使用 OSX 10 8 并使用 HomeBrew 安装 Maven 1 如果我说which mvn我会得到这个 usr local bin mvn 2 如果我说echo MAVEN HOME我不会得到
  • 在android中测量不规则多边形的面积

    我正在开发一个应用程序 在其中我在地图上绘制多边形 并且我使用的地图不是谷歌 它的Mapsforge开源离线地图库 我可以通过将地理点转换为像素点来轻松在地图上绘制多边形 但在这里我想发现是不规则的多边形 为此我做了很多尝试 但它让我失败了
  • 项目级别的@PowerMockIgnore

    在 Maven 中运行时 我的 powermock 测试用例出现以下错误 java lang LinkageError loader constraint violation loader instance of org powermock
  • Cassandra 会话与集群 有什么可分享的?

    考虑 Cassandra 的 Session 和 Cluster 类 Java 驱动程序 我想知道有什么区别 在 Hibernate 中 每次都会创建一个会话并共享会话工厂 从许多来源我了解到 它被认为是创建一个会话并在多个线程之间共享它

随机推荐

  • 【满分】【华为OD机试真题2023 JAVA&JS】简单的自动曝光

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 简单的自动曝光 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 一个图像有n个像素点 存储在一个长度为n的数组img里 每个像素点的取值范围 0 255 的正整数
  • Locust性能测试-分布式执行的方法(ok)

    来源 https www cnblogs com yoyoketang p 11681370 html https www cnblogs com kaibindirver p 11773334 html 前言 使用Locust进行性能测试
  • 腾讯云服务器被DDOS攻击解决办法

    腾讯云是国内仅此次阿里云的云服务商 很多站长朋友都使用他们家云服务器 自然被DDOS攻击的也不少 今天来介绍下使用腾讯云服务器被DDOS攻击的解决办法 一 购买腾讯高防IP 也称腾讯大禹BGP高防IP 是一个运行在腾讯云内网的高防IP服务
  • 第二章:简单古典密码(及其五元组)

    简单古典密码及其五元组 编制密码的基本原理和基本方法称为密码法 基本的密码法主要有移位 也称为置换 代替 和加减三种 在许多书上只是介绍置换和代替 在密码发展的初级阶段 他们都曾经独立地作为加密算法对明文信息进行加密 移位密码 移位密码是按
  • -bash: /big_date/jdk1.8.0_333/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录

    自说 在CentOS7中搭建环境中 解压过java1 8版本时 配置好环境变量进行测试java版本时出现以下错误 出现这种情况的原因是因为当前环境缺少相关依赖包 glibc glibc 简单来说 glibc是gnu发布的libc库 即c运行
  • 毕业设计-基于SSM的网上商城系统

    项目编号 D09 项目名称 基于SSM的网上商城系统 项目类型 Java web项目 JavaEE 当前版本 V1 0 0版本 用户类型 有用户和管理员 双角色 项目架构 B S架构 设计思想 MVC 开发语言 Java语言 前端技术 La
  • js——网址动态拼接参数

    案例 你可以使用字符串拼接的方式来动态拼接参数到网址上 在这种情况下 你可以使用加号运算符来连接字符串 并使用变量来表示参数的值 下面是一个示例代码 let aaa http www baidu com let xxx 1 let yyy
  • 对于一个采用字符数组存放的字符串str,设计一个递归算法StrLength(char *str)求其字符个数(长度)。递归求字符串长度

    递归求字符串长度 需要的就是将数组看成指针 一步一步走下去 int StrLength char str char p str if p 0 return 0 else return StrLength p 1 努力加油a啊 o
  • 走出软件作坊

    这本书 对于小开发者真的是实用手册 关于如何与老板相处 如何做人 如何做技术 对于在小企业工作的人来说 真的不错 2014 7 11
  • c#自定义消息事件

    自定义消息 public class CustomEventArgs EventArgs public readonly string msg public CustomEventArgs string msg this msg msg 自
  • 设计模式之桥接模式(Bridge模式)

    一 模式动机 设想如果要绘制矩形 圆形 椭圆 正方形 我们至少需要4个形状类 但是如果绘制的图形需要具有不同的颜色 如红色 绿色 蓝色等 此时至少有如下两种设计方案 第一种设计方案是为每一种形状都提供一套各种颜色的版本 第二种设计方案是根据
  • 云服务器搭建神器JupyterLab(多图)

    云服务器搭建神器JupyterLab 多图 JupyterLab是一个交互式的开发环境 其用于应对包含着notebook 代码以及数据的工作场景 1 前言 如果说vim是编辑器之神 那么JupyterLab就是笔记本之神 从2017年开始我
  • 极端天气下的目标检测与测距算法

    更多视觉额自动驾驶项目请见 小白学视觉 自动驾驶项目 本文主要工作 科技的发展与进步促使自动驾驶车辆逐渐成为全球汽车产业发展的重要战略 方向 但自动驾驶车辆面对如 大雨 大雾 大雪等极端环境时 智能汽车图像 采集与处理系统将面临巨大挑战 并
  • 基于Python的socket库实现通信功能

    目录 1 前言 2 技术介绍 1 socket 2 Python的socket库 3 系统实现 1 服务端 server py 2 客户端1 client1 py 3 客户端2 client2 py 4 系统功能演示 1 启动服务端和客户端
  • idea配置maven教程

    1 下载maven 下载地址 官网地址点击进入 2 配置环境变量 解压到自己想要放置的路径后 配置系统用户的环境变量 新增系统变量 MAVEN HOME C Program Files JetBrains apache maven 3 8
  • 二维码 ThoughtWorks.QRCode 之 index was outside bounds of the array

    最近在使用ThoughtWorks QRCode过程中 单独生成一个二维码没有出现过问题 在重复利用QRCodeEncoder生成二维码的过程中 会出现index was outside bounds of the array错误 经过调试
  • JS 作用域

    var和let的比较 var是老版JavaScript中定义变量的标识符 let是新版JavaScript中定义变量的标识符 let的出现是为了解决var定义变量的一些遗留问题而推出的 在同一个作用域下 var允许重复声明 let不允许重复
  • SpringBoot整合Minio

    1 引入依赖 POM文件如下
  • 【Linux虚拟机】VirtualBox搭建linux虚拟机

    Linux从虚拟机创建到程序运行 ubuntu版 实际工作中 总是需要开发环境 测试环境和生产环境 但是很多小伙伴是没有这么多可供使用的服务器的 尤其是学习使用阶段 可能因为不熟悉服务器的配置 重复的重启 安装 卸载等 我们需要有自己可以随
  • 聊天相关表结构及业务逻辑

    表结构 CREATE TABLE t chat record id bigint 20 NOT NULL send user id bigint 20 DEFAULT NULL COMMENT 发送人 receive user id big