diff --git a/common/src/main/java/com/storeroom/config/RsaProperties.java b/common/src/main/java/com/storeroom/config/RsaProperties.java
new file mode 100644
index 0000000..d865251
--- /dev/null
+++ b/common/src/main/java/com/storeroom/config/RsaProperties.java
@@ -0,0 +1,18 @@
+package com.storeroom.config;
+
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+public class RsaProperties {
+
+ public static String privateKey;
+
+ @Value("${rsa.private_key}")
+ public void setPrivateKey(String privateKey) {
+ RsaProperties.privateKey = privateKey;
+ }
+}
diff --git a/system/pom.xml b/system/pom.xml
index 5977132..66377f1 100644
--- a/system/pom.xml
+++ b/system/pom.xml
@@ -24,11 +24,6 @@
1.0
-
-
- org.springframework.boot
- spring-boot-starter-websocket
-
@@ -66,6 +61,13 @@
5.3.6
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
org.quartz-scheduler
diff --git a/system/src/main/java/AppRun.java b/system/src/main/java/com/storeroom/AppRun.java
similarity index 89%
rename from system/src/main/java/AppRun.java
rename to system/src/main/java/com/storeroom/AppRun.java
index 2df971b..bff1007 100644
--- a/system/src/main/java/AppRun.java
+++ b/system/src/main/java/com/storeroom/AppRun.java
@@ -1,3 +1,5 @@
+package com.storeroom;
+
import com.storeroom.annotaion.rest.AnonymousGetMapping;
import com.storeroom.utils.SpringContextHolder;
import io.swagger.annotations.Api;
@@ -17,8 +19,8 @@ import org.springframework.web.bind.annotation.RestController;
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class AppRun {
- public static void main(String[] args){
- SpringApplication.run(AppRun.class,args);
+ public static void main(String[] args) {
+ SpringApplication.run(AppRun.class, args);
}
diff --git a/system/src/main/java/com/storeroom/config/ConfigurerAdapter.java b/system/src/main/java/com/storeroom/config/ConfigurerAdapter.java
new file mode 100644
index 0000000..125cd08
--- /dev/null
+++ b/system/src/main/java/com/storeroom/config/ConfigurerAdapter.java
@@ -0,0 +1,47 @@
+package com.storeroom.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Configuration
+@EnableWebMvc
+public class ConfigurerAdapter implements WebMvcConfigurer {
+
+ /** 文件配置 */
+ private final FileProperties properties;
+
+ public ConfigurerAdapter(FileProperties properties) {
+ this.properties = properties;
+ }
+
+ @Bean
+ public CorsFilter corsFilter() {
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ CorsConfiguration config = new CorsConfiguration();
+ config.setAllowCredentials(true);
+ config.addAllowedOriginPattern("*");
+ config.addAllowedHeader("*");
+ config.addAllowedMethod("*");
+
+
+ source.registerCorsConfiguration("/**", config);
+ return new CorsFilter(source);
+ }
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ FileProperties.YsPath path = properties.getPath();
+ String avatarUtl = "file:" + path.getAvatar().replace("\\","/");
+ String pathUtl = "file:" + path.getPath().replace("\\","/");
+ registry.addResourceHandler("/avatar/**").addResourceLocations(avatarUtl).setCachePeriod(0);
+ registry.addResourceHandler("/file/**").addResourceLocations(pathUtl).setCachePeriod(0);
+ registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").setCachePeriod(0);
+ }
+}
diff --git a/system/src/main/java/com/storeroom/config/WebSocketConfig.java b/system/src/main/java/com/storeroom/config/WebSocketConfig.java
new file mode 100644
index 0000000..da01ee7
--- /dev/null
+++ b/system/src/main/java/com/storeroom/config/WebSocketConfig.java
@@ -0,0 +1,15 @@
+package com.storeroom.config;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+public class WebSocketConfig {
+
+ @Bean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+}
diff --git a/system/src/main/java/com/storeroom/config/thread/AsyncTaskExecutePool.java b/system/src/main/java/com/storeroom/config/thread/AsyncTaskExecutePool.java
new file mode 100644
index 0000000..a0a9e05
--- /dev/null
+++ b/system/src/main/java/com/storeroom/config/thread/AsyncTaskExecutePool.java
@@ -0,0 +1,51 @@
+package com.storeroom.config.thread;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+
+@Slf4j
+@Configuration
+public class AsyncTaskExecutePool implements AsyncConfigurer {
+
+ /** 注入配置类 */
+ private final AsyncTaskProperties config;
+
+ public AsyncTaskExecutePool(AsyncTaskProperties config) {
+ this.config = config;
+ }
+
+ @Override
+ public Executor getAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //核心线程池大小
+ executor.setCorePoolSize(config.getCorePoolSize());
+ //最大线程数
+ executor.setMaxPoolSize(config.getMaxPoolSize());
+ //队列容量
+ executor.setQueueCapacity(config.getQueueCapacity());
+ //活跃时间
+ executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
+ //线程名字前缀
+ executor.setThreadNamePrefix("yxk-async-");
+ // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务
+ // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ executor.initialize();
+ return executor;
+ }
+
+ @Override
+ public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+ return (throwable, method, objects) -> {
+ log.error("===="+throwable.getMessage()+"====", throwable);
+ log.error("exception method:"+method.getName());
+ };
+ }
+}
diff --git a/system/src/main/java/com/storeroom/config/thread/AsyncTaskProperties.java b/system/src/main/java/com/storeroom/config/thread/AsyncTaskProperties.java
new file mode 100644
index 0000000..5301284
--- /dev/null
+++ b/system/src/main/java/com/storeroom/config/thread/AsyncTaskProperties.java
@@ -0,0 +1,20 @@
+package com.storeroom.config.thread;
+
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "task.pool")
+public class AsyncTaskProperties {
+
+ private int corePoolSize;
+
+ private int maxPoolSize;
+
+ private int keepAliveSeconds;
+
+ private int queueCapacity;
+}
diff --git a/system/src/main/java/com/storeroom/config/thread/TheadFactoryName.java b/system/src/main/java/com/storeroom/config/thread/TheadFactoryName.java
new file mode 100644
index 0000000..6f47f16
--- /dev/null
+++ b/system/src/main/java/com/storeroom/config/thread/TheadFactoryName.java
@@ -0,0 +1,44 @@
+package com.storeroom.config.thread;
+
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+@Component
+public class TheadFactoryName implements ThreadFactory {
+
+ private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
+ private final ThreadGroup group;
+ private final AtomicInteger threadNumber = new AtomicInteger(1);
+ private final String namePrefix;
+
+ public TheadFactoryName() {
+ this("yxk-pool");
+ }
+
+ private TheadFactoryName(String name){
+ SecurityManager s = System.getSecurityManager();
+ group = (s != null) ? s.getThreadGroup() :
+ Thread.currentThread().getThreadGroup();
+ //此时namePrefix就是 name + 第几个用这个工厂创建线程池的
+ this.namePrefix = name +
+ POOL_NUMBER.getAndIncrement();
+ }
+
+ @Override
+ public Thread newThread(Runnable r) {
+ //此时线程的名字 就是 namePrefix + -thread- + 这个线程池中第几个执行的线程
+ Thread t = new Thread(group, r,
+ namePrefix + "-thread-"+threadNumber.getAndIncrement(),
+ 0);
+ if (t.isDaemon()) {
+ t.setDaemon(false);
+ }
+ if (t.getPriority() != Thread.NORM_PRIORITY) {
+ t.setPriority(Thread.NORM_PRIORITY);
+ }
+ return t;
+ }
+}
diff --git a/system/src/main/java/com/storeroom/config/thread/ThreadPoolExecutorUtil.java b/system/src/main/java/com/storeroom/config/thread/ThreadPoolExecutorUtil.java
new file mode 100644
index 0000000..5bb7ad2
--- /dev/null
+++ b/system/src/main/java/com/storeroom/config/thread/ThreadPoolExecutorUtil.java
@@ -0,0 +1,22 @@
+package com.storeroom.config.thread;
+
+import com.storeroom.utils.SpringContextHolder;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class ThreadPoolExecutorUtil {
+
+ public static ThreadPoolExecutor getPoll(){
+ AsyncTaskProperties properties = SpringContextHolder.getBean(AsyncTaskProperties.class);
+ return new ThreadPoolExecutor(
+ properties.getCorePoolSize(),
+ properties.getMaxPoolSize(),
+ properties.getKeepAliveSeconds(),
+ TimeUnit.SECONDS,
+ new ArrayBlockingQueue<>(properties.getQueueCapacity()),
+ new TheadFactoryName()
+ );
+ }
+}
diff --git a/system/src/main/java/com/storeroom/modules/security/config/ConfigBeanConfiguration.java b/system/src/main/java/com/storeroom/modules/security/config/ConfigBeanConfiguration.java
index 3893c0b..13a8588 100644
--- a/system/src/main/java/com/storeroom/modules/security/config/ConfigBeanConfiguration.java
+++ b/system/src/main/java/com/storeroom/modules/security/config/ConfigBeanConfiguration.java
@@ -2,7 +2,7 @@ package com.storeroom.modules.security.config;
import com.storeroom.modules.security.config.bean.LoginProperties;
-import org.springframework.boot.autoconfigure.security.SecurityProperties;
+import com.storeroom.modules.security.config.bean.SecurityProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -11,13 +11,13 @@ import org.springframework.context.annotation.Configuration;
public class ConfigBeanConfiguration {
@Bean
- @ConfigurationProperties(prefix="login",ignoreUnknownFields=true)
+ @ConfigurationProperties(prefix="login")
public LoginProperties loginProperties(){
return new LoginProperties();
}
@Bean
- @ConfigurationProperties(prefix = "jwt",ignoreUnknownFields = true)
+ @ConfigurationProperties(prefix = "jwt")
public SecurityProperties securityProperties(){
return new SecurityProperties();
}
diff --git a/system/src/main/java/com/storeroom/modules/security/controller/AuthorizationController.java b/system/src/main/java/com/storeroom/modules/security/controller/AuthorizationController.java
new file mode 100644
index 0000000..ea1248b
--- /dev/null
+++ b/system/src/main/java/com/storeroom/modules/security/controller/AuthorizationController.java
@@ -0,0 +1,125 @@
+package com.storeroom.modules.security.controller;
+
+
+import cn.hutool.core.util.IdUtil;
+import com.storeroom.annotaion.rest.AnonymousDeleteMapping;
+import com.storeroom.annotaion.rest.AnonymousGetMapping;
+import com.storeroom.annotaion.rest.AnonymousPostMapping;
+import com.storeroom.config.RsaProperties;
+import com.storeroom.exception.BaseException;
+import com.storeroom.exception.constant.ResponseStatus;
+import com.storeroom.modules.security.config.bean.LoginCodeEnum;
+import com.storeroom.modules.security.config.bean.LoginProperties;
+import com.storeroom.modules.security.config.bean.SecurityProperties;
+import com.storeroom.modules.security.security.TokenProvider;
+import com.storeroom.modules.security.service.OnlineUserService;
+import com.storeroom.modules.security.service.dto.AuthUserDto;
+import com.storeroom.modules.security.service.dto.JwtUserDto;
+import com.storeroom.utils.*;
+import com.storeroom.utils.enums.DataStatusEnum;
+import com.wf.captcha.base.Captcha;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@RestController
+@RequestMapping("/auth")
+@RequiredArgsConstructor
+@Api(tags = "系统:系统授权接口")
+public class AuthorizationController {
+
+ private final SecurityProperties properties;
+ private final RedisUtils redisUtils;
+ private final OnlineUserService onlineUserService;
+ private final TokenProvider tokenProvider;
+ private final AuthenticationManagerBuilder authenticationManagerBuilder;
+
+ @Resource
+ private LoginProperties loginProperties;
+
+
+ @ApiOperation("登录授权")
+ @AnonymousPostMapping(value = "/login")
+ public ApiResponse