我在最近做了一个微服务项目,说是微服务项目,但其实核心技术还是SpringBoot那一套核心技术,对于我们初学者把前面那些基础学好是非常的有必要的。我们先来看看这个小模块,因为我负责个人中心的一些小功能的实现,就把其中一个比较有代表性的签到功能拿出来分享给大家。刚开始我做这个功能的时候也是一脸懵逼、无从下手,在博客上面逛了好久也没有想到比较好的思路,本人新手,其中如果有什么不对的地方还麻烦路过的大神请多指教。
先来看这个数据库表的设计
我们数据库表几经更改,最后都是按照最新的阿里开发规约黄山版设计。
首先是用户签到表,这个存储的用户信息id,并且通过这个外键来查询具体记录,我们这前端只传给一个userInfoId,从这个我们可以得到用户的持续登录天数,后期也比较好的去判断用户每天是否签到,有助于业务的处理。
再就是用户签到积分里程明细表,用户签到之后积分会有相应的增加,我们就通过这张表记录详细的用户签到的积分里程信息。因为前端传来的也是userInfoId,并且积分在下单过程中是能够消费的,可以用来抵扣一部分的现金,涉及订单的东西就会比较麻烦,因为得确定订单状态,之后还有可能涉及失败回滚,积分退回这一操作。还有一个功能就是绑定消费券,用一定的积分换取消费券也是一个需要实现的,所以就在这个表中加了消费券的相关外键。再就是需要确定积分的来源与去向,通过一个type就能较好地实现,从而避免既创建积分消费表又创建积分增加表的繁琐,在具体业务查询也是比较方便,可以自己直接判断或者使用一个枚举类都是不错的选择。当然这个积分里程数是这里的核心,是必不可少的。第三是这个过期积分的处理,我们因为之前经验不足,而直接使用xxl-job这个分布式定时任务中间件,我在之前的博客也有整理一些xxl-job的相关知识,大家想深入了解一下可以看下这篇文章
当然其中有一些东西也是我们忽略的,最后师哥说如果直接使用这个那定时任务设置的更新时间就有很大的问题,如果设计的是1s更新一次那就对系统是很大的性能消耗,设计1min那时效性又会比较差;过期积分放在Rocket延时队列或者Redis延迟队列中,比如优惠券过期时间,就是到了那个时间之后,才把消息发给你,这样就能保证数据的实时性。这个表也是后来做业务新增需求之后新增的,这样也方便业务的处理。
接口测试
接口测试用的国产软件ApiPost,挺适合团队协作开发的,大部分都是中文,可以较好替代Postman这个工具,推荐大家有时间可以去GitHub上下载使用一段时间试试。
当然还有很多功能是后续优化的时候还需要再添加到里面去的。
相关实体类
@Data
@TableName("user_mileage_req")
public class UserMileageReq implements Serializable {
@TableId
@JsonIgnore
private Long id;
/**
* 用户账号编号(消费者);关联user主表id字段,n vs 1
*/
@JsonIgnore
private Long userInfoId;
/**
* 优惠券编号(积分兑换优惠券);关联discount_coupon主表id字段,1 vs 1
*/
@JsonIgnore
private Long discountCouponId;
/**
* 订单账号编号(积分订单抵现);关联order主表id字段,1 vs 1
*/
@JsonIgnore
private Long orderInfoId;
/**
* 积分变化类型
*/
private Integer type;
/**
* 积分数量
*/
private Integer mileageCount;
public UserMileageReq(Long id, Long userInfoId, Long discountCouponId, Long orderInfoId, Integer type, Integer mileageCount, Date createTime, Date updateTime, Integer deleted) {
this.id = id;
this.userInfoId = userInfoId;
this.discountCouponId = discountCouponId;
this.orderInfoId = orderInfoId;
this.type = type;
this.mileageCount = mileageCount;
this.createTime = createTime;
this.updateTime = updateTime;
this.deleted = deleted;
}
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
private Date createTime;
/**
* 更新时间
*/
@JsonIgnore
private Date updateTime;
/**
* 逻辑删除;单选:0-未删除,1-删除,默认值:0
*/
@JsonIgnore
private Integer deleted;
public UserMileageReq(Long id, Long userInfoId, Long orderInfoId, Integer type, Integer mileageCount) {
this.id = id;
this.userInfoId = userInfoId;
this.orderInfoId = orderInfoId;