From eca308e06fe2c172871f57d17837cb85035d8329 Mon Sep 17 00:00:00 2001
From: wangw <1594593906@qq.com>
Date: Mon, 30 Dec 2024 14:02:26 +0800
Subject: [PATCH 1/6] ShardingConfig
---
pom.xml | 55 ++++-
src/main/java/com/sqx/SqxApplication.java | 43 ++--
src/main/java/com/sqx/config/RedisConfig.java | 7 +
.../java/com/sqx/config/ShardingConfig.java | 153 ++++++++++++++
...ataSourcePoolMetricsAutoConfiguration.java | 67 ++++++
.../java/com/sqx/config/SwaggerConfig.java | 143 +++++++------
.../sqx/datasource/annotation/DataSource.java | 14 --
.../datasource/aspect/DataSourceAspect.java | 61 ------
.../config/DynamicContextHolder.java | 47 -----
.../datasource/config/DynamicDataSource.java | 15 --
.../config/DynamicDataSourceConfig.java | 53 -----
.../config/DynamicDataSourceFactory.java | 44 ----
.../properties/DataSourceProperties.java | 192 ------------------
.../DynamicDataSourceProperties.java | 22 --
.../app/controller/app/AppController.java | 2 +-
.../controller/app/AppCommonController.java | 2 +-
.../com/sqx/sharding/MasterSlaveRules.java | 22 ++
.../com/sqx/sharding/ShardingDataBase.java | 61 ++++++
src/main/resources/application-local.yml | 61 ++++++
src/main/resources/application.properties | 1 +
src/main/resources/application.yml | 10 +-
21 files changed, 542 insertions(+), 533 deletions(-)
create mode 100644 src/main/java/com/sqx/config/ShardingConfig.java
create mode 100644 src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
delete mode 100644 src/main/java/com/sqx/datasource/annotation/DataSource.java
delete mode 100644 src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicContextHolder.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicDataSource.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicDataSourceFactory.java
delete mode 100644 src/main/java/com/sqx/datasource/properties/DataSourceProperties.java
delete mode 100644 src/main/java/com/sqx/datasource/properties/DynamicDataSourceProperties.java
create mode 100644 src/main/java/com/sqx/sharding/MasterSlaveRules.java
create mode 100644 src/main/java/com/sqx/sharding/ShardingDataBase.java
create mode 100644 src/main/resources/application-local.yml
create mode 100644 src/main/resources/application.properties
diff --git a/pom.xml b/pom.xml
index b22e84e9..31ec0b85 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,12 +35,14 @@
7.2.23
3.4.0
4.4
- 2.7.0
+
+ 2.9.2
2.9.9
2.8.5
1.2.83
4.6.10
1.18.4
+ 4.1.1
+
+ com.baomidou
+ dynamic-datasource-spring-boot-starter
+ 4.1.3
+
+
mysql
mysql-connector-java
@@ -257,6 +278,23 @@
com.oracle
ojdbc6
${oracle.version}
+
+
+
+ org.apache.shardingsphere
+ sharding-core-api
+ ${shardingsphere.version}
+ compile
+
+
+ org.apache.shardingsphere
+ sharding-jdbc-core
+ ${shardingsphere.version}
+ compile
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
@@ -327,14 +365,25 @@
io.springfox
- springfox-swagger2
+ springfox-swagger-ui
${swagger.version}
io.springfox
- springfox-swagger-ui
+ springfox-swagger2
${swagger.version}
+
+ io.swagger
+ swagger-annotations
+ 1.5.22
+
+
+ io.swagger
+ swagger-models
+ 1.5.22
+
+
com.qiniu
qiniu-java-sdk
diff --git a/src/main/java/com/sqx/SqxApplication.java b/src/main/java/com/sqx/SqxApplication.java
index a3c22cfd..fada8ced 100644
--- a/src/main/java/com/sqx/SqxApplication.java
+++ b/src/main/java/com/sqx/SqxApplication.java
@@ -1,6 +1,7 @@
package com.sqx;
import com.sqx.modules.pay.wuyou.WuyouPay;
+import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@@ -18,25 +19,29 @@ import java.util.Map;
public class SqxApplication {
public static void main(String[] args) {
- ConfigurableApplicationContext context = SpringApplication.run(SqxApplication.class, args);
- context.getEnvironment().getPropertySources().forEach(source -> {
- if (source.getName().contains("application-dev.yml") || source.getName().contains("application-prod.yml")) {
- if (source.getSource() instanceof Map) {
- ((Map) source.getSource()).forEach((key, value) -> {
- System.out.println(key + ": " + value);
- if ("pay.orderNotifyUrl".equals(key)) {
- WuyouPay.setNotifyUrl(value.toString());
- }
- if ("pay.extractNotifyUrl".equals(key)) {
- WuyouPay.setExtractNotifyUrl(value.toString());
- }
- if ("pay.h5BaseUrl".equals(key)) {
- WuyouPay.setH5BaseUrl(value.toString());
- }
- });
- }
- }
- });
+ SpringApplication application = new SpringApplication(SqxApplication.class);
+ application.setBannerMode(Banner.Mode.OFF);
+ application.run(args);
+
+// ConfigurableApplicationContext context = SpringApplication.run(SqxApplication.class, args);
+// context.getEnvironment().getPropertySources().forEach(source -> {
+// if (source.getName().contains("application-dev.yml") || source.getName().contains("application-prod.yml")) {
+// if (source.getSource() instanceof Map) {
+// ((Map) source.getSource()).forEach((key, value) -> {
+// System.out.println(key + ": " + value);
+// if ("pay.orderNotifyUrl".equals(key)) {
+// WuyouPay.setNotifyUrl(value.toString());
+// }
+// if ("pay.extractNotifyUrl".equals(key)) {
+// WuyouPay.setExtractNotifyUrl(value.toString());
+// }
+// if ("pay.h5BaseUrl".equals(key)) {
+// WuyouPay.setH5BaseUrl(value.toString());
+// }
+// });
+// }
+// }
+// });
System.out.println("(♥◠‿◠)ノ゙ 短剧系统启动成功 ლ(´ڡ`ლ)゙ \n"+
" _ \n" +
" | | \n" +
diff --git a/src/main/java/com/sqx/config/RedisConfig.java b/src/main/java/com/sqx/config/RedisConfig.java
index 6fddb78c..3188988c 100644
--- a/src/main/java/com/sqx/config/RedisConfig.java
+++ b/src/main/java/com/sqx/config/RedisConfig.java
@@ -1,5 +1,6 @@
package com.sqx.config;
+import com.sqx.common.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
@@ -70,4 +71,10 @@ public class RedisConfig {
public ZSetOperations zSetOperations(RedisTemplate redisTemplate) {
return redisTemplate.opsForZSet();
}
+
+ @Bean
+ public RedisUtils redisUtils() {
+ // 根据实际情况初始化RedisUtils实例,可能需要传入相关配置参数,如Redis连接信息等
+ return new RedisUtils();
+ }
}
diff --git a/src/main/java/com/sqx/config/ShardingConfig.java b/src/main/java/com/sqx/config/ShardingConfig.java
new file mode 100644
index 00000000..12e0e2ed
--- /dev/null
+++ b/src/main/java/com/sqx/config/ShardingConfig.java
@@ -0,0 +1,153 @@
+package com.sqx.config;
+
+import com.sqx.sharding.MasterSlaveRules;
+import com.sqx.sharding.ShardingDataBase;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.api.config.masterslave.MasterSlaveRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
+import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * sharding-jdbc 配置文件
+ */
+@Slf4j
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "spring.shardingsphere")
+public class ShardingConfig {
+
+ /**
+ * 读取数据源信息
+ */
+ private Map datasource;
+ /**
+ * 读写分离的配置
+ */
+ private Map masterSlaveRules;
+ /**
+ * 显示sharding-jdbc的sql
+ */
+ private String showSql;
+
+ /**
+ * 中心库的节点
+ */
+ private String centerTablesDataNode;
+
+ @Value("${center-tables}")
+ private String tableNamesAsString;
+
+ /**
+ * 中心表,不进行分库操作
+ */
+// @Value("${center-tables}")
+ private Set centerTables;
+
+ @PostConstruct
+ public void init() {
+ // 使用换行符进行分割,然后去除空白字符,收集到Set集合中
+ centerTables = Arrays.stream(tableNamesAsString.split(","))
+ .map(String::trim)
+ .collect(Collectors.toSet());
+ }
+
+
+ /**
+ * 配置sharding-jdbc数据源
+ */
+ @Bean
+ public DataSource dataSource() throws SQLException {
+ ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
+
+ // 配置数据库主从
+ shardingRuleConfig.setMasterSlaveRuleConfigs(masterSlaveRuleConfigs());
+
+ // 配置表的切分策略
+ shardingRuleConfig.setTableRuleConfigs(addTableRuleConfigs());
+
+ // 配置是否显示sql
+// Properties props = new Properties();
+// props.put("sql.show", true);
+
+ // 配置数据源
+ Map dataSourceMap = getShardingDataBase();
+ return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, null);
+// return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
+ }
+
+ /**
+ * 配置
+ */
+ private Set addTableRuleConfigs() {
+ Set sets = new HashSet<>();
+ for (String centerTable : centerTables) {
+ TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(centerTable,
+ String.format(centerTablesDataNode, centerTable));
+ sets.add(tableRuleConfig);
+ }
+
+// // 定义区域表的分库规则
+// InlineShardingStrategyConfiguration databaseShardingStrategyConfig = new InlineShardingStrategyConfiguration(
+// regionTablesShardingDatabaseColumn, regionTablesShardingDatabaseAlgorithm);
+// for (String regionTable : regionTables) {
+// TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(regionTable, String.format(regionTablesDataNode, regionTable));
+// tableRuleConfig.setDatabaseShardingStrategyConfig(databaseShardingStrategyConfig);
+// sets.add(tableRuleConfig);
+// }
+ return sets;
+ }
+
+ /**
+ * 配置数据源
+ */
+ private Map getShardingDataBase() {
+ String testQuery = "SELECT 1";
+ Map map = new HashMap<>();
+ datasource.forEach((datasourceName, shardingDataBase) -> {
+ HikariConfig config = new HikariConfig();
+ config.setDriverClassName(shardingDataBase.getDriverClassName());
+ config.setJdbcUrl(shardingDataBase.getJdbcUrl());
+ config.setUsername(shardingDataBase.getUsername());
+ config.setPassword(shardingDataBase.getPassword());
+ config.setPoolName(datasourceName);
+ config.setMinimumIdle(shardingDataBase.getMinimumIdle());
+ config.setMaximumPoolSize(shardingDataBase.getMaximumPoolSize());
+ config.setIdleTimeout(shardingDataBase.getIdleTimeout());
+ config.setMaxLifetime(shardingDataBase.getMaxLifetime());
+ config.setConnectionTimeout(shardingDataBase.getConnectionTimeout());
+ config.setConnectionTestQuery(testQuery);
+ map.put(datasourceName, new HikariDataSource(config));
+ });
+ return map;
+ }
+
+ /**
+ * 配置读写分离
+ */
+ private Set masterSlaveRuleConfigs() {
+ Set sets = new HashSet<>();
+ masterSlaveRules.forEach((databaseName, masterSlaveRules) -> {
+ MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration(databaseName,
+ masterSlaveRules.getMasterDataSourceName(), masterSlaveRules.getSlaveDataSourceNames());
+ System.out.println("写入"+masterSlaveRules.getMasterDataSourceName());
+ System.out.println("读出"+masterSlaveRules.getSlaveDataSourceNames());
+ sets.add(masterSlaveRuleConfig);
+ });
+ return sets;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java b/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
new file mode 100644
index 00000000..c3454b5a
--- /dev/null
+++ b/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
@@ -0,0 +1,67 @@
+package com.sqx.config;
+
+import com.zaxxer.hikari.HikariDataSource;
+import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory;
+import io.micrometer.core.instrument.MeterRegistry;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
+import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.jdbc.DataSourceUnwrapper;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.util.Collection;
+
+/**
+ * @author wxkj0012
+ */
+@Configuration(proxyBeanMethods = false)
+@AutoConfigureAfter({MetricsAutoConfiguration.class, DataSourceAutoConfiguration.class,
+ SimpleMetricsExportAutoConfiguration.class})
+@ConditionalOnClass({DataSource.class, MeterRegistry.class})
+@ConditionalOnBean({DataSource.class, MeterRegistry.class})
+@Slf4j
+public class ShardingDataSourcePoolMetricsAutoConfiguration {
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass({ShardingDataSource.class, HikariDataSource.class})
+ static class ShardingDataSourceMetricsConfiguration {
+
+ private final MeterRegistry registry;
+
+ ShardingDataSourceMetricsConfiguration(MeterRegistry registry) {
+ this.registry = registry;
+ }
+
+ @Autowired
+ void bindMetricsRegistryToHikariDataSources(Collection dataSources) {
+ for (DataSource dataSource : dataSources) {
+ ShardingDataSource shardingDataSource = DataSourceUnwrapper.unwrap(dataSource, ShardingDataSource.class);
+ Collection shardDataSources = shardingDataSource.getDataSourceMap().values();
+ for (DataSource ds : shardDataSources) {
+ HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap(ds, HikariDataSource.class);
+ if (hikariDataSource != null) {
+ bindMetricsRegistryToHikariDataSource(hikariDataSource);
+ }
+ }
+ }
+ }
+
+ private void bindMetricsRegistryToHikariDataSource(HikariDataSource hikari) {
+ if (hikari.getMetricRegistry() == null && hikari.getMetricsTrackerFactory() == null) {
+ try {
+ hikari.setMetricsTrackerFactory(new MicrometerMetricsTrackerFactory(this.registry));
+ } catch (Exception ex) {
+ log.warn("Failed to bind Hikari metrics: {}}", ex.getMessage());
+ }
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/config/SwaggerConfig.java b/src/main/java/com/sqx/config/SwaggerConfig.java
index 8cf4bfee..8f991bfa 100644
--- a/src/main/java/com/sqx/config/SwaggerConfig.java
+++ b/src/main/java/com/sqx/config/SwaggerConfig.java
@@ -1,58 +1,85 @@
-package com.sqx.config;
-
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.ApiKey;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-import java.util.List;
-
-import static com.google.common.collect.Lists.newArrayList;
-
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig implements WebMvcConfigurer {
-
- @Value("${swagger.enabled}")
- private boolean enabled;
-
- @Bean
- public Docket createRestApi() {
- return new Docket(DocumentationType.SWAGGER_2)
- .enable(enabled)
- .apiInfo(apiInfo())
- .select()
- //加了ApiOperation注解的类,才生成接口文档
- .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
- //包下的类,才生成接口文档
- //.apis(RequestHandlerSelectors.basePackage("com.sqx.controller"))
- .paths(PathSelectors.any())
- .build()
- .securitySchemes(security());
- }
-
- private ApiInfo apiInfo() {
- return new ApiInfoBuilder()
- .title("")
- .description("sqx-fast文档")
- .termsOfServiceUrl("")
- .version("3.0.0")
- .build();
- }
-
- private List security() {
- return newArrayList(
- new ApiKey("token", "token", "header")
- );
- }
-
-}
\ No newline at end of file
+//package com.sqx.config;
+//
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Profile;
+//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+//import springfox.documentation.builders.ApiInfoBuilder;
+//import springfox.documentation.builders.PathSelectors;
+//import springfox.documentation.builders.RequestHandlerSelectors;
+//import springfox.documentation.service.ApiInfo;
+//import springfox.documentation.service.ApiKey;
+//import springfox.documentation.spi.DocumentationType;
+//import springfox.documentation.spring.web.plugins.Docket;
+//import springfox.documentation.swagger2.annotations.EnableSwagger2;
+//
+//import java.util.List;
+//
+//import static com.google.common.collect.Lists.newArrayList;
+//
+////@Configuration
+////@EnableSwagger2
+////public class SwaggerConfig implements WebMvcConfigurer {
+////
+//// @Value("${swagger.enabled}")
+//// private boolean enabled;
+////
+//// @Bean
+//// public Docket createRestApi() {
+//// return new Docket(DocumentationType.SWAGGER_2)
+//// .enable(enabled)
+//// .apiInfo(apiInfo())
+//// .select()
+//// //加了ApiOperation注解的类,才生成接口文档
+//// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+//// //包下的类,才生成接口文档
+//// //.apis(RequestHandlerSelectors.basePackage("com.sqx.controller"))
+//// .paths(PathSelectors.any())
+//// .build()
+//// .securitySchemes(security());
+//// }
+////
+//// private ApiInfo apiInfo() {
+//// return new ApiInfoBuilder()
+//// .title("")
+//// .description("sqx-fast文档")
+//// .termsOfServiceUrl("")
+//// .version("3.0.0")
+//// .build();
+//// }
+////
+//// private List security() {
+//// return newArrayList(
+//// new ApiKey("token", "token", "header")
+//// );
+//// }
+////
+////}
+//
+//@Configuration
+//@EnableSwagger2
+//@Profile({"local", "dev"})
+//public class SwaggerConfig {
+//
+// @Bean
+// public Docket api() {
+// return new Docket(DocumentationType.SWAGGER_2)
+// .apiInfo(apiInfo())
+// .select()
+// .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+// .paths(PathSelectors.any())
+// .build();
+// }
+//
+// private ApiInfo apiInfo() {
+// return new ApiInfoBuilder()
+// .title("悠车位后台API接口文档")
+// .description("悠车位服务端后台API接口文档")
+// .version("1.0")
+// .build();
+// }
+//}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/datasource/annotation/DataSource.java b/src/main/java/com/sqx/datasource/annotation/DataSource.java
deleted file mode 100644
index 082da71b..00000000
--- a/src/main/java/com/sqx/datasource/annotation/DataSource.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.sqx.datasource.annotation;
-
-import java.lang.annotation.*;
-
-/**
- * 多数据源注解
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface DataSource {
- String value() default "";
-}
diff --git a/src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java b/src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java
deleted file mode 100644
index b3c5d0ac..00000000
--- a/src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.sqx.datasource.aspect;
-
-
-import com.sqx.datasource.annotation.DataSource;
-import com.sqx.datasource.config.DynamicContextHolder;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Method;
-
-/**
- * 多数据源,切面处理类
- */
-@Aspect
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class DataSourceAspect {
- protected Logger logger = LoggerFactory.getLogger(getClass());
-
- @Pointcut("@annotation(com.sqx.datasource.annotation.DataSource) " +
- "|| @within(com.sqx.datasource.annotation.DataSource)")
- public void dataSourcePointCut() {
-
- }
-
- @Around("dataSourcePointCut()")
- public Object around(ProceedingJoinPoint point) throws Throwable {
- MethodSignature signature = (MethodSignature) point.getSignature();
- Class targetClass = point.getTarget().getClass();
- Method method = signature.getMethod();
-
- DataSource targetDataSource = (DataSource)targetClass.getAnnotation(DataSource.class);
- DataSource methodDataSource = method.getAnnotation(DataSource.class);
- if(targetDataSource != null || methodDataSource != null){
- String value;
- if(methodDataSource != null){
- value = methodDataSource.value();
- }else {
- value = targetDataSource.value();
- }
-
- DynamicContextHolder.push(value);
- logger.debug("set datasource is {}", value);
- }
-
- try {
- return point.proceed();
- } finally {
- DynamicContextHolder.poll();
- logger.debug("clean datasource");
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/datasource/config/DynamicContextHolder.java b/src/main/java/com/sqx/datasource/config/DynamicContextHolder.java
deleted file mode 100644
index f059bf76..00000000
--- a/src/main/java/com/sqx/datasource/config/DynamicContextHolder.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.sqx.datasource.config;
-
-import java.util.ArrayDeque;
-import java.util.Deque;
-
-/**
- * 多数据源上下文
- */
-public class DynamicContextHolder {
- @SuppressWarnings("unchecked")
- private static final ThreadLocal> CONTEXT_HOLDER = new ThreadLocal() {
- @Override
- protected Object initialValue() {
- return new ArrayDeque();
- }
- };
-
- /**
- * 获得当前线程数据源
- *
- * @return 数据源名称
- */
- public static String peek() {
- return CONTEXT_HOLDER.get().peek();
- }
-
- /**
- * 设置当前线程数据源
- *
- * @param dataSource 数据源名称
- */
- public static void push(String dataSource) {
- CONTEXT_HOLDER.get().push(dataSource);
- }
-
- /**
- * 清空当前线程数据源
- */
- public static void poll() {
- Deque deque = CONTEXT_HOLDER.get();
- deque.poll();
- if (deque.isEmpty()) {
- CONTEXT_HOLDER.remove();
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/datasource/config/DynamicDataSource.java b/src/main/java/com/sqx/datasource/config/DynamicDataSource.java
deleted file mode 100644
index 4374032b..00000000
--- a/src/main/java/com/sqx/datasource/config/DynamicDataSource.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.sqx.datasource.config;
-
-import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
-/**
- * 多数据源
- */
-public class DynamicDataSource extends AbstractRoutingDataSource {
-
- @Override
- protected Object determineCurrentLookupKey() {
- return DynamicContextHolder.peek();
- }
-
-}
diff --git a/src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java b/src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java
deleted file mode 100644
index 9c1033fd..00000000
--- a/src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.sqx.datasource.config;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import com.sqx.datasource.properties.DataSourceProperties;
-import com.sqx.datasource.properties.DynamicDataSourceProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 配置多数据源
- */
-@Configuration
-@EnableConfigurationProperties(DynamicDataSourceProperties.class)
-public class DynamicDataSourceConfig {
- @Autowired
- private DynamicDataSourceProperties properties;
-
- @Bean
- @ConfigurationProperties(prefix = "spring.datasource.druid")
- public DataSourceProperties dataSourceProperties() {
- return new DataSourceProperties();
- }
-
- @Bean
- public DynamicDataSource dynamicDataSource(DataSourceProperties dataSourceProperties) {
- DynamicDataSource dynamicDataSource = new DynamicDataSource();
- dynamicDataSource.setTargetDataSources(getDynamicDataSource());
-
- //默认数据源
- DruidDataSource defaultDataSource = DynamicDataSourceFactory.buildDruidDataSource(dataSourceProperties);
- dynamicDataSource.setDefaultTargetDataSource(defaultDataSource);
-
- return dynamicDataSource;
- }
-
- private Map
-
- com.alibaba
- druid
- 1.1.10
-
+
+
+
+
+
com.auth0
@@ -262,11 +262,11 @@
-
- com.baomidou
- dynamic-datasource-spring-boot-starter
- 4.1.3
-
+
+
+
+
+
mysql
@@ -274,11 +274,11 @@
${mysql.version}
-
- com.oracle
- ojdbc6
- ${oracle.version}
-
+
+
+
+
+
org.apache.shardingsphere
@@ -303,10 +303,10 @@
${mssql.version}
-
- org.postgresql
- postgresql
-
+
+
+
+
com.alibaba
druid-spring-boot-starter
diff --git a/src/main/java/com/sqx/common/utils/IPUtils.java b/src/main/java/com/sqx/common/utils/IPUtils.java
index 0fbd6c9f..24248d3f 100644
--- a/src/main/java/com/sqx/common/utils/IPUtils.java
+++ b/src/main/java/com/sqx/common/utils/IPUtils.java
@@ -1,6 +1,6 @@
package com.sqx.common.utils;
-import com.alibaba.druid.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/com/sqx/config/ShardingConfig.java b/src/main/java/com/sqx/config/ShardingConfig.java
index 12e0e2ed..f8efb899 100644
--- a/src/main/java/com/sqx/config/ShardingConfig.java
+++ b/src/main/java/com/sqx/config/ShardingConfig.java
@@ -81,13 +81,12 @@ public class ShardingConfig {
shardingRuleConfig.setTableRuleConfigs(addTableRuleConfigs());
// 配置是否显示sql
-// Properties props = new Properties();
-// props.put("sql.show", true);
+ Properties props = new Properties();
+ props.put("sql.show", showSql);
// 配置数据源
Map dataSourceMap = getShardingDataBase();
- return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, null);
-// return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
+ return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
}
/**
@@ -144,8 +143,6 @@ public class ShardingConfig {
masterSlaveRules.forEach((databaseName, masterSlaveRules) -> {
MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration(databaseName,
masterSlaveRules.getMasterDataSourceName(), masterSlaveRules.getSlaveDataSourceNames());
- System.out.println("写入"+masterSlaveRules.getMasterDataSourceName());
- System.out.println("读出"+masterSlaveRules.getSlaveDataSourceNames());
sets.add(masterSlaveRuleConfig);
});
return sets;
diff --git a/src/main/java/com/sqx/modules/job/config/ScheduleConfig.java b/src/main/java/com/sqx/modules/job/config/ScheduleConfig.java
deleted file mode 100644
index 8b7653b7..00000000
--- a/src/main/java/com/sqx/modules/job/config/ScheduleConfig.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.sqx.modules.job.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
-
-import javax.sql.DataSource;
-import java.util.Properties;
-
-/**
- * 定时任务配置
- *
- */
-@Configuration
-public class ScheduleConfig {
-
- @Bean
- public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
- SchedulerFactoryBean factory = new SchedulerFactoryBean();
- factory.setDataSource(dataSource);
-
- //quartz参数
- Properties prop = new Properties();
- prop.put("org.quartz.scheduler.instanceName", "sqxScheduler");
- prop.put("org.quartz.scheduler.instanceId", "AUTO");
- //线程池配置
- prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
- prop.put("org.quartz.threadPool.threadCount", "20");
- prop.put("org.quartz.threadPool.threadPriority", "5");
- //JobStore配置
- prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
- //集群配置
- prop.put("org.quartz.jobStore.isClustered", "true");
- prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
- prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
-
- prop.put("org.quartz.jobStore.misfireThreshold", "12000");
- prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
- prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
-
- //PostgreSQL数据库,需要打开此注释
- //prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
-
- factory.setQuartzProperties(prop);
-
- factory.setSchedulerName("sqxScheduler");
- //延时启动
- factory.setStartupDelay(30);
- factory.setApplicationContextSchedulerContextKey("applicationContextKey");
- //可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
- factory.setOverwriteExistingJobs(true);
- //设置自动启动,默认为true
- factory.setAutoStartup(true);
-
- return factory;
- }
-}
diff --git a/src/main/java/com/sqx/modules/job/controller/ScheduleJobController.java b/src/main/java/com/sqx/modules/job/controller/ScheduleJobController.java
index 3ab91d53..3acdc51e 100644
--- a/src/main/java/com/sqx/modules/job/controller/ScheduleJobController.java
+++ b/src/main/java/com/sqx/modules/job/controller/ScheduleJobController.java
@@ -81,34 +81,34 @@ public class ScheduleJobController {
/**
* 立即执行任务
*/
- @SysLog("立即执行任务")
- @RequestMapping("/run")
- public Result run(@RequestBody Long[] jobIds){
- scheduleJobService.run(jobIds);
-
- return Result.success();
- }
-
- /**
- * 暂停定时任务
- */
- @SysLog("暂停定时任务")
- @RequestMapping("/pause")
- public Result pause(@RequestBody Long[] jobIds){
- scheduleJobService.pause(jobIds);
-
- return Result.success();
- }
-
- /**
- * 恢复定时任务
- */
- @SysLog("恢复定时任务")
- @RequestMapping("/resume")
- public Result resume(@RequestBody Long[] jobIds){
- scheduleJobService.resume(jobIds);
-
- return Result.success();
- }
+// @SysLog("立即执行任务")
+// @RequestMapping("/run")
+// public Result run(@RequestBody Long[] jobIds){
+// scheduleJobService.run(jobIds);
+//
+// return Result.success();
+// }
+//
+// /**
+// * 暂停定时任务
+// */
+// @SysLog("暂停定时任务")
+// @RequestMapping("/pause")
+// public Result pause(@RequestBody Long[] jobIds){
+// scheduleJobService.pause(jobIds);
+//
+// return Result.success();
+// }
+//
+// /**
+// * 恢复定时任务
+// */
+// @SysLog("恢复定时任务")
+// @RequestMapping("/resume")
+// public Result resume(@RequestBody Long[] jobIds){
+// scheduleJobService.resume(jobIds);
+//
+// return Result.success();
+// }
}
diff --git a/src/main/java/com/sqx/modules/job/service/ScheduleJobService.java b/src/main/java/com/sqx/modules/job/service/ScheduleJobService.java
index 407a197d..515663c4 100644
--- a/src/main/java/com/sqx/modules/job/service/ScheduleJobService.java
+++ b/src/main/java/com/sqx/modules/job/service/ScheduleJobService.java
@@ -34,18 +34,18 @@ public interface ScheduleJobService extends IService {
*/
int updateBatch(Long[] jobIds, int status);
- /**
- * 立即执行
- */
- void run(Long[] jobIds);
-
- /**
- * 暂停运行
- */
- void pause(Long[] jobIds);
-
- /**
- * 恢复运行
- */
- void resume(Long[] jobIds);
+// /**
+// * 立即执行
+// */
+// void run(Long[] jobIds);
+//
+// /**
+// * 暂停运行
+// */
+// void pause(Long[] jobIds);
+//
+// /**
+// * 恢复运行
+// */
+// void resume(Long[] jobIds);
}
diff --git a/src/main/java/com/sqx/modules/job/service/impl/ScheduleJobServiceImpl.java b/src/main/java/com/sqx/modules/job/service/impl/ScheduleJobServiceImpl.java
index 33db3560..84f29fa4 100644
--- a/src/main/java/com/sqx/modules/job/service/impl/ScheduleJobServiceImpl.java
+++ b/src/main/java/com/sqx/modules/job/service/impl/ScheduleJobServiceImpl.java
@@ -9,38 +9,22 @@ import com.sqx.common.utils.Query;
import com.sqx.modules.job.dao.ScheduleJobDao;
import com.sqx.modules.job.entity.ScheduleJobEntity;
import com.sqx.modules.job.service.ScheduleJobService;
-import com.sqx.modules.job.utils.ScheduleUtils;
import org.apache.commons.lang.StringUtils;
-import org.quartz.CronTrigger;
-import org.quartz.Scheduler;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.PostConstruct;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
@Service("scheduleJobService")
public class ScheduleJobServiceImpl extends ServiceImpl implements ScheduleJobService {
- @Autowired
- private Scheduler scheduler;
/**
* 项目启动时,初始化定时器
*/
- @PostConstruct
- public void init(){
- List scheduleJobList = this.list();
- for(ScheduleJobEntity scheduleJob : scheduleJobList){
- CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
- //如果不存在,则创建
- if(cronTrigger == null) {
- ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
- }else {
- ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
- }
- }
- }
+
@Override
public PageUtils queryPage(Map params) {
@@ -61,25 +45,18 @@ public class ScheduleJobServiceImpl extends ServiceImpl cashOuts = cashOutDao.selectYesterday();
diff --git a/src/main/java/com/sqx/modules/job/task/CashOutTask2.java b/src/main/java/com/sqx/modules/job/task/CashOutTask2.java
index 8cc74dae..365e2135 100644
--- a/src/main/java/com/sqx/modules/job/task/CashOutTask2.java
+++ b/src/main/java/com/sqx/modules/job/task/CashOutTask2.java
@@ -15,6 +15,7 @@ import com.sqx.modules.utils.AliPayOrderUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@@ -23,8 +24,8 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
-@Component("CashOutTask2")
-public class CashOutTask2 implements ITask {
+@Component
+public class CashOutTask2{
@Resource
private CashOutDao cashOutDao;
@@ -35,7 +36,6 @@ public class CashOutTask2 implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass());
- @Override
public void run(String params) {
logger.info("提现开始");
if (StringUtils.isBlank(params) || isValidDate(params)) {
diff --git a/src/main/java/com/sqx/modules/job/task/ITask.java b/src/main/java/com/sqx/modules/job/task/ITask.java
deleted file mode 100644
index 2e98de28..00000000
--- a/src/main/java/com/sqx/modules/job/task/ITask.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.sqx.modules.job.task;
-
-/**
- * 定时任务接口,所有定时任务都要实现该接口
- *
- */
-public interface ITask {
-
- /**
- * 执行定时任务接口
- *
- * @param params 参数,多参数使用JSON数据
- */
- void run(String params);
-}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/modules/job/task/SpinningTask3.java b/src/main/java/com/sqx/modules/job/task/SpinningTask3.java
index 2f083680..fc3d89c8 100644
--- a/src/main/java/com/sqx/modules/job/task/SpinningTask3.java
+++ b/src/main/java/com/sqx/modules/job/task/SpinningTask3.java
@@ -9,14 +9,17 @@ import com.sqx.modules.discSpinning.service.DiscSpinningService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
-@Component("SpinningTask3")
-public class SpinningTask3 implements ITask {
+@Component
+@EnableScheduling
+public class SpinningTask3 {
@Resource
private DiscSpinningService spinningController;
@@ -25,8 +28,12 @@ public class SpinningTask3 implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass());
- @Override
- public void run(String params) {
+ @Scheduled(cron = "0 0/2 * * * ? ")
+ public void record() {
+ record("1");
+ }
+
+ public void record(String params) {
logger.info("大转盘到账补偿机制");
// 获取当前时间
Date now = DateUtil.date();
@@ -48,6 +55,7 @@ public class SpinningTask3 implements ITask {
recordQueryWrapper.lt("create_time", fiveMinutesAgoStr);
//小于
recordQueryWrapper.gt("create_time", tenMinutesAgoStr);
+ logger.info("大转盘到账补偿时间范围:{}-----{}", tenMinutesAgoStr, fiveMinutesAgoStr);
List list = recordService.list(recordQueryWrapper);
ThreadUtil.execAsync(() -> {
for (DiscSpinningRecord record : list) {
diff --git a/src/main/java/com/sqx/modules/job/task/SupplyAgainSignRewardTask.java b/src/main/java/com/sqx/modules/job/task/SupplyAgainSignRewardTask.java
index 57527923..6c5dd15e 100644
--- a/src/main/java/com/sqx/modules/job/task/SupplyAgainSignRewardTask.java
+++ b/src/main/java/com/sqx/modules/job/task/SupplyAgainSignRewardTask.java
@@ -21,8 +21,8 @@ import java.util.List;
* @author GYJoker
*/
@Slf4j
-@Component("SupplyAgainSignRewardTask")
-public class SupplyAgainSignRewardTask implements ITask {
+@Component
+public class SupplyAgainSignRewardTask{
@Autowired
private UserService userService;
@@ -35,7 +35,6 @@ public class SupplyAgainSignRewardTask implements ITask {
@Autowired
private UserMoneyService userMoneyService;
- @Override
public void run(String params) {
if (StringUtils.isBlank(params)) {
log.error("参数为空");
diff --git a/src/main/java/com/sqx/modules/job/task/TempCashOutTask.java b/src/main/java/com/sqx/modules/job/task/TempCashOutTask.java
index a7a9adc2..8b2ab3ea 100644
--- a/src/main/java/com/sqx/modules/job/task/TempCashOutTask.java
+++ b/src/main/java/com/sqx/modules/job/task/TempCashOutTask.java
@@ -15,8 +15,8 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
-@Component("TempCashOutTask")
-public class TempCashOutTask implements ITask {
+@Component
+public class TempCashOutTask{
@Resource
private CashOutDao cashOutDao;
@@ -27,7 +27,6 @@ public class TempCashOutTask implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass());
- @Override
public void run(String params) {
logger.info("提现开始");
List cashOuts = cashOutDao.selectTemp();
diff --git a/src/main/java/com/sqx/modules/job/task/TempOrdersTask.java b/src/main/java/com/sqx/modules/job/task/TempOrdersTask.java
index f9d5d4d1..74cb5a16 100644
--- a/src/main/java/com/sqx/modules/job/task/TempOrdersTask.java
+++ b/src/main/java/com/sqx/modules/job/task/TempOrdersTask.java
@@ -40,8 +40,8 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
-@Component("TempOrdersTask")
-public class TempOrdersTask implements ITask {
+@Component
+public class TempOrdersTask {
@Resource
private OrdersDao ordersDao;
@@ -69,7 +69,6 @@ public class TempOrdersTask implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass());
- @Override
public void run(String params) {
logger.info("订单表数据处理开始");
List orders = ordersDao.selectList(Wrappers.lambdaQuery()
diff --git a/src/main/java/com/sqx/modules/job/task/TestTask.java b/src/main/java/com/sqx/modules/job/task/TestTask.java
deleted file mode 100644
index 8f566e10..00000000
--- a/src/main/java/com/sqx/modules/job/task/TestTask.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.sqx.modules.job.task;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * 测试定时任务(演示Demo,可删除)
- *
- * testTask为spring bean的名称
- *
- */
-@Component("testTask")
-public class TestTask implements ITask {
- private Logger logger = LoggerFactory.getLogger(getClass());
-
- @Override
- public void run(String params){
-
- logger.debug("TestTask定时任务正在执行,参数为:{}", params);
- }
-
-
-
-}
diff --git a/src/main/java/com/sqx/modules/job/utils/ScheduleJob.java b/src/main/java/com/sqx/modules/job/utils/ScheduleJob.java
deleted file mode 100644
index deb910fb..00000000
--- a/src/main/java/com/sqx/modules/job/utils/ScheduleJob.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.sqx.modules.job.utils;
-
-import com.sqx.common.utils.SpringContextUtils;
-import com.sqx.modules.job.entity.ScheduleJobEntity;
-import com.sqx.modules.job.entity.ScheduleJobLogEntity;
-import com.sqx.modules.job.service.ScheduleJobLogService;
-import org.apache.commons.lang.StringUtils;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.quartz.QuartzJobBean;
-
-import java.lang.reflect.Method;
-import java.util.Date;
-
-
-/**
- * 定时任务
- *
- */
-public class ScheduleJob extends QuartzJobBean {
- private Logger logger = LoggerFactory.getLogger(getClass());
-
- @Override
- protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
- ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap()
- .get(ScheduleJobEntity.JOB_PARAM_KEY);
-
- //获取spring bean
- ScheduleJobLogService scheduleJobLogService = (ScheduleJobLogService) SpringContextUtils.getBean("scheduleJobLogService");
-
- //数据库保存执行记录
- ScheduleJobLogEntity log = new ScheduleJobLogEntity();
- log.setJobId(scheduleJob.getJobId());
- log.setBeanName(scheduleJob.getBeanName());
- log.setParams(scheduleJob.getParams());
- log.setCreateTime(new Date());
-
- //任务开始时间
- long startTime = System.currentTimeMillis();
-
- try {
- //执行任务
- logger.debug("任务准备执行,任务ID:" + scheduleJob.getJobId());
-
- Object target = SpringContextUtils.getBean(scheduleJob.getBeanName());
- Method method = target.getClass().getDeclaredMethod("run", String.class);
- method.invoke(target, scheduleJob.getParams());
-
- //任务执行总时长
- long times = System.currentTimeMillis() - startTime;
- log.setTimes((int)times);
- //任务状态 0:成功 1:失败
- log.setStatus(0);
-
- logger.debug("任务执行完毕,任务ID:" + scheduleJob.getJobId() + " 总共耗时:" + times + "毫秒");
- } catch (Exception e) {
- logger.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e);
-
- //任务执行总时长
- long times = System.currentTimeMillis() - startTime;
- log.setTimes((int)times);
-
- //任务状态 0:成功 1:失败
- log.setStatus(1);
- log.setError(StringUtils.substring(e.toString(), 0, 2000));
- }finally {
- scheduleJobLogService.save(log);
- }
- }
-}
diff --git a/src/main/java/com/sqx/modules/job/utils/ScheduleUtils.java b/src/main/java/com/sqx/modules/job/utils/ScheduleUtils.java
deleted file mode 100644
index f2895570..00000000
--- a/src/main/java/com/sqx/modules/job/utils/ScheduleUtils.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package com.sqx.modules.job.utils;
-
-import com.sqx.common.exception.SqxException;
-import com.sqx.common.utils.Constant;
-import com.sqx.modules.job.entity.ScheduleJobEntity;
-import org.quartz.*;
-
-/**
- * 定时任务工具类
- *
- */
-public class ScheduleUtils {
- private final static String JOB_NAME = "TASK_";
-
- /**
- * 获取触发器key
- */
- public static TriggerKey getTriggerKey(Long jobId) {
- return TriggerKey.triggerKey(JOB_NAME + jobId);
- }
-
- /**
- * 获取jobKey
- */
- public static JobKey getJobKey(Long jobId) {
- return JobKey.jobKey(JOB_NAME + jobId);
- }
-
- /**
- * 获取表达式触发器
- */
- public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
- try {
- return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
- } catch (SchedulerException e) {
- throw new SqxException("获取定时任务CronTrigger出现异常", e);
- }
- }
-
- /**
- * 创建定时任务
- */
- public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
- try {
- //构建job信息
- JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();
-
- //表达式调度构建器
- CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
- .withMisfireHandlingInstructionDoNothing();
-
- //按新的cronExpression表达式构建一个新的trigger
- CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
-
- //放入参数,运行时的方法可以获取
- jobDetail.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
-
- scheduler.scheduleJob(jobDetail, trigger);
-
- //暂停任务
- if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
- pauseJob(scheduler, scheduleJob.getJobId());
- }
- } catch (SchedulerException e) {
- throw new SqxException("创建定时任务失败", e);
- }
- }
-
- /**
- * 更新定时任务
- */
- public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
- try {
- TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
-
- //表达式调度构建器
- CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
- .withMisfireHandlingInstructionDoNothing();
-
- CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
-
- //按新的cronExpression表达式重新构建trigger
- trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
-
- //参数
- trigger.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
-
- scheduler.rescheduleJob(triggerKey, trigger);
-
- //暂停任务
- if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
- pauseJob(scheduler, scheduleJob.getJobId());
- }
-
- } catch (SchedulerException e) {
- throw new SqxException("更新定时任务失败", e);
- }
- }
-
- /**
- * 立即执行任务
- */
- public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
- try {
- //参数
- JobDataMap dataMap = new JobDataMap();
- dataMap.put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
-
- scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
- } catch (SchedulerException e) {
- throw new SqxException("立即执行定时任务失败", e);
- }
- }
-
- /**
- * 暂停任务
- */
- public static void pauseJob(Scheduler scheduler, Long jobId) {
- try {
- scheduler.pauseJob(getJobKey(jobId));
- } catch (SchedulerException e) {
- throw new SqxException("暂停定时任务失败", e);
- }
- }
-
- /**
- * 恢复任务
- */
- public static void resumeJob(Scheduler scheduler, Long jobId) {
- try {
- scheduler.resumeJob(getJobKey(jobId));
- } catch (SchedulerException e) {
- throw new SqxException("暂停定时任务失败", e);
- }
- }
-
- /**
- * 删除定时任务
- */
- public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
- try {
- scheduler.deleteJob(getJobKey(jobId));
- } catch (SchedulerException e) {
- throw new SqxException("删除定时任务失败", e);
- }
- }
-}
diff --git a/src/main/java/com/sqx/modules/pay/wuyou/Encrypt.java b/src/main/java/com/sqx/modules/pay/wuyou/Encrypt.java
index 79d99fde..91938961 100644
--- a/src/main/java/com/sqx/modules/pay/wuyou/Encrypt.java
+++ b/src/main/java/com/sqx/modules/pay/wuyou/Encrypt.java
@@ -1,6 +1,6 @@
package com.sqx.modules.pay.wuyou;
-import com.alibaba.druid.util.Utils;
+import com.sqx.modules.utils.MD5Util;
import java.util.HashMap;
import java.util.Map;
@@ -23,7 +23,7 @@ public class Encrypt {
sb.append("key=").append(APP_SECRET);
String signStr = sb.toString();
System.out.println("signStr: " + signStr);
- return Utils.md5(signStr).toUpperCase();
+ return MD5Util.encodeByMD5(signStr).toUpperCase();
}
public static void main(String[] args) {
diff --git a/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java b/src/main/java/com/sqx/sharding/ShardingDataSourcePoolMetricsAutoConfiguration.java
similarity index 99%
rename from src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
rename to src/main/java/com/sqx/sharding/ShardingDataSourcePoolMetricsAutoConfiguration.java
index c3454b5a..3c7252ac 100644
--- a/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
+++ b/src/main/java/com/sqx/sharding/ShardingDataSourcePoolMetricsAutoConfiguration.java
@@ -1,4 +1,4 @@
-package com.sqx.config;
+package com.sqx.sharding;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory;
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index 2c965598..e7978925 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -16,7 +16,7 @@ spring:
shardingsphere:
center-tables-data-node: duanju.%s
# 显示sharding-jdbc改写的sql语句
- show-sql: true
+ show-sql: false
# 数据源名称
datasource:
# 数据源配置begin
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 3621d08e..80305245 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1 @@
-center-tables=activity,app,banner,cash_out,comment_good,common_info,complet_award,coupon,coupon_user,course,course_classification,course_collect,course_comment,course_details,course_user,disc_spinning,disc_spinning_amount,disc_spinning_record,help_classify,help_word,invite,invite_award,invite_money,message_info,msg,orders,pay_classify,pay_details,qrtz_blob_triggers,qrtz_calendars,qrtz_cron_triggers,qrtz_fired_triggers,qrtz_job_details,qrtz_locks,qrtz_paused_trigger_grps,qrtz_scheduler_state,qrtz_simple_triggers,qrtz_simprop_triggers,qrtz_triggers,schedule_job,schedule_job_log,sdk_info,sdk_type,search,sys_captcha,sys_config,sys_dict,sys_log,sys_menu,sys_oss,sys_role,sys_role_menu,sys_user,sys_user_role,sys_user_token,task_center,task_center_record,task_center_reward,tb_user,uni_ad_callback_record,url_address,user_integral,user_integral_details,user_money,user_money_details,user_prize_exchange,user_sign_record,user_vip,vip_details
\ No newline at end of file
+center-tables=activity,app,banner,cash_out,comment_good,common_info,complet_award,coupon,coupon_user,course,course_classification,course_collect,course_comment,course_details,course_user,disc_spinning,disc_spinning_amount,disc_spinning_record,help_classify,help_word,invite,invite_award,invite_money,message_info,msg,orders,pay_classify,pay_details,qrtz_blob_triggers,qrtz_calendars,qrtz_cron_triggers,qrtz_fired_triggers,qrtz_job_details,qrtz_locks,qrtz_paused_trigger_grps,qrtz_scheduler_state,qrtz_simple_triggers,qrtz_simprop_triggers,qrtz_triggers,schedule_job,schedule_job_log,sdk_info,sdk_type,search,sys_captcha,sys_config,sys_dict,sys_log,sys_menu,sys_oss,sys_role,sys_role_menu,sys_user,sys_user_role,sys_user_token,task_center,task_center_record,task_center_reward,tb_user,uni_ad_callback_record,url_address,user_integral,user_integral_details,user_money,user_money_details,user_prize_exchange,user_sign_record,user_vip,vip_details,invite_achievement
\ No newline at end of file
From 41eabc21b55cd86155008f087f0b62426d997af6 Mon Sep 17 00:00:00 2001
From: wangw <1594593906@qq.com>
Date: Mon, 30 Dec 2024 16:17:12 +0800
Subject: [PATCH 3/6] =?UTF-8?q?=E8=B5=84=E6=BA=90=E9=A1=B5=E6=8A=A5?=
=?UTF-8?q?=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../sqx/modules/sys/oauth2/OAuth2Filter.java | 24 ++++++-------------
.../resources/mapper/course/CourseDao.xml | 11 +--------
2 files changed, 8 insertions(+), 27 deletions(-)
diff --git a/src/main/java/com/sqx/modules/sys/oauth2/OAuth2Filter.java b/src/main/java/com/sqx/modules/sys/oauth2/OAuth2Filter.java
index c13b6713..1a546607 100644
--- a/src/main/java/com/sqx/modules/sys/oauth2/OAuth2Filter.java
+++ b/src/main/java/com/sqx/modules/sys/oauth2/OAuth2Filter.java
@@ -21,7 +21,6 @@ import java.io.IOException;
/**
* oauth2过滤器
- *
*/
public class OAuth2Filter extends AuthenticatingFilter {
@@ -32,7 +31,7 @@ public class OAuth2Filter extends AuthenticatingFilter {
//获取请求token
String token = getRequestToken((HttpServletRequest) request);
- if(StringUtils.isBlank(token)){
+ if (StringUtils.isBlank(token)) {
return null;
}
@@ -41,7 +40,7 @@ public class OAuth2Filter extends AuthenticatingFilter {
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
- if(((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())){
+ if (((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())) {
return true;
}
@@ -52,7 +51,7 @@ public class OAuth2Filter extends AuthenticatingFilter {
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
//获取请求token,如果token不存在,直接返回401
String token = getRequestToken((HttpServletRequest) request);
- if(StringUtils.isBlank(token)){
+ if (StringUtils.isBlank(token)) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());
@@ -63,17 +62,8 @@ public class OAuth2Filter extends AuthenticatingFilter {
return false;
}
- try{
- return executeLogin(request, response);
- }catch (AbstractMethodError e){
- if (e.getMessage().contains("sessionCreated")) {
- logger.error(e.getMessage());
- return false;
- }else {
- logger.error(e.getMessage());
- return false;
- }
- }
+ return executeLogin(request, response);
+
}
@Override
@@ -99,12 +89,12 @@ public class OAuth2Filter extends AuthenticatingFilter {
/**
* 获取请求的token
*/
- private String getRequestToken(HttpServletRequest httpRequest){
+ private String getRequestToken(HttpServletRequest httpRequest) {
//从header中获取token
String token = httpRequest.getHeader("token");
//如果header中不存在token,则从参数中获取token
- if(StringUtils.isBlank(token)){
+ if (StringUtils.isBlank(token)) {
token = httpRequest.getParameter("token");
}
diff --git a/src/main/resources/mapper/course/CourseDao.xml b/src/main/resources/mapper/course/CourseDao.xml
index a8118457..d85de90f 100644
--- a/src/main/resources/mapper/course/CourseDao.xml
+++ b/src/main/resources/mapper/course/CourseDao.xml
@@ -185,9 +185,6 @@
(select sum(o.pay_money) from orders o where o.course_id=c.course_id and o.status=1) as payMoney,
(select sum(good_num) from course_details d where d.course_id=c.course_id ) as goodNum,
(select count(*) from course_details d where d.course_id=c.course_id ) as courseDetailsCount,
- (select count(*) from course_collect d where d.course_id=c.course_id
- and date_format(create_time,'%Y-%m-%d')>=date_format(#{startTime},'%Y-%m-%d') and
- date_format(create_time,'%Y-%m-%d')<=date_format(#{endTime},'%Y-%m-%d') ) as weekGoodNum,
(select count(*) from course_details cd where c.course_id=cd.course_id and cd.good=1 ) as isRecommend
FROM
course AS c
@@ -217,7 +214,7 @@
and c.banner_id = #{bannerId}
-
+
and c.is_recommend=1
@@ -244,12 +241,6 @@
order by c.sort asc,c.create_time desc
-
- order by goodNum desc
-
-
- order by weekGoodNum desc
-
-
-
- com.yungouos.pay
- yungouos-pay-sdk
- 2.0.10
-
-
org.hibernate.validator
hibernate-validator
diff --git a/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java b/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java
index 2de000d5..8cdb91da 100644
--- a/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java
@@ -1498,7 +1498,7 @@ public class UserServiceImpl extends ServiceImpl implements
if (ret) {
ThreadUtil.execAsync(()->{
discSpinningService.withdrawAsync(entity, money.doubleValue(), "[提现]");
- },true);
+ });
}
} catch (Exception e) {
log.error("首绑支付宝发放奖励异常,用户信息:{}", JSONUtil.toJsonStr(entity));
diff --git a/src/main/java/com/sqx/modules/pay/controller/app/AliPayController.java b/src/main/java/com/sqx/modules/pay/controller/app/AliPayController.java
index ec5f508d..207ded4a 100644
--- a/src/main/java/com/sqx/modules/pay/controller/app/AliPayController.java
+++ b/src/main/java/com/sqx/modules/pay/controller/app/AliPayController.java
@@ -32,9 +32,6 @@ import com.sqx.modules.pay.dao.PayDetailsDao;
import com.sqx.modules.pay.entity.PayClassify;
import com.sqx.modules.pay.entity.PayDetails;
import com.sqx.modules.pay.service.PayClassifyService;
-import com.yungouos.pay.alipay.AliPay;
-import com.yungouos.pay.entity.AliPayH5Biz;
-import com.yungouos.pay.util.PaySignUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -109,16 +106,16 @@ public class AliPayController {
log.info(flag + "回调验证信息");
if (flag) {
String tradeStatus = params.get("trade_status");
- if("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)){
+ if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
//支付宝返回的订单编号
String outTradeNo = params.get("out_trade_no");
//支付宝支付单号
String tradeNo = params.get("trade_no");
PayDetails payDetails = payDetailsDao.selectByOrderId(outTradeNo);
- if(payDetails.getState()==0){
+ if (payDetails.getState() == 0) {
String format = sdf.format(new Date());
- payDetailsDao.updateState(payDetails.getId(),1,format,tradeNo);
- if(payDetails.getType()==1){
+ payDetailsDao.updateState(payDetails.getId(), 1, format, tradeNo);
+ if (payDetails.getType() == 1) {
Orders orders = ordersService.selectOrderByOrdersNo(payDetails.getOrderId());
orders.setPayWay(4);
orders.setStatus(1);
@@ -128,34 +125,34 @@ public class AliPayController {
UserEntity byUser = userService.queryByInvitationCode(user.getInviterCode());
Map map = inviteService.updateInvite(byUser, format, user.getUserId(), orders.getPayMoney());
Object oneUserId = map.get("oneUserId");
- if(oneUserId!=null){
+ if (oneUserId != null) {
orders.setOneUserId(Long.parseLong(String.valueOf(oneUserId)));
orders.setOneMoney(new BigDecimal(String.valueOf(map.get("oneMoney"))));
}
Object twoUserId = map.get("twoUserId");
- if(twoUserId!=null){
+ if (twoUserId != null) {
orders.setTwoUserId(Long.parseLong(String.valueOf(twoUserId)));
orders.setTwoMoney(new BigDecimal(String.valueOf(map.get("twoMoney"))));
}
Object sysUserId = map.get("sysUserId");
- if(sysUserId!=null){
+ if (sysUserId != null) {
orders.setSysUserId(Long.parseLong(String.valueOf(sysUserId)));
orders.setQdMoney(new BigDecimal(String.valueOf(map.get("qdMoney"))));
}
ordersService.updateById(orders);
ordersService.insertOrders(orders);
- }else{
+ } else {
String remark = payDetails.getRemark();
PayClassify payClassify = payClassifyService.getById(Long.parseLong(remark));
BigDecimal add = payClassify.getMoney().add(payClassify.getGiveMoney());
- userMoneyService.updateMoney(1,payDetails.getUserId(),add.doubleValue());
- UserMoneyDetails userMoneyDetails=new UserMoneyDetails();
+ userMoneyService.updateMoney(1, payDetails.getUserId(), add.doubleValue());
+ UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
// ✅
userMoneyDetails.setClassify(2);
userMoneyDetails.setMoney(add);
userMoneyDetails.setUserId(payDetails.getUserId());
userMoneyDetails.setContent("支付宝充值金币");
- userMoneyDetails.setTitle("支付宝充值金币:"+payClassify.getMoney()+",赠送:"+payClassify.getGiveMoney());
+ userMoneyDetails.setTitle("支付宝充值金币:" + payClassify.getMoney() + ",赠送:" + payClassify.getGiveMoney());
userMoneyDetails.setType(1);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
userMoneyDetails.setCreateTime(simpleDateFormat.format(new Date()));
@@ -179,92 +176,15 @@ public class AliPayController {
@ApiOperation("支付宝回调")
@RequestMapping("/notifyAppYunOS")
@Transactional(rollbackFor = Exception.class)
- public String notifyAppYunOS(HttpServletRequest request, HttpServletResponse response){
- //获取支付宝POST过来反馈信息
- Map params = new HashMap();
- Map requestParams = request.getParameterMap();
- for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
- String name = (String) iter.next();
- String[] values = (String[]) requestParams.get(name);
- String valueStr = "";
- for (int i = 0; i < values.length; i++) {
- valueStr = (i == values.length - 1) ? valueStr + values[i]
- : valueStr + values[i] + ",";
- }
- //乱码解决,这段代码在出现乱码时使用。
- //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
- params.put(name, valueStr);
- }
- String outTradeNo = params.get("outTradeNo");
- String code = params.get("code");
- String key = commonInfoService.findOne(169).getValue();
- try {
- boolean flag = PaySignUtil.checkNotifySign(request, key);
- if(flag){
- if("1".equals(code)){
- PayDetails payDetails=payDetailsDao.selectByOrderId(outTradeNo);
- if(payDetails.getState()==0) {
- String format = sdf.format(new Date());
- payDetailsDao.updateState(payDetails.getId(),1,format,null);
- if(payDetails.getType()==1){
- Orders orders = ordersService.selectOrderByOrdersNo(payDetails.getOrderId());
- orders.setPayWay(4);
- orders.setStatus(1);
- orders.setPayTime(DateUtils.format(new Date()));
- ordersService.updateById(orders);
- UserEntity user = userService.selectUserById(orders.getUserId());
- UserEntity byUser = userService.queryByInvitationCode(user.getInviterCode());
- Map map = inviteService.updateInvite(byUser, format, user.getUserId(), orders.getPayMoney());
- Object oneUserId = map.get("oneUserId");
- if(oneUserId!=null){
- orders.setOneUserId(Long.parseLong(String.valueOf(oneUserId)));
- orders.setOneMoney(new BigDecimal(String.valueOf(map.get("oneMoney"))));
- }
- Object twoUserId = map.get("twoUserId");
- if(twoUserId!=null){
- orders.setTwoUserId(Long.parseLong(String.valueOf(twoUserId)));
- orders.setTwoMoney(new BigDecimal(String.valueOf(map.get("twoMoney"))));
- }
- Object sysUserId = map.get("sysUserId");
- if(sysUserId!=null){
- orders.setSysUserId(Long.parseLong(String.valueOf(sysUserId)));
- orders.setQdMoney(new BigDecimal(String.valueOf(map.get("qdMoney"))));
- }
- ordersService.insertOrders(orders);
- }else{
- String remark = payDetails.getRemark();
- PayClassify payClassify = payClassifyService.getById(Long.parseLong(remark));
- BigDecimal add = payClassify.getMoney().add(payClassify.getGiveMoney());
- userMoneyService.updateMoney(1,payDetails.getUserId(),add.doubleValue());
- UserMoneyDetails userMoneyDetails=new UserMoneyDetails();
- // ✅
- userMoneyDetails.setClassify(2);
- userMoneyDetails.setMoney(add);
- userMoneyDetails.setUserId(payDetails.getUserId());
- userMoneyDetails.setContent("支付宝充值金币");
- userMoneyDetails.setTitle("支付宝充值金币:"+payClassify.getMoney()+",赠送:"+payClassify.getGiveMoney());
- userMoneyDetails.setType(1);
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- userMoneyDetails.setCreateTime(simpleDateFormat.format(new Date()));
- userMoneyDetails.setMoneyType(2);
- userMoneyDetailsService.save(userMoneyDetails);
- }
- }
- }
- return "SUCCESS";
- }
- } catch (Exception e) {
- e.printStackTrace();
- log.error("云购os支付报错!"+e.getMessage());
- }
- return null;
+ public String notifyAppYunOS(HttpServletRequest request, HttpServletResponse response) {
+ return "SUCCESS";
}
@Login
@ApiOperation("支付宝支付订单")
@RequestMapping(value = "/payOrder", method = RequestMethod.POST)
@Transactional(rollbackFor = Exception.class)
- public Result payOrder(Long orderId,Integer classify) {
+ public Result payOrder(Long orderId, Integer classify) {
//通知页面地址
CommonInfo one = commonInfoService.findOne(19);
String returnUrl = one.getValue() + "/#/pages/task/recharge";
@@ -274,17 +194,17 @@ public class AliPayController {
log.info("回调地址:" + url);
Orders orders = ordersDao.selectById(orderId);
PayDetails payDetails = payDetailsDao.selectByOrderId(orders.getOrdersNo());
- if(payDetails==null){
- payDetails=new PayDetails();
+ if (payDetails == null) {
+ payDetails = new PayDetails();
payDetails.setState(0);
payDetails.setCreateTime(sdf.format(new Date()));
payDetails.setOrderId(orders.getOrdersNo());
payDetails.setUserId(orders.getUserId());
payDetails.setMoney(orders.getPayMoney().doubleValue());
payDetails.setType(1);
- if(classify==1){
+ if (classify == 1) {
payDetails.setClassify(4);
- }else{
+ } else {
payDetails.setClassify(5);
}
payDetailsDao.insert(payDetails);
@@ -300,7 +220,7 @@ public class AliPayController {
@ApiOperation("支付宝支付订单")
@RequestMapping(value = "/payMoney", method = RequestMethod.POST)
@Transactional(rollbackFor = Exception.class)
- public Result payMoney(Long payClassifyId, Integer classify,@RequestAttribute Long userId) {
+ public Result payMoney(Long payClassifyId, Integer classify, @RequestAttribute Long userId) {
//通知页面地址
CommonInfo one = commonInfoService.findOne(19);
String returnUrl = one.getValue() + "/#/pages/task/recharge";
@@ -310,15 +230,15 @@ public class AliPayController {
log.info("回调地址:" + url);
String generalOrder = getGeneralOrder();
PayClassify payClassify = payClassifyService.getById(payClassifyId);
- PayDetails payDetails=new PayDetails();
+ PayDetails payDetails = new PayDetails();
payDetails.setState(0);
payDetails.setCreateTime(sdf.format(new Date()));
payDetails.setOrderId(generalOrder);
payDetails.setUserId(userId);
payDetails.setMoney(payClassify.getPrice().doubleValue());
- if(classify==1){
+ if (classify == 1) {
payDetails.setClassify(4);
- }else{
+ } else {
payDetails.setClassify(5);
}
payDetails.setType(2);
@@ -368,7 +288,6 @@ public class AliPayController {
}
-
public Result payApp(String name, String generalOrder, Double money) {
CommonInfo one = commonInfoService.findOne(19);
String url = one.getValue() + "/sqx_fast/app/aliPay/notifyApp";
@@ -405,7 +324,7 @@ public class AliPayController {
model.setSubject(name);
model.setOutTradeNo(generalOrder);
model.setTimeoutExpress("30m");
- model.setTotalAmount(money +"");
+ model.setTotalAmount(money + "");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(url);
@@ -417,7 +336,7 @@ public class AliPayController {
return Result.error("获取订单失败!");
}
return Result.success().put("data", result);
- } else if("2".equals(payWay.getValue())){
+ } else if ("2".equals(payWay.getValue())) {
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", commonInfoService.findOne(63).getValue(), commonInfoService.findOne(65).getValue(), "json", AliPayConstants.CHARSET, commonInfoService.findOne(64).getValue(), "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
@@ -439,13 +358,6 @@ public class AliPayController {
return Result.error("获取订单失败!");
}
return Result.success().put("data", result);
- }else{
- url=one.getValue()+"/sqx_fast/app/aliPay/notifyAppYunOS";
- log.info("回调地址:"+url);
- String mchId = commonInfoService.findOne(168).getValue();
- String key = commonInfoService.findOne(169).getValue();
- result = AliPay.appPay(generalOrder, String.valueOf(money), mchId, name ,null, url, null, null, null, null,key);
- return Result.success().put("data", result);
}
} catch (AlipayApiException e) {
e.printStackTrace();
@@ -491,7 +403,7 @@ public class AliPayController {
alipayRequest.setReturnUrl(returnUrl); //线上通知页面地址
String result = alipayClient.pageExecute(alipayRequest).getBody();
return Result.success().put("data", result);
- } else if ("2".equals(payWay.getValue())){
+ } else if ("2".equals(payWay.getValue())) {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", commonInfoService.findOne(63).getValue(), commonInfoService.findOne(65).getValue(), "json", AliPayConstants.CHARSET, commonInfoService.findOne(64).getValue(), "RSA2");
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
JSONObject order = new JSONObject();
@@ -507,13 +419,6 @@ public class AliPayController {
alipayRequest.setReturnUrl(returnUrl);
String form = alipayClient.pageExecute(alipayRequest).getBody();
return Result.success().put("data", form);
- }else{
- url=one.getValue()+"/sqx_fast/app/aliPay/notifyAppYunOS";
- log.info("回调地址:"+url);
- String mchId = commonInfoService.findOne(168).getValue();
- String key = commonInfoService.findOne(169).getValue();
- AliPayH5Biz aliPayH5Biz = AliPay.h5Pay(generalOrder, String.valueOf(money), mchId, name, null, url, returnUrl, null, null, null,null,key);
- return Result.success().put("data", aliPayH5Biz.getForm());
}
} catch (AlipayApiException e) {
log.error("CreatPayOrderForH5", e);
@@ -522,5 +427,4 @@ public class AliPayController {
}
-
}
diff --git a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java
index 7c45e604..42ac4952 100644
--- a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java
+++ b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java
@@ -84,7 +84,7 @@ public class RedisServiceImpl implements RedisService {
expireTime = jsonObject.getLong("expireTime");
}
- if ((StrUtil.isNotBlank(permanentlyFreeWatch) && redisUtils.isExpiredSet(freeWatchKey)) || (StrUtil.isNotBlank(permanentlyFreeWatch) && DateUtil.current() >= expireTime)) {
+ if ((StrUtil.isNotBlank(permanentlyFreeWatch) && redisUtils.isExpiredSet(freeWatchKey)) || (StrUtil.isNotBlank(permanentlyFreeWatch) && DateUtil.current(false) >= expireTime)) {
if (StrUtil.isBlank(permanentlyFreeWatch)) {
return null;
}
@@ -108,7 +108,7 @@ public class RedisServiceImpl implements RedisService {
redisUtils.set(watchKey, jsonObject.toJSONString(), expire);
return false;
}else {
- return DateUtil.current() > expireTime;
+ return DateUtil.current(false) > expireTime;
}
}
}
@@ -136,6 +136,6 @@ public class RedisServiceImpl implements RedisService {
Integer expireTime = jsonObject.getInteger("expireTime");
Long second = jsonObject.getLong("second");
- return expireTime == -1 ? second : expireTime > DateUtil.current() ? expireTime - DateUtil.current() : 0L;
+ return expireTime == -1 ? second : expireTime > DateUtil.current(false) ? expireTime - DateUtil.current(false) : 0L;
}
}
From b2eb0854722d7fc9747ea031b41aee50fc9fd210 Mon Sep 17 00:00:00 2001
From: wangw <1594593906@qq.com>
Date: Mon, 30 Dec 2024 16:40:14 +0800
Subject: [PATCH 5/6] =?UTF-8?q?dev=20=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/main/resources/application-dev.yml | 84 ++++++++++++++----------
src/main/resources/application-local.yml | 2 -
src/main/resources/application.yml | 2 +-
3 files changed, 52 insertions(+), 36 deletions(-)
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 870d10a3..54eea696 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -1,37 +1,55 @@
+# 数据源的一些配置
+driver-class-name: com.mysql.cj.jdbc.Driver
+# 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
+minimum-idle: 5
+# 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
+maximum-pool-size: 15
+# 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
+idle-timeout: 30000
+# 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
+max-lifetime: 30000
+# 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
+connection-timeout: 30000
+
spring:
- datasource:
- type: com.alibaba.druid.pool.DruidDataSource
- druid:
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
- username: video_user
- password: VideoUser@1
- initial-size: 10
- max-active: 50
- min-idle: 10
- max-wait: 60000
- pool-prepared-statements: true
- max-pool-prepared-statement-per-connection-size: 20
- time-between-eviction-runs-millis: 60000
- min-evictable-idle-time-millis: 300000
- #Oracle需要打开注释
- #validation-query: SELECT 1 FROM DUAL
- test-while-idle: true
- test-on-borrow: false
- test-on-return: false
- stat-view-servlet:
- enabled: true
- url-pattern: /druid/*
- #login-username: admin
- #login-password: admin
- filter:
- stat:
- log-slow-sql: true
- slow-sql-millis: 1000
- merge-sql: false
- wall:
- config:
- multi-statement-allow: true
+ # sharding-jdbc 配置
+ shardingsphere:
+ center-tables-data-node: duanju.%s
+ # 显示sharding-jdbc改写的sql语句
+ show-sql: false
+ # 数据源名称
+ datasource:
+ # 数据源配置begin
+ master-0:
+ driver-class-name: ${driver-class-name}
+ jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
+ username: video_user
+ password: VideoUser@1
+ minimum-idle: ${minimum-idle}
+ maximum-pool-size: ${maximum-pool-size}
+ idle-timeout: ${idle-timeout}
+ max-lifetime: ${max-lifetime}
+ connection-timeout: ${connection-timeout}
+ slave-0:
+ driver-class-name: ${driver-class-name}
+ jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
+ username: root
+ password: 0fd6497c308ccfa8
+ minimum-idle: ${minimum-idle}
+ maximum-pool-size: ${maximum-pool-size}
+ idle-timeout: ${idle-timeout}
+ max-lifetime: ${max-lifetime}
+ connection-timeout: ${connection-timeout}
+ # 数据源配置end
+
+ # 读写分离配置begin
+ master-slave-rules:
+ #数据源
+ duanju:
+ master-data-source-name: master-0
+ slave-data-source-names: slave-0
+# - master-0
+# - slave-0
swagger:
enabled: true
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index e7978925..54eea696 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -21,7 +21,6 @@ spring:
datasource:
# 数据源配置begin
master-0:
-# slave-0:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user
@@ -32,7 +31,6 @@ spring:
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
slave-0:
-# master-0:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: root
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 80aa27d7..508a1738 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -20,7 +20,7 @@ spring:
allow-bean-definition-overriding: true
# 环境 dev|test|prod
profiles:
- active: local
+ active: dev
# jackson时间格式化
jackson:
time-zone: GMT+8
From 769e476b23a04133584e304cbd9a22d83339af20 Mon Sep 17 00:00:00 2001
From: wangw <1594593906@qq.com>
Date: Mon, 30 Dec 2024 16:42:32 +0800
Subject: [PATCH 6/6] =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=97=A5=E5=BF=97=20?=
=?UTF-8?q?=E5=BC=82=E6=AD=A5=E6=89=93=E5=8D=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../sqx/common/aspect/AppApiMethodAspect.java | 36 +++++++++++--------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/src/main/java/com/sqx/common/aspect/AppApiMethodAspect.java b/src/main/java/com/sqx/common/aspect/AppApiMethodAspect.java
index b7315939..ed6f6707 100644
--- a/src/main/java/com/sqx/common/aspect/AppApiMethodAspect.java
+++ b/src/main/java/com/sqx/common/aspect/AppApiMethodAspect.java
@@ -1,5 +1,6 @@
package com.sqx.common.aspect;
+import cn.hutool.core.thread.ThreadUtil;
import com.google.gson.Gson;
import com.sqx.common.utils.HttpContextUtils;
import com.sqx.common.utils.IPUtils;
@@ -44,22 +45,27 @@ public class AppApiMethodAspect {
// 执行被拦截的方法
Object result = pjp.proceed();
-
- //请求的参数
- String resultJson = new Gson().toJson(result);
- try{
- HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
- long end = System.currentTimeMillis();
- if(StringUtils.isNotBlank(resultJson) && !"null".equals(resultJson)){
- log.info("\n>>>>>> {} {}\n>>>>>> IP: {} \n>>>>>> execute time:{}ms \n>>>>>> Request: {}\n>>>>>> Response: {}",
- request.getMethod(), request.getRequestURL(), IPUtils.getIpAddr(request),end-start,
- params,
- resultJson
- );
+ long end = System.currentTimeMillis();
+ ThreadUtil.execAsync(() -> {
+ //请求的参数
+ String resultJson = new Gson().toJson(result);
+ try {
+ HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
+ if (StringUtils.isNotBlank(resultJson) && !"null".equals(resultJson)) {
+ log.info("\n>>>>>> {} {}" +
+ "\n>>>>>> IP: {} " +
+ "\n>>>>>> execute time:{}ms " +
+ "\n>>>>>> Request: {}" +
+ "\n>>>>>> Response: {}",
+ request.getMethod(), request.getRequestURL(), IPUtils.getIpAddr(request), end - start,
+ params,
+ resultJson
+ );
+ }
+ } catch (Exception e) {
+ log.error("Request 为空" + e.getMessage());
}
- }catch (Exception e){
- log.error("Request 为空"+e.getMessage());
- }
+ });
return result;
}
}