ASP.NETSignalR与LayIM2.0配合轻松实现Web聊天室(九)之用Redis实现用户在线离线状态消息处理(一)丶Pz

上一篇中简单讲解了用Redis缓存在线用户逻辑。篇幅也比较小,本篇将详细实现用户的上线下线通知、图片效果转换功能。而且,代码和开发思路都会详细介绍。

目前有三个用户,user1,user2,user3.下图会简单展示用户上线,下线的消息推送效果。

图四:三个用户均在线(三个浏览器截图)

图五:谷歌浏览器用户下线(其他两个用户收到下线消息,头像变黑白)

不完美的地方:

1.用户在线或者下线会有不准确性,需要重新刷新页面才可以

2.群内用户图标暂时还未处理

3.打开聊天窗口的图标也未作处理(如果用户不在线,图标还是亮的)

正如之前所讲的,我们定义一个gray插件,并且暴漏grayscale对象。小伙伴们不要忘了在首页上配置上该js。

//自定义模块layui.extend({signalr:'/scripts/signalr/signalr',autohub:'/scripts/signalr/autohub',//自动生成的hub:'/Scripts/signalr/hub',gray:'/scripts/gray'//控制图片黑白的js});然后,我们要做的就很简单了。想把哪个图片置灰,就调用类似如下方法,那么图片就会替换为一个base64的灰色图片了,效果在上边的截图中,相信大家已经看到了。

varimgs=$("img[data-status='hide']");if(imgs.length){grayscale(imgs);}大家都知道,刚进入layim界面的时候,我们会有好友列表信息。那么上一篇讲到的用Redis存储在线用户列表就能派上用场了。我们找到base方法(获取用户基础信息,好友信息,群组信息等)

//用户组信息varrowFriendDetails=ds.Tables[2].Rows.Cast().Select(x=>newGroupUserEntity{id=x["uid"].ToInt(),avatar=x["avatar"].ToString(),groupid=x["gid"].ToInt(),remarkname=x["remarkname"].ToString(),username=x["nickname"].ToString(),sign=x["sign"].ToString(),//status之前的字段是为空的,现在我们把他的在线状态加上,IsOnline方法接收一个userid参数,从Redis缓存中读取该用户是否在线并返回status=LayIMCache.Instance.IsOnline(x["uid"].ToInt())"online":"hide"}).OrderByDescending(x=>x.status);//这里要根据用户是否在线这个字段排序,保证在线用户都在好友列表最上边注释的部分就是改动的地方,这样我们在看一下初始化layim之后返回的json格式信息。

看到画红框的地方了吧,我的两个好友都不在线(hide)。但是呢,图标还是亮的,怎么办,那就需要等数据加载完之后我们用上边的处理图标的js处理一下。没错,又要改layim代码了。(PS:官方是不建议改的哈,否则升级不好整合)好多同学想要改代码无从下手,我简单说一下我的改代码思路。其实无论js要干嘛,最终它还是为html服务,所以,我们找到用户头像的标签:

上图呢是处理过的图片,不过没关系,我们只要关心,这个img标签在哪里就可以了。(注意:data-status是我加的,也就是说,改源代码就是加了这么个东西)然后我们找到layim代码,从模板里面找就可以了。

红框的地方就是我改动的地方。改完它之后,我们在看主界面,这样我们就知道img标签中,哪个是需要处理成黑白图片的了。然后在ready方法中调用:

#region获取某个用户的好友列表///

///获取某个用户的好友列表//////用户ID///返回格式如下""或者"10001,10002,10003"publicstringGetUserFriends(intuserid){//先读取缓存varfriends=LayIMCache.Instance.GetUserFriendList(userid);//如果缓存中没有if(friends==""){//从数据库读取,在保存到缓存中friends=_dal.GetUserFriends(userid);LayIMCache.Instance.SetUserFriendList(userid,friends);}returnfriends;}#endregion由于灰色头像是base64的,如果用户上线,我们需要把该用户原来的头像传给前端,然后替换该头像。所以,这个缓存我暂时就把头像信息也保存进去了(业务耦合了)。看一下Redis中的值:

如图所示,用户10003的好友为:10004,10005.值组成格式为:userAvatar+$LAYIM$+friendids。同样,我们在HubServer中增加发送用户上下线消息的方法:

///

///发送用户上下线的消息///publicstaticvoidSendUserOnOffLineMessage(stringuserId,boolonline=true){intuserid=userId.ToInt();//1.获取用户的所有好友varusers=LayimUserBLL.Instance.GetUserFriends(userid);//没有好友,不发消息varfriends=users.Split(newstring[]{"$LAYIM$"},StringSplitOptions.RemoveEmptyEntries);if(friends.Length==2){varavatar=friends[0];varnotifyUsers=friends[1];//2.发送用户上下线通知UserOnOffLineMessagemessage=newUserOnOffLineMessage{avatar=avatar,online=online,userid=userid};SendMessage(message,notifyUsers,ChatToClientType.UserOnOffLineToClient,true);}}这个方法,就是获取缓存里面的用户好友信息和头像信息,然后组成一个新的Message,并发送消息。那么这个方法在哪里调用呢。我们还是回到LayIMHub代码中。

我们先运行一下,看看效果:

我们把消息定义成统一格式是有好处的,这样我们可以根据自己的业务进行处理,接受消息就一个接口:receiveMessage。可以看到msg里面有用户头像,和在线状态,还有用户id。得到了这些信息之后,我们去处理一下就OK了。

//重新设置用户头像,黑白或者亮resetUserAvatar:function(obj){varavatar=obj.avatar,online=obj.online,userid=obj.userid;//这句代码是定位到该用户下的头像varimgObj=$('#layim-friend'+userid).find('img');if(imgObj.length){if(obj.online){//如果上线了,将头像换成原来的头像,即非黑白头像imgObj.attr('src',avatar);}else{//将头像置黑grayscale(imgObj);}}}到此为止,功能开发结束。

本篇内容相对来说比上一篇多一点,涉及内容有,Redis缓存,更新等。图片黑白处理,SignalR消息处理。以及源代码阅读。

总之呢,最重要的部分就是SignalR这个推送如果稳定了,只要消息能够送达客户端,那么任由客户端去处理了。大家还有注意学会自定义消息内容。保证自己的业务能够顺畅。

THE END
1.趣谈双端离线状态下的授权认证实现离线授权原理昨天Anduin 在直播时讨论了一个相当有意思的话题,即在客户端和服务端均处于离线状态,且双端之间没有任何数据交换的情况之下,如何实现客户端对服务端的临时授权。其实类似的授权机制在生活中就有案例,比如我手机上的Steam令牌应用自登录以来就从来没连上网过,但是令牌中的动态密码却能够正确地完成电脑端Steam的身份认证https://blog.csdn.net/iSunwish/article/details/117298914
2.一日一技:三分钟离线运行开源大模型腾讯云开发者社区不能自定义模型,网页版的这些大模型,你没有办法做微调,难以自定义内容。当你花了大量时间设计了一个高级Prompt,把模型洗脑成了猫娘,结果第二天它又不能用了。 隐私泄漏问题,担心大模型的开发商把你问的问题和上传的信息挪作他用。 当你被这些问题困扰,那么你可以考虑离线运行开源大模型。完全不需要网络,因此不存https://cloud.tencent.com/developer/article/2392156
3.探究离线与实时采集的优缺点:你知道吗?5.离线采集和实时采集的应用案例 离线采集可以应用于各种历史数据分析场景,比如电商用户行为分析、金融风控建模等;而实时采集则可以应用于各种实时监控场景,比如交通路况监测、物联网设备状态监控等。6.如何选择离线采集或实时采集 选择离线采集还是实时采集,需要根据具体的需求场景来决定。如果对实时性要求不高,且数据https://baijiahao.baidu.com/s?id=1764387064552375037&wfr=spider&for=pc
4.360杀毒全新界面,化繁为简,更聚焦更好用 全新设计的产品界面,更加清爽、简洁。聚焦核心查杀功能,让使用变得更简单,让安全更突显;交互体验也全新设计,更尊重使用者的体验感受,更加化繁为简。 离线病毒库下载 如果您的电脑无法在线自动升级,可以下载离线病毒库进行升级.适用于已安装本地病毒库的用户。下载后直接运行,可以将https://sd.360.cn/
5.php如何判断用户在线还是离线判断用户离线在线的方法有很多,这里和大家说一个比较简单和常用的逻辑.思路: 一:首先获得用户最后一次保存的session_id //这里可以保存到数据库中获取 //假设 $memberSessionId = getMemberSessionId(); 二:用第一步获得的session_id 去查找当前session是否存在 //只要开启了session_start() ; 那么每个用户只要https://www.thinkphp.cn/code/383.html
6.360AI云盘官网360AI云盘是智能高效办公云盘。可以安全存储个人数据、实现多端同步、自动备份、在线编辑文档进行高效办公,可跨平台使用,支持PC电脑、Android手机、iPhone手机数据备份、同步,随时随地移动办公。https://www.yunpan.com/
7.离线与实时数据开发一、离线数据开发平台 统一计算平台 统一开发平台 二、任务调度系统 调度系统的核心设计模型 调度引擎工作原理 执行引擎工作原理 三、实时流技术 流对于一个功能单一,用户少,并发小的系统,接入层的确没有必要独立出来。但对于一个复杂的系统来说,如果把也接入层和业务层合并势必导致某一业务模块的代码https://zhuanlan.zhihu.com/p/514855197
8.电脑上用qq“查找”用户显示离线状态,然而朋友qq却显示是手机在线8条回答:【推荐答案】好像我的也是一样的,一般你用电脑查找好友的话,头像都是灰的,用手机的话,头像都是在线的状态……https://wap.zol.com.cn/ask/x_7225527.html
9.JavaScript检测用户是否在线的6种方法总结javascript技巧console.log("WebSocket连接错误,用户离线"); }; 7.使用场景 1.使用navigator.onLine属性和online、offline事件: 使用场景:适用于简单的在线/离线状态检测,不需要精确判断用户是否真正连接到互联网。 优点:简单易用,无需额外的网络请求。 缺点:只能检测到用户设备是否连接到网络,无法判断是否真正连接到互联网。 2.使https://www.jb51.net/javascript/296680xtq.htm
10.用户指南数据中心收到数据申请后会根据数据的需求情况及时与用户联系,明确用户的需要。 3、签署共享使用责任书 数据中心与数据申请者确认数据需求后,数据申请者需签署数据共享使用责任书。 4、数据提供及反馈 数据中心根据数据申请表中的内容对用户申请的数据进行授权和数据加工处理,从在线下载和离线拷贝、邮寄的方式提供给用https://www.phsciencedata.cn/Share/jsp/PublishManager/userGuide.jsp
11.常见问题·国产操作系统麒麟操作系统——麒麟软件官方网站2) 麒麟系统下如何离线安装软件 A: 此处假设安装QQ客户端,在QQ安装包所在目录空白处,右键选择“在终端中打开”,执行命令:sudo dpkg -i qq-0-arm6deb 输完命令回车,提示输入密码(输入的密码不会显示在屏幕),输完回车即可完成;3) 麒麟系统下如何在线安装软件https://www.kylinos.cn/support/problem.html
12.php怎么知道用户是在线?Worktile社区1. 网络心跳包:通过向用户设备发送网络心跳包,并监听其回应,来判断用户是否在线。网络心跳包就是指定时间周期性地向用户设备发一个网络请求,如果用户设备成功回应了请求,则可以判断用户在线;反之,则可以判断用户离线。 2. 用户活跃状态监测:可以通过监测用户的活动来判断用户是否在线。比如记录用户的最后一次活动时间,https://worktile.com/kb/ask/156581.html
13.用户离线实时画像融合实践得物技术本文主要讲述用户画像在离线、实时方面的数据链路处理以及基于特定场景要求如何将离线、实时画像进行在线融合的过程。 1、引言 用户画像,即用户信息标签化,它本质是对用户的一种建模,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息,在现如今应用越来越广泛。本文主要讲述用户画像在离线、实时方面的数据https://www.51cto.com/article/720967.html
14.授权软件—ArcGISCityEngine资源文档使用此向导完成在线或离线授权过程。 授权用户 授权用户许可 (NUL) 允许 CityEngine 使用保存到 ArcGIS Online 或ArcGIS Enterprise 组织的许可。 要使用 NUL 登录,请在 ArcGIS Administrator 向导中选择 CityEngine 授权用户选项,然后单击确定。 启动 CityEngine 2023.0。 系统将提示您提供 ArcGIS Online 或ArcGIS Enterprihttps://doc.arcgis.com/zh-cn/cityengine/2023.0/install/linux/authorizing-your-software.htm
15.如何在Windows11(本地或在线)上创建新用户既然您已经对在线和离线用户帐户的期望有所了解,让我们看看如何在 Windows 11 上创建一个和添加一个新用户。 在Windows 11 上创建新用户(在线) 以下是使用 Microsoft 帐户在 Windows 11 上创建和添加新用户的几种方法。请注意,您不需要为此提供 Outlook 电子邮件 ID。您还可以使用任何其他电子邮件服务登录。 https://www.windows11.pro/7743.html
16.功能介绍客户端用户在线状态订阅#3,来自zhujun本文档旨在介绍客户端用户在线状态订阅功能,该功能允许开发者通过 SDK 接口实时监控和接收指定用户的在线或离线状态变更通知。这一功能对于需要实时交流、状态同步或用户活动监控的应用场景至关重要。 功能特点 实时状态通知 跨平台通知:订阅成功后,无论被订阅用户在哪个终端(Android、iOS、Web、PC、小程序)上状态发生变https://help.rongcloud.cn/t/topic/1208/3
17.云身份安全服务混合云版(一次性计费)快速部署指导(4).控制器配置网关接入的用户名密码和SPA; (5).控制器四要素:用户、角色,资源、网关; 用户关联角色,角色关联资源,资源关联网关; (6).虚拟门户白名单和SPA; (7).种子分发两种方式;离线、在线; (8).用户准入、角色准入 3. 系统部署模式 3.1 旁路部署(推荐使用) https://ecloud.10086.cn/op-help-center/doc/article/75135