有开发者提问怎么做历史记录功能和即使不打开聊天窗口有消息提醒功能。简单抽时间写了点代码。不过只是基本思路,具体细节没有实现。

  正如前几篇博客中提到的,读取历史记录什么时候读取呢?按照常理,应该是打开聊天窗口的时候加载历史记录,当然也可以选择异步加载好,然后打开哪个窗口就加载哪部分的记录。当然我们并不知道用户会打开哪个窗口,所以,我还是建议,当用户选择人聊天的时候就读取历史记录。那么之前的功能已经做好了。我们需要充分利用  ctoc  方法。ctoc是什么?不明白的就看看本系列前几篇文章吧。

  现在我们找到ctoc 后台方法,可以看到我添加了GetHistoryMessage方法,参数为发送人id和接收人id,那么这个GetHistoryMessage方法就是做了读取历史记录的操作,不管你从哪里读取的,是缓存还是数据库(前提是你发的消息已经保存了~~)

 /// <summary>
/// 人对人聊天 连接服务器
/// </summary>
/// <param name="sendid">发送人</param>
/// <param name="receiveid">接收人</param>
/// <returns></returns>
public Task ClientToClient(string sendid, string receiveid)
{
if (sendid == null || receiveid == null) { throw new ArgumentNullException("sendid or receiveid can't be null"); }
//获取组名
string groupName = MessageUtils.GetGroupName(sendid, receiveid);
//将当前用户添加到此组织内
Groups.Add(CurrentUserConnectionId, groupName);
//构建系统连接成功消息
//读取历史记录 --- 2016-3-7 修改
var historyMsg = MessageUtils.GetHistoryMessage(sendid, receiveid); var msg = MessageUtils.GetSystemMessage(groupName, MessageConfig.ClientToClientConnectedSucceed, new { t = MessageConfig.ClientTypeCTC, currentid = sendid, receiveid = receiveid,history = historyMsg });
//将消息推送到当前组 (A和B聊天的组) 同样调用receiveMessage方法 return Clients.Caller.receiveMessage(msg);
}

  我们再来看看获取历史记录的方法都做了什么,首先他返回的消息格式一定要符合我们设计的标准。以方便兼容单条消息发送和接收

   public static List<CSChatMessage> GetHistoryMessage(string sendid,string receiveid)
{
string groupName = GetGroupName(sendid, receiveid);
List<CSChatMessage> historys = new List<CSChatMessage>();
//这里历史记录作为demo使用,可以从数据库或者缓存读取
historys.Add(new CSChatMessage
{
fromuser = new CSUser(groupName, null)
{
photo = "/photos/000.jpg",
userid = int.Parse(sendid),
username = "发送方的名字"
},
msg = "这一条是历史记录",
msgtype = CSMessageType.Custom,
touser = new CSUser(groupName, null)
{
photo = "/photos/001.jpg",
userid = int.Parse(receiveid),
username = "接收方的名字"
},
other = new { t = MessageConfig.ClientTypeCTC }//这里不要忘了加t参数
});
historys.Add(new CSChatMessage
{
touser = new CSUser(groupName, null)
{
photo = "/photos/000.jpg",
userid = int.Parse(sendid),
username = "发送方的名字"
},
msg = "这一条是历史记录",
msgtype = CSMessageType.Custom,
fromuser = new CSUser(groupName, null)
{
photo = "/photos/001.jpg",
userid = int.Parse(receiveid),
username = "接收方的名字"
},
other = new { t = MessageConfig.ClientTypeCTC }//这里不要忘了加t参数
});
historys.Add(new CSChatMessage
{
fromuser = new CSUser(groupName, null)
{
photo = "/photos/000.jpg",
userid = int.Parse(sendid),
username = "发送方的名字"
},
msg = "这一条是历史记录",
msgtype = CSMessageType.Custom,
touser = new CSUser(groupName, null)
{
photo = "/photos/001.jpg",
userid = int.Parse(receiveid),
username = "接收方的名字"
},
other = new { t = MessageConfig.ClientTypeCTC }//这里不要忘了加t参数
});
return historys;
}

  其实就加了这么一个读取历史记录的操作,我们来看看,连接成功之后,消息返回JSON。

历史记录有了,我们剩下的要做的就很简单了。修改前端处理  system 类型的消息函数。(代码在client.hub.js /chat.handleSystemMsg)

 handleSystemMsg: function (result) {
if (result.other.t == 'one') {
this.cache[result.other.receiveid] = "ok";//代表我已经和当前聊天人已经连接上了,下次点击没必要再次连接
} else {
this.cacheGroup[result.other.receiveid] = "ok";
}
//然后在这里处理历史记录 2016-3-7
if (result.other.history && result.other.history.length) {
$(result.other.history).each(function (i,item) {
//追加消息
console.log(item);
chat.handleCustomMsg(item);//每一个item就是一条消息,这里格式是通用的,所以,直接调用 handleCustomMsg方法就可以了。
});
}
},

我们看一下效果:

是不是如此简单就实现了历史记录的功能,当然实际项目中,如果把滚动条上拉可以看更多的历史记录,这里就不需要signalR了,我们用一个ajax请求就可以了。

  下面介绍一下,消息通知。其实消息通知的原理就是进入页面的时候需要用户连接服务器,每当有用户消息的时候就会提示。因为之前的设计思路是当用户点击某个人要聊天的时候才会连接,所以,即使用户登录了网页,也不会收到其他人给他发送的消息。所以我们要做的就是先让用户连接到服务器。我这里模拟了一下连接,就是打开窗口,然后在关闭。(此时用户处于连接状态,能够接收到消息,只不过不会在窗口显示)添加如下代码:(代码路径:client.hub.js/chat.handleCustomMsg)

 if (!log.imarea.length) {
//这里只有在连接过一次之后,并且关闭消息框才会提示
if (result.touser.userid == hubConfig.currentUser.id) {
alert("您收到消息啦...");
}
}

当对方在给我发送消息的时候就会提示啦:(PS:这里只是一个思路,具体并没有实现任何人发送消息就会提示。alert框是不是很难看,那么让你们的美工给优化一下吧。)

github 代码已经更新:https://github.com/fanpan26/LayIM/

ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(五) 补充:历史记录 和 消息提醒的更多相关文章

  1. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天   看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器 ...

  2. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据   最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前 ...

  3. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(二) 实现聊天室连接

    上一篇已经简单介绍了layim WebUI即时通讯组件和获取数据的后台方法.现在要讨论的是SingalR的内容,之前都是直接贴代码.那么在贴代码之前先分析一下业务模型,顺便简单讲一下SingalR里的 ...

  4. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

  5. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器了,那么剩下的内容呢,就是一步一步实现聊天功能. 我们先看看缺什么东西 点击好友弹框之后,要给服务器发消息,进入组Gro ...

  6. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据

    最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前端组件配合后台完成即时聊天等功能.当然用到的技术就是ASP.NET SingalR框架.本人不会c ...

  7. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(八)之 聊天记录入队(列)

    本篇也算是个番外篇了,跟之前几篇关系不算大.之前一篇  RabbitMQ .NET Client 实战实验 里有介绍过今天要用的内容. 做了一下小更改,就是在用户聊天的时候,消息记录不直接进入数据库, ...

  8. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(七)之 图文,附件消息(2016-05-05 12:13)

    上一篇介绍了加好友的流程,这里不再赘述,不过之前的聊天只能发送普通文字,那么本篇就教你如何实现发送附件和图片消息.我们先对功能进行分析: 发送图片,附件,需要实现上传图片和附件的功能. textare ...

  9. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(六)之 好友申请、同意、拒绝

    不知道距离上一篇多久没有写了,可能是因为忙(lan)的关系吧.废话不多说,今天要介绍的不算什么新知识,主要是逻辑上的一些东西.什么逻辑呢,加好友,发送好友申请,对方审批通过,拒绝.(很遗憾,对方审批通 ...

随机推荐

  1. MVC参数自动装配

    在拿到一个类型的所有属性以及字段的描述信息后,就可以通过循环的方式,根据这些数据成员的名字去QueryString,Form,Session,Cookie读取所需的数据了. 就是遍历参数,然后用反射遍 ...

  2. bzoj 5084: hashit

    Description 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 Solution 先忽略删除操作,建出最终的 ...

  3. net 预览文件 转换文件

    预览SWF文件 swfobject.js  (google浏览器 会阻止 需设置) @{ ViewBag.Title = "PdfPreview"; Layout = " ...

  4. Starting MySQL. ERROR! The server quit without updating PID file如何解决

    今天数据库突然挂了.重启提示: Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql/v ...

  5. intent 活动之间穿梭

    1.从当前activity,跳转到当前应用程序的activity Intent intent = new Intent(MainActivity.this, Intent2Activity.class ...

  6. ubuntu系统没有声音解决方法

    好像装了个放视频的软件,就没有声音了.后面网上搜到了一个简单粗暴的办法,效果很明显,改变权限后直接就有声音了. -------------------------------------------- ...

  7. 深入Java字符串

    深入Java字符串     Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生.   一.从根本上认识java.lang ...

  8. stark——查看页面编辑删除按钮

    一.数据列表 设计查页面,主要展示两部分内容,表头部分和数据部分, 表头通过遍历list_display和默认要显示的编辑和删除字段. 1.数据构建 (1)service/stark.py,后台数据构 ...

  9. Celery-------项目目录

    在实际应用中Celery的目录是有规则的 要满足这样的条件才可以 目录Celery_task这个名字可以随意,但是这个目录下一定要有一个celery.py这个文件 from celery import ...

  10. input文本框点击第一次光标在最右边

    效果: 样式效果引入bootstrap4.0就OK了. HTML代码: <div class="input-group w-25"> <div class=&qu ...