Skip to main content

02小节:基于责任链模式创建优惠券模板

作者:程序员马丁

在线博客:https://nageoffer.com

note

热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。

基于责任链模式创建优惠券模板,元数据信息:

©版权所有 - 拿个offer-开源&项目实战星球专属学习项目,依据《中华人民共和国著作权法实施条例》《知识星球产权保护》,严禁未经本项目原作者明确书面授权擅自分享至 GitHub、Gitee 等任何开放平台。违者将面临法律追究。


内容摘要:讲解优惠券模板创建业务,说明创建接口数据验证存在什么样的问题,以及如何通过责任链模式进行优化。

课程目录如下所示:

  • 优惠券模板创建业务
  • 优惠券模板解析
  • Git 分支名称
  • 前置逻辑
  • 代码执行逻辑

优惠券模板创建业务

优惠券分为平台券和店铺券,平台券由平台运营人员创建和管理员审批,关系隶属于平台,用户使用后成本一般来说由平台和商家共同承担;而店铺券由商家在商家后台直接创建,无需审核,成本由店家独自承担。

优惠券模板解析

创建数据库 one_coupon_rebuild 数据库。

CREATE DATABASE IF NOT EXISTS one_coupon_rebuild;

1. 数据库表

可以进入到我们的 one_coupon_rebuild 数据库中执行下述 SQL 语句。

CREATE TABLE `t_coupon_template`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(256) DEFAULT NULL COMMENT '优惠券名称',
`shop_number` bigint(20) DEFAULT NULL COMMENT '店铺编号',
`source` tinyint(1) DEFAULT NULL COMMENT '优惠券来源 0:店铺券 1:平台券',
`target` tinyint(1) DEFAULT NULL COMMENT '优惠对象 0:商品专属 1:全店通用',
`goods` varchar(64) DEFAULT NULL COMMENT '优惠商品编码',
`type` tinyint(1) DEFAULT NULL COMMENT '优惠类型 0:立减券 1:满减券 2:折扣券',
`valid_start_time` datetime DEFAULT NULL COMMENT '有效期开始时间',
`valid_end_time` datetime DEFAULT NULL COMMENT '有效期结束时间',
`stock` int(11) DEFAULT NULL COMMENT '库存',
`receive_rule` json DEFAULT NULL COMMENT '领取规则',
`consume_rule` json DEFAULT NULL COMMENT '消耗规则',
`status` tinyint(1) DEFAULT NULL COMMENT '优惠券状态 0:生效中 1:已结束',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` tinyint(1) DEFAULT NULL COMMENT '删除标识 0:未删除 1:已删除',
PRIMARY KEY (`id`),
KEY `idx_shop_number` (`shop_number`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1810967816300515330 DEFAULT CHARSET=utf8mb4 COMMENT='优惠券模板表';

因为领取规则和消耗规则多变,所以使用 JSON 存储。后续如果有变化不需要改动表字段,改动 JSON 内容即可。

1. 领取规则

JSONObject receiveRule = new JSONObject();
receiveRule.put("limitPerPerson", 1); // 每人限领
receiveRule.put("usageInstructions", "xxx"); // 使用说明

2. 消耗规则

JSONObject consumeRule = new JSONObject();
consumeRule.put("termsOfUse", new BigDecimal("10")); // 使用条件 满 x 元可用
consumeRule.put("maximumDiscountAmount", new BigDecimal("3")); // 最大优惠金额
consumeRule.put("explanationOfUnmetC 3onditions", "xxx"); // 不满足使用条件说明
consumeRule.put("validityPeriod", 48); // 自领取优惠券后有效时间,单位小时

Git 分支名称

20240814_dev_create-template_chain_ding.ma

前置逻辑

1. 使用接口 API 工具

1.1 Maven 依赖引入

<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>

1.2 application.yaml 添加配置

springdoc:
default-flat-param-object: true
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: /v3/api-docs
group-configs:
- group: 'default'
paths-to-match: '/**'
packages-to-scan: com.nageoffer.onecoupon

knife4j:
enable: true
setting:
language: zh_cn

1.3 添加配置文件

@Slf4j
@Configuration
public class SwaggerConfiguration implements ApplicationRunner {

@Value("${server.port:8080}")
private String serverPort;
@Value("${server.servlet.context-path:}")
private String contextPath;

/**
* 自定义 openAPI 个性化信息
*/
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info() // 基本信息配置
.title("牛券-商家后台管理系统") // 标题
.description("创建优惠券、店家查看以及管理优惠券、创建优惠券发放批次等") // 描述 Api 接口文档的基本信息
.version("v1.0.0") // 版本
// 设置 OpenAPI 文档的联系信息,包括联系人姓名为"ding.ma",邮箱为"machen@apache.org"
.contact(new Contact().name("ding.ma").email("machen@apache.org"))
// 设置 OpenAPI 文档的许可证信息,包括许可证名称和许可证URL
.license(new License().name("山东流年网络科技有限公司").url("https://gitcode.net/nageoffer/onecoupon/-/blob/main/LICENSE"))
);
}

/**
* 方便大家启动项目后可以直接点击链接跳转,而不用自己到浏览器输入路径
*/
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("API Document: http://127.0.0.1:{}{}/doc.html", serverPort, contextPath);
}
}

解锁付费内容,👉 戳