我的大概思路就是,前端根据选取的内容获得他的cid,我的cid是js生成的uuid,
然后:1、通过websocket广播给对应的人 去删除localstorage里的缓存,
2、ajax异步请求删除数据库里的数据记录
3、如果对方此时也打开了聊天面板就要用jquery找到那条消息然后remove。

由于目前发现layim3.6版本并没有给自己发的消息赋值data-cid,所以实现起来比较麻烦。
首先如果你的layim和我一样嵌入到很多页面使用的话,你需要找到一个公共的head.jsp或者menu.jsp去存放uuid的值。如下

<input type="hidden" value="" id="uuid">

然后修改layim.js源码如下
在末尾加入一个生成uuid的函数

  , guid=function() {var s = [];var hexDigits = "0123456789abcdef";for (var i = 0; i < 36; i++) {s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);}s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01s[8] = s[13] = s[18] = s[23] = "-";var uuid = s.join("");return uuid;};

修改发送消息的部分代码如下

  //发送消息var sendMessage = function(){var uuid=guid();$("#uuid").val(uuid);var data = {username: cache.mine ? cache.mine.username : '访客',avatar: cache.mine ? cache.mine.avatar : (layui.cache.dir+'css/pc/layim/skin/logo.jpg'),id: cache.mine ? cache.mine.id : null,cid: $("#uuid").val(),mine: true};

实现撤回消息的核心代码如下

$("body").on("mousedown",".layim-chat-mine>.layim-chat-text",function(e){if(e.which == 3){var cid =$(e.target).parent().data("cid")==undefined?$(e.target).parent().parent().data("cid"):$(e.target).parent().data("cid");var msgDom=$(".layim-chat-mine[data-cid='"+cid+"']")var time= msgDom.find("i").html();  //消息发布时间字符串var now=new Date();   //当前时间var msgTime = new Date(Date.parse(time.replace(/-/g,"/")));     //消息发布时间转换成Date格式console.log(now+"---"+msgTime);if((now - msgTime)/60000 < 2){    //只能撤回2分钟内的消息layer.confirm('确定要撤回消息吗?', {icon: 3, title:'提示'}, function(index){//console.log(cid);// var windowName=msgDom.find(".layim-chat-other>img").attr("class");var windowName =$(e.target).parent().parent().parent().find(".layim-chat-other>img").attr("class")==undefined?$(e.target).parent().parent().parent().parent().find(".layim-chat-other>img").attr("class"):$(e.target).parent().parent().parent().find(".layim-chat-other>img").attr("class");//console.log(windowName);var arr=windowName.split(" ");var localIndex = arr[0].substring(6,windowName.length);  //console.log(localIndex);var cache =  layui.layim.cache();var local = layui.data('layim')[cache.mine.id];   //获取当前用户本地数据//console.log(JSON.stringify(local));var s=local.chatlog[localIndex];//console.log(JSON.stringify(s));var type=s[0].type;var toId=s[0].id;$.post("api/friend/delMsgFromMongoByCid",{"cid":cid,"type":type},function(res){console.log(res);})console.log(type);var array=[];$.each(s,function(k,v){if(v.cid!=cid){array.push(v);}});local.chatlog[localIndex]=array;//向localStorage同步数据layui.data('layim', {key: cache.mine.id,value: local});//console.log(local.chatlog[localIndex])if(type=='friend'){var obj={"mine":{"id":userId        },   "to":{"type":"delMsg", "cid":cid,"id":toId,"toType":type}};ws.send(JSON.stringify(obj));}else{$.post("api/qun/getSimpleMemberByGroupId?groupId="+toId,function(res){console.log(res);if(res!=null){var obj1={"mine":{"id":userId        },   "to":{"type":"delMsg", "cid":cid,"id":toId,"toType":type,"memberList":res}}ws.send(JSON.stringify(obj1));      //发送消息倒Socket服务}})}$(e.target).parent().remove();   layer.close(index);});}else{layer.msg("超过2分钟的消息无法撤回!",{time:1000});}}});

禁用浏览器默认右键菜单

document.oncontextmenu=function(ev){return false;    //屏蔽右键菜单
}

接收撤销的websocket消息的代码如下

   ws.onmessage = function (event) {    //如果获取到消息,心跳检测重置heartCheck.reset().start();      //拿到任何消息都说明当前连接是正常的console.log("llws收到消息啦:" +event.data);if(event.data!='pong'){var obj=eval("("+event.data+")");layui.use(['layim'], function(layim){if(obj.type=="onlineStatus"){layim.setFriendStatus(obj.id, obj.content);}else if(obj.type=="friend" || obj.type=="group"){layim.getMessage(obj);   }else if(obj.type=="delMsg"){var cid =obj.cid;var type=obj.toType;var toId=obj.toId;var uId=obj.userId;//console.log(cid);$(".layim-chat-main li[data-cid='"+cid+"']").remove();var cache =  layui.layim.cache();var local = layui.data('layim')[cache.mine.id];   //获取当前用户本地数据//console.log(JSON.stringify(local));var localIndex="";if(type=='friend'){localIndex=type+uId; }else{localIndex=type+toId;}//console.log(localIndex);var s=local.chatlog[localIndex];//console.log(JSON.stringify(s));var array=[];$.each(s,function(k,v){if(v.cid!=cid){array.push(v);}});local.chatlog[localIndex]=array;//向localStorage同步数据layui.data('layim', {key: cache.mine.id,value: local}); }});}};

java服务端代码如下

if(type.equals("delMsg")){String toType=jsonObject.getJSONObject("to").getString("toType");String toId=jsonObject.getJSONObject("to").getString("id");String cid=jsonObject.getJSONObject("to").getString("cid");String userId=jsonObject.getJSONObject("mine").getString("id");JSONObject toMessage=new JSONObject();toMessage.put("cid",cid); toMessage.put("userId",userId); toMessage.put("toType",toType);toMessage.put("toId",toId);toMessage.put("type","delMsg");if(toType!=null && toId!=null && cid!=null){switch (toType) {case "friend":                                      //单聊撤回if(mapUS.containsKey(toId+"")){               //如果在线,及时推送撤回消息mapUS.get(toId+"").getAsyncRemote().sendText(toMessage.toString());               //发送消息给对方System.out.println("撤回单聊-来自客户端的消息:" + toMessage.toString()); }/*else{                                        //如果不在线 就直接把redis里的那条记录干掉// 如果是离线用户,删除保存到redis的数据List<Object> redisLogList = RedisUtils.getObjList(toId+"_msg");for (int i=0;i<redisLogList.size();i++){Object o = redisLogList.get(i);String s = o.toString();if (s.indexOf(cid) > -1){RedisUtils.removeOneOfList(toId+"_msg", o);break;}}}*/break;case "fankui":                                        //家长与老师反馈消息撤回if(mapUS.containsKey(toId+"")){                  //如果在线,及时推送撤回消息mapUS.get(toId+"").getAsyncRemote().sendText(toMessage.toString());         //发送消息给对方System.out.println("撤回反馈-来自客户端的消息:" + toMessage.toString()); }/*else{// 如果是离线用户,删除保存到redis的数据List<Object> redisLogList = RedisUtils.getObjList(toId+"_msg");for (Object o : redisLogList){String s = o.toString();if (s.indexOf(cid) > -1){RedisUtils.removeOneOfList(toId+"_msg", o);break;}} }*/break;case "group"://JSONArray memberList=JSONArray.fromObject(llClient.getGroupUser(Integer.parseInt(toId)));  //获取群成员userId列表JSONArray memberList=jsonObject.getJSONObject("to").getJSONArray("memberList");if(memberList.size()>0){              for(int i=0;i<memberList.size();i++){                            //发送到在线用户(除了发送者)if(mapUS.containsKey(memberList.get(i)) && !memberList.get(i).equals(jsonObject.getJSONObject("mine").getInt("id")+"")){session=mapUS.get(memberList.get(i));session.getAsyncRemote().sendText(toMessage.toString());System.out.println("撤回群聊-来自客户端的消息:" + toMessage.toString()); }/*else if(memberList.get(i).equals(jsonObject.getJSONObject("mine").getInt("id")+"")){//如果是发送者自己,不做任何操作。}else{       //如果是离线用户,数据存到redis待用户上线后推送。List<Object> redisLogList = RedisUtils.getObjList(memberList.get(i) + "_msg");for (Object o : redisLogList){String s = o.toString();if (s.indexOf(cid) > -1){RedisUtils.removeOneOfList(memberList.get(i) + "_msg", o);break;}}}*/}}break;default:break;} }

分享完毕,有兴趣可以关注我。

layim的websocket消息撤回功能实现相关推荐

  1. golang 撤回_layim的websocket消息撤回功能实现

    我的大概思路就是,前端根据选取的内容获得他的cid,我的cid是js生成的uuid, 然后:1.通过websocket广播给对应的人 去删除localstorage里的缓存, 2.ajax异步请求删除 ...

  2. 老版本的环信,实现消息撤回功能。

    最近公司很久之前的一个集成过环信聊天功能的app,要增加消息撤回的功能,由于这个app是很久之前的..所以,那个时候的easeUi里面并没有这个功能,于是就参照有这个功能的sdk,把代码搬了过来.. ...

  3. im即时通讯开发:消息模型、万人群、已读回执、消息撤回功能

    企业微信作为一款办公协同的产品,聊天消息收发是最基础的功能.消息系统的稳定性.可靠性.安全性尤其重要. 消息系统的构建与设计的过程中,面临着较多的难点.而且针对toB场景的消息系统,需要支持更为复杂的 ...

  4. Django使用Channels实现WebSocket消息通知功能

    更多内容请点击 我的博客 查看,欢迎来访. Django Channels https://channels.readthedocs.io/en/latest/installation.html Ch ...

  5. 用javascript实现以下功能!_用python80行代码实现一个微信消息撤回捕捉功能

    自从微信出了这个消息撤回功能小编我都已经快被折磨死了,小编本来就是个好奇心比较重的人,微信出了这个功能之后小编感觉身体一天不如一天了,每次看着女神发来的信息又撤回,可谓是心里痒痒啊.所以小编就写了一个 ...

  6. 用Python 80行代码实现一个微信消息撤回捕捉功能

    自从微信出了这个消息撤回功能小编我都已经快被折磨死了,小编本来就是个好奇心比较重的人,微信出了这个功能之后小编感觉身体一天不如一天了,每次看着女神发来的信息又撤回,可谓是心里痒痒啊.所以小编就写了一个 ...

  7. ## 用python 80行代码实现一个微信消息撤回捕捉功能

    自从微信出了这个消息撤回功能小编我都已经快被折磨死了,小编本来就是个好奇心比较重的人,微信出了这个功能之后小编感觉身体一天不如一天了,每次看着女神发来的信息又撤回,可谓是心里痒痒啊.所以小编就写了一个 ...

  8. 中怎么撤回消息_微信消息撤回也能看到,这个开源神器牛x!语音、图片、文字都支持!...

    1.前言 微信在2014年的时候,发布的v5.3.1 版本中推出了消息撤回功能,用户可以选择撤回 2 分钟内发送的最后一条信息. 现在很多即时通讯的软件都有撤回这个功能. 腾讯为了照顾手残党,在微信和 ...

  9. 如何启用邮件撤回功能

    介绍 消息撤回功能为 IBM Lotus Notes/Lotus iNotes用户提供了在邮件消息发送之后收回该邮件消息的功能.当 Lotus Notes/Lotus iNotes 客户机用户不小心点 ...

最新文章

  1. 牛客练习赛64 - A.怪盗-1412(排列组合,简单数学)
  2. 如何让低版本IE浏览器支持HTML5和CSS3
  3. 【java】将PDF转成字符串
  4. Python 薪资降温?不存在的
  5. 并发200_一种单机支持 JavaWeb 容器万级并发的设想
  6. zend studio html插件安装,Zend Studio使用教程:将Zend Studio作为插件安装
  7. 使用Hash表时,针对Hash冲突的几个常见解决办法
  8. Quant量化面试题 数学 逻辑题 过河、生日、烧绳、称重
  9. 微信号,手机号,邮箱验证格式
  10. 客户需求分析8个维度_电商数据分析的4大思维和8个指标
  11. P2P软件工作原理是什么?
  12. 深圳外包及不考虑公司名单
  13. 360秒抓取收录批量提交程序
  14. 【JAVA】:java中getTime函数
  15. 用C#实现鼠标左右键的切换
  16. PMP笔记-产品核实、范围核实及质量控制的区别
  17. synopsys工具介绍
  18. 软考必考之有关计算机的知识产权基础
  19. 【车间调度】车间调度问题的特点
  20. 41.Java HashMap有序集合

热门文章

  1. 神武4 电脑版天魔里职业玩法攻略(原创)
  2. 混合云是什么,混合云是怎么工作的?
  3. 【Python】关键字
  4. 那些让人极度舒适的软件,盘点一下数据人必备的黑科技
  5. c语入门,心得和自我反省
  6. python节日贺卡图片_节日贺卡图片制作手工
  7. 魔兽转移账号的服务器,《魔兽世界》那些区能进行免费角色转移服务 安苏、死亡之翼服务器免费角色转移服务现已开放...
  8. 大数据分析与应用(中级) 大数据分析概述
  9. AddressList
  10. Python性能分析优化及测试