diff --git a/README.md b/README.md index e666cf33..10bdedbc 100644 --- a/README.md +++ b/README.md @@ -196,8 +196,8 @@ Star走势图 * 17.支持SAAS服务模式,提供SaaS多租户架构方案。 * 18.分布式文件服务,集成minio、阿里OSS等优秀的第三方,提供便捷的文件上传与管理,同时也支持本地存储。 * 19.主流数据库兼容,一套代码完全兼容Mysql、Postgresql、Oracle、Sqlserver、MariaDB、达梦等主流数据库。 -* 20.集成工作流activiti、flowable,并实现了只需在页面配置流程转向,可极大的简化bpm工作流的开发;用bpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码; -* 21.低代码能力:在线流程设计,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转 +* 20.集成工作流flowable、activiti,并实现了只需在页面配置流程转向,可极大的简化bpm工作流的开发;用bpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码; +* 21.低代码能力:在线流程设计,采用开源flowable、activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转 * 22.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据; * 23.提供单点登录CAS集成方案,项目中已经提供完善的对接代码 * 24.低代码能力:表单设计器,支持用户自定义表单布局,支持单表,一对多表单、支持select、radio、checkbox、textarea、date、popup、列表、宏等控件 diff --git a/jeecg-boot-base-core/pom.xml b/jeecg-boot-base-core/pom.xml index 168dd94f..54498efd 100644 --- a/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot-base-core/pom.xml @@ -82,7 +82,7 @@ commons-io commons-io - ${commons.version} + ${commons-io.version} commons-lang @@ -183,9 +183,14 @@ - + + + com.github.xiaoymin + knife4j-openapi2-spring-boot-starter ${knife4j-spring-boot-starter.version} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java index b99df5f2..9294a5c2 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java @@ -348,8 +348,11 @@ public class CommonUtils { //返回 host domain String baseDomainPath = null; - int length = 80; - if(length == serverPort){ + //update-begin---author:wangshuai---date:2024-03-15---for:【QQYUN-8561】企业微信登陆请求接口设置上下文不一致,导致接口404--- + int httpPort = 80; + int httpsPort = 443; + if(httpPort == serverPort || httpsPort == serverPort){ + //update-end---author:wangshuai---date:2024-03-15---for:【QQYUN-8561】企业微信登陆请求接口设置上下文不一致,导致接口404---~ baseDomainPath = scheme + "://" + serverName + contextPath ; }else{ baseDomainPath = scheme + "://" + serverName + ":" + serverPort + contextPath ; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java index 7ec118e2..50551e40 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlInjection/parse/ConstAnalyzer.java @@ -1,55 +1,6 @@ package org.jeecg.common.util.sqlInjection.parse; -import net.sf.jsqlparser.expression.AllValue; -import net.sf.jsqlparser.expression.AnalyticExpression; -import net.sf.jsqlparser.expression.AnyComparisonExpression; -import net.sf.jsqlparser.expression.ArrayConstructor; -import net.sf.jsqlparser.expression.ArrayExpression; -import net.sf.jsqlparser.expression.BinaryExpression; -import net.sf.jsqlparser.expression.CaseExpression; -import net.sf.jsqlparser.expression.CastExpression; -import net.sf.jsqlparser.expression.CollateExpression; -import net.sf.jsqlparser.expression.ConnectByRootOperator; -import net.sf.jsqlparser.expression.DateTimeLiteralExpression; -import net.sf.jsqlparser.expression.DateValue; -import net.sf.jsqlparser.expression.DoubleValue; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.ExpressionVisitor; -import net.sf.jsqlparser.expression.ExtractExpression; -import net.sf.jsqlparser.expression.Function; -import net.sf.jsqlparser.expression.HexValue; -import net.sf.jsqlparser.expression.IntervalExpression; -import net.sf.jsqlparser.expression.JdbcNamedParameter; -import net.sf.jsqlparser.expression.JdbcParameter; -import net.sf.jsqlparser.expression.JsonAggregateFunction; -import net.sf.jsqlparser.expression.JsonExpression; -import net.sf.jsqlparser.expression.JsonFunction; -import net.sf.jsqlparser.expression.JsonFunctionExpression; -import net.sf.jsqlparser.expression.KeepExpression; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.MySQLGroupConcat; -import net.sf.jsqlparser.expression.NextValExpression; -import net.sf.jsqlparser.expression.NotExpression; -import net.sf.jsqlparser.expression.NullValue; -import net.sf.jsqlparser.expression.NumericBind; -import net.sf.jsqlparser.expression.OracleHierarchicalExpression; -import net.sf.jsqlparser.expression.OracleHint; -import net.sf.jsqlparser.expression.OracleNamedFunctionParameter; -import net.sf.jsqlparser.expression.Parenthesis; -import net.sf.jsqlparser.expression.RowConstructor; -import net.sf.jsqlparser.expression.RowGetExpression; -import net.sf.jsqlparser.expression.SignedExpression; -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.TimeKeyExpression; -import net.sf.jsqlparser.expression.TimeValue; -import net.sf.jsqlparser.expression.TimestampValue; -import net.sf.jsqlparser.expression.TimezoneExpression; -import net.sf.jsqlparser.expression.TryCastExpression; -import net.sf.jsqlparser.expression.UserVariable; -import net.sf.jsqlparser.expression.ValueListExpression; -import net.sf.jsqlparser.expression.VariableAssignment; -import net.sf.jsqlparser.expression.WhenClause; -import net.sf.jsqlparser.expression.XMLSerializeExpr; +import net.sf.jsqlparser.expression.*; import net.sf.jsqlparser.expression.operators.arithmetic.Addition; import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd; import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift; @@ -215,6 +166,23 @@ public class ConstAnalyzer implements ExpressionVisitor, ItemsListVisitor { expr.getBetweenExpressionEnd().accept(this); } +// /** +// * 用于处理 OverlapsCondition 类型的表达式 +// * @param overlapsCondition +// */ +// @Override +// public void visit(OverlapsCondition overlapsCondition) { +// constFlag.set(false); +// } +// /** +// * 用于处理 SafeCastExpression 类型的表达式。 +// * @param safeCastExpression +// */ +// @Override +// public void visit(SafeCastExpression safeCastExpression) { +// constFlag.set(false); +// } + @Override public void visit(EqualsTo expr) { visitBinaryExpression(expr); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java index 92e962e1..5723f1be 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java @@ -1,7 +1,6 @@ package org.jeecg.config; -import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import io.swagger.annotations.ApiOperation; import org.jeecg.common.constant.CommonConstant; import org.springframework.beans.BeansException; @@ -19,15 +18,13 @@ import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; -import springfox.documentation.swagger2.annotations.EnableSwagger2; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; import java.lang.reflect.Field; import java.util.ArrayList; @@ -39,8 +36,7 @@ import java.util.stream.Collectors; * @Author scott */ @Configuration -@EnableSwagger2 //开启 Swagger2 -@EnableKnife4j //开启 knife4j,可以不写 +@EnableSwagger2WebMvc @Import(BeanValidatorPluginsConfiguration.class) public class Swagger2Config implements WebMvcConfigurer { @@ -152,7 +148,7 @@ public class Swagger2Config implements WebMvcConfigurer { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { + if (bean instanceof WebMvcRequestHandlerProvider) { customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); } return bean; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 76cd0cdd..602259a8 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -173,6 +173,7 @@ public class ShiroConfig { // 企业微信证书排除 filterChainDefinitionMap.put("/WW_verify*", "anon"); + // 通过注解免登录url List ignoreAuthUrlList = collectIgnoreAuthUrl(); if (!CollectionUtils.isEmpty(ignoreAuthUrlList)) { @@ -181,6 +182,7 @@ public class ShiroConfig { } } + // 添加自己的过滤器并且取名为jwt Map filterMap = new HashMap(1); //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】 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: diff --git a/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml b/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml index 48ec3b01..38398678 100644 --- a/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml +++ b/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml @@ -73,9 +73,14 @@ com.github.xiaoymin - knife4j-spring-boot-starter + knife4j-openapi2-spring-boot-starter ${knife4j-spring-boot-starter.version} + + org.apache.commons + commons-lang3 + 3.12.0 + diff --git a/pom.xml b/pom.xml index 93b3f7e7..90d46a27 100644 --- a/pom.xml +++ b/pom.xml @@ -40,8 +40,7 @@ 2.2.0 1.2.83 1.6.0 - 3.0.3 - 2.0.9 + 4.4.0 42.2.25 11.2.0.3 @@ -55,10 +54,11 @@ 3.5.3.1 4.1.3 1.2.19 - 1.9.5 + 1.9.6 1.7.2-beta + 2.11.0 2.6 2.1.0 3.11.2 @@ -66,10 +66,10 @@ 1.12.0 3.11.0 3.2.2 - 1.4.6 + 1.4.7 1.4.7 8.0.3 - 1.3.4 + 1.4.0 1.6.1 7.4.0 @@ -365,6 +365,18 @@ commons-lang commons-lang + + commons-collections + commons-collections + + + commons-logging + commons-logging + + + commons-io + commons-io + @@ -394,7 +406,15 @@ org.jeecgframework.boot jeecg-boot-starter-chatgpt - ${jeecgboot.version} + ${jeecgboot.version} + + + + + + org.flywaydb + flyway-core + 7.15.0