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);
}
}