一、创建父工程
1、在Idea中新建一个项目,如下:
2、整理目录,如下:
3、导入依赖:如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 声明 POM 文件遵循的 Maven 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 项目坐标 -->
<groupId>org.putong.cloud</groupId>
<artifactId>SpringCloud-2024</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 定义项目属性,供项目中其他部分引用 -->
<properties>
<!-- 依赖项的版本定义,避免版本冲突和重复定义 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hutool.version>5.8.22</hutool.version>
<lombok.version>1.18.26</lombok.version>
<druid.version>1.1.20</druid.version>
<mybatis.springboot.version>3.0.3</mybatis.springboot.version>
<mysql.version>8.0.11</mysql.version>
<swagger3.version>2.2.0</swagger3.version>
<mapper.version>4.2.3</mapper.version>
<fastjson2.version>2.0.40</fastjson2.version>
<persistence-api.version>1.0.2</persistence-api.version>
<spring.boot.test.version>3.1.5</spring.boot.test.version>
<spring.boot.version>3.2.0</spring.boot.version>
<spring.cloud.version>2023.0.0</spring.cloud.version>
<spring.cloud.alibaba.version>2022.0.0.0-RC2</spring.cloud.alibaba.version>
</properties>
<!-- 依赖管理,用于管理项目所有依赖的版本 -->
<dependencyManagement>
<!-- 依赖列表 -->
<dependencies>
<!--springboot 3.2.0-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springcloud 2023.0.0-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springcloud alibaba 2022.0.0.0-RC2-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot集成mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.springboot.version}</version>
</dependency>
<!--Mysql数据库驱动8 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--SpringBoot集成druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--通用Mapper4之tk.mybatis-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>${mapper.version}</version>
</dependency>
<!--persistence-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>${persistence-api.version}</version>
</dependency>
<!-- fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
<!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${swagger3.version}</version>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!-- spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.test.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
二、创建子模块(代码生成器)
1、基于父工程创建子模块,如下:
2、配置数据库表,如下
2.1、新建数据库: db2024
2.2、执行SQL语句
DROP TABLE IF EXISTS `t_pay`;
CREATE TABLE `t_pay` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`pay_no` VARCHAR(50) NOT NULL COMMENT '支付流水号',
`order_no` VARCHAR(50) NOT NULL COMMENT '订单流水号',
`user_id` INT(10) DEFAULT '1' COMMENT '用户账号ID',
`amount` DECIMAL(8,2) NOT NULL DEFAULT '9.9' COMMENT '交易金额',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='支付交易表';
INSERT INTO t_pay(pay_no,order_no) VALUES('pay17203699','6544bafb424a');
SELECT * FROM t_pay;
3、配置Pom文件,如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 定义父 POM 的配置,当前项目继承自父 POM 的配置 -->
<parent>
<groupId>org.putong.cloud</groupId>
<artifactId>SpringCloud-2024</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 只是一个普通Maven工程,与boot和cloud无关 -->
<artifactId>mybatis-generator</artifactId>
<!-- 项目属性配置区域,这些属性可以在 POM 文件中重复使用 -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--Mybatis 通用mapper tk单独使用,自己独有+自带版本号-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- Mybatis Generator 自己独有+自带版本号-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.2</version>
</dependency>
<!--通用Mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
</dependency>
<!--mysql8.0-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--persistence-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.2.3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
4、新增配置文件,如下:
// 并删除此目录
4.1 config.proerties(配置数据库连接)
// mysql版本任选其一即可
package.name=com.putong.cloud
# mysql8.0
jdbc.driverClass = com.mysql.cj.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
jdbc.user = root
jdbc.password =admin
#User表包名
#package.name=com.putong.cloud
# mysql5.7
#jdbc.driverClass = com.mysql.jdbc.Driver
#jdbc.url= jdbc:mysql://localhost:3306/db2024?useUnicode=true&characterEncoding=UTF-8&useSSL=false
#jdbc.user = root
#jdbc.password =admin
4.2 generatorConfig.xml (代码生成配置)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration> <!-- 配置文件的根元素 -->
<!-- 引入属性文件 -->
<properties resource="config.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <!-- 定义一个生成上下文 -->
<property name="beginningDelimiter" value="`"/> <!-- 设置数据库对象名称的起始定界符 -->
<property name="endingDelimiter" value="`"/> <!-- 设置数据库对象名称的结束定界符 -->
<!-- 配置 Mapper 插件 -->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/> <!-- 指定 Mapper 接口的实现 -->
<property name="caseSensitive" value="true"/> <!-- 是否大小写敏感 -->
</plugin>
<!-- 配置 JDBC 连接信息 -->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection>
<!-- 配置 Java 模型生成器 -->
<javaModelGenerator targetPackage="${package.name}.entities" targetProject="src/main/java"/>
<!-- 配置 SQL 映射文件生成器 -->
<sqlMapGenerator targetPackage="${package.name}.mapper" targetProject="src/main/java"/>
<!-- 配置 Java 客户端生成器 -->
<javaClientGenerator targetPackage="${package.name}.mapper" targetProject="src/main/java" type="XMLMAPPER"/>
<!-- 配置要生成的表 -->
<table tableName="t_pay" domainObjectName="Pay"> <!-- 指定表名和对应的 Java 类名 -->
<generatedKey column="id" sqlStatement="JDBC"/> <!-- 指定主键生成策略 -->
</table>
</context>
</generatorConfiguration>
5、生成代码(entity和mapper)
// 在idea右侧找到Maven,找到此工程
5.1、开始执行
5.2、执行成功如下:
三、创建子工程(支付模块)
1、基于父工程创建子模块,如下:
2、修改Pom文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 定义父 POM 的配置,当前项目继承自父 POM 的配置 -->
<parent>
<groupId>org.putong.cloud</groupId>
<artifactId>SpringCloud-2024</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 只是一个普通Maven工程,与boot和cloud无关 -->
<artifactId>cloud-provider-payment</artifactId>
<!-- 项目属性配置区域,这些属性可以在 POM 文件中重复使用 -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--SpringBoot通用依赖模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--SpringBoot集成druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!-- Swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
</dependency>
<!--mybatis和springboot整合-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--Mysql数据库驱动8 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--persistence-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
</dependency>
<!--通用Mapper4-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、新增配置文件
3.1 新建 application.yml
3.2、配置内容,如下
server:
port: 8001
# ==========applicationName + druid-mysql8 driver===================
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: root
password: admin
# ========================mybatis===================
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.atguigu.cloud.entities
configuration:
map-underscore-to-camel-case: true
4、修改启动程序
4.1、修改启动类名称(加上端口号,为了后续好区分)
4.2、修改内容,如下
import tk.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//指定 MyBatis 的 Mapper 接口所在的包,以便框架扫描这些接口并生成相应的代理对象
@MapperScan("org.putong.cloud.mapper")
public class Main8001 {
public static void main(String[] args) {
SpringApplication.run(Main8001.class);
}
}
5、公共配置(统一消息返回体、枚举、全局异常捕获)
5.1、目录示例,如下:
common:公共包
Result:统一消息返回
GlobalExceptionHandler:全局异常捕获
enums:枚举包
config:配置类
5.2、Swagger3配置,如下
// http://localhost:8001/swagger-ui/index.html
@Configuration
public class Swagger3Config
{
@Bean
public GroupedOpenApi PayApi()
{
return GroupedOpenApi.builder().group("支付微服务模块").pathsToMatch("/pay/**").build();
}
@Bean
public GroupedOpenApi OtherApi()
{
return GroupedOpenApi.builder().group("其它微服务模块").pathsToMatch("/other/**", "/others").build();
}
/*@Bean
public GroupedOpenApi CustomerApi()
{
return GroupedOpenApi.builder().group("客户微服务模块").pathsToMatch("/customer/**", "/customers").build();
}*/
@Bean
public OpenAPI docsOpenApi()
{
return new OpenAPI()
.info(new Info().title("SpringCloud2024")
.description("通用设计rest")
.version("v1.0"))
.externalDocs(new ExternalDocumentation()
.description("www.csdn.com")
.url("https://yiyan.baidu.com/"));
}
}
5.3、Result(统一消息返回体),如下
@Data // 使用@Data注解,自动生成所有属性的getter和setter方法
@Accessors(chain = true) // 使用@Accessors注解,生成链式调用的getter方法
public class Result<T> {// Result类是一个泛型类,可以包含任意类型的数据
// 属性定义
private String code; // 状态码
/**
* 结果状态说明,具体的状态码可以在枚举类ReturnCodeEnum.java中找到对应的定义
*/
private String message; // 消息描述,通常用于描述操作结果或错误信息
private T data; // 泛型数据,可以是任何类型的对象,代表操作返回的数据
private long timestamp; // 时间戳,记录结果生成的时间
// 构造函数,初始化时间戳为当前系统时间
public Result() {
this.timestamp = System.currentTimeMillis();
}
/**
* 成功响应
*
* @param data 要封装的数据
* @param <T> 数据类型
* @return 返回一个包含数据的Result对象
*/
public static <T> Result<T> success(T data) {
Result<T> resultData = new Result<>();
resultData.setCode(ResultEnum.RC200.getCode());
resultData.setMessage(ResultEnum.RC200.getMessage());
resultData.setData(data);
return resultData;
}
/**
* 失败响应
*
* @param code 错误码
* @param message 错误信息
* @param <T> 数据类型
* @return 返回一个包含错误信息的Result对象
*/
public static <T> Result<T> fail(String code, String message) {
Result<T> resultData = new Result<>();
resultData.setCode(code);
resultData.setMessage(message);
return resultData;
}
}
5.4、GlobalExceptionHandler(全局异常捕获),如下:
@Slf4j
@RestControllerAdvice // 该注解表明这是一个全局的异常处理器
public class GlobalExceptionHandler {
/**
* 处理所有未被捕获的RuntimeException异常。
*
* @param e 捕获到的异常对象
* @return 返回一个Result对象,通常包含错误信息
*/
@ExceptionHandler(RuntimeException.class) // 指定该方法用于处理
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 设置HTTP响应状态为500,内部服务器错误
public Result<String> runtimeException(Exception e) {
System.out.println("----come in GlobalExceptionHandler");
log.error("全局异常信息exception:{}", e.getMessage(), e);
return Result.fail(ResultEnum.RC500.getCode(), e.getMessage());
}
/**
* 全部异常
*
* @param e 捕获到的异常对象
* @return 返回一个Result对象,通常包含错误信息
*/
@ExceptionHandler(Exception.class) // 指定该方法用于处理
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 设置HTTP响应状态为500,内部服务器错误
public Result<String> exception(Exception e) {
System.out.println("----come in GlobalExceptionHandler");
log.error("全局异常信息exception:{}", e.getMessage(), e);
return Result.fail(ResultEnum.RC500.getCode(), e.getMessage());
}
}
5.5、ResultEnum(返回消息枚举)
@Getter
public enum ResultEnum {
/**
* 操作失败
**/
RC999("999", "操作XXX失败"),
/**
* 操作成功
**/
RC200("200", "success"),
/**
* 服务降级
**/
RC201("201", "服务开启降级保护,请稍后再试!"),
/**
* 热点参数限流
**/
RC202("202", "热点参数限流,请稍后再试!"),
/**
* 系统规则不满足
**/
RC203("203", "系统规则不满足要求,请稍后再试!"),
/**
* 授权规则不通过
**/
RC204("204", "授权规则不通过,请稍后再试!"),
/**
* access_denied
**/
RC403("403", "无访问权限,请联系管理员授予权限"),
/**
* access_denied
**/
RC401("401", "匿名用户访问无权限资源时的异常"),
RC404("404", "404页面找不到的异常"),
/**
* 服务异常
**/
RC500("500", "系统异常,请稍后重试"),
RC375("375", "数学运算异常,请稍后重试"),
INVALID_TOKEN("2001", "访问令牌不合法"),
ACCESS_DENIED("2003", "没有权限访问该资源"),
CLIENT_AUTHENTICATION_FAILED("1001", "客户端认证失败"),
USERNAME_OR_PASSWORD_ERROR("1002", "用户名或密码错误"),
BUSINESS_ERROR("1004", "业务逻辑异常"),
UNSUPPORTED_GRANT_TYPE("1003", "不支持的认证模式");
/**
* 自定义状态码
**/
private final String code;
/**
* 自定义描述
**/
private final String message;
ResultEnum(String code, String message) {
this.code = code;
this.message = message;
}
/**
* 根据编码返回消息
*
* @param code
* @return
*/
public static ResultEnum getMessageByCode(String code) {
for (ResultEnum element : ResultEnum.values()) {
if (element.getCode().equalsIgnoreCase(code)) {
return element;
}
}
return null;
}
// public static void main(String[] args) {
// System.out.println(getMessageByCode("200").getMessage());
// success
// }
}
6、写代码(entity,controller,mapper,service,impl)
6.1、代码生成的“entities”和“mapper”包移动到payment目录下,如图
// 并创建号 controller、service、impl、dto
6.2、dto代码如下
@Data // GetSet
@AllArgsConstructor // 有参构造
@NoArgsConstructor // 无参构造
public class PayDTO implements Serializable {
private Integer id;
//支付流水号
private String payNo;
//订单流水号
private String orderNo;
//用户账号ID
private Integer userId;
//交易金额
private BigDecimal amount;
}
6.3、entity代码如下
/**
* 表名:t_pay
* 表注释:支付交易表
*/
@Table(name = "t_pay")
public class Pay {
@Id
@GeneratedValue(generator = "JDBC")
private Integer id;
/**
* 支付流水号
*/
@Column(name = "pay_no")
private String payNo;
/**
* 订单流水号
*/
@Column(name = "order_no")
private String orderNo;
/**
* 用户账号ID
*/
@Column(name = "user_id")
private Integer userId;
/**
* 交易金额
*/
private BigDecimal amount;
/**
* 删除标志,默认0不删除,1删除
*/
private Byte deleted;
/**
* 创建时间
*/
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 更新时间
*/
@Column(name = "update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* @return id
*/
public Integer getId() {
return id;
}
/**
* @param id
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取支付流水号
*
* @return payNo - 支付流水号
*/
public String getPayNo() {
return payNo;
}
/**
* 设置支付流水号
*
* @param payNo 支付流水号
*/
public void setPayNo(String payNo) {
this.payNo = payNo;
}
/**
* 获取订单流水号
*
* @return orderNo - 订单流水号
*/
public String getOrderNo() {
return orderNo;
}
/**
* 设置订单流水号
*
* @param orderNo 订单流水号
*/
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
/**
* 获取用户账号ID
*
* @return userId - 用户账号ID
*/
public Integer getUserId() {
return userId;
}
/**
* 设置用户账号ID
*
* @param userId 用户账号ID
*/
public void setUserId(Integer userId) {
this.userId = userId;
}
/**
* 获取交易金额
*
* @return amount - 交易金额
*/
public BigDecimal getAmount() {
return amount;
}
/**
* 设置交易金额
*
* @param amount 交易金额
*/
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
/**
* 获取删除标志,默认0不删除,1删除
*
* @return deleted - 删除标志,默认0不删除,1删除
*/
public Byte getDeleted() {
return deleted;
}
/**
* 设置删除标志,默认0不删除,1删除
*
* @param deleted 删除标志,默认0不删除,1删除
*/
public void setDeleted(Byte deleted) {
this.deleted = deleted;
}
/**
* 获取创建时间
*
* @return createTime - 创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置创建时间
*
* @param createTime 创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取更新时间
*
* @return updateTime - 更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
/**
* 设置更新时间
*
* @param updateTime 更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
6.4、controller代码如下
@RestController
@Slf4j
@Tag(name = "支付微服务模块", description = "支付CRUD")
public class PayController {
@Resource
private PayService payService;
@PostMapping(value = "/pay/add")
@Operation(summary = "新增", description = "新增支付流水方法,json串做参数")
public Result<String> addPay(@RequestBody Pay pay) {
System.out.println("pay = " + pay);
int i = payService.add(pay);
return Result.success("成功插入记录,返回值:" + i);
}
@DeleteMapping(value = "/pay/del/{id}")
@Operation(summary = "删除", description = "删除支付流水方法")
public Result<Integer> deletePay(@PathVariable("id") Integer id) {
return Result.success(payService.delete(id));
}
@PutMapping(value = "/pay/update")
@Operation(summary = "修改", description = "修改支付流水方法")
public Result<String> updatePay(@RequestBody PayDTO payDTO) {
Pay pay = new Pay();
BeanUtils.copyProperties(payDTO, pay);
int i = payService.update(pay);
return Result.success("成功修改记录,返回值:" + i);
}
@GetMapping(value = "/pay/get/{id}")
@Operation(summary = "按照ID查流水", description = "查询支付流水方法")
public Result<Pay> getById(@PathVariable("id") Integer id) {
return Result.success(payService.getById(id));
}
@GetMapping(value = "/pay/getPayList")
@Operation(summary = "全部查询", description = "查询全部支付流水方法")
public Result<List<Pay>> getPayList() {
return Result.success(payService.getPayList());
}
}
6.5、mapper代码如下
public interface PayMapper extends Mapper<Pay> {
}
6.6、service代码如下
public interface PayService {
public int add(Pay pay);
public int delete(Integer id);
public int update(Pay pay);
public Pay getById(Integer id);
public List<Pay> getPayList();
}
6.7、impl代码如下
@Service
public class PayServiceImpl implements PayService {
@Resource
private PayMapper payMapper;
@Override
public int add(Pay pay) {
// null的属性不会保存,会使用数据库默认值
return payMapper.insertSelective(pay);
}
@Override
public int delete(Integer id) {
// 根据主键字段进行删除,方法参数必须包含完整的主键属性
return payMapper.deleteByPrimaryKey(id);
}
@Override
public int update(Pay pay) {
// 根据主键更新属性不为null的值
return payMapper.updateByPrimaryKeySelective(pay);
}
@Override
public Pay getById(Integer id) {
// 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
return payMapper.selectByPrimaryKey(id);
}
@Override
public List<Pay> getPayList() {
return payMapper.selectAll();
}
四、创建子模块(订单模块)
1、基于父工程创建子模块,如下:
2、修改Pom文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.putong.cloud</groupId>
<artifactId>SpringCloud-2024</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--订单-->
<groupId>com.putong.cloud</groupId>
<artifactId>cloud-consumer-order</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--hutool-all-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!--fastjson2-->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、新增配置文件
3.1、新建application.yml
3.2、配置文件内容,如下:
server:
port: 80
3.3、修改启动程序
// 更名加80,为了红区分
@SpringBootApplication
public class Main80
{
public static void main(String[] args)
{
SpringApplication.run(Main80.class,args);
}
}
4、复制共用类并创建controller,config(common、dto、enums)
// 红色部分为赋值,看色部分为新建
4.1、restTemplateConfig内容,如下:
/**
* @Author:龙抬头
* @Date:2024/8/26 20:19
* @Description: 服务远程调用配置类
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4.2、controller内容,如下:
通过接口访问hi否可行
http://localhost:80/consumer/pay/getPayList
/**
* @Author:龙抬头
* @Date:2024/8/26 20:26
* @Description: 订单
*/
@Slf4j
@RestController
public class OrderController {
/**
* 支付服务地址
*/
public static final String PaymentSrv_URL = "http://localhost:8001"; // 先写死
@Resource
private RestTemplate restTemplate;
/**
* 一般情况下,通过浏览器的地址栏输入url,发送的只能是get请求
* 我们底层调用的是post方法,模拟消费者发送get请求,客户端消费者
* 参数可以不添加@RequestBody
*/
/**
* 添加支付订单
*
* @param payDTO 支付订单数据传输对象
* @return Result 返回操作结果
*/
@PostMapping(value = "/consumer/pay/add") // 规范: 保持跟原接口路径一样(/pay/add)
public Result addOrder(@RequestBody PayDTO payDTO) {
return restTemplate.postForObject(PaymentSrv_URL + "/pay/add", payDTO, Result.class);
}
/**
* 根据ID获取支付信息
*
* @param id 支付订单ID
* @return Result 返回支付信息
*/
@GetMapping(value = "/consumer/pay/get/{id}") // 规范: 保持跟原接口路径一样(/pay/get/{id})
public Result getPayInfo(@PathVariable("id") Integer id) {
return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/" + id, Result.class, id);
}
/**
* 根据ID删除支付订单
*
* @param id 支付订单ID
*/
@DeleteMapping(value = "/consumer/pay/del/{id}")
public void deleteOrder(@PathVariable("id") Integer id) {
restTemplate.delete(PaymentSrv_URL + "/pay/del/" + id);
}
/**
* 根据ID更新支付订单信息
*
* @param payDTO 包含更新信息的支付订单数据传输对象
*/
@PutMapping(value = "/consumer/pay/update")
public void updateOrderById(@RequestBody PayDTO payDTO) {
restTemplate.put(PaymentSrv_URL + "/pay/update", payDTO);
}
/**
* 获取支付订单列表
*
* @return Result 返回支付订单列表
*/
@GetMapping(value = "/consumer/pay/getPayList")
public Result getPayList() {
return restTemplate.getForObject(PaymentSrv_URL + "/pay/getPayList", Result.class);
}
}
五、创建子模块(公共API)
1、基于父工程创建子模块,如下:
2、修改Pom文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.putong.cloud</groupId>
<artifactId>SpringCloud-2024</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--对外开发公共API-->
<groupId>com.putong.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--SpringBoot通用依赖模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
</project>
3、复制公共模块代码,如下:
4、执行Maven的install
5、引入maven(公共API)
// 记得刷新
<!-- 引入自己定义的api通用包 -->
<dependency>
<groupId>com.putong.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
6、改造80和8001目录
7、测试API接口是否行得通:
http://localhost:80/consumer/pay/getPayList