积分系统介绍
积分系统作为一个独立的模块,可以与许多其他模块集成,如评论、签到等
同时可以积分参与排行榜、优惠券兑换等扩展功能,激励用户持续访问
满足用户的成就感与竞争欲,促进网站访问量增长,深度融入平台生态
技术栈
SpingBoot,Maven,MyBatis,MyBatis-Plus,RabbitMQ
积分系统规则
-
签到规则(另起系统,复杂模块) 签到1天给1分 连续7天额外奖励10分 连续14天额外奖励20分 连续28天额外奖励40分 每月签到进度当月第一天重置
-
学习规则 每学习一小节积分+10,每天获得上限50分
-
交互规则(有效交互数据参与积分规则,无效数据会被删除) 写评价,积分+10 每日获得上限为50分 写问答,积分+5 每日获得上限为20分 写笔记,积分+3,每次被采集+2 每日获得上限为20分
数据库表设计
积分表需要记录下列信息:
• 本次得到积分值
• 积分方式:1-课程学习2-每日签到3-课程问答4-课程笔记5-课程评价
• 获取积分时间
• 获取积分的人
新增积分逻辑
为了是其他业务与积分业务解耦,系统采用异步方式RabbitMQ
其他微服务负责产生积分,并向MQ中投递消息即可,消息分发到不同的对列上,积分系统对每个队列配置不同的监听,监听到的消息进行保存。
新增积分逻辑
1.将需要传递的数据:用户ID、获取积分的行为Type、积分数Points,封装到一个实体类中PointsRecord
2.再通过MQ工具类rabbitMqHelper.send()方法投递到对应的队列中
3.其中用户ID必须需要MQ发送,因为这个请求是从队列中发送的,没有走拦截器,所以拿不到ThreadLocal中的用户ID
4.在积分系统中配置每个队列的监听,每种积分行为分别配置不同的监听方法,每个方法都调用添加积分的方法
新增积分方法
注:签到积分没有上限,但是其他的业务有上限(以枚举形式存储)
根据传入的实体类中的数据(ID、行为、积分数)来计算当前用户本次应该添加的积分
如果是签到则直接保存积分,如果不是签到则遵循以下规则:
1.查询当前用户通过此方式已经获取多少积分
2.如果查询到的分数已经>=上限,没有操作直接if中return
3.如果查询到的分数+本次要加的传入的分数>=上限,则return上限减去查到的原有分数
4.如果如果查询到的分数+本次要加的传入的分数<上限,则不做处理
5.最后set创建时间,保存对象
积分查询
根据需要返回的数据类型编写sql,规则如下:显示今日通过什么方式,获得多少积分。
思路是查找之后分组并求和,将结果集封装到VO中返回,其中第二个points是为了映射属性起的别名
//分组统计当前用户今天获得的积分 @Select("select type,ifnull(sum(points),0) as points from points_record WHERE user_id = #{userId} and create_time BETWEEN #{begin} AND #{end} GROUP BY TYPE") List<PointsRecord> queryMyTodayPoints(Long userId, LocalDateTime begin, LocalDateTime end);
准备一个返回类型VO的集合,其中包含获取积分类型、当前积分、积分上限
遍历这个VO集合,将查询到的数据集分别赋值到或拷贝到VO中
最后返回这个VO集合