专栏首页飞天小牛肉Echo 的私信列表与详情页是怎么做的

Echo 的私信列表与详情页是怎么做的

先看效果图吧:

私信列表

私信详情

从图片上可以看出来,我们要做的事情大概有这些:

1)私信列表:

  • 查询当前用户的会话列表,且每个会话只显示一条最新的私信
  • 查询某个会话的私信数量
  • 支持分页显示
  • 显示未读消息数量
    • 显示与某个用户对话的未读消息数量
    • 显示所有对话的未读消息消息

2)私信详情:

  • 查询某个会话所包含的私信
  • 支持分页显示
  • 访问私信详情时,将显示的私信设为已读状态

OK,先回顾下私信表的结构:

  • id:私信/系统通知的唯一标识
  • from_id:私信/系统通知的发送方 id
  • to_id:私信/系统通知的接收方 id
  • conversation_id:标识两个用户之间的对话。比如用户 id 112 给 113 发消息,或者 113 给 112 发消息,我们规定这两个会话的 conservation_id 都是 112_113。这样,通过这个字段我们就能迅速查出 112 和 113 之间的私信往来。当然,这个字段是冗余的,我们可以通过 from_id 和 to_id 推演出来,但是有了这个字段方便后面的查询等操作
  • content:私信/系统通知的内容
  • status:私信/系统通知的状态(这个字段就是我们实现未读消息的关键)
    • 0 - 未读(默认)
    • 1 - 已读
    • 2 - 删除(暂未使用)
  • create_time:私信/系统通知的发送时间

需要注意的是:这张表不仅存储用户之间的私信,也存储系统通知,不同的是,系统通知的 from_id 特定为 1,而这个 id 为 1 的用户是我们手动内置进去的。

Dao 层

根据上述罗列的大致需要做的事情,我们来定义下 Dao 层的操作。

分页查询这里就不再说了,直接复用我们封装好的模型即可,不明白的小伙伴可以看这里 Echo 的帖子列表与分页是怎么做的,需要注意的是,分页查询需要获得该用户的所有会话数量(该方法是 selectConversationCount,与接下来介绍的 selectConversations 差不多,这里),从而计算页数。

首先,对于私信列表页:

1)询问当前用户的会话列表,针对每个会话只返回一条最新的私信:selectConversations

对于当前用户来说,它的会话列表中,不仅包含别人发给他的,也包含他发给别人的,所以在查询的时候,只要这条私信的 from_id 或者 to_id 的其中一个字段与该用户的 id 相同,那么就认为这条私信属于该用户。

至于这条私信需不需要显示在会话列表中呢?

我们说了,针对每个会话只返回一条最新的私信。这个也好办,首先按照 conversion_id 也就是会话 id 进行分组归类,查到这个分组所拥有的所有私信后,私信记录 id 最大的那条就是这个分组会话中最新的私信。

看代码,不难理解:

2)查询某个会话的私信数量:selectLetterCount

这个简单,直接按照 conversation_id 查就行。

3)显示该用户的未读消息数量,这个功能包含两点:显示与某个用户对话的未读消息数量;显示所有对话的未读消息消息。

轻车熟路,使用动态 SQL,一个方法搞定:selectLetterUnreadCount

如果传入的参数 conversationId == null,就查询该用户所有会话的未读私信数量;如果传入的 conversationId != null,则查询这个会话的未读私信数量。

另外,未读消息即状态 status = 0。既然是未读消息,那肯定是别人发给我的对吧,我发给别人的消息谈何未读呢?所以这里需要指定 to_id 等于该用户的 id。

再来看私信详细页需要做的事情:

1)查询某个会话所包含的私信:selectLetters

和查询某个会话的私信数量 selectLetterCount 方法差不多,没啥难度,直接按照 conversation_id 查就行。

2)访问私信详情时,将显示的私信设为已读状态

具体的业务逻辑我们下文会讲,这里只解释下 Dao 层批量修改私信状态的操作:updateStatus

表现层

前端部分我就不写了,直接获取后台存入 Model 中的值就行。

首先,对于私信列表:getLetterList

这段代码大部分没啥好说的,需要注意的是查询未读消息数量这块,各位应该注意到在我们的界面顶部也会显示一个未读消息数量,这个数量是未读私信的数量和未读系统通知数量(后续文章会写)的总和,这个怎么做呢?怎么把未读私信的数量和未读系统通知数量实时的传过来呢?

没错,拦截器。

这样,前端读取 allUnreadCount 这个属性就行了。

再来看私信详情:getLetterDetail

这里需要注意的就是上图粉红色框中的代码。

可能有些小伙伴会疑惑私信目标 target 是干啥的,这个不难理解,看下图:

这里需要做个简单的判断,上文说过, conservation_id 的生成是需要遵守一个规则的,比如用户 id 112 给 113 发消息,或者 113 给 112 发消息,我们规定这两个会话的 conservation_id 都是 112_113。也就是说 id 按照从小到大排的。

那如果当前登录用户是 112,这个会话里显示的私信目标就应该是用户 113;如果当前登录用户是 113,那这个会话里显示的私信目标就应该是用户 112。具体判断代码看这里:

OK,再来看如何将私信列表中的未读消息改为已读。

具体流程是这样的:进入私信详情页后,先从当前页的私信列表 letterList 中获取当前登录用户未读私信的 id,然后批量的将这些 id 对应的私信状态设置为已读。

这里多提一嘴,防止有小伙伴懵逼,我们的私信列表 letterList 是按照分页查询的,每次进入新的一页,letterList 就会发生新的变化。所以你看到的效果就是这样的:

当你点开一个会话后,你会先进入第一页,然后第一页消息列表中的所有未读消息的状态都会被设置为已读;你进入第二页,于是第二页消息列表中的所有未读消息的状态都会被设置为已读......

至于如何获取当前登录用户未读私信的 id,没啥好说的,这里直接贴个图吧:

本文分享自微信公众号 - 飞天小牛肉(CS-Wiki),作者:飞天小牛肉

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Echo 的帖子列表与分页是怎么做的

    业务逻辑这个模块的文章后续应该都会改成一元钱的付费文章了,emmm,算是一点精神上的慰藉吧。毕竟这种类型的文章不像 Java 八股文那样铺天盖地都是现成的博客、...

    飞天小牛肉
  • Echo 的发送私信是怎么做的

    这篇教程新鲜的东西不多,私信发送和帖子发布的做法如出一辙,都是使用 Ajax 异步实现,参见这篇文章:Echo 的发帖操作是怎么做的

    飞天小牛肉
  • 私信基本功能数据库设计

    上一篇写了基于resin4.0+websocket实现私信功能服务端消息推送文章,趁热打铁,在写一篇关于私信功能的数据库设计文章,非代码篇,希望想对第一次做设计...

    哎_小羊
  • Echo 项目结构分析

    Echo 项目后端采用 MVC 模式,使用现在流行的 SpringBoot 框架。SpringBoot 是基于 SpringMVC 衍生出来的框架。宗旨是较少配...

    飞天小牛肉
  • Jenkins把GitHub项目做成Docker镜像

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    程序员欣宸
  • PHP中针对区域语言标记信息的操作

    相信大家对 zh_CN 这个东西绝对不会陌生,不管是 PHP 中,还是在我们的网页上,都会见到它的身影。其实这就是指定我们的显示编码是什么国家或者地区的,使用何...

    硬核项目经理
  • Echo 的系统通知模块是怎么做的

    系统通知是一个很常见且必要的需求,当发生点赞、关注、评论操作的时候,系统就会给相应的用户发送通知。

    飞天小牛肉
  • Jenkins自动部署测试环境之jar包部署

    1、测试环境是由开发去更新的,当开发忙于改bug的时候,测试环境更新频率比较低,问题不能得到及时的验证

    小博测试成长之路
  • 小心!智能音箱正在监听你?

    导语:无论是我们的家里还是身上或多或少都会携带智能语音设备,如今甚至连儿童玩具也越来越智能了。但是当我们与这些虚拟助手交谈的时候,背后倾听的人究竟是谁?我们是否...

    AI科技大本营
  • 利用K8S技术栈打造个人私有云(连载之:初章)

    最近在学习Docker技术,相信Docker技术大家都有所了解,Docker类似于虚拟机(但与虚拟机又有本质不同),提供进程级别的隔离。我们可以利用Docker...

    CodeSheep
  • 开源社区系统 Echo 超全文档助力春招

    寒假前半个月到现在差不多一个多月,断断续续做完了这个项目,现在终于可以开源出来了,我的想法是为这个项目编写一套完整的教程,包括技术选型分析、架构分析、业务逻辑分...

    飞天小牛肉
  • SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战

    本文章主要讲述Docker、Jenkins、GitLab、Git、JDK、SpringBoot、Maven等技术结合实现自动化运维部署(DevOps)应用工程,...

    JAVA葵花宝典
  • TCB系列学习文章——在云函数内使用 Redis 扩展

    打开腾讯云控制台,进入到环境详情页面,点击左侧的「拓展管理」,进入到拓展管理详情页,并点击 Redis 拓展,安装拓展。

    F颜
  • .Net微服务实战之CI/CD

      在软件工程不少的思想、概念来源于建筑工程,大家也喜欢把开发软件比喻成建房子。那么如果说运维是软件的地基,那么框架就是承重墙。起房子就是先打地基,再建承重墙。...

    陈珙
  • Gradle敏捷打包,多版本,多渠道,多环境,多功能,多模块随心所欲

    前段时间收到很多朋友的私信,咨询交流相关技术的,也有来约稿的,前一阵子收到幕课网的邀请,要不要去做视频课堂讲师(对他们来说就是特定课程来源渠道)或者出个特定的专...

    开发者技术前线
  • “虚拟个人助理” 一览

    昨天谈到苹果的Siri进入了mac os最新版本 除了Siri之外,个人助理产品被认为是用户交互关键入口,因此众多大公司参与进来争夺,今天来分别介绍一下典型的几...

    大数据和云计算技术
  • Linux入门篇(一)——基本命令

    这是看到有很多人都是在用虚拟机做网站之后找到的部分linux小白入门,希望大家能多多了解一下linux的相关技术,对于优化服务器有着很好的帮助。

    吾爱小白
  • 注册、登录和 token 的安全之道

    最近想要做一个小项目,由于前后都是一个人,在登录和注册的接口上就被卡住了,因此想登录、注册、口令之间的关系,使用 PHP 实现登录注册模块,和访问口令。

    码农编程进阶笔记
  • 亚马逊发布智能时尚助手Echo Look,引发大量吐槽

    安妮 李林 编译整理 量子位 出品 | 公众号 QbitAI 昨天,亚马逊推出了一款名叫Echo Look的新设备。它在Alexa、Echo基础之上添加了拍照与...

    量子位

扫码关注云+社区

领取腾讯云代金券