程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 后端开发

    • Spring Boot多模块项目开发
      • 一、Maven多模块架构概述
        • 1.1 什么是父工程
        • 1.2 父子模块结构的优势
      • 二、典型的多模块项目结构设计
        • 2.1 项目整体结构
        • 2.2 各模块职责说明
      • 三、父工程创建详细步骤
        • 3.1 定义父工程基础信息
        • 3.2 继承Spring Boot父工程
        • 3.3 声明子模块
        • 3.4 定义全局属性配置
        • 3.5 统一依赖管理
        • 3.6 构建插件配置
      • 四、子模块创建与配置详解
        • 4.1 通用工具模块(netdisk-common)
        • 4.2 数据模型模块(netdisk-model)
        • 4.3 核心业务服务模块(netdisk-server)
        • 4.4 依赖管理模块(netdisk-dependences)
      • 五、模块间依赖关系管理
        • 5.1 典型依赖关系
        • 5.2 依赖传递原则
      • 六、构建与部署流程
        • 6.1 构建命令
        • 6.2 部署策略
    • Spring Boot图片资源返回
    • Spring Boot文件上传
    • Spring Boot文件下载
    • 对接第三方文件上传
    • Servlet 原生API
    • HttpServletResponse 和 ResponseEntity
    • 后端解决跨域问题
    • 后端拦截器
    • SpringBoot+Vue实现邮件发送与验证码验证
    • 谷歌验证码
    • 利用hutool工具类实现图片验证码
    • 统一返回格式
    • 通用 普通 登录模块
    • 通用 JWT 登录认证模块
    • 通用 普通 注册模块
    • 基于 MyBatis curd
    • 基于 MyBatis-Plus curd
    • Java 常见对象模型
    • 开发枚举的使用
    • MyBatis与MyBatis-Plus日期类型处理
    • 接口日志拦截基础版
    • 接口日志拦截进阶版
    • 文件操作工具类
    • Spring Boot 数据校验
    • 幂等性
  • 前端开发

  • 开发笔记
  • 后端开发
scholar
2024-12-27
目录

Spring Boot多模块项目开发

# Spring Boot多模块项目开发

# 一、Maven多模块架构概述

# 1.1 什么是父工程

父工程(Parent Project)是Maven多模块架构的核心组件,主要用于集中管理多个子模块的公共配置。父工程通过pom类型的项目结构,为所有子模块提供统一的依赖版本控制、插件配置和构建流程,有效避免配置重复和版本冲突问题。

# 1.2 父子模块结构的优势

  • 集中式依赖管理:通过dependencyManagement统一管理所有模块的依赖版本
  • 配置继承机制:子模块自动继承父工程的大部分配置,减少重复声明
  • 模块化开发:便于团队协作和代码复用,提高代码的可维护性
  • 统一构建流程:确保所有模块使用一致的编译、测试和打包流程

# 二、典型的多模块项目结构设计

# 2.1 项目整体结构

netdisk-online/                  # 父工程根目录
├── pom.xml                      # 父工程POM文件
├── netdisk-common/              # 通用工具模块
│   └── pom.xml
├── netdisk-model/               # 数据模型模块
│   └── pom.xml
├── netdisk-server/              # 核心业务服务模块
│   └── pom.xml
└── netdisk-dependences/         # 依赖管理模块
    └── pom.xml
1
2
3
4
5
6
7
8
9
10

# 2.2 各模块职责说明

  • netdisk-common:提供各模块共用的工具类、常量定义、通用异常处理等
  • netdisk-model:定义数据实体类、DTO对象、VO对象等数据模型
  • netdisk-server:实现核心业务逻辑、控制器、服务接口等
  • netdisk-dependences:管理项目依赖,可选的依赖管理模块

# 三、父工程创建详细步骤

# 3.1 定义父工程基础信息

创建父工程的POM文件,配置基础信息:

<!-- 定义项目模型版本 -->
<modelVersion>4.0.0</modelVersion>

<!-- 父模块的groupId、artifactId和version,作为子模块的统一标识前缀 -->
<groupId>org.scholar</groupId>
<artifactId>netdisk-online</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 指定打包类型为pom,表明这是一个用于管理子模块的父工程 -->
<packaging>pom</packaging>

<!-- 项目基本信息描述 -->
<name>netdisk-online</name>
<description>网盘在线系统多模块父工程</description>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 3.2 继承Spring Boot父工程

为了使用Spring Boot的依赖管理和插件功能,让父工程继承Spring Boot的父POM:

<!-- 继承Spring Boot的父工程,获取其依赖管理和插件配置 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <!-- 使用稳定版本的Spring Boot,根据项目需要可以调整版本 -->
    <version>2.7.17</version>
    <!-- relativePath为空表示从仓库中获取parent -->
    <relativePath/>
</parent>
1
2
3
4
5
6
7
8
9

# 3.3 声明子模块

使用modules标签声明父工程管理的子模块:

<!-- 声明所有子模块,Maven会按照此顺序构建模块 -->
<modules>
    <!-- 通用工具模块,包含各模块共用的工具类和通用功能 -->
    <module>netdisk-common</module>
    <!-- 数据模型模块,定义实体类、DTO、VO等 -->
    <module>netdisk-model</module>
    <!-- 核心业务服务模块,实现主要业务逻辑 -->
    <module>netdisk-server</module>
    <!-- 依赖管理模块,可选,用于管理第三方依赖 -->
    <module>netdisk-dependences</module>
</modules>
1
2
3
4
5
6
7
8
9
10
11

# 3.4 定义全局属性配置

使用properties标签定义全局属性,供所有子模块使用:

<!-- 全局属性配置,定义所有子模块共享的配置信息 -->
<properties>
    <!-- JDK版本配置 -->
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    
    <!-- 项目编码配置 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    
    <!-- 跳过测试配置 -->
    <skipTests>true</skipTests>
    
    <!-- 各依赖库版本集中定义,方便统一管理和升级 -->
    <logback.version>1.2.10</logback.version>
    <mysql.version>8.0.23</mysql.version>
    <mybatisplus.version>3.5.1</mybatisplus.version>
    <aspectjweaver.version>1.9.4</aspectjweaver.version>
    <okhttp3.version>3.2.0</okhttp3.version>
    <fastjson.version>1.2.66</fastjson.version>
    <commons.lang3.version>3.4</commons.lang3.version>
    <commons.codec.version>1.9</commons.codec.version>
    <commons.io.version>2.5</commons.io.version>
    <hutool.version>5.8.5</hutool.version>
</properties>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 3.5 统一依赖管理

使用dependencyManagement标签统一管理依赖版本:

<!-- 依赖管理配置,统一控制依赖版本,子模块引用时无需指定版本 -->
<dependencyManagement>
    <dependencies>
        <!-- 持久层相关依赖 -->
        <!-- MyBatis-Plus,提供强大的ORM和代码生成功能 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>
        
        <!-- MySQL数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        
        <!-- 日志框架 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        
        <!-- AOP支持 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectjweaver.version}</version>
        </dependency>
        
        <!-- HTTP客户端 -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>${okhttp3.version}</version>
        </dependency>
        
        <!-- JSON处理 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        
        <!-- 通用工具库 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons.lang3.version}</version>
        </dependency>
        
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>${commons.codec.version}</version>
        </dependency>
        
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons.io.version}</version>
        </dependency>
        
        <!-- 综合工具包 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        
        <!-- 子模块依赖声明,便于模块间引用 -->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>netdisk-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>netdisk-model</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

# 3.6 构建插件配置

配置通用的构建插件,供子模块继承使用:

<!-- 构建配置,定义所有子模块共享的构建插件 -->
<build>
    <plugins>
        <!-- Maven编译插件,统一编译配置 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <!-- 指定编译源代码使用的JDK版本 -->
                <source>${java.version}</source>
                <!-- 指定生成的类文件的目标JDK版本 -->
                <target>${java.version}</target>
                <!-- 指定编译时的编码 -->
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
        
        <!-- 资源处理插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 四、子模块创建与配置详解

# 4.1 通用工具模块(netdisk-common)

通用模块用于存放所有模块共用的工具类、常量、异常处理等。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 声明父工程,继承父工程的配置 -->
    <parent>
        <groupId>org.scholar</groupId>
        <artifactId>netdisk-online</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <!-- 子模块坐标,只需要artifactId,其他从父工程继承 -->
    <artifactId>netdisk-common</artifactId>
    <packaging>jar</packaging>
    <name>netdisk-common</name>
    <description>网盘系统通用工具模块</description>
    
    <!-- 通用模块依赖配置 -->
    <dependencies>
        <!-- Spring Boot基础依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        
        <!-- 工具类库,无需指定版本,从父工程继承 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        
        <!-- JSON处理 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        
        <!-- 日志框架 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
    </dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

# 4.2 数据模型模块(netdisk-model)

数据模型模块用于定义实体类、DTO、VO等数据结构。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 继承父工程 -->
    <parent>
        <groupId>org.scholar</groupId>
        <artifactId>netdisk-online</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <!-- 模块标识 -->
    <artifactId>netdisk-model</artifactId>
    <packaging>jar</packaging>
    <name>netdisk-model</name>
    <description>网盘系统数据模型模块</description>
    
    <dependencies>
        <!-- 依赖通用模块 -->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>netdisk-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        
        <!-- MyBatis-Plus,用于实体类注解和代码生成 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        
        <!-- Lombok,简化实体类开发 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- 参数校验 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
    </dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 4.3 核心业务服务模块(netdisk-server)

业务服务模块是项目的核心,包含控制器、服务实现、配置等。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 继承父工程 -->
    <parent>
        <groupId>org.scholar</groupId>
        <artifactId>netdisk-online</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <!-- 模块标识 -->
    <artifactId>netdisk-server</artifactId>
    <packaging>jar</packaging>
    <name>netdisk-server</name>
    <description>网盘系统服务端模块</description>
    
    <dependencies>
        <!-- 依赖数据模型模块 -->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>netdisk-model</artifactId>
            <version>${project.version}</version>
        </dependency>
        
        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- 数据库相关 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        <!-- AOP支持 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        
        <!-- 测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <!-- 构建配置 -->
    <build>
        <plugins>
            <!-- Spring Boot Maven插件,用于打包可执行jar -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 排除Lombok依赖 -->
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

# 4.4 依赖管理模块(netdisk-dependences)

依赖管理模块用于管理项目的外部依赖,是可选模块。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 继承父工程 -->
    <parent>
        <groupId>org.scholar</groupId>
        <artifactId>netdisk-online</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <!-- 模块标识 -->
    <artifactId>netdisk-dependences</artifactId>
    <packaging>pom</packaging>
    <name>netdisk-dependences</name>
    <description>网盘系统依赖管理模块</description>
    
    <!-- 依赖管理模块通常不包含实际代码,仅用于管理依赖 -->
    <dependencies>
        <!-- 可以放置一些项目中不常用但可能需要的依赖 -->
    </dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 五、模块间依赖关系管理

# 5.1 典型依赖关系

多模块项目中的依赖关系通常如下:

  • netdisk-server → 依赖 → netdisk-model → 依赖 → netdisk-common
  • netdisk-dependences 通常不被其他模块依赖

# 5.2 依赖传递原则

  • 尽量避免循环依赖
  • 遵循"最小知识原则",只依赖必要的模块
  • 通过父工程统一管理版本,确保依赖一致性

# 六、构建与部署流程

# 6.1 构建命令

多模块项目常用构建命令:

# 清理并打包整个项目
mvn clean package

# 跳过测试打包
mvn clean package -DskipTests

# 只构建特定模块
mvn clean package -pl netdisk-server -am
1
2
3
4
5
6
7
8

# 6.2 部署策略

  • 开发环境:可部署完整项目或单个服务模块
  • 生产环境:通常只部署核心业务模块(netdisk-server)
编辑此页 (opens new window)
上次更新: 2025/03/17, 00:55:23
Spring Boot图片资源返回

Spring Boot图片资源返回→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式