版本

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         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>

    <!-- 父工程 依赖管理 -->
    <groupId>com.dream</groupId>
    <artifactId>app-api</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>

    <modules>
    </modules>

    <!-- 版本控制 -->
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <kotlin.version>2.1.20</kotlin.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <springboot.version>3.4.4</springboot.version>
        <log4j2.version>2.24.2</log4j2.version>
        <mysql.version>8.4.0</mysql.version>
        <druid.version>1.2.23</druid.version>
        <mybatis.plus.version>3.5.12</mybatis.plus.version>
        <fastjson2.version>2.0.33</fastjson2.version>
        <hutool.version>5.8.36</hutool.version>
        <knife4j.version>4.5.0</knife4j.version>
        <sa-token.version>1.41.0</sa-token.version>
        <minio.version>8.5.12</minio.version>
        <ip2region.version>2.7.0</ip2region.version>
        <easyexcel.version>4.0.3</easyexcel.version>
        <redisson.version>3.45.1</redisson.version>
        <bcprov.version>1.70</bcprov.version>
        <l2cache.version>2.0.0</l2cache.version>
        <commons-net.version>3.11.1</commons-net.version>
        <commons-text.version>1.13.0</commons-text.version>
        <kaptcha.version>2.3.2</kaptcha.version>
        <prometheus.version>1.14.6</prometheus.version>
        <guava.version>33.4.8-jre</guava.version>
        <commons-lang3.version>3.17.0</commons-lang3.version>
        <dom4j.version>2.1.4</dom4j.version>
        <xstream.version>1.4.21</xstream.version>
        <commons-codec.version>1.18.0</commons-codec.version>
        <jackson-module-kotlin.version>2.16.2</jackson-module-kotlin.version>
        <actuator-admin.version>${springboot.version}</actuator-admin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-reflect</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
    </dependencies>

    <!-- 依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <!-- bom start -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 接口文档 -->
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-dependencies</artifactId>
                <version>${knife4j.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 监控 -->
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-dependencies</artifactId>
                <version>${actuator-admin.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- bom end -->

            <!-- slf4j-log4j2 -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
                <version>${log4j2.version}</version>
            </dependency>

            <!-- L2cache 多级缓存 -->
            <dependency>
                <groupId>io.github.ck-jesse</groupId>
                <artifactId>l2cache-spring-boot-starter</artifactId>
                <version>${l2cache.version}</version>
                <exclusions>
                    <exclusion>
                        <artifactId>spring-boot-starter-web</artifactId>
                        <groupId>org.springframework.boot</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>spring-cloud-context</artifactId>
                        <groupId>org.springframework.cloud</groupId>
                    </exclusion>
                </exclusions>
            </dependency>

            <!-- redisson -->
            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson-spring-boot-starter</artifactId>
                <version>${redisson.version}</version>
            </dependency>

            <!-- 数据库 -->
            <dependency>
                <groupId>com.mysql</groupId>
                <artifactId>mysql-connector-j</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!-- druid 数据源 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-3-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
                <version>${mybatis.plus.version}</version>
            </dependency>

            <!-- mybatis-plus 分页插件 -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-jsqlparser</artifactId>
                <version>${mybatis.plus.version}</version>
            </dependency>

            <!-- fastjson2 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson2.version}</version>
            </dependency>

            <!-- sa-token -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-spring-boot3-starter</artifactId>
                <version>${sa-token.version}</version>
            </dependency>

            <!-- json序列化 sa-token -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-fastjson2</artifactId>
                <version>${sa-token.version}</version>
            </dependency>

            <!-- 根据 ip 获取国家地理等信息 -->
            <dependency>
                <groupId>org.lionsoul</groupId>
                <artifactId>ip2region</artifactId>
                <version>${ip2region.version}</version>
            </dependency>

            <!-- 处理 excel 的导入导出 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>${easyexcel.version}</version>
            </dependency>

            <!-- hutool 工具包 -->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>

            <!-- xml处理工具 -->
            <dependency>
                <groupId>org.dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>${dom4j.version}</version>
            </dependency>

            <!-- 加密库 -->
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk15on</artifactId>
                <version>${bcprov.version}</version>
            </dependency>

            <!-- ip地址处理工具 -->
            <dependency>
                <groupId>commons-net</groupId>
                <artifactId>commons-net</artifactId>
                <version>${commons-net.version}</version>
            </dependency>

            <!-- 字符串处理工具 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-text</artifactId>
                <version>${commons-text.version}</version>
            </dependency>

            <!-- 集合等工具包 -->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>${guava.version}</version>
            </dependency>

            <!-- 字符串处理等工具包 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>

            <!-- Java 对象与 XML 相互转换 -->
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>${xstream.version}</version>
            </dependency>

            <!-- Jackson Kotlin 模块 -->
            <dependency>
                <groupId>com.fasterxml.jackson.module</groupId>
                <artifactId>jackson-module-kotlin</artifactId>
                <version>${jackson-module-kotlin.version}</version>
            </dependency>

            <!-- 编码转换、加密等 -->
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>${commons-codec.version}</version>
            </dependency>

            <!-- 验证码生成 -->
            <dependency>
                <groupId>com.github.penggle</groupId>
                <artifactId>kaptcha</artifactId>
                <version>${kaptcha.version}</version>
            </dependency>

            <!-- 普罗米修斯监控面板 -->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-registry-prometheus</artifactId>
                <version>${prometheus.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <!-- 构建输出的文件名 -->
        <finalName>${project.name}-${profiles.active}-${project.version}</finalName>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <compilerArgument>-parameters</compilerArgument>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${springboot.version}</version>
            </plugin>

            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>${kotlin.version}</version>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                                <sourceDir>${project.basedir}/src/main/java</sourceDir>
                            </sourceDirs>
                        </configuration>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                                <sourceDir>${project.basedir}/src/test/java</sourceDir>
                            </sourceDirs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <!--开发环境-->
        <profile>
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!--测试环境-->
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>
        <!--预发布环境-->
        <profile>
            <id>pre</id>
            <properties>
                <profiles.active>pre</profiles.active>
            </properties>
        </profile>
        <!--生产环境-->
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
        </profile>
    </profiles>
</project>

配置文件

application.yml

# 多环境
spring:
  profiles:
    active: @profiles.active@

aplication-dev.yml

spring:
  # 数据库配置
  datasource:
    # 数据库连接地址
    url: jdbc:mysql://${mysql.server}:${mysql.port}/travel?useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
    # 数据库驱动
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 用户名
    username: ${mysql.username}
    # 密码
    password: ${mysql.password}
    # 数据连接池
    type: com.alibaba.druid.pool.DruidDataSource
    # 连接池配置
    druid:
      # 初始化连接池时创建的连接数量
      initial-size: 5
      # 连接池中最小的空闲连接数量
      min-idle: 5
      # 连接池中最大活跃连接数量
      max-active: 10
      # 当连接池没有可用连接时,最大等待时间(毫秒)
      max-wait: 60000
      # 连接池中空闲连接的检查频率(毫秒)
      time-between-eviction-runs-millis: 60000
      # 连接在连接池中保持空闲的最小时间(毫秒),超过此时间的连接将被移除
      min-evictable-idle-time-millis: 300000
      # 验证连接有效性的SQL
      validation-query: SELECT 1
      # 空闲时是否检查连接有效性
      test-while-idle: true
      # 获取连接时是否检查连接有效性
      test-on-borrow: true
      # 归还连接时是否检查连接有效性
      test-on-return: true
      # 保持长连接
      keep-alive: true
      # 打开PSCache,并且指定每个连接上PSCache的大小(提升写入、查询效率)
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计
      filters: stat,wall

  # redis 连接池配置信息
  data:
    redis:
      # Redis 数据库的索引
      database: 2
      # Redis 服务器地址
      host: ${redis.server}
      # 端口
      port: ${redis.port}
      # 密码
      password: ${redis.password}
      # 连接超时时间(毫秒)
      timeout: 10000ms
      # lettuce 连接池
      lettuce:
        pool:
          # 连接池中最大活跃连接数量
          max-active: 5
          # 连接池中最小的空闲连接数量
          min-idle: 1
          # 连接池中最大的空闲连接数量
          max-idle: 3
          # 当连接池没有可用的连接时,最大等待时间,单位为毫秒
          max-wait: 30000ms

  # 序列化配置
  jackson:
    serialization:
      # 枚举类型在序列化时将使用 toString() 方法的返回值
      write-enums-using-to-string: true
      # 日期类型在序列化时将以字符串格式输出,而不是时间戳
      write-dates-as-timestamps: false
    deserialization:
      # 反序列化时将使用枚举的 toString() 方法匹配字符串值
      read-enums-using-to-string: true
      # 反序列化时如果遇到未知属性将不会抛出异常
      fail-on-unknown-properties: false
    # 在序列化时始终包含所有属性
    default-property-inclusion: always
    # 序列化和反序列化日期格式
    date-format: yyyy-MM-dd HH:mm:ss
    # 设置时区为 GMT+8,用于处理日期和时间的时区问题
    time-zone: GMT+8

  # 文件上传配置
  servlet:
    multipart:
      max-file-size: 50MB
      max-request-size: 50MB

# MyBatis-Plus 配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# open api配置
springdoc:
  # Swagger UI
  swagger-ui:
    enabled: true
    # 关闭文档展开功能
    doc-expansion: none
    # 表示按字母顺序对标签进行排序
    tags-sorter: alpha
  # api 文档
  api-docs:
    # 开关
    enabled: true
    # 访问路径
    path: /v3/api-docs