vue聊天功能模块(八)撤回消息实现

需求:撤回消息

思路

  • 鼠标右键弹出 撤回 按钮
  • 点击撤回按钮,拿到当前选中消息id,遍历消息列表拿到消息相关数据,主要是拿到用户名
  • 通过接口撤回当前消息
  • 在撤回成功回调中重新更新列表数据
  • 到这里,有两个办法更新列表 办法一、可以通过http刷新消息列表
    办法二、也可以遍历本地消息,用元素替换掉当前消息即可
    办法二效果肯定好一些,毕竟不需要等http回调

一、鼠标右键弹出 撤回 按钮

消息列表

 <li class="tal" v-for="(item,index) in showMesDatas"                                        @contextmenu.prevent="rightMessageClick(item.mid,item.uid)"
 </li>

右击事件,追加撤回按钮

    //右击事件处理
      rightMessageClick(msgId, uid) {
        console.log('右击事件');
        this.withdrawMessageSmgId = msgId; //保存消息id
        if (uid === this.user.userId) {
          this.setMsg(msgId);
        } else {
          return;
        }
      },
      //撤回,删除,取消
      handelBackEvent(e, msgId) {
        let thisId = e.target.id;
        switch (thisId) {
          case 'delMsg': //删除消息
            this.delMsg(msgId);
            break;

          case 'withdrawMessage'://撤回消息
            this.withdrawMessage(msgId);

            break;
          case 'cancelBack'://取消
            $('#backMsg').remove();
            console.log('cancelBack');
            break;

        }
      },
      setMsg(num) {
        $('#backMsg').remove();
        var backMsghtml = '<div id="backMsg" style="position: relative;z-index: 99;margin-right: 15%;">' +
            '<span  id="delMsg" style="font-size: 5px;padding: 0;cursor:pointer ;">删除</span>' +
            '<span  id="withdrawMessage" style="font-size: 5px;padding: 0;cursor:pointer ;margin: auto 2px">撤回</span>' +
            '<span  id="cancelBack" style="font-size: 5px;padding: 0;cursor:pointer ;">取消</span>' +
            '</div>';
        $('#msg' + num).append(backMsghtml);

      },

二、撤回消息,界面处理注意

let rspOBJ = DispatchmessageCtrl.backMsg(MsgIndex, TargetType, TargetInfo);这是通过websocket处理撤回

我们主要做的是删除消息,追加 let htmld = ' <div class="msgDrowBackContent" style="text-align: center">' + '<div><p></p></div><div>' + msgInfo.una + '撤回了一条消息' + '</div>'; $('#msg' + msgId).append(htmld);

   //撤回消息
      withdrawMessage(msgId) {
        if (msgId != null && msgId != '') {
          function findshowMes(findshowMesDatas) {
            for (let i = 0; i < findshowMesDatas.length; i++) {
              if (findshowMesDatas[i].mid == msgId) {
                var msgInfo = findshowMesDatas[i];
                return msgInfo;
                break;
              }
            }
          }
          let msgInfo = findshowMes(this.showMesDatas);
          var MsgIndex;//消息编号
          var TargetType;//对象类型	Int	0-终端 1-群组 2-调度员 3-临时组
          var TargetInfo = {};//对象信息
          if (msgInfo.gid === 0) {
            MsgIndex = msgInfo.mid;
            TargetType = 0;
            TargetInfo = {
              UserID: msgInfo.uid,
              UserNumber: this.conversationNumber,
              UserName: msgInfo.una,
            };
          } else {
            MsgIndex = msgInfo.mid;
            TargetType = 1;
            TargetInfo = {
              GroupID: msgInfo.gid,
              GroupNumber: this.conversationNumber,
              GroupName: msgInfo.gna,
            };
          }
          let rspOBJ = DispatchmessageCtrl.backMsg(MsgIndex, TargetType, TargetInfo);
          if (rspOBJ === 0) {
            // Dispatchmessage.backMsg(TargetInfo)      //处理消息撤回后的界面
            let deleteMesDatas = this.showMesDatas;
            let htmld = ' <div class="msgDrowBackContent" style="text-align: center">' +
                '<div><p></p></div><div>' + msgInfo.una + '撤回了一条消息' + '</div>';
            $('#msg' + msgId).append(htmld);
            for (let i = 0; i < deleteMesDatas.length; i++) {
              if (JSON.stringify(deleteMesDatas[i]).indexOf(JSON.stringify(msgId)) != -1) {
                deleteMesDatas.splice(i, 1);
                console.log(deleteMesDatas);
                this.withdrawMessageShow = false;
                this.showMesDatas = deleteMesDatas;
                // this.getTalkHistorys();
                $('#backMsg').remove();
                break;
              }
            }
          } else {
            // Dispatchmessage.backMsg(-1)
            // 失败后的处理,参数传入-1
            this.withdrawMessageShow = false;
            this.$message.warning('撤回失败');
            $('#backMsg').remove();
          }
        } else {
          $('#backMsg').remove();
        }

      },

来看看效果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现聊天功能,需要分为前端和后端两部分来实现。下面提供一种基于Spring Boot和Vue实现方式: 1. 后端实现 使用Spring Boot框架来实现后端接口,其中需要提供以下API: - 用户登录:接收用户名和密码,返回登录状态和用户信息。 - 获取聊天记录:接收用户ID和好友ID,返回历史聊天记录。 - 发送消息:接收发送者ID、接收者ID、消息内容等信息,将消息存储到数据库中。 可以使用Spring Data JPA来操作数据库,使用WebSocket协议来实现实时通信功能。后端代码可以分为以下几个部分: - 实体类:用于映射数据库中的表结构。 - DAO层:用于操作数据库,可以使用Spring Data JPA来简化操作。 - Service层:用于业务逻辑处理,处理用户登录、获取聊天记录、发送消息功能。 - WebSocket配置类:用于配置WebSocket相关信息,实现实时通信功能。 - Controller层:用于处理HTTP请求,提供API接口。 2. 前端实现 使用Vue框架来实现前端界面,其中需要实现以下几个部分: - 登录界面:提供用户名和密码的输入框,以及登录按钮。 - 聊天列表界面:展示好友列表,点击某个好友可以进入聊天界面。 - 聊天界面:展示历史聊天记录,提供输入框和发送按钮。 可以使用Vue Router来实现路由跳转,使用Axios来发送HTTP请求。前端代码可以分为以下几个部分: - 登录组件:用于渲染登录界面,处理登录逻辑。 - 聊天列表组件:用于渲染好友列表,实现路由跳转。 - 聊天界面组件:用于渲染聊天记录,提供输入框和发送按钮。 - WebSocket配置:用于配置WebSocket相关信息,实现实时通信功能。 - API封装:用于封装Axios发送HTTP请求。 以上是一个基于Spring Boot和Vue聊天功能实现方式,具体实现过程中还需要考虑很多细节问题,比如权限控制、数据格式化、异常处理等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值