1.前言
本文章是紧接着上一篇文章《简易版抽奖活动的设计技术方案-CSDN博客》中内容进行扩展,包含数据库模块的扩展,抽奖接口逻辑的设计进行扩展设计。
2.数据库设计的补充
在上一篇文章中,数据库结构我们进行设计,增加奖池表,奖项规则表,奖品发放表
a.奖池表
奖池表中的主要字段如下所示,以前活动跟奖项是直接关联的,现在活动跟奖项是没有关联关系了,活动跟奖池有关联关系,奖池跟奖项有关联关系,1个活动对应多个奖池信息,1个奖池对应多个奖项信息
字段名 | 说明 |
id | 主键id |
name | 奖池名字 |
activity_id | 活动id |
用户命中奖池的规则,可以在活动的规则表中进行设置。也可以有单独奖池规则的表,本人觉得可以方法放到活动的规则表中。
b.奖项规则表
在上一篇文章中活动有自己的活动规则表,那么奖项是不是也可以有自己的奖项规则,这些奖项规则可以跟奖项进行绑定,那么这个奖项规则表的主要数据结构可以是下面这种结构:
字段名 | 说明 |
id | 主键id |
prize_id | 奖项id |
rule_type | 活动奖项规则 |
rule_value | 活动奖项规则的值 |
c.奖项的发放记录表
当用户参与活动进行中奖之后,后面就要进行奖品信息的发放,因为奖品的不同,发放的形式不同。其主要的数据结构如下:
字段名 | 说明 |
id | 主键id |
record_id | 中奖记录id |
send_way | 发放方式:线上发放 线下发放 |
send_result | 发放结果:成功/失败 |
third_id | 关联的第三方id |
这里的third_id,如果是线下发放的话,那么可以存放物流编号等物流信息,如果是线上发放,线上发放的话,如果是发放如京豆,积分等虚拟资产的时候,那么这个三方id可以设置为京豆,积分等虚拟资产的三方id。
3.抽奖的主要逻辑
抽奖接口的流程图
3.1 请求参数的合法性校验
这里面包含:活动的有效性校验,传入的活动信息是否正确,活动的时间是否有效等活动的基础信息的校验,也包含用户参与活动的合法性校验,当前用户是否有资格参与这个活动,以及接口的风控校验,对用户的防刷等操作
3.2 活动规则的校验
这个节点的主要作用:通过活动id查询活动的规则,根据活动的规则进行校验用户是否可以有参与活动的权限,如果一个活动有多个规则的话,就需要对活动规则的列表进行遍历,只有所有的活动规则都校验成功之后才能进行下一步。
3.3获取奖池信息
这里是根据活动信息和用户信息进行获取活动对应的奖池信息,这里有可能会获取不到对应的奖池信息,如果获取不到奖池信息,那么可以直接返回未中奖的信息
3.4 获取奖项信息
根据奖池信息获取奖项的列表,这里获取的奖项列表都是有库存的奖项,可以提前将奖项的库存给设置到redis缓存中,提升速度。如果有库存的奖项列表为空的话,则直接返回未中奖的信息
3.5 调用抽奖的算法
此时就可以采用抽奖的算法进行抽奖,每个活动可以有不同的抽奖的算法,这个也是存放到活动的规则列表,也可以进行细化到奖池维度,每个奖池有自己的抽奖算法也是可以。这个就看自己的业务需求了。
3.6 奖项规则的判断
在流程图中是先根据奖项规则筛选出哪些奖项可以进行参与抽奖,我们也可以在抽完奖之后,针对中奖的奖项,进行判断用户是否符合这个奖项的中奖规则。
3.7 奖项库存的更新
这个在流程图中是没有体现出来的,这个奖项库存的扣减,可以先对redis中的库存进行扣减,然后通过MQ进行扣减数据库中的奖项库存。针对这个MQ要做好幂等操作,防止重复扣减。
3.8 奖品发放
这个是完全是可以进行异步发放的,但是异步的时候记得保证数据的一致性,别造成了重复发放的问题。