Spring boot+LayIM+t-io 好友申请通知的实现

摘要: 本文包含内容:用户主页面信息加载,绑定。好友申请,t-io服务端主动推送,layim消息盒子的数据绑定。

前言

在上一篇Spring boot + LayIM + t-io 文件上传、 监听用户状态的实现中,已经介绍了两个小细节:用户的在离线状态和群人数的状态变化。今天的主要内容就是用户加好友的实现。

简介

加好友,大家用过QQ都知道,无非是发起好友申请,对方收到消息通知,然后处理。不过,本篇只讲前半部分,消息通知的处理留到下一篇去讲。因为内容有点多,怕是一时半会消化不了。在介绍主体流程之前,先给大家介绍一下准备工作。

发起好友申请

准备工作

首先,为了让数据更贴近实战,所以我用了比较“真实”的用户数据。结合fly模板,完善了用户中心头部的用户信息的数据绑定。数据绑定部分判断了是否已经是好友,来决定是否出现“加为好友”的按钮。示例如下,当用户自己看到自己的主页时,是这样的:

看到非好友的用户主页,是这样的:

绑定数据部分,简单给大家介绍一下,就是用thymleaf模板绑定。后台访问页面的时候,将 Model 赋值即可。

然后页面上,将model中的数据取出来。

加为好友

ok,以上就是简单的准备工作。想了解详情代码的可以去文末的github地址去搜寻。

发起好友申请

我们先根据layim的业务分析。首先,要知道我们要加谁(toId)为好友。然后在加上一个备注(remark)。这些东西交给后台就OK了。为了避免连表查询,对于系统消息的存储我做了用户名和用户头像的冗余。表主要包含字段:用户ID,用户头像,用户名,被申请用户ID,申请时间,申请类型,备注,已读等其他属性。

所以,发起好友申请就很简单了。就是一个添加功能,前端传的就是被申请人用户ID和申请备注,后端组织数据插入到数据库,代码如下:

OK,申请完了,下面我们要做啥?没错,通知对方,喂,我向你发送了申请,快快处理。在这里呢我遇到了一个问题。由于springboot程序占用端口 8080,而t-io占用端口8888,也就是说,如果我想在8080端口的业务中主动调用8888的服务推送,我不知道如何获取相应的channelContext。不过经过询问作者之后,一句话解决了我的问题。

拿到ServerGroupContext,问题迎刃而解。

在之前的程序启动的时候注册了 LayimWebsocketStarter 这个bean。所以,在8080业务端如果能拿到它的话就没问题了。

得到 LayimWebsocketStarter ,就能得到 ServerGroupContext,然后就能在服务端做主动推送了。

当然可能没有开发过这个东西,对于上文中的问题不是很理解,没关系,其实我就想说明,如果从服务端主动向客户端推送消息的话,使用ServerGroupContext即可。

服务端主动推送

OK,接上文,我们按照步骤来。

第一步,获取 LayimWebsocketStarter 。

第二步,获取ServerGroupContext

第三步,获取ChannelContext

第四步,发射。这里的代码就和聊天中的那部分代码差不多了。核心部分就是,获取ChannelContext,然后给他发送消息。如果不在线就不用管。

现在推送已经搞定了,那么什么时候推送呢?由于这个系统消息的推送可以不用那么即时,于是我看了下,springboot里面有类似的事件机制,于是乎ApplyEvent就诞生了。

在创建一个Listener,监听事件。

不过我有个疑问,发现listener中执行的时候是同步的。后来加了@Async和@EnableAsync 也没用,于是我就用了new Thread().start()实现异步,确保不影响主要申请流程。(这是个疑问,自己没搞明白的地方)

最后,别忘了在Application启动的时候把listener加上。

功能拼接

马上就要成功了,我们在把事件串起来,在好友申请成功之后,发布事件。

功能演示

讲了那么多,给大家看一下成品效果。(用户场景:安小鸟加皇上为好友,皇上接收消息并查看)

皇上收到消息,系统弹出左下角的小数字4。(调用 layim.msgbox(msgCount) 方法)

皇上点开消息盒子:

皇上收到了四位爱妃的申请,寝食难安,他会怎么处理呢?欲知后事如何,且听下回分解~~~

总结

本篇主要介绍了一个加好友的流程的实现。

好友申请按钮出不出现取决于用户是否为自己,是否已经是好友。(后端也要做验证)

t-io的服务端主动推送,如何调用。关键词:ServerGroupContext

event的使用,除了applicationEvent,还可以拓展其他类型,如消息队列,eventbus等。

各种细节处理,比如先判断对方是否在线,在去查询数据库。或者结合缓存等

由于是自己摸索,难免有代码繁杂混乱之处

本文来自企鹅号 - 开源中国媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈满iOS

公司Atlassian JIRA无法打开:Unable to round-trip http request to upstream: EOF

1263

面向网站的Google Analytics

Google Analytics 提供与您网站的访问者流量和营销情况相关的详细统计信息,让您更好地了解您的受众群体。对于任何有志于增加访问者群体的网站所有者来说...

765
来自专栏乐百川的学习频道

做一个运行Python文件的Atom插件

最近在学习Python,自然也安装了Atom编辑器的一些Python插件。有一个插件名字叫做atom-python-run,作用很简单,就是按F5运行当前Pyt...

2067
来自专栏还债之路

ansible管理mysql(安装初始化)

今天使用ansible安装管理mariadb数据库的时候,碰到问题,在网上找不到对应的解决办法。然后自己查资料,终于写出,

3717
来自专栏杨龙飞前端

git恢复到上次提交 4个区5种状态检查修改撤销修改

转载:https://blog.csdn.net/kangvcar/article/details/78809247

1011
来自专栏专注 Java 基础分享

Git版本控制系统之基本使用

     最早是通过接触著名的开源社区Github了解到Git的,但一直没有系统学习过。这次下定决心从头到尾系统的学一学,也将学习过程记录于此,供大家批驳。本篇...

1857
来自专栏Crossin的编程教室

【Git 第6课】 文件状态

在第4课的最后,我们用以下两条命令: git add readme.txt git commit -m 'my first commit' 向我们新建的git仓...

3346
来自专栏用户2442861的专栏

CMake与Make

但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译...

591
来自专栏mathor

根据网站错误页面判断服务器和系统服务

 随便找一个网站,比方说这个;https://777kuu.com/ ,在网址后面加上不可能存在的东西,比方说:https://777kuu.com/123.j...

512
来自专栏郭耀华‘s Blog

Git版本回退和撤销修改的区别

在阅读廖雪峰git教程时,对版本回退和暂存区撤销修改没太看懂,所以自己测试了一下。 版本回退: git reset --hard HEAD        这个命...

2567

扫码关注云+社区