一、基本需求
1. 活动有基本信息,不同的活动有不同的奖项(奖品)配置、活动时间、中奖规则、限制参与人数、限制中奖次数(每个帐号,每个ip,每个地区)、抽奖方式等信息设置
2. 奖项(奖品):如红包,积分,元宝,优惠券,实物(如充值卡,iPhone 7,乐视 65英寸 4K超清超薄电视机),再来一次,未中奖物品(如谢谢参与、感谢参与)等等,奖品类型:1.虚拟物品-系统在线发放(如金币,积分,元宝),2.邮寄实物(需要邮寄的,如电视,手机),3.用于填坑位的未中奖奖品(如谢谢参与),4.线下处理物品(如充值卡,线下人工转现金)
3. 在不同的活动中,每个用户每天有多少次的抽奖机会,每次抽奖是否需要消耗什么?如果需要则消耗什么(如积分,金币)
4. 抽奖方式: 固定次数(每个账号抽取N次),周期次数(账号每天抽取N次、账号每月抽取N次) 等
5. 中奖概率: 中奖概率N%,先抽先得,步长式(每抽N次有1人中奖)
6. 限制中奖次数: 每个账号限中N次,每天每个账号限中N次,每周每个账号限中N次
7. 中奖实物用户填写信息: 姓名,手机号,收件地址,邮编,性别 等
8. 有时候为了营造数百万人的参与感,会有虚拟参与人数及参与人员名单
二、需求原型
后台配置抽奖活动:
三、数据库设计
数据库表: 1. 抽奖活动表
2. 奖品字典表
3. 抽奖活动奖品配置表
4. 中奖记录表
5. 抽奖记录表
1.抽奖活动表 CREATE TABLE `t_lottery_act` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL DEFAULT '' COMMENT '活动名称', `rule_intro` text COMMENT '规则说明', `rule_config` text COMMENT '针对每个活动的个性化中奖规格配置,json格式', `online_start_time` int(10) unsigned DEFAULT '0' COMMENT '活动上线时间,活动链接可以访问了', `online_end_time` int(10) unsigned DEFAULT '0' COMMENT '活动下线时间,活动链接不能访问', `act_start_time` int(10) unsigned DEFAULT '0' COMMENT '活动开始时间,说明活动开始举行了', `act_end_time` int(10) unsigned DEFAULT '0' COMMENT '活动结束时间,活动结束,停止抽奖', `share_title` varchar(100) DEFAULT '' COMMENT '分享标题', `share_icon` varchar(255) DEFAULT '' COMMENT '分享图片地址', `share_intro` varchar(255) DEFAULT '' COMMENT '分享描述', `act_ext` text COMMENT '活动扩展信息,json格式', `status` tinyint(4) unsigned DEFAULT '1' COMMENT '状态 1:正常 0:删除', `created_at` int(10) unsigned DEFAULT '0' COMMENT '创建时间', `updated_at` int(10) unsigned DEFAULT '0' COMMENT '更新时间', `deleted_at` int(10) unsigned DEFAULT '0' COMMENT '删除时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='抽奖活动表'; 2. 奖品字典表 CREATE TABLE `t_lottery_prize` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `prize_name` varchar(100) NOT NULL DEFAULT '' COMMENT '奖品名称', `prize_code` varchar(100) DEFAULT NULL COMMENT '奖品唯一代号,用于处理特殊逻辑', `prize_icon` varchar(255) DEFAULT '' COMMENT '奖品图片', `prize_type` tinyint(4) unsigned DEFAULT '0' COMMENT '奖品类型,1.虚拟物品-系统在线发放(如金币),2.邮寄实物(需要邮寄的,如电视,手机),3.用于填坑位的未中奖奖品(如谢谢参与),4.线下处理物品(如充值卡,线下人工转现金)', `prize_ext` text COMMENT '奖品扩展信息,json格式', `status` tinyint(4) unsigned DEFAULT '1' COMMENT '状态 1:正常 0:删除', `created_at` int(10) unsigned DEFAULT '0' COMMENT '创建时间', `updated_at` int(10) unsigned DEFAULT '0' COMMENT '更新时间', `deleted_at` int(10) unsigned DEFAULT '0' COMMENT '删除时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='奖品字典表';3. 抽奖活动奖品配置表 CREATE TABLE `t_lottery_act_prize` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `act_id` int(10) unsigned DEFAULT '0' COMMENT '活动Id', `prize_id` int(10) unsigned DEFAULT '0' COMMENT '奖品Id', `prize_info` varchar(1000) DEFAULT '' COMMENT '冗余原始奖品信息,因为奖品信息不能修改,json格式', `prize_total_num` int(10) unsigned DEFAULT '0' COMMENT '奖品总数量,prize_total_num=prize_num+win_num', `prize_num` int(10) unsigned DEFAULT '0' COMMENT '奖品库存,剩余数量', `win_num` int(10) unsigned DEFAULT '0' COMMENT '已中奖数量', `act_prize_rule` text COMMENT '当前活动下当前奖品中奖规则配置,如中奖概率,json格式', `act_prize_ext` text COMMENT '当前活动下当前奖品扩展信息,json格式', `status` tinyint(4) unsigned DEFAULT '1' COMMENT '状态 1:正常 0:删除', `created_at` int(10) unsigned DEFAULT '0' COMMENT '创建时间', `updated_at` int(10) unsigned DEFAULT '0' COMMENT '更新时间', `deleted_at` int(10) unsigned DEFAULT '0' COMMENT '删除时间', PRIMARY KEY (`id`), KEY `idx_actid` (`act_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='抽奖活动奖品配置表'; 4. 中奖记录表 CREATE TABLE `t_lottery_win` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `userid` int(10) unsigned DEFAULT '0' COMMENT '用户userid', `act_id` int(10) unsigned DEFAULT '0' COMMENT '活动Id', `prize_id` int(10) unsigned DEFAULT '0' COMMENT '奖品Id', `user_ip` char(15) DEFAULT '' COMMENT '用户ip', `rule_snapshot` text COMMENT '中奖时的规则快照,json格式', `prize_snapshot` text COMMENT '中奖时的奖品快照,json格式', `win_ext` text COMMENT '预览扩展数据,json格式', `user_realname` varchar(50) DEFAULT '' COMMENT '用户姓名,中奖时填写', `user_mobile` char(11) DEFAULT '' COMMENT '用户手机号,中奖时填写', `user_address` varchar(255) DEFAULT '' COMMENT '用户收货地址,中奖时填写', `user_zip` varchar(10) DEFAULT '' COMMENT '用户邮编,中奖时填写', `hashkey` char(32) DEFAULT NULL COMMENT '防并发,防重复记录,值唯一', `fafang_status` tinyint(4) unsigned DEFAULT '0' COMMENT '0无需发放,1待发放,2发放流程中(邮件中),3已发放完成成功,4发放失败', `status` tinyint(4) unsigned DEFAULT '1' COMMENT '状态 1:正常 0:删除', `created_at` int(10) unsigned DEFAULT '0' COMMENT '创建时间,中奖抽奖', `updated_at` int(10) unsigned DEFAULT '0' COMMENT '更新时间', `deleted_at` int(10) unsigned DEFAULT '0' COMMENT '删除时间', PRIMARY KEY (`id`), UNIQUE KEY `udx_hashkey` (`hashkey`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='中奖记录表'; 5. 抽奖记录表 CREATE TABLE `t_lottery_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `userid` int(10) unsigned DEFAULT '0' COMMENT '用户userid,抽奖人', `act_id` int(10) unsigned DEFAULT '0' COMMENT '活动Id', `user_ip` char(15) DEFAULT '' COMMENT '用户ip', `log_ext` text COMMENT '预览扩展数据,如是否中奖,中奖Id,json格式', `hashkey` varchar(32) DEFAULT NULL COMMENT '防并发,防重复记录,值唯一', `date` char(8) DEFAULT '0' COMMENT '抽奖日期,年月日', `status` tinyint(4) unsigned DEFAULT '1' COMMENT '状态 1:正常 0:删除', `created_at` int(10) unsigned DEFAULT '0' COMMENT '创建时间,抽奖时间', `updated_at` int(10) unsigned DEFAULT '0' COMMENT '更新时间', `deleted_at` int(10) unsigned DEFAULT '0' COMMENT '删除时间', PRIMARY KEY (`id`), UNIQUE KEY `udx_hashkey` (`hashkey`) USING BTREE, KEY `idx_userid_date` (`userid`,`date`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='抽奖记录表';
四、安全及技术点问题考虑
1. 数据一致性,需要用到事务,数据库设计考虑唯一索引
2. 防并发、防刷(防作弊)
3. 。。。
五、营销活动类型扩展
大转盘、砸金蛋、摇一摇、抽奖箱、刮刮乐、老虎机