你好,我是田哥
上一期给大家分享了电商项目实战:如何设计提醒商家
可能部分同学不理解什么是站内信,但我相信大部分同学是知道的,站内信说白了就是系统内部的一些消息,和发短信、发邮件类似,但是站内信只是系统内的发送,不想短信那样需要花money。
恭喜你,你的会员成功升级到了15级! 【xxx】【点赞】了你的【文章】【文章的标题】 你的文章 【xxx】 已被推荐到首页 你的喜好的【xxx】已经上线
比如下面这两种常见:
由此可知,站内信在系统里也扮演着一个非常重要的角色。
电商项目中,站内信肯定是少不了的,比如我们订单迟迟不付款,有的电商平台就会给你发站内信,提示你的订单还没有付款,或者提示订单快要超时了等等。
还比如,双11活动,各大电商平台会根据你的喜好,给你发送某某商品大促销,优惠多少多少,当你登录系统会有各种消息提示的。
站内信分为三个步骤:
运营人员会根据不同情况制定好不同的站内信模板,保存到数据库中(通常会保存到缓存中,减轻数据库压力)。运营人员可以对站内信模板进行CRUD。
登录系统就会有各种提示,然后点开查看消息,有时候消息很多,可以直接点全部已读,这样那个红点点就会消失,用户也可以对消息进行删除,或者消息里包含理解,用户可以直接通过连接跳转到对应页面。用户还可以选中关闭站内信的通知,比如:
我们可以先设计出一版,后期可能会有些些调整,但是核心部分是不变的。
我们可以设计出两张表:站内信模板表和用户站内信表
先来看看站内信模板表:
CREATE TABLE `tb_system_message` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(128) DEFAULT NULL COMMENT '标题',
`content` longtext DEFAULT NULL COMMENT '内容',
`create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`send_type` int DEFAULT 0 COMMENT '发送类型:全部发送、部分发送、单独发送',
`deleted` int DEFAULT NULL COMMENT '已删除',
`link` varchar(255) DEFAULT NULL COMMENT '连接',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='站内信模板表';
其实,和我们系统内短信模板有点类似,在代码实现时,由于站内信模板变更比较少,所以通常都会对其进行缓存(比如Redis),减轻数据库压力,提示系统性能。但是既然用到了缓存,那就不得不得面临着缓存的一些问题,比如缓存击穿、缓存穿透以及缓存数据一致性等问题。
关于站内信模板相关的操作过程:
用户站内信表:
CREATE TABLE `tb_user_message` (
`id` bigint NOT NULL AUTO_INCREMENT,
`message_id` bigint NOT NULL COMMENT '站内信id',
`message_content` longtext COMMENT '站内信内容,如果没有动态替换的就可以不用保存',
`receiver_name` varchar(64) NOT NULL COMMENT '接收人名字',
`receiver_id` bigint NOT NULL NOT NULL COMMENT '接收人id',
`read` int DEFAULT 0 COMMENT '是否已读',
`deleted` int DEFAULT NULL COMMENT '是否已删除',
`create_time` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='用户站内信表';
用户站内信表是对用户的,肯定有用户id了,对某个用户发送站内信,然后就保存一条记录。
用户某个行为,或者运营人搞什么活动之内的,在业务代码里查询指定的站内信模板,可能会有涉及到动态替换站内信模板中的内容,替换好了然后保存到这张表里,也就代表着一个站内信推送成功。
在业务代码里,通常会做异步发送站内信,比如可以用线程池,也可以使用消息队列。
如果系统内没有引入消息队列,那就不妨使用线程池,以后面试也可以用来吹牛逼,咱们也是用过并发编程知识到项目中了。然后,自己对线程池做进一步的深入研究,最后面试官不管怎么问线程池的问题都能轻松应对,还愁拿不到offer吗?
目前站内信模板的CRUD已经完成,接下来就是业务代码里把发站内信给搞定,这里就不专门说明了,会在对应业务代码里进行解释说明。
目前电商项目已形成文档如下: