diff --git a/jeecg-module-system/jeecg-system-start/pom.xml b/jeecg-module-system/jeecg-system-start/pom.xml index f04e8794..3499e865 100644 --- a/jeecg-module-system/jeecg-system-start/pom.xml +++ b/jeecg-module-system/jeecg-system-start/pom.xml @@ -43,11 +43,10 @@ ${dm8.version} - + org.flywaydb flyway-core - 7.15.0 diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java new file mode 100644 index 00000000..adc8e86d --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java @@ -0,0 +1,136 @@ +package org.jeecg.config.flyway; + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import lombok.extern.slf4j.Slf4j; +import org.flywaydb.core.Flyway; +import org.flywaydb.core.api.FlywayException; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import javax.sql.DataSource; +import java.util.Map; + +/** +* @Description: 初始化flyway配置 修改之后支持多数据源,当出现异常时打印日志,不影响项目启动 +* +* @author: wangshuai +* @date: 2024/3/12 10:03 +*/ +@Slf4j +@Configuration +public class FlywayConfig { + + @Autowired + private DataSource dataSource; + + @Autowired + private Environment environment; + + /** + * 是否开启flyway + */ + @Value("${spring.flyway.enabled:false}") + private Boolean enabled; + + /** + * 编码格式,默认UTF-8 + */ + @Value("${spring.flyway.encoding:UTF-8}") + private String encoding; + + /** + * 迁移sql脚本文件存放路径,官方默认db/migration + */ + @Value("${spring.flyway.locations:}") + private String locations; + + /** + * 迁移sql脚本文件名称的前缀,默认V + */ + @Value("${spring.flyway.sql-migration-prefix:V}") + private String sqlMigrationPrefix; + + /** + * 迁移sql脚本文件名称的分隔符,默认2个下划线__ + */ + @Value("${spring.flyway.sql-migration-separator:__}") + private String sqlMigrationSeparator; + + /** + * 文本前缀 + */ + @Value("${spring.flyway.placeholder-prefix:#(}") + private String placeholderPrefix; + + /** + * 文本后缀 + */ + @Value("${spring.flyway.placeholder-suffix:)}") + private String placeholderSuffix; + + /** + * 迁移sql脚本文件名称的后缀 + */ + @Value("${spring.flyway.sql-migration-suffixes:.sql}") + private String sqlMigrationSuffixes; + + /** + * 迁移时是否进行校验,默认true + */ + @Value("${spring.flyway.validate-on-migrate:true}") + private Boolean validateOnMigrate; + + /** + * 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表 + */ + @Value("${spring.flyway.baseline-on-migrate:true}") + private Boolean baselineOnMigrate; + + /** + * 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库,非常重要!!! + */ + @Value("${spring.flyway.clean-disabled:true}") + private Boolean cleanDisabled; + + @Bean + public void migrate() { + if(!enabled){ + return; + } + + DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; + Map dataSources = ds.getDataSources(); + dataSources.forEach((k, v) -> { + if("master".equals(k)){ + String databaseType = environment.getProperty("spring.datasource.dynamic.datasource." + k + ".url"); + if (databaseType != null && databaseType.contains("mysql")) { + try { + Flyway flyway = Flyway.configure() + .dataSource(v) + .locations(locations) + .encoding(encoding) + .sqlMigrationPrefix(sqlMigrationPrefix) + .sqlMigrationSeparator(sqlMigrationSeparator) + .placeholderPrefix(placeholderPrefix) + .placeholderSuffix(placeholderSuffix) + .sqlMigrationSuffixes(sqlMigrationSuffixes) + .validateOnMigrate(validateOnMigrate) + .baselineOnMigrate(baselineOnMigrate) + .cleanDisabled(cleanDisabled) + .load(); + flyway.migrate(); + log.info("【升级提示】平台集成了MySQL库的Flyway,数据库版本自动升级! "); + } catch (FlywayException e) { + log.error("【升级提示】flyway执行sql脚本失败", e); + } + } else { + log.warn("【升级提示】平台只集成了MySQL库的Flyway,实现了数据库版本自动升级! 其他类型的数据库,您可以考虑手工升级~"); + } + } + }); + } +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 783ec60a..3acf0b05 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -118,7 +118,9 @@ spring: resource: static-locations: classpath:/static/,classpath:/public/ autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: stat-view-servlet: @@ -261,7 +263,7 @@ jeecg: password: type: STANDALONE enabled: true - # ChartGPT对接配置 + # ai-chat ai-chat: # 是否开启;必须。 enabled: false diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml index 720c4437..0003ed03 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml @@ -118,7 +118,9 @@ spring: resource: static-locations: classpath:/static/,classpath:/public/ autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: stat-view-servlet: diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml index 9aa6f4e1..29970031 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml @@ -118,7 +118,9 @@ spring: resource: static-locations: classpath:/static/,classpath:/public/ autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: stat-view-servlet: