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

  正如前几篇博客中提到的,读取历史记录什么时候读取呢?按照常理,应该是打开聊天窗口的时候加载历史记录,当然也可以选择异步加载好,然后打开哪个窗口就加载哪部分的记录。当然我们并不知道用户会打开哪个窗口,所以,我还是建议,当用户选择人聊天的时候就读取历史记录。那么之前的功能已经做好了。我们需要充分利用  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. 绘图神器-matplotlib入门

    这次,让我们使用一个非常有名且十分有趣的玩意儿来完成今天的任务,它就是jupyter. 一.安装jupyter matplotlib入门之前,先安装好jupyter.这里只提供最为方便快捷的安装方式: ...

  2. 【卷土重来之C#学习笔记】(三) 类型 存储和变量

    .c#程序是一组类型声明 ※C#程序或DLL的源代码是一组一种或多种类型声明 ※对于可执行程序,类型声明必须有一个包含Main方法类 ※命名空间是一种把相关的类型声明分组并命名的方法.既然程序是一组相 ...

  3. nyoj 12——喷水装置二——————【贪心-区间覆盖】

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  4. 项目搭建系列之二:SpringMVC框架下配置MyBatis

    1.什么是MyBatis? MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis ...

  5. Intellij idea配置scala开发环境

    1.Intellij idea配置scala开发环境 解决Plugin Scala was not installed: No route to host Plugin Scala was not i ...

  6. 为mongodb添加账号

    进入切换到某一个数据库,我这里是位每个模块分配一个DataBase use 0 执行添加账号命令 db.createUser( { user: "*****", pwd: &quo ...

  7. 去掉iframe白色背景方法

    在iframe内添加如下代码 style="display:none" onload="this.style.display = 'block';" 先让它不显 ...

  8. spring学习(四)spring 持久层的封装

    持久层:所谓“持久层”,也就是在系统逻辑层面上,专著于实现数据持久化的一个相对独立的领域(Domain),是把数据保存到可掉电式存储设备中.持久层是负责向(或者从)一个或者多个数据存储器中存储(或者获 ...

  9. Siebel学习笔记

    Siebel(escript)的学习:1.Siebel的数据类型 Primitive(原始的)---Number,Integer,Hexadecimal(十六进制),Octal(八进制),Floati ...

  10. Dynamics CRM RibbonWorkbench工具使用

    这边用的是RibbonWorkbench2016的工具,导入RibbonWorkbench2016解决方案即可.导入成功后在解决方案下面会多出一个快捷键小图标. 一.基本介绍 二.列表页获取选中记录的 ...