02小节:基于责任链模式创建优惠券模板
作者:程序员马丁
note
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
基于责任链模式创建优惠券模板,元数据信息:
- 什么是牛券oneCoupon:https://t.zsxq.com/pAWgS
- 代码仓库:https://gitcode.net/nageoffer/onecoupon —— 申请项目权限参考上述牛券项目链接
- 章节难度:★★★☆☆ - 较难
- 视频地址:https://t.zsxq.com/MgvbZ
©版权所有 - 拿个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);
    }
}