文档章节

砖头人:消息通知

caoyongjun
 caoyongjun
发布于 2016/12/12 23:00
字数 850
阅读 35
收藏 0
点赞 0
评论 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

前后端分离的一些理解

前后端分离 前后端分离,本质是关注点的分离。软件越来越复杂,需要有人来专注于表现和交互,有人专注于领域逻辑。于是前后端分离出现了。前端关注交互体验,这些看得到摸的着的部分。后端关...

HonChy ⋅ 2015/04/19 ⋅ 0

redis.conf中文版(基于2.4)

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

Liuxd ⋅ 2012/06/05 ⋅ 25

如何让编程产能翻二番?

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

dellfox ⋅ 2014/05/08 ⋅ 0

安卓推送技术手册——使用透传消息的正确姿势

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

illy安智 ⋅ 2015/06/03 ⋅ 3

Push Notification (推送通知服务)

概述 通常情况下,用户主动向服务器发出请求,服务器才会向用户传送数据,推送服务(Push Notification)的出现改变了这一状况,其思想是将浏览器主动请求信息改变为服务器主动发送信息。服务...

失足处男的倒霉孩子 ⋅ 2013/12/26 ⋅ 1

POSIX消息队列

@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Tahoma"; }@font-face { font-family: "Symbol"; }@font-face { font-fam......

树上的鱼 ⋅ 2014/03/13 ⋅ 0

iOS开发系列--通知与消息机制

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制,其包...

TomatosX ⋅ 2015/03/19 ⋅ 0

Web网站通知系统设计

写在前面: 通知系统是网站信息传播机制的重要的一部分,足够写一大章来说明。本文只梳理设计原则,后续相关内容会持续更新。 这里的通知包括但不限于公告、提醒或消息(不同使用场景下的功能...

天天顺利 ⋅ 2015/11/06 ⋅ 0

iOS推送消息

最近公司的项目中, 从产品设计上来讲, 推送这部分的功能做的还是很不合理的. 在当前的项目中, 用户的很多操作都依赖推送消息来完成, 通过推送消息来触发一些事件, 然后app做一些操作, 但是有...

hell03W ⋅ 2016/01/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部