springcloud之项目实战搭建单体

news2024/11/28 11:43:45

写在前面

在上篇文章 中我们介绍了项目的整体内容以及架构,本文就开始实现一个单体的版本,在之后的文章中,在使用springcloud相关组件将这个单体的版本一步步的拆分为微服务的版本,在开始之前再贴下组件图:

在这里插入图片描述

本文我们分别来实现这四个组件。

源码 。

1:优惠券模板服务

完成后结构如下图:
在这里插入图片描述

1.1:api

定义服务请求和相应需要用到的公共的beans,单独定义的好处是,如果需要用到的话,单独引用即可,不需要引入其他不需要的类。
首先来定义优惠券类型的枚举:

@Getter
@AllArgsConstructor
public enum CouponType {
    UNKNOWN("unknown", "0"),
    MONEY_OFF("满减券", "1"),
    DISCOUNT("打折", "2"),
    RANDOM_DISCOUNT("随机减", "3"),
    LONELY_NIGHT_MONEY_OFF("晚间双倍优惠券", "4");

    private String description;
    // 存在数据库里的最终code
    private String code;

    public static CouponType convert(String code) {
        // .orElse(UNKNOWN) 避免有人使坏
        return Stream.of(values())
                .filter(bean -> bean.code.equalsIgnoreCase(code))
                .findFirst()
                .orElse(UNKNOWN);
    }
}

然后定义优惠券模板类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CouponTemplateInfo {

    private Long id;

    @NotNull
    private String name;

    // 优惠券描述
    @NotNull
    private String desc;

    // 优惠券类型
    @NotNull
    private String type;

    // 适用门店 - 若无则为全店通用券
    private Long shopId;

    /** 优惠券规则 */
    @NotNull
    private TemplateRule rule;

    private Boolean available;

}

优惠券类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CouponInfo {

    private Long id;

    private Long templateId;

    private Long userId;

    private Long shopId;

    private Integer status;

    private CouponTemplateInfo template;

}

具体的参考源码。

1.2:dao

采用spring data jpa 约定由于配置,提高生产力!。dao继承JpaRepositry,拥有基础的增删改查功能:

/**
 * coupon_template 表的spring data jpa(构建在hibernate之上的db操作框架)接口
 * https://blog.csdn.net/wang0907/article/details/131550318
 */
public interface CouponTemplateDao
        extends JpaRepository<CouponTemplate, Long> {

    // 根据Shop ID查询出所有券模板
    List<CouponTemplate> findAllByShopId(Long shopId);

    // IN查询 + 分页支持的语法
    Page<CouponTemplate> findAllByIdIn(List<Long> Id, Pageable page);

    // 根据shop ID + 可用状态查询店铺有多少券模板
    Integer countByShopIdAndAvailable(Long shopId, Boolean available);

    // 将优惠券设置为不可用
    @Modifying
    @Query("update CouponTemplate c set c.available = 0 where c.id = :id")
    int makeCouponUnavailable(@Param("id") Long id);
}

1.3:controller

定义模板模块对外的接口:

@Slf4j
@RestController
@RequestMapping("/template")
public class CouponTemplateController {

    @Autowired
    private CouponTemplateService couponTemplateService;

    // 创建优惠券
    @PostMapping("/addTemplate")
    public CouponTemplateInfo addTemplate(@Valid @RequestBody CouponTemplateInfo request) {
        log.info("Create coupon template: data={}", request);
        return couponTemplateService.createTemplate(request);
    }
    ...
}

测试如下,则为成功:
在这里插入图片描述

2:优惠券计算模块

在这里插入图片描述

2.1:api

定义其他模块可能用到的pojo,具体参考源码。

2.2:calculator

具体计算模块,定义各种优惠券的计算服务,主要的技术点是采用了模板方法设计模式 ,类图如下:
在这里插入图片描述

具体参考源码。

测试如下,则为成功:
在这里插入图片描述

json:

{"products":[{"price":3000,"count":2,"shopId":3},{"price":1000,"count":4,"shopId":1}],"couponId":10,"couponInfos":[{"id":10,"templateId":2,"userId":null,"shopId":null,"template":{"name":"单店满减","desc":"满40减5","type":"1","available":true,"shopId":1,"rule":{"limitation":10,"discount":{"quota":500,"threshold":4000}}}}],"userId":1}

3:用户服务

在这里插入图片描述

在pom中需要引入template和calculator,这样我们就有了一个三合一的单体应用(后面我们来一起改造它!!!)

3.1:api

定义用到的pojo,具体看源码。

3.2:dao

具体看源码。

3.2:impl

定义接口,服务层代码,定义用户领券,删除券等操作,如下用户领券代码:

@PostMapping("requestCoupon")
public Coupon requestCoupon(@Valid @RequestBody RequestCoupon request) {
    return customerService.requestCoupon(request);
}

启动后测试领券:

{
    "userId": 1,
    "couponTemplateId": 2
}

在这里插入图片描述
在这里插入图片描述
优惠券试算

{
    "products": [
        {
            "price": 3000,
            "count": 2,
            "shopId": 3
        },
        {
            "price": 1000,
            "count": 10,
            "shopId": 1
        }
    ],
    "couponIDs": [
        1
    ],
    "userId": 1
}

在这里插入图片描述

这样我们的一个单体应用就完成了,掌声!!!

4:平台组建

写在后面

参考文章列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1069943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win11 vscode配置c/c++,使用mingw编译器

文章目录 第一步&#xff1a;装好vscode第二步&#xff1a;下载 mingw创建一个文件夹作为C或者C的项目文件夹&#xff0c;用vscode打开 第一步&#xff1a;装好vscode 之前使用python时装过 第二步&#xff1a;下载 mingw 官网 3.从这个界面一直往下滑 找到&#xff1a; 下…

是真的吗?Nuture子刊告诉你这么多年的微生物组经验都是错的?!

发表期刊&#xff1a;Nature Microbiology 发表时间&#xff1a;2023 影响因子&#xff1a;28.3 DOI: 10.1038/s41564-023-01426-7 在过去的二十年里&#xff0c;人们对人类微生物组研究的兴趣呈指数级增长&#xff0c;同时伴随而来的一系列相关研究的文献发表数目也是逐年递…

通过cri-o部署k8s集群环境

目录 一.基础环境配置&#xff08;每个节点都做&#xff09; 1.hosts解析 2.防火墙和selinux 3.安装基本软件并配置时间同步 4.禁用swap分区 5.更改内核参数 6.配置ipvs 7.k8s下载 &#xff08;1&#xff09;配置镜像下载相关软件 &#xff08;2&#xff09;配置kube…

B站数据分析,UP主粉丝画像如何看?

随着互联网的发展&#xff0c;在大数据时代的今天&#xff0c;越来越多的企业用它们来指导精准营销&#xff0c;数据资源成为各大公司竞相追逐的香饽饽&#xff0c;而对于短视频广告投放来说&#xff0c;了解账号的粉丝人群画像&#xff0c;就可以知道他们的喜好厌恶&#xff0…

GitHub相应太慢

后期使用到github下载源码&#xff0c;会发现响应太慢&#xff0c;本篇文章解决你的问题 获取域名对应的ip 访问链接&#xff1a;https://raw.hellogithub.com/hosts&#xff08;ps&#xff1a;这链接定时更新&#xff09;&#xff0c;获取对应的host配置。 如果需要工具自动…

专注域控制器深挖护城河,知行科技逐渐摆脱“大客户依赖”

两年营收剧增26倍有余&#xff0c;位列中国第二大第三方自动驾驶域控制器提供商&#xff0c;正是因为这基本面的扎实、护城河的深度&#xff0c;知行科技成长的进程才格外受人关注。在9月中上旬通过聆讯后&#xff0c;上市的一环也即将被补上。 而最近公布的信息里&#xff0c…

Arm64体系架构-MPIDR_EL1寄存器

背景 在Arm64多核处理器中, 各核间的关系可能不同. 比如1个16 core的cpu, 每4个core划分为1个cluster,共享L2 cache. 当我们需要从core 0将任务调度出来时,如果优先选择core 1~3, 那么性能明显时优于其他core的. 那么操作系统怎么知道core之间这样的拓扑信息呢? Arm提供了MPID…

敏捷项目管理解锁:2023年使用YouTrack的全面指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

20231008工作心得:sql

1.SQL语句里的if的嵌套使用 if(product A and brand_name B,C,if(product A and brand_name !B,D,product)) as product if&#xff08;A,B,C&#xff09;。SQL里if函数&#xff0c;如果条件A成立&#xff0c;就显示B的值&#xff0c;否则就显示C。 这个代码的意思的&#x…

RK3588实用技巧:查看显示器支持的分辨率,基于weston修改分辨率输出

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133685938 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

数据结构面试常问问题--保研及考研复试

前言&#xff1a; Hello大家好&#xff0c;我是Dream。今年保研上岸山东大学人工智能专业 &#xff08;经验贴&#xff09;&#xff0c;现在将我自己的专业课备考知识点整理出来&#xff0c;分享给大家&#xff0c;希望可以帮助到大家&#xff01;这是重点知识总结&#xff0c;…

mfoc-hardnested项目属性

常规 预处理器 NDEBUG _CONSOLE NOGDI _AMD64_ _CRT_SECURE_NO_WARNINGS CONFFILES DRIVER_ACR122S_ENABLED DRIVER_ACR122_USB_ENABLED DRIVER_ARYGON_ENABLED DRIVER_PN532_UART_ENABLED DRIVER_PN53X_USB_ENABLED ENVVARS HAVE_CONFIG_H LOG u_int16_tuint16_t u_int8_tuin…

解决Playwright无法登录Google账号的问题

文章目录 问题描述解决问题免费登录生成代码问题描述 当使用playwright需要登入google帐号的时候,有可能会出现下面的情况:无法登录,提示浏览器不安全(因为我们是脚本使用) 【Python自学笔记】微软自动化测试工具playwright,微软版selenium解决问题 解决上面这个无法登入…

竞赛 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

Windows关闭指定端口程序

1.netstat -ano |findstr “4710” 2.查询当前端口PID为8376的进程 tasklist | findstr 8376 3. 选择杀死进程的方式 taskkill /f /t /im "PID or process name " ① taskkill /f /t /im “8376” ② taskkill /f /t /im “node.exe”

MPLS VPN知识点梳理与实战

项目拓扑与项目需求 项目需求&#xff1a;如图所示&#xff0c;某公司拥有总部和分支A、分支B。现在需要实现如下需求 总部和分支通过mpls vpn互联&#xff0c;运营商内部使用RR放射MP-bgp路由&#xff0c;运营商IGP协议选择ospf&#xff0c;企业内部的IGP选择ospf2、分支A和分…

【初识Jmeter】【接口自动化】

jmeter的使用笔记1 Jmeter介绍与下载安装介绍安装配置配置与扩展组件 jmeter的使用基本功能元素登陆请求与提取cookie其他请求接口关联Cookie-响应成功聚合报告查看 Jmeter介绍与下载安装 介绍 jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&…

HTML5使用html2canvas转化为图片,然后再转为base64.

介绍 场景&#xff1a;今天同事提了个协助&#xff0c;将HTML5文件中的元素转为图片&#xff0c;并且最终转为base64格式传给后端。感觉还挺有意思就记录下。&#xff08;试例如下&#xff09; 步骤一&#xff1a;引入html2canvas 的js源码 html2canvas.min.js 下载地址 htt…

民族民俗景区3d智慧旅游系统提升游客旅游体验和质量

随着科技的不断发展&#xff0c;传统的旅游方式正在逐渐被新的技术和系统所取代。网上3D沉浸式旅游体验凭借其身临其境的沉浸式体验优势&#xff0c;正成为旅游业的新宠。 网上3D沉浸式旅游体验是将旅游景区、度假区、休闲街区、科博馆等场所空间&#xff0c;利用VR全景制作、w…

API商品数据接口概述,API商品数据接口的组成

API商品数据接口是一种应用程序接口&#xff0c;用于提供商品数据的服务。它允许开发者通过编写代码来访问和获取商品数据&#xff0c;以便于他们在自己的应用程序中使用。API商品数据接口可以使用各种不同的协议和标准来实现&#xff0c;例如RESTful API、SOAP、XML-RPC等&…