Parcourir la source

Merge branch 'master' of https://github.com/EightMonth/jeecg-boot

EightMonth il y a 1 an
Parent
commit
2cfc39b23f

+ 2 - 2
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、列表、宏等控件

+ 7 - 2
jeecg-boot-base-core/pom.xml

@@ -82,7 +82,7 @@
 		<dependency>
 			<groupId>commons-io</groupId>
 			<artifactId>commons-io</artifactId>
-			<version>${commons.version}</version>
+			<version>${commons-io.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>commons-lang</groupId>
@@ -183,9 +183,14 @@
 		</dependency>
 
 		<!-- knife4j -->
-		<dependency>
+<!--		<dependency>
 			<groupId>com.github.xiaoymin</groupId>
 			<artifactId>knife4j-spring-boot-starter</artifactId>
+			<version>3.0.3</version>
+		</dependency>-->
+		<dependency>
+			<groupId>com.github.xiaoymin</groupId>
+			<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
 			<version>${knife4j-spring-boot-starter.version}</version>
 		</dependency>
 

+ 5 - 2
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 ;

+ 18 - 50
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);

+ 3 - 7
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;

+ 2 - 0
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<String> ignoreAuthUrlList = collectIgnoreAuthUrl();
         if (!CollectionUtils.isEmpty(ignoreAuthUrlList)) {
@@ -181,6 +182,7 @@ public class ShiroConfig {
             }
         }
 
+
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
         //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】

+ 1 - 2
jeecg-module-system/jeecg-system-start/pom.xml

@@ -43,11 +43,10 @@
             <version>${dm8.version}</version>
         </dependency>
 
-        <!--支持 mysql5.7、mysql8、MariaDB10.3.16-->
+        <!-- flyway支持 mysql5.7、mysql8、MariaDB10.3.16 -->
         <dependency>
             <groupId>org.flywaydb</groupId>
             <artifactId>flyway-core</artifactId>
-            <version>7.15.0</version>
         </dependency>
     </dependencies>
 

+ 136 - 0
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<String, DataSource> 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,实现了数据库版本自动升级! 其他类型的数据库,您可以考虑手工升级~");
+                }
+            }
+        });
+    }
+}

+ 4 - 2
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

+ 3 - 1
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:

+ 3 - 1
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:

+ 6 - 1
jeecg-server-cloud/jeecg-cloud-gateway/pom.xml

@@ -73,9 +73,14 @@
         <!-- Swagger API文档 -->
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
             <version>${knife4j-spring-boot-starter.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 26 - 6
pom.xml

@@ -40,8 +40,7 @@
 		<xxl-job-core.version>2.2.0</xxl-job-core.version>
         <fastjson.version>1.2.83</fastjson.version>
 		<pegdown.version>1.6.0</pegdown.version>
-		<knife4j-spring-boot-starter.version>3.0.3</knife4j-spring-boot-starter.version>
-		<knife4j-spring-ui.version>2.0.9</knife4j-spring-ui.version>
+		<knife4j-spring-boot-starter.version>4.4.0</knife4j-spring-boot-starter.version>
 		<!-- 数据库驱动 -->
 		<postgresql.version>42.2.25</postgresql.version>
 		<ojdbc6.version>11.2.0.3</ojdbc6.version>
@@ -55,10 +54,11 @@
 		<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
 		<dynamic-datasource-spring-boot-starter.version>4.1.3</dynamic-datasource-spring-boot-starter.version>
 		<druid.version>1.2.19</druid.version>
-		<minidao.version>1.9.5</minidao.version>
+		<minidao.version>1.9.6</minidao.version>
 
 		<!-- 积木报表-->
 		<jimureport-spring-boot-starter.version>1.7.2-beta</jimureport-spring-boot-starter.version>
+		<commons-io.version>2.11.0</commons-io.version>
 		<commons.version>2.6</commons.version>
 		<aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
 		<aliyun.oss.version>3.11.2</aliyun.oss.version>
@@ -66,10 +66,10 @@
 		<shiro.version>1.12.0</shiro.version>
 		<java-jwt.version>3.11.0</java-jwt.version>
 		<shiro-redis.version>3.2.2</shiro-redis.version>
-		<codegenerate.version>1.4.6</codegenerate.version>
+		<codegenerate.version>1.4.7</codegenerate.version>
 		<autopoi-web.version>1.4.7</autopoi-web.version>
 		<minio.version>8.0.3</minio.version>
-		<justauth-spring-boot-starter.version>1.3.4</justauth-spring-boot-starter.version>
+		<justauth-spring-boot-starter.version>1.4.0</justauth-spring-boot-starter.version>
 		<dom4j.version>1.6.1</dom4j.version>
 		<qiniu-java-sdk.version>7.4.0</qiniu-java-sdk.version>
 		<!-- Log4j2爆雷漏洞 -->
@@ -365,6 +365,18 @@
 						<artifactId>commons-lang</artifactId>
 						<groupId>commons-lang</groupId>
 					</exclusion>
+					<exclusion>
+						<artifactId>commons-collections</artifactId>
+						<groupId>commons-collections</groupId>
+					</exclusion>
+					<exclusion>
+						<artifactId>commons-logging</artifactId>
+						<groupId>commons-logging</groupId>
+					</exclusion>
+					<exclusion>
+						<artifactId>commons-io</artifactId>
+						<groupId>commons-io</groupId>
+					</exclusion>
 				</exclusions>
 			</dependency>
 			<!-- minidao -->
@@ -394,7 +406,15 @@
 			<dependency>
 				<groupId>org.jeecgframework.boot</groupId>
 				<artifactId>jeecg-boot-starter-chatgpt</artifactId>
-				<version>${jeecgboot.version}</version>
+                <version>${jeecgboot.version}</version>
+			</dependency>
+            
+			<!--flyway 支持 mysql5.7+、MariaDB10.3.16-->
+			<!--mysql5.6,需要把版本号改成5.2.1-->
+			<dependency>
+				<groupId>org.flywaydb</groupId>
+				<artifactId>flyway-core</artifactId>
+				<version>7.15.0</version>
 			</dependency>
 		</dependencies>
 	</dependencyManagement>