前言

  前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题。对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传。于是我就简单做了个图标替代来增强用户体验。

  上传中。。。

  

  上传完成后

  

  是不是很简单啊,接下来进入正题。

业务介绍

  LayIM中的加好友可以说是不太必要的逻辑,而且其实大部分在模仿QQ,当然业务复杂度肯定没法和QQ比。主线,就是用户A请求添加用户B为好友,用户B收到消息提示之后点击同意或者拒绝或者直接忽略,然后在将消息反馈到用户A。就是这么一个比较简单的流程,不过细节还是比较多的。

实战演示

  第一步,发送好友申请。

  

  第二步,接收好友申请(小气球为消息提示)

  

  第三步:消息处理(这里拒绝会输入拒绝理由,忽略不做消息提示)

  

  第四步:同意(拒绝)之后消息回传。

  

  第五步:流程结束

  

讲解

  数据库上的业务逻辑不多赘述,一般的设计只要包含请求表和处理结果表就可以了,然后根据用户id去查询他自己未处理的消息。可能看上面的图看不出哪里即时来,其实我在截图过程中,全程两个浏览器并没有刷新页面,完全是依靠后台的Hub消息推送来实现。在这之前呢,我们要做好准备工作,就是使用自定义用户Id,也就是我们数据库中的userId,而不是Hub中给我们的Guid。我们重写 接口 IUserIdProvider的GetUserId的方法就可以了。

namespace Microsoft.AspNet.SignalR
{public interface IUserIdProvider{string GetUserId(IRequest request);}
}

  添加自定义类继承自接口 IUserIdProvider

 public class LayIMUserFactory : IUserIdProvider{/// <summary>/// 自定义获取用户ID方法/// </summary>/// <param name="request"></param>/// <returns></returns>public string GetUserId(IRequest request){//直接读取Cookie中的userid,然后将userid返回,否则返回空,未登录if (request.GetHttpContext().Request.Cookies[LayIMConst.LayIM_SignalR_UserId] != null){return request.GetHttpContext().Request.Cookies[LayIMConst.LayIM_SignalR_UserId].Value;}return "";}}

  然后在startup文件中,我们注册一下这个类

  public void Configuration(IAppBuilder app){///注册自定义用户ID方法var userIdProvider = new LayIMUserFactory();GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => userIdProvider);//ConfigureAuth(app);//其他代码}

  同理呢,在ChatServer.LayIMHub 中,我们也是读取cookie中的用户Id

 public string CurrentUserId{get{var cookie = Context.Request.GetHttpContext().Request.Cookies[LayIMConst.LayIM_SignalR_UserId];if (cookie != null) { return cookie.Value; }return "";}}

  然后针对某一个用户发送消息的时候调用

 Clients.User(CurrentUserId).receiveMessage("你好,我给你发送了一个消息,用Client.User发给你的");

  这样做有什么好处呢,因为如果用户连接Hub服务器后,刷新页面的话,用户的ConnectionId是会变的,但是如果用我们自定义的userId来发送消息,只要是同一个用户,都能够使用UserId来进行发送消息的操作,省去了对ConnectionId的处理。所以这个场景很适合用在添加好友过程中的消息提醒上。比如,我们申请已经提交,那么后台就需要给被申请人发送一个提示消息:

   public static void SendMessage(object message, string userId, ChatToClientType type, bool moreUser = false){//构造消息体ToClientMessageResult result = new ToClientMessageResult{msg = message,msgtype = type,other = null};//获取当前的Hub对象IHubContext hub = GlobalHost.ConnectionManager.GetHubContext<LayIMHub>();// 给多个用户发送消息if (moreUser){hub.Clients.Users(userId.Split(',').ToList()).receiveMessage(result);}else{//给单个用户发送消息
                hub.Clients.User(userId).receiveMessage(result);}}

  只要实现了以上这个方法,不管我们是发送申请信息,消息处理信息还是其他信息,都可以在后台调用。只要该用户在线,就能够实现实时推送,如果不在线,即使推送了,也是收不到的。那就是历史消息的功能了。这里不再赘述。

  所以,当请求发送出去的时候,另外一个客户端就会看到这么一条消息:

  

  对应界面上呢,就是那个右下角的小气球闪烁,因为是截图,所以闪烁效果看不出,虽然很low。。实现方法 是用setInterval 然后控制文字实现的。

  

                var i = 0;var blings = function () {            //html交替变换,一会是图标一会是空,就会有图标闪动的效果,不过如果有一个漂亮的gif就更好了。$('.layim-tool-apply').attr('title', msg).html(i % 2 ? '' : '');i++;}other.msgTipInterval = setInterval(blings, 500);

  至于用户打开消息界面,因为是另外一个界面,所以直接读取该用户需要处理的消息即可,当用户同意或者拒绝该请求时,后台同样调用:

 public static void SendMessage(ApplyHandledMessgae message){short agreeFlag = 1;short refuseFlag = 2;//只有有消息,并且同意if (message.id > 0){var userid = message.applyuid.ToString();if (message.result == refuseFlag){//如果是被拒绝,只需要发送一条提示消息即可var msg = new ApplySendedMessage{msg = "您的" + (message.applytype == 0 ? "好友" : "加群") + "请求已经被处理,请点击查看详情"};SendMessage(msg, userid, ChatToClientType.ApplyHandledToClient);}else if (message.result == agreeFlag){//如果同意了,判断如果是加群,需要给群发送消息:某某某已经加入群,如果是加好友,发送一条消息,我们已经成为好友了,开始聊天吧。var msg = "您的" + (message.applytype == 0 ? "好友" : "加群") + "请求已经被处理,请点击查看详情";if (message.applytype == ApplyType.Friend.GetHashCode()){//这里的friend是为了配合 LayIM的 addList接口SendMessage(new { friend = message.friend, msg =msg  }, userid, ChatToClientType.ApplyHandledToClient);}else {//发送群信息 group也是为了配合Layim的addList接口SendMessage(new { group = message.group, msg = msg }, userid, ChatToClientType.ApplyHandledToClient);}}}}

  所以,当处理完申请消息时候,申请方用户就会收到如下的消息:

  客户端消息处理:

            console.log("收到申请被处理的消息");//开始闪烁右下角消息图标
                    global.other.startTips(result.msg.msg);if (result.msg.friend) {result.msg.friend.remark = result.msg.friend.sign;//调用layim接口,将好友直接添加到相应的好友组里面
                        global.layim.addList(result.msg.friend);}if (result.msg.group) {//调用layim接口,将群组直接添加到相应的好友组里面
                        global.layim.addList(result.msg.group);}

  到这里,基本上加好友流程就完成了,加群同理,不过加群不同的是,群主和管理员都可以审批,所以会出现给多个用户发送即时消息的情况。处理的时候也得注意重复操作的问题。

  所以,本篇的核心内容就是Hub在后台的调用,以及自定义UserId的使用方法。不过好像我们还少些东西,比如说,提示群里的其他成员:xxx已经加入群。或者自动给申请成功的好友发送一条:“我们已经是好友了,开始聊天吧。”的消息。

总结

  万变不离其宗,其实只要掌握了,消息推送机制,能够实现客户端与服务器端的联通。消息推送做任何业务都可以游刃有余。今天的加好友流程就到这里了。你会了吗?

      下篇预告【中级】ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。

  

   想要学习的小伙伴,可以关注我的博客哦,我的QQ:645857874,Email:fanpan26@126.com

   GitHub:https://github.com/fanpan26/LayIM_NetClient/

转载于:https://www.cnblogs.com/panzi/p/5765330.html

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现...相关推荐

  1. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)...

    大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...

  2. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息

    前言 不知不觉已经十四篇了,其实已经没有什么可写了.但是突然发现layim中带的客服功能没有用到.于是乎,抽点时间完成吧.其实之前的工作已经把客服功能完成了一大半,剩下的我们稍微调整即可.今天的演示我 ...

  3. 基于.NET SingalR,LayIM2.0实现的web聊天室

    LayIM官网 http://www.layui.com/doc/layim.html 博客教程:http://www.cnblogs.com/panzi/p/5767095.html 项目说明:基于 ...

  4. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(七)之LayIM与MVC数据交互实现单聊和群聊

    前言 本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能.源代码不包含LayIM的源代码,因为官方并没开源属于收费资源, ...

  5. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(五)之使用RabbitMQ缓存消息

    前言 本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能.源代码不包含LayIM的源代码,因为官方并没开源属于收费资源, ...

  6. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(四)之ASP.NET SignalR核心功能介绍

    前言 本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能.源代码不包含LayIM的源代码,因为官方并没开源属于收费资源, ...

  7. 从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4

    前面文章链接如下: <从0实现基于Linux socket聊天室-多线程服务器模型-1> <从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2> &l ...

  8. 快速接入 | 从 0 到 1 构建语音聊天室

    导读:近年来,在线语音聊天的用户量持续上升.语音可承载的信息密度比文字图片丰富,又比视频更简单,不失为一种抓住Z世代年轻用户和实现流量变现的有效途径.为了满足用户的情感需求.娱乐需求和价值观认同,越来 ...

  9. linux下多进程聊天室,从0实现基于Linux socket聊天室-多线程服务器模型-1

    前言 Socket在实际系统程序开发张中,应用非常广泛,也非常重要.实际应用中服务器经常需要支持多个客户端连接,实现高并发服务器模型显得尤为重要.高并发服务器从简单的循环服务器模型处理少量网络并发请求 ...

最新文章

  1. 【radar】毫米波雷达动态障碍物检测相关论文汇总(聚类、分类、稀疏2D点、4D点、雷达成像、原始数据处理)(4)
  2. 【Demo】改变SO项目状态并取消拒绝原因实现
  3. 开源免费的HTML5游戏引擎
  4. SAP UI5 应用开发教程之五十 - 如何使用 Cordova 将 SAP UI5 应用生成一个能在 Android 手机上安装的混合应用
  5. 233. 数字 1 的个数
  6. 工程项目利用AutoMake生成Makefile实战
  7. 如何在信用卡反欺诈检测中使用人工智能和机器学习
  8. 用 SwiftUI 实现一个开源的 App Store
  9. DevOps学习笔记--Jerrit介绍
  10. looking for domain authoritative name server and domain name location
  11. 网络受限_受限人工神经网络对幸福的追求
  12. linux资料整理之用户管理
  13. 原生js+css 实现轮播图 完整代码
  14. 如何下载Direct3D9Ex
  15. 初识IndexedDB本地存储
  16. Java 图片添加数字暗水印工具类
  17. c语言字典大全,c语言字典(C language dictionary).doc
  18. PostgreSQL vacuum原理一功能与参数
  19. linux 编译安装GmSSL记录
  20. 好书推荐——厚黑学全书 (作者 李宗吾)

热门文章

  1. ABBYY FineReader 15中文版
  2. 用HTML语言编写 蓝色字体,背景色为蓝色,字体为红色的代码 怎么用HTML的形式表示?...
  3. T语言与快速开发平台之天宇联Android开发手册
  4. 直播 相关技术文章 相关调研文章
  5. sha256 加密算法
  6. 挑战Man Group!顶级对冲基金的10道Python面试题
  7. 如何建立免费企业邮箱(腾讯、网易)
  8. 《七周七并发模型》笔记
  9. 360视频加速器官方版
  10. Elasticsearch+Spring Boot集成实践