积分系统设计

积分系统介绍

积分系统作为一个独立的模块,可以与许多其他模块集成,如评论、签到等

同时可以积分参与排行榜、优惠券兑换等扩展功能,激励用户持续访问

满足用户的成就感与竞争欲,促进网站访问量增长,深度融入平台生态

技术栈

SpingBoot,Maven,MyBatis,MyBatis-Plus,RabbitMQ

积分系统规则

  1. 签到规则(另起系统,复杂模块) 签到1天给1分 连续7天额外奖励10分 连续14天额外奖励20分 连续28天额外奖励40分 每月签到进度当月第一天重置

  2. 学习规则 每学习一小节积分+10,每天获得上限50分

  3. 交互规则(有效交互数据参与积分规则,无效数据会被删除) 写评价,积分+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集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值