==========第一期==========
1 如今做电商少不了优惠券,假设是这样的业务:
- 所有优惠券配置后所有用户可见
- 发放方式支持领取(支持发放有限数量,即抢券),抽奖
- 优惠券支持指定商品分类
2 Model设计:
- 名称 varchar(20)
- 描诉 varchar(50)
- 优惠券金额 int
- 满减条件金额 int
- 支持的商品类别id int
- 是否有效 boolean
- 是否可领 boolean
- 发放数量 int 0表示无限
- 抢卷时间起 datetime
- 抢券时间止 datetime
- 有效期起 datetime
- 有效期止 datetime
- 更新人 varchar(10)
- 更新时间 datetime
- 创建人 varchar(10)
- 创建时间 datetime
3运营后台:
3.1 通用功能 增删改查
- 逻辑判断:
- 创建时若不指定起止时间,则立即发布
- 创建时若不指定商品分类,则为通用
- 创建时若设置满减条件为0,则为代金券
- 仅能删除未发布的优惠券
3.2 运营操作
3.2.1 下架
- 定义: 设置在有效抢卷时间内的优惠券为不可领,但已领到的依然可用;
- 逻辑判断:
- 对未开始抢券的优惠券操作下架,提示可以修改/删除,不能下架
- 当优惠券抢完后,系统自动设置为下架
4 后台服务
4.1抢券服务
- tornado 处理请求
- redis 操作券数量的增减: string类型,记录某一优惠券的数量;
==========第二期==========
业务:
- 取消用户抢劵;改为系统发放
- 不考虑兼容上期优惠券(产品还算有良心。。。)
- 发劵分为:面向老用户发放;指定时间范围,向新注册用户发放;指定某范围发放;上传手机号.txt发放
Model:
优惠券实体表:
- status int comment ‘状态: 0无效1有效’;
- name varchar(64) comment‘名称’
- desc varchar(64) comment ‘描述’
- coupon_amount int comment ‘满减条件:0代金券;非0满减券’
- amount int comment '满减金额'
- start_time datetime comment '有效期起'
- end_time datetime comment '有效期止'
- create_user int comment '创建人uid'
- create_time datetime comment‘创建时间’
- update_user int comment ‘修改人’
- update_time timestamp not null default on update current_timestamp;
发劵关系表:
- status int comment ‘状态:0 无效 1待发放 2发放中(管理系统前端展示归属于未发放) 3 已发放’
- coupon_id int comment ‘优惠券id’
- grant_start_time datetime comment‘发卷时间起’
- grant_end_time datetime comment‘发卷时间止’
- count int comment ‘发放数量’
- create_user int comment '创建人uid'
- create_time datetime comment‘创建时间’
- update_user int comment ‘修改人’
- update_time timestamp not null default on update current_timestamp;
用户关系表基本不变: 略
发放业务实现
技术栈:
- RabbitMQ 消息队列;异步通知,分布式运算
- Redis: 支持丰富数据结构且可靠的缓存数据库
面向老用户/解析上传手机号/指定范围:
- 运营后台配置,异步发放
- 发起RabbitMQ事件,独立进程监听,分批次向User请求uid
指定时间向新用户:
- 监听User用户注册事件
- 获取所有发放中的新用户优惠券