Java 项目实战:尚庭公寓单体架构开发与部署
尚庭公寓单体架构项目实战教程,涵盖从环境搭建到生产部署的全流程。技术栈包括 Spring Boot 3.0.5、MyBatis-Plus、Knife4j、MinIO 对象存储及 JWT 认证。内容涉及 Web 模块配置、数据库初始化、基础 CRUD 接口开发、文件上传实现、全局异常处理、前后端联调以及 Nginx 反向代理部署。旨在帮助开发者掌握企业级 Java 应用的核心开发模式与运维方案。

尚庭公寓单体架构项目实战教程,涵盖从环境搭建到生产部署的全流程。技术栈包括 Spring Boot 3.0.5、MyBatis-Plus、Knife4j、MinIO 对象存储及 JWT 认证。内容涉及 Web 模块配置、数据库初始化、基础 CRUD 接口开发、文件上传实现、全局异常处理、前后端联调以及 Nginx 反向代理部署。旨在帮助开发者掌握企业级 Java 应用的核心开发模式与运维方案。







<!-- 继承 Spring Boot 父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
</parent>
<!-- 注意:直接替换 pom 文件中原有的 properties -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<swagger.version>2.9.2</swagger.version>
<jwt.version>0.11.2</jwt.version>
<easycaptcha.version>1.6.2</easycaptcha.version>
<minio.version>8.2.0</minio.version>
<knife4j.version>4.1.0</knife4j.version>
<aliyun.sms.version>2.0.23</aliyun.sms.version>
</properties>
<!-- 配置 dependencyManagement 统一管理依赖版本 -->
<dependencyManagement>
<dependencies>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- knife4j 文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- JWT 登录认证相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<scope>runtime</scope>
<version>${jwt.version}</version>
</dependency>
<!-- 图形验证码 -->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>${easycaptcha.version}</version>
</dependency>
<!-- 对象存储,用于存储图像等非结构化数据 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>${minio.version}</version>
</dependency>
<!-- 阿里云短信客户端,用于发送短信验证码 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>${aliyun.sms.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 包含 spring web 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 包含 spring test 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot Maven 插件,用于打包可执行的 JAR 文件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
在 web_admin 模块的 src/main/resources 目录下创建 application.yml 配置文件,内容如下:
server:
port: 8080
在 web_admin 模块下创建 com.yangjunbo.lease.AdminWebApplication 类,内容如下:
@SpringBootApplication
public class AdminWebApplication {
public static void main(String[] args) {
SpringApplication.run(AdminWebApplication.class, args);
}
}
在 common 模块的 pom.xml 文件中增加如下内容:
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
在 model 模块的 pom.xml 文件中增加如下内容:
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
在 web_admin 模块的 application.yml 文件增加如下内容:
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://<hostname>:<port>/<database>?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2b8
username: <username>
password: <password>
hikari:
connection-test-query: SELECT 1 # 自动检测连接
connection-timeout: 60000 # 数据库连接超时时间,默认 30 秒
idle-timeout: 500000 # 空闲连接存活最大时间,默认 600000(10 分钟)
max-lifetime: 540000 # 此属性控制池中连接的最长生命周期,值 0 表示无限生命周期,默认 1800000 即 30 分钟
maximum-pool-size: 12 # 连接池最大连接数,默认是 10
minimum-idle: 10 # 最小空闲连接数量
pool-name: SPHHikariPool # 连接池名称
# 用于打印框架生成的 sql 语句,便于调试
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在 common 模块下创建 com.yangjunbo.lease.common.mybatisplus.MybatisPlusConfiguration 类,内容如下:
@Configuration
@MapperScan("com.atguigu.lease.web.*.mapper")
public class MybatisPlusConfiguration {}
在 web 模块的 pom.xml 文件添加如下内容:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>
在 model 模块的 pom.xml 文件添加上述内容:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>
在 web-admin 模块下创建 com.yangjunbo.lease.web.admin.custom.config.Knife4jConfiguration 类,内容如下:
@Configuration
public class Knife4jConfiguration {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI().info(new Info().title("后台管理系统 API").version("1.0").description("后台管理系统 API"));
}
@Bean
public GroupedOpenApi systemAPI() {
return GroupedOpenApi.builder().group("系统信息管理").pathsToMatch("/admin/system/**").build();
}
@Bean
public GroupedOpenApi loginAPI() {
return GroupedOpenApi.builder().group("后台登录管理").pathsToMatch("/admin/login/**","/admin/info").build();
}
@Bean
public GroupedOpenApi apartmentAPI() {
return GroupedOpenApi.builder().group("公寓信息管理").pathsToMatch("/admin/apartment/**","/admin/room/**","/admin/label/**","/admin/facility/**","/admin/fee/**","/admin/attr/**","/admin/payment/**","/admin/region/**","/admin/term/**","/admin/file/**").build();
}
@Bean
public GroupedOpenApi {
GroupedOpenApi.builder().group().pathsToMatch(,).build();
}
GroupedOpenApi {
GroupedOpenApi.builder().group().pathsToMatch().build();
}
}
先把项目中的包名 com.yangjunbo 改成 com.atguigu,然后使用课件中提供到生成好的基础代码,继续开发。如何使用插件生成基础代码,后续再研究,先继续往下学习。
导入课件中提供的接口相关代码


































































































































这个应该是跟着第 46 节后面





























































































































微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online