一:开发一个新业务的流程
产品经理通过需求分析生成产品原型
分析产品原型
功能
核心数据流转
接口设计
分析实体类,设计数据库表
实现接口
自测
联调
二:我的课程
(1)添加课程到课表接口将课程添加到课表
(2)删除我的课程接口将课程从课表中删除
(3)分页查询我的课表接口
(4)查询我正在学习的课程接口
三:学习计划和进度
四:积分排行榜
技术点:Redis中BitMap:(底层是Redis中String数据结构构造出的一种数据结构)通过位数组来存储数据的一种数据结构每一位就是一个0或者1
1.连续签到系统(包括新增签到记录和查询签到):(一个用户一个月的签到信息只记录一条信息,用1表示已经签到,0表示没有签到),可以用BitMap实现,利用BitMap只需要一条数据就可以统计一个用户一个月的签到信息.既节省了空间消耗又减少了数据条数;(将用户id+年月作为key,签到记录存到BitMap中)
实现原理:
(1)准备一个31一位的位数组,定义一个Long类型的31为二进制数值;
(2)循环31次,将位数组与1做按位与(&)运算,就是若果俩数相对应的位数都为1那么做按位与运算的结果就是1,
(3)若果运算结果为1,则证明签到了,对签到次数累加,结果为0则为没签到
(4)每循环一次就将31为的二进制右移一位,也就是舍掉最右面一位,在做按位与运算就能统计签到情况
(5)在计算过程中判断连续签到次数,根据连续签到次数会有不同的积分奖励
2.新增学习积分,3.查询今日积分
1.改积分系统牵扯到多个微服务之间的调用,学习微服务调用笔记微服务在这里我们使用的是RabbitMQ异步远程调用,
涉及到不管学习微服务还是笔记微服务,都将消息发送到MQ消息队列中(userId和积分,类型不用发可以根据消息队列
的类型知道积分类型),然后学习微服务监听MQ中的消息,从而获取消息,然后将积分信息插入到积分记录表.
2.MQ的搭建创建一个交换机和根据积分行为创建队列多种类型的消息队列,交换机根据不同的积分行为发送消息到不同
类型的消息队列
3.创建多种类型的监听器监听MQ中的消息,获取MQ中的消息,然后将消息插入到积分记录表(因为每个行为每天获取到的
积分是有上限的,首先查询积分记录表当日积分总数,判断是否超过当日获取积分上限,若果超过上限则不再添加积分记录,
如果没超过积分上限,在插入积分记录)
4. 注意:签到产生的积分需要在Redis中查询,其他行为产生的积分在MySql中查询
SpringTask定时任务的缺点:
1.cron表达式写死在代码,不方便修改
2.没有记录任务执行日志,若果任务执行失败,也不能及时通知调试人员
3.服务搭建集群,任务会出现重复执行
4.任务无法分片;
XXL-job可以解决SpringTask所有缺点,所以该业务使用XXL-job定时任务实现该功能
五:优惠券系统
1.优惠券的增删改查
2.优惠券的发放
Base32生成兑换码:
- 生成50位二进制数;
(1)生成自增整数int,一个int4个字节工32位
(2)14位签名
32位每4位一组生成8组转换成10进制
与另外一个8个十进制整数(秘钥)做混合运算,奖结果转换成14位二进制
(3)4位的新鲜值,4为最大16种可能,用来对秘钥编号,也就是说总共有16组8位的秘钥,每次做混 合运算随机挑选秘钥,防止秘钥被识破
- 每5位一组,总共十组;
- 每一组1个字符,总共十个字符
00000-------------->A
00001-------------->B
...............................
11110-------------->8
11111-------------->9
- 24个英文字母+8个数组,组成了Base32,只能生成32中字符
项目实现:
1.利用redis中对key做自增的方法,increment方法实现对整数的自增;
2.将优惠券id的后四位作为新鲜值;
创建线程池
在线程池中实现兑换码的生成,因为如果大量生成兑换码,在主进程中生成,会影响程序的性能;
如果利用创建线程的方法,那么每次生成一个兑换码就会创建一次线程和伴随着销毁一次线程,也不利用程序的性能,所以采用创建线程池的方法生成兑换码.