diff --git a/README.md b/README.md
index 3768ff02b..d04471af9 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,17 @@

-> ~~交流~~**装逼群**,请点击[传送门](http://www.iocoder.cn/mall-user-group/?vip&gitee),进行引导加入。**亲,一键三连啊**
+> **亲,一键三连啊**
+
+# 交流群
+
+扫码如下**二维码**,回复「艿艿」关键字。
+
+可以添加 18 岁的我为好友,并拉你进一个~~交流~~**装逼群**。
+
+
+
+😈 等后面,艿艿**头发**重新长一点出来,给旁友们录制点视频哈!
# Spring Boot 专栏
@@ -34,10 +44,11 @@
* [《芋道 Spring Boot 快速入门》](http://www.iocoder.cn/Spring-Boot/quick-start/?github)
* [《芋道 Spring Boot 自动配置原理》](http://www.iocoder.cn/Spring-Boot/autoconfigure/?github) 对应 [lab-47](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-47)
+* [《芋道 Spring Boot 芋道 Spring Boot Jar 启动原理》](http://www.iocoder.cn/Spring-Boot/jar/?github)
## 开发工具
-* [《芋道 Spring Boot 热部署入门》](http://www.iocoder.cn/Spring-Boot/hot-swap/?github) 对应 [lab-48](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-48)
+* [《芋道 Spring Boot 热部署入门》](http://www.iocoder.cn/Spring-Boot/hot-swap/?github) 对应 [lab-48-hot-swap](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-48-hot-swap)
* [《芋道 Spring Boot 消除冗余代码 Lombok 入门》](http://www.iocoder.cn/Spring-Boot/Lombok/?github) 对应 [lab-49](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-49)
* [《芋道 Spring Boot 对象转换 MapStruct 入门》](http://www.iocoder.cn/Spring-Boot/MapStruct/?github) 对应 [lab-55](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-55)
@@ -47,46 +58,59 @@
* [《芋道 Spring Boot WebFlux 入门》](http://www.iocoder.cn/Spring-Boot/WebFlux/?github) 对应 [lab-27](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-27)
* [《芋道 Spring Boot 分布式 Session 入门》](http://www.iocoder.cn/Spring-Boot/Distributed-Session/?github) 对应 [lab-26](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-26)
* [《芋道 Spring Boot API 接口文档 Swagger 入门》](http://www.iocoder.cn/Spring-Boot/Swagger/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
+* [《芋道 Spring Boot API 接口文档 Swagger Starter 入门》](http://www.iocoder.cn/Spring-Boot/Swagger-Starter/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
* [《芋道 Spring Boot 参数校验 Validation 入门》](http://www.iocoder.cn/Spring-Boot/Validation/?github) 对应 [lab-22](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-22)
* [《芋道 Spring Boot WebSocket 入门》](http://www.iocoder.cn/Spring-Boot/WebSocket/?github) 对应 [lab-25](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-25)
-* [《性能测试 —— Tomcat、Jetty、Undertow 基准测试》](http://www.iocoder.cn/Performance-Testing/Tomcat-Jetty-Undertow-benchmark/?github) 对应 [lab-05](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-05)
+* [《性能测试 —— Tomcat、Jetty、Undertow 基准测试》](http://www.iocoder.cn/Performance-Testing/Tomcat-Jetty-Undertow-benchmark/?github) 对应 [lab-05-benchmark-tomcat-jetty-undertow](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-05-benchmark-tomcat-jetty-undertow)
* [《性能测试 —— SpringMVC、Webflux 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringMVC-Webflux-benchmark/?github) 对应 [lab-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-06)
+* [《芋道 Spring Boot API 接口文档 JApiDocs 入门》](http://www.iocoder.cn/Spring-Boot/JApiDocs/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
## RPC 开发
+* [《芋道 Spring Boot Netty 入门》](http://www.iocoder.cn/Spring-Boot/Netty/?github) 对应 [lab-67](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-67)
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30)
* [《芋道 Spring Boot 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Boot/Feign/?github) 对应 [lab-58](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-58)
-* 《芋道 Spring Boot Motan 入门》计划中...
-* 《芋道 Spring Boot WebService 入门》计划中...
-* 《芋道 Spring Boot SOFARPC 入门》计划中...
-* 《芋道 Spring Boot gRPC 入门》计划中...
+* [《芋道 Spring Boot gRPC 入门》](http://www.iocoder.cn/Spring-Boot/gRPC/?github) 对应 [lab-64](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-64)
+* [《芋道 Spring Boot Web Services 入门》](http://www.iocoder.cn/Spring-Boot/Web-Services/?github) 对应 [lab-65](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-65)
+* [《芋道 Spring Boot SOFARPC 入门》](http://www.iocoder.cn/Spring-Boot/SOFARPC/?github) 对应 [lab-62](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-62)
+* [《芋道 Spring Boot Motan 入门》](http://www.iocoder.cn/Spring-Boot/Motan/?github) 对应 [lab-63](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-63)
* 《芋道 Spring Boot RSocket 入门》计划中...
+* 《芋道 Spring Boot Tars 入门》计划中...
## 数据访问
-* [《芋道 Spring Boot Redis 入门》](http://www.iocoder.cn/Spring-Boot/Redis/?github) 对应 [lab-11](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-11)
-* [《芋道 Spring Boot 缓存 Cache 入门》](http://www.iocoder.cn/Spring-Boot/Cache/?github) 对应 [lab-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-21)
+**关系数据库**
+
* [《芋道 Spring Boot 数据库连接池入门》](http://www.iocoder.cn/Spring-Boot/datasource-pool/?github) 对应 [lab-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-19)
-* [《芋道 Spring Boot MyBatis 入门》](http://www.iocoder.cn/Spring-Boot/MyBatis/?github) 对应 [lab-12](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-12)
-* [《芋道 Spring Boot JPA 入门》](http://www.iocoder.cn/Spring-Boot/JPA/?github) 对应 [lab-13](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-13)
-* [《芋道 Spring Boot JdbcTemplate 入门》](http://www.iocoder.cn/Spring-Boot/JdbcTemplate/?github) 对应 [lab-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-14)
-* [《芋道 Spring Boot Elasticsearch 入门》](http://www.iocoder.cn/Spring-Boot/Elasticsearch/?github) 对应 [lab-15](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-15)
-* 《芋道 Spring Boot Solr 入门》计划中...
-* [《芋道 Spring Boot MongoDB 入门》](http://www.iocoder.cn/Spring-Boot/MongoDB/?github) 对应 [lab-16](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-16)
+* [《芋道 Spring Boot MyBatis 入门》](http://www.iocoder.cn/Spring-Boot/MyBatis/?github) 对应 [lab-12-mybatis](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-12-mybatis)
+* [《芋道 Spring Boot JPA 入门》](http://www.iocoder.cn/Spring-Boot/JPA/?github) 对应 [lab-13-spring-data-jpa](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-13-spring-data-jpa)
+* [《芋道 Spring Boot JdbcTemplate 入门》](http://www.iocoder.cn/Spring-Boot/JdbcTemplate/?github) 对应 [lab-14-spring-jdbc-template](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-14-spring-jdbc-template)
* [《芋道 Spring Boot 多数据源(读写分离)入门》](http://www.iocoder.cn/Spring-Boot/dynamic-datasource/?github) 对应 [lab-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-17)
* [《芋道 Spring Boot 分库分表入门》](http://www.iocoder.cn/Spring-Boot/sharding-datasource/?github) 对应 [lab-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-18)
* [《芋道 Spring Boot 数据库版本管理入门》](http://www.iocoder.cn/Spring-Boot/database-version-control/?github) 对应 [lab-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-20)
+**非关系数据库**
+
+* [《芋道 Spring Boot Redis 入门》](http://www.iocoder.cn/Spring-Boot/Redis/?github) 对应 [lab-11-spring-data-redis](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-11-spring-data-redis)
+* [《芋道 Spring Boot 缓存 Cache 入门》](http://www.iocoder.cn/Spring-Boot/Cache/?github) 对应 [lab-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-21)
+* [《芋道 Spring Boot MongoDB 入门》](http://www.iocoder.cn/Spring-Boot/MongoDB/?github) 对应 [lab-16-spring-data-mongo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-16-spring-data-mongo)
+* [《芋道 Spring Boot Elasticsearch 入门》](http://www.iocoder.cn/Spring-Boot/Elasticsearch/?github) 对应 [lab-15-spring-data-es](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-15-spring-data-es)
+* [《芋道 Spring Boot Solr 入门》](http://www.iocoder.cn/Spring-Boot/Solr/?github) 对应 [lab-66](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-66)
+
## 事务管理
* [《芋道 Spring Boot 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Boot/Seata/?github) 对应 [lab-52](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-52)
## 安全控制
-* [《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?github) 对应 [lab-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01)
-* [《芋道 Spring Boot 授权框架 Spring Security OAuth2 入门》](http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github) 对应 [lab-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-02)
+* [《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?github) 对应 [lab-01-spring-security](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security)
* [《芋道 Spring Boot 安全框架 Shiro 入门》](http://www.iocoder.cn/Spring-Boot/Shiro/?github) 对应 [lab-33](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-33)
+**OAuth 2.0**
+* [《芋道 Spring Security OAuth2 入门》](http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
+* [《芋道 Spring Security OAuth2 存储器》](http://www.iocoder.cn/Spring-Security/OAuth2-learning-store/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
+* [《芋道 Spring Security OAuth2 单点登陆》](http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
+
## 定时任务与异步任务
* [《芋道 Spring Boot 定时任务入门》](http://www.iocoder.cn/Spring-Boot/Job/?github) 对应 [lab-28](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-28)
@@ -95,8 +119,8 @@
## 消息队列
* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 对应 [lab-31](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-31)
-* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03)
-* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04)
+* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03-kafka)
+* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04-rabbitmq)
* [《芋道 Spring Boot 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Boot/ActiveMQ/?github) 对应 [lab-32](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-32)
* [《芋道 Spring Boot 事件机制 Event 入门》](http://www.iocoder.cn/Spring-Boot/Event/?github) 对应 对应 [lab-54](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-54)
@@ -128,12 +152,13 @@
* [《芋道 Spring Boot 监控端点 Actuator 入门》](http://www.iocoder.cn/Spring-Boot/Actuator/?github) 对应 [lab-34](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-34)
* [《芋道 Spring Boot 监控工具 Admin 入门》](http://www.iocoder.cn/Spring-Boot/Admin/?github) 对应 [lab-35](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-35)
* [《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》](http://www.iocoder.cn/Spring-Boot/Prometheus-and-Grafana/?github) 对应 [lab-36](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-36)
-* 《芋道 Spring Boot 监控平台 CAT 入门》计划中...
+* [《芋道 Spring Boot 监控平台 CAT 入门》](http://www.iocoder.cn/Spring-Boot/CAT/?github) 对应 [lab-61](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-61)
## 日志管理
* [《芋道 Spring Boot 日志集成 Logging 入门》](http://www.iocoder.cn/Spring-Boot/Logging/?github) 对应 [lab-37](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-37)
* [《芋道 Spring Boot 日志平台 ELK + Filebeat 入门》](http://www.iocoder.cn/Spring-Boot/ELK/?github) 对应 [lab-38](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38)
+* 《芋道 Spring Boot 日志平台 Loki 入门》计划中...
## 链路追踪
@@ -147,47 +172,50 @@
## Spring Cloud Alibaba 全家桶
* [《芋道 Spring Cloud Alibaba 介绍》](http://www.iocoder.cn/Spring-Cloud-Alibaba/intro/?github)
-* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01)
-* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07)
-* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04)
-* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06)
+* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01-spring-cloud-alibaba-nacos-discovery](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01-spring-cloud-alibaba-nacos-discovery)
+* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
+* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04-spring-cloud-alibaba-sentinel](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04-spring-cloud-alibaba-sentinel)
+* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
-* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05)
+* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05-spring-cloud-alibaba-nacos-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05-spring-cloud-alibaba-nacos-config)
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github) 对应 [labx-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-17)
## 推荐搭配食用
-* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02)
-* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03)
-* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08)
+* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02-spring-cloud-netflix-ribbon](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02-spring-cloud-netflix-ribbon)
+* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03-spring-cloud-feign](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03-spring-cloud-feign)
+* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08-spring-cloud-gateway](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08-spring-cloud-gateway)
* [《芋道 Spring Cloud 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Cloud/SkyWalking/?github) 对应 [labx-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-14)
-
+* [《芋道 Dubbo Admin 快速入门》](http://www.iocoder.cn/Dubbo/Admin/?github)
+* [《芋道 Dubbo Swagger 快速入门》](http://www.iocoder.cn/Dubbo/Swagger/?github) 对应 [swagger-dubbo](https://github.com/YunaiV/swagger-dubbo)
+
# Spring Cloud 专栏
## 注册中心
-* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01)
+* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01-spring-cloud-alibaba-nacos-discovery](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01-spring-cloud-alibaba-nacos-discovery)
* [《芋道 Spring Cloud Netflix 注册中心 Eureka 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Eureka?github) 对应 [labx-22](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-22)
-* 《芋道 Spring Cloud 注册中心 Zookeeper 入门》计划中...
-* 《芋道 Spring Cloud 注册中心 Consul 入门》计划中...
-* 《芋道 Spring Cloud 注册中心 Etcd 入门》计划中...
+* [《芋道 Spring Cloud 注册中心 Zookeeper 入门》](http://www.iocoder.cn/Spring-Cloud/ZooKeeper-Discovery/?github) 对应 [labx-25](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-25)
+* [《芋道 Spring Cloud 注册中心 Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Consul-Discovery/?github) 对应 [labx-27](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-27)
+* [《芋道 Spring Cloud 注册中心 Etcd 入门》](http://www.iocoder.cn/Spring-Cloud/Etcd/?github)
## 服务调用
-* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07)
-* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02)
-* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03)
+* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
+* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02-spring-cloud-netflix-ribbon](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02-spring-cloud-netflix-ribbon)
+* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03-spring-cloud-feign](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03-spring-cloud-feign)
+* [《芋道 Spring Cloud 服务调用 gRPC 入门》](http://www.iocoder.cn/Spring-Cloud/gRPC/?github) 对应 [labx-30-spring-cloud-grpc](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-30-spring-cloud-grpc)
## 服务容错
-* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04)
+* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04-spring-cloud-alibaba-sentinel](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04-spring-cloud-alibaba-sentinel)
* [《芋道 Spring Cloud Netflix 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Hystrix/?github) 对应 [labx-23](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-23)
* [《芋道 Spring Cloud 服务容错 Resilience4j 入门》](http://www.iocoder.cn/Spring-Cloud/Resilience4j/?github) 对应 [lab-59](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-59)
* 《芋道 Spring Cloud 服务容错 Spring Cloud CircuitBreaker》计划中...
## API 网关
-* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08)
+* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08-spring-cloud-gateway](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08-spring-cloud-gateway)
* [《芋道 Spring Cloud Netflix 服务网关 Zuul 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Zuul/?github) 对应 对应 [labx-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-21)
* [《性能测试 —— Spring Cloud Gateway、Zuul 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringCloudGateway-Zuul-benchmark/?github) 对应 [lab-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-07)
@@ -199,22 +227,26 @@
## 配置中心
-* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05)
-* [《芋道 Spring Cloud 配置中心 Apollo 入门》](http://www.iocoder.cn/Spring-Cloud/Apollo/?github) 对应 [labx-09](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-09)
-* [《芋道 Spring Cloud 配置中心 Spring Cloud Config 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Config/?github) 对应 [labx-12](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-12)
+* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05-spring-cloud-alibaba-nacos-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05-spring-cloud-alibaba-nacos-config)
+* [《芋道 Spring Cloud 配置中心 Apollo 入门》](http://www.iocoder.cn/Spring-Cloud/Apollo/?github) 对应 [labx-09-spring-cloud-apollo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-09-spring-cloud-apollo)
+* [《芋道 Spring Cloud 配置中心 Spring Cloud Config 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Config/?github) 对应 [labx-12-spring-cloud-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-12-spring-cloud-config)
+* [《芋道 Spring Cloud 配置中心 Zookeeper 入门》](http://www.iocoder.cn/Spring-Cloud/ZooKeeper-Config/?github) 对应 [labx-26](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-26)
+* [《芋道 Spring Cloud 配置中心 Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Consul-Config/?github) 对应 [labx-28](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-28)
+* [《芋道 Spring Cloud 配置中心 Etcd 入门》](http://www.iocoder.cn/Spring-Cloud/Etcd/?github)
## 消息队列
**Spring Cloud Stream**
-* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06)
-* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10)
-* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11)
+* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
+* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10-spring-cloud-stream-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10-spring-cloud-stream-rabbitmq)
+* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11-spring-cloud-stream-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11-spring-cloud-stream-kafka)
* [《芋道 Spring Cloud 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Cloud/ActiveMQ/?github)
**Spring Cloud Bus**
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 Spring Cloud 事件总线 Bus RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-RabbitMQ/?github) 对应 [labx-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-19)
* [《芋道 Spring Cloud 事件总线 Bus Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Kafka/?github) 对应 [labx-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-18)
+* [《芋道 Spring Cloud 事件总线 Bus Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Consul/?github) 对应 [labx-29-spring-cloud-consul-bus](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-29-spring-cloud-consul-bus)
## 分布式事务
@@ -243,8 +275,9 @@
## 基础入门
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30)
-* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07)
+* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
* [《性能测试 —— Dubbo 基准测试》](http://www.iocoder.cn/Performance-Testing/Dubbo-benchmark/?github)
+* [《芋道 Dubbo Swagger 快速入门》](http://www.iocoder.cn/Dubbo/Swagger/?github) 对应 [swagger-dubbo](https://github.com/YunaiV/swagger-dubbo)
## 注册中心
@@ -291,13 +324,21 @@
* [《芋道 Spring Boot 链路追踪 Zipkin》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 的[「13. Dubbo 示例」](#)小节
* [《芋道 Spring Cloud 链路追踪 Spring Cloud Sleuth》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 的[「7. Dubbo 示例」](#)小节
+## 监控管理
+
+**[CAT](http://www.iocoder.cn/CAT/install/?github)**
+* [《芋道 Spring Boot 监控平台 CAT 入门》](http://www.iocoder.cn/Spring-Boot/CAT/?github) 的[「13. Dubbo 集成」](#)小节
+
+**[Dubbo Admin](http://www.iocoder.cn/Dubbo/Admin/?github)**
+* [《芋道 Dubbo Admin 快速入门》](http://www.iocoder.cn/Dubbo/Admin/?github)
+
# 消息队列 MQ 专栏
## RocketMQ
* [《RocketMQ 极简入门》](http://www.iocoder.cn/RocketMQ/install/?github)
* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 对应 [lab-31](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-31)
-* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06)
+* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 RocketMQ 源码解析系列》](http://www.iocoder.cn/categories/RocketMQ/?github)
* [《性能测试 —— RocketMQ 基准测试》](http://www.iocoder.cn/Performance-Testing/RocketMQ-benchmark/?github)
@@ -306,8 +347,8 @@
## RabbitMQ
* [《RabbitMQ 极简入门》](http://www.iocoder.cn/RabbitMQ/install/?github)
-* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04)
-* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10)
+* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04-rabbitmq)
+* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10-spring-cloud-stream-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10-spring-cloud-stream-rabbitmq)
* [《芋道 Spring Cloud 事件总线 Bus RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-RabbitMQ/?github) 对应 [labx-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-19)
* [《RabbitMQ 书单整理》](http://www.iocoder.cn/Books/RabbitMQ-books-recommended/?github)
@@ -315,7 +356,7 @@
* [《Kafka 极简入门》](http://www.iocoder.cn/Kafka/install/?github)
* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03)
-* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11)
+* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11-spring-cloud-stream-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11-spring-cloud-stream-kafka)
* [《芋道 Spring Cloud 事件总线 Bus Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Kafka/?github) 对应 [labx-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-18)
* [《Kafka 书单整理》](http://www.iocoder.cn/Books/Kafka-books-recommended/?github)
@@ -360,18 +401,10 @@
如下是草稿目录,未来需要整理下
-# lab-08
-
-简单测试,Tomcat + Redis 提供最小接口,看看 QPS
-
-# lab-9
-
-记录阅读极客时间《数据结构与算法之美》的题目。
-
-# lab-10
-
-Spring Boot 优雅关闭示例。
-
# lab-50
Email 示例
+
+# lab-69-proxy
+
+动态代理
diff --git a/lab-01/lab-01-springsecurity-demo-role/pom.xml b/lab-01-spring-security/lab-01-springsecurity-demo-role/pom.xml
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo-role/pom.xml
rename to lab-01-spring-security/lab-01-springsecurity-demo-role/pom.xml
diff --git a/lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java b/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
rename to lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
diff --git a/lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java b/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java
rename to lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java
diff --git a/lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java b/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java
rename to lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java
diff --git a/lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java b/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java
rename to lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java
diff --git a/lab-01/lab-01-springsecurity-demo/pom.xml b/lab-01-spring-security/lab-01-springsecurity-demo/pom.xml
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo/pom.xml
rename to lab-01-spring-security/lab-01-springsecurity-demo/pom.xml
diff --git a/lab-01/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java b/lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
rename to lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
diff --git a/lab-01/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java b/lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java
rename to lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java
diff --git a/lab-01/lab-01-springsecurity-demo/src/main/resources/application.yaml b/lab-01-spring-security/lab-01-springsecurity-demo/src/main/resources/application.yaml
similarity index 100%
rename from lab-01/lab-01-springsecurity-demo/src/main/resources/application.yaml
rename to lab-01-spring-security/lab-01-springsecurity-demo/src/main/resources/application.yaml
diff --git a/lab-01/pom.xml b/lab-01-spring-security/pom.xml
similarity index 92%
rename from lab-01/pom.xml
rename to lab-01-spring-security/pom.xml
index a0ff71ac5..caa7e54d0 100644
--- a/lab-01/pom.xml
+++ b/lab-01-spring-security/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-01
+ lab-02-spring-security
pom
lab-01-springsecurity-demo
diff --git "a/lab-01/\343\200\212\350\212\213\351\201\223 Spring Boot \345\256\211\345\205\250\346\241\206\346\236\266 Spring Security \345\205\245\351\227\250\343\200\213.md" "b/lab-01-spring-security/\343\200\212\350\212\213\351\201\223 Spring Boot \345\256\211\345\205\250\346\241\206\346\236\266 Spring Security \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-01/\343\200\212\350\212\213\351\201\223 Spring Boot \345\256\211\345\205\250\346\241\206\346\236\266 Spring Security \345\205\245\351\227\250\343\200\213.md"
rename to "lab-01-spring-security/\343\200\212\350\212\213\351\201\223 Spring Boot \345\256\211\345\205\250\346\241\206\346\236\266 Spring Security \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-02/authorization-code-server/pom.xml b/lab-02-spring-security-oauth/authorization-code-server/pom.xml
similarity index 100%
rename from lab-02/authorization-code-server/pom.xml
rename to lab-02-spring-security-oauth/authorization-code-server/pom.xml
diff --git a/lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java b/lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java
similarity index 100%
rename from lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java
rename to lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java
diff --git a/lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java b/lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java
similarity index 100%
rename from lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java
rename to lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java
diff --git a/lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java b/lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java
similarity index 100%
rename from lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java
rename to lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java
diff --git a/lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java b/lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java
similarity index 100%
rename from lab-02/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java
rename to lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java
diff --git a/lab-02/authorization-code-server/src/main/resources/application.properties b/lab-02-spring-security-oauth/authorization-code-server/src/main/resources/application.properties
similarity index 100%
rename from lab-02/authorization-code-server/src/main/resources/application.properties
rename to lab-02-spring-security-oauth/authorization-code-server/src/main/resources/application.properties
diff --git a/lab-02/client-credentials-server/pom.xml b/lab-02-spring-security-oauth/client-credentials-server/pom.xml
similarity index 100%
rename from lab-02/client-credentials-server/pom.xml
rename to lab-02-spring-security-oauth/client-credentials-server/pom.xml
diff --git a/lab-02/client-credentials-server/src/main/java/lab01/Application.java b/lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/Application.java
similarity index 100%
rename from lab-02/client-credentials-server/src/main/java/lab01/Application.java
rename to lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/Application.java
diff --git a/lab-02/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java b/lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
similarity index 100%
rename from lab-02/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
rename to lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
diff --git a/lab-02/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java b/lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
similarity index 100%
rename from lab-02/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
rename to lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
diff --git a/lab-02/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java b/lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
similarity index 100%
rename from lab-02/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
rename to lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
diff --git a/lab-02/implicit-server/pom.xml b/lab-02-spring-security-oauth/implicit-server/pom.xml
similarity index 100%
rename from lab-02/implicit-server/pom.xml
rename to lab-02-spring-security-oauth/implicit-server/pom.xml
diff --git a/lab-02/implicit-server/src/main/java/lab01/Application.java b/lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/Application.java
similarity index 100%
rename from lab-02/implicit-server/src/main/java/lab01/Application.java
rename to lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/Application.java
diff --git a/lab-02/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java b/lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
similarity index 100%
rename from lab-02/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
rename to lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
diff --git a/lab-02/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java b/lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
similarity index 100%
rename from lab-02/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
rename to lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
diff --git a/lab-02/implicit-server/src/main/java/lab01/resource/api/ExampleController.java b/lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/api/ExampleController.java
similarity index 100%
rename from lab-02/implicit-server/src/main/java/lab01/resource/api/ExampleController.java
rename to lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/api/ExampleController.java
diff --git a/lab-02/implicit-server/src/main/resources/application.properties b/lab-02-spring-security-oauth/implicit-server/src/main/resources/application.properties
similarity index 100%
rename from lab-02/implicit-server/src/main/resources/application.properties
rename to lab-02-spring-security-oauth/implicit-server/src/main/resources/application.properties
diff --git a/lab-02/pom.xml b/lab-02-spring-security-oauth/pom.xml
similarity index 93%
rename from lab-02/pom.xml
rename to lab-02-spring-security-oauth/pom.xml
index 9912c2c9c..2f2dacd58 100644
--- a/lab-02/pom.xml
+++ b/lab-02-spring-security-oauth/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-02
+ lab-02-spring-security-oauth
pom
authorization-code-server
@@ -22,4 +22,4 @@
-
\ No newline at end of file
+
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/pom.xml b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/pom.xml
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/pom.xml
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/pom.xml
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/application.properties b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/application.properties
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/application.properties
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/application.properties
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/data.sql b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/data.sql
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/data.sql
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/data.sql
diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql
diff --git a/lab-02/resource-owner-password-credentials-server-with-refresh-token/pom.xml b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/pom.xml
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-refresh-token/pom.xml
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/pom.xml
diff --git a/lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/resources/application.properties b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/resources/application.properties
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-refresh-token/src/main/resources/application.properties
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/resources/application.properties
diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/pom.xml b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/pom.xml
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-revoke-token/pom.xml
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/pom.xml
diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java
diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/resources/application.properties b/lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/resources/application.properties
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server-with-revoke-token/src/main/resources/application.properties
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/resources/application.properties
diff --git a/lab-02/resource-owner-password-credentials-server/pom.xml b/lab-02-spring-security-oauth/resource-owner-password-credentials-server/pom.xml
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server/pom.xml
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server/pom.xml
diff --git a/lab-02/resource-owner-password-credentials-server/src/main/java/lab01/Application.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/Application.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server/src/main/java/lab01/Application.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/Application.java
diff --git a/lab-02/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
diff --git a/lab-02/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
diff --git a/lab-02/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java b/lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
diff --git a/lab-02/resource-owner-password-credentials-server/src/main/resources/application.properties b/lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/resources/application.properties
similarity index 100%
rename from lab-02/resource-owner-password-credentials-server/src/main/resources/application.properties
rename to lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/resources/application.properties
diff --git "a/lab-02-spring-security-oauth/\343\200\212\350\212\213\351\201\223 Spring Security OAuth2 \345\205\245\351\227\250\357\274\210\346\226\260\357\274\211\343\200\213.md" "b/lab-02-spring-security-oauth/\343\200\212\350\212\213\351\201\223 Spring Security OAuth2 \345\205\245\351\227\250\357\274\210\346\226\260\357\274\211\343\200\213.md"
new file mode 100644
index 000000000..52f9dc06c
--- /dev/null
+++ "b/lab-02-spring-security-oauth/\343\200\212\350\212\213\351\201\223 Spring Security OAuth2 \345\205\245\351\227\250\357\274\210\346\226\260\357\274\211\343\200\213.md"
@@ -0,0 +1,3 @@
+
+
+对应 [lab-68](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68) 示例。
diff --git "a/lab-02-spring-security-oauth/\343\200\212\350\212\213\351\201\223 Spring Security OAuth2 \345\205\245\351\227\250\357\274\210\350\200\201\357\274\211\343\200\213.md" "b/lab-02-spring-security-oauth/\343\200\212\350\212\213\351\201\223 Spring Security OAuth2 \345\205\245\351\227\250\357\274\210\350\200\201\357\274\211\343\200\213.md"
new file mode 100644
index 000000000..a0798be1d
--- /dev/null
+++ "b/lab-02-spring-security-oauth/\343\200\212\350\212\213\351\201\223 Spring Security OAuth2 \345\205\245\351\227\250\357\274\210\350\200\201\357\274\211\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-03/lab-03-kafka-demo-ack/pom.xml b/lab-03-kafka/lab-03-kafka-demo-ack/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/pom.xml
rename to lab-03-kafka/lab-03-kafka-demo-ack/pom.xml
diff --git a/lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java b/lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
rename to lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
diff --git a/lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo08Consumer.java b/lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo08Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo08Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo08Consumer.java
diff --git a/lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo08Message.java b/lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo08Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo08Message.java
rename to lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo08Message.java
diff --git a/lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08Producer.java b/lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08Producer.java
rename to lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08Producer.java
diff --git a/lab-03/lab-03-kafka-demo-ack/src/main/resources/application.yaml b/lab-03-kafka/lab-03-kafka-demo-ack/src/main/resources/application.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/src/main/resources/application.yaml
rename to lab-03-kafka/lab-03-kafka-demo-ack/src/main/resources/application.yaml
diff --git a/lab-03/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java b/lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
rename to lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
diff --git a/lab-03/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08ProducerTest.java
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/pom.xml b/lab-03-kafka/lab-03-kafka-demo-batch-consume/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/pom.xml
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/pom.xml
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java b/lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java b/lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java b/lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java b/lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/src/main/resources/application.yaml b/lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/resources/application.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/src/main/resources/application.yaml
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/resources/application.yaml
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java b/lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
diff --git a/lab-03/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
diff --git a/lab-03/lab-03-kafka-demo-batch/pom.xml b/lab-03-kafka/lab-03-kafka-demo-batch/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/pom.xml
rename to lab-03-kafka/lab-03-kafka-demo-batch/pom.xml
diff --git a/lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java b/lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
rename to lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
diff --git a/lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java b/lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
diff --git a/lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java b/lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
rename to lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
diff --git a/lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java b/lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
rename to lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
diff --git a/lab-03/lab-03-kafka-demo-batch/src/main/resources/application.yaml b/lab-03-kafka/lab-03-kafka-demo-batch/src/main/resources/application.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/src/main/resources/application.yaml
rename to lab-03-kafka/lab-03-kafka-demo-batch/src/main/resources/application.yaml
diff --git a/lab-03/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java b/lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
rename to lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
diff --git a/lab-03/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
diff --git a/lab-03/lab-03-kafka-demo-broadcast/pom.xml b/lab-03-kafka/lab-03-kafka-demo-broadcast/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/pom.xml
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/pom.xml
diff --git a/lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java b/lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
diff --git a/lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo05Consumer.java b/lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo05Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo05Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo05Consumer.java
diff --git a/lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo05Message.java b/lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo05Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo05Message.java
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo05Message.java
diff --git a/lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05Producer.java b/lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05Producer.java
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05Producer.java
diff --git a/lab-03/lab-03-kafka-demo-broadcast/src/main/resources/application.yaml b/lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/resources/application.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/src/main/resources/application.yaml
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/resources/application.yaml
diff --git a/lab-03/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java b/lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
diff --git a/lab-03/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05ProducerTest.java
diff --git a/lab-03/lab-03-kafka-demo-concurrency/pom.xml b/lab-03-kafka/lab-03-kafka-demo-concurrency/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/pom.xml
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/pom.xml
diff --git a/lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java b/lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
diff --git a/lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo06Consumer.java b/lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo06Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo06Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo06Consumer.java
diff --git a/lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo06Message.java b/lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo06Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo06Message.java
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo06Message.java
diff --git a/lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06Producer.java b/lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06Producer.java
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06Producer.java
diff --git a/lab-03/lab-03-kafka-demo-concurrency/src/main/resources/application.yaml b/lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/resources/application.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/src/main/resources/application.yaml
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/resources/application.yaml
diff --git a/lab-03/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java b/lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
diff --git a/lab-03/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06ProducerTest.java
diff --git a/lab-03/lab-03-kafka-demo-transaction/pom.xml b/lab-03-kafka/lab-03-kafka-demo-transaction/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/pom.xml
rename to lab-03-kafka/lab-03-kafka-demo-transaction/pom.xml
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java b/lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo07Consumer.java b/lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo07Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo07Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo07Consumer.java
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo07Message.java b/lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo07Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo07Message.java
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo07Message.java
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07Producer.java b/lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07Producer.java
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07Producer.java
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/main/resources/application.yaml b/lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/main/resources/application.yaml
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application.yaml
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/main/resources/application_bak.yaml b/lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application_bak.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/main/resources/application_bak.yaml
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application_bak.yaml
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java b/lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
diff --git a/lab-03/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07ProducerTest.java
diff --git a/lab-03/lab-03-kafka-demo/pom.xml b/lab-03-kafka/lab-03-kafka-demo/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-demo/pom.xml
rename to lab-03-kafka/lab-03-kafka-demo/pom.xml
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04Producer.java b/lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04Producer.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04Producer.java
rename to lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04Producer.java
diff --git a/lab-03/lab-03-kafka-demo/src/main/resources/application.yaml b/lab-03-kafka/lab-03-kafka-demo/src/main/resources/application.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/resources/application.yaml
rename to lab-03-kafka/lab-03-kafka-demo/src/main/resources/application.yaml
diff --git a/lab-03/lab-03-kafka-demo/src/main/resources/application_bak.yaml b/lab-03-kafka/lab-03-kafka-demo/src/main/resources/application_bak.yaml
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/main/resources/application_bak.yaml
rename to lab-03-kafka/lab-03-kafka-demo/src/main/resources/application_bak.yaml
diff --git a/lab-03/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java b/lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
rename to lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
diff --git a/lab-03/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01ProducerTest.java
diff --git a/lab-03/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04ProducerTest.java b/lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04ProducerTest.java
similarity index 100%
rename from lab-03/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04ProducerTest.java
rename to lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04ProducerTest.java
diff --git a/lab-03/lab-03-kafka-native/pom.xml b/lab-03-kafka/lab-03-kafka-native/pom.xml
similarity index 100%
rename from lab-03/lab-03-kafka-native/pom.xml
rename to lab-03-kafka/lab-03-kafka-native/pom.xml
diff --git a/lab-03/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ConsumerMain.java b/lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ConsumerMain.java
similarity index 100%
rename from lab-03/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ConsumerMain.java
rename to lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ConsumerMain.java
diff --git a/lab-03/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ProducerMain.java b/lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ProducerMain.java
similarity index 100%
rename from lab-03/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ProducerMain.java
rename to lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ProducerMain.java
diff --git a/lab-03/pom.xml b/lab-03-kafka/pom.xml
similarity index 96%
rename from lab-03/pom.xml
rename to lab-03-kafka/pom.xml
index d32bb1f43..92f5e4e2a 100644
--- a/lab-03/pom.xml
+++ b/lab-03-kafka/pom.xml
@@ -10,7 +10,7 @@
4.0.0
- lab-03
+ lab-03-kafka
pom
lab-03-kafka-native
diff --git "a/lab-03/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 Kafka \345\205\245\351\227\250\343\200\213.md" "b/lab-03-kafka/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 Kafka \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-03/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 Kafka \345\205\245\351\227\250\343\200\213.md"
rename to "lab-03-kafka/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 Kafka \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07DeadConsumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07DeadConsumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07DeadConsumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07DeadConsumer.java
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo07Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo07Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo07Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo07Message.java
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07Producer.java
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo12Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo12Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo12Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo12Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo12Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo12Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo12Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo12Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo06Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo06Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo06Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo06Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo06Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo06Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo06Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo06Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo09Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo09Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo09Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo09Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo09Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo09Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo09Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo09Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerConfirmCallback.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerConfirmCallback.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerConfirmCallback.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerConfirmCallback.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerReturnCallback.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerReturnCallback.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerReturnCallback.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerReturnCallback.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/pom.xml
similarity index 94%
rename from lab-04/lab-04-rabbitmq-demo-delay/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/pom.xml
index 714601d56..6c21215a9 100644
--- a/lab-04/lab-04-rabbitmq-demo-delay/pom.xml
+++ b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/pom.xml
@@ -10,7 +10,7 @@
4.0.0
- lab-04-rabbitmq-demo-dely
+ lab-04-rabbitmq-demo-delay
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo08Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo08Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo08Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo08Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo08Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo08Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo08Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo08Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo16Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo16Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo16Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo16Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitListenerErrorHandlerImpl.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitListenerErrorHandlerImpl.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitListenerErrorHandlerImpl.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitListenerErrorHandlerImpl.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitLoggingErrorHandler.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitLoggingErrorHandler.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitLoggingErrorHandler.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitLoggingErrorHandler.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo16Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo16Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo16Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo16Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-json/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo15Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo15Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo15Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo15Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo15Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo15Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo15Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo15Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/pom.xml
similarity index 94%
rename from lab-04/lab-04-rabbitmq-demo-message-model/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/pom.xml
index 2a5370a28..945fa9462 100644
--- a/lab-04/lab-04-rabbitmq-demo-message-model/pom.xml
+++ b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/pom.xml
@@ -10,7 +10,7 @@
4.0.0
- lab-04-rabbitmq-demo-message-consume
+ lab-04-rabbitmq-demo-message-model
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/BroadcastConsumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/BroadcastConsumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/BroadcastConsumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/BroadcastConsumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/ClusteringConsumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/ClusteringConsumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/ClusteringConsumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/ClusteringConsumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/BroadcastMessage.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/BroadcastMessage.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/BroadcastMessage.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/BroadcastMessage.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/ClusteringMessage.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/ClusteringMessage.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/ClusteringMessage.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/ClusteringMessage.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo10Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo10Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo10Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo10Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo10Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo10Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo10Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo10Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo14Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo14Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo14Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo14Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo14Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo14Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo14Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo14Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo11Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo11Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo11Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo11Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo11Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo11Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo11Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo11Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-demo/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo01Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo01Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo01Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo01Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo02Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo02Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo02Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo02Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerA.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerA.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerA.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerA.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerB.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerB.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerB.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerB.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo04Consumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo04Consumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo04Consumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo04Consumer.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo01Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo01Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo01Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo01Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo02Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo02Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo02Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo02Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo03Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo03Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo03Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo03Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo04Message.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo04Message.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo04Message.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo04Message.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04Producer.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04Producer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04Producer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04Producer.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/main/resources/application.yaml b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/resources/application.yaml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/main/resources/application.yaml
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/resources/application.yaml
diff --git a/lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04ProducerTest.java b/lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04ProducerTest.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04ProducerTest.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04ProducerTest.java
diff --git a/lab-04/lab-04-rabbitmq-native/pom.xml b/lab-04-rabbitmq/lab-04-rabbitmq-native/pom.xml
similarity index 100%
rename from lab-04/lab-04-rabbitmq-native/pom.xml
rename to lab-04-rabbitmq/lab-04-rabbitmq-native/pom.xml
diff --git a/lab-04/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQConsumer.java b/lab-04-rabbitmq/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQConsumer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQConsumer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQConsumer.java
diff --git a/lab-04/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQProducer.java b/lab-04-rabbitmq/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQProducer.java
similarity index 100%
rename from lab-04/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQProducer.java
rename to lab-04-rabbitmq/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQProducer.java
diff --git a/lab-04/pom.xml b/lab-04-rabbitmq/pom.xml
similarity index 97%
rename from lab-04/pom.xml
rename to lab-04-rabbitmq/pom.xml
index a5547e765..ed9cf40a3 100644
--- a/lab-04/pom.xml
+++ b/lab-04-rabbitmq/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-04
+ lab-04-rabbitmq
pom
lab-04-rabbitmq-native
diff --git "a/lab-04/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 RabbitMQ \345\205\245\351\227\250\343\200\213.md" "b/lab-04-rabbitmq/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 RabbitMQ \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-04/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 RabbitMQ \345\205\245\351\227\250\343\200\213.md"
rename to "lab-04-rabbitmq/\343\200\212\350\212\213\351\201\223 Spring Boot \346\266\210\346\201\257\351\230\237\345\210\227 RabbitMQ \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-05/lab-05-jetty/pom.xml b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/pom.xml
similarity index 95%
rename from lab-05/lab-05-jetty/pom.xml
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/pom.xml
index 85441b3ab..64dc5b6cf 100644
--- a/lab-05/lab-05-jetty/pom.xml
+++ b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/pom.xml
@@ -3,7 +3,7 @@
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">
- lab-05
+ lab-05-benchmark-tomcat-jetty-undertow
cn.iocoder.springboot.labs
1.0-SNAPSHOT
diff --git a/lab-05/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
similarity index 100%
rename from lab-05/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
diff --git a/lab-05/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/JettyApplication.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/JettyApplication.java
similarity index 100%
rename from lab-05/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/JettyApplication.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/JettyApplication.java
diff --git a/lab-05/lab-05-tomcat-apr/pom.xml b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/pom.xml
similarity index 96%
rename from lab-05/lab-05-tomcat-apr/pom.xml
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/pom.xml
index bad157449..3c191b0a4 100644
--- a/lab-05/lab-05-tomcat-apr/pom.xml
+++ b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/pom.xml
@@ -3,7 +3,7 @@
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">
- lab-05
+ lab-05-benchmark-tomcat-jetty-undertow
cn.iocoder.springboot.labs
1.0-SNAPSHOT
diff --git a/lab-05/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
similarity index 100%
rename from lab-05/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
diff --git a/lab-05/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatAprApplication.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatAprApplication.java
similarity index 100%
rename from lab-05/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatAprApplication.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatAprApplication.java
diff --git a/lab-05/lab-05-tomcat/pom.xml b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/pom.xml
similarity index 93%
rename from lab-05/lab-05-tomcat/pom.xml
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/pom.xml
index 9c7d0da08..ee8ab7de8 100644
--- a/lab-05/lab-05-tomcat/pom.xml
+++ b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/pom.xml
@@ -3,7 +3,7 @@
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">
- lab-05
+ lab-05-benchmark-tomcat-jetty-undertow
cn.iocoder.springboot.labs
1.0-SNAPSHOT
diff --git a/lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
similarity index 100%
rename from lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
diff --git a/lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatApplication.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatApplication.java
similarity index 100%
rename from lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatApplication.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatApplication.java
diff --git a/lab-05/lab-05-undertow/pom.xml b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/pom.xml
similarity index 95%
rename from lab-05/lab-05-undertow/pom.xml
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/pom.xml
index f0b001c73..4e590241c 100644
--- a/lab-05/lab-05-undertow/pom.xml
+++ b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/pom.xml
@@ -3,7 +3,7 @@
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">
- lab-05
+ lab-05-benchmark-tomcat-jetty-undertow
cn.iocoder.springboot.labs
1.0-SNAPSHOT
diff --git a/lab-05/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/Controller.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/Controller.java
similarity index 100%
rename from lab-05/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/Controller.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/Controller.java
diff --git a/lab-05/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/UndertowApplication.java b/lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/UndertowApplication.java
similarity index 100%
rename from lab-05/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/UndertowApplication.java
rename to lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/UndertowApplication.java
diff --git a/lab-05/pom.xml b/lab-05-benchmark-tomcat-jetty-undertow/pom.xml
similarity index 92%
rename from lab-05/pom.xml
rename to lab-05-benchmark-tomcat-jetty-undertow/pom.xml
index bf1a42f82..286ab6012 100644
--- a/lab-05/pom.xml
+++ b/lab-05-benchmark-tomcat-jetty-undertow/pom.xml
@@ -12,7 +12,7 @@
4.0.0
cn.iocoder.springboot.labs
- lab-05
+ lab-05-benchmark-tomcat-jetty-undertow
1.0-SNAPSHOT
pom
diff --git "a/lab-05/\343\200\212\346\200\247\350\203\275\346\265\213\350\257\225 \342\200\224\342\200\224 Tomcat\343\200\201Jetty\343\200\201Undertow \345\237\272\345\207\206\346\265\213\350\257\225\343\200\213.md" "b/lab-05-benchmark-tomcat-jetty-undertow/\343\200\212\346\200\247\350\203\275\346\265\213\350\257\225 \342\200\224\342\200\224 Tomcat\343\200\201Jetty\343\200\201Undertow \345\237\272\345\207\206\346\265\213\350\257\225\343\200\213.md"
similarity index 100%
rename from "lab-05/\343\200\212\346\200\247\350\203\275\346\265\213\350\257\225 \342\200\224\342\200\224 Tomcat\343\200\201Jetty\343\200\201Undertow \345\237\272\345\207\206\346\265\213\350\257\225\343\200\213.md"
rename to "lab-05-benchmark-tomcat-jetty-undertow/\343\200\212\346\200\247\350\203\275\346\265\213\350\257\225 \342\200\224\342\200\224 Tomcat\343\200\201Jetty\343\200\201Undertow \345\237\272\345\207\206\346\265\213\350\257\225\343\200\213.md"
diff --git a/lab-08/pom.xml b/lab-08/pom.xml
deleted file mode 100644
index bc3bdcfb9..000000000
--- a/lab-08/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.1.4.RELEASE
-
-
- 4.0.0
-
- lab-08
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-redis
- 1.4.7.RELEASE
-
-
-
-
-
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
-
diff --git a/lab-08/src/main/java/cn/iocoder/springboot/labs/lab08/UserController.java b/lab-08/src/main/java/cn/iocoder/springboot/labs/lab08/UserController.java
deleted file mode 100644
index e0e326a0c..000000000
--- a/lab-08/src/main/java/cn/iocoder/springboot/labs/lab08/UserController.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package cn.iocoder.springboot.labs.lab08;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/user")
-public class UserController {
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- @GetMapping("/get_user_id")
- public String getUserId(@RequestParam("token") String token) {
- String userIdStr = stringRedisTemplate.opsForValue().get(token);
- if (userIdStr != null) {
-// return Integer.valueOf(userIdStr);
- return userIdStr;
- }
- return null;
- }
-
-}
diff --git a/lab-08/src/main/resources/application.yaml b/lab-08/src/main/resources/application.yaml
deleted file mode 100644
index d1491f05d..000000000
--- a/lab-08/src/main/resources/application.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-spring:
- application:
- name: user-application
- # jpa
- redis:
- password:
- database: 0
- port: 6379
- host: 127.0.0.1
- timeout: 0
- jedis:
- pool:
- max-wait:
- max-idle: 8
- min-idle: 0
-
-
-# server
-server:
- port: 16003
- servlet:
- context-path: /user-api/
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/graph/DijkstraTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/graph/DijkstraTest.java
deleted file mode 100644
index 030a57326..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/graph/DijkstraTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.graph;
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class DijkstraTest {
-
- public static class Graph {
-
- /**
- * 顶点的个数
- */
- private int v;
- /**
- * 邻接表
- */
- private List[] adj;
-
- public Graph(int v) {
- this.v = v;
- adj = new LinkedList[v];
- for (int i = 0; i < v; i++) {
- adj[i] = new LinkedList<>();
- }
- }
-
- public void addEdge(int s, int t, int w) {
- adj[s].add(new Edge(s, t, w));
- }
-
- }
-
- public static class Edge {
-
- /**
- * 来源顶点
- */
- private int s;
- /**
- * 目标顶点
- */
- private int t;
- /**
- * 权重(距离)
- */
- private int w;
-
- public Edge(int s, int t, int w) {
- this.s = s;
- this.t = t;
- this.w = w;
- }
-
- }
-
- public static class Vertex {
-
- /**
- * 顶点编号 id
- */
- private int id;
-
- /**
- * 从起始顶点,到达此处的最短距离。
- */
- private int dist;
-
- }
-
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/graph/Graph.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/graph/Graph.java
deleted file mode 100644
index 57bfbf8c8..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/graph/Graph.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.graph;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-public class Graph {
-
- /**
- * 顶点的个数
- */
- private int v;
- /**
- * 邻接表
- */
- private List[] adj;
-
- public Graph(int v) {
- this.v = v;
- adj = new LinkedList[v];
- for (int i = 0; i < v; i++) {
- adj[i] = new LinkedList<>();
- }
- }
-
- public void addEdge(int s, int t) {
- adj[s].add(t);
- adj[t].add(s);
- }
-
- public void print() {
- for (int i = 0; i < v; i++) {
- System.out.print(i + " :");
- System.out.println(adj[i]);
- }
- }
-
- public void bfs(int s, int t) {
- if (s == t) {
- throw new IllegalStateException("参数不合理");
- }
- // 初始化已访问
- boolean[] visited = new boolean[v];
- visited[s] = true;
-
- // 当前走到的路径
- Queue queue = new LinkedList<>();
- queue.add(s);
-
- // 记录哪个节点走到这里。通过它,实现路径的记录
- int[] prev = new int[v];
- Arrays.fill(prev, -1);
-
- while (queue.size() != 0) {
- int w = queue.poll();
- for (int i = 0; i < adj[w].size(); i++) {
- int q = adj[w].get(i);
- if (!visited[q]) {
- // 记录是从 w 走到 q
- prev[q] = w;
- // 判断是否到达目的地
- if (q == t) {
- print(prev, s, t);
- return;
- }
- visited[q] = true;
- queue.add(q);
- }
- }
- }
- }
-
- public void dfs(int s, int t) {
- if (s == t) {
- throw new IllegalStateException("参数不合理");
- }
- // 创建,标记是否找到
- AtomicBoolean found = new AtomicBoolean(false);
-
- // 初始化已访问
- boolean[] visited = new boolean[v];
-
- // 记录哪个节点走到这里。通过它,实现路径的记录
- int[] prev = new int[v];
- Arrays.fill(prev, -1);
-
- // dfs 遍历
- dfs(s, t, found, visited, prev);
-
- if (found.get()) {
- print(prev, s, t);
- } else {
- System.out.println("未找到路径...");
- }
- }
-
- private void dfs(int w, int t, AtomicBoolean found, boolean[] visited, int[] prev) {
- // 判断是否已经找到
- if (found.get()) {
- return;
- }
-
- // 标记已完成
- visited[w] = true;
-
- // 判断是否到达目的地
- if (w == t) {
- found.set(true);
- return;
- }
-
- // 遍历
- for (int i = 0; i < adj[w].size(); i++) {
- int q = adj[w].get(i);
- if (!visited[q]) {
- // 记录是从 w 走到 q
- prev[q] = w;
- // 继续递归
- dfs(q, t, found, visited, prev);
- }
- }
- }
-
- // 递归打印从 s 到 t 的点
- public void print(int[] prev, int s, int t) {
- if (prev[t] != -1 && t != s) {
- print(prev, s, prev[t]);
- }
- System.out.print(t + " ");
- }
-
- public static void main(String[] args) {
- Graph graph = new Graph(10);
- graph.addEdge(1, 3);
- graph.addEdge(3, 5);
- graph.addEdge(5, 7);
-// graph.addEdge(9, 6);
-// graph.print();
-// graph.bfs(1, 7);
- graph.dfs(1, 7);
-
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Main.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Main.java
deleted file mode 100644
index 6f552e852..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Main.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0035;
-
-public class Main {
-
- public static void main(String[] args) {
-// new Solution01().solveNQueens(4);
- new Solution02().solveNQueens(4);
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Solution01.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Solution01.java
deleted file mode 100644
index 2c801fb0e..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Solution01.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0035;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class Solution01 {
-
- public List> solveNQueens(int n) {
- if (n == 0) {
- return new ArrayList<>();
- }
-
- // 初始化变量
- List> results = new ArrayList<>();
- int[] used = new int[n]; // 标记,指定层,使用的位置
- for (int i = 0; i < n; i++) {
- used[i] = -1;
- }
-
- // 递归
- gen(results, used, 0, n);
-
- // 返回结果
- return results;
- }
-
- private void gen(List> results, int[] used, int index, int max) {
- // 到达最大值,结束递归
- if (index == max) {
- List result = new ArrayList<>();
- for (int i = 0; i < max; i++) {
- StringBuilder str = new StringBuilder();
- for (int j = 0; j < max; j++) {
- if (used[i] == j) {
- str.append("Q");
- } else {
- str.append(".");
- }
- }
- result.add(str.toString());
- }
- results.add(result);
- return;
- }
-
- // 递归
- for (int i = 0; i < max; i++) { // i 表示第几个位置
- boolean isOK = true;
- // 判断该位置,是否可用
- for (int j = 0; j < index; j++) {
- // 纵方法,判断
- if (used[j] == i) {
- isOK = false;
- break;
- }
- // 斜方法,判断
- int diff = index - j; // 判断差的层级
- if (used[j] + diff == i || used[j] - diff == i) {
- isOK = false;
- break;
- }
- }
- // 如果不合法,continue
- if (!isOK) {
- continue;
- }
- // 标记已使用
- used[index] = i;
- // 递归
- gen(results, used, index + 1, max);
- // 标记未使用,继续循环
- used[index] = -1;
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Solution02.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Solution02.java
deleted file mode 100644
index 9262c45c5..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0035/Solution02.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0035;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 在 {@link Solution01} 的基础上,做一个优化
- */
-public class Solution02 {
-
- public List> solveNQueens(int n) {
- if (n == 0) {
- return new ArrayList<>();
- }
-
- // 初始化变量
- List> results = new ArrayList<>();
- int[] used = new int[n]; // 标记,指定层,使用的位置
- for (int i = 0; i < n; i++) {
- used[i] = -1;
- }
- boolean[] usedCol = new boolean[n]; // 使用的列的标记
- boolean[] usedSum = new boolean[2 * n]; // x + y = c ,即“撇” 。
- boolean[] usedMinus = new boolean[2 * n]; // x - y = c ,即“捺” 。
-
-
- // 递归
- gen(results, used, usedCol, usedSum, usedMinus, 0, n);
-
- // 返回结果
- return results;
- }
-
- private void gen(List> results, int[] used, boolean[] usedCol, boolean[] usedSum, boolean[] usedMinus, int index, int max) {
- // 到达最大值,结束递归
- if (index == max) {
- List result = new ArrayList<>();
- for (int i = 0; i < max; i++) {
- StringBuilder str = new StringBuilder();
- for (int j = 0; j < max; j++) {
- if (used[i] == j) {
- str.append("Q");
- } else {
- str.append(".");
- }
- }
- result.add(str.toString());
- }
- results.add(result);
- return;
- }
-
- // 递归
- for (int i = 0; i < max; i++) { // i 表示第几个位置
- boolean isOK = true;
- // 判断该位置,是否可用
- if (usedCol[i]) { // 列已经使用
- continue;
- }
- int usedSumIndex = index + i; // “撇”已经使用
- if (usedSum[usedSumIndex]) {
- continue;
- }
- int usedMinusIndex = max + index - i; // “捺”已经使用
- if (usedMinus[usedMinusIndex]) {
- continue;
- }
- // 标记已使用
- used[index] = i;
- usedCol[i] = true;
- usedSum[usedSumIndex] = true;
- usedMinus[usedMinusIndex] = true;
- // 递归
- gen(results, used, usedCol, usedSum, usedMinus, index + 1, max);
- // 标记未使用,继续循环
- used[index] = -1;
- usedCol[i] = false;
- usedSum[usedSumIndex] = false;
- usedMinus[usedMinusIndex] = false;
-
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0036/Solution01.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0036/Solution01.java
deleted file mode 100644
index ee9e30344..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0036/Solution01.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0036;
-
-public class Solution01 {
-
- private void reset(boolean[] flags) {
- for (int i = 0; i < flags.length; i++) {
- flags[i] = false;
- }
- }
-
- public boolean isValidSudoku(char[][] board) {
- int n = 9;
- int m = 3;
- boolean[] flags = new boolean[n];
-
- // 横线
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if (board[i][j] == '.') {
- continue;
- }
- if (flags[board[i][j ] - '1']) {
- return false;
- }
- flags[board[i][j ] - '1'] = true;
- }
- reset(flags);
- }
-
- // 竖线
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if (board[j][i] == '.') {
- continue;
- }
- if (flags[board[j][i ] - '1']) {
- return false;
- }
- flags[board[j][i ] - '1'] = true;
- }
- reset(flags);
- }
-
- // 每个方块
- for (int i = 0; i < n; i = i + m) {
- for (int j = 0; j < n; j = j + m) {
- for (int p = i; p < i + m; p++) {
- for (int q = j; q < j + m; q++) {
- if (board[p][q] == '.') {
- continue;
- }
- if (flags[board[p][q] - '1']) {
- return false;
- }
- flags[board[p][q] - '1'] = true;
- }
- }
- reset(flags);
- }
- }
-
- return true;
- }
-
- public static void main(String[] args) {
- char[][] board = {{'.','.','.','.','5','.','.','1','.'},{'.','4','.','3','.','.','.','.','.'},{'.','.','.','.','.','3','.','.','1'},{'8','.','.','.','.','.','.','2','.'},{'.','.','2','.','7','.','.','.','.'},{'.','1','5','.','.','.','.','.','.'},{'.','.','.','.','.','2','.','.','.'},{'.','2','.','9','.','.','.','.','.'},{'.','.','4','.','.','.','.','.','.'}};
-// for (int i = 0; i < board.length; i++) {
-// for (int j = 0; j < board[i].length; j++) {
-// System.out.print(board[i][j] + "\t");
-// }
-// System.out.println();
-// }
- System.out.println(new Solution01().isValidSudoku(board));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0036/Solution02.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0036/Solution02.java
deleted file mode 100644
index 6d7fad1c9..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0036/Solution02.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0036;
-
-public class Solution02 {
-
- private void reset(boolean[] flags) {
- for (int i = 0; i < flags.length; i++) {
- flags[i] = false;
- }
- }
-
- public boolean isValidSudoku(char[][] board) {
- int n = 9;
- int m = 3;
-// boolean[] flags = new boolean[n];
- boolean[][] rows = new boolean[n][n];
- boolean[][] cols = new boolean[n][n];
- boolean[][] boxes = new boolean[n][n];
-
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if (board[i][j] == '.') {
- continue;
- }
- int number = board[i][j] - '1'; // 减 1 而不是 0 ,因为数组从 0 开始。
- // 行
- if (rows[i][number]) {
- return false;
- }
- rows[i][number] = true;
- // 列
- if (cols[j][number]) {
- return false;
- }
- cols[j][number] = true;
- // 小方格
- int boxIndex = i / m * m + j / m;
- if (boxes[boxIndex][number]) {
- return false;
- }
- boxes[boxIndex][number] = true;
- }
- }
-
- return true;
- }
-
- public static void main(String[] args) {
- if (false) {
- char[][] board = {{'.', '.', '.', '.', '5', '.', '.', '1', '.'}, {'.', '4', '.', '3', '.', '.', '.', '.', '.'}, {'.', '.', '.', '.', '.', '3', '.', '.', '1'}, {'8', '.', '.', '.', '.', '.', '.', '2', '.'}, {'.', '.', '2', '.', '7', '.', '.', '.', '.'}, {'.', '1', '5', '.', '.', '.', '.', '.', '.'}, {'.', '.', '.', '.', '.', '2', '.', '.', '.'}, {'.', '2', '.', '9', '.', '.', '.', '.', '.'}, {'.', '.', '4', '.', '.', '.', '.', '.', '.'}};
-// for (int i = 0; i < board.length; i++) {
-// for (int j = 0; j < board[i].length; j++) {
-// System.out.print(board[i][j] + "\t");
-// }
-// System.out.println();
-// }
- System.out.println(new Solution02().isValidSudoku(board));
- }
- if (true) {
- char[][] board = {{'5','3','.','.','7','.','.','.','.'},{'6','.','.','1','9','5','.','.','.'},{'.','9','8','.','.','.','.','6','.'},{'8','.','.','.','6','.','.','.','3'},{'4','.','.','8','.','3','.','.','1'},{'7','.','.','.','2','.','.','.','6'},{'.','6','.','.','.','.','2','8','.'},{'.','.','.','4','1','9','.','.','5'},{'.','.','.','.','8','.','.','7','9'}};
- System.out.println(new Solution02().isValidSudoku(board));
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0072/Solution.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0072/Solution.java
deleted file mode 100644
index 4939ad34d..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0072/Solution.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0072;
-
-public class Solution {
-
- public int minDistance(String word1, String word2) {
- // + 1 的原始是,
- // 1. 字符串的长度可以是 0 。例如说,word1 为 abc ,word2 为空串。
- // 2. 而数组的下标,代表的是第几个字符串。
- // 所以需要 + 1 。
- int[][] dp = new int[word1.length() + 1][word2.length() + 1];
-
- // 初始化
- for (int i = 0; i <= word1.length(); i++) { // i 变成 words2 0 的位置,就是意味着 words2 是空串,则需要不断删除
- dp[i][0] = i;
- }
- for (int j = 0; j <= word2.length(); j++) { // words[0] 变成 words2 j 的位置,就是意味着,需要不断添加。
- dp[0][j] = j;
- }
-
- // dp
- for (int i = 1; i <= word1.length(); i++) {
- for (int j = 1; j <= word2.length(); j++) {
- if (word1.charAt(i - 1) == word2.charAt(j - 1)) { // -1 的原因,正如上面所说 + 1 的原因,dp 的下标,对应 word 的下标 - 1 。
- dp[i][j] = dp[i - 1][j - 1];
- } else {
- dp[i][j] = this.min(
- dp[i - 1][j] + 1, // 删除 a[i]
- dp[i][j - 1] + 1, // 插入 b[j]
- dp[i - 1][j - 1] + 1 // 替换 a[i] 到 b[j]
- );
- }
- }
- }
-
- return dp[word1.length()][word2.length()];
- }
-
- private int min(int a, int b, int c) {
- return Math.min(Math.min(a, b), c);
- }
-
- public static void main(String[] args) {
- Solution solution = new Solution();
- System.out.println(solution.minDistance("horse", "ros"));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0120/Solution01.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0120/Solution01.java
deleted file mode 100644
index 5f283097f..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0120/Solution01.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0120;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 自上而下,进行 DP
- */
-public class Solution01 {
-
- public int minimumTotal(List> triangle) {
- if (triangle == null || triangle.isEmpty()) {
- return 0;
- }
- // 只有一层,就不要求解了
- if (triangle.size() == 1) {
- return triangle.get(0).get(0);
- }
-
- // 通过 ways ,记录最大路径
- int size = triangle.size();
- int[] ways = new int[triangle.get(size - 1).size()];
- Arrays.fill(ways, Integer.MAX_VALUE);
- // 计算下一层的时候,临时使用
- int[] tmps = new int[ways.length];
- // 用于在最后一层,计算 ways 中的最小值。
- int min = Integer.MAX_VALUE;
-
- // 开始动态规划
- ways[0] = triangle.get(0).get(0);
- tmps[0] = triangle.get(0).get(0);
- for (int i = 1; i < size; i++) {
- int levelSize = triangle.get(i).size();
- for (int j = 0; j < levelSize; j++) {
- // 选取能到达当前节点的较小值
- int result;
- if (j == 0) {
- result = ways[j];
- } else if (j == levelSize - 1) {
- result = ways[j - 1];
- } else {
- result = Math.min(ways[j], ways[j - 1]);
- }
- // 记录当前节点需要的最小路径,到 tmps 中。
- tmps[j] = result + triangle.get(i).get(j);
- // 如果是最后一层,开始计算最小值。
- if (i == size - 1) {
- if (tmps[j] < min) {
- min = tmps[j];
- }
- }
- }
- System.arraycopy(tmps, 0, ways, 0, levelSize);
- }
-
- return min;
- }
-
- public static void main(String[] args) {
- List> triangle = new ArrayList<>();
- triangle.add(Arrays.asList(2));
- triangle.add(Arrays.asList(3, 4));
- triangle.add(Arrays.asList(6, 5, 7));
- triangle.add(Arrays.asList(4, 1, 8, 3));
- System.out.println(new Solution01().minimumTotal(triangle));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0120/Solution02.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0120/Solution02.java
deleted file mode 100644
index c24a80092..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0120/Solution02.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0120;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 自下而上,进行 DP
- */
-public class Solution02 {
-
- public int minimumTotal(List> triangle) {
- if (triangle == null || triangle.isEmpty()) {
- return 0;
- }
-
- // 通过 ways ,记录最大路径
- int size = triangle.size();
- int[] ways = new int[triangle.get(size - 1).size()];
- for (int j = 0; j < triangle.get(size - 1).size(); j++) {
- ways[j] = triangle.get(size - 1).get(j);
- }
-
- // 自下而上 DP
- for (int i = size - 2; i >= 0; i--) {
- for (int j = 0; j < triangle.get(i).size(); j++) {
- ways[j] = Math.min(ways[j], ways[j + 1]) + triangle.get(i).get(j);
- }
- }
-
- return ways[0];
- }
-
- public static void main(String[] args) {
- List> triangle = new ArrayList<>();
- triangle.add(Arrays.asList(2));
- triangle.add(Arrays.asList(3, 4));
- triangle.add(Arrays.asList(6, 5, 7));
- triangle.add(Arrays.asList(4, 1, 8, 3));
- System.out.println(new Solution02().minimumTotal(triangle));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0123/Solution.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0123/Solution.java
deleted file mode 100644
index d29768687..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0123/Solution.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0123;
-
-public class Solution {
-
- public int maxProfit(int[] prices) {
- if (prices == null || prices.length == 0) {
- return 0;
- }
- int k = 2; // 最大交易次数,只能两次
- // 第一维度 k ,表示当前【买入股票】的次数;
- // 第二维度 2 ,表示 0 - 未持有,1 - 持有 1 股
- // 值为最大利润
- int[][] dp = new int[k + 1][2];
- // 初始化第一个股票的处理
- dp[1][1] = -prices[0]; // 买入
- dp[2][1] = -prices[0]; // 买入 + 卖出 + 买入
- dp[0][1] = Integer.MIN_VALUE; // 相当于赋值为空,避免直接认为持有一股时,利润为 0 。
-
- // 遍历,进行买卖
- for (int i = 1; i < prices.length; i++) {
- for (int j = 0; j <= k; j++) {
- // 尝试卖出
- dp[j][0] = Math.max(dp[j][0], dp[j][1] + prices[i]);
- // 尝试买入
- if (j > 0) {
- dp[j][1] = Math.max(dp[j][1], dp[j - 1][0] - prices[i]);
- }
- }
- }
-
- return Math.max(dp[1][0], dp[2][0]);
- }
-
-// public int maxProfit(int[] prices) {
-// if (prices == null || prices.length == 0) {
-// return 0;
-// }
-// int k = 2; // 最大交易次数,只能两次
-// // 第一维度 k ,表示当前【买入股票】的次数;
-// // 第二维度 2 ,表示 0 - 未持有,1 - 持有 1 股
-// int[][][] dp = new int[prices.length][k + 1][2];
-// // 初始化第一个股票的处理
-// dp[0][1][1] = -prices[0]; // 买入
-//// dp[2][1] = -prices[0]; // 买入 + 卖出 + 买入
-//
-// // 遍历,进行买卖
-// for (int i = 1; i < prices.length; i++) {
-// for (int j = 0; j <= k; j++) {
-// // 尝试卖出
-// dp[i][j][0] = Math.max(dp[i][j][0], dp[i][j][1] + prices[i]);
-// // 尝试买入
-// if (j > 0) {
-// dp[i][j][1] = Math.max(dp[i][j][1], dp[i][j - 1][0] - prices[i]);
-// }
-// }
-// }
-//
-// return Math.max(dp[prices.length -1][1][0], dp[prices.length - 1][2][0]);
-// }
-
- public static void main(String[] args) {
- Solution solution = new Solution();
- System.out.println(solution.maxProfit(new int[]{3,3,5,0,0,3,1,4}));
- System.out.println(solution.maxProfit(new int[]{1,2,3,4,5}));
- System.out.println(solution.maxProfit(new int[]{7, 6, 4, 3, 1}));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0146/LRUCache.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0146/LRUCache.java
deleted file mode 100644
index cb8f54d4e..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0146/LRUCache.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0146;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-public class LRUCache {
-
- private Map cache;
-
- public LRUCache(int capacity) {
- this.cache = new LinkedHashMap((int) Math.ceil(capacity / 0.75f) + 1, 0.75f, true) {
-
- @Override
- protected boolean removeEldestEntry(Map.Entry eldest) {
- return size() > capacity;
- }
-
- };
- }
-
- public int get(int key) {
- Integer val = cache.get(key);
- return val != null ? val : -1;
- }
-
- public void put(int key, int value) {
- cache.put(key, value);
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0146/LRUCache02.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0146/LRUCache02.java
deleted file mode 100644
index 6bf72313b..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0146/LRUCache02.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0146;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class LRUCache02 {
-
- private class Node {
-
- private int key;
- private int value;
- private Node prev;
- private Node next;
-
- public Node(int key, int value, Node prev, Node next) {
- this.key = key;
- this.value = value;
- this.prev = prev;
- this.next = next;
- }
-
- }
-
- /**
- * 容量
- */
- private int capacity;
- /**
- * 缓存
- */
- private Map cache;
- /**
- * 指向头
- */
- private Node head;
- /**
- * 指向尾.
- *
- * 最新的元素,放在尾部
- */
- private Node tail;
-
- public LRUCache02(int capacity) {
- this.capacity = capacity;
- this.cache = new HashMap<>(capacity, 1F);
- }
-
- public int get(int key) {
- Node node = this.getNode(key);
- return node != null ? node.value : -1;
- }
-
- public void put(int key, int value) {
- Node node = getNode(key);
-
- // 获得到值,设置其值
- if (node != null) {
- node.value = value;
- return;
- }
-
- // 移除最老访问的
- removeIfFull();
-
- // 容量足够
- node = new Node(key, value, tail, null);
- cache.put(key, node);
- // 设置新的尾节点
- if (head == null) {
- head = tail = node;
- } else {
- tail.next = node;
- tail = node;
- }
- }
-
- private Node getNode(int key) {
- // head 为空,说明无元素
- if (head == null) {
- return null;
- }
-
- // 获得元素
- Node node = cache.get(key);
- if (node == null) { // 如果获得不到,返回空
- return null;
- }
-
- // 如果尾部并未指向 node ,则重新指向
- if (node != tail) {
- if (node == head) {
- head = head.next;
- head.prev = null;
- } else {
- node.next.prev = node.prev;
- node.prev.next = node.next;
- }
-
- // 添加到尾部
- node.prev = tail;
- tail.next = node;
- node.next = null;
- tail = node;
- }
-
- return node;
- }
-
- private void removeIfFull() {
- if (cache.size() < capacity) {
- return;
- }
-
- // 移除 cache
- cache.remove(head.key);
- // 更新新的 head
- head = head.next;
- if (head != null) { // 主要为了处理 capacity 为 1 的情况
- head.prev = null;
- }
- }
-
- public static void main(String[] args) {
- if (false) {
- LRUCache02 cache = new LRUCache02(2 /* 缓存容量 */);
-
- cache.put(1, 1);
- cache.put(2, 2);
- System.out.println(cache.get(1)); // 返回 1
- cache.put(3, 3); // 该操作会使得密钥 2 作废
- System.out.println(cache.get(2)); // 返回 -1 (未找到)
- cache.put(4, 4); // 该操作会使得密钥 1 作废
- System.out.println(cache.get(1)); // 返回 -1 (未找到)
- System.out.println(cache.get(3)); // 返回 3
- System.out.println(cache.get(4)); // 返回 4
- }
- if (true) {
- LRUCache02 cache = new LRUCache02(1 /* 缓存容量 */);
- cache.put(2, 1);
- System.out.println(cache.get(2)); // 返回 1
- cache.put(3, 2);
- System.out.println(cache.get(2)); // 返回
- System.out.println(cache.get(3)); // 返回
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution01.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution01.java
deleted file mode 100644
index b957bdd68..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution01.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0152;
-
-@Deprecated // 解法不对
-public class Solution01 {
-
- public int maxProduct(int[] nums) {
- Integer max = Integer.MIN_VALUE; // 最大值
- Integer x = null; // 正数
- Integer y = null; // 负数
-
- // 遍历
- for (int num : nums) {
- if (num >= 0) { // 正数
- if (x == null) {
- x = num;
- } else {
- if (num * x > x) {
- x = num * x;
- } else {
- x = num;
- }
- }
- if (y != null) {
- if (num == 0) {
- y = null;
- } else {
- y = y * num;
- }
- }
- } else { // 负数
- if (y == null) {
- if (x == null) {
- y = num;
- } else {
- y = num * x;
- x = null;
- }
- } else {
- y = num * y;
- if (y > 0) {
- x = y;
- y = num;
- }
- }
- }
- // 判断是否超过
- if (x != null && x > max) {
- max = x;
- }
- if (y != null && y > max) { // 处理,整个数组只有一个负数的情况。
- max = y;
- }
- }
-
- return max;
- }
-
- public static void main(String[] args) {
- Solution01 solution = new Solution01();
-// System.out.println(solution.maxProduct(new int[]{2, 3, -2, -4}));
-// System.out.println(solution.maxProduct(new int[]{2, 3, -2, 4}));
-// System.out.println(solution.maxProduct(new int[]{-2, 0, 1}));
-// System.out.println(solution.maxProduct(new int[]{0, 2}));
-// System.out.println(solution.maxProduct(new int[]{2, -5, -2, -4, 3}));
- System.out.println(solution.maxProduct(new int[]{-1, -2, -9, -6}));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution02.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution02.java
deleted file mode 100644
index 08366ca49..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution02.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0152;
-
-/**
- * dp 方程
- *
- * dp1[i] = max(dp[i - 1] * nums[i], dp2[i -1] * nums[i], nums[i])
- * dp2[i] = min(dp[i - 1] * nums[i], dp2[i -1] * nums[i], nums[i])
- *
- * 通过不断求,使用上当前数值时,能产生的最大值。
- *
- * 注意,结果不是 dp1[n - 1] ,而是在这个过程中,产生的最大值。因为 nums 有负数的可能性,导致不一定使用上当前值,就一定是最大值。
- */
-public class Solution02 {
-
- public int maxProduct(int[] nums) {
- // 最大值
- int max = nums[0];
- // 使用上当前位置的数,最大值。max 和 dp1 并不等价,因为使用上当前数字后,可能不一定大于 max
- int[] dp1 = new int[nums.length];
- dp1[0] = nums[0];
- // 使用上当前位置的数,最小值。使用最小值的原因是,可以有机会负负得正
- int[] dp2 = new int[nums.length];
- dp2[0] = nums[0];
-
- // 开始 dp
- for (int i = 1; i < nums.length; i++) {
- int num = nums[i];
- dp1[i] = max(dp1[i - 1] * num, // 如果 num 是正数的情况下,乘以 dp1,会变大
- dp2[i - 1] * num, // 如果 num 是负数的情况,乘以 dp2 ,可能反倒比 dp1 大。
- num); // 可能上面两个,乘了半天,还不如
- dp2[i] = min(dp1[i - 1] * num, dp2[i - 1] * num, num); // 同上面的想法
- // 求最大值
- max = Math.max(dp1[i], max);
- }
-
- return max;
- }
-
- private int min(int a, int b, int c) {
- return Math.min(Math.min(a, b), c);
- }
-
- private int max(int a, int b, int c) {
- return Math.max(Math.max(a, b), c);
- }
-
- public static void main(String[] args) {
- Solution02 solution = new Solution02();
- System.out.println(solution.maxProduct(new int[]{2, 3, -2, -4}));
- System.out.println(solution.maxProduct(new int[]{2, 3, -2, 4}));
- System.out.println(solution.maxProduct(new int[]{-2, 0, 1}));
- System.out.println(solution.maxProduct(new int[]{0, 2}));
- System.out.println(solution.maxProduct(new int[]{2, -5, -2, -4, 3}));
- System.out.println(solution.maxProduct(new int[]{-1, -2, -9, -6}));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution03.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution03.java
deleted file mode 100644
index 8d898c7a3..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0152/Solution03.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0152;
-
-/**
- * {@link Solution02} 的改进,不使用两个一维数组,而是直接使用两个变量。
- */
-public class Solution03 {
-
- public int maxProduct(int[] nums) {
- // 最大值
- int max = nums[0];
- // 使用上当前位置的数,最大值。max 和 dp1 并不等价,因为使用上当前数字后,可能不一定大于 max
- int dp1 = nums[0];
- // 使用上当前位置的数,最小值。使用最小值的原因是,可以有机会负负得正
- int dp2 = nums[0];
-
- // 开始 dp
- for (int i = 1; i < nums.length; i++) {
- int num = nums[i];
- int[] results = minAndMax(dp1 * num, dp2* num, num);
- dp1 = results[1];
- dp2 = results[0];
- // 求最大值
- max = Math.max(dp1, max);
- }
-
- return max;
- }
-
- private int[] minAndMax(int a, int b, int c) {
- return new int[]{Math.min(Math.min(a, b), c),
- Math.max(Math.max(a, b), c)};
- }
-
- public static void main(String[] args) {
- Solution03 solution = new Solution03();
- System.out.println(solution.maxProduct(new int[]{2, 3, -2, -4}));
- System.out.println(solution.maxProduct(new int[]{2, 3, -2, 4}));
- System.out.println(solution.maxProduct(new int[]{-2, 0, 1}));
- System.out.println(solution.maxProduct(new int[]{0, 2}));
- System.out.println(solution.maxProduct(new int[]{2, -5, -2, -4, 3}));
- System.out.println(solution.maxProduct(new int[]{-1, -2, -9, -6}));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0208/Trie.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0208/Trie.java
deleted file mode 100644
index e30aa7e1e..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0208/Trie.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0208;
-
-public class Trie {
-
- public class Node {
-
- private Node[] children;
- private boolean end;
-
- public Node() {
- children = new Node['z' - 'a' + 1];
- }
-
- }
-
- private Node node;
-
- /** Initialize your data structure here. */
- public Trie() {
- node = new Node();
- }
-
- /** Inserts a word into the trie. */
- public void insert(String word) {
- if (word == null || word.length() == 0) {
- return;
- }
-
- // 遍历,创建节点
- Node current = node;
- for (int i = 0; i < word.length(); i++) {
- int index = getIndex(word.charAt(i));
- Node next = current.children[index];
- if (next == null) {
- next = new Node();
- current.children[index] = next;
- }
- current = next;
- }
-
- // 标记结束
- current.end = true;
- }
-
- /** Returns if the word is in the trie. */
- public boolean search(String word) {
- if (word == null || word.length() == 0) {
- return false;
- }
-
- // 遍历,寻找节点
- Node current = node;
- for (int i = 0; i < word.length(); i++) {
- int index = getIndex(word.charAt(i));
- Node next = current.children[index];
- if (next == null) {
- return false;
- }
- current = next;
- }
-
- // 判断找到的节点,是否为根节点
- return current.end;
- }
-
- /** Returns if there is any word in the trie that starts with the given prefix. */
- public boolean startsWith(String prefix) {
- if (prefix == null || prefix.length() == 0) {
- return false;
- }
-
- // 遍历,寻找节点
- Node current = node;
- for (int i = 0; i < prefix.length(); i++) {
- int index = getIndex(prefix.charAt(i));
- Node next = current.children[index];
- if (next == null) {
- return false;
- }
- current = next;
- }
-
- // 结果找到
- return true;
- }
-
- private int getIndex(char ch) {
- return ch - 'a';
- }
-
- public static void main(String[] args) {
- Trie trie = new Trie();
-
- trie.insert("apple");
- System.out.println(trie.search("apple")); // 返回 true
- System.out.println(trie.search("app")); // 返回 false
- System.out.println(trie.startsWith("app")); // 返回 true
-
- trie.insert("app");
- System.out.println(trie.search("app")); // 返回 true
-
- System.out.println(trie.search("appled"));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0231/Solution01.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0231/Solution01.java
deleted file mode 100644
index 781f9d67a..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0231/Solution01.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0231;
-
-public class Solution01 {
-
- public boolean isPowerOfTwo(int n) {
- // 非正整数,非正整数
- if (n <= 0) {
- return false;
- }
-
- int mask = 1;
- for (int i = 0; i < 32; i++) {
- // 或运算,如果就是自己,说明是 2 的 n 次方
- if ((n | mask) == mask) {
- return true;
- }
-
- // mask 超过范围,说明就是不符合
- if (mask > n) {
- return false;
- }
-
- mask = mask << 1;
- }
-
- return false;
- }
-
- public static void main(String[] args) {
- Solution01 solution = new Solution01();
- System.out.println(solution.isPowerOfTwo(1));
- System.out.println(solution.isPowerOfTwo(2));
- System.out.println(solution.isPowerOfTwo(3));
- System.out.println(solution.isPowerOfTwo(4));
- System.out.println(solution.isPowerOfTwo(5));
- System.out.println(solution.isPowerOfTwo(6));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution01.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution01.java
deleted file mode 100644
index aeb039427..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution01.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0235;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 寻找路径,然后匹配
- */
-public class Solution01 {
-
- public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
- // p 节点的路径
- List pNodes = new ArrayList<>();
- binarySearch(root, p, pNodes);
- // q 节点的路径
- List qNodes = new ArrayList<>();
- binarySearch(root, q, qNodes);
-
- // 倒序,对比
- for (int i = pNodes.size() - 1; i >= 0; i--) {
- TreeNode node = pNodes.get(i);
- for (int j = qNodes.size() - 1; j >= 0; j--) {
- TreeNode node2 = qNodes.get(j);
- if (node.val == node2.val) {
- return node;
- }
- }
- }
- return null;
- }
-
- private void binarySearch(TreeNode root, TreeNode target, List nodes) {
- if (root == null) { // 理论不存在,防御性
- return;
- }
-
- // 添加到路径
- nodes.add(root);
-
- if (root.val == target.val) {
- return;
- }
- if (root.val > target.val) {
- binarySearch(root.left, target, nodes);
- } else {
- binarySearch(root.right, target, nodes);
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution02.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution02.java
deleted file mode 100644
index 6db99c502..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution02.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0235;
-
-/**
- * 递归求解父节点
- */
-public class Solution02 {
-
- public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
- if (p.val < root.val
- && root.val > q.val) { // 因为 root.val 大于 q.val ,说明 root 的值过大,需要往左走
- return lowestCommonAncestor(root.left, p, q);
- } else if (p.val > root.val // 因为 root.val 小于 p.val ,说明 root 的值过小,需要往右走
- && root.val < q.val) {
- return lowestCommonAncestor(root.right, p, q);
- } else { // 其他情况,root 都是符合条件的,例如说 root 的泛微在 p and q 之间(或者 q and p 之间)。
- // 为什么直接返回 root 就可以,因为如果不是最接近的父节点,p 和 q 要么在其左边,要么在其右边。
- return root;
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution03.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution03.java
deleted file mode 100644
index 38326d63c..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/Solution03.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0235;
-
-/**
- * {@link Solution02} 的改进,非递归方式。
- */
-public class Solution03 {
-
- public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
- while (true) {
- if (p.val < root.val
- && root.val > q.val) { // 因为 root.val 大于 q.val ,说明 root 的值过大,需要往左走
- root = root.left;
- } else if (p.val > root.val // 因为 root.val 小于 p.val ,说明 root 的值过小,需要往右走
- && root.val < q.val) {
- root = root.right;
- } else { // 其他情况,root 都是符合条件的,例如说 root 的泛微在 p and q 之间(或者 q and p 之间)。
- return root;
- }
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/TreeNode.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/TreeNode.java
deleted file mode 100644
index 2f5137911..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0235/TreeNode.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0235;
-
-public class TreeNode {
-
- int val;
- TreeNode left;
- TreeNode right;
-
- TreeNode(int x) { val = x; }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0300/Solution01.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0300/Solution01.java
deleted file mode 100644
index c2d6d3136..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0300/Solution01.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0300;
-
-import java.util.Arrays;
-
-/**
- * DP 实现,时间复杂度为 O(N^2) 。
- *
- * DP 转换方程是:
- * dp[i] = MAX(dp[i], dp[j] + 1)
- * 其中,dp[i] 表示,截止目前,最大的上升的子序列
- */
-public class Solution01 {
-
- public int lengthOfLIS(int[] nums) {
- if (nums.length == 0) {
- return 0;
- }
-
- int[] dps = new int[nums.length];
- Arrays.fill(dps, 1); // 都赋值为 1 先,因为自己是自己的递增。
- int result = 1;
-
- // dp
- for (int i = 1; i < nums.length; i++) {
- for (int j = 0; j < i; j++) {
- if (nums[i] > nums[j]) {
- dps[i] = Math.max(dps[i], dps[j] + 1);
- }
- }
- result = Math.max(result, dps[i]);
- }
-
- return result;
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0300/Solution02.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0300/Solution02.java
deleted file mode 100644
index f89d3d2bb..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0300/Solution02.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0300;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 二分 + 贪心
- */
-public class Solution02 {
-
- public int lengthOfLIS(int[] nums) {
- if (nums.length == 0) {
- return 0;
- }
-
- List lis = new ArrayList<>(); // 上升序列
- for (int num : nums) {
- int position = binarySearch(lis, num);
- if (position >= lis.size()) {
- lis.add(num);
- } else {
- lis.set(position, num);
- }
- }
-
-
- return lis.size();
- }
-
- /**
- * 获得比 num 第一大的值的位置
- * 如果有和 num 相等的,也返回
- *
- * TODO 芋艿,后续,可以使用 Arrays.binarySearch() 简化。
- *
- * @param lis
- * @param num
- * @return
- */
- private int binarySearch(List lis, int num) {
- int high = lis.size() - 1;
-
- // 判断,是否超过
- if (high < 0 || lis.get(high) < num) {
- return lis.size();
- }
- if (num < lis.get(0)) {
- return 0;
- }
-
- // 二分查找
- int low = 0;
- while (low <= high) {
- int mid = low + ((high - low) >> 1);
- if (lis.get(mid) == num) {
- return mid;
- } else if (num < lis.get(mid)) {
- if (lis.get(mid - 1) > num) {
- return mid;
- } else {
- high = mid - 1;
- }
- } else {
- if (lis.get(mid + 1) > num) {
- return mid + 1;
- } else {
- low = mid + 1;
- }
- }
- }
-
- throw new IllegalArgumentException("不可能出现");
- }
-
- public static void main(String[] args) {
- Solution02 solution = new Solution02();
-// System.out.println(solution.lengthOfLIS(new int[]{10,9,2,5,3,7,101,18}));
- System.out.println(solution.lengthOfLIS(new int[]{7,8,9,10,1,2,3,4,5,5}));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0703/KthLargest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0703/KthLargest.java
deleted file mode 100644
index 15e1e93e6..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0703/KthLargest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0703;
-
-class KthLargest {
-
- /**
- * 小顶堆
- */
- private int[] heap;
- /**
- * 堆的位置
- */
- private int heapIndex;
- private int k;
-
- public KthLargest(int k, int[] nums) {
- this.heap = new int[k + 1];
- this.heapIndex = 1;
- this.k = k;
- // 初始化
- for (int num : nums) {
- add(num);
- }
- }
-
- public int add(int val) {
- if (heapIndex <= k) {
- // 赋值
- heap[heapIndex] = val;
- heapIndex++;
-
- // 向上堆化
- heapifyUp(heapIndex - 1);
- } else {
- if (val > heap[1]) { // 大于最小值,才有资格加入其中。因为我们构建的 heap 是小顶堆,最上面存储的是第 k 大。
- // 赋值
- heap[1] = val;
-
- heapifyDown(1);
- }
- }
-
- return heap[1];
- }
-
-// private int remove0() {
-// // 取头元素
-// int val = heap[1];
-//
-// // 将尾巴设置到头
-// heap[1] = heap[heapIndex - 1];
-// heapIndex--;
-//
-// // 向下堆化
-// heapifyDown(1);
-//
-// return val;
-// }
-
- public void heapifyUp(int index) {
- while (index > 1) { // 注意,此处要大于 1
- int parent = index / 2;
- if (heap[index] < heap[parent]) {
- swap(index, parent);
- index = parent;
- } else {
- break;
- }
- }
- }
-
- private void heapifyDown(int index) {
- while (true) {
- int pos = index;
- // 求子节点中,哪个
- if (index * 2 < heapIndex && heap[index * 2] < heap[index]) {
- pos = index * 2;
- }
- if (index * 2 + 1 < heapIndex && heap[index * 2 + 1] < heap[pos]) {
- pos = index * 2 + 1;
- }
- // 如果毫无变化,说明已经不需要继续向下
- if (pos == index) {
- return;
- }
- // 交换
- swap(index, pos);
- index = pos;
- }
- }
-
- private void swap(int i, int j) {
- int tmp = heap[i];
- heap[i] = heap[j];
- heap[j] = tmp;
- }
-
-// private int findMaxValueIndex() {
-// int max = Integer.MIN_VALUE;
-// int maxIndex = -1;
-// for (int i = log2(heapIndex) * 2; i < heapIndex; i++) { // 从 log2(heapIndex) * 2 的原因是,从叶子节点开始。因为我们构建的是小顶堆,那么最大值必定在叶子节点上。
-// if (heap[i] > max) {
-// max = heap[i];
-// maxIndex = i;
-// }
-// }
-// return maxIndex;
-// }
-//
-// private static int log2(int x) {
-// return (int) (Math.log(x) / Math.log(2));
-// }
-
- public static void main(String[] args) {
- if (false) {
- int k = 3;
- int[] nums = {4, 5, 8, 2};
- KthLargest kthLargest = new KthLargest(k, nums);
- System.out.println(kthLargest.add(3));
- System.out.println(kthLargest.add(5));
- System.out.println(kthLargest.add(10));
- System.out.println(kthLargest.add(9));
- System.out.println(kthLargest.add(4));
- }
- if (true) {
- int k = 1;
- int[] nums = {};
- KthLargest kthLargest = new KthLargest(k, nums);
- System.out.println(kthLargest.add(-3));
- System.out.println(kthLargest.add(-2));
- System.out.println(kthLargest.add(-4));
- System.out.println(kthLargest.add(0));
- System.out.println(kthLargest.add(4));
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0703/KthLargest2.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0703/KthLargest2.java
deleted file mode 100644
index e49da2a0c..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/no0703/KthLargest2.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.leetcode.no0703;
-
-import java.util.PriorityQueue;
-import java.util.Queue;
-
-class KthLargest2 {
-
- private Queue queue;
- private int k;
-
- public KthLargest2(int k, int[] nums) {
- queue = new PriorityQueue<>(k);
- this.k = k;
- // 初始化
- for (int num : nums) {
- add(num);
- }
- }
-
- public int add(int val) {
- if (queue.size() < k) {
- // 赋值
- queue.add(val);
- } else {
- if (val > queue.peek()) { // 大于最小值,才有资格加入其中。因为我们构建的 heap 是小顶堆,最上面存储的是第 k 大。
- queue.poll();
- queue.add(val);
- }
- }
-
- return queue.peek();
- }
-
- public static void main(String[] args) {
- if (true) {
- int k = 3;
- int[] nums = {4, 5, 8, 2};
- KthLargest2 kthLargest = new KthLargest2(k, nums);
- System.out.println(kthLargest.add(3));
- System.out.println(kthLargest.add(5));
- System.out.println(kthLargest.add(10));
- System.out.println(kthLargest.add(9));
- System.out.println(kthLargest.add(4));
- }
- if (false) {
- int k = 1;
- int[] nums = {};
- KthLargest2 kthLargest = new KthLargest2(k, nums);
- System.out.println(kthLargest.add(-3));
- System.out.println(kthLargest.add(-2));
- System.out.println(kthLargest.add(-4));
- System.out.println(kthLargest.add(0));
- System.out.println(kthLargest.add(4));
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/package-info.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/package-info.java
deleted file mode 100644
index 5247f0a3f..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/leetcode/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * leetcode 题目解答
- */
-package cn.iocoder.springboot.labs.lab09.leetcode;
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/linkedlist/HuiWenLinkedListTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/linkedlist/HuiWenLinkedListTest.java
deleted file mode 100644
index 4d412ac6c..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/linkedlist/HuiWenLinkedListTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.linkedlist;
-
-import java.util.Objects;
-
-/**
- * 判断单链表,是否为回文结构
- *
- * 核心的逻辑是,顺序遍历,同时反向前半段。
- *
- * 对应极客时间《06 | 链表(上):如何实现LRU缓存淘汰算法?》的思考题
- */
-public class HuiWenLinkedListTest {
-
- public static class Node {
-
- private Object data;
- private Node next;
-
- public Object getData() {
- return data;
- }
-
- public Node setData(Object data) {
- this.data = data;
- return this;
- }
-
- public Node getNext() {
- return next;
- }
-
- public Node setNext(Node next) {
- this.next = next;
- return this;
- }
- }
-
- public static void main(String[] args) {
- huiwen01();
- huiwen02();
- }
-
- private static void huiwen01() {
- Node node01 = new Node().setData("1");
- Node node02 = new Node().setData("2");
- Node node03 = new Node().setData("3");
- Node node04 = new Node().setData("4");
- Node node05 = new Node().setData("5");
- node01.next = node02;
- node02.next = node03;
- node03.next = node04;
- node04.next = node05;
-
- assert !isHuiWen(node01);
- }
-
- private static void huiwen02() {
- Node node01 = new Node().setData("1");
- Node node02 = new Node().setData("2");
- Node node03 = new Node().setData("3");
- Node node04 = new Node().setData("2");
- Node node05 = new Node().setData("1");
- node01.next = node02;
- node02.next = node03;
- node03.next = node04;
- node04.next = node05;
-
- assert isHuiWen(node01);
- }
-
- private static boolean isHuiWen(Node head) {
- // 如果不存在节点,或者是单节点,不然是回文
- if (head == null || head.next == null) {
- return true;
- }
-
- // 通过下面的逻辑,将链表的前半段,反转。
- Node slow = head;
- Node fast = head; // fast 的用途,是能够保证只反向前半段
- Node prev = null; // 前半段的反向
- while (fast != null && fast.next != null) {
- // fast 节点,按照自己的节奏,每次走 2 步。
- fast = fast.next.next;
- // 创建 next 节点,记录 slow 真正下一个节点
- Node next = slow.next;
- // 开始反转
- slow.next = prev;
- prev = slow;
- // 设置 slow 为真正的下一个节点
- slow = next;
- }
-
- // 如果 fast 非空,说明 head 是基数个节点。此时,slow 需要跳过最中间的节点
- if (fast != null) {
- slow = slow.next;
- }
-
- // 开始对比 slow 和 prev
- while (slow != null && prev != null) {
- if (!Objects.equals(slow.data, prev.data)) {
- return false;
- }
- slow = slow.next;
- prev = prev.next;
- }
-
- return true;
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/match/RabinKarp.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/match/RabinKarp.java
deleted file mode 100644
index 80b2a53c3..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/match/RabinKarp.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.match;
-
-/**
- * 参考 https://blog.csdn.net/jianke0503/article/details/79735928 文章
- *
- * 实现 Rabin Karp 字符串查找
- */
-public class RabinKarp {
-
- // power 指数
- // base 计算超过范围,则返回 base
- public static int find(String src, String target, int power, int base) {
- // 计算长度
- int n = src.length();
- int m = target.length();
-
- // target 的 hashcode
- int targetCode = 0;
- int mPower = 1;
- for (int i = 0; i < m; i++) {
- targetCode = (targetCode * power + target.charAt(i)) % base;
- mPower = (mPower * power) % base;
- }
-
- int srcCode = 0;
- for (int i = 0; i < n; i++) {
- srcCode = (srcCode * power + src.charAt(i)) % base;
- if (i < m - 1) { // 不等于的原因是,i 是从 0 开始的。
- continue;
- }
-
- if (i >= m) { // 此时,需要减掉头的
- srcCode = srcCode - ((src.charAt(i - m) * mPower) % base);
-
- // 避免减成负数
- if (srcCode < 0) {
- srcCode = srcCode + base;
- }
- }
-
- if (srcCode == targetCode) {
- if (src.substring(i - m + 1, i + 1).equals(target)) {
- return i - m + 1; // + 1 的原因是,i 是从 0 开始,而 m 是从 1 开始。
- }
- }
- }
-
- return -1;
- }
-
- public static void main(String[] args) {
- String src = "2359023141526739921";
- String target = "5902";
- System.out.println(find(src, target, 31, 100));
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipList.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipList.java
deleted file mode 100644
index 55cc79395..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipList.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.search;
-
-import java.util.Random;
-
-/**
- * 跳表的一种实现方法。
- * 跳表中存储的是正整数,并且存储的是不重复的。
- *
- * From https://github.com/wangzheng0822/algo/blob/master/java/17_skiplist/SkipList.java
- *
- * Author:ZHENG
- */
-@SuppressWarnings("Duplicates")
-public class SkipList {
-
- private static final int MAX_LEVEL = 16;
-
- private int levelCount = 1;
-
- private Node head = new Node(); // 带头链表
-
- private Random r = new Random();
-
- public Node find(int value) {
- Node p = head;
- for (int i = levelCount - 1; i >= 0; --i) {
- while (p.forwards[i] != null && p.forwards[i].data < value) {
- p = p.forwards[i];
- }
- }
-
- if (p.forwards[0] != null && p.forwards[0].data == value) {
- return p.forwards[0];
- } else {
- return null;
- }
- }
-
- public void insert(int value) {
- int level = randomLevel();
- Node newNode = new Node();
- newNode.data = value;
- newNode.maxLevel = level;
- Node[] update = new Node[level];
- for (int i = 0; i < level; ++i) {
- update[i] = head;
- }
-
- // record every level largest value which smaller than insert value in update[]
- Node p = head;
- for (int i = level - 1; i >= 0; --i) {
- while (p.forwards[i] != null && p.forwards[i].data < value) {
- p = p.forwards[i];
- }
- update[i] = p;// use update save node in search path
- }
-
- // in search path node next node become new node forwords(next)
- for (int i = 0; i < level; ++i) {
- newNode.forwards[i] = update[i].forwards[i];
- update[i].forwards[i] = newNode;
- }
-
- // update node hight
- if (levelCount < level) levelCount = level;
- }
-
- public void delete(int value) {
- Node[] update = new Node[levelCount];
- Node p = head;
- for (int i = levelCount - 1; i >= 0; --i) {
- while (p.forwards[i] != null && p.forwards[i].data < value) {
- p = p.forwards[i];
- }
- update[i] = p;
- }
-
- if (p.forwards[0] != null && p.forwards[0].data == value) {
- for (int i = levelCount - 1; i >= 0; --i) {
- if (update[i].forwards[i] != null && update[i].forwards[i].data == value) {
- update[i].forwards[i] = update[i].forwards[i].forwards[i];
- }
- }
- }
- }
-
- // 随机 level 次,如果是奇数层数 +1,防止伪随机
- private int randomLevel() {
- int level = 1;
- for (int i = 1; i < MAX_LEVEL; ++i) {
- if (r.nextInt() % 2 == 1) {
- level++;
- }
- }
-
- return level;
- }
-
- public void printAll() {
- Node p = head;
- while (p.forwards[0] != null) {
- System.out.print(p.forwards[0] + " ");
- p = p.forwards[0];
- }
- System.out.println();
- }
-
- public class Node {
- private int data = -1;
- private Node forwards[] = new Node[MAX_LEVEL];
- private int maxLevel = 0;
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipList2.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipList2.java
deleted file mode 100644
index 66bb1f7fe..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipList2.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.search;
-
-import java.util.Random;
-
-/**
- * 参考 {@link SkipList} ,自己实现一遍跳表。
- *
- * 通过 {@link Node} 的 forwards 数组实现,确实挺巧妙,代码量也非常精简。
- *
- * 目前,网络上找到的 Java 跳表实现,主要是 https://sylvanassun.github.io/2017/12/31/2017-12-31-skip_list/ 这种。实现方式略有差别。
- *
- * @author yunai
- */
-@SuppressWarnings("Duplicates")
-public class SkipList2 {
-
- private static final int MAX_LEVEL = 16;
-
- private Random random = new Random();
-
- /**
- * 总层级数
- */
- private int levelCount = 1;
-
- private Node head = new Node(null, MAX_LEVEL);
-
- public Node find(int value) {
- // 自最上层索引,开始往下查询
- Node p = head;
- for (int i = levelCount - 1; i >= 0; i--) {
- while (p.forwards[i] != null && p.forwards[i].data < value) { // 这里看的会有点绕,第一次 for ,跳转到对应 i 层,后续的,就是第 i 层的不断向下指向
- p = p.forwards[i];
- }
- }
-
- // 判断是否相等
- if (p.forwards[0] != null && p.forwards[0].data == value) {
- return p.forwards[0];
- }
- return null;
- }
-
- public void insert(int value) {
- // 创建 Node
- int maxLevel = randomLevel();
- Node node = new Node(value, maxLevel);
-
- // 寻找每一层的指向
- Node[] update = new Node[maxLevel];
-// for (int i = 0; i < maxLevel; i++) { // 初始化 node 在一层的指向 。不需要,因为下面的 for 循环,一定会给 update 数组赋值。
-// update[i] = head;
-// }
- Node p = head;
- for (int i = maxLevel - 1; i >= 0; i--) {
- while (p.forwards[i] != null && p.forwards[i].data < value) { // 这里看的会有点绕,第一次 for ,跳转到对应 i 层,后续的,就是第 i 层的不断向下指向
- p = p.forwards[i];
- }
- update[i] = p;
- }
-
- // 设置指向
- for (int i = 0; i < maxLevel; i++) {
- // 设置 node 在第 i 层,指向 update[i].forwards[i]
- node.forwards[i] = update[i].forwards[i];
- // 将 update[i].forwards[i] 赋值成 node 。
- // 这样,就形成了 update[i].forwards[i] = node ,并且 node..forwards[i] = 原 update[i].forwards[i] 。可能有点绕,可以调试下
- update[i].forwards[i] = node;
- }
-
- // 设置新的最高高度
- if (maxLevel > levelCount) {
- levelCount = maxLevel;
- }
- }
-
- public void delete(int value) {
- // 寻找一层对 value 应该 Node 的指向
- Node[] update = new Node[levelCount];
- Node p = head;
- for (int i = levelCount - 1; i >= 0; i--) {
- while (p.forwards[i] != null && p.forwards[i].data < value) { // 这里看的会有点绕,第一次 for ,跳转到对应 i 层,后续的,就是第 i 层的不断向下指向
- p = p.forwards[i];
- }
- update[i] = p;
- }
-
- // 如果找到指定节点
- if (p.forwards[0] != null && p.forwards[0].data == value) {
- for (int i = levelCount - 1; i >= 0; i--) {
- // 指定层,有符合 value 应该 Node 的指向,进行删除
- if (update[i].forwards[i] != null && update[i].forwards[i].data == value) {
- update[i].forwards[i] = update[i].forwards[i].forwards[i];
- }
- }
- }
- }
-
- private int randomLevel() {
- return random.nextInt(MAX_LEVEL - 1) + 1; // 一定建立索引,避免直接添加到第 0 层。不然可能会丢失。
-// return random.nextInt(MAX_LEVEL); // 因为我们是从 1 层开始计数,可以看 levelCount 参数
- }
-
-// // 随机 level 次,如果是奇数层数 +1,防止伪随机
-// private int randomLevel() {
-// int level = 1;
-// for (int i = 1; i < MAX_LEVEL; ++i) {
-// if (random.nextInt() % 2 == 1) {
-// level++;
-// }
-// }
-//
-// return level;
-// }
-
- /**
- * 节点
- *
- * 通过 {@link #forwards} 属性,记录在每一层的指向。
- *
- * 注意,相同 {@link #data} ,在多层,通过 {@link #forwards} 属性来实现,而不是指向。
- */
- public class Node {
-
- // TODO 芋艿,如果想实现类似 HashMap 的功能,可以把 data 改成 key + value 。
- /**
- * 数值
- */
- private Integer data;
-
- /**
- * 最高层级
- */
- private int maxLevel;
- /**
- * 对指定层级的指向
- */
- private Node[] forwards;
-
- public Node(Integer data, int maxLevel) {
- this.data = data;
- this.maxLevel = maxLevel;
- this.forwards = new Node[maxLevel];
-// this.forwards = new Node[MAX_LEVEL];
- }
-
- @Override
- public String toString() {
- return "Node{" +
- "data=" + data +
- ", maxLevel=" + maxLevel +
- '}';
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipListTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipListTest.java
deleted file mode 100644
index 7c873fdac..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SkipListTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.search;
-
-public class SkipListTest {
-
- public static void main2(String[] args) {
- SkipList skipList = new SkipList();
- skipList.insert(1);
- skipList.insert(2);
- skipList.insert(3);
- skipList.insert(1);
- skipList.insert(1);
- skipList.insert(1);
- skipList.delete(1);
- skipList.printAll();
- }
-
- public static void main(String[] args) {
- for (int i = 0; i < 10000; i++) {
- SkipList2 skipList = new SkipList2();
-// SkipList skipList = new SkipList();
- // 测试添加
- skipList.insert(2);
- skipList.insert(1);
-
- // 测试查询
- System.out.println(skipList.find(1) != null);
- assert skipList.find(1) != null;
- System.out.println(skipList.find(2) != null);
- assert skipList.find(2) != null;
- System.out.println(skipList.find(3) == null); // null
- assert skipList.find(3) == null;
-
- // 测试删除
- skipList.delete(1);
- System.out.println(skipList.find(1) == null); // null
- assert skipList.find(1) == null;
- System.out.println(skipList.find(2) != null);
- assert skipList.find(2) != null;
- }
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SquareTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SquareTest.java
deleted file mode 100644
index 107c3f061..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/search/SquareTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.search;
-
-/**
- * 使用二分查找,计算平方根。
- */
-public class SquareTest {
-
- public static void main(String[] args) {
- double result = sqrt(5, 0.00001D);
- System.out.println(result);
- }
-
- // precision 表示精度
- private static double sqrt(int number, double precision) {
- int rounds = 0; // 用于记录轮次,调试用途
- double low = 0;
- double high = number;
- while (low <= high) {
- double middle = low + ((high - low) / 2);
- double result = middle * middle;
- System.out.println(String.format("第 %d 轮,结果:%f", ++rounds, middle));
-
- double diff = number - result;
- if (0 <= diff && diff <= precision) {
- return middle;
- }
- if (result < number) {
- low = middle;
- } else if (result > number) {
- high = middle;
- } else {
- throw new IllegalStateException("不可能出现");
- }
- }
- throw new IllegalStateException("必然有结果,还能求不出平方根");
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/BucketSorterTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/BucketSorterTest.java
deleted file mode 100644
index 69cdc62b6..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/BucketSorterTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.sort;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Random;
-
-public class BucketSorterTest {
-
- public static void main(String[] args) {
- Random random = new Random();
- int[] array = new int[1000];
- for (int i = 0; i < 1000; i++) {
- array[i] = random.nextInt(10000);
- }
- bucketSort(array, 100);
- }
-
- // bucketSize - 指的是每个 bucket 的大小
- public static void bucketSort(int[] array, int bucketSize) {
- // 求最大最小值
- int max = Integer.MIN_VALUE;
- int min = Integer.MAX_VALUE;
- for (int value : array) {
- if (value > max) {
- max = value;
- }
- if (value < min) {
- min = value;
- }
- }
-
- // 创建桶
- int bucketCounts = (max - min) / bucketSize + 1; // 这里后面要优化下,向上取整。例如说 101 / 10 ,理论来说,应该是 11 个木桶
- ArrayList> buckets = new ArrayList<>(bucketCounts); // 使用 ArrayList ,方便实现,减少扩容等等麻烦
- for (int i = 0; i < bucketCounts; i++) {
- buckets.add(new ArrayList());
- }
-
- // 添加到桶中
- for (int value : array) {
- buckets.get((value - min) / bucketSize).add(value); // -min ,因为它是起点
- }
-
- // 排序每个桶
- for (ArrayList bucket : buckets) {
- Collections.sort(bucket); // 方便
- }
- System.out.println(buckets);
-
- // 打印结果
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/HeapSorterTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/HeapSorterTest.java
deleted file mode 100644
index 979e24815..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/HeapSorterTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.sort;
-
-import java.util.Arrays;
-
-/**
- * 堆排序
- */
-public class HeapSorterTest {
-
- public static void main(String[] args) {
- if (false) {
- HeapSorter heapSorter = new HeapSorter(10);
- heapSorter.insert(10);
- heapSorter.insert(3);
- heapSorter.insert(5);
- heapSorter.insert(1);
- heapSorter.insert(2);
- heapSorter.insert(20);
- System.out.println(Arrays.toString(heapSorter.heap));
-
- heapSorter.remove(2);
- System.out.println(Arrays.toString(heapSorter.heap));
- }
-
- if (true) {
- int[] array = {0, 10, 3, 5, 1, 2, 20};
- HeapSorter heapSorter = HeapSorter.create(array, array.length - 1);
-// System.out.println(Arrays.toString(heapSorter.heap));
- heapSorter.sort();
- }
- }
-
- public static class HeapSorter {
-
- /**
- * 堆
- */
- private int[] heap;
- /**
- * 容量
- */
- private int capacity;
- /**
- * 元素数量
- */
- private int count;
-
- public HeapSorter(int[] heap, int count) {
- this.capacity = heap.length;
- this.heap = heap;
- this.count = count;
- }
-
- public HeapSorter(int capacity) {
- this.capacity = capacity;
- this.heap = new int[capacity + 1]; // 因为 0 被占用了
- count = 0;
- }
-
- public void insert(int value) {
- if (count >= capacity) {
- throw new IllegalStateException("容量已满");
- }
- ++count;
- heap[count] = value;
-
- // 自下向上堆化,如果大于父节点
- int index = count;
- while (index >> 1 > 0 && heap[index] > heap[index >> 1]) {
- swap(index, index >> 1);
- index = index >> 1;
- }
- }
-
- public int remove(int pos) {
- if (count == 0) {
- throw new IllegalStateException("不存在最大值");
- }
- int tmp = heap[pos];
- heap[pos] = heap[count];
- heap[count] = 0; // 置空,其实非必要。就是为了好看
- count--;
-
- heapify(heap, count, pos);
- return tmp;
- }
-
- /**
- * 排序
- */
- public void sort() {
- while (count > 1) {
- System.out.println(remove(1));
- }
- }
-
- private void swap(int i, int j) {
- swap(heap, i, j);
- }
-
- public static HeapSorter create(int[] heap, int count) {
- for (int i = count / 2; i >= 1; i--) {
- heapify(heap, count, i);
- }
- return new HeapSorter(heap, count);
- }
-
- private static void heapify(int[] heap, int count, int pos) {
- // 自伤向下,
- while (true) {
- int maxPos = pos;
- if (pos * 2 <= count && heap[pos] < heap[pos * 2]) {
- maxPos = pos * 2;
- }
- if (pos * 2 + 1 <= count && heap[maxPos] < heap[pos * 2 + 1]) {
- maxPos = pos * 2 + 1;
- }
- // 判断相等,说明没变化
- if (maxPos == pos) {
- return;
- }
- swap(heap, pos, maxPos);
- }
- }
-
- private static void swap(int[] heap, int i, int j) {
- int tmp = heap[i];
- heap[i] = heap[j];
- heap[j] = tmp;
- }
-
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/MergeSorterTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/MergeSorterTest.java
deleted file mode 100644
index e3f35ae0b..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/MergeSorterTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.sort;
-
-import java.util.Arrays;
-
-/**
- * 合并排序
- */
-public class MergeSorterTest {
-
- public static void main(String[] args) {
- {
- int[] array = new int[]{5, 4, 2, 3, 1, 2, 5, 2, 6};
- mergeSort(array);
- }
- }
-
- private static void mergeSort(int[] array) {
- int[] tmpArray = new int[array.length];
- mergeSort(array, tmpArray, 0, array.length - 1);
-
- System.out.println(Arrays.toString(array));
- }
-
- private static void mergeSort(int[] array, int[] tmpArray, int low, int high) {
- // 递归结束,如果 low 和 high 是相同的
- if (low >= high) {
- return;
- }
-
- // 折半,进行分解
- int middle = low + (high - low >> 1); // >> 1 等价于 / 2
- mergeSort(array, tmpArray, low, middle);
- mergeSort(array, tmpArray, middle + 1, high);
-
- // 合并
- merge(array, tmpArray, low, middle, high);
- }
-
- private static void merge(int[] array, int[] tmpArray, int low, int middle, int high) {
- // 比较排序
- int highStart = middle + 1;
- int lowStart = low; // 需要赋值出来,是为了避免 low 被修改
- int tmpArrayIndex = low; // tmpArray 的 index
- while (lowStart <= middle && highStart <= high) { // 能够这么操作的原因是,每次递归,最终的结果都是有序的。所以就一直可以有序了。
- if (array[lowStart] > array[highStart]) {
- tmpArray[tmpArrayIndex++] = array[highStart++];
- } else {
- tmpArray[tmpArrayIndex++] = array[lowStart++];
- }
- }
-
- // 将上述未赋值到 tmpArray 的,继续赋值进去
- while (lowStart <= middle) {
- tmpArray[tmpArrayIndex++] = array[lowStart++];
- }
- while (highStart <= high) {
- tmpArray[tmpArrayIndex++] = array[highStart++];
- }
-
- // 将排序后的 tmpArrayIndex 赋值到 array 中,从 low 开始到 high 部分。
- System.arraycopy(tmpArray, low, array, low, high - low + 1);
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/QuickSorterTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/QuickSorterTest.java
deleted file mode 100644
index 1aa68b6f3..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/QuickSorterTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.sort;
-
-import java.util.Arrays;
-
-/**
- * 快速排序
- */
-public class QuickSorterTest {
-
- public static void main(String[] args) {
- {
- int[] array = new int[]{5, 4, 2, 3, 1, 2, 5, 2, 6};
-// int[] array = new int[]{6, 11, 8};
- quickSort(array);
- }
- }
-
- private static void quickSort(int[] array) {
- quickSort(array, 0, array.length - 1);
-
- System.out.println(Arrays.toString(array));
- }
-
- private static void quickSort(int[] array, int low, int high) {
- if (low >= high) {
- return;
- }
-
- // 寻找 partition 位置
-// int partitionIndex = partition(array, low, high);
- int partitionIndex = partition02(array, low, high);
-
- // 递归排序
- quickSort(array, low, partitionIndex - 1);
- quickSort(array, partitionIndex + 1, high);
- }
-
- @SuppressWarnings("Duplicates")
- public static int partition(int[] array, int low, int high) {
- int partitionValue = array[high]; // 首先,选择 high 位置的值,作为 partitionValue 值
- int pos = low;
- // 遍历 array 的 low 到 high 区间,将小于 partitionValue 值的部分,顺序放到 [0, pos) 范围内。最终,pos 我们会放 partitionValue 值。
- for (int i = low; i < high; i++) {
- if (array[i] < partitionValue) {
- // 进行交换
- swap(array, i, pos);
- // pos + 1 ,用于下一个使用
- pos++;
- }
- }
-
- // 将 pos 我们会放 partitionValue 值。
- swap(array, pos, high);
-
- // 返回 partitionValue 所在位置
- return pos;
- }
-
-
-
- private static void swap(int[] array, int pos1, int pos2) {
- if (pos1 == pos2) {
- return;
- }
- int tmp = array[pos1];
- array[pos1] = array[pos2];
- array[pos2] = tmp;
- }
-
- // partition 的逻辑,基于 swap ,需要 3 次操作
- // partition02 的逻辑,基于赋值来做,只需要 1 次操作。相比来说,性能更好。
- // 当然,第一次看 partition02 的逻辑,可能会有点懵逼。大体的理解是,low 和 high 之间,被不断夹紧,把比 pivot 大的放到右侧,比 pivot 小的放到左侧。
- // 本质可以理解成:
- // 1. pivot = arr[low]; =》 A -> B
- // 2. arr[low] = arr[high]; =》 B -> C
- // 3. arr[high] = arr[low]; =》 C -> D
- // 4. 重复循环,我们最终找到真正的 D ,将 原 B ,也就是 A ,复制上去。
- private static int partition02(int[] arr, int low, int high) {
- int pivot = arr[low]; //枢轴记录
- // 循环,达到 arr[low] 左边是比它小,右边是比它大。
- while (low < high) { // 实际上,最终 break 的条件是,low 和 high 相等。具体可以看里面的两个 while
- while (low < high && arr[high] >= pivot) --high; // 因为 high 原来就在右侧,所以不需要移动
- arr[low] = arr[high]; // 交换比枢轴小的记录到左端
-
- while (low < high && arr[low] <= pivot) ++low; // 因为 low 原来就在左侧,所以不需要移动
- arr[high] = arr[low]; // 交换比枢轴小的记录到右端
- }
- //扫描完成,枢轴到位
- arr[low] = pivot;
- //返回的是枢轴的位置
- return low;
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/RadixSorterTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/RadixSorterTest.java
deleted file mode 100644
index 8fcdad729..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/RadixSorterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.sort;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-/**
- * 基数排序
- *
- * 每个位的排序,通过桶排序实现,从而实现 k * O(n) 的复杂度
- */
-public class RadixSorterTest {
-
- public static void main(String[] args) {
- int[] array = new int[]{
- 23,
- 50,
- 100,
- 1,
- 10,
- 21,
- 50,
- };
-
- radixSort(array);
- }
-
- private static void radixSort(int[] array) {
- int digits = getMaxDigits(array);
- for (int digit = 0; digit < digits; digit++) {
- radixSort(array, digit);
- }
-
- System.out.println(Arrays.toString(array));
- }
-
- private static void radixSort(int[] array, int digit) {
- // 用于后面,获得第 digit 位
- int base = (int) Math.pow(10, digit);
-
- // 创建桶
- int bucketCounts = 10;
- ArrayList> buckets = new ArrayList<>(bucketCounts);
- for (int i = 0; i < bucketCounts; i++) {
- buckets.add(new ArrayList<>());
- }
-
- // 添加到桶中
- for (int value : array) {
- int bucketIndex = value / base % bucketCounts;
- buckets.get(bucketIndex).add(value);
- }
-
- // 顺序输出,自然有序
- int index = 0;
- for (ArrayList bucket : buckets) {
- for (Integer value : bucket) {
- array[index++] = value;
- }
- }
- }
-
- private static int getMaxDigits(int[] array) {
- int max = Integer.MIN_VALUE;
- for (int value : array) {
- if (value > max) {
- max = value;
- }
- }
- int digits = 0;
- while (max > 0) {
- digits++;
- max = max / 10;
- }
- return digits;
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/TheFirstBigKTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/TheFirstBigKTest.java
deleted file mode 100644
index 698cb1584..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/sort/TheFirstBigKTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.sort;
-
-import java.util.Arrays;
-
-/**
- * 基于快速排序的方式,实现第 k 大的数
- */
-public class TheFirstBigKTest {
-
- public static void main(String[] args) {
- {
- int[] array = new int[]{5, 4, 2, 3, 1, 2, 5, 2, 6};
-// int[] array = new int[]{6, 11, 8};
-// quickSort(array, 1);
-// quickSort(array, 2);
-// quickSort(array, 3);
-// quickSort(array, 4);
- quickSort(array, 5);
- }
- }
-
- private static void quickSort(int[] array, int k) {
- if (k > array.length) {
- throw new IllegalStateException("k 不能大于最大数组");
- }
- quickSort(array, k - 1, 0, array.length - 1);
-
- System.out.println(Arrays.toString(array));
- System.out.println("答案 k :" + array[k - 1]);
- }
-
- private static void quickSort(int[] array, int k, int low, int high) {
- if (low >= high) {
- return;
- }
-
- int partition = partition(array, low, high);
- if (partition == k) {
- return;
- }
-
- if (partition < k) {
- quickSort(array, k, partition + 1, high);
- } else {
- quickSort(array, k, low, partition - 1);
- }
- }
-
- @SuppressWarnings("Duplicates")
- private static int partition(int[] array, int low, int high) {
- int partitionValue = array[high]; // 首先,选择 high 位置的值,作为 partitionValue 值
- int pos = low;
- // 遍历 array 的 low 到 high 区间,将小于 partitionValue 值的部分,顺序放到 [0, pos) 范围内。最终,pos 我们会放 partitionValue 值。
- for (int i = low; i < high; i++) {
- if (array[i] < partitionValue) {
- // 进行交换
- swap(array, i, pos);
- // pos + 1 ,用于下一个使用
- pos++;
- }
- }
-
- // 将 pos 我们会放 partitionValue 值。
- swap(array, pos, high);
-
- // 返回 partitionValue 所在位置
- return pos;
- }
-
- private static void swap(int[] array, int pos1, int pos2) {
- if (pos1 == pos2) {
- return;
- }
- int tmp = array[pos1];
- array[pos1] = array[pos2];
- array[pos2] = tmp;
- }
-
-}
diff --git a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/tree/MySQLBTreePlusTest.java b/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/tree/MySQLBTreePlusTest.java
deleted file mode 100644
index 5e440f0c6..000000000
--- a/lab-09/src/main/java/cn/iocoder/springboot/labs/lab09/tree/MySQLBTreePlusTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package cn.iocoder.springboot.labs.lab09.tree;
-
-/**
- * MySQL B+Tree
- */
-public class MySQLBTreePlusTest {
-
- /**
- * 非叶子节点
- */
- public static class Node {
-
- /**
- * 5 叉树
- */
- public static int m = 5;
-
- /**
- * 键值的数组
- *
- * m - 1 的原因是,keywords 代表的是区间。
- *
- * children[0] 的范围是 [ -无穷, keywords[0] ]
- * children[1] 的泛微是
- */
- private int[] keywords = new int[m - 1];
-
- /**
- * 保存子节点的指针
- */
- private Node[] children = new Node[m];
-
- }
-
- /**
- * 叶子节点
- */
- public static class LeafNode {
-
- /**
- * 假设每个叶子节点存储三个数据行的键值和数据地址信息
- */
- public static int k = 3;
-
- /**
- * 数据行的键值
- *
- * 不同于 {@link Node#keywords} ,这里表示的是具体值
- */
- private int[] keywords = new int[k];
- /**
- * 数据航的地址值
- */
- private int[] dataAddresses = new int[k];
-
- /**
- * 前置的叶子节点,用于区间检索
- */
- private LeafNode prev;
- /**
- * 后置的叶子节点,用于区间检索
- */
- private LeafNode next;
-
- }
-
-}
diff --git "a/lab-09/\345\207\206\345\244\207\345\210\240\351\231\244" "b/lab-09/\345\207\206\345\244\207\345\210\240\351\231\244"
deleted file mode 100644
index e69de29bb..000000000
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/Controller.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/Controller.java
deleted file mode 100644
index 30fafc3f2..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/Controller.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package cn.iocoder.springboot.labs.lab10;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class Controller {
-
- @GetMapping("/hello")
- public String hello() {
-// System.out.println(Thread.currentThread().getName());
- return "world";
- }
-
- @GetMapping("/sleep")
- public String sleep() throws InterruptedException {
- Thread.sleep(100L);
-// System.out.println(Thread.currentThread().getName());
- return "world";
- }
-
-}
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/TestListener.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/TestListener.java
deleted file mode 100644
index 6b1a96483..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/TestListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package cn.iocoder.springboot.labs.lab10;
-
-import org.springframework.context.ApplicationEvent;
-import org.springframework.context.ApplicationListener;
-import org.springframework.stereotype.Component;
-
-@Component
-public class TestListener implements ApplicationListener {
-
- @Override
- public void onApplicationEvent(ApplicationEvent event) {
- System.out.println("事件:" + event);
- }
-
-}
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/UserHealthIndicator.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/UserHealthIndicator.java
deleted file mode 100644
index 21fd1cada..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/UserHealthIndicator.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cn.iocoder.springboot.labs.lab10;
-
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.HealthIndicator;
-
-//@Component
-public class UserHealthIndicator implements HealthIndicator {
-
- /**
- * user监控 访问: http://localhost:8088/health
- *
- * @return 自定义Health监控
- */
- @Override
- public Health health() {
- return new Health.Builder().withDetail("usercount", 10) //自定义监控内容
- .withDetail("userstatus", "up").down().build();
- }
-
-}
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleConfiguration.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleConfiguration.java
deleted file mode 100644
index bf0162693..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleConfiguration.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package cn.iocoder.springboot.labs.lab10.lifecycle;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class ServerLifeCycleConfiguration {
-
- @Bean
- public ServerLifeCycleHealthIndicator serverLifeCycleHealthIndicator() {
- return new ServerLifeCycleHealthIndicator();
- }
-
- @Bean
- public ServerLifeCycleListener serverLifeCycleListener() {
- return new ServerLifeCycleListener(this.serverLifeCycleHealthIndicator());
- }
-
-}
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleConfigurationProperties.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleConfigurationProperties.java
deleted file mode 100644
index 56f23e947..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleConfigurationProperties.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package cn.iocoder.springboot.labs.lab10.lifecycle;
-
-// TODO sleep 时长的配置
-public class ServerLifeCycleConfigurationProperties {
-
-
-
-}
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleHealthIndicator.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleHealthIndicator.java
deleted file mode 100644
index 4176daaa4..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleHealthIndicator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package cn.iocoder.springboot.labs.lab10.lifecycle;
-
-import org.springframework.boot.actuate.health.AbstractHealthIndicator;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.Status;
-
-public class ServerLifeCycleHealthIndicator extends AbstractHealthIndicator {
-
- /**
- * 服务状态
- *
- * 启动阶段:
- * 1. 项目初始启动时,状态为 OUT_OF_SERVICE 不提供服务。
- * 2. 服务启动完成(ApplicationReadyEvent)时,状态为 UP 启动。
- * 3. 服务启动失败(ApplicationFailedEvent)时,状态 DOWN 关闭。
- *
- * 关闭阶段:
- * 1. 服务开始关闭(ContextClosedEvent)时,状态为 OUT_OF_SERVICE 不提供服务。
- * 2. 因为服务关闭完成,不存在事件,所以暂时不处理。
- *
- * 具体的状态变更,通过
- */
- private volatile Status status = Status.OUT_OF_SERVICE;
-
- @Override
- protected void doHealthCheck(Health.Builder builder) {
- builder.status(status);
- }
-
- public void up() {
- this.status = Status.UP;
- }
-
- public void down() {
- this.status = Status.DOWN;
- }
-
- public void outOfService() {
- this.status = Status.OUT_OF_SERVICE;
- }
-
- public Status status() {
- return this.status;
- }
-
-}
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleListener.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleListener.java
deleted file mode 100644
index f8228e227..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/ServerLifeCycleListener.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package cn.iocoder.springboot.labs.lab10.lifecycle;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.context.event.ApplicationFailedEvent;
-import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.ApplicationEvent;
-import org.springframework.context.ApplicationListener;
-import org.springframework.context.event.ContextClosedEvent;
-
-public class ServerLifeCycleListener implements ApplicationListener {
-
- private Logger logger = LoggerFactory.getLogger(getClass());
-
- private ServerLifeCycleHealthIndicator healthIndicator;
-
- public ServerLifeCycleListener(ServerLifeCycleHealthIndicator healthIndicator) {
- this.healthIndicator = healthIndicator;
- }
-
- @Override
- public void onApplicationEvent(ApplicationEvent event) {
- if (event instanceof ApplicationReadyEvent) {
- this.handleApplicationReadyEvent((ApplicationReadyEvent) event);
- } else if (event instanceof ApplicationFailedEvent) {
- this.handleApplicationFailedEvent((ApplicationFailedEvent) event);
- } else if (event instanceof ContextClosedEvent) {
- this.handleContextClosedEvent((ContextClosedEvent) event);
- }
- }
-
- @SuppressWarnings("unused")
- private void handleApplicationReadyEvent(ApplicationReadyEvent event) {
- healthIndicator.up();
- }
-
- @SuppressWarnings("unused")
- private void handleApplicationFailedEvent(ApplicationFailedEvent event) {
- healthIndicator.down();
- }
-
- @SuppressWarnings("unused")
- private void handleContextClosedEvent(ContextClosedEvent event) {
- // 标记不提供服务
- healthIndicator.outOfService();
-
- // sleep 等待负载均衡完成健康检查
- for (int i = 0; i < 20; i++) { // TODO 20 需要配置
- logger.info("[handleContextClosedEvent][优雅关闭,第 {} sleep 等待负载均衡完成健康检查]", i);
- try {
- Thread.sleep(1000L);
- } catch (InterruptedException ignore) {
- }
- }
- }
-
-}
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/StatusController.java b/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/StatusController.java
deleted file mode 100644
index d2d16b7c2..000000000
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/lifecycle/StatusController.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package cn.iocoder.springboot.labs.lab10.lifecycle;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.actuate.health.Status;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController // TODO rest 没生效,得排查下。
-@RequestMapping("/") // TODO 可配置
-public class StatusController {
-
- @Autowired
- private ServerLifeCycleHealthIndicator serverLifeCycleHealthIndicator;
-
- @RequestMapping("/status")
- public ResponseEntity status() {
- Status status = serverLifeCycleHealthIndicator.status();
- // 成功
- if (Status.UP == status) {
- return new ResponseEntity<>(status.getDescription(), HttpStatus.OK);
- }
- // 失败
- return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(status.getDescription());
- }
-
-}
diff --git a/lab-10/src/main/resources/application.properties b/lab-10/src/main/resources/application.properties
deleted file mode 100644
index 0eb258cba..000000000
--- a/lab-10/src/main/resources/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-management.endpoint.health.show-details=always
-server.port=9080
diff --git "a/lab-10/\345\207\206\345\244\207\345\210\240\351\231\244" "b/lab-10/\345\207\206\345\244\207\345\210\240\351\231\244"
deleted file mode 100644
index e69de29bb..000000000
diff --git a/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/pom.xml b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/pom.xml
new file mode 100644
index 000000000..2d50408c4
--- /dev/null
+++ b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/pom.xml
@@ -0,0 +1,60 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.3.RELEASE
+
+
+ 4.0.0
+
+ lab-07-spring-data-redis-unit-test
+
+
+
+
+
+ org.redisson
+ redisson-spring-boot-starter
+ 3.11.3
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.61
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+ commons-io
+ commons-io
+ 2.6
+
+
+
+
+ it.ozimov
+ embedded-redis
+ 0.7.2
+ test
+
+
+
+
+
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
diff --git a/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
new file mode 100644
index 000000000..a78920725
--- /dev/null
+++ b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
@@ -0,0 +1,39 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.RedisSerializer;
+
+@Configuration
+public class RedisConfiguration {
+
+ @Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
+ // 创建 RedisTemplate 对象
+ RedisTemplate template = new RedisTemplate<>();
+
+ // 设置开启事务支持
+ template.setEnableTransactionSupport(true);
+
+ // 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。
+ template.setConnectionFactory(factory);
+
+ // 使用 String 序列化方式,序列化 KEY 。
+ template.setKeySerializer(RedisSerializer.string());
+
+ // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。
+ template.setValueSerializer(RedisSerializer.json());
+ return template;
+ }
+
+ // Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+// ObjectMapper objectMapper = new ObjectMapper();// <1>
+//// objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+//// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+//
+// jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+// template.setValueSerializer(jackson2JsonRedisSerializer);
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/resources/application.yml
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/resources/application.yml
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/redisson.yml b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/resources/redisson.yml
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/redisson.yml
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/resources/redisson.yml
diff --git a/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
new file mode 100644
index 000000000..98f573d2f
--- /dev/null
+++ b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
@@ -0,0 +1,47 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis;
+
+import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.config.TestRedisConfiguration;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.dao.DataAccessException;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = TestRedisConfiguration.class)
+public class Test01 {
+
+ @Autowired
+ private StringRedisTemplate stringRedisTemplate;
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+// @Autowired
+// private RedisServer server;
+
+ @Test
+ public void test01() {
+ // 写入
+ stringRedisTemplate.opsForValue().set("yunai", "shuai");
+ // 读取
+ String value = stringRedisTemplate.opsForValue().get("yunai");
+ Assert.assertEquals("值不匹配", "shuai", value);
+
+ // 测试重启后读取
+ redisTemplate.execute(new RedisCallback() {
+ @Override
+ public Object doInRedis(RedisConnection connection) throws DataAccessException {
+ connection.flushDb();
+ return "";
+ }
+ });
+ }
+
+}
diff --git a/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/TestRedisConfiguration.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/TestRedisConfiguration.java
new file mode 100644
index 000000000..32086eef1
--- /dev/null
+++ b/lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/TestRedisConfiguration.java
@@ -0,0 +1,34 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.config;
+
+import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
+import org.springframework.boot.test.context.TestConfiguration;
+import redis.embedded.RedisServer;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+@TestConfiguration
+public class TestRedisConfiguration {
+
+ private RedisServer redisServer;
+
+ public TestRedisConfiguration(RedisProperties redisProperties) {
+ this.redisServer = new RedisServer(redisProperties.getPort());
+ }
+
+// @Bean
+// public RedisServer redisServer() {
+// return redisServer;
+// }
+
+ @PostConstruct
+ public void postConstruct() {
+ redisServer.start();
+ }
+
+ @PreDestroy
+ public void preDestroy() {
+ redisServer.stop();
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/pom.xml b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/pom.xml
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/pom.xml
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/pom.xml
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/application.yml b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/application.yml
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/application.yml
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/application.yml
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet.lua b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet.lua
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet.lua
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet.lua
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet2.lua b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet2.lua
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet2.lua
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/compareAndSet2.lua
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/test.lua b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/test.lua
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/test.lua
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/resources/lua/test.lua
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/pom.xml b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/pom.xml
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/pom.xml
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/pom.xml
diff --git a/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
new file mode 100644
index 000000000..ac6c60ce3
--- /dev/null
+++ b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
@@ -0,0 +1,8 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+//@EnableTransactionManagement
+public class Application {
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
diff --git a/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
new file mode 100644
index 000000000..cea22f21a
--- /dev/null
+++ b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.util;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * JSON 工具类
+ */
+public class JSONUtil {
+
+ public static T parseObject(String text, Class clazz) {
+ return JSON.parseObject(text, clazz);
+ }
+
+ public static String toJSONString(Object javaObject) {
+ return JSON.toJSONString(javaObject);
+ }
+
+ public static byte[] toJSONBytes(Object javaObject) {
+ return JSON.toJSONBytes(javaObject);
+ }
+
+}
diff --git a/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml
new file mode 100644
index 000000000..742b2ad31
--- /dev/null
+++ b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+spring:
+ # 对应 RedisProperties 类
+ redis:
+ host: 127.0.0.1
+ port: 6379
+# password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码!
+ database: 0 # Redis 数据库号,默认为 0 。
+ timeout: 0 # Redis 连接超时时间,单位:毫秒。
+ # 对应 RedissonProperties 类
+# redisson:
+# config: classpath:redisson.yml # 具体的每个配置项,见 org.redisson.config.Config 类。
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet.lua b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet.lua
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet.lua
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet.lua
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet2.lua b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet2.lua
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet2.lua
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet2.lua
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/test.lua b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/test.lua
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/test.lua
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/test.lua
diff --git "a/lab-08/\345\207\206\345\244\207\345\210\240\351\231\244" b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/redisson.yml
similarity index 100%
rename from "lab-08/\345\207\206\345\244\207\345\210\240\351\231\244"
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/resources/redisson.yml
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/LockTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/LockTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/LockTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/LockTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/RateLimiterTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/RateLimiterTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/RateLimiterTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/RateLimiterTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java b/lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java
similarity index 100%
rename from lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java
rename to lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java
diff --git a/lab-11/pom.xml b/lab-11-spring-data-redis/pom.xml
similarity index 85%
rename from lab-11/pom.xml
rename to lab-11-spring-data-redis/pom.xml
index 987223ac9..4eb256c83 100644
--- a/lab-11/pom.xml
+++ b/lab-11-spring-data-redis/pom.xml
@@ -9,11 +9,12 @@
4.0.0
- lab-11
+ lab-11-spring-data-redis
pom
lab-07-spring-data-redis-with-jedis
lab-07-spring-data-redis-with-redisson
+ lab-07-spring-data-redis-unit-test
diff --git "a/lab-11/\343\200\212\350\212\213\351\201\223 Spring Boot Redis \345\205\245\351\227\250\343\200\213.md" "b/lab-11-spring-data-redis/\343\200\212\350\212\213\351\201\223 Spring Boot Redis \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-11/\343\200\212\350\212\213\351\201\223 Spring Boot Redis \345\205\245\351\227\250\343\200\213.md"
rename to "lab-11-spring-data-redis/\343\200\212\350\212\213\351\201\223 Spring Boot Redis \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-12/lab-12-mybatis-annotation/pom.xml b/lab-12-mybatis/lab-12-mybatis-annotation/pom.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/pom.xml
rename to lab-12-mybatis/lab-12-mybatis-annotation/pom.xml
diff --git a/lab-12/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java b/lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
diff --git a/lab-12/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java b/lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
diff --git a/lab-12/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java b/lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
diff --git a/lab-12/lab-12-mybatis-annotation/src/main/resources/application.yaml b/lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/application.yaml
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/main/resources/application.yaml
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/application.yaml
diff --git a/lab-12/lab-12-mybatis-annotation/src/main/resources/mapper/UserMapper.xml b/lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/mapper/UserMapper.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/main/resources/mapper/UserMapper.xml
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/mapper/UserMapper.xml
diff --git a/lab-12/lab-12-mybatis-annotation/src/main/resources/mybatis-config.xml b/lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/mybatis-config.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/main/resources/mybatis-config.xml
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/mybatis-config.xml
diff --git a/lab-12/lab-12-mybatis-annotation/src/main/resources/sql/users.sql b/lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/sql/users.sql
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/main/resources/sql/users.sql
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/sql/users.sql
diff --git a/lab-12/lab-12-mybatis-annotation/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java b/lab-12-mybatis/lab-12-mybatis-annotation/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
similarity index 100%
rename from lab-12/lab-12-mybatis-annotation/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
rename to lab-12-mybatis/lab-12-mybatis-annotation/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
diff --git a/lab-12/lab-12-mybatis-plus/pom.xml b/lab-12-mybatis/lab-12-mybatis-plus/pom.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/pom.xml
rename to lab-12-mybatis/lab-12-mybatis-plus/pom.xml
diff --git a/lab-12/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java b/lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
rename to lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
diff --git a/lab-12/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java b/lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
rename to lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
diff --git a/lab-12/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java b/lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
rename to lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
diff --git a/lab-12/lab-12-mybatis-plus/src/main/resources/application.yaml b/lab-12-mybatis/lab-12-mybatis-plus/src/main/resources/application.yaml
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/src/main/resources/application.yaml
rename to lab-12-mybatis/lab-12-mybatis-plus/src/main/resources/application.yaml
diff --git a/lab-12/lab-12-mybatis-plus/src/main/resources/mapper/UserMapper.xml b/lab-12-mybatis/lab-12-mybatis-plus/src/main/resources/mapper/UserMapper.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/src/main/resources/mapper/UserMapper.xml
rename to lab-12-mybatis/lab-12-mybatis-plus/src/main/resources/mapper/UserMapper.xml
diff --git a/lab-12/lab-12-mybatis-plus/src/main/resources/sql/users.sql b/lab-12-mybatis/lab-12-mybatis-plus/src/main/resources/sql/users.sql
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/src/main/resources/sql/users.sql
rename to lab-12-mybatis/lab-12-mybatis-plus/src/main/resources/sql/users.sql
diff --git a/lab-12/lab-12-mybatis-plus/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java b/lab-12-mybatis/lab-12-mybatis-plus/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
similarity index 100%
rename from lab-12/lab-12-mybatis-plus/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
rename to lab-12-mybatis/lab-12-mybatis-plus/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
diff --git a/lab-12/lab-12-mybatis-tk/pom.xml b/lab-12-mybatis/lab-12-mybatis-tk/pom.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/pom.xml
rename to lab-12-mybatis/lab-12-mybatis-tk/pom.xml
diff --git a/lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java b/lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
diff --git a/lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java b/lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
diff --git a/lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java b/lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
diff --git a/lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/util/BaseMapper.java b/lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/util/BaseMapper.java
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/util/BaseMapper.java
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/util/BaseMapper.java
diff --git a/lab-12/lab-12-mybatis-tk/src/main/resources/application.yaml b/lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/application.yaml
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/resources/application.yaml
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/application.yaml
diff --git a/lab-12/lab-12-mybatis-tk/src/main/resources/mapper/UserMapper.xml b/lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/mapper/UserMapper.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/resources/mapper/UserMapper.xml
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/mapper/UserMapper.xml
diff --git a/lab-12/lab-12-mybatis-tk/src/main/resources/mybatis-config.xml b/lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/mybatis-config.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/resources/mybatis-config.xml
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/mybatis-config.xml
diff --git a/lab-12/lab-12-mybatis-tk/src/main/resources/sql/users.sql b/lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/sql/users.sql
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/main/resources/sql/users.sql
rename to lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/sql/users.sql
diff --git a/lab-12/lab-12-mybatis-tk/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java b/lab-12-mybatis/lab-12-mybatis-tk/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
similarity index 100%
rename from lab-12/lab-12-mybatis-tk/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
rename to lab-12-mybatis/lab-12-mybatis-tk/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
diff --git a/lab-12/lab-12-mybatis-xml/pom.xml b/lab-12-mybatis/lab-12-mybatis-xml/pom.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/pom.xml
rename to lab-12-mybatis/lab-12-mybatis-xml/pom.xml
diff --git a/lab-12/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java b/lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
rename to lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
diff --git a/lab-12/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java b/lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
rename to lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
diff --git a/lab-12/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java b/lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
rename to lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
diff --git a/lab-12/lab-12-mybatis-xml/src/main/resources/application.yaml b/lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/application.yaml
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/main/resources/application.yaml
rename to lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/application.yaml
diff --git a/lab-12/lab-12-mybatis-xml/src/main/resources/mapper/UserMapper.xml b/lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/mapper/UserMapper.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/main/resources/mapper/UserMapper.xml
rename to lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/mapper/UserMapper.xml
diff --git a/lab-12/lab-12-mybatis-xml/src/main/resources/mybatis-config.xml b/lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/mybatis-config.xml
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/main/resources/mybatis-config.xml
rename to lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/mybatis-config.xml
diff --git a/lab-12/lab-12-mybatis-xml/src/main/resources/sql/users.sql b/lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/sql/users.sql
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/main/resources/sql/users.sql
rename to lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/sql/users.sql
diff --git a/lab-12/lab-12-mybatis-xml/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java b/lab-12-mybatis/lab-12-mybatis-xml/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
similarity index 100%
rename from lab-12/lab-12-mybatis-xml/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
rename to lab-12-mybatis/lab-12-mybatis-xml/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
diff --git a/lab-12/pom.xml b/lab-12-mybatis/pom.xml
similarity index 94%
rename from lab-12/pom.xml
rename to lab-12-mybatis/pom.xml
index 382fb2ff7..abc9330d2 100644
--- a/lab-12/pom.xml
+++ b/lab-12-mybatis/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-12
+ lab-12-mybatis
pom
lab-12-mybatis-xml
diff --git "a/lab-12/\343\200\212\350\212\213\351\201\223 Spring Boot MyBatis \345\205\245\351\227\250\343\200\213.md" "b/lab-12-mybatis/\343\200\212\350\212\213\351\201\223 Spring Boot MyBatis \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-12/\343\200\212\350\212\213\351\201\223 Spring Boot MyBatis \345\205\245\351\227\250\343\200\213.md"
rename to "lab-12-mybatis/\343\200\212\350\212\213\351\201\223 Spring Boot MyBatis \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-13/lab-13-jpa/pom.xml b/lab-13-spring-data-jpa/lab-13-jpa/pom.xml
similarity index 100%
rename from lab-13/lab-13-jpa/pom.xml
rename to lab-13-spring-data-jpa/lab-13-jpa/pom.xml
diff --git a/lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/Application.java b/lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/Application.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/Application.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/Application.java
diff --git a/lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/dataobject/UserDO.java b/lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/dataobject/UserDO.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/dataobject/UserDO.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/dataobject/UserDO.java
diff --git a/lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01.java b/lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01.java
diff --git a/lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02.java b/lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02.java
diff --git a/lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03.java b/lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03.java
diff --git a/lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04.java b/lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04.java
diff --git a/lab-13/lab-13-jpa/src/main/resources/application.yaml b/lab-13-spring-data-jpa/lab-13-jpa/src/main/resources/application.yaml
similarity index 100%
rename from lab-13/lab-13-jpa/src/main/resources/application.yaml
rename to lab-13-spring-data-jpa/lab-13-jpa/src/main/resources/application.yaml
diff --git a/lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01Test.java b/lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01Test.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01Test.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01Test.java
diff --git a/lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02Test.java b/lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02Test.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02Test.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02Test.java
diff --git a/lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03Test.java b/lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03Test.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03Test.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03Test.java
diff --git a/lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04Test.java b/lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04Test.java
similarity index 100%
rename from lab-13/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04Test.java
rename to lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04Test.java
diff --git a/lab-13/pom.xml b/lab-13-spring-data-jpa/pom.xml
similarity index 91%
rename from lab-13/pom.xml
rename to lab-13-spring-data-jpa/pom.xml
index 71c684257..736ef33c8 100644
--- a/lab-13/pom.xml
+++ b/lab-13-spring-data-jpa/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-13
+ lab-13-spring-data-jpa
pom
lab-13-jpa
diff --git "a/lab-13/\343\200\212\350\212\213\351\201\223 Spring Boot JPA \345\205\245\351\227\250\343\200\213.md" "b/lab-13-spring-data-jpa/\343\200\212\350\212\213\351\201\223 Spring Boot JPA \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-13/\343\200\212\350\212\213\351\201\223 Spring Boot JPA \345\205\245\351\227\250\343\200\213.md"
rename to "lab-13-spring-data-jpa/\343\200\212\350\212\213\351\201\223 Spring Boot JPA \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-14/lab-14-jdbctemplate/pom.xml b/lab-14-spring-jdbc-template/lab-14-jdbctemplate/pom.xml
similarity index 100%
rename from lab-14/lab-14-jdbctemplate/pom.xml
rename to lab-14-spring-jdbc-template/lab-14-jdbctemplate/pom.xml
diff --git a/lab-14/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/Application.java b/lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/Application.java
similarity index 100%
rename from lab-14/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/Application.java
rename to lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/Application.java
diff --git a/lab-14/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDao.java b/lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDao.java
similarity index 100%
rename from lab-14/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDao.java
rename to lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDao.java
diff --git a/lab-14/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dataobject/UserDO.java b/lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dataobject/UserDO.java
similarity index 100%
rename from lab-14/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dataobject/UserDO.java
rename to lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dataobject/UserDO.java
diff --git a/lab-14/lab-14-jdbctemplate/src/main/resources/application.yaml b/lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/resources/application.yaml
similarity index 100%
rename from lab-14/lab-14-jdbctemplate/src/main/resources/application.yaml
rename to lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/resources/application.yaml
diff --git a/lab-14/lab-14-jdbctemplate/src/test/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDaoTest.java b/lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/test/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDaoTest.java
similarity index 100%
rename from lab-14/lab-14-jdbctemplate/src/test/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDaoTest.java
rename to lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/test/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDaoTest.java
diff --git a/lab-14/pom.xml b/lab-14-spring-jdbc-template/pom.xml
similarity index 91%
rename from lab-14/pom.xml
rename to lab-14-spring-jdbc-template/pom.xml
index 7c40a7318..77034062c 100644
--- a/lab-14/pom.xml
+++ b/lab-14-spring-jdbc-template/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-14
+ lab-14-spring-jdbc-template
pom
lab-14-jdbctemplate
diff --git "a/lab-14/\343\200\212\350\212\213\351\201\223 Spring Boot JdbcTemplate \345\205\245\351\227\250\343\200\213.md" "b/lab-14-spring-jdbc-template/\343\200\212\350\212\213\351\201\223 Spring Boot JdbcTemplate \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-14/\343\200\212\350\212\213\351\201\223 Spring Boot JdbcTemplate \345\205\245\351\227\250\343\200\213.md"
rename to "lab-14-spring-jdbc-template/\343\200\212\350\212\213\351\201\223 Spring Boot JdbcTemplate \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-15/lab-15-spring-data-elasticsearch/pom.xml b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/pom.xml
similarity index 99%
rename from lab-15/lab-15-spring-data-elasticsearch/pom.xml
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/pom.xml
index df7e8f22d..fda7103b5 100644
--- a/lab-15/lab-15-spring-data-elasticsearch/pom.xml
+++ b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/pom.xml
@@ -25,7 +25,6 @@
spring-boot-starter-test
test
-
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/Application.java b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/Application.java
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/Application.java
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/Application.java
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/bo/ProductConditionBO.java b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/bo/ProductConditionBO.java
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/bo/ProductConditionBO.java
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/bo/ProductConditionBO.java
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/constant/FieldAnalyzer.java b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/constant/FieldAnalyzer.java
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/constant/FieldAnalyzer.java
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/constant/FieldAnalyzer.java
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/dataobject/ESProductDO.java b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/dataobject/ESProductDO.java
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/dataobject/ESProductDO.java
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/dataobject/ESProductDO.java
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository.java b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository.java
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository.java
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository.java
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/main/resources/application.yaml b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/resources/application.yaml
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/main/resources/application.yaml
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/resources/application.yaml
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository04Test.java b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository04Test.java
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository04Test.java
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository04Test.java
diff --git a/lab-15/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepositoryTest.java b/lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepositoryTest.java
similarity index 100%
rename from lab-15/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepositoryTest.java
rename to lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepositoryTest.java
diff --git a/lab-15/lab-15-spring-data-jest/pom.xml b/lab-15-spring-data-es/lab-15-spring-data-jest/pom.xml
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/pom.xml
rename to lab-15-spring-data-es/lab-15-spring-data-jest/pom.xml
diff --git a/lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/Application.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/Application.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/Application.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/Application.java
diff --git a/lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/constant/FieldAnalyzer.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/constant/FieldAnalyzer.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/constant/FieldAnalyzer.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/constant/FieldAnalyzer.java
diff --git a/lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/dataobject/ESProductDO.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/dataobject/ESProductDO.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/dataobject/ESProductDO.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/dataobject/ESProductDO.java
diff --git a/lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository.java
diff --git a/lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02.java
diff --git a/lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03.java
diff --git a/lab-15/lab-15-spring-data-jest/src/main/resources/application.yaml b/lab-15-spring-data-es/lab-15-spring-data-jest/src/main/resources/application.yaml
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/main/resources/application.yaml
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/main/resources/application.yaml
diff --git a/lab-15/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02Test.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02Test.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02Test.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02Test.java
diff --git a/lab-15/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03Test.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03Test.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03Test.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03Test.java
diff --git a/lab-15/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepositoryTest.java b/lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepositoryTest.java
similarity index 100%
rename from lab-15/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepositoryTest.java
rename to lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepositoryTest.java
diff --git a/lab-15/pom.xml b/lab-15-spring-data-es/pom.xml
similarity index 92%
rename from lab-15/pom.xml
rename to lab-15-spring-data-es/pom.xml
index 948c48e68..9fc642f9c 100644
--- a/lab-15/pom.xml
+++ b/lab-15-spring-data-es/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-15
+ lab-15-spring-data-es
pom
lab-15-spring-data-jest
diff --git "a/lab-15/\343\200\212\350\212\213\351\201\223 Spring Boot Elasticsearch \345\205\245\351\227\250\343\200\213.md" "b/lab-15-spring-data-es/\343\200\212\350\212\213\351\201\223 Spring Boot Elasticsearch \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-15/\343\200\212\350\212\213\351\201\223 Spring Boot Elasticsearch \345\205\245\351\227\250\343\200\213.md"
rename to "lab-15-spring-data-es/\343\200\212\350\212\213\351\201\223 Spring Boot Elasticsearch \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-16/lab-16-spring-data-mongodb/pom.xml b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/pom.xml
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/pom.xml
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/pom.xml
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/Application.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/Application.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/Application.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/Application.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/config/MongoDBConfig.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/config/MongoDBConfig.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/config/MongoDBConfig.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/config/MongoDBConfig.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDao.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDao.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDao.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDao.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/ProductDO.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/ProductDO.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/ProductDO.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/ProductDO.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/UserDO.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/UserDO.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/UserDO.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/UserDO.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/IncIdEntity.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/IncIdEntity.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/IncIdEntity.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/IncIdEntity.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/MongoInsertEventListener.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/MongoInsertEventListener.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/MongoInsertEventListener.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/MongoInsertEventListener.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepository.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepository.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepository.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepository.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/main/resources/application.yaml b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/resources/application.yaml
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/main/resources/application.yaml
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/resources/application.yaml
diff --git a/lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDaoTest.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDaoTest.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDaoTest.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDaoTest.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepositoryTest.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepositoryTest.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepositoryTest.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepositoryTest.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02Test.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02Test.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02Test.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02Test.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03Test.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03Test.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03Test.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03Test.java
diff --git a/lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepositoryTest.java b/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepositoryTest.java
similarity index 100%
rename from lab-16/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepositoryTest.java
rename to lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepositoryTest.java
diff --git a/lab-16/pom.xml b/lab-16-spring-data-mongo/pom.xml
similarity index 91%
rename from lab-16/pom.xml
rename to lab-16-spring-data-mongo/pom.xml
index e71c765f9..e9fda16e8 100644
--- a/lab-16/pom.xml
+++ b/lab-16-spring-data-mongo/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- lab-16
+ lab-16-spring-data-mongo
pom
lab-16-spring-data-mongodb
diff --git "a/lab-16/\343\200\212\350\212\213\351\201\223 Spring Boot MongoDB \345\205\245\351\227\250\343\200\213.md" "b/lab-16-spring-data-mongo/\343\200\212\350\212\213\351\201\223 Spring Boot MongoDB \345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-16/\343\200\212\350\212\213\351\201\223 Spring Boot MongoDB \345\205\245\351\227\250\343\200\213.md"
rename to "lab-16-spring-data-mongo/\343\200\212\350\212\213\351\201\223 Spring Boot MongoDB \345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-10/pom.xml b/lab-24/lab-24-apidoc-japidocs/pom.xml
similarity index 70%
rename from lab-10/pom.xml
rename to lab-24/lab-24-apidoc-japidocs/pom.xml
index 11aa51736..f1a946f4f 100644
--- a/lab-10/pom.xml
+++ b/lab-24/lab-24-apidoc-japidocs/pom.xml
@@ -5,23 +5,27 @@
org.springframework.boot
spring-boot-starter-parent
- 2.1.4.RELEASE
+ 2.1.3.RELEASE
4.0.0
- lab-10
+ lab-24-apidoc-japidocs
+
org.springframework.boot
spring-boot-starter-web
+
- org.springframework.boot
- spring-boot-starter-actuator
+ io.github.yedaxia
+ japidocs
+ 1.4.4
+
diff --git a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/SpringMVCApplication.java b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/Application.java
similarity index 59%
rename from lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/SpringMVCApplication.java
rename to lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/Application.java
index 51b8a3558..cc795da46 100644
--- a/lab-10/src/main/java/cn/iocoder/springboot/labs/lab10/SpringMVCApplication.java
+++ b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/Application.java
@@ -1,13 +1,13 @@
-package cn.iocoder.springboot.labs.lab10;
+package cn.iocoder.springboot.lab24;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
-public class SpringMVCApplication {
+public class Application {
public static void main(String[] args) {
- SpringApplication.run(SpringMVCApplication.class);
+ SpringApplication.run(Application.class, args);
}
}
diff --git a/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/TestJApiDocs.java b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/TestJApiDocs.java
new file mode 100644
index 000000000..fdeab6e54
--- /dev/null
+++ b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/TestJApiDocs.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springboot.lab24;
+
+import io.github.yedaxia.apidocs.Docs;
+import io.github.yedaxia.apidocs.DocsConfig;
+import io.github.yedaxia.apidocs.plugin.markdown.MarkdownDocPlugin;
+
+public class TestJApiDocs {
+
+ public static void main(String[] args) {
+ // 1. 创建生成文档的配置
+ DocsConfig config = new DocsConfig();
+ config.setProjectPath("/Users/yunai/Java/SpringBoot-Labs/lab-24/lab-24-apidoc-japidocs"); // 项目所在目录
+ config.setDocsPath("/Users/yunai/Downloads/"); // 生成 HTML 接口文档的目标目录
+ config.setAutoGenerate(true); // 是否给所有 Controller 生成接口文档
+ config.setProjectName("示例项目"); // 项目名
+ config.setApiVersion("V1.0"); // API 版本号
+ config.addPlugin(new MarkdownDocPlugin()); // 使用 MD 插件,额外生成 MD 格式的接口文档
+ // 2. 执行生成 HTML 接口文档
+ Docs.buildHtmlDocs(config);
+ }
+
+}
diff --git a/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java
new file mode 100644
index 000000000..da67b9808
--- /dev/null
+++ b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java
@@ -0,0 +1,52 @@
+package cn.iocoder.springboot.lab24.controller;
+
+import cn.iocoder.springboot.lab24.vo.UserCreateReqVO;
+import cn.iocoder.springboot.lab24.vo.UserListReqVO;
+import cn.iocoder.springboot.lab24.vo.UserRespVO;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用户 API
+ */
+@RestController
+@RequestMapping("/api/user/")
+public class UserController {
+
+
+ /**
+ * 获得用户列表
+ *
+ * @param listReqVO 列表筛选条件
+ * @return 用户列表
+ */
+ @GetMapping("list")
+ public List list(UserListReqVO listReqVO){
+ return null;
+ }
+
+ /**
+ * 保存用户
+ *
+ * @param createReqVO 创建用户信息
+ * @return 用户编号
+ */
+ @PostMapping("save")
+ public Integer saveUser(@RequestBody UserCreateReqVO createReqVO){
+ return 1;
+ }
+
+ /**
+ * 删除指定编号的用户
+ *
+ * @param id 用户编号
+ * @return 是否成功
+ */
+ @DeleteMapping("delete")
+ public Boolean deleteUser(@RequestParam Long id){
+ return true;
+ }
+
+
+}
diff --git a/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserCreateReqVO.java b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserCreateReqVO.java
new file mode 100644
index 000000000..c5e82c8f8
--- /dev/null
+++ b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserCreateReqVO.java
@@ -0,0 +1,17 @@
+package cn.iocoder.springboot.lab24.vo;
+
+/**
+ * 用户创建请求 VO
+ */
+public class UserCreateReqVO {
+
+ /**
+ * 昵称
+ */
+ private String nickname;
+ /**
+ * 年龄
+ */
+ private Integer age;
+
+}
diff --git a/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserListReqVO.java b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserListReqVO.java
new file mode 100644
index 000000000..cb0f28624
--- /dev/null
+++ b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserListReqVO.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab24.vo;
+
+/**
+ * 用户列表请求 VO
+ */
+public class UserListReqVO {
+
+ /**
+ * 昵称,模糊匹配
+ */
+ private String nickname;
+
+}
diff --git a/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserRespVO.java b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserRespVO.java
new file mode 100644
index 000000000..2dda156c4
--- /dev/null
+++ b/lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserRespVO.java
@@ -0,0 +1,21 @@
+package cn.iocoder.springboot.lab24.vo;
+
+/**
+ * 用户响应 VO
+ */
+public class UserRespVO {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String nickname;
+ /**
+ * 年龄
+ */
+ private Integer age;
+
+}
diff --git a/lab-24/lab-24-apidoc-swagger-starter/pom.xml b/lab-24/lab-24-apidoc-swagger-starter/pom.xml
new file mode 100644
index 000000000..91dbbee69
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.11.RELEASE
+
+
+ 4.0.0
+
+ lab-24-apidoc-swagger-starter
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ io.springfox
+ springfox-boot-starter
+ 3.0.0
+
+
+
+
diff --git a/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/Application.java b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/Application.java
new file mode 100644
index 000000000..cc795da46
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/Application.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab24;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/config/SwaggerConfiguration.java b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/config/SwaggerConfiguration.java
new file mode 100644
index 000000000..5ddcef502
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/config/SwaggerConfiguration.java
@@ -0,0 +1,42 @@
+package cn.iocoder.springboot.lab24.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+// @EnableSwagger2 无需使用该注解
+public class SwaggerConfiguration {
+
+ @Bean
+ public Docket createRestApi() {
+ // 创建 Docket 对象
+ return new Docket(DocumentationType.SWAGGER_2) // 文档类型,使用 Swagger2
+ .apiInfo(this.apiInfo()) // 设置 API 信息
+ // 扫描 Controller 包路径,获得 API 接口
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("cn.iocoder.springboot.lab24.controller"))
+ .paths(PathSelectors.any())
+ // 构建出 Docket 对象
+ .build();
+ }
+
+ /**
+ * 创建 API 信息
+ */
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("测试接口文档示例")
+ .description("我是一段描述")
+ .version("1.0.0") // 版本号
+ .contact(new Contact("芋艿", "http://www.iocoder.cn", "zhijiantianya@gmail.com")) // 联系人
+ .build();
+ }
+
+}
diff --git a/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java
new file mode 100644
index 000000000..6ed0a76f4
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java
@@ -0,0 +1,68 @@
+package cn.iocoder.springboot.lab24.controller;
+
+import cn.iocoder.springboot.lab24.dto.UserAddDTO;
+import cn.iocoder.springboot.lab24.dto.UserUpdateDTO;
+import cn.iocoder.springboot.lab24.vo.UserVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/users")
+@Api(tags = "用户 API 接口")
+public class UserController {
+
+ @GetMapping("/list")
+ @ApiOperation(value = "查询用户列表", notes = "目前仅仅是作为测试,所以返回用户全列表")
+ public List list() {
+ // 查询列表
+ List result = new ArrayList<>();
+ result.add(new UserVO().setId(1).setUsername("yudaoyuanma"));
+ result.add(new UserVO().setId(2).setUsername("woshiyutou"));
+ result.add(new UserVO().setId(3).setUsername("chifanshuijiao"));
+ // 返回列表
+ return result;
+ }
+
+ @GetMapping("/get")
+ @ApiOperation("获得指定用户编号的用户")
+ @ApiImplicitParam(name = "id", value = "用户编号", paramType = "query", dataTypeClass = Integer.class, required = true, example = "1024")
+ public UserVO get(@RequestParam("id") Integer id) {
+ // 查询并返回用户
+ return new UserVO().setId(id).setUsername(UUID.randomUUID().toString());
+ }
+
+ @PostMapping("add")
+ @ApiOperation("添加用户")
+ public Integer add(UserAddDTO addDTO) {
+ // 插入用户记录,返回编号
+ Integer returnId = UUID.randomUUID().hashCode();
+ // 返回用户编号
+ return returnId;
+ }
+
+ @PostMapping("/update")
+ @ApiOperation("更新指定用户编号的用户")
+ public Boolean update(UserUpdateDTO updateDTO) {
+ // 更新用户记录
+ Boolean success = true;
+ // 返回更新是否成功
+ return success;
+ }
+
+ @PostMapping("/delete")
+ @ApiOperation(value = "删除指定用户编号的用户")
+ @ApiImplicitParam(name = "id", value = "用户编号", paramType = "query", dataTypeClass = Integer.class, required = true, example = "1024")
+ public Boolean delete(@RequestParam("id") Integer id) {
+ // 删除用户记录
+ Boolean success = false;
+ // 返回是否更新成功
+ return success;
+ }
+
+}
diff --git a/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserAddDTO.java b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserAddDTO.java
new file mode 100644
index 000000000..af181e690
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserAddDTO.java
@@ -0,0 +1,32 @@
+package cn.iocoder.springboot.lab24.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("用户添加 DTO")
+public class UserAddDTO {
+
+ @ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma")
+ private String username;
+ @ApiModelProperty(value = "密码", required = true, example = "nicai")
+ private String password;
+
+ public String getUsername() {
+ return username;
+ }
+
+ public UserAddDTO setUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public UserAddDTO setPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+}
diff --git a/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserUpdateDTO.java b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserUpdateDTO.java
new file mode 100644
index 000000000..3c92aeb8b
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserUpdateDTO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.springboot.lab24.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("用户更新 DTO")
+public class UserUpdateDTO {
+
+ @ApiModelProperty(value = "用户编号", required = true, example = "1024")
+ private Integer id;
+ @ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma")
+ private String username;
+ @ApiModelProperty(value = "密码", required = true, example = "nicai")
+ private String password;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserUpdateDTO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public UserUpdateDTO setUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public UserUpdateDTO setPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+}
diff --git a/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/vo/UserVO.java b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/vo/UserVO.java
new file mode 100644
index 000000000..4917916d9
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/vo/UserVO.java
@@ -0,0 +1,32 @@
+package cn.iocoder.springboot.lab24.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("用户 VO")
+public class UserVO {
+
+ @ApiModelProperty(value = "用户编号", required = true, example = "1024")
+ private Integer id;
+ @ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma")
+ private String username;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserVO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public UserVO setUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+}
diff --git a/lab-24/lab-24-apidoc-swagger-starter/src/main/resources/application.yaml b/lab-24/lab-24-apidoc-swagger-starter/src/main/resources/application.yaml
new file mode 100644
index 000000000..c4573845e
--- /dev/null
+++ b/lab-24/lab-24-apidoc-swagger-starter/src/main/resources/application.yaml
@@ -0,0 +1,5 @@
+# 对应 SpringfoxConfigurationProperties 配置类
+springfox:
+ documentation:
+ swagger-ui:
+ enabled: true # 是否开启 Swagger UI 功能。默认为 true
diff --git a/lab-24/pom.xml b/lab-24/pom.xml
index e312a1268..7d0bf03c5 100644
--- a/lab-24/pom.xml
+++ b/lab-24/pom.xml
@@ -14,6 +14,8 @@
lab-24-apidoc-swagger
lab-24-apidoc-swagger-knife4j
+ lab-24-apidoc-japidocs
+ lab-24-apidoc-swagger-starter
diff --git "a/lab-24/\343\200\212\350\212\213\351\201\223 Spring Boot API \346\216\245\345\217\243\346\226\207\346\241\243 JApiDocs \345\205\245\351\227\250\343\200\213.md" "b/lab-24/\343\200\212\350\212\213\351\201\223 Spring Boot API \346\216\245\345\217\243\346\226\207\346\241\243 JApiDocs \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..c502e16b4
--- /dev/null
+++ "b/lab-24/\343\200\212\350\212\213\351\201\223 Spring Boot API \346\216\245\345\217\243\346\226\207\346\241\243 JApiDocs \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git "a/lab-24/\343\200\212\350\212\213\351\201\223 Spring Boot API \346\216\245\345\217\243\346\226\207\346\241\243 Swagger Starter \345\205\245\351\227\250\343\200\213.md" "b/lab-24/\343\200\212\350\212\213\351\201\223 Spring Boot API \346\216\245\345\217\243\346\226\207\346\241\243 Swagger Starter \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..e080075c0
--- /dev/null
+++ "b/lab-24/\343\200\212\350\212\213\351\201\223 Spring Boot API \346\216\245\345\217\243\346\226\207\346\241\243 Swagger Starter \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-provider-02/src/main/resources/application.yaml b/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-provider-02/src/main/resources/application.yaml
index 58798bdb5..608fb4f33 100644
--- a/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-provider-02/src/main/resources/application.yaml
+++ b/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-provider-02/src/main/resources/application.yaml
@@ -3,9 +3,12 @@ dubbo:
# Dubbo 应用配置
application:
name: user-service-provider # 应用名
- # Dubbo 注册中心配
+ # Dubbo 注册中心配置
registry:
- address: zookeeper://127.0.0.1:2181 # 注册中心地址。个鞥多注册中心,可见 http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html 文档。
+ address: zookeeper://127.0.0.1:2181 # 注册中心地址。配置多注册中心,可见 http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html 文档。
+ # Dubbo 元数据中心配置
+ metadata-report:
+ address: zookeeper://127.0.0.1:2181 # 元数据中心地址。元数据中心的说明,可见 http://dubbo.apache.org/zh-cn/docs/user/references/metadata/introduction.html
# Dubbo 服务提供者协议配置
protocol:
port: -1 # 协议端口。使用 -1 表示随机端口。
diff --git "a/lab-30/\343\200\212\350\212\213\351\201\223 Dubbo Admin \345\277\253\351\200\237\345\205\245\351\227\250\343\200\213.md" "b/lab-30/\343\200\212\350\212\213\351\201\223 Dubbo Admin \345\277\253\351\200\237\345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..b79d611b7
--- /dev/null
+++ "b/lab-30/\343\200\212\350\212\213\351\201\223 Dubbo Admin \345\277\253\351\200\237\345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git "a/lab-30/\343\200\212\350\212\213\351\201\223 Dubbo Swagger \345\277\253\351\200\237\345\205\245\351\227\250\343\200\213.md" "b/lab-30/\343\200\212\350\212\213\351\201\223 Dubbo Swagger \345\277\253\351\200\237\345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..4be20bd8b
--- /dev/null
+++ "b/lab-30/\343\200\212\350\212\213\351\201\223 Dubbo Swagger \345\277\253\351\200\237\345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-39/lab-39-demo/pom.xml b/lab-39/lab-39-demo/pom.xml
index 199ba33df..b0bec084f 100644
--- a/lab-39/lab-39-demo/pom.xml
+++ b/lab-39/lab-39-demo/pom.xml
@@ -18,6 +18,10 @@
org.springframework.boot
spring-boot-starter-web
+
+
+
+
diff --git a/lab-39/lab-39-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/Application.java b/lab-39/lab-39-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/Application.java
index 62665a610..6bf7234d7 100644
--- a/lab-39/lab-39-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/Application.java
+++ b/lab-39/lab-39-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/Application.java
@@ -3,10 +3,47 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import java.io.IOException;
+import java.net.URISyntaxException;
+
@SpringBootApplication
public class Application {
- public static void main(String[] args) {
+ public static void main(String[] args) throws URISyntaxException, IOException {
+// ProtectionDomain protectionDomain = Launcher.class.getProtectionDomain();
+// CodeSource codeSource = protectionDomain.getCodeSource();
+// URI location = (codeSource != null) ? codeSource.getLocation().toURI() : null;
+// String path = (location != null) ? location.getSchemeSpecificPart() : null;
+// if (path == null) {
+// throw new IllegalStateException("Unable to determine code source archive");
+// }
+// File root = new File(path);
+// System.out.println(root + "" + root.isDirectory());
+// // 创建 Archive 对象
+// Archive archive = new JarFileArchive(root);
+// // 创建 EntryFilter 对象
+// Archive.EntryFilter filter = new Archive.EntryFilter() {
+//
+// static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";
+//
+// static final String BOOT_INF_LIB = "BOOT-INF/lib/";
+//
+// @Override
+// public boolean matches(Archive.Entry entry) {
+// // 如果是目录的情况,只要 BOOT-INF/classes/ 目录
+// if (entry.isDirectory()) {
+// return entry.getName().equals(BOOT_INF_CLASSES);
+// }
+// // 如果是文件的情况,只要 BOOT-INF/lib/ 目录下的 `jar` 包
+// return entry.getName().startsWith(BOOT_INF_LIB);
+// }
+//
+// };
+// // 执行读取
+// for (Archive item : archive.getNestedArchives(filter)) {
+// System.out.println(item.getUrl());
+// }
+
SpringApplication.run(Application.class, args);
}
diff --git a/lab-48/lab-48-demo/pom.xml b/lab-48-hot-swap/lab-48-demo/pom.xml
similarity index 100%
rename from lab-48/lab-48-demo/pom.xml
rename to lab-48-hot-swap/lab-48-demo/pom.xml
diff --git a/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java b/lab-48-hot-swap/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java
similarity index 100%
rename from lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java
rename to lab-48-hot-swap/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java
diff --git a/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java b/lab-48-hot-swap/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java
similarity index 100%
rename from lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java
rename to lab-48-hot-swap/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java
diff --git a/lab-48/pom.xml b/lab-48-hot-swap/pom.xml
similarity index 92%
rename from lab-48/pom.xml
rename to lab-48-hot-swap/pom.xml
index be39149e0..3ecc26058 100644
--- a/lab-48/pom.xml
+++ b/lab-48-hot-swap/pom.xml
@@ -9,8 +9,9 @@
4.0.0
- lab-48
+ lab-48-hot-swap
pom
+
lab-48-demo
diff --git "a/lab-48/\343\200\212\350\212\213\351\201\223 Spring Boot \347\203\255\351\203\250\347\275\262\345\205\245\351\227\250\343\200\213.md" "b/lab-48-hot-swap/\343\200\212\350\212\213\351\201\223 Spring Boot \347\203\255\351\203\250\347\275\262\345\205\245\351\227\250\343\200\213.md"
similarity index 100%
rename from "lab-48/\343\200\212\350\212\213\351\201\223 Spring Boot \347\203\255\351\203\250\347\275\262\345\205\245\351\227\250\343\200\213.md"
rename to "lab-48-hot-swap/\343\200\212\350\212\213\351\201\223 Spring Boot \347\203\255\351\203\250\347\275\262\345\205\245\351\227\250\343\200\213.md"
diff --git a/lab-61/lab-61-cat-opentracing-demo/pom.xml b/lab-61/lab-61-cat-opentracing-demo/pom.xml
new file mode 100644
index 000000000..044668dd1
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing-demo/pom.xml
@@ -0,0 +1,68 @@
+
+
+
+ lab-61
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-61-cat-opentracing-demo
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.dianping.cat
+ cat-client
+ 3.0.0
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-61-cat-opentracing
+ 1.0-SNAPSHOT
+
+
+
+
+
+
+ central
+ Maven2 Central Repository
+ default
+ http://repo1.maven.org/maven2
+
+
+ unidal.releases
+ http://unidal.org/nexus/content/repositories/releases/
+
+
+
+
diff --git a/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/Application.java b/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/Application.java
new file mode 100644
index 000000000..23f629f8b
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/Application.java
@@ -0,0 +1,13 @@
+package catdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/config/ZipkinConfig.java b/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/config/ZipkinConfig.java
new file mode 100644
index 000000000..d90eecd85
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/config/ZipkinConfig.java
@@ -0,0 +1,16 @@
+package catdemo.config;
+
+import cn.iocoder.springboot.lab61.cat.opentracing.CatTracer;
+import io.opentracing.Tracer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ZipkinConfig {
+
+ @Bean
+ public Tracer openTracer() {
+ return new CatTracer();
+ }
+
+}
diff --git a/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/controller/DemoController.java b/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/controller/DemoController.java
new file mode 100644
index 000000000..dab24db56
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing-demo/src/main/java/catdemo/controller/DemoController.java
@@ -0,0 +1,38 @@
+package catdemo.controller;
+
+import com.dianping.cat.Cat;
+import io.opentracing.Span;
+import io.opentracing.Tracer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private Tracer tracer;
+
+ /**
+ * 监控模型 Transaction 的示例
+ */
+ @GetMapping("/test")
+ public String test() {
+ // 创建一个 Span
+ Span parentSpan = tracer.buildSpan("parent").start();
+
+ Span childSpan = tracer.buildSpan("child").start();
+ childSpan.finish();
+
+ Cat.logEvent("测试事件", "123");
+
+ // 结束一个 Span
+ parentSpan.finish();
+
+ // 返回
+ return "opentracing";
+ }
+
+}
diff --git a/lab-61/lab-61-cat-opentracing-demo/src/main/resources/META-INF/app.properties b/lab-61/lab-61-cat-opentracing-demo/src/main/resources/META-INF/app.properties
new file mode 100644
index 000000000..f266ce248
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing-demo/src/main/resources/META-INF/app.properties
@@ -0,0 +1 @@
+app.name=demo-application
diff --git a/lab-61/lab-61-cat-opentracing/pom.xml b/lab-61/lab-61-cat-opentracing/pom.xml
new file mode 100644
index 000000000..fea05c196
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing/pom.xml
@@ -0,0 +1,51 @@
+
+
+
+ lab-61
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-61-cat-opentracing
+
+
+
+ 1.8
+ 1.8
+
+
+
+
+
+ com.dianping.cat
+ cat-client
+ 3.0.0
+
+
+
+
+ io.opentracing
+ opentracing-api
+ 0.33.0
+
+
+
+
+
+
+
+ central
+ Maven2 Central Repository
+ default
+ http://repo1.maven.org/maven2
+
+
+ unidal.releases
+ http://unidal.org/nexus/content/repositories/releases/
+
+
+
+
diff --git a/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatSpan.java b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatSpan.java
new file mode 100644
index 000000000..8768aa3ae
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatSpan.java
@@ -0,0 +1,89 @@
+package cn.iocoder.springboot.lab61.cat.opentracing;
+
+import com.dianping.cat.message.Transaction;
+import io.opentracing.Span;
+import io.opentracing.SpanContext;
+import io.opentracing.tag.Tag;
+
+import java.util.Map;
+
+public class CatSpan implements Span {
+
+ private Transaction transaction;
+
+ public CatSpan(Transaction transaction) {
+ this.transaction = transaction;
+ }
+
+ @Override
+ public SpanContext context() {
+ return null;
+ }
+
+ @Override
+ public Span setTag(String key, String value) {
+ return null;
+ }
+
+ @Override
+ public Span setTag(String key, boolean value) {
+ return null;
+ }
+
+ @Override
+ public Span setTag(String key, Number value) {
+ return null;
+ }
+
+ @Override
+ public Span setTag(Tag tag, T value) {
+ return null;
+ }
+
+ @Override
+ public Span log(Map fields) {
+ return null;
+ }
+
+ @Override
+ public Span log(long timestampMicroseconds, Map fields) {
+ return null;
+ }
+
+ @Override
+ public Span log(String event) {
+ return null;
+ }
+
+ @Override
+ public Span log(long timestampMicroseconds, String event) {
+ return null;
+ }
+
+ @Override
+ public Span setBaggageItem(String key, String value) {
+ return null;
+ }
+
+ @Override
+ public String getBaggageItem(String key) {
+ return null;
+ }
+
+ @Override
+ public Span setOperationName(String operationName) {
+ return null;
+ }
+
+ @Override
+ public void finish() {
+ transaction.setStatus(Transaction.SUCCESS);
+ transaction.complete();
+ }
+
+ @Override
+ public void finish(long finishMicros) {
+
+ }
+
+}
diff --git a/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatSpanBuilder.java b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatSpanBuilder.java
new file mode 100644
index 000000000..5f212b21f
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatSpanBuilder.java
@@ -0,0 +1,65 @@
+package cn.iocoder.springboot.lab61.cat.opentracing;
+
+import com.dianping.cat.Cat;
+import com.dianping.cat.message.Transaction;
+import io.opentracing.Span;
+import io.opentracing.SpanContext;
+import io.opentracing.Tracer;
+import io.opentracing.tag.Tag;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class CatSpanBuilder implements Tracer.SpanBuilder {
+
+ private List tags = new LinkedList<>();
+ private String operationName;
+
+ public CatSpanBuilder(String operationName) {
+ this.operationName = operationName;
+ }
+
+ public Tracer.SpanBuilder asChildOf(SpanContext parent) {
+ return null;
+ }
+
+ public Tracer.SpanBuilder asChildOf(Span parent) {
+ return null;
+ }
+
+ public Tracer.SpanBuilder addReference(String referenceType, SpanContext referencedContext) {
+ return null;
+ }
+
+ public Tracer.SpanBuilder ignoreActiveSpan() {
+ return null;
+ }
+
+ public Tracer.SpanBuilder withTag(String key, String value) {
+ tags.add(new cn.iocoder.springboot.lab61.cat.opentracing.Tag(key, value));
+ return this;
+ }
+
+ public Tracer.SpanBuilder withTag(String key, boolean value) {
+ return null;
+ }
+
+ public Tracer.SpanBuilder withTag(String key, Number value) {
+ return null;
+ }
+
+ public Tracer.SpanBuilder withTag(Tag tag, T value) {
+ return null;
+ }
+
+ public Tracer.SpanBuilder withStartTimestamp(long microseconds) {
+ return null;
+ }
+
+ public Span start() {
+ Transaction transaction = Cat.newTransaction("Opentracing", operationName);
+ // TODO tag 的处理
+ return new CatSpan(transaction);
+ }
+
+}
diff --git a/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatTracer.java b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatTracer.java
new file mode 100644
index 000000000..858b0e230
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/CatTracer.java
@@ -0,0 +1,36 @@
+package cn.iocoder.springboot.lab61.cat.opentracing;
+
+import io.opentracing.*;
+import io.opentracing.propagation.Format;
+
+public class CatTracer implements Tracer {
+
+ public ScopeManager scopeManager() {
+ return null;
+ }
+
+ public Span activeSpan() {
+ return null;
+ }
+
+ public Scope activateSpan(Span span) {
+ return null;
+ }
+
+ public SpanBuilder buildSpan(String operationName) {
+ return new CatSpanBuilder(operationName);
+ }
+
+ public void inject(SpanContext spanContext, Format format, C carrier) {
+
+ }
+
+ public SpanContext extract(Format format, C carrier) {
+ return null;
+ }
+
+ public void close() {
+
+ }
+
+}
diff --git a/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/Tag.java b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/Tag.java
new file mode 100644
index 000000000..b0e2a1447
--- /dev/null
+++ b/lab-61/lab-61-cat-opentracing/src/main/java/cn/iocoder/springboot/lab61/cat/opentracing/Tag.java
@@ -0,0 +1,21 @@
+package cn.iocoder.springboot.lab61.cat.opentracing;
+
+public class Tag {
+
+ private String key;
+ private String value;
+
+ public Tag(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+}
diff --git a/lab-61/lab-61-demo/pom.xml b/lab-61/lab-61-demo/pom.xml
new file mode 100644
index 000000000..a578a18a7
--- /dev/null
+++ b/lab-61/lab-61-demo/pom.xml
@@ -0,0 +1,61 @@
+
+
+
+ lab-61
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-61-demo
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.dianping.cat
+ cat-client
+ 3.0.0
+
+
+
+
+
+
+ central
+ Maven2 Central Repository
+ default
+ http://repo1.maven.org/maven2
+
+
+ unidal.releases
+ http://unidal.org/nexus/content/repositories/releases/
+
+
+
+
diff --git a/lab-61/lab-61-demo/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java b/lab-61/lab-61-demo/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java
new file mode 100644
index 000000000..839d868c1
--- /dev/null
+++ b/lab-61/lab-61-demo/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab61.catdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/lab-61/lab-61-demo/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/DemoController.java b/lab-61/lab-61-demo/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/DemoController.java
new file mode 100644
index 000000000..65fb7ff55
--- /dev/null
+++ b/lab-61/lab-61-demo/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/DemoController.java
@@ -0,0 +1,92 @@
+package cn.iocoder.springboot.lab61.catdemo.controller;
+
+import com.dianping.cat.Cat;
+import com.dianping.cat.message.Event;
+import com.dianping.cat.message.Transaction;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ /**
+ * 监控模型 Transaction 的示例
+ */
+ @GetMapping("/transaction")
+ public String transaction() {
+ // 创建 Transaction 对象
+ Transaction t = Cat.newTransaction("URL", "/demo/transaction");
+ try {
+ // ... yourBusiness(); 业务逻辑
+
+ // 设置 Transaction 的状态为成功
+ t.setStatus(Transaction.SUCCESS);
+ } catch (Exception e) {
+ // 设置 Transaction 的状态为异常
+ t.setStatus(e);
+ } finally {
+ // 标记 Transaction 结束
+ t.complete();
+ }
+ return "success";
+ }
+
+ /**
+ * 监控模型 Event 的示例 01
+ */
+ @GetMapping("/event-01")
+ public String event01() {
+ // Cat.logEvent("URL.Server", "127.0.0.1");
+ Cat.logEvent("URL.Server", "127.0.0.1", Event.SUCCESS, "data");
+ return "success";
+ }
+
+ /**
+ * 监控模型 Event 的示例 02
+ */
+ @GetMapping("/event-02")
+ public String event02() {
+ try {
+ int result = 1 / 0;
+ } catch (Throwable e) {
+ Cat.logError(e);
+ // Cat.logError("custom-message", e);
+ }
+ return "success";
+ }
+
+ /**
+ * 监控模型 Event 的示例 03
+ */
+ @GetMapping("/event-03")
+ public String event03() {
+ try {
+ int result = 1 / 0;
+ } catch (Throwable e) {
+ Cat.logErrorWithCategory("custom-category", e);
+ // Cat.logErrorWithCategory("custom-category", "custom-message", e);
+ }
+ return "success";
+ }
+
+ /**
+ * 监控模型 Metric 示例 01
+ */
+ @GetMapping("/metric-01")
+ public String metric01() {
+ Cat.logMetricForCount("visit.count", 1);
+ return "success";
+ }
+
+ /**
+ * 监控模型 Metric 示例 02
+ */
+ @GetMapping("/metric-02")
+ public String metric02() {
+ Cat.logMetricForDuration("visit.duration", 10L);
+ return "success";
+ }
+
+}
diff --git a/lab-61/lab-61-demo/src/main/resources/META-INF/app.properties b/lab-61/lab-61-demo/src/main/resources/META-INF/app.properties
new file mode 100644
index 000000000..f266ce248
--- /dev/null
+++ b/lab-61/lab-61-demo/src/main/resources/META-INF/app.properties
@@ -0,0 +1 @@
+app.name=demo-application
diff --git a/lab-61/lab-61-logback/pom.xml b/lab-61/lab-61-logback/pom.xml
new file mode 100644
index 000000000..6995312d0
--- /dev/null
+++ b/lab-61/lab-61-logback/pom.xml
@@ -0,0 +1,61 @@
+
+
+
+ lab-61
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-61-logback
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.dianping.cat
+ cat-client
+ 3.0.0
+
+
+
+
+
+
+ central
+ Maven2 Central Repository
+ default
+ http://repo1.maven.org/maven2
+
+
+ unidal.releases
+ http://unidal.org/nexus/content/repositories/releases/
+
+
+
+
diff --git a/lab-61/lab-61-logback/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java b/lab-61/lab-61-logback/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java
new file mode 100644
index 000000000..839d868c1
--- /dev/null
+++ b/lab-61/lab-61-logback/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab61.catdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/lab-61/lab-61-logback/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/LoggerController.java b/lab-61/lab-61-logback/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/LoggerController.java
new file mode 100644
index 000000000..338e9bcfd
--- /dev/null
+++ b/lab-61/lab-61-logback/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/LoggerController.java
@@ -0,0 +1,25 @@
+package cn.iocoder.springboot.lab61.catdemo.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/logger")
+public class LoggerController {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @GetMapping("/error")
+ public String error() {
+ try {
+ int result = 1 / 0;
+ } catch (Throwable e) {
+ logger.error("计算异常", e);
+ }
+ return "success";
+ }
+
+}
diff --git a/lab-61/lab-61-logback/src/main/resources/META-INF/app.properties b/lab-61/lab-61-logback/src/main/resources/META-INF/app.properties
new file mode 100644
index 000000000..f266ce248
--- /dev/null
+++ b/lab-61/lab-61-logback/src/main/resources/META-INF/app.properties
@@ -0,0 +1 @@
+app.name=demo-application
diff --git a/lab-61/lab-61-logback/src/main/resources/logback-spring.xml b/lab-61/lab-61-logback/src/main/resources/logback-spring.xml
new file mode 100644
index 000000000..d79d252f2
--- /dev/null
+++ b/lab-61/lab-61-logback/src/main/resources/logback-spring.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-61/lab-61-springmvc/pom.xml b/lab-61/lab-61-springmvc/pom.xml
new file mode 100644
index 000000000..14243dc13
--- /dev/null
+++ b/lab-61/lab-61-springmvc/pom.xml
@@ -0,0 +1,61 @@
+
+
+
+ lab-61
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-61-springmvc
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.dianping.cat
+ cat-client
+ 3.0.0
+
+
+
+
+
+
+ central
+ Maven2 Central Repository
+ default
+ http://repo1.maven.org/maven2
+
+
+ unidal.releases
+ http://unidal.org/nexus/content/repositories/releases/
+
+
+
+
diff --git a/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java b/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java
new file mode 100644
index 000000000..839d868c1
--- /dev/null
+++ b/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/Application.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab61.catdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/config/CatFilterConfigure.java b/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/config/CatFilterConfigure.java
new file mode 100644
index 000000000..8326e0117
--- /dev/null
+++ b/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/config/CatFilterConfigure.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab61.catdemo.config;
+
+import com.dianping.cat.servlet.CatFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class CatFilterConfigure {
+
+ @Bean
+ public FilterRegistrationBean catFilter() {
+ // 创建 CatFilter 对象
+ CatFilter filter = new CatFilter();
+ // 创建 FilterRegistrationBean 对象
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
+ registration.setFilter(filter);
+ registration.addUrlPatterns("/*"); // 匹配所有 URL
+ registration.setName("cat-filter");
+ registration.setOrder(1);
+ return registration;
+ }
+
+}
diff --git a/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/DemoController.java b/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/DemoController.java
new file mode 100644
index 000000000..3e231ad5d
--- /dev/null
+++ b/lab-61/lab-61-springmvc/src/main/java/cn/iocoder/springboot/lab61/catdemo/controller/DemoController.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab61.catdemo.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @GetMapping("/hello")
+ public String hello() {
+ return "world";
+ }
+
+}
diff --git a/lab-61/lab-61-springmvc/src/main/resources/META-INF/app.properties b/lab-61/lab-61-springmvc/src/main/resources/META-INF/app.properties
new file mode 100644
index 000000000..f266ce248
--- /dev/null
+++ b/lab-61/lab-61-springmvc/src/main/resources/META-INF/app.properties
@@ -0,0 +1 @@
+app.name=demo-application
diff --git a/lab-61/pom.xml b/lab-61/pom.xml
new file mode 100644
index 000000000..de788e24e
--- /dev/null
+++ b/lab-61/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-61
+ pom
+
+ lab-61-demo
+ lab-61-logback
+ lab-61-springmvc
+ lab-61-cat-opentracing
+ lab-61-cat-opentracing-demo
+
+
+
diff --git "a/lab-61/\343\200\212\350\212\213\351\201\223 Spring Boot \347\233\221\346\216\247\345\271\263\345\217\260 CAT \345\205\245\351\227\250\343\200\213.md" "b/lab-61/\343\200\212\350\212\213\351\201\223 Spring Boot \347\233\221\346\216\247\345\271\263\345\217\260 CAT \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..8198d9a8a
--- /dev/null
+++ "b/lab-61/\343\200\212\350\212\213\351\201\223 Spring Boot \347\233\221\346\216\247\345\271\263\345\217\260 CAT \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/pom.xml b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/pom.xml
new file mode 100644
index 000000000..065b0b880
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/pom.xml
@@ -0,0 +1,16 @@
+
+
+
+ lab-62-sofarpc-xml-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-62-sofarpc-annotations-demo-user-rpc-service-api
+
+
+
+
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/api/UserRpcService.java b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/api/UserRpcService.java
new file mode 100644
index 000000000..b79c3f12c
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/api/UserRpcService.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springboot.lab62.rpc.api;
+
+import cn.iocoder.springboot.lab62.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab62.rpc.dto.UserDTO;
+
+/**
+ * 用户服务 RPC Service 接口
+ */
+public interface UserRpcService {
+
+ /**
+ * 根据指定用户编号,获得用户信息
+ *
+ * @param id 用户编号
+ * @return 用户信息
+ */
+ UserDTO get(Integer id);
+
+ /**
+ * 添加新用户,返回新添加的用户编号
+ *
+ * @param addDTO 添加的用户信息
+ * @return 用户编号
+ */
+ Integer add(UserAddDTO addDTO);
+
+}
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserAddDTO.java b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserAddDTO.java
new file mode 100644
index 000000000..f0840f1c5
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserAddDTO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springboot.lab62.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户添加 DTO
+ */
+public class UserAddDTO implements Serializable {
+
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public String getName() {
+ return name;
+ }
+
+ public UserAddDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserAddDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserDTO.java b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserDTO.java
new file mode 100644
index 000000000..d9b700749
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserDTO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.springboot.lab62.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户信息 DTO
+ */
+public class UserDTO implements Serializable {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDTO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+}
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/pom.xml b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/pom.xml
new file mode 100644
index 000000000..1910695d1
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+ com.alipay.sofa
+ sofaboot-dependencies
+ 3.3.2
+
+ 4.0.0
+
+ lab-62-sofarpc-annotations-demo-user-rpc-service-consumer
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-62-sofarpc-annotations-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alipay.sofa
+ rpc-sofa-boot-starter
+
+
+
+
+ org.apache.curator
+ curator-framework
+
+
+
+
+
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/ConsumerApplication.java b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/ConsumerApplication.java
new file mode 100644
index 000000000..9e13db95a
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/ConsumerApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springboot.lab62.rpc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+//@ImportResource("classpath:sofarpc.xml")
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ConsumerApplication.class, args);;
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/controller/UserController.java b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/controller/UserController.java
new file mode 100644
index 000000000..ed29dd207
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/controller/UserController.java
@@ -0,0 +1,32 @@
+package cn.iocoder.springboot.lab62.rpc.controller;
+
+import cn.iocoder.springboot.lab62.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab62.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab62.rpc.dto.UserDTO;
+import com.alipay.sofa.runtime.api.annotation.SofaReference;
+import com.alipay.sofa.runtime.api.annotation.SofaReferenceBinding;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+ @SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt"))
+ private UserRpcService userRpcService;
+
+ @GetMapping("/get")
+ public UserDTO get(@RequestParam("id") Integer id) {
+ return userRpcService.get(id);
+ }
+
+ @GetMapping("/add") // 为了方便测试,实际使用 @PostMapping
+ public Integer add(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ UserAddDTO addDTO = new UserAddDTO().setName(name).setGender(gender);
+ return userRpcService.add(addDTO);
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/resources/application.yaml b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/resources/application.yaml
new file mode 100644
index 000000000..f5299bd67
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/src/main/resources/application.yaml
@@ -0,0 +1,5 @@
+spring:
+ application:
+ name: user-service-consumer # 应用名
+
+com.alipay.sofa.rpc.registry.address: zookeeper://127.0.0.1:2181 # SOFARPC 注解中心
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/pom.xml b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/pom.xml
new file mode 100644
index 000000000..2ce6d8da2
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+ com.alipay.sofa
+ sofaboot-dependencies
+ 3.4.0
+
+ 4.0.0
+
+ lab-62-sofarpc-annotations-demo-user-rpc-service-provider
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-62-sofarpc-annotations-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ com.alipay.sofa
+ rpc-sofa-boot-starter
+
+
+
+
+ org.apache.curator
+ curator-framework
+
+
+
+
+
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/ProviderApplication.java b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/ProviderApplication.java
new file mode 100644
index 000000000..89c2f0b78
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/ProviderApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springboot.lab62.rpc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+//@ImportResource("classpath:sofarpc.xml")
+public class ProviderApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ProviderApplication.class, args);
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/service/UserRpcServiceImpl.java b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/service/UserRpcServiceImpl.java
new file mode 100644
index 000000000..35fee2637
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/service/UserRpcServiceImpl.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springboot.lab62.rpc.service;
+
+
+import cn.iocoder.springboot.lab62.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab62.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab62.rpc.dto.UserDTO;
+import com.alipay.sofa.runtime.api.annotation.SofaService;
+import com.alipay.sofa.runtime.api.annotation.SofaServiceBinding;
+import org.springframework.stereotype.Service;
+
+@Service
+@SofaService(bindings = @SofaServiceBinding(bindingType = "bolt"))
+public class UserRpcServiceImpl implements UserRpcService {
+
+ @Override
+ public UserDTO get(Integer id) {
+ return new UserDTO().setId(id)
+ .setName("没有昵称:" + id)
+ .setGender(id % 2 + 1); // 1 - 男;2 - 女
+ }
+
+ @Override
+ public Integer add(UserAddDTO addDTO) {
+ return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/resources/application.yaml b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/resources/application.yaml
new file mode 100644
index 000000000..9e8d2d359
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/lab-62-sofarpc-annotations-demo-user-rpc-service-provider/src/main/resources/application.yaml
@@ -0,0 +1,5 @@
+spring:
+ application:
+ name: user-service-provider # 应用名
+
+com.alipay.sofa.rpc.registry.address: zookeeper://127.0.0.1:2181 # SOFA RPC 注册中心
diff --git a/lab-62/lab-62-sofarpc-annotations-demo/pom.xml b/lab-62/lab-62-sofarpc-annotations-demo/pom.xml
new file mode 100644
index 000000000..00a8fb60a
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-annotations-demo/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ lab-62
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-62-sofarpc-annotations-demo
+ pom
+
+
+ lab-62-sofarpc-annotations-demo-user-rpc-service-api
+ lab-62-sofarpc-annotations-demo-user-rpc-service-provider
+ lab-62-sofarpc-annotations-demo-user-rpc-service-consumer
+
+
+
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/pom.xml b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/pom.xml
new file mode 100644
index 000000000..86274d12b
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ lab-62-sofarpc-xml-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-62-sofarpc-xml-demo-user-rpc-service-api
+
+
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/api/UserRpcService.java b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/api/UserRpcService.java
new file mode 100644
index 000000000..b79c3f12c
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/api/UserRpcService.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springboot.lab62.rpc.api;
+
+import cn.iocoder.springboot.lab62.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab62.rpc.dto.UserDTO;
+
+/**
+ * 用户服务 RPC Service 接口
+ */
+public interface UserRpcService {
+
+ /**
+ * 根据指定用户编号,获得用户信息
+ *
+ * @param id 用户编号
+ * @return 用户信息
+ */
+ UserDTO get(Integer id);
+
+ /**
+ * 添加新用户,返回新添加的用户编号
+ *
+ * @param addDTO 添加的用户信息
+ * @return 用户编号
+ */
+ Integer add(UserAddDTO addDTO);
+
+}
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserAddDTO.java b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserAddDTO.java
new file mode 100644
index 000000000..f0840f1c5
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserAddDTO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springboot.lab62.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户添加 DTO
+ */
+public class UserAddDTO implements Serializable {
+
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public String getName() {
+ return name;
+ }
+
+ public UserAddDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserAddDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserDTO.java b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserDTO.java
new file mode 100644
index 000000000..d9b700749
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab62/rpc/dto/UserDTO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.springboot.lab62.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户信息 DTO
+ */
+public class UserDTO implements Serializable {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDTO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+}
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/pom.xml b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/pom.xml
new file mode 100644
index 000000000..d50fd9998
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+ com.alipay.sofa
+ sofaboot-dependencies
+ 3.3.2
+
+ 4.0.0
+
+ lab-62-sofarpc-xml-demo-user-rpc-service-consumer
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-62-sofarpc-xml-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alipay.sofa
+ rpc-sofa-boot-starter
+
+
+
+
+ org.apache.curator
+ curator-framework
+
+
+
+
+
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/ConsumerApplication.java b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/ConsumerApplication.java
new file mode 100644
index 000000000..63b8f478b
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/ConsumerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab62.rpc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ImportResource;
+
+@SpringBootApplication
+@ImportResource("classpath:sofarpc.xml")
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ConsumerApplication.class, args);;
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/controller/UserController.java b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/controller/UserController.java
new file mode 100644
index 000000000..406f30cea
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab62/rpc/controller/UserController.java
@@ -0,0 +1,28 @@
+package cn.iocoder.springboot.lab62.rpc.controller;
+
+import cn.iocoder.springboot.lab62.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab62.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab62.rpc.dto.UserDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+ @Autowired
+ private UserRpcService userRpcService;
+
+ @GetMapping("/get")
+ public UserDTO get(@RequestParam("id") Integer id) {
+ return userRpcService.get(id);
+ }
+
+ @GetMapping("/add") // 为了方便测试,实际使用 @PostMapping
+ public Integer add(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ UserAddDTO addDTO = new UserAddDTO().setName(name).setGender(gender);
+ return userRpcService.add(addDTO);
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/resources/application.yaml b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/resources/application.yaml
new file mode 100644
index 000000000..f5299bd67
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/resources/application.yaml
@@ -0,0 +1,5 @@
+spring:
+ application:
+ name: user-service-consumer # 应用名
+
+com.alipay.sofa.rpc.registry.address: zookeeper://127.0.0.1:2181 # SOFARPC 注解中心
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/resources/sofarpc.xml b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/resources/sofarpc.xml
new file mode 100644
index 000000000..2437f5d53
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-consumer/src/main/resources/sofarpc.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/pom.xml b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/pom.xml
new file mode 100644
index 000000000..933e11486
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+ com.alipay.sofa
+ sofaboot-dependencies
+ 3.4.0
+
+ 4.0.0
+
+ lab-62-sofarpc-xml-demo-user-rpc-service-provider
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-62-sofarpc-xml-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ com.alipay.sofa
+ rpc-sofa-boot-starter
+
+
+
+
+ org.apache.curator
+ curator-framework
+
+
+
+
+
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/ProviderApplication.java b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/ProviderApplication.java
new file mode 100644
index 000000000..d2aef2780
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/ProviderApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab62.rpc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ImportResource;
+
+@SpringBootApplication
+@ImportResource("classpath:sofarpc.xml")
+public class ProviderApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ProviderApplication.class, args);
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/service/UserRpcServiceImpl.java b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/service/UserRpcServiceImpl.java
new file mode 100644
index 000000000..d56a0b126
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab62/rpc/service/UserRpcServiceImpl.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab62.rpc.service;
+
+
+import cn.iocoder.springboot.lab62.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab62.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab62.rpc.dto.UserDTO;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserRpcServiceImpl implements UserRpcService {
+
+ @Override
+ public UserDTO get(Integer id) {
+ return new UserDTO().setId(id)
+ .setName("没有昵称:" + id)
+ .setGender(id % 2 + 1); // 1 - 男;2 - 女
+ }
+
+ @Override
+ public Integer add(UserAddDTO addDTO) {
+ return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
+ }
+
+}
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/resources/application.yaml b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/resources/application.yaml
new file mode 100644
index 000000000..9e8d2d359
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/resources/application.yaml
@@ -0,0 +1,5 @@
+spring:
+ application:
+ name: user-service-provider # 应用名
+
+com.alipay.sofa.rpc.registry.address: zookeeper://127.0.0.1:2181 # SOFA RPC 注册中心
diff --git a/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/resources/sofarpc.xml b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/resources/sofarpc.xml
new file mode 100644
index 000000000..44c6492cd
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/lab-62-sofarpc-xml-demo-user-rpc-service-provider/src/main/resources/sofarpc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/lab-62/lab-62-sofarpc-xml-demo/pom.xml b/lab-62/lab-62-sofarpc-xml-demo/pom.xml
new file mode 100644
index 000000000..744ec1c4f
--- /dev/null
+++ b/lab-62/lab-62-sofarpc-xml-demo/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ lab-62
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-62-sofarpc-xml-demo
+ pom
+
+ lab-62-sofarpc-xml-demo-user-rpc-service-api
+ lab-62-sofarpc-xml-demo-user-rpc-service-provider
+ lab-62-sofarpc-xml-demo-user-rpc-service-consumer
+
+
+
diff --git a/lab-62/pom.xml b/lab-62/pom.xml
new file mode 100644
index 000000000..ada99022c
--- /dev/null
+++ b/lab-62/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-62
+ pom
+
+
+ lab-62-sofarpc-xml-demo
+ lab-62-sofarpc-annotations-demo
+
+
+
diff --git "a/lab-62/\343\200\212\350\212\213\351\201\223 Spring Boot SOFARPC \345\205\245\351\227\250\343\200\213.md" "b/lab-62/\343\200\212\350\212\213\351\201\223 Spring Boot SOFARPC \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..75bb7bf46
--- /dev/null
+++ "b/lab-62/\343\200\212\350\212\213\351\201\223 Spring Boot SOFARPC \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/pom.xml b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/pom.xml
new file mode 100644
index 000000000..f09acb3e9
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ lab-63-motan-annotations-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-annotations-demo-user-rpc-service-api
+
+
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/api/UserRpcService.java b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/api/UserRpcService.java
new file mode 100644
index 000000000..158785180
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/api/UserRpcService.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springboot.lab63.rpc.api;
+
+import cn.iocoder.springboot.lab63.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab63.rpc.dto.UserDTO;
+
+/**
+ * 用户服务 RPC Service 接口
+ */
+public interface UserRpcService {
+
+ /**
+ * 根据指定用户编号,获得用户信息
+ *
+ * @param id 用户编号
+ * @return 用户信息
+ */
+ UserDTO get(Integer id);
+
+ /**
+ * 添加新用户,返回新添加的用户编号
+ *
+ * @param addDTO 添加的用户信息
+ * @return 用户编号
+ */
+ Integer add(UserAddDTO addDTO);
+
+}
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserAddDTO.java b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserAddDTO.java
new file mode 100644
index 000000000..292297614
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserAddDTO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springboot.lab63.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户添加 DTO
+ */
+public class UserAddDTO implements Serializable {
+
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public String getName() {
+ return name;
+ }
+
+ public UserAddDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserAddDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+}
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserDTO.java b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserDTO.java
new file mode 100644
index 000000000..b6941d1ee
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserDTO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.springboot.lab63.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户信息 DTO
+ */
+public class UserDTO implements Serializable {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDTO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+}
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/pom.xml b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/pom.xml
new file mode 100644
index 000000000..ed4de02dc
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+ lab-63-motan-annotations-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-annotations-demo-user-rpc-service-consumer
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ 1.1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-63-motan-annotations-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.weibo
+ motan-core
+ ${moton.version}
+
+
+ com.weibo
+ motan-transport-netty4
+ ${moton.version}
+
+
+ com.weibo
+ motan-registry-zookeeper
+ ${moton.version}
+
+
+ com.weibo
+ motan-springsupport
+ ${moton.version}
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/ConsumerApplication.java b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/ConsumerApplication.java
new file mode 100644
index 000000000..b51093c78
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/ConsumerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab63.rpc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ImportResource;
+
+@SpringBootApplication
+@ImportResource("classpath:motan.xml")
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ConsumerApplication.class, args);;
+ }
+
+}
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/controller/UserController.java b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/controller/UserController.java
new file mode 100644
index 000000000..5c3f43b2a
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/controller/UserController.java
@@ -0,0 +1,32 @@
+package cn.iocoder.springboot.lab63.rpc.controller;
+
+import cn.iocoder.springboot.lab63.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab63.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab63.rpc.dto.UserDTO;
+import com.weibo.api.motan.config.springsupport.annotation.MotanReferer;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+// @Autowired
+ @MotanReferer
+ private UserRpcService userRpcService;
+
+ @GetMapping("/get")
+ public UserDTO get(@RequestParam("id") Integer id) {
+ return userRpcService.get(id);
+ }
+
+ @GetMapping("/add") // 为了方便测试,实际使用 @PostMapping
+ public Integer add(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ UserAddDTO addDTO = new UserAddDTO().setName(name).setGender(gender);
+ return userRpcService.add(addDTO);
+ }
+
+}
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/resources/motan.xml b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/resources/motan.xml
new file mode 100644
index 000000000..fad844d39
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-consumer/src/main/resources/motan.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/pom.xml b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/pom.xml
new file mode 100644
index 000000000..9597fa63c
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+ lab-63-motan-annotations-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-annotations-demo-user-rpc-service-provider
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ 1.1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-63-motan-annotations-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ com.weibo
+ motan-core
+ ${moton.version}
+
+
+ com.weibo
+ motan-transport-netty4
+ ${moton.version}
+
+
+ com.weibo
+ motan-registry-zookeeper
+ ${moton.version}
+
+
+ com.weibo
+ motan-springsupport
+ ${moton.version}
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/ProviderApplication.java b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/ProviderApplication.java
new file mode 100644
index 000000000..ec3623698
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/ProviderApplication.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springboot.lab63.rpc;
+
+import com.weibo.api.motan.common.MotanConstants;
+import com.weibo.api.motan.util.MotanSwitcherUtil;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ImportResource;
+
+@SpringBootApplication
+@ImportResource("classpath:motan.xml")
+public class ProviderApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ProviderApplication.class, args);
+ // 设置 Motan 开启对外服务
+ MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);
+ }
+
+}
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/service/UserRpcServiceImpl.java b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/service/UserRpcServiceImpl.java
new file mode 100644
index 000000000..3845c76b8
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/service/UserRpcServiceImpl.java
@@ -0,0 +1,26 @@
+package cn.iocoder.springboot.lab63.rpc.service;
+
+
+import cn.iocoder.springboot.lab63.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab63.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab63.rpc.dto.UserDTO;
+import com.weibo.api.motan.config.springsupport.annotation.MotanService;
+import org.springframework.stereotype.Service;
+
+@Service
+@MotanService(export = "motan2:8001")
+public class UserRpcServiceImpl implements UserRpcService {
+
+ @Override
+ public UserDTO get(Integer id) {
+ return new UserDTO().setId(id)
+ .setName("没有昵称:" + id)
+ .setGender(id % 2 + 1); // 1 - 男;2 - 女
+ }
+
+ @Override
+ public Integer add(UserAddDTO addDTO) {
+ return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
+ }
+
+}
diff --git a/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/resources/motan.xml b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/resources/motan.xml
new file mode 100644
index 000000000..71250dd0d
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/lab-63-motan-annotations-demo-user-rpc-service-provider/src/main/resources/motan.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-annotations-demo/pom.xml b/lab-63/lab-63-motan-annotations-demo/pom.xml
new file mode 100644
index 000000000..de6847d74
--- /dev/null
+++ b/lab-63/lab-63-motan-annotations-demo/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ lab-63
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-annotations-demo
+ pom
+
+ lab-63-motan-annotations-demo-user-rpc-service-api
+ lab-63-motan-annotations-demo-user-rpc-service-provider
+ lab-63-motan-annotations-demo-user-rpc-service-consumer
+
+
+
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/pom.xml b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/pom.xml
new file mode 100644
index 000000000..76a90d3f5
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ lab-63-motan-xml-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-xml-demo-user-rpc-service-api
+
+
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/api/UserRpcService.java b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/api/UserRpcService.java
new file mode 100644
index 000000000..158785180
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/api/UserRpcService.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springboot.lab63.rpc.api;
+
+import cn.iocoder.springboot.lab63.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab63.rpc.dto.UserDTO;
+
+/**
+ * 用户服务 RPC Service 接口
+ */
+public interface UserRpcService {
+
+ /**
+ * 根据指定用户编号,获得用户信息
+ *
+ * @param id 用户编号
+ * @return 用户信息
+ */
+ UserDTO get(Integer id);
+
+ /**
+ * 添加新用户,返回新添加的用户编号
+ *
+ * @param addDTO 添加的用户信息
+ * @return 用户编号
+ */
+ Integer add(UserAddDTO addDTO);
+
+}
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserAddDTO.java b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserAddDTO.java
new file mode 100644
index 000000000..292297614
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserAddDTO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springboot.lab63.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户添加 DTO
+ */
+public class UserAddDTO implements Serializable {
+
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public String getName() {
+ return name;
+ }
+
+ public UserAddDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserAddDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+}
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserDTO.java b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserDTO.java
new file mode 100644
index 000000000..b6941d1ee
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-api/src/main/java/cn/iocoder/springboot/lab63/rpc/dto/UserDTO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.springboot.lab63.rpc.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户信息 DTO
+ */
+public class UserDTO implements Serializable {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDTO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+}
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/pom.xml b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/pom.xml
new file mode 100644
index 000000000..46f2e2c12
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+ lab-63-motan-xml-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-xml-demo-user-rpc-service-consumer
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ 1.1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-63-motan-xml-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.weibo
+ motan-core
+ ${moton.version}
+
+
+ com.weibo
+ motan-transport-netty4
+ ${moton.version}
+
+
+ com.weibo
+ motan-registry-zookeeper
+ ${moton.version}
+
+
+ com.weibo
+ motan-springsupport
+ ${moton.version}
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/ConsumerApplication.java b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/ConsumerApplication.java
new file mode 100644
index 000000000..b51093c78
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/ConsumerApplication.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab63.rpc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ImportResource;
+
+@SpringBootApplication
+@ImportResource("classpath:motan.xml")
+public class ConsumerApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ConsumerApplication.class, args);;
+ }
+
+}
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/controller/UserController.java b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/controller/UserController.java
new file mode 100644
index 000000000..38221966f
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/java/cn/iocoder/springboot/lab63/rpc/controller/UserController.java
@@ -0,0 +1,28 @@
+package cn.iocoder.springboot.lab63.rpc.controller;
+
+import cn.iocoder.springboot.lab63.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab63.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab63.rpc.dto.UserDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+ @Autowired
+ private UserRpcService userRpcService;
+
+ @GetMapping("/get")
+ public UserDTO get(@RequestParam("id") Integer id) {
+ return userRpcService.get(id);
+ }
+
+ @GetMapping("/add") // 为了方便测试,实际使用 @PostMapping
+ public Integer add(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ UserAddDTO addDTO = new UserAddDTO().setName(name).setGender(gender);
+ return userRpcService.add(addDTO);
+ }
+
+}
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/resources/motan.xml b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/resources/motan.xml
new file mode 100644
index 000000000..1120a8094
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-consumer/src/main/resources/motan.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/pom.xml b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/pom.xml
new file mode 100644
index 000000000..a8e78cbf2
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+ lab-63-motan-xml-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-xml-demo-user-rpc-service-provider
+
+
+ 1.8
+ 1.8
+ 2.2.4.RELEASE
+ 1.1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-63-motan-xml-demo-user-rpc-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ com.weibo
+ motan-core
+ ${moton.version}
+
+
+ com.weibo
+ motan-transport-netty4
+ ${moton.version}
+
+
+ com.weibo
+ motan-registry-zookeeper
+ ${moton.version}
+
+
+ com.weibo
+ motan-springsupport
+ ${moton.version}
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/ProviderApplication.java b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/ProviderApplication.java
new file mode 100644
index 000000000..ec3623698
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/ProviderApplication.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springboot.lab63.rpc;
+
+import com.weibo.api.motan.common.MotanConstants;
+import com.weibo.api.motan.util.MotanSwitcherUtil;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ImportResource;
+
+@SpringBootApplication
+@ImportResource("classpath:motan.xml")
+public class ProviderApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(ProviderApplication.class, args);
+ // 设置 Motan 开启对外服务
+ MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);
+ }
+
+}
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/service/UserRpcServiceImpl.java b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/service/UserRpcServiceImpl.java
new file mode 100644
index 000000000..303f8da11
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/java/cn/iocoder/springboot/lab63/rpc/service/UserRpcServiceImpl.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab63.rpc.service;
+
+
+import cn.iocoder.springboot.lab63.rpc.api.UserRpcService;
+import cn.iocoder.springboot.lab63.rpc.dto.UserAddDTO;
+import cn.iocoder.springboot.lab63.rpc.dto.UserDTO;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserRpcServiceImpl implements UserRpcService {
+
+ @Override
+ public UserDTO get(Integer id) {
+ return new UserDTO().setId(id)
+ .setName("没有昵称:" + id)
+ .setGender(id % 2 + 1); // 1 - 男;2 - 女
+ }
+
+ @Override
+ public Integer add(UserAddDTO addDTO) {
+ return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
+ }
+
+}
diff --git a/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/resources/motan.xml b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/resources/motan.xml
new file mode 100644
index 000000000..f26f1acce
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/lab-63-motan-xml-demo-user-rpc-service-provider/src/main/resources/motan.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-63/lab-63-motan-xml-demo/pom.xml b/lab-63/lab-63-motan-xml-demo/pom.xml
new file mode 100644
index 000000000..846a599b8
--- /dev/null
+++ b/lab-63/lab-63-motan-xml-demo/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ lab-63
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63-motan-xml-demo
+ pom
+
+ lab-63-motan-xml-demo-user-rpc-service-api
+ lab-63-motan-xml-demo-user-rpc-service-provider
+ lab-63-motan-xml-demo-user-rpc-service-consumer
+
+
+
diff --git a/lab-63/pom.xml b/lab-63/pom.xml
new file mode 100644
index 000000000..a16873b13
--- /dev/null
+++ b/lab-63/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-63
+
+
+ lab-63-motan-xml-demo
+ lab-63-motan-annotations-demo
+
+
+
diff --git "a/lab-63/\343\200\212\350\212\213\351\201\223 Spring Boot Motan \345\205\245\351\227\250\343\200\213.md" "b/lab-63/\343\200\212\350\212\213\351\201\223 Spring Boot Motan \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..42b28dc7a
--- /dev/null
+++ "b/lab-63/\343\200\212\350\212\213\351\201\223 Spring Boot Motan \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/pom.xml b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/pom.xml
new file mode 100644
index 000000000..ab73d9317
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/pom.xml
@@ -0,0 +1,57 @@
+
+
+
+ lab-64-grpc-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-demo-application
+
+
+
+ 1.23.0
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-64-grpc-demo-user-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ io.grpc
+ grpc-netty
+ ${io.grpc.version}
+
+
+
+
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/DemoApplication.java b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/DemoApplication.java
new file mode 100644
index 000000000..a7b0d8b19
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/DemoApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab64.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/config/GrpcConfig.java b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/config/GrpcConfig.java
new file mode 100644
index 000000000..801b2250a
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/config/GrpcConfig.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springboot.lab64.demo.config;
+
+import cn.iocoder.springboot.lab64.userservice.api.UserServiceGrpc;
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GrpcConfig {
+
+ private static final Integer GRPC_PORT = 8888;
+
+ @Bean
+ public ManagedChannel userGrpcManagedChannel() {
+ return ManagedChannelBuilder.forAddress("127.0.0.1", GRPC_PORT).usePlaintext().build();
+ }
+
+ @Bean
+ public UserServiceGrpc.UserServiceBlockingStub userServiceGrpc() {
+ // 创建 ManagedChannel 对象
+ ManagedChannel userGrpcManagedChannel = this.userGrpcManagedChannel();
+ // 创建 UserServiceGrpc 对象
+ return UserServiceGrpc.newBlockingStub(userGrpcManagedChannel);
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/controller/DemoController.java b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/controller/DemoController.java
new file mode 100644
index 000000000..857698eee
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-application/src/main/java/cn/iocoder/springboot/lab64/demo/controller/DemoController.java
@@ -0,0 +1,39 @@
+package cn.iocoder.springboot.lab64.demo.controller;
+
+import cn.iocoder.springboot.lab64.userservice.api.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private UserServiceGrpc.UserServiceBlockingStub userServiceGrpc;
+
+ @GetMapping("/get")
+ public String get(@RequestParam("id") Integer id) {
+ // 创建请求
+ UserGetRequest request = UserGetRequest.newBuilder().setId(id).build();
+ // 执行 gRPC 请求
+ UserGetResponse response = userServiceGrpc.get(request);
+ // 响应
+ return response.getName();
+ }
+
+ @GetMapping("/create") // 为了方便测试,实际使用 @PostMapping
+ public Integer create(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ // 创建请求
+ UserCreateRequest request = UserCreateRequest.newBuilder()
+ .setName(name).setGender(gender).build();
+ // 执行 gRPC 请求
+ UserCreateResponse response = userServiceGrpc.create(request);
+ // 响应
+ return response.getId();
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service-api/pom.xml b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service-api/pom.xml
new file mode 100644
index 000000000..3ea70853b
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service-api/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+ lab-64-grpc-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-demo-user-service-api
+
+
+
+ 1.30.0
+
+ 1.8
+ 1.8
+ 1.6.2
+ 0.6.1
+
+
+
+
+
+ io.grpc
+ grpc-protobuf
+ ${io.grpc.version}
+
+
+
+ io.grpc
+ grpc-stub
+ ${io.grpc.version}
+
+
+
+
+
+
+
+ kr.motd.maven
+ os-maven-plugin
+ ${os-maven-plugin.version}
+
+
+
+
+
+ org.xolstice.maven.plugins
+ protobuf-maven-plugin
+ ${protobuf-maven-plugin.version}
+
+ grpc-java
+ com.google.protobuf:protoc:3.9.1:exe:${os.detected.classifier}
+ io.grpc:protoc-gen-grpc-java:${io.grpc.version}:exe:${os.detected.classifier}
+
+
+
+
+ compile
+ compile-custom
+
+
+
+
+
+
+
+
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service-api/src/main/proto/UserService.proto b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service-api/src/main/proto/UserService.proto
new file mode 100644
index 000000000..c3c6ef211
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service-api/src/main/proto/UserService.proto
@@ -0,0 +1,31 @@
+syntax = "proto3";
+option java_multiple_files = true;
+
+package cn.iocoder.springboot.lab64.userservice.api;
+
+message UserGetRequest {
+ int32 id = 1;
+}
+
+message UserGetResponse {
+ int32 id = 1;
+ string name = 2;
+ int32 gender = 3;
+}
+
+message UserCreateRequest {
+ string name = 1;
+ int32 gender = 2;
+}
+
+message UserCreateResponse {
+ int32 id = 1;
+}
+
+service UserService {
+
+ rpc get(UserGetRequest) returns (UserGetResponse);
+
+ rpc create(UserCreateRequest) returns (UserCreateResponse);
+
+}
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/pom.xml b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/pom.xml
new file mode 100644
index 000000000..49e81154e
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/pom.xml
@@ -0,0 +1,57 @@
+
+
+
+ lab-64-grpc-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-demo-user-service
+
+
+
+ 1.30.0
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-64-grpc-demo-user-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ io.grpc
+ grpc-netty
+ ${io.grpc.version}
+
+
+
+
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/UserServiceApplication.java b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/UserServiceApplication.java
new file mode 100644
index 000000000..e588f0bf8
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/UserServiceApplication.java
@@ -0,0 +1,18 @@
+package cn.iocoder.springboot.lab64.userservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import java.util.concurrent.CountDownLatch;
+
+@SpringBootApplication
+public class UserServiceApplication {
+
+ public static void main(String[] args) throws InterruptedException {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(UserServiceApplication.class, args);
+ // 阻塞,避免应用退出
+ new CountDownLatch(1).await();
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/config/GrpcConfig.java b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/config/GrpcConfig.java
new file mode 100644
index 000000000..a593124c8
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/config/GrpcConfig.java
@@ -0,0 +1,35 @@
+package cn.iocoder.springboot.lab64.userservice.config;
+
+import cn.iocoder.springboot.lab64.userservice.rpc.UserServiceGrpcImpl;
+import io.grpc.Server;
+import io.grpc.ServerBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.IOException;
+
+@Configuration
+public class GrpcConfig {
+
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ /**
+ * gRPC Server 端口
+ */
+ private static final Integer GRPC_PORT = 8888;
+
+ @Bean
+ public Server grpcServer(final UserServiceGrpcImpl userServiceGrpc) throws IOException {
+ // 创建 gRPC Server 对象
+ Server server = ServerBuilder.forPort(GRPC_PORT)
+ .addService(userServiceGrpc)
+ .build();
+ // 启动 gRPC Server
+ server.start();
+ logger.info("[grpcServer][启动完成,端口为({})]", server.getPort());
+ return server;
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/rpc/UserServiceGrpcImpl.java b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/rpc/UserServiceGrpcImpl.java
new file mode 100644
index 000000000..ec289a581
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/lab-64-grpc-demo-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/rpc/UserServiceGrpcImpl.java
@@ -0,0 +1,32 @@
+package cn.iocoder.springboot.lab64.userservice.rpc;
+
+import cn.iocoder.springboot.lab64.userservice.api.*;
+import io.grpc.stub.StreamObserver;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserServiceGrpcImpl extends UserServiceGrpc.UserServiceImplBase {
+
+ @Override
+ public void get(UserGetRequest request, StreamObserver responseObserver) {
+ // 创建响应对象
+ UserGetResponse.Builder builder = UserGetResponse.newBuilder();
+ builder.setId(request.getId())
+ .setName("没有昵称:" + request.getId())
+ .setGender(request.getId() % 2 + 1);
+ // 返回响应
+ responseObserver.onNext(builder.build());
+ responseObserver.onCompleted();
+ }
+
+ @Override
+ public void create(UserCreateRequest request, StreamObserver responseObserver) {
+ // 创建响应对象
+ UserCreateResponse.Builder builder = UserCreateResponse.newBuilder();
+ builder.setId((int) (System.currentTimeMillis() / 1000));
+ // 返回响应
+ responseObserver.onNext(builder.build());
+ responseObserver.onCompleted();
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-demo/pom.xml b/lab-64/lab-64-grpc-demo/pom.xml
new file mode 100644
index 000000000..d724e9314
--- /dev/null
+++ b/lab-64/lab-64-grpc-demo/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ lab-64
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-demo
+ pom
+
+ lab-64-grpc-demo-user-service
+ lab-64-grpc-demo-user-service-api
+ lab-64-grpc-demo-application
+
+
+
+
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/pom.xml b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/pom.xml
new file mode 100644
index 000000000..a82dd0a6e
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+ lab-64-grpc-starter
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-starter-application
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-64-grpc-starter-user-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ net.devh
+ grpc-client-spring-boot-starter
+ 2.8.0.RELEASE
+
+
+
+
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/java/cn/iocoder/springboot/lab64/demo/DemoApplication.java b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/java/cn/iocoder/springboot/lab64/demo/DemoApplication.java
new file mode 100644
index 000000000..a7b0d8b19
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/java/cn/iocoder/springboot/lab64/demo/DemoApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab64.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/java/cn/iocoder/springboot/lab64/demo/controller/DemoController.java b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/java/cn/iocoder/springboot/lab64/demo/controller/DemoController.java
new file mode 100644
index 000000000..3fdc7c845
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/java/cn/iocoder/springboot/lab64/demo/controller/DemoController.java
@@ -0,0 +1,39 @@
+package cn.iocoder.springboot.lab64.demo.controller;
+
+import cn.iocoder.springboot.lab64.userservice.api.*;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @GrpcClient("userService")
+ private UserServiceGrpc.UserServiceBlockingStub userServiceGrpc;
+
+ @GetMapping("/get")
+ public String get(@RequestParam("id") Integer id) {
+ // 创建请求
+ UserGetRequest request = UserGetRequest.newBuilder().setId(id).build();
+ // 执行 gRPC 请求
+ UserGetResponse response = userServiceGrpc.get(request);
+ // 响应
+ return response.getName();
+ }
+
+ @GetMapping("/create") // 为了方便测试,实际使用 @PostMapping
+ public Integer create(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ // 创建请求
+ UserCreateRequest request = UserCreateRequest.newBuilder()
+ .setName(name).setGender(gender).build();
+ // 执行 gRPC 请求
+ UserCreateResponse response = userServiceGrpc.create(request);
+ // 响应
+ return response.getId();
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/resources/application.yml b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/resources/application.yml
new file mode 100644
index 000000000..4c429ab86
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-application/src/main/resources/application.yml
@@ -0,0 +1,6 @@
+grpc:
+ # gRPC 客户端配置,对应 GrpcChannelsProperties 配置类的映射
+ client:
+ userService:
+ address: 'static://127.0.0.1:8888' # 用户服务的地址
+ negotiation-type: plaintext
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service-api/pom.xml b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service-api/pom.xml
new file mode 100644
index 000000000..3fe23cc32
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service-api/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+ lab-64-grpc-starter
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-starter-user-service-api
+
+
+
+ 1.30.0
+
+ 1.8
+ 1.8
+ 1.6.2
+ 0.6.1
+
+
+
+
+
+ io.grpc
+ grpc-protobuf
+ ${io.grpc.version}
+
+
+
+ io.grpc
+ grpc-stub
+ ${io.grpc.version}
+
+
+
+
+
+
+
+ kr.motd.maven
+ os-maven-plugin
+ ${os-maven-plugin.version}
+
+
+
+
+
+ org.xolstice.maven.plugins
+ protobuf-maven-plugin
+ ${protobuf-maven-plugin.version}
+
+ grpc-java
+ com.google.protobuf:protoc:3.9.1:exe:${os.detected.classifier}
+ io.grpc:protoc-gen-grpc-java:${io.grpc.version}:exe:${os.detected.classifier}
+
+
+
+
+ compile
+ compile-custom
+
+
+
+
+
+
+
+
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service-api/src/main/proto/UserService.proto b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service-api/src/main/proto/UserService.proto
new file mode 100644
index 000000000..c3c6ef211
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service-api/src/main/proto/UserService.proto
@@ -0,0 +1,31 @@
+syntax = "proto3";
+option java_multiple_files = true;
+
+package cn.iocoder.springboot.lab64.userservice.api;
+
+message UserGetRequest {
+ int32 id = 1;
+}
+
+message UserGetResponse {
+ int32 id = 1;
+ string name = 2;
+ int32 gender = 3;
+}
+
+message UserCreateRequest {
+ string name = 1;
+ int32 gender = 2;
+}
+
+message UserCreateResponse {
+ int32 id = 1;
+}
+
+service UserService {
+
+ rpc get(UserGetRequest) returns (UserGetResponse);
+
+ rpc create(UserCreateRequest) returns (UserCreateResponse);
+
+}
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/pom.xml b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/pom.xml
new file mode 100644
index 000000000..019efab03
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+ lab-64-grpc-starter
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-starter-user-service
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-64-grpc-starter-user-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ net.devh
+ grpc-server-spring-boot-starter
+ 2.8.0.RELEASE
+
+
+
+
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/UserServiceApplication.java b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/UserServiceApplication.java
new file mode 100644
index 000000000..78f2966f6
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/UserServiceApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab64.userservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UserServiceApplication {
+
+ public static void main(String[] args) throws InterruptedException {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(UserServiceApplication.class, args);
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/rpc/UserServiceGrpcImpl.java b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/rpc/UserServiceGrpcImpl.java
new file mode 100644
index 000000000..2e9068435
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/java/cn/iocoder/springboot/lab64/userservice/rpc/UserServiceGrpcImpl.java
@@ -0,0 +1,32 @@
+package cn.iocoder.springboot.lab64.userservice.rpc;
+
+import cn.iocoder.springboot.lab64.userservice.api.*;
+import io.grpc.stub.StreamObserver;
+import net.devh.boot.grpc.server.service.GrpcService;
+
+@GrpcService
+public class UserServiceGrpcImpl extends UserServiceGrpc.UserServiceImplBase {
+
+ @Override
+ public void get(UserGetRequest request, StreamObserver responseObserver) {
+ // 创建响应对象
+ UserGetResponse.Builder builder = UserGetResponse.newBuilder();
+ builder.setId(request.getId())
+ .setName("没有昵称:" + request.getId())
+ .setGender(request.getId() % 2 + 1);
+ // 返回响应
+ responseObserver.onNext(builder.build());
+ responseObserver.onCompleted();
+ }
+
+ @Override
+ public void create(UserCreateRequest request, StreamObserver responseObserver) {
+ // 创建响应对象
+ UserCreateResponse.Builder builder = UserCreateResponse.newBuilder();
+ builder.setId((int) (System.currentTimeMillis() / 1000));
+ // 返回响应
+ responseObserver.onNext(builder.build());
+ responseObserver.onCompleted();
+ }
+
+}
diff --git a/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/resources/application.yml b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/resources/application.yml
new file mode 100644
index 000000000..15c20088b
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/lab-64-grpc-starter-user-service/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+grpc:
+ # gRPC 服务器配置,对应 GrpcServerProperties 配置类
+ server:
+ port: 8888
diff --git a/lab-64/lab-64-grpc-starter/pom.xml b/lab-64/lab-64-grpc-starter/pom.xml
new file mode 100644
index 000000000..aefca10b8
--- /dev/null
+++ b/lab-64/lab-64-grpc-starter/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ lab-64
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64-grpc-starter
+ pom
+
+ lab-64-grpc-starter-user-service
+ lab-64-grpc-starter-user-service-api
+ lab-64-grpc-starter-application
+
+
+
+
diff --git a/lab-64/pom.xml b/lab-64/pom.xml
new file mode 100644
index 000000000..95b3bb1fa
--- /dev/null
+++ b/lab-64/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-64
+
+ pom
+
+ lab-64-grpc-demo
+ lab-64-grpc-starter
+
+
+
diff --git "a/lab-64/\343\200\212\350\212\213\351\201\223 Spring Boot gRPC \345\205\245\351\227\250\343\200\213.md" "b/lab-64/\343\200\212\350\212\213\351\201\223 Spring Boot gRPC \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..57f8cb1af
--- /dev/null
+++ "b/lab-64/\343\200\212\350\212\213\351\201\223 Spring Boot gRPC \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/pom.xml b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/pom.xml
new file mode 100644
index 000000000..baf7310ed
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/pom.xml
@@ -0,0 +1,74 @@
+
+
+
+ lab-65-cxf-ws-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65-cxf-ws-demo-application
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.apache.cxf
+ cxf-spring-boot-starter-jaxws
+ 3.3.6
+
+
+
+
+
+
+
+ org.apache.cxf
+ cxf-codegen-plugin
+ 3.2.5
+
+
+ generate-sources
+ generate-sources
+
+
+
+
+ src/main/resources/wsdl/user.wsdl
+ classpath:wsdl/user.wsdl
+
+
+
+ ${project.build.directory}/generated/cxf
+
+
+ wsdl2java
+
+
+
+
+
+
+
+
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/DemoApplication.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/DemoApplication.java
new file mode 100644
index 000000000..1a3adfe72
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/DemoApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab65.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/config/CXFConfig.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/config/CXFConfig.java
new file mode 100644
index 000000000..08defc3c3
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/config/CXFConfig.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springboot.lab65.demo.config;
+
+import https.github_com.yunaiv.springboot_labs.tree.master.lab_65.lab_65_cxf_ws_demo.UserService;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class CXFConfig {
+
+ @Bean
+ public UserService userService() {
+ JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
+ // 设置 UserService 接口
+ jaxWsProxyFactoryBean.setServiceClass(UserService.class);
+ // 设置 Web Services 地址
+ jaxWsProxyFactoryBean.setAddress("http://127.0.0.1:9090/ws/user");
+ // 创建
+ return (UserService) jaxWsProxyFactoryBean.create();
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java
new file mode 100644
index 000000000..a47fa99f2
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java
@@ -0,0 +1,40 @@
+package cn.iocoder.springboot.lab65.demo.controller;
+
+import https.github_com.yunaiv.springboot_labs.tree.master.lab_65.lab_65_cxf_ws_demo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private UserService userService;
+
+ @GetMapping("/get")
+ public String get(@RequestParam("id") Integer id) {
+ UserGetRequest request = new UserGetRequest();
+ request.setId(id);
+ // 执行 Web Services 请求
+ UserGetResponse response = userService.get(request);
+ // 响应
+ return response.getName();
+ }
+
+ @GetMapping("/create") // 为了方便测试,实际使用 @PostMapping
+ public Integer create(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ // 请求
+ UserCreateRequest request = new UserCreateRequest();
+ request.setName(name);
+ request.setGender(gender);
+ // 执行 Web Services 请求
+ UserCreateResponse response = userService.create(request);
+ // 响应
+ return response.getId();
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/resources/wsdl/user.wsdl b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/resources/wsdl/user.wsdl
new file mode 100644
index 000000000..f6ff60d50
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-application/src/main/resources/wsdl/user.wsdl
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/pom.xml b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/pom.xml
new file mode 100644
index 000000000..142fa8159
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/pom.xml
@@ -0,0 +1,43 @@
+
+
+
+ lab-65-spring-ws-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65-cxf-ws-demo-user-service
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.apache.cxf
+ cxf-spring-boot-starter-jaxws
+ 3.3.6
+
+
+
+
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/UserServiceApplication.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/UserServiceApplication.java
new file mode 100644
index 000000000..b76a9450f
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/UserServiceApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab65.userservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UserServiceApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(UserServiceApplication.class, args);
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/config/CXFConfig.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/config/CXFConfig.java
new file mode 100644
index 000000000..2ad37024b
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/config/CXFConfig.java
@@ -0,0 +1,28 @@
+package cn.iocoder.springboot.lab65.userservice.config;
+
+import cn.iocoder.springboot.lab65.userservice.service.UserService;
+import org.apache.cxf.Bus;
+import org.apache.cxf.bus.spring.SpringBus;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.xml.ws.Endpoint;
+
+@Configuration
+public class CXFConfig {
+
+ public static final String NAMESPACE_URI = "https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-65/lab-65-cxf-ws-demo";
+
+ @Bean(name = Bus.DEFAULT_BUS_ID)
+ public SpringBus springBus() {
+ return new SpringBus();
+ }
+
+ @Bean
+ public Endpoint userServiceEndpoint(UserService userService) {
+ Endpoint endpoint = Endpoint.create(userService);
+ endpoint.publish("/user");//发布地址
+ return endpoint;
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/request/UserCreateRequest.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/request/UserCreateRequest.java
new file mode 100644
index 000000000..e375f6f6b
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/request/UserCreateRequest.java
@@ -0,0 +1,35 @@
+package cn.iocoder.springboot.lab65.userservice.request;
+
+/**
+ * 创建用户信息 Request
+ */
+public class UserCreateRequest {
+
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别别
+ */
+ private Integer gender;
+
+ public String getName() {
+ return name;
+ }
+
+ public UserCreateRequest setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserCreateRequest setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/request/UserGetRequest.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/request/UserGetRequest.java
new file mode 100644
index 000000000..e31db6a5c
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/request/UserGetRequest.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springboot.lab65.userservice.request;
+
+/**
+ * 获得用户信息 Request
+ */
+public class UserGetRequest {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserGetRequest setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/response/UserCreateResponse.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/response/UserCreateResponse.java
new file mode 100644
index 000000000..465176ff4
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/response/UserCreateResponse.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springboot.lab65.userservice.response;
+
+/**
+ * 创建用户信息 Response
+ */
+public class UserCreateResponse {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserCreateResponse setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/response/UserGetResponse.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/response/UserGetResponse.java
new file mode 100644
index 000000000..684587482
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/response/UserGetResponse.java
@@ -0,0 +1,47 @@
+package cn.iocoder.springboot.lab65.userservice.response;
+
+/**
+ * 获得用户信息 Response
+ */
+public class UserGetResponse {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserGetResponse setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserGetResponse setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserGetResponse setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/service/UserService.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/service/UserService.java
new file mode 100644
index 000000000..7ff052fcb
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/service/UserService.java
@@ -0,0 +1,18 @@
+package cn.iocoder.springboot.lab65.userservice.service;
+
+import cn.iocoder.springboot.lab65.userservice.config.CXFConfig;
+import cn.iocoder.springboot.lab65.userservice.request.UserCreateRequest;
+import cn.iocoder.springboot.lab65.userservice.request.UserGetRequest;
+import cn.iocoder.springboot.lab65.userservice.response.UserCreateResponse;
+import cn.iocoder.springboot.lab65.userservice.response.UserGetResponse;
+
+import javax.jws.WebService;
+
+@WebService(targetNamespace = CXFConfig.NAMESPACE_URI)
+public interface UserService {
+
+ UserGetResponse get(UserGetRequest request);
+
+ UserCreateResponse create(UserCreateRequest request);
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/service/UserServiceImpl.java b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/service/UserServiceImpl.java
new file mode 100644
index 000000000..e7510be56
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/service/UserServiceImpl.java
@@ -0,0 +1,35 @@
+package cn.iocoder.springboot.lab65.userservice.service;
+
+import cn.iocoder.springboot.lab65.userservice.config.CXFConfig;
+import cn.iocoder.springboot.lab65.userservice.request.UserCreateRequest;
+import cn.iocoder.springboot.lab65.userservice.request.UserGetRequest;
+import cn.iocoder.springboot.lab65.userservice.response.UserCreateResponse;
+import cn.iocoder.springboot.lab65.userservice.response.UserGetResponse;
+import org.springframework.stereotype.Service;
+
+import javax.jws.WebService;
+
+@Service
+@WebService(
+ serviceName = "userService", // 服务名称
+ targetNamespace = CXFConfig.NAMESPACE_URI // Namespace 命名空间
+)
+public class UserServiceImpl implements UserService {
+
+ @Override
+ public UserGetResponse get(UserGetRequest request) {
+ UserGetResponse response = new UserGetResponse();
+ response.setId(request.getId());
+ response.setName("没有昵称:" + request.getId());
+ response.setGender(request.getId() % 2 + 1);
+ return response;
+ }
+
+ @Override
+ public UserCreateResponse create(UserCreateRequest request) {
+ UserCreateResponse response = new UserCreateResponse();
+ response.setId((int) (System.currentTimeMillis() / 1000));
+ return response;
+ }
+
+}
diff --git a/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/resources/application.yml b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/resources/application.yml
new file mode 100644
index 000000000..2d5ca931a
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/lab-65-cxf-ws-demo-user-service/src/main/resources/application.yml
@@ -0,0 +1,6 @@
+# CXF 配置项,对应 CxfProperties 配置类
+cxf:
+ path: /ws/ # CXF CXFServlet 的匹配路径
+
+server:
+ port: 9090 # 设置服务器端口为 9090
diff --git a/lab-65/lab-65-cxf-ws-demo/pom.xml b/lab-65/lab-65-cxf-ws-demo/pom.xml
new file mode 100644
index 000000000..06c8a0bbd
--- /dev/null
+++ b/lab-65/lab-65-cxf-ws-demo/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ lab-65
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65-cxf-ws-demo
+ pom
+
+ lab-65-cxf-ws-demo-user-service
+ lab-65-cxf-ws-demo-application
+
+
+
+
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/pom.xml b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/pom.xml
new file mode 100644
index 000000000..df1533cc8
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/pom.xml
@@ -0,0 +1,77 @@
+
+
+
+ lab-65-spring-ws-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65-spring-ws-demo-application
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web-services
+
+
+
+
+ wsdl4j
+ wsdl4j
+
+
+
+
+
+
+
+ org.jvnet.jaxb2.maven2
+ maven-jaxb2-plugin
+ 0.14.0
+
+
+
+ generate
+
+
+
+
+
+ WSDL
+
+
+ http://127.0.0.1:8080/ws/users.wsdl
+
+
+
+ cn.iocoder.springboot.lab65.demo.wsdl
+
+
+
+
+
+
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/DemoApplication.java b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/DemoApplication.java
new file mode 100644
index 000000000..1a3adfe72
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/DemoApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab65.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/client/UserClient.java b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/client/UserClient.java
new file mode 100644
index 000000000..5ad60a720
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/client/UserClient.java
@@ -0,0 +1,28 @@
+package cn.iocoder.springboot.lab65.demo.client;
+
+import cn.iocoder.springboot.lab65.demo.wsdl.UserCreateRequest;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserCreateResponse;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserGetRequest;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserGetResponse;
+import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
+
+public class UserClient extends WebServiceGatewaySupport {
+
+ public UserGetResponse getUser(Integer id) {
+ // 创建请求对象
+ UserGetRequest request = new UserGetRequest();
+ request.setId(id);
+ // 执行请求
+ return (UserGetResponse) getWebServiceTemplate().marshalSendAndReceive(request);
+ }
+
+ public UserCreateResponse createUser(String name, Integer gender) {
+ // 创建请求对象
+ UserCreateRequest request = new UserCreateRequest();
+ request.setName(name);
+ request.setGender(gender);
+ // 执行请求
+ return (UserCreateResponse) getWebServiceTemplate().marshalSendAndReceive(request);
+ }
+
+}
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/config/WebServicesConfig.java b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/config/WebServicesConfig.java
new file mode 100644
index 000000000..34c197300
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/config/WebServicesConfig.java
@@ -0,0 +1,29 @@
+package cn.iocoder.springboot.lab65.demo.config;
+
+import cn.iocoder.springboot.lab65.demo.client.UserClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+
+@Configuration
+public class WebServicesConfig {
+
+ // 创建 Jaxb2Marshaller Bean,实现 XML 与 Bean 的互相转换
+ @Bean
+ public Jaxb2Marshaller marshaller() {
+ Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
+ marshaller.setContextPath("cn.iocoder.springboot.lab65.demo.wsdl"); // 用户服务的 WSDL 文件
+ return marshaller;
+ }
+
+ // 创建 UserClient Bean
+ @Bean
+ public UserClient countryClient(Jaxb2Marshaller marshaller) {
+ UserClient client = new UserClient();
+ client.setDefaultUri("http://127.0.0.1:8080/ws"); // 用户服务的 Web Services 地址
+ client.setMarshaller(marshaller);
+ client.setUnmarshaller(marshaller);
+ return client;
+ }
+
+}
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java
new file mode 100644
index 000000000..b9f4a9f0f
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java
@@ -0,0 +1,36 @@
+package cn.iocoder.springboot.lab65.demo.controller;
+
+import cn.iocoder.springboot.lab65.demo.client.UserClient;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserCreateResponse;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserGetResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private UserClient userClient;
+
+ @GetMapping("/get")
+ public String get(@RequestParam("id") Integer id) {
+ // 执行 Web Services 请求
+ UserGetResponse response = userClient.getUser(id);
+ // 响应
+ return response.getName();
+ }
+
+ @GetMapping("/create") // 为了方便测试,实际使用 @PostMapping
+ public Integer create(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ // 执行 Web Services 请求
+ UserCreateResponse response = userClient.createUser(name, gender);
+ // 响应
+ return response.getId();
+ }
+
+}
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/resources/application.yml b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/resources/application.yml
new file mode 100644
index 000000000..f9e9468c1
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-application/src/main/resources/application.yml
@@ -0,0 +1,2 @@
+server:
+ port: 9090
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/pom.xml b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/pom.xml
new file mode 100644
index 000000000..2c82e19a1
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/pom.xml
@@ -0,0 +1,75 @@
+
+
+
+ lab-65-spring-ws-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65-spring-ws-demo-user-service
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web-services
+
+
+
+
+ wsdl4j
+ wsdl4j
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ jaxb2-maven-plugin
+ 2.5.0
+
+
+ xjc
+
+ xjc
+
+
+
+
+
+
+ ${project.basedir}/src/main/resources/users.xsd
+
+
+ cn.iocoder.springboot.lab65.userservice.model
+
+
+
+
+
+
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/UserServiceApplication.java b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/UserServiceApplication.java
new file mode 100644
index 000000000..b76a9450f
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/UserServiceApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab65.userservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UserServiceApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(UserServiceApplication.class, args);
+ }
+
+}
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/config/WebServicesConfig.java b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/config/WebServicesConfig.java
new file mode 100644
index 000000000..6bacbd553
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/config/WebServicesConfig.java
@@ -0,0 +1,52 @@
+package cn.iocoder.springboot.lab65.userservice.config;
+
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.ws.config.annotation.EnableWs;
+import org.springframework.ws.config.annotation.WsConfigurerAdapter;
+import org.springframework.ws.server.EndpointInterceptor;
+import org.springframework.ws.transport.http.MessageDispatcherServlet;
+import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition;
+import org.springframework.xml.xsd.SimpleXsdSchema;
+import org.springframework.xml.xsd.XsdSchema;
+
+import java.util.List;
+
+@Configuration
+@EnableWs // 开启 Web Services 服务
+public class WebServicesConfig extends WsConfigurerAdapter {
+
+ public static final String NAMESPACE_URI = "https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-65/lab-65-spring-ws-demo";
+
+ @Bean
+ public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
+ MessageDispatcherServlet servlet = new MessageDispatcherServlet();
+ servlet.setApplicationContext(applicationContext);
+ servlet.setTransformWsdlLocations(true);
+ return new ServletRegistrationBean<>(servlet, "/ws/*");
+ }
+
+ @Bean
+ public XsdSchema usersSchema() {
+ return new SimpleXsdSchema(new ClassPathResource("users.xsd"));
+ }
+
+ @Bean(name = "users")
+ public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema usersSchema) {
+ DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
+ wsdl11Definition.setLocationUri("/ws");
+ wsdl11Definition.setTargetNamespace(NAMESPACE_URI);
+ wsdl11Definition.setSchema(usersSchema);
+ wsdl11Definition.setPortTypeName("UsersPort");
+ return wsdl11Definition;
+ }
+
+ @Override
+ public void addInterceptors(List interceptors) {
+ // 可自定义附加拦截器
+ }
+
+}
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/endpoint/UserEndpoint.java b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/endpoint/UserEndpoint.java
new file mode 100644
index 000000000..e5542d2b1
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/java/cn/iocoder/springboot/lab65/userservice/endpoint/UserEndpoint.java
@@ -0,0 +1,34 @@
+package cn.iocoder.springboot.lab65.userservice.endpoint;
+
+import cn.iocoder.springboot.lab65.userservice.config.WebServicesConfig;
+import cn.iocoder.springboot.lab65.userservice.model.UserCreateRequest;
+import cn.iocoder.springboot.lab65.userservice.model.UserCreateResponse;
+import cn.iocoder.springboot.lab65.userservice.model.UserGetRequest;
+import cn.iocoder.springboot.lab65.userservice.model.UserGetResponse;
+import org.springframework.ws.server.endpoint.annotation.Endpoint;
+import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
+import org.springframework.ws.server.endpoint.annotation.RequestPayload;
+import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
+
+@Endpoint
+public class UserEndpoint {
+
+ @PayloadRoot(namespace = WebServicesConfig.NAMESPACE_URI, localPart = "UserGetRequest")
+ @ResponsePayload
+ public UserGetResponse get(@RequestPayload UserGetRequest request) {
+ UserGetResponse response = new UserGetResponse();
+ response.setId(request.getId());
+ response.setName("没有昵称:" + request.getId());
+ response.setGender(request.getId() % 2 + 1);
+ return response;
+ }
+
+ @PayloadRoot(namespace = WebServicesConfig.NAMESPACE_URI, localPart = "UserCreateRequest")
+ @ResponsePayload
+ public UserCreateResponse create(@RequestPayload UserCreateRequest request) {
+ UserCreateResponse response = new UserCreateResponse();
+ response.setId((int) (System.currentTimeMillis() / 1000));
+ return response;
+ }
+
+}
diff --git a/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/resources/users.xsd b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/resources/users.xsd
new file mode 100644
index 000000000..c3685ebba
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/lab-65-spring-ws-demo-user-service/src/main/resources/users.xsd
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-65/lab-65-spring-ws-demo/pom.xml b/lab-65/lab-65-spring-ws-demo/pom.xml
new file mode 100644
index 000000000..17153b8eb
--- /dev/null
+++ b/lab-65/lab-65-spring-ws-demo/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ lab-65
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65-spring-ws-demo
+ pom
+
+ lab-65-spring-ws-demo-user-service
+ lab-65-spring-ws-demo-application
+
+
+
+
diff --git a/lab-65/lab-65-ws-feign-client/pom.xml b/lab-65/lab-65-ws-feign-client/pom.xml
new file mode 100644
index 000000000..2fdeedb59
--- /dev/null
+++ b/lab-65/lab-65-ws-feign-client/pom.xml
@@ -0,0 +1,79 @@
+
+
+
+ lab-65
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65-ws-feign-client
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ io.github.openfeign
+ feign-soap
+ 11.0
+
+
+
+
+
+
+
+ org.jvnet.jaxb2.maven2
+ maven-jaxb2-plugin
+ 0.14.0
+
+
+
+ generate
+
+
+
+
+
+ WSDL
+
+
+ http://127.0.0.1:8080/ws/users.wsdl
+
+
+
+ cn.iocoder.springboot.lab65.demo.wsdl
+
+
+
+
+
+
diff --git a/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/FeignDemoApplication.java b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/FeignDemoApplication.java
new file mode 100644
index 000000000..acc2efc51
--- /dev/null
+++ b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/FeignDemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab65.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class FeignDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(FeignDemoApplication.class, args);
+ }
+
+}
diff --git a/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/config/FeignConfig.java b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/config/FeignConfig.java
new file mode 100644
index 000000000..94f438c1b
--- /dev/null
+++ b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/config/FeignConfig.java
@@ -0,0 +1,26 @@
+package cn.iocoder.springboot.lab65.demo.config;
+
+import cn.iocoder.springboot.lab65.demo.feign.UserServiceFeignClient;
+import feign.Feign;
+import feign.jaxb.JAXBContextFactory;
+import feign.soap.SOAPDecoder;
+import feign.soap.SOAPEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FeignConfig {
+
+ private static final JAXBContextFactory JAXB_FACTORY = new JAXBContextFactory.Builder()
+ .withMarshallerJAXBEncoding("UTF-8")
+ .build();
+
+ @Bean
+ public UserServiceFeignClient userServiceFeignClient() {
+ return Feign.builder()
+ .encoder(new SOAPEncoder(JAXB_FACTORY))
+ .decoder(new SOAPDecoder(JAXB_FACTORY))
+ .target(UserServiceFeignClient.class, "http://127.0.0.1:8080/ws"); // 目标地址
+ }
+
+}
diff --git a/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java
new file mode 100644
index 000000000..dd8c6f516
--- /dev/null
+++ b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/controller/DemoController.java
@@ -0,0 +1,45 @@
+package cn.iocoder.springboot.lab65.demo.controller;
+
+import cn.iocoder.springboot.lab65.demo.feign.UserServiceFeignClient;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserCreateRequest;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserCreateResponse;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserGetRequest;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserGetResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private UserServiceFeignClient userClient;
+
+ @GetMapping("/get")
+ public String get(@RequestParam("id") Integer id) {
+ // 请求
+ UserGetRequest request = new UserGetRequest();
+ request.setId(id);
+ // 执行 Web Services 请求
+ UserGetResponse response = userClient.getUser(request);
+ // 响应
+ return response.getName();
+ }
+
+ @GetMapping("/create") // 为了方便测试,实际使用 @PostMapping
+ public Integer create(@RequestParam("name") String name,
+ @RequestParam("gender") Integer gender) {
+ // 请求
+ UserCreateRequest request = new UserCreateRequest();
+ request.setName(name);
+ request.setGender(gender);
+ // 执行 Web Services 请求
+ UserCreateResponse response = userClient.createUser(request);
+ // 响应
+ return response.getId();
+ }
+
+}
diff --git a/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/feign/UserServiceFeignClient.java b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/feign/UserServiceFeignClient.java
new file mode 100644
index 000000000..c001e1685
--- /dev/null
+++ b/lab-65/lab-65-ws-feign-client/src/main/java/cn/iocoder/springboot/lab65/demo/feign/UserServiceFeignClient.java
@@ -0,0 +1,25 @@
+package cn.iocoder.springboot.lab65.demo.feign;
+
+import cn.iocoder.springboot.lab65.demo.wsdl.UserCreateRequest;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserCreateResponse;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserGetRequest;
+import cn.iocoder.springboot.lab65.demo.wsdl.UserGetResponse;
+import feign.Headers;
+import feign.RequestLine;
+
+/**
+ * 用户服务 Feign Client
+ */
+public interface UserServiceFeignClient {
+
+ // 获得用户详情
+ @RequestLine("POST /")
+ @Headers("Content-Type: text/xml")
+ UserGetResponse getUser(UserGetRequest request);
+
+ // 创建用户
+ @RequestLine("POST /")
+ @Headers("Content-Type: text/xml")
+ UserCreateResponse createUser(UserCreateRequest request);
+
+}
diff --git a/lab-65/lab-65-ws-feign-client/src/main/resources/application.yml b/lab-65/lab-65-ws-feign-client/src/main/resources/application.yml
new file mode 100644
index 000000000..f9e9468c1
--- /dev/null
+++ b/lab-65/lab-65-ws-feign-client/src/main/resources/application.yml
@@ -0,0 +1,2 @@
+server:
+ port: 9090
diff --git a/lab-65/pom.xml b/lab-65/pom.xml
new file mode 100644
index 000000000..936c1f214
--- /dev/null
+++ b/lab-65/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-65
+ pom
+
+ lab-65-spring-ws-demo
+ lab-65-ws-feign-client
+ lab-65-cxf-ws-demo
+
+
+
diff --git "a/lab-65/\343\200\212\350\212\213\351\201\223 Spring Boot Web Services \345\205\245\351\227\250\343\200\213.md" "b/lab-65/\343\200\212\350\212\213\351\201\223 Spring Boot Web Services \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..47e13e1ca
--- /dev/null
+++ "b/lab-65/\343\200\212\350\212\213\351\201\223 Spring Boot Web Services \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-66/lab-66-spring-data-solr/pom.xml b/lab-66/lab-66-spring-data-solr/pom.xml
new file mode 100644
index 000000000..30e851cfd
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/pom.xml
@@ -0,0 +1,49 @@
+
+
+
+ lab-66
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-66-spring-data-solr
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-solr
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
diff --git a/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/Application.java b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/Application.java
new file mode 100644
index 000000000..fcb13bb3f
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/Application.java
@@ -0,0 +1,7 @@
+package cn.iocoder.springboot.lab15.springdatasolr;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+}
diff --git a/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/dataobject/SolrProductDO.java b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/dataobject/SolrProductDO.java
new file mode 100644
index 000000000..11fed5deb
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/dataobject/SolrProductDO.java
@@ -0,0 +1,94 @@
+package cn.iocoder.springboot.lab15.springdatasolr.dataobject;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.solr.core.mapping.Indexed;
+import org.springframework.data.solr.core.mapping.SolrDocument;
+
+@SolrDocument(collection = "new_core")
+public class SolrProductDO {
+
+ /**
+ * ID 主键
+ */
+ @Id
+ @Indexed(name = "id", type = "int")
+ private Integer id;
+
+ /**
+ * SPU 名字
+ */
+ @Indexed(name = "name", type = "string")
+ private String name;
+ /**
+ * 描述
+ */
+ @Indexed(name = "description", type = "string")
+ private String description;
+ /**
+ * 分类编号
+ */
+ @Indexed(name = "cid", type = "cid")
+ private Integer cid;
+ /**
+ * 分类名
+ */
+ @Indexed(name = "category_name", type = "string")
+ private String categoryName;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public SolrProductDO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public SolrProductDO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public SolrProductDO setDescription(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public Integer getCid() {
+ return cid;
+ }
+
+ public SolrProductDO setCid(Integer cid) {
+ this.cid = cid;
+ return this;
+ }
+
+ public String getCategoryName() {
+ return categoryName;
+ }
+
+ public SolrProductDO setCategoryName(String categoryName) {
+ this.categoryName = categoryName;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "SolrProductDO{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ", description='" + description + '\'' +
+ ", cid=" + cid +
+ ", categoryName='" + categoryName + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository.java b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository.java
new file mode 100644
index 000000000..0dd8f9ed1
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository.java
@@ -0,0 +1,8 @@
+package cn.iocoder.springboot.lab15.springdatasolr.repository;
+
+import cn.iocoder.springboot.lab15.springdatasolr.dataobject.SolrProductDO;
+import org.springframework.data.solr.repository.SolrCrudRepository;
+
+public interface ProductRepository extends SolrCrudRepository {
+
+}
diff --git a/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository02.java b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository02.java
new file mode 100644
index 000000000..216363bf1
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository02.java
@@ -0,0 +1,12 @@
+package cn.iocoder.springboot.lab15.springdatasolr.repository;
+
+import cn.iocoder.springboot.lab15.springdatasolr.dataobject.SolrProductDO;
+import org.springframework.data.solr.repository.SolrCrudRepository;
+
+public interface ProductRepository02 extends SolrCrudRepository {
+
+ SolrProductDO findByName(String name);
+
+// Page findByNameLike(String name, Pageable pageable);
+
+}
diff --git a/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository03.java b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository03.java
new file mode 100644
index 000000000..33aef1bdf
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/main/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository03.java
@@ -0,0 +1,17 @@
+package cn.iocoder.springboot.lab15.springdatasolr.repository;
+
+import cn.iocoder.springboot.lab15.springdatasolr.dataobject.SolrProductDO;
+import org.springframework.data.solr.repository.Query;
+import org.springframework.data.solr.repository.SolrCrudRepository;
+
+import java.util.List;
+
+public interface ProductRepository03 extends SolrCrudRepository {
+
+ /**
+ * 根据 name 匹配商品名或者商品分类,获得符合的商品列表
+ */
+ @Query("name:?0 OR category_name:?0")
+ List findByCustomQuery(String name);
+
+}
diff --git a/lab-66/lab-66-spring-data-solr/src/main/resources/application.yml b/lab-66/lab-66-spring-data-solr/src/main/resources/application.yml
new file mode 100644
index 000000000..3ed773e11
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/main/resources/application.yml
@@ -0,0 +1,5 @@
+spring:
+ data:
+ # Spring Data Solr 配置项,对应 SolrProperties 配置类
+ solr:
+ host: 'http://127.0.0.1:8983/solr' # Solr 服务器地址
diff --git a/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository02Test.java b/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository02Test.java
new file mode 100644
index 000000000..d7c3ddff0
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository02Test.java
@@ -0,0 +1,57 @@
+package cn.iocoder.springboot.lab15.springdatasolr.repository;
+
+import cn.iocoder.springboot.lab15.springdatasolr.Application;
+import cn.iocoder.springboot.lab15.springdatasolr.dataobject.SolrProductDO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class ProductRepository02Test {
+
+ @Autowired
+ private ProductRepository02 productRepository;
+
+ @Test // 根据名字获得一条记录
+ public void testFindByName() {
+ SolrProductDO product = productRepository.findByName("芋道源码");
+ System.out.println(product);
+ }
+
+// @Test // 使用 name 模糊查询,分页返回结果
+// public void testFindByNameLike() {
+// // 根据情况,是否要制造测试数据
+// if (false) {
+// testInsert();
+// }
+//
+// // 创建排序条件
+// Sort sort = Sort.by(Sort.Direction.DESC, "id"); // ID 倒序
+// // 创建分页条件。
+// Pageable pageable = PageRequest.of(0, 10, sort);
+// // 执行分页操作
+// Page page = productRepository.findByNameLike("芋道", pageable);
+// // 打印
+// System.out.println(page.getTotalElements());
+// System.out.println(page.getTotalPages());
+// }
+//
+// /**
+// * 为了给分页制造一点数据
+// */
+// private void testInsert() {
+// for (int i = 1; i <= 100; i++) {
+// SolrProductDO product = new SolrProductDO();
+// product.setId(i); // 一般 ES 的 ID 编号,使用 DB 数据对应的编号。这里,先写死
+// product.setName("芋道源码:" + i);
+// product.setDescription("我只是一个描述");
+// product.setCid(1);
+// product.setCategoryName("技术");
+// productRepository.save(product);
+// }
+// }
+
+}
diff --git a/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository03Test.java b/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository03Test.java
new file mode 100644
index 000000000..753027263
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepository03Test.java
@@ -0,0 +1,26 @@
+package cn.iocoder.springboot.lab15.springdatasolr.repository;
+
+import cn.iocoder.springboot.lab15.springdatasolr.Application;
+import cn.iocoder.springboot.lab15.springdatasolr.dataobject.SolrProductDO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class ProductRepository03Test {
+
+ @Autowired
+ private ProductRepository03 productRepository;
+
+ @Test
+ public void testFindByCustomQuery() {
+ List products = productRepository.findByCustomQuery("技术");
+ System.out.println(products.size());
+ }
+
+}
diff --git a/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepositoryTest.java b/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepositoryTest.java
new file mode 100644
index 000000000..c41d3dd59
--- /dev/null
+++ b/lab-66/lab-66-spring-data-solr/src/test/java/cn/iocoder/springboot/lab15/springdatasolr/repository/ProductRepositoryTest.java
@@ -0,0 +1,60 @@
+package cn.iocoder.springboot.lab15.springdatasolr.repository;
+
+import cn.iocoder.springboot.lab15.springdatasolr.Application;
+import cn.iocoder.springboot.lab15.springdatasolr.dataobject.SolrProductDO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class ProductRepositoryTest {
+
+ @Autowired
+ private ProductRepository productRepository;
+
+ @Test // 插入一条记录
+ public void testInsert() {
+ SolrProductDO product = new SolrProductDO();
+ product.setId(1); // 一般 Solr 的 ID 编号,使用 DB 数据对应的编号。这里,先写死
+ product.setName("芋道源码");
+ product.setDescription("我只是一个描述");
+ product.setCid(2);
+ product.setCategoryName("技术");
+ productRepository.save(product);
+ }
+
+ // 这里要注意,如果使用 save 方法来更新的话,必须是全量字段,否则其它字段会被覆盖。
+ // 所以,这里仅仅是作为一个示例。
+ @Test // 更新一条记录
+ public void testUpdate() {
+ SolrProductDO product = new SolrProductDO();
+ product.setId(1);
+ product.setCid(2);
+ product.setCategoryName("技术-Java");
+ productRepository.save(product);
+ }
+
+ @Test // 根据 ID 编号,删除一条记录
+ public void testDelete() {
+ productRepository.deleteById(1);
+ }
+
+ @Test // 根据 ID 编号,查询一条记录
+ public void testSelectById() {
+ Optional userDO = productRepository.findById(1);
+ System.out.println(userDO.isPresent());
+ }
+
+ @Test // 根据 ID 编号数组,查询多条记录
+ public void testSelectByIds() {
+ Iterable users = productRepository.findAllById(Arrays.asList(1, 4));
+ users.forEach(System.out::println);
+ }
+
+}
diff --git a/lab-66/pom.xml b/lab-66/pom.xml
new file mode 100644
index 000000000..70f574cc8
--- /dev/null
+++ b/lab-66/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-66
+ pom
+
+ lab-66-spring-data-solr
+
+
+
+
diff --git "a/lab-66/\343\200\212\350\212\213\351\201\223 Spring Boot Web Solr \345\205\245\351\227\250\343\200\213.md" "b/lab-66/\343\200\212\350\212\213\351\201\223 Spring Boot Web Solr \345\205\245\351\227\250\343\200\213.md"
new file mode 100644
index 000000000..65412077d
--- /dev/null
+++ "b/lab-66/\343\200\212\350\212\213\351\201\223 Spring Boot Web Solr \345\205\245\351\227\250\343\200\213.md"
@@ -0,0 +1 @@
+
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/pom.xml b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/pom.xml
new file mode 100644
index 000000000..5904c2d14
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+ lab-67-netty-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-67-netty-demo-client
+
+
+
+ 2.2.4.RELEASE
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ io.netty
+ netty-all
+ 4.1.50.Final
+
+
+
+
+ cn.iocoder.springboot.labs
+ lab-67-netty-demo-common
+ 1.0-SNAPSHOT
+
+
+
+
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/NettyClientApplication.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/NettyClientApplication.java
new file mode 100644
index 000000000..2990fbea1
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/NettyClientApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class NettyClientApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(NettyClientApplication.class, args);
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/NettyClient.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/NettyClient.java
new file mode 100644
index 000000000..476e9bc7c
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/NettyClient.java
@@ -0,0 +1,125 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.client;
+
+import cn.iocoder.springboot.lab67.nettyclientdemo.client.handler.NettyClientHandlerInitializer;
+import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class NettyClient {
+
+ /**
+ * 重连频率,单位:秒
+ */
+ private static final Integer RECONNECT_SECONDS = 20;
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Value("${netty.server.host}")
+ private String serverHost;
+ @Value("${netty.server.port}")
+ private Integer serverPort;
+
+ @Autowired
+ private NettyClientHandlerInitializer nettyClientHandlerInitializer;
+
+ /**
+ * 线程组,用于客户端对服务端的链接、数据读写
+ */
+ private EventLoopGroup eventGroup = new NioEventLoopGroup();
+ /**
+ * Netty Client Channel
+ */
+ private volatile Channel channel;
+
+ /**
+ * 启动 Netty Client
+ */
+ @PostConstruct
+ public void start() throws InterruptedException {
+ // 创建 Bootstrap 对象,用于 Netty Client 启动
+ Bootstrap bootstrap = new Bootstrap();
+ // 设置 Bootstrap 的各种属性。
+ bootstrap.group(eventGroup) // 设置一个 EventLoopGroup 对象
+ .channel(NioSocketChannel.class) // 指定 Channel 为客户端 NioSocketChannel
+ .remoteAddress(serverHost, serverPort) // 指定链接服务器的地址
+ .option(ChannelOption.SO_KEEPALIVE, true) // TCP Keepalive 机制,实现 TCP 层级的心跳保活功能
+ .option(ChannelOption.TCP_NODELAY, true) // 允许较小的数据包的发送,降低延迟
+ .handler(nettyClientHandlerInitializer);
+ // 链接服务器,并异步等待成功,即启动客户端
+ bootstrap.connect().addListener(new ChannelFutureListener() {
+
+ @Override
+ public void operationComplete(ChannelFuture future) throws Exception {
+ // 连接失败
+ if (!future.isSuccess()) {
+ logger.error("[start][Netty Client 连接服务器({}:{}) 失败]", serverHost, serverPort);
+ reconnect();
+ return;
+ }
+ // 连接成功
+ channel = future.channel();
+ logger.info("[start][Netty Client 连接服务器({}:{}) 成功]", serverHost, serverPort);
+ }
+
+ });
+ }
+
+ public void reconnect() {
+ eventGroup.schedule(new Runnable() {
+ @Override
+ public void run() {
+ logger.info("[reconnect][开始重连]");
+ try {
+ start();
+ } catch (InterruptedException e) {
+ logger.error("[reconnect][重连失败]", e);
+ }
+ }
+ }, RECONNECT_SECONDS, TimeUnit.SECONDS);
+ logger.info("[reconnect][{} 秒后将发起重连]", RECONNECT_SECONDS);
+ }
+
+ /**
+ * 关闭 Netty Server
+ */
+ @PreDestroy
+ public void shutdown() {
+ // 关闭 Netty Client
+ if (channel != null) {
+ channel.close();
+ }
+ // 优雅关闭一个 EventLoopGroup 对象
+ eventGroup.shutdownGracefully();
+ }
+
+ /**
+ * 发送消息
+ *
+ * @param invocation 消息体
+ */
+ public void send(Invocation invocation) {
+ if (channel == null) {
+ logger.error("[send][连接不存在]");
+ return;
+ }
+ if (!channel.isActive()) {
+ logger.error("[send][连接({})未激活]", channel.id());
+ return;
+ }
+ // 发送消息
+ channel.writeAndFlush(invocation);
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/handler/NettyClientHandler.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/handler/NettyClientHandler.java
new file mode 100644
index 000000000..a4ee7c923
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/handler/NettyClientHandler.java
@@ -0,0 +1,53 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.client.handler;
+
+import cn.iocoder.springboot.lab67.nettyclientdemo.client.NettyClient;
+import cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat.HeartbeatRequest;
+import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.handler.timeout.IdleStateEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+@ChannelHandler.Sharable
+public class NettyClientHandler extends ChannelInboundHandlerAdapter {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private NettyClient nettyClient;
+
+ @Override
+ public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+ // 发起重连
+ nettyClient.reconnect();
+ // 继续触发事件
+ super.channelInactive(ctx);
+ }
+
+ @Override
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
+ logger.error("[exceptionCaught][连接({}) 发生异常]", ctx.channel().id(), cause);
+ // 断开连接
+ ctx.channel().close();
+ }
+
+ @Override
+ public void userEventTriggered(ChannelHandlerContext ctx, Object event) throws Exception {
+ // 空闲时,向服务端发起一次心跳
+ if (event instanceof IdleStateEvent) {
+ logger.info("[userEventTriggered][发起一次心跳]");
+ HeartbeatRequest heartbeatRequest = new HeartbeatRequest();
+ ctx.writeAndFlush(new Invocation(HeartbeatRequest.TYPE, heartbeatRequest))
+ .addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
+ } else {
+ super.userEventTriggered(ctx, event);
+ }
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/handler/NettyClientHandlerInitializer.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/handler/NettyClientHandlerInitializer.java
new file mode 100644
index 000000000..5c995c255
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/client/handler/NettyClientHandlerInitializer.java
@@ -0,0 +1,44 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.client.handler;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.codec.InvocationDecoder;
+import cn.iocoder.springboot.lab67.nettycommondemo.codec.InvocationEncoder;
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageDispatcher;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelInitializer;
+import io.netty.handler.timeout.IdleStateHandler;
+import io.netty.handler.timeout.ReadTimeoutHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NettyClientHandlerInitializer extends ChannelInitializer {
+
+ /**
+ * 心跳超时时间
+ */
+ private static final Integer READ_TIMEOUT_SECONDS = 60;
+
+ @Autowired
+ private MessageDispatcher messageDispatcher;
+
+ @Autowired
+ private NettyClientHandler nettyClientHandler;
+
+ @Override
+ protected void initChannel(Channel ch) {
+ ch.pipeline()
+ // 空闲检测
+ .addLast(new IdleStateHandler(READ_TIMEOUT_SECONDS, 0, 0))
+ .addLast(new ReadTimeoutHandler(3 * READ_TIMEOUT_SECONDS))
+ // 编码器
+ .addLast(new InvocationEncoder())
+ // 解码器
+ .addLast(new InvocationDecoder())
+ // 消息分发器
+ .addLast(messageDispatcher)
+ // 客户端处理器
+ .addLast(nettyClientHandler)
+ ;
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/config/NettyClientConfig.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/config/NettyClientConfig.java
new file mode 100644
index 000000000..2a06df404
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/config/NettyClientConfig.java
@@ -0,0 +1,21 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.config;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageDispatcher;
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandlerContainer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class NettyClientConfig {
+
+ @Bean
+ public MessageDispatcher messageDispatcher() {
+ return new MessageDispatcher();
+ }
+
+ @Bean
+ public MessageHandlerContainer messageHandlerContainer() {
+ return new MessageHandlerContainer();
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/controller/TestController.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/controller/TestController.java
new file mode 100644
index 000000000..aba5cb7b4
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/controller/TestController.java
@@ -0,0 +1,26 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.controller;
+
+import cn.iocoder.springboot.lab67.nettyclientdemo.client.NettyClient;
+import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+
+ @Autowired
+ private NettyClient nettyClient;
+
+ @PostMapping("/mock")
+ public String mock(String type, String message) {
+ // 创建 Invocation 对象
+ Invocation invocation = new Invocation(type, message);
+ // 发送消息
+ nettyClient.send(invocation);
+ return "success";
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/auth/AuthRequest.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/auth/AuthRequest.java
new file mode 100644
index 000000000..74b6464a9
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/auth/AuthRequest.java
@@ -0,0 +1,33 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.auth;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 用户认证请求
+ */
+public class AuthRequest implements Message {
+
+ public static final String TYPE = "AUTH_REQUEST";
+
+ /**
+ * 认证 Token
+ */
+ private String accessToken;
+
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ public AuthRequest setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "AuthRequest{" +
+ "accessToken='" + accessToken + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/auth/AuthResponse.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/auth/AuthResponse.java
new file mode 100644
index 000000000..77c4b3d4f
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/auth/AuthResponse.java
@@ -0,0 +1,47 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.auth;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 用户认证响应
+ */
+public class AuthResponse implements Message {
+
+ public static final String TYPE = "AUTH_RESPONSE";
+
+ /**
+ * 响应状态码
+ */
+ private Integer code;
+ /**
+ * 响应提示
+ */
+ private String message;
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public AuthResponse setCode(Integer code) {
+ this.code = code;
+ return this;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public AuthResponse setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "AuthResponse{" +
+ "code=" + code +
+ ", message='" + message + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatRedirectToUserRequest.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatRedirectToUserRequest.java
new file mode 100644
index 000000000..6cafeb026
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatRedirectToUserRequest.java
@@ -0,0 +1,47 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 转发消息给一个用户的 Message
+ */
+public class ChatRedirectToUserRequest implements Message {
+
+ public static final String TYPE = "CHAT_REDIRECT_TO_USER_REQUEST";
+
+ /**
+ * 消息编号
+ */
+ private String msgId;
+ /**
+ * 内容
+ */
+ private String content;
+
+ public String getMsgId() {
+ return msgId;
+ }
+
+ public ChatRedirectToUserRequest setMsgId(String msgId) {
+ this.msgId = msgId;
+ return this;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public ChatRedirectToUserRequest setContent(String content) {
+ this.content = content;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "ChatRedirectToUserRequest{" +
+ "msgId='" + msgId + '\'' +
+ ", content='" + content + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendResponse.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendResponse.java
new file mode 100644
index 000000000..5674f776b
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendResponse.java
@@ -0,0 +1,60 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 聊天发送消息结果的 Response
+ */
+public class ChatSendResponse implements Message {
+
+ public static final String TYPE = "CHAT_SEND_RESPONSE";
+
+ /**
+ * 消息编号
+ */
+ private String msgId;
+ /**
+ * 响应状态码
+ */
+ private Integer code;
+ /**
+ * 响应提示
+ */
+ private String message;
+
+ public String getMsgId() {
+ return msgId;
+ }
+
+ public ChatSendResponse setMsgId(String msgId) {
+ this.msgId = msgId;
+ return this;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public ChatSendResponse setCode(Integer code) {
+ this.code = code;
+ return this;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public ChatSendResponse setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "ChatSendResponse{" +
+ "msgId='" + msgId + '\'' +
+ ", code=" + code +
+ ", message='" + message + '\'' +
+ '}';
+ }
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendToAllRequest.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendToAllRequest.java
new file mode 100644
index 000000000..525457c99
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendToAllRequest.java
@@ -0,0 +1,47 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 发送给所有人的群聊消息的 Message
+ */
+public class ChatSendToAllRequest implements Message {
+
+ public static final String TYPE = "CHAT_SEND_TO_ALL_REQUEST";
+
+ /**
+ * 消息编号
+ */
+ private String msgId;
+ /**
+ * 内容
+ */
+ private String content;
+
+ public String getContent() {
+ return content;
+ }
+
+ public ChatSendToAllRequest setContent(String content) {
+ this.content = content;
+ return this;
+ }
+
+ public String getMsgId() {
+ return msgId;
+ }
+
+ public ChatSendToAllRequest setMsgId(String msgId) {
+ this.msgId = msgId;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "ChatSendToAllRequest{" +
+ "msgId='" + msgId + '\'' +
+ ", content='" + content + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendToOneRequest.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendToOneRequest.java
new file mode 100644
index 000000000..2ae55aaa2
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/chat/ChatSendToOneRequest.java
@@ -0,0 +1,61 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 发送给指定人的私聊消息 Request
+ */
+public class ChatSendToOneRequest implements Message {
+
+ public static final String TYPE = "CHAT_SEND_TO_ONE_REQUEST";
+
+ /**
+ * 发送给的用户
+ */
+ private String toUser;
+ /**
+ * 消息编号
+ */
+ private String msgId;
+ /**
+ * 内容
+ */
+ private String content;
+
+ public String getToUser() {
+ return toUser;
+ }
+
+ public ChatSendToOneRequest setToUser(String toUser) {
+ this.toUser = toUser;
+ return this;
+ }
+
+ public String getMsgId() {
+ return msgId;
+ }
+
+ public ChatSendToOneRequest setMsgId(String msgId) {
+ this.msgId = msgId;
+ return this;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public ChatSendToOneRequest setContent(String content) {
+ this.content = content;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "ChatSendToOneRequest{" +
+ "toUser='" + toUser + '\'' +
+ ", msgId='" + msgId + '\'' +
+ ", content='" + content + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/heartbeat/HeartbeatRequest.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/heartbeat/HeartbeatRequest.java
new file mode 100644
index 000000000..70eeb8d93
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/heartbeat/HeartbeatRequest.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 消息 - 心跳请求
+ */
+public class HeartbeatRequest implements Message {
+
+ /**
+ * 类型 - 心跳请求
+ */
+ public static final String TYPE = "HEARTBEAT_REQUEST";
+
+ @Override
+ public String toString() {
+ return "HeartbeatRequest{}";
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/heartbeat/HeartbeatResponse.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/heartbeat/HeartbeatResponse.java
new file mode 100644
index 000000000..531c04a22
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/message/heartbeat/HeartbeatResponse.java
@@ -0,0 +1,20 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+
+/**
+ * 消息 - 心跳响应
+ */
+public class HeartbeatResponse implements Message {
+
+ /**
+ * 类型 - 心跳响应
+ */
+ public static final String TYPE = "HEARTBEAT_RESPONSE";
+
+ @Override
+ public String toString() {
+ return "HeartbeatResponse{}";
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/auth/AuthResponseHandler.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/auth/AuthResponseHandler.java
new file mode 100644
index 000000000..9ad857fa1
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/auth/AuthResponseHandler.java
@@ -0,0 +1,25 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.auth;
+
+import cn.iocoder.springboot.lab67.nettyclientdemo.message.auth.AuthResponse;
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
+import io.netty.channel.Channel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AuthResponseHandler implements MessageHandler {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void execute(Channel channel, AuthResponse message) {
+ logger.info("[execute][认证结果:{}]", message);
+ }
+
+ @Override
+ public String getType() {
+ return AuthResponse.TYPE;
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/chat/ChatRedirectToUserRequestHandler.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/chat/ChatRedirectToUserRequestHandler.java
new file mode 100644
index 000000000..ea9c42d7e
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/chat/ChatRedirectToUserRequestHandler.java
@@ -0,0 +1,25 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.chat;
+
+import cn.iocoder.springboot.lab67.nettyclientdemo.message.chat.ChatRedirectToUserRequest;
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
+import io.netty.channel.Channel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ChatRedirectToUserRequestHandler implements MessageHandler {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void execute(Channel channel, ChatRedirectToUserRequest message) {
+ logger.info("[execute][收到消息:{}]", message);
+ }
+
+ @Override
+ public String getType() {
+ return ChatRedirectToUserRequest.TYPE;
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/chat/ChatSendResponseHandler.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/chat/ChatSendResponseHandler.java
new file mode 100644
index 000000000..b86072bf3
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/chat/ChatSendResponseHandler.java
@@ -0,0 +1,25 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.chat;
+
+import cn.iocoder.springboot.lab67.nettyclientdemo.message.chat.ChatSendResponse;
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
+import io.netty.channel.Channel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ChatSendResponseHandler implements MessageHandler {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void execute(Channel channel, ChatSendResponse message) {
+ logger.info("[execute][发送结果:{}]", message);
+ }
+
+ @Override
+ public String getType() {
+ return ChatSendResponse.TYPE;
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/heartbeat/HeartbeatResponseHandler.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/heartbeat/HeartbeatResponseHandler.java
new file mode 100644
index 000000000..50e57eb2e
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/java/cn/iocoder/springboot/lab67/nettyclientdemo/messagehandler/heartbeat/HeartbeatResponseHandler.java
@@ -0,0 +1,25 @@
+package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.heartbeat;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
+import cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat.HeartbeatResponse;
+import io.netty.channel.Channel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class HeartbeatResponseHandler implements MessageHandler {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void execute(Channel channel, HeartbeatResponse message) {
+ logger.info("[execute][收到连接({}) 的心跳响应]", channel.id());
+ }
+
+ @Override
+ public String getType() {
+ return HeartbeatResponse.TYPE;
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/resources/application.yml b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/resources/application.yml
new file mode 100644
index 000000000..472ca627b
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-client/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+netty:
+ server:
+ host: 127.0.0.1 # Netty Server 地址
+ port: 8888 # Netty Server 端口
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/pom.xml b/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/pom.xml
new file mode 100644
index 000000000..503b3b40b
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+ lab-67-netty-demo
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-67-netty-demo-common
+
+
+
+ 1.8
+ 1.8
+
+
+
+
+
+ io.netty
+ netty-all
+ 4.1.50.Final
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.71
+
+
+
+
+ org.springframework
+ spring-aop
+ 5.2.5.RELEASE
+
+
+ org.springframework
+ spring-context
+ 5.2.5.RELEASE
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.30
+
+
+
+
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/src/main/java/cn/iocoder/springboot/lab67/nettycommondemo/codec/Invocation.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/src/main/java/cn/iocoder/springboot/lab67/nettycommondemo/codec/Invocation.java
new file mode 100644
index 000000000..828a0438c
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/src/main/java/cn/iocoder/springboot/lab67/nettycommondemo/codec/Invocation.java
@@ -0,0 +1,60 @@
+package cn.iocoder.springboot.lab67.nettycommondemo.codec;
+
+import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
+import com.alibaba.fastjson.JSON;
+
+/**
+ * 通信协议的消息体
+ */
+public class Invocation {
+
+ /**
+ * 类型
+ */
+ private String type;
+ /**
+ * 消息,JSON 格式
+ */
+ private String message;
+
+ // 空构造方法
+ public Invocation() {
+ }
+
+ public Invocation(String type, String message) {
+ this.type = type;
+ this.message = message;
+ }
+
+ public Invocation(String type, Message message) {
+ this.type = type;
+ this.message = JSON.toJSONString(message);
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public Invocation setType(String type) {
+ this.type = type;
+ return this;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public Invocation setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "Invocation{" +
+ "type='" + type + '\'' +
+ ", message='" + message + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/src/main/java/cn/iocoder/springboot/lab67/nettycommondemo/codec/InvocationDecoder.java b/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/src/main/java/cn/iocoder/springboot/lab67/nettycommondemo/codec/InvocationDecoder.java
new file mode 100644
index 000000000..b91bfa041
--- /dev/null
+++ b/lab-67/lab-67-netty-demo/lab-67-netty-demo-common/src/main/java/cn/iocoder/springboot/lab67/nettycommondemo/codec/InvocationDecoder.java
@@ -0,0 +1,47 @@
+package cn.iocoder.springboot.lab67.nettycommondemo.codec;
+
+import com.alibaba.fastjson.JSON;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.ByteToMessageDecoder;
+import io.netty.handler.codec.CorruptedFrameException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * {@link Invocation} 解码器
+ */
+public class InvocationDecoder extends ByteToMessageDecoder {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List