通用抽奖活动设计方案

一、基本需求

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. 。。。

五、营销活动类型扩展

大转盘、砸金蛋、摇一摇、抽奖箱、刮刮乐、老虎机

亲,我是有底线的
返回N方便官网