最近开发了比较多类似商城类的项目,自然不可避免的优惠券的设计。 之前也没有做过此模块,加上 monday-shop 商城项目也没有此模块,正好趁着这段时间慢慢加上此功能。
参考一号店的样式,做了类似一个这样的模板

下面讲讲大概的逻辑:
# 模板表
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '优惠券标题',
`amount` decimal(8,2) NOT NULL COMMENT '满减金额',
`full_amount` decimal(8,2) NOT NULL COMMENT '门槛金额',
`score` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用多少积分兑换优惠券',
`start_date` date NOT NULL COMMENT '开始日期',
`end_date` date NOT NULL COMMENT '结束日期',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
# 优惠券表
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned COMMENT '会员主键',
`title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '优惠券标题',
`amount` decimal(8,2) NOT NULL COMMENT '满减金额',
`full_amount` decimal(8,2) NOT NULL COMMENT '门槛金额',
`start_date` date NOT NULL COMMENT '开始日期',
`end_date` date NOT NULL COMMENT '结束日期',
`used_at` timestamp NULL DEFAULT NULL COMMENT '使用日期',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',我们可以看到两张表很类似,大致业务流程如下
score代表需要积分兑换,某些商城需要积分才能兑换优惠券title, amount, full_amount, start_date, end_date公共字段复制给会员券表used_at为当前时间,代表优惠券已经使用,订单并关联优惠券主键used_at标记为null代表未使用类似京东还有一个比较有趣的功能,是我比较喜欢的。 就是使用兑换码来兑换优惠券。 我们可以新建一张这样的表。
# 兑换码表
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`template_id` int(10) COMMENT '优惠券模板主键',
`code` varchar(191) COMMENT '兑换码',
`user_id` int(10) NULL COMMENT '使用的会员主键',
`used_at` timestamp NULL DEFAULT NULL COMMENT '使用日期',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',template_id关联到券模板和code(随机码生成)即可user_id关联会员(也可不需要绑定用户)used_at判断是否使用过,user_id判断是否为正确的用户template_id找到优惠券模板,并为此会员生成一张优惠券