文档章节

砖头人:消息通知

caoyongjun
 caoyongjun
发布于 2016/12/12 23:00
字数 850
阅读 36
收藏 0

此次最困难的功能,也找了很多资料最终花了一些时间实现了该功能(文章中的uml时序图是本人第一次画,有误差的地方肯定是有的,希望大家可以指点一二,在此谢过)

 

1.产品需求

从需求中提取了以下几点要完成

添加订阅动作
用户 发布,评论,送花,拍砖 会插入到 订阅表(为了订阅到后期有人评论时收到提醒)
评论内容动作时
用户每次对事件评论后产生信息并插入到消息表(为了订阅者获取某个事件的最后一个消息)
产生消息提醒
每次用户登陆或者其他操作时会触发产生消息队列,每次订阅表中获取订阅的事件最后产生的评论信息,放入消息表里
更新消息已读
每次点击进入详情时更新全部的消息提醒

 

2.设计实现

1.uml功能时序图

以下图是产生订阅事件信息及提醒信息时序图

 

以下图是用户触发从提醒表提取未读消息,放入未读表中,以及更改已读消息状态的时序图

2.数据库设计

主要字段解释 ( 红色部分为以后拓展功能时用到的这次不会用到的字段 )

  • subscription=订阅表:{content_id:“事件Id”,user_id:"用户id"}
  • notify=消息表:{sender_id:"对事件评论的用户id",content_id:”事件Id“}
  • user_notify=用户未读消息队列:{content_id:“事件Id”,user_id:"用户id",read_yn:"读取状态"}

3.重要代码实现部分

1.利用aop的after  每次拍砖,献花,评论后执行 后续的订阅,和生成评论消息动作,

此次使用aop 其实就是为了怕用户在做完主要动作后还要等待后续的动作会影响用户体验

<!-- 通知 -->
<bean id ="xmlHandler" class="com.brickman.aop.XMLAdvice"/>
	
<!-- aop 配置 消息-->
<aop:config>  
   <aop:aspect id="aspectService" ref="xmlHandler">
        	
    <!-- aop 监听拍砖,献花,评论后 执行 后续插入订阅表和生成评论-->
    <aop:pointcut id="remindPoint" expression="execution(* com.brickman.bo.*.insertRecord(..)) || execution(* com.brickman.bo.*.addComment(..))"/>  
            										
     <aop:after method="doAfterInsertRemind"  pointcut-ref="remindPoint"/>  
              
   </aop:aspect>  
</aop:config>  

 

2.每次如果订阅表里已经有了之前事件Id那么就更新订阅表的订阅时间

3.用户在登陆或者其他操作时触发生产未读消息队列

重点时找到notify中生成消息时间大于订阅表中的更新时间,并获取最大的notifyId相关数据

SELECT MAX(b.notify_id) AS notify_id,b.content_id AS content_id
FROM brick_subscription a,brick_notify b
WHERE a.content_id=b.content_id
    AND a.user_id = #{userId}
    AND b.sender_id <![CDATA[<>]]> #{userId}
    AND a.update_time <![CDATA[<]]> b.created_time
GROUP BY b.content_id

4.插入用户提醒队列表时 主要还要判断是否已经有过该事件如果有就不插入,为了避免两次mysql连接直接一次性写在一个sql中

INSERT INTO brick_user_notify ( user_id, content_id, notify_id ) 
  SELECT #{userId},#{contentId},#{notifyId}
  FROM DUAL
  WHERE NOT EXISTS (
    SELECT 1
    FROM brick_user_notify
    WHERE content_id=#{contentId} AND user_id=#{userId} AND notify_id=#{notifyId}
  )

点击进入用户未读消息的事件后,会更新某个事件的所有未读消息为已读

 

 

如果此时此刻,你也在北漂、上漂、广漂、深漂,那这里就是你的新家:www.brickman.cn。
欢迎加入砖头人大家庭,现邀请你体验为你定制开发的“砖头人app”。

© 著作权归作者所有

共有 人打赏支持
caoyongjun
粉丝 3
博文 9
码字总数 3875
作品 0
朝阳
程序员
Ubuntu 17.04 本周结束支持

Ubuntu 17.04 本周结束支持 IMCN 2小时前暂无评论 阅读 38 次 Ubuntu 17.04“Zesty Zapus”的官方支持将于2018年1月13日结束。 就是这个星期。 这个消息意味着,截至1月13日,在服务器、笔记...

IMCN
01/11
0
0
redis.conf中文版(基于2.4)

昨天研究Redis,顺便把配置文件翻译了。这是我学习技术的一种方法。 虽然还没仔细校对和润色,不过意思应该大体不错,特来分享。 求拍砖,让砖头来得更猛烈些吧!凑够砖头就可以回老家盖房子...

Liuxd
2012/06/05
0
25
如何让编程产能翻二番?

软件开发过程有一个很自然的比喻:建楼房,要画图纸、搭架构、砌砖头。这个比喻大体说得过去,问题是,这个“砖头”绝非普通的砖头,具有以下特性: 一、每一块都由手工制作; 二、每一块的材...

dellfox
2014/05/08
0
0
安卓推送技术手册——使用透传消息的正确姿势

目前的消息推送方式主要有两种:通知和透传。 什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业...

illy安智
2015/06/03
9.6K
3
网页端用HTTP收消息,怎么做到像TCP一样100%实时?

任何脱离业务的架构设计都是耍流氓。网页端收消息,究竟是推还是拉? 需求缘起 对于在网页端登录的用户A,发送方,也就是消息的来源有几方面: 系统发给A的“系统通知”,可能对实时性要求没...

萌闪电唰唰唰
08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day63-20180821-流利阅读笔记-待学习

性别歧视在日本:“我是女生,所以社会不让我学医” 毛西 2018-08-21 1.今日导读 大家在看病的时候,有留意过女医生的比例吗?在性别歧视现象十分严重的日本,男医生和女医生的比例达到了惊人...

aibinxiao
45分钟前
2
0
Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
4
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
1
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部