From b143eb32e15e920a82f09e7092b9477f7de902c1 Mon Sep 17 00:00:00 2001 From: laker <935009066@qq.com> Date: Sun, 24 Mar 2024 23:09:52 +0800 Subject: [PATCH] bugfix and code refactor --- .gitignore | 1 + sql/easy-admin.sql | 4 +- .../com/laker/admin/EasyAdminApplication.java | 1 - ...eConfig.java => EasyThreadPoolConfig.java} | 24 ++++- ...java => EasyTransactionManagerConfig.java} | 2 +- .../com/laker/admin/config/Knife4jConfig.java | 13 +-- .../{WafConfig.java => WafFilterConfig.java} | 6 +- .../com/laker/admin/config/WebMvcConfig.java | 20 ++-- .../{ => websocket}/WebSocketConfig.java | 4 +- .../{ => websocket}/WebSocketStompConfig.java | 4 +- .../framework/aop/metrics/MetricsAspect.java | 12 +-- .../aop/ratelimit/RateLimitAspect.java | 6 +- .../framework/cache/EasyCacheConfig.java | 37 ++++++++ .../laker/admin/framework/cache/JvmCache.java | 2 - .../admin/framework/cache/RedisCache.java | 38 ++++++++ .../admin/framework/ext/filter/MDCFilter.java | 3 + .../CacheBodyFilter.java} | 11 ++- .../CachedBodyHttpServletRequestWrapper.java | 12 ++- .../{ => ext/filter}/waf/WafFilter.java | 2 +- .../filter}/waf/WafRequestWrapper.java | 6 +- .../filter}/waf/attack/HTMLFilter.java | 4 +- .../filter}/waf/attack/SqlFilter.java | 2 +- .../ext/satoken/EasySaInterceprot.java | 3 + .../ext/satoken/MySaTokenListener.java | 8 +- .../stomp/EasyPrincipalHandshakeHandler.java | 4 +- .../handler/GlobalExceptionHandler.java | 26 ++--- .../module/chat/WebSocketCharConroller.java | 13 ++- .../module/ext/controller/DemoController.java | 6 +- .../ext/controller/ExtLeaveController.java | 6 +- .../ext/controller/ExtLogController.java | 4 + .../flow/SnakerflowFacetsController.java | 8 +- .../flow/process/BaseFlowController.java | 2 +- .../sys/controller/IndexController.java | 4 + .../sys/controller/LoginController.java | 18 ++-- .../sys/controller/NginxController.java | 4 + .../sys/controller/StatisticsController.java | 4 + .../sys/controller/SysDeptController.java | 8 +- .../sys/controller/SysDictController.java | 6 +- .../sys/controller/SysFileController.java | 4 +- .../sys/controller/SysMenuController.java | 8 +- .../sys/controller/SysRoleController.java | 10 +- .../sys/controller/SysUserController.java | 4 + .../sys/controller/WebLogController.java | 4 + .../admin/module/sys/entity/SysPower.java | 5 +- .../sys/service/impl/SysMenuServiceImpl.java | 4 +- .../task/DynamicTaskTestController.java | 6 +- .../module/task/TaskManagerController.java | 19 ++-- .../task/TaskManagerMonitorController.java | 16 ++-- .../task/controller/SysTasklogController.java | 6 +- .../task/core/{Job.java => EasyJob.java} | 6 +- .../admin/module/task/core/ICallBack.java | 9 -- .../admin/module/task/core/ITaskStore.java | 10 -- .../task/core/{TaskDto.java => TaskJob.java} | 4 +- .../module/task/core/impl/MysqlTaskStore.java | 49 ---------- .../task/core/listener/JobListener.java | 12 +++ .../LogJobListener.java} | 36 +++---- .../EasyTaskProcessor.java} | 94 ++++++++----------- .../runner/EasyTaskCommandLineRunner.java | 54 +++++++++++ .../task/core/taskstore/ITaskStore.java | 12 +++ .../task/core/taskstore/MysqlTaskStore.java | 47 ++++++++++ .../task/{core/impl => job}/Test2Job.java | 10 +- .../task/{core/impl => job}/TestJob.java | 12 +-- .../{TreeUtil.java => EasyTreeUtil.java} | 7 +- .../com/laker/admin/utils/IP2CityUtil.java | 7 +- ...tRequestUtil.java => EasyRequestUtil.java} | 17 ++-- src/main/resources/application-local.yaml | 5 + src/main/resources/application-prod.yaml | 14 ++- web/admin/index.html | 4 +- web/admin/login.html | 2 +- web/admin/view/system/onlineUser.html | 4 +- web/admin/view/system/role/power.html | 3 +- web/admin/view/system/user/center.html | 2 +- 72 files changed, 545 insertions(+), 299 deletions(-) rename src/main/java/com/laker/admin/config/{ScheduleConfig.java => EasyThreadPoolConfig.java} (50%) rename src/main/java/com/laker/admin/config/{LakerTransactionManagerConfig.java => EasyTransactionManagerConfig.java} (96%) rename src/main/java/com/laker/admin/config/{WafConfig.java => WafFilterConfig.java} (91%) rename src/main/java/com/laker/admin/config/{ => websocket}/WebSocketConfig.java (98%) rename src/main/java/com/laker/admin/config/{ => websocket}/WebSocketStompConfig.java (92%) create mode 100644 src/main/java/com/laker/admin/framework/cache/EasyCacheConfig.java create mode 100644 src/main/java/com/laker/admin/framework/cache/RedisCache.java rename src/main/java/com/laker/admin/framework/ext/filter/{ContentCachingFilter.java => cachebody/CacheBodyFilter.java} (87%) rename src/main/java/com/laker/admin/framework/ext/filter/{ => cachebody}/CachedBodyHttpServletRequestWrapper.java (90%) rename src/main/java/com/laker/admin/framework/{ => ext/filter}/waf/WafFilter.java (97%) rename src/main/java/com/laker/admin/framework/{ => ext/filter}/waf/WafRequestWrapper.java (96%) rename src/main/java/com/laker/admin/framework/{ => ext/filter}/waf/attack/HTMLFilter.java (99%) rename src/main/java/com/laker/admin/framework/{ => ext/filter}/waf/attack/SqlFilter.java (76%) rename src/main/java/com/laker/admin/module/task/core/{Job.java => EasyJob.java} (87%) delete mode 100644 src/main/java/com/laker/admin/module/task/core/ICallBack.java delete mode 100644 src/main/java/com/laker/admin/module/task/core/ITaskStore.java rename src/main/java/com/laker/admin/module/task/core/{TaskDto.java => TaskJob.java} (93%) delete mode 100644 src/main/java/com/laker/admin/module/task/core/impl/MysqlTaskStore.java create mode 100644 src/main/java/com/laker/admin/module/task/core/listener/JobListener.java rename src/main/java/com/laker/admin/module/task/core/{impl/LogCallBack.java => listener/LogJobListener.java} (53%) rename src/main/java/com/laker/admin/module/task/core/{CoreProcessor.java => processor/EasyTaskProcessor.java} (62%) create mode 100644 src/main/java/com/laker/admin/module/task/core/runner/EasyTaskCommandLineRunner.java create mode 100644 src/main/java/com/laker/admin/module/task/core/taskstore/ITaskStore.java create mode 100644 src/main/java/com/laker/admin/module/task/core/taskstore/MysqlTaskStore.java rename src/main/java/com/laker/admin/module/task/{core/impl => job}/Test2Job.java (61%) rename src/main/java/com/laker/admin/module/task/{core/impl => job}/TestJob.java (51%) rename src/main/java/com/laker/admin/utils/{TreeUtil.java => EasyTreeUtil.java} (94%) rename src/main/java/com/laker/admin/utils/http/{HttpServletRequestUtil.java => EasyRequestUtil.java} (92%) diff --git a/.gitignore b/.gitignore index 4735afc..7abbe5f 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ hs_err_pid* /file/ /oss-file/ +/storage/ diff --git a/sql/easy-admin.sql b/sql/easy-admin.sql index b9e193e..208ece2 100644 --- a/sql/easy-admin.sql +++ b/sql/easy-admin.sql @@ -309,8 +309,8 @@ CREATE TABLE `sys_task` ( -- ---------------------------- -- Records of sys_task -- ---------------------------- -INSERT INTO `sys_task` VALUES (10, 'job2', '第二个任务', 'com.laker.admin.module.task.core.impl.Test2Job', '1/3 * * * * ? ', NULL, 1, 0); -INSERT INTO `sys_task` VALUES (11, 'job1', '第一个任务', 'com.laker.admin.module.task.core.impl.TestJob', '1/3 * * * * ?', NULL, 1, 0); +INSERT INTO `sys_task` VALUES (10, 'job2', '第二个任务', 'com.laker.admin.module.task.job.Test2Job', '1/3 * * * * ? ', NULL, 1, 0); +INSERT INTO `sys_task` VALUES (11, 'job1', '第一个任务', 'com.laker.admin.module.task.job.TestJob', '1/3 * * * * ?', NULL, 1, 0); -- ---------------------------- -- Table structure for sys_tasklog diff --git a/src/main/java/com/laker/admin/EasyAdminApplication.java b/src/main/java/com/laker/admin/EasyAdminApplication.java index bf71c35..5e8e4d6 100644 --- a/src/main/java/com/laker/admin/EasyAdminApplication.java +++ b/src/main/java/com/laker/admin/EasyAdminApplication.java @@ -14,5 +14,4 @@ public class EasyAdminApplication { System.out.println("Gitee:https://gitee.com/lakernote/easy-admin"); System.out.println("GitHub:https://github.com/lakernote/easy-admin"); } - } diff --git a/src/main/java/com/laker/admin/config/ScheduleConfig.java b/src/main/java/com/laker/admin/config/EasyThreadPoolConfig.java similarity index 50% rename from src/main/java/com/laker/admin/config/ScheduleConfig.java rename to src/main/java/com/laker/admin/config/EasyThreadPoolConfig.java index ff53a7c..d49cdfb 100644 --- a/src/main/java/com/laker/admin/config/ScheduleConfig.java +++ b/src/main/java/com/laker/admin/config/EasyThreadPoolConfig.java @@ -1,23 +1,41 @@ package com.laker.admin.config; +import com.laker.admin.framework.ext.thread.EasyAdminMDCThreadPoolExecutor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import java.util.concurrent.ThreadPoolExecutor; + @EnableScheduling @Configuration -public class ScheduleConfig { +public class EasyThreadPoolConfig { + /** + * 内置定时任务所用的线程池 + * + * @return + */ @Bean - public ThreadPoolTaskScheduler taskScheduler() { + public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(20); - threadPoolTaskScheduler.setThreadNamePrefix("lakerscheduler-"); + threadPoolTaskScheduler.setThreadNamePrefix("easy-task-"); threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true); threadPoolTaskScheduler.setAwaitTerminationSeconds(60); return threadPoolTaskScheduler; } + /** + * 业务线程池,每个业务一个线程池,用于仓壁隔离 + * + * @return + */ + @Bean + public ThreadPoolExecutor remotePool() { + return new EasyAdminMDCThreadPoolExecutor(5, 5, "remote"); + } } diff --git a/src/main/java/com/laker/admin/config/LakerTransactionManagerConfig.java b/src/main/java/com/laker/admin/config/EasyTransactionManagerConfig.java similarity index 96% rename from src/main/java/com/laker/admin/config/LakerTransactionManagerConfig.java rename to src/main/java/com/laker/admin/config/EasyTransactionManagerConfig.java index e51231f..57af097 100644 --- a/src/main/java/com/laker/admin/config/LakerTransactionManagerConfig.java +++ b/src/main/java/com/laker/admin/config/EasyTransactionManagerConfig.java @@ -13,7 +13,7 @@ import javax.sql.DataSource; @Configuration @AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE) -public class LakerTransactionManagerConfig { +public class EasyTransactionManagerConfig { @Bean DataSourceTransactionManager transactionManager(DataSource dataSource, diff --git a/src/main/java/com/laker/admin/config/Knife4jConfig.java b/src/main/java/com/laker/admin/config/Knife4jConfig.java index 72ef300..2f51c64 100644 --- a/src/main/java/com/laker/admin/config/Knife4jConfig.java +++ b/src/main/java/com/laker/admin/config/Knife4jConfig.java @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; @@ -23,14 +24,14 @@ public class Knife4jConfig { public Docket defaultApi2() { Docket docket = new Docket(DocumentationType.SWAGGER_2) .apiInfo(new ApiInfoBuilder() - .title("laker 地图 接口文档") - .description("# swagger-bootstrap-ui-demo RESTful APIs") - .termsOfServiceUrl("http://www.xx.com/") - .contact("xx@qq.com") + .title("EasyAdmin 1.0 接口文档") + .description("EasyAdmin RESTful APIs") + .termsOfServiceUrl("https://gitee.com/lakernote/easy-admin") + .contact(new Contact("laker", "https://laker.blog.csdn.net", "935009066@qq.com")) .version("1.0") .build()) //分组名称 - .groupName("laker 1.X版本") + .groupName("EasyAdmin 1.X版本") .select() //这里指定Controller扫描包路径 // .apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller")) @@ -40,4 +41,4 @@ public class Knife4jConfig { .build(); return docket; } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/config/WafConfig.java b/src/main/java/com/laker/admin/config/WafFilterConfig.java similarity index 91% rename from src/main/java/com/laker/admin/config/WafConfig.java rename to src/main/java/com/laker/admin/config/WafFilterConfig.java index 6134a6f..7988cbc 100644 --- a/src/main/java/com/laker/admin/config/WafConfig.java +++ b/src/main/java/com/laker/admin/config/WafFilterConfig.java @@ -1,6 +1,6 @@ package com.laker.admin.config; -import com.laker.admin.framework.waf.WafFilter; +import com.laker.admin.framework.ext.filter.waf.WafFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,9 +16,9 @@ import java.util.Map; * @author laker */ @Configuration -public class WafConfig { +public class WafFilterConfig { /** - * 要在 cachefilter后边 + * 要在 Cachefilter后边 * * @return */ diff --git a/src/main/java/com/laker/admin/config/WebMvcConfig.java b/src/main/java/com/laker/admin/config/WebMvcConfig.java index 3a0f1ad..922ef3a 100644 --- a/src/main/java/com/laker/admin/config/WebMvcConfig.java +++ b/src/main/java/com/laker/admin/config/WebMvcConfig.java @@ -38,7 +38,8 @@ public class WebMvcConfig implements WebMvcConfigurer { "/admin/login.html", "/error", "/swagger-resources/**", - "/api/v1/login", + "/sys/auth/v1/login", + "/favicon.ico", "/captcha"}; private static final String[] trace_exclude_path = {"/admin/**", "/admin/login.html", @@ -58,18 +59,20 @@ public class WebMvcConfig implements WebMvcConfigurer { } /** - * 注册sa-token的拦截器,打开注解式鉴权功能 (如果您不需要此功能,可以删除此类) + * 注册sa-token的拦截器,打开注解式鉴权功能 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 注册注解拦截器,并排除不需要注解鉴权的接口地址 registry.addInterceptor(new EasySaInterceprot(handler -> { SaRouter.match("/**", r -> StpUtil.checkLogin()); - }).isAnnotation(true)).addPathPatterns("/**") + }).isAnnotation(true)) + .addPathPatterns("/**") .excludePathPatterns(exclude_path); - // 配置自定义拦截器 - registry.addInterceptor(new TraceAnnotationInterceptor()).addPathPatterns("/**") + // 配置自定义Trace拦截器 + registry.addInterceptor(new TraceAnnotationInterceptor()) + .addPathPatterns("/**") .excludePathPatterns(trace_exclude_path); } @@ -83,7 +86,7 @@ public class WebMvcConfig implements WebMvcConfigurer { // 拦截路由 .addInclude("/ureport/**") // 放行路由 -// .addExclude("/favicon.ico", "/actuator/**") + .addExclude("/favicon.ico", "/actuator/**") // 鉴权方法:每次访问进入 .setAuth(obj -> { if (StpUtil.getLoginIdAsLong() != 1) { @@ -108,7 +111,7 @@ public class WebMvcConfig implements WebMvcConfigurer { // 是否可以在iframe显示视图: DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以 .setHeader("X-Frame-Options", "SAMEORIGIN") // 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面 - .setHeader("X-Frame-Options", "1; mode=block") +// .setHeader("X-Frame-Options", "1; mode=block") // 禁用浏览器内容嗅探 .setHeader("X-Content-Type-Options", "nosniff"); }); @@ -169,6 +172,7 @@ public class WebMvcConfig implements WebMvcConfigurer { // formatters和converters用于对日期格式进行转换,默认已注册了Number和Date类型的formatters, // 支持@NumberFormat和@DateTimeFormat注解,需要自定义formatters和converters可以实现addFormatters方法。 // registry.addFormatter(new DateFormatter("yyyy-MM-dd")); + // 添加请求参数枚举类型支持 registry.addConverter(new StringToEnumConvertFactory()); } @@ -181,7 +185,9 @@ public class WebMvcConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List argumentResolvers) { // 添加自定义方法参数处理器 + // 添加请求参数的PageRequest对象自动填充 argumentResolvers.add(new PageRequestArgumentResolver()); + // 添加请求参数 CurrentUser对象自动填充 argumentResolvers.add(new HandlerMethodArgumentResolver() { @Override public boolean supportsParameter(MethodParameter parameter) { diff --git a/src/main/java/com/laker/admin/config/WebSocketConfig.java b/src/main/java/com/laker/admin/config/websocket/WebSocketConfig.java similarity index 98% rename from src/main/java/com/laker/admin/config/WebSocketConfig.java rename to src/main/java/com/laker/admin/config/websocket/WebSocketConfig.java index 7cae978..3f5338e 100644 --- a/src/main/java/com/laker/admin/config/WebSocketConfig.java +++ b/src/main/java/com/laker/admin/config/websocket/WebSocketConfig.java @@ -1,4 +1,4 @@ -package com.laker.admin.config; +package com.laker.admin.config.websocket; import com.laker.admin.framework.ext.websocket.LakerChatHandler; import com.laker.admin.framework.ext.websocket.LakerSessionHandshakeInterceptor; @@ -27,7 +27,7 @@ public class WebSocketConfig implements WebSocketConfigurer { // 设置运行跨域 .setAllowedOrigins("*"); } - + @Bean public ServletServerContainerFactoryBean createWebSocketContainer() { ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); diff --git a/src/main/java/com/laker/admin/config/WebSocketStompConfig.java b/src/main/java/com/laker/admin/config/websocket/WebSocketStompConfig.java similarity index 92% rename from src/main/java/com/laker/admin/config/WebSocketStompConfig.java rename to src/main/java/com/laker/admin/config/websocket/WebSocketStompConfig.java index 1131884..f2208d1 100644 --- a/src/main/java/com/laker/admin/config/WebSocketStompConfig.java +++ b/src/main/java/com/laker/admin/config/websocket/WebSocketStompConfig.java @@ -1,10 +1,8 @@ -package com.laker.admin.config; +package com.laker.admin.config.websocket; -import com.laker.admin.framework.ext.stomp.EasyChannelInterceptor; import com.laker.admin.framework.ext.stomp.EasyHandShakeInterceptor; import com.laker.admin.framework.ext.stomp.EasyPrincipalHandshakeHandler; import org.springframework.context.annotation.Configuration; -import org.springframework.messaging.simp.config.ChannelRegistration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; diff --git a/src/main/java/com/laker/admin/framework/aop/metrics/MetricsAspect.java b/src/main/java/com/laker/admin/framework/aop/metrics/MetricsAspect.java index 7e03666..71c1941 100644 --- a/src/main/java/com/laker/admin/framework/aop/metrics/MetricsAspect.java +++ b/src/main/java/com/laker/admin/framework/aop/metrics/MetricsAspect.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.laker.admin.module.ext.entity.ExtLog; import com.laker.admin.module.ext.service.IExtLogService; import com.laker.admin.utils.IP2CityUtil; -import com.laker.admin.utils.http.HttpServletRequestUtil; +import com.laker.admin.utils.http.EasyRequestUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -53,16 +53,16 @@ public class MetricsAspect { Object returnValue; Instant start = Instant.now(); ExtLog logBean = new ExtLog(); - logBean.setIp(HttpServletRequestUtil.getRemoteIP()); + logBean.setIp(EasyRequestUtil.getRemoteIP()); logBean.setCity("未知"); if (!StrUtil.equals(logBean.getIp(), "127.0.0.1")) { String cityInfo = IP2CityUtil.getCityInfo(logBean.getIp()); String[] split = cityInfo.split("\\|"); logBean.setCity(StrUtil.format("{}.{}.{}.{}", split[0], split[2], split[3], split[4])); } - logBean.setUri(HttpServletRequestUtil.getRequestURI()); + logBean.setUri(EasyRequestUtil.getRequestURI()); logBean.setUserId(StpUtil.isLogin() ? StpUtil.getLoginIdAsLong() : null); - UserAgent userAgent = HttpServletRequestUtil.getRequestUserAgent(); + UserAgent userAgent = EasyRequestUtil.getRequestUserAgent(); if (userAgent != null) { String client = userAgent.getOs().getName() + "." + userAgent.getBrowser().getName(); logBean.setClient(client); @@ -85,7 +85,7 @@ public class MetricsAspect { try { returnValue = pjp.proceed(); } catch (Exception ex) { - log.info("method:{},fail,cost:{}ms,uri:{},param:{}", name, Duration.between(start, Instant.now()).toMillis(), HttpServletRequestUtil.getRequestURI(), objectMapper.writeValueAsString(modifiedArgs)); + log.info("method:{},fail,cost:{}ms,uri:{},param:{}", name, Duration.between(start, Instant.now()).toMillis(), EasyRequestUtil.getRequestURI(), objectMapper.writeValueAsString(modifiedArgs)); logBean.setCost((int) Duration.between(start, Instant.now()).toMillis()); logBean.setCreateTime(LocalDateTime.now()); logBean.setStatus(false); @@ -95,7 +95,7 @@ public class MetricsAspect { } String response = objectMapper.writeValueAsString(returnValue); - log.debug("method:{},success,cost:{}ms,uri:{},param:{},return:{}", name, Duration.between(start, Instant.now()).toMillis(), HttpServletRequestUtil.getRequestURI(), objectMapper.writeValueAsString(modifiedArgs), response); + log.debug("method:{},success,cost:{}ms,uri:{},param:{},return:{}", name, Duration.between(start, Instant.now()).toMillis(), EasyRequestUtil.getRequestURI(), objectMapper.writeValueAsString(modifiedArgs), response); logBean.setCost((int) Duration.between(start, Instant.now()).toMillis()); logBean.setCreateTime(LocalDateTime.now()); if (StrUtil.isNotBlank(response) && response.length() <= 500) { diff --git a/src/main/java/com/laker/admin/framework/aop/ratelimit/RateLimitAspect.java b/src/main/java/com/laker/admin/framework/aop/ratelimit/RateLimitAspect.java index 1004916..6156551 100644 --- a/src/main/java/com/laker/admin/framework/aop/ratelimit/RateLimitAspect.java +++ b/src/main/java/com/laker/admin/framework/aop/ratelimit/RateLimitAspect.java @@ -2,7 +2,7 @@ package com.laker.admin.framework.aop.ratelimit; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; -import com.laker.admin.utils.http.HttpServletRequestUtil; +import com.laker.admin.utils.http.EasyRequestUtil; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; @@ -36,7 +36,7 @@ public class RateLimitAspect { String key = rateLimit.key() + StringUtils.upperCase(method.getName()); switch (limitType) { case IP: - key = StrUtil.join("-", HttpServletRequestUtil.getRemoteIP(), key); + key = StrUtil.join("-", EasyRequestUtil.getRemoteIP(), key); break; case USER: key = StrUtil.join("-", StpUtil.getLoginId(), key); @@ -51,4 +51,4 @@ public class RateLimitAspect { throw new RateLimitException(rateLimit.msg()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/framework/cache/EasyCacheConfig.java b/src/main/java/com/laker/admin/framework/cache/EasyCacheConfig.java new file mode 100644 index 0000000..2963e80 --- /dev/null +++ b/src/main/java/com/laker/admin/framework/cache/EasyCacheConfig.java @@ -0,0 +1,37 @@ +package com.laker.admin.framework.cache; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class EasyCacheConfig { + + @Bean + @ConditionalOnProperty(name = "cache.type", havingValue = "local", matchIfMissing = true) + public ICache jvmCache() { + return new JvmCache(); + } + + + @Bean + @ConditionalOnProperty(name = "cache.type", havingValue = "redis") + public ICache redisCache(RedisTemplate cacheRedisTemplate) { + + return new RedisCache(cacheRedisTemplate); + } + + @Bean + @ConditionalOnProperty(name = "cache.type", havingValue = "redis") + public RedisTemplate cacheRedisTemplate(LettuceConnectionFactory redisConnectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + template.setConnectionFactory(redisConnectionFactory); + return template; + } +} diff --git a/src/main/java/com/laker/admin/framework/cache/JvmCache.java b/src/main/java/com/laker/admin/framework/cache/JvmCache.java index bff7eba..1c28d07 100644 --- a/src/main/java/com/laker/admin/framework/cache/JvmCache.java +++ b/src/main/java/com/laker/admin/framework/cache/JvmCache.java @@ -2,12 +2,10 @@ package com.laker.admin.framework.cache; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.LFUCache; -import org.springframework.stereotype.Component; /** * @author laker */ -@Component public class JvmCache implements ICache { LFUCache CACHE = CacheUtil.newLFUCache(1000); diff --git a/src/main/java/com/laker/admin/framework/cache/RedisCache.java b/src/main/java/com/laker/admin/framework/cache/RedisCache.java new file mode 100644 index 0000000..b88aadd --- /dev/null +++ b/src/main/java/com/laker/admin/framework/cache/RedisCache.java @@ -0,0 +1,38 @@ +package com.laker.admin.framework.cache; + +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.concurrent.TimeUnit; + +/** + * @author laker + */ +public class RedisCache implements ICache { + + RedisTemplate cacheRedisTemplate; + + public RedisCache(RedisTemplate cacheRedisTemplate) { + this.cacheRedisTemplate = cacheRedisTemplate; + } + + @Override + public void put(String key, Object value) { + cacheRedisTemplate.opsForValue().set(key, value, 1, TimeUnit.DAYS); + } + + @Override + public void put(String key, Object value, long timeout) { + cacheRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); + } + + @Override + public void remove(String key) { + cacheRedisTemplate.delete(key); + } + + @Override + public T get(String key) { + return (T) cacheRedisTemplate.opsForValue().get(key); + } + +} diff --git a/src/main/java/com/laker/admin/framework/ext/filter/MDCFilter.java b/src/main/java/com/laker/admin/framework/ext/filter/MDCFilter.java index 5f1fe70..8e511f4 100644 --- a/src/main/java/com/laker/admin/framework/ext/filter/MDCFilter.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/MDCFilter.java @@ -22,6 +22,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +/** + * @author laker + */ @Order(value = Ordered.HIGHEST_PRECEDENCE + 100) @Component @WebFilter(filterName = "MDCFilter", urlPatterns = "/*") diff --git a/src/main/java/com/laker/admin/framework/ext/filter/ContentCachingFilter.java b/src/main/java/com/laker/admin/framework/ext/filter/cachebody/CacheBodyFilter.java similarity index 87% rename from src/main/java/com/laker/admin/framework/ext/filter/ContentCachingFilter.java rename to src/main/java/com/laker/admin/framework/ext/filter/cachebody/CacheBodyFilter.java index d1cec7a..1b04ce3 100644 --- a/src/main/java/com/laker/admin/framework/ext/filter/ContentCachingFilter.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/cachebody/CacheBodyFilter.java @@ -1,4 +1,4 @@ -package com.laker.admin.framework.ext.filter; +package com.laker.admin.framework.ext.filter.cachebody; import cn.hutool.core.util.StrUtil; import org.springframework.core.Ordered; @@ -14,10 +14,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +/** + * @author laker + */ @Order(value = Ordered.HIGHEST_PRECEDENCE) @Component -@WebFilter(filterName = "ContentCachingFilter", urlPatterns = "/*") -public class ContentCachingFilter extends OncePerRequestFilter { +@WebFilter(filterName = "CacheBodyFilter", urlPatterns = "/*") +public class CacheBodyFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { @@ -29,4 +32,4 @@ public class ContentCachingFilter extends OncePerRequestFilter { filterChain.doFilter(httpServletRequest, httpServletResponse); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/framework/ext/filter/CachedBodyHttpServletRequestWrapper.java b/src/main/java/com/laker/admin/framework/ext/filter/cachebody/CachedBodyHttpServletRequestWrapper.java similarity index 90% rename from src/main/java/com/laker/admin/framework/ext/filter/CachedBodyHttpServletRequestWrapper.java rename to src/main/java/com/laker/admin/framework/ext/filter/cachebody/CachedBodyHttpServletRequestWrapper.java index 09bea12..ed1664e 100644 --- a/src/main/java/com/laker/admin/framework/ext/filter/CachedBodyHttpServletRequestWrapper.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/cachebody/CachedBodyHttpServletRequestWrapper.java @@ -1,5 +1,6 @@ -package com.laker.admin.framework.ext.filter; +package com.laker.admin.framework.ext.filter.cachebody; +import lombok.extern.slf4j.Slf4j; import org.springframework.util.StreamUtils; import javax.servlet.ReadListener; @@ -8,6 +9,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.*; +/** + * @author laker + */ +@Slf4j public class CachedBodyHttpServletRequestWrapper extends HttpServletRequestWrapper { private byte[] cachedBody; @@ -42,8 +47,7 @@ public class CachedBodyHttpServletRequestWrapper extends HttpServletRequestWrapp try { return cachedBodyInputStream.available() == 0; } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + log.error("CachedBodyServletInputStream error.", e); } return false; } @@ -63,4 +67,4 @@ public class CachedBodyHttpServletRequestWrapper extends HttpServletRequestWrapp return cachedBodyInputStream.read(); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/framework/waf/WafFilter.java b/src/main/java/com/laker/admin/framework/ext/filter/waf/WafFilter.java similarity index 97% rename from src/main/java/com/laker/admin/framework/waf/WafFilter.java rename to src/main/java/com/laker/admin/framework/ext/filter/waf/WafFilter.java index aaaa5bc..5bcb953 100644 --- a/src/main/java/com/laker/admin/framework/waf/WafFilter.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/waf/WafFilter.java @@ -1,5 +1,5 @@ -package com.laker.admin.framework.waf; +package com.laker.admin.framework.ext.filter.waf; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/laker/admin/framework/waf/WafRequestWrapper.java b/src/main/java/com/laker/admin/framework/ext/filter/waf/WafRequestWrapper.java similarity index 96% rename from src/main/java/com/laker/admin/framework/waf/WafRequestWrapper.java rename to src/main/java/com/laker/admin/framework/ext/filter/waf/WafRequestWrapper.java index 21f5491..0ca5ecc 100644 --- a/src/main/java/com/laker/admin/framework/waf/WafRequestWrapper.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/waf/WafRequestWrapper.java @@ -1,10 +1,10 @@ -package com.laker.admin.framework.waf; +package com.laker.admin.framework.ext.filter.waf; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; -import com.laker.admin.framework.waf.attack.HTMLFilter; -import com.laker.admin.framework.waf.attack.SqlFilter; +import com.laker.admin.framework.ext.filter.waf.attack.HTMLFilter; +import com.laker.admin.framework.ext.filter.waf.attack.SqlFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; diff --git a/src/main/java/com/laker/admin/framework/waf/attack/HTMLFilter.java b/src/main/java/com/laker/admin/framework/ext/filter/waf/attack/HTMLFilter.java similarity index 99% rename from src/main/java/com/laker/admin/framework/waf/attack/HTMLFilter.java rename to src/main/java/com/laker/admin/framework/ext/filter/waf/attack/HTMLFilter.java index 26572be..b586a0e 100644 --- a/src/main/java/com/laker/admin/framework/waf/attack/HTMLFilter.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/waf/attack/HTMLFilter.java @@ -1,4 +1,4 @@ -package com.laker.admin.framework.waf.attack; +package com.laker.admin.framework.ext.filter.waf.attack; import java.util.ArrayList; import java.util.Collections; @@ -567,4 +567,4 @@ public final class HTMLFilter { return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/framework/waf/attack/SqlFilter.java b/src/main/java/com/laker/admin/framework/ext/filter/waf/attack/SqlFilter.java similarity index 76% rename from src/main/java/com/laker/admin/framework/waf/attack/SqlFilter.java rename to src/main/java/com/laker/admin/framework/ext/filter/waf/attack/SqlFilter.java index 158b8f3..1adc592 100644 --- a/src/main/java/com/laker/admin/framework/waf/attack/SqlFilter.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/waf/attack/SqlFilter.java @@ -1,4 +1,4 @@ -package com.laker.admin.framework.waf.attack; +package com.laker.admin.framework.ext.filter.waf.attack; public class SqlFilter { diff --git a/src/main/java/com/laker/admin/framework/ext/satoken/EasySaInterceprot.java b/src/main/java/com/laker/admin/framework/ext/satoken/EasySaInterceprot.java index 2072388..3531397 100644 --- a/src/main/java/com/laker/admin/framework/ext/satoken/EasySaInterceprot.java +++ b/src/main/java/com/laker/admin/framework/ext/satoken/EasySaInterceprot.java @@ -7,6 +7,9 @@ import cn.dev33.satoken.stp.StpUtil; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +/** + * @author laker + */ public class EasySaInterceprot extends SaInterceptor { /** diff --git a/src/main/java/com/laker/admin/framework/ext/satoken/MySaTokenListener.java b/src/main/java/com/laker/admin/framework/ext/satoken/MySaTokenListener.java index c8bec7c..b25c0a2 100644 --- a/src/main/java/com/laker/admin/framework/ext/satoken/MySaTokenListener.java +++ b/src/main/java/com/laker/admin/framework/ext/satoken/MySaTokenListener.java @@ -9,7 +9,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.useragent.UserAgent; import com.laker.admin.module.sys.service.ISysUserService; import com.laker.admin.utils.IP2CityUtil; -import com.laker.admin.utils.http.HttpServletRequestUtil; +import com.laker.admin.utils.http.EasyRequestUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -40,14 +40,14 @@ public class MySaTokenListener implements SaTokenListener { */ @Override public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { - UserAgent requestUserAgent = HttpServletRequestUtil.getRequestUserAgent(); + UserAgent requestUserAgent = EasyRequestUtil.getRequestUserAgent(); if (requestUserAgent == null) { return; } - String cityInfo = IP2CityUtil.getCityInfo(HttpServletRequestUtil.getRemoteIP()); + String cityInfo = IP2CityUtil.getCityInfo(EasyRequestUtil.getRemoteIP()); String[] split = cityInfo.split("\\|"); ONLINE_USERS.add(OnlineUser.builder() - .ip(HttpServletRequestUtil.getRemoteIP()) + .ip(EasyRequestUtil.getRemoteIP()) .city(StrUtil.format("{}.{}.{}", split[0], split[2], split[3])) .loginTime(new Date()) .os(requestUserAgent.getOs().getName()) diff --git a/src/main/java/com/laker/admin/framework/ext/stomp/EasyPrincipalHandshakeHandler.java b/src/main/java/com/laker/admin/framework/ext/stomp/EasyPrincipalHandshakeHandler.java index df2a5ec..6a10410 100644 --- a/src/main/java/com/laker/admin/framework/ext/stomp/EasyPrincipalHandshakeHandler.java +++ b/src/main/java/com/laker/admin/framework/ext/stomp/EasyPrincipalHandshakeHandler.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; import com.laker.admin.framework.utils.EasyAdminSecurityUtils; import com.laker.admin.utils.IP2CityUtil; -import com.laker.admin.utils.http.HttpServletRequestUtil; +import com.laker.admin.utils.http.EasyRequestUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServletServerHttpRequest; @@ -27,7 +27,7 @@ public class EasyPrincipalHandshakeHandler extends DefaultHandshakeHandler { log.info("确定用户"); //握手成功后调用,可以在这里保存用户id String userName = ((ServletServerHttpRequest) request).getServletRequest().getParameter("userName"); - String remoteIP = HttpServletRequestUtil.getRemoteIP(); + String remoteIP = EasyRequestUtil.getRemoteIP(); String address; if (!StrUtil.equals(remoteIP, "127.0.0.1")) { String cityInfo = IP2CityUtil.getCityInfo(remoteIP); diff --git a/src/main/java/com/laker/admin/framework/handler/GlobalExceptionHandler.java b/src/main/java/com/laker/admin/framework/handler/GlobalExceptionHandler.java index ac93aa4..253d93e 100644 --- a/src/main/java/com/laker/admin/framework/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/laker/admin/framework/handler/GlobalExceptionHandler.java @@ -7,7 +7,7 @@ import cn.hutool.core.lang.Dict; import com.laker.admin.framework.aop.ratelimit.RateLimitException; import com.laker.admin.framework.exception.BusinessException; import com.laker.admin.framework.model.Response; -import com.laker.admin.utils.http.HttpServletRequestUtil; +import com.laker.admin.utils.http.EasyRequestUtil; import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.internal.engine.path.NodeImpl; import org.hibernate.validator.internal.engine.path.PathImpl; @@ -42,7 +42,7 @@ public class GlobalExceptionHandler { */ @ExceptionHandler(BusinessException.class) public Response handleRRException(BusinessException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error("业务异常:{}", e.getMsg()); return Response.error(String.valueOf(e.getCode()), e.getMsg()); } @@ -54,7 +54,7 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentTypeMismatchException.class) public Response handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error("方法参数类型不匹配", e); return Response.error("方法参数类型不匹配"); } @@ -65,7 +65,7 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MissingServletRequestParameterException.class) public Response handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error("缺少请求参数", e); return Response.error("缺少请求参数"); } @@ -76,7 +76,7 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) public Response handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error("参数解析失败", e); return Response.error("参数解析失败"); } @@ -88,7 +88,7 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(ValidationException.class) public Response handleValidationException(ValidationException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error("参数验证失败", e); return Response.error("参数验证失败"); } @@ -99,7 +99,7 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public Response handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error("不支持当前请求方法", e); return Response.error("不支持当前请求方法"); } @@ -110,21 +110,21 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) @ExceptionHandler(HttpMediaTypeNotSupportedException.class) public Response handleHttpMediaTypeNotSupportedException(Exception e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error("不支持当前媒体类型", e); return Response.error("不支持当前媒体类型"); } @ExceptionHandler(DuplicateKeyException.class) public Response handleDuplicateKeyException(DuplicateKeyException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error(e.getMessage(), e); return Response.error("500", "数据库中已存在该记录"); } @ExceptionHandler(MaxUploadSizeExceededException.class) public Response handleMaxSizeException(MaxUploadSizeExceededException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error(e.getMessage(), e); return Response.error("500", "File too large!"); } @@ -132,14 +132,14 @@ public class GlobalExceptionHandler { @ResponseStatus(HttpStatus.UNAUTHORIZED) @ExceptionHandler(NotLoginException.class) public Response handleNotLoginException(NotLoginException e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error(e.getMessage()); return Response.error("401", e.getMessage()); } @ExceptionHandler(SaTokenException.class) public Response handleMaxSizeException(SaTokenException e) { - log.error("uri:{}, httpMethod:{}, errMsg:{}", HttpServletRequestUtil.getRequestURI(), HttpServletRequestUtil.getRequest().getMethod(), e); + log.error("uri:{}, httpMethod:{}, errMsg:{}", EasyRequestUtil.getRequestURI(), EasyRequestUtil.getRequest().getMethod(), e); return Response.error("403", e.getMessage()); } @@ -188,7 +188,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public Response handleException(Exception e) { - log.info(HttpServletRequestUtil.getAllRequestInfo()); + log.info(EasyRequestUtil.getAllRequestInfo()); log.error(e.getMessage(), e); return Response.error("500", "服务器异常"); } diff --git a/src/main/java/com/laker/admin/module/chat/WebSocketCharConroller.java b/src/main/java/com/laker/admin/module/chat/WebSocketCharConroller.java index b73bf3d..396a44d 100644 --- a/src/main/java/com/laker/admin/module/chat/WebSocketCharConroller.java +++ b/src/main/java/com/laker/admin/module/chat/WebSocketCharConroller.java @@ -1,13 +1,17 @@ package com.laker.admin.module.chat; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.ext.stomp.EasyChatMessage; import com.laker.admin.framework.ext.stomp.EasyPrincipal; +import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.handler.annotation.MessageExceptionHandler; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.stereotype.Controller; +@Api(tags = "聊天室-stomp")// 在doc.html中的名称 +@ApiSupport(order = 40, author = "laker") // 在doc.html中的顺序 @Controller @Slf4j public class WebSocketCharConroller { @@ -24,10 +28,11 @@ public class WebSocketCharConroller { /** * 私聊聊天 - * // 本地订阅 - * stompClient.subscribe('/user/' + uid + '/chat', function (data) { - * handleMessage(getData(data.body)); - * }); + * // 本地订阅 + * stompClient.subscribe('/user/' + uid + '/chat', function (data) { + * handleMessage(getData(data.body)); + * }); + * * @param user 发送消息的用户对象 * @throws Exception */ diff --git a/src/main/java/com/laker/admin/module/ext/controller/DemoController.java b/src/main/java/com/laker/admin/module/ext/controller/DemoController.java index 92cd719..2aa4ac2 100644 --- a/src/main/java/com/laker/admin/module/ext/controller/DemoController.java +++ b/src/main/java/com/laker/admin/module/ext/controller/DemoController.java @@ -21,8 +21,8 @@ import java.util.List; * @author laker * @since 2021-08-16 */ -@Api(tags = "示例controller")// 在doc.html中的名称 -@ApiSupport(order = 0, author = "laker") // 在doc.html中的顺序 +@Api(tags = "示例-各种请求参数示例") +@ApiSupport(order = 100) @RestController @RequestMapping("/ext/demo") @Slf4j @@ -66,4 +66,4 @@ public class DemoController { public void pageAll6(PageRequest user) { log.info(user.toString()); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/ext/controller/ExtLeaveController.java b/src/main/java/com/laker/admin/module/ext/controller/ExtLeaveController.java index 9b7e558..2d01fc0 100644 --- a/src/main/java/com/laker/admin/module/ext/controller/ExtLeaveController.java +++ b/src/main/java/com/laker/admin/module/ext/controller/ExtLeaveController.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.aop.metrics.Metrics; import com.laker.admin.framework.aop.trace.LakerTrace; import com.laker.admin.framework.aop.trace.SpanType; @@ -20,6 +21,7 @@ import com.laker.admin.module.ext.service.IExtLeaveService; import com.laker.admin.module.flow.process.BaseFlowController; import com.laker.admin.module.flow.process.SnakerEngineFacets; import com.laker.admin.module.sys.service.ISysUserService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.snaker.engine.SnakerEngine; import org.snaker.engine.entity.Order; @@ -41,6 +43,8 @@ import java.util.concurrent.TimeUnit; * @author laker * @since 2021-08-19 */ +@Api(tags = "示例-请假流程示例") +@ApiSupport(order = 100) @RestController @RequestMapping("/ext/leave") @Metrics @@ -155,4 +159,4 @@ public class ExtLeaveController extends BaseFlowController { public Response batchRemove(@PathVariable Long[] ids) { return Response.ok(extLeaveService.removeByIds(CollUtil.toList(ids))); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java b/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java index 19e38fc..6f4386e 100644 --- a/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java +++ b/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.aop.metrics.Metrics; import com.laker.admin.framework.aop.repeatedsubmit.RepeatSubmitLimit; import com.laker.admin.framework.aop.trace.LakerIgnoreTrace; @@ -17,6 +18,7 @@ import com.laker.admin.module.ext.service.IExtLogService; import com.laker.admin.module.ext.vo.LogStatisticsTop10Vo; import com.laker.admin.module.ext.vo.LogStatisticsVo; import com.laker.admin.module.sys.service.ISysUserService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -34,6 +36,8 @@ import java.util.List; * @author laker * @since 2021-08-16 */ +@Api(tags = "示例-请求日志示例") +@ApiSupport(order = 100) @RestController @RequestMapping("/ext/log") @Metrics diff --git a/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java b/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java index 296a448..3e6f157 100644 --- a/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java +++ b/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java @@ -1,11 +1,13 @@ package com.laker.admin.module.flow; +import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.aop.metrics.Metrics; import com.laker.admin.framework.aop.repeatedsubmit.RepeatSubmitLimit; import com.laker.admin.framework.model.PageResponse; @@ -14,6 +16,7 @@ import com.laker.admin.module.flow.process.SnakerEngineFacets; import com.laker.admin.module.flow.process.SnakerHelper; import com.laker.admin.module.sys.entity.SysUser; import com.laker.admin.module.sys.service.ISysUserService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -37,9 +40,12 @@ import java.util.Map; import static org.snaker.engine.access.QueryFilter.DESC; +@Api(tags = "流程引擎-流程管理")// 在doc.html中的名称 +@ApiSupport(order = 200, author = "laker") // 在doc.html中的顺序 @RestController @RequestMapping("/flow") @Slf4j +@SaCheckLogin public class SnakerflowFacetsController { @Autowired @@ -175,8 +181,6 @@ public class SnakerflowFacetsController { List historyTasks = snakerEngineFacets.getEngine().query().getHistoryTasks(new QueryFilter().setOrderId(orderId)); jsonMap.put("state", SnakerHelper.getStateJson(model, tasks, historyTasks)); } - log.info(jsonMap.get("state")); - //{"historyRects":{"rects":[{"paths":["TO 任务1"],"name":"开始"},{"paths":["TO 分支"],"name":"任务1"},{"paths":["TO 任务3","TO 任务4","TO 任务2"],"name":"分支"}]}} return jsonMap; } diff --git a/src/main/java/com/laker/admin/module/flow/process/BaseFlowController.java b/src/main/java/com/laker/admin/module/flow/process/BaseFlowController.java index 5c05ed2..e5d7baa 100644 --- a/src/main/java/com/laker/admin/module/flow/process/BaseFlowController.java +++ b/src/main/java/com/laker/admin/module/flow/process/BaseFlowController.java @@ -15,7 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; -public class BaseFlowController { +public abstract class BaseFlowController { @Autowired private SnakerEngineFacets snakerEngineFacets; @Autowired diff --git a/src/main/java/com/laker/admin/module/sys/controller/IndexController.java b/src/main/java/com/laker/admin/module/sys/controller/IndexController.java index fdfbf2c..e5d8b26 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/IndexController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/IndexController.java @@ -3,6 +3,7 @@ package com.laker.admin.module.sys.controller; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.IdUtil; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.config.EasyConfig; import com.laker.admin.framework.aop.ratelimit.LimitType; import com.laker.admin.framework.aop.ratelimit.RateLimit; @@ -11,6 +12,7 @@ import com.laker.admin.framework.exception.BusinessException; import com.laker.admin.framework.model.Response; import com.laker.admin.framework.utils.EasyImageUtils; import com.wf.captcha.ArithmeticCaptcha; +import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -27,6 +29,8 @@ import java.net.URL; /** * /admin/** 无需check login */ +@Api(tags = "系统-验证码等") +@ApiSupport(order = 5) @Controller @Slf4j public class IndexController { diff --git a/src/main/java/com/laker/admin/module/sys/controller/LoginController.java b/src/main/java/com/laker/admin/module/sys/controller/LoginController.java index 1da3d6f..bd83a77 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/LoginController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/LoginController.java @@ -36,11 +36,12 @@ import org.springframework.web.bind.annotation.*; import java.util.List; -@Api(tags = "认证授权") +@Api(tags = "系统-认证授权") @ApiSupport(order = 2) @RestController @Slf4j @Metrics +@RequestMapping("/sys/auth") public class LoginController { @Autowired @@ -54,12 +55,13 @@ public class LoginController { @Autowired ISysDeptService sysDeptService; - @PostMapping("/api/v1/login") + @PostMapping("/v1/login") @ApiOperationSupport(order = 1) - @ApiOperation(value = "登录") + @ApiOperation(value = "登录-用户名密码") public Response login(@Validated @RequestBody LoginDto loginDto) { // 验证码是否正确 String code = iCache.get(loginDto.getUid()); + iCache.remove(loginDto.getUid()); if (!StrUtil.equalsIgnoreCase(code, loginDto.getCaptchaCode())) { return Response.error("500", "验证码不正确或已失效"); } @@ -86,7 +88,7 @@ public class LoginController { } - @GetMapping("/api/v1/tokenInfo") + @GetMapping("/v1/tokenInfo") @ApiOperationSupport(order = 2) @ApiOperation(value = "获取当前会话的token信息") public Response tokenInfo() { @@ -94,7 +96,7 @@ public class LoginController { } - @GetMapping("/api/v1/userInfo") + @GetMapping("/v1/userInfo") @ApiOperationSupport(order = 2) @ApiOperation(value = "获取当前用户信息") public Response userInfo() { @@ -106,7 +108,7 @@ public class LoginController { return Response.ok(user); } - @GetMapping("/api/v1/onlineUsers") + @GetMapping("/v1/onlineUsers") @ApiOperationSupport(order = 2) @ApiOperation(value = "获取在线用户信息") public PageResponse onlineUsers(@RequestParam(required = false, defaultValue = "1") int page, @@ -125,7 +127,7 @@ public class LoginController { return PageResponse.ok(pageList, (long) pageDto.getTotal()); } - @GetMapping("/api/v1/kickOffline") + @GetMapping("/v1/kickOffline") @ApiOperationSupport(order = 2) @ApiOperation(value = "踢人下线") @SaCheckPermission("online.user.kick") @@ -138,7 +140,7 @@ public class LoginController { return Response.ok(); } - @GetMapping("/api/v1/loginOut") + @GetMapping("/v1/logout") @ApiOperationSupport(order = 3) @ApiOperation(value = "登出") @SaCheckLogin diff --git a/src/main/java/com/laker/admin/module/sys/controller/NginxController.java b/src/main/java/com/laker/admin/module/sys/controller/NginxController.java index 4574821..734bbe9 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/NginxController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/NginxController.java @@ -7,10 +7,12 @@ import cn.hutool.core.util.RuntimeUtil; import cn.hutool.core.util.StrUtil; import com.github.odiszapc.nginxparser.NgxConfig; import com.github.odiszapc.nginxparser.NgxDumper; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.config.EasyConfig; import com.laker.admin.framework.model.Response; import com.laker.admin.module.sys.pojo.NginxQo; import com.laker.admin.module.sys.service.ISysDeptService; +import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -26,6 +28,8 @@ import java.util.Date; * @author laker * @since 2021-08-11 */ +@Api(tags = "系统-nginx管理") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/nginx") public class NginxController { diff --git a/src/main/java/com/laker/admin/module/sys/controller/StatisticsController.java b/src/main/java/com/laker/admin/module/sys/controller/StatisticsController.java index 7f12387..3eb830e 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/StatisticsController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/StatisticsController.java @@ -2,9 +2,11 @@ package com.laker.admin.module.sys.controller; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.Dict; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.model.Response; import com.laker.admin.module.ext.mapper.ExtLogMapper; import com.laker.admin.module.flow.process.SnakerEngineFacets; +import io.swagger.annotations.Api; import org.snaker.engine.access.QueryFilter; import org.snaker.engine.entity.HistoryTask; import org.snaker.engine.entity.Task; @@ -15,6 +17,8 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +@Api(tags = "系统-数据报表") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/statistics") public class StatisticsController { diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java b/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java index c527933..fb4e8ce 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java @@ -6,12 +6,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import com.laker.admin.framework.aop.metrics.Metrics; import com.laker.admin.framework.model.Response; import com.laker.admin.framework.model.ResultTable; import com.laker.admin.framework.model.ResultTree; -import com.laker.admin.framework.aop.metrics.Metrics; import com.laker.admin.module.sys.entity.SysDept; import com.laker.admin.module.sys.service.ISysDeptService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -26,6 +28,8 @@ import java.util.List; * @author laker * @since 2021-08-11 */ +@Api(tags = "系统-组织机构管理") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/dept") @Metrics @@ -88,4 +92,4 @@ public class SysDeptController { return ResultTree.data(data); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java b/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java index c8d99da..3e1d1ea 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java @@ -5,12 +5,14 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.aop.metrics.Metrics; import com.laker.admin.framework.lock.api.Lock; import com.laker.admin.framework.model.PageResponse; import com.laker.admin.framework.model.Response; import com.laker.admin.module.sys.entity.SysDict; import com.laker.admin.module.sys.service.ISysDictService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,6 +25,8 @@ import org.springframework.web.bind.annotation.*; * @author laker * @since 2021-08-16 */ +@Api(tags = "系统-字典管理") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/dict") @Metrics @@ -79,4 +83,4 @@ public class SysDictController { public Response batchRemove(@PathVariable Long[] ids) { return Response.ok(sysDictService.removeByIds(CollUtil.toList(ids))); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysFileController.java b/src/main/java/com/laker/admin/module/sys/controller/SysFileController.java index ea51b48..7cbccce 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysFileController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysFileController.java @@ -1,6 +1,7 @@ package com.laker.admin.module.sys.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.model.PageResponse; import com.laker.admin.framework.model.Response; import com.laker.admin.module.sys.entity.SysFile; @@ -20,7 +21,8 @@ import org.springframework.web.multipart.MultipartFile; * @author laker * @since 2022-02-21 */ -@Api(tags = "文件管理") +@Api(tags = "系统-文件管理") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/file") public class SysFileController { diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java b/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java index 3d2dac8..8ab5cae 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java @@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.laker.admin.framework.model.Response; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.aop.metrics.Metrics; +import com.laker.admin.framework.model.Response; import com.laker.admin.module.sys.entity.SysPower; import com.laker.admin.module.sys.pojo.MenuVo; import com.laker.admin.module.sys.service.ISysMenuService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -24,6 +26,8 @@ import java.util.List; * @author laker * @since 2021-08-04 */ +@Api(tags = "系统-权限菜单管理") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/menu") @Metrics @@ -83,4 +87,4 @@ public class SysMenuController { public Response delete(@PathVariable Long id) { return Response.ok(sysMenuService.removeById(id)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java b/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java index bf6481b..f34345d 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.exception.BusinessException; import com.laker.admin.framework.model.PageResponse; import com.laker.admin.framework.model.Response; @@ -15,6 +16,7 @@ import com.laker.admin.module.sys.entity.SysRolePower; import com.laker.admin.module.sys.service.ISysMenuService; import com.laker.admin.module.sys.service.ISysRolePowerService; import com.laker.admin.module.sys.service.ISysRoleService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -29,6 +31,8 @@ import java.util.List; * @author laker * @since 2021-08-11 */ +@Api(tags = "系统-角色管理") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/role") public class SysRoleController { @@ -83,9 +87,11 @@ public class SysRoleController { List allPower = null; // 菜单角色 if (role.getRoleType().equals(SysRole.ROLE_TYPE_MENU)) { - allPower = sysMenuService.list(Wrappers.lambdaQuery().ne(SysPower::getType, 3)); + // 菜单 + allPower = sysMenuService.list(Wrappers.lambdaQuery().in(SysPower::getType, 0, 1, 2)); } else { - allPower = sysMenuService.list(Wrappers.lambdaQuery().ne(SysPower::getType, 2)); + // 数据 + allPower = sysMenuService.list(Wrappers.lambdaQuery().in(SysPower::getType, 0, 1, 3)); } List myPower = sysRolePowerService.list(Wrappers.lambdaQuery().eq(SysRolePower::getRoleId, roleId)); diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java b/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java index c3d7dde..00857a4 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.config.EasyConfig; import com.laker.admin.framework.aop.metrics.Metrics; import com.laker.admin.framework.model.PageResponse; @@ -23,6 +24,7 @@ import com.laker.admin.module.sys.pojo.UserDto; import com.laker.admin.module.sys.service.ISysRoleService; import com.laker.admin.module.sys.service.ISysUserRoleService; import com.laker.admin.module.sys.service.ISysUserService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; @@ -41,6 +43,8 @@ import java.util.stream.Collectors; * @author laker * @since 2021-08-05 */ +@Api(tags = "系统-用户管理") +@ApiSupport(order = 5) @RestController @RequestMapping("/sys/user") @Metrics diff --git a/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java b/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java index 5abb20f..abf216c 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java @@ -2,8 +2,10 @@ package com.laker.admin.module.sys.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.config.EasyConfig; import com.laker.admin.framework.exception.BusinessException; +import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.logging.LogLevel; import org.springframework.boot.logging.LoggerGroup; @@ -27,6 +29,8 @@ import java.io.File; * @author laker * @since 2021-08-05 */ +@Api(tags = "系统-web日志") +@ApiSupport(order = 5) @Controller @RequestMapping("/sys/weblog") public class WebLogController { diff --git a/src/main/java/com/laker/admin/module/sys/entity/SysPower.java b/src/main/java/com/laker/admin/module/sys/entity/SysPower.java index bcd1efb..36b334f 100644 --- a/src/main/java/com/laker/admin/module/sys/entity/SysPower.java +++ b/src/main/java/com/laker/admin/module/sys/entity/SysPower.java @@ -70,6 +70,9 @@ public class SysPower implements Serializable { */ private String remark; + /** + * 权限类型0目录1菜单2接口3数据 + */ private Integer type; /** * 如果是数据权限类型,则为数据权限标识 ExtLeaveMapper.selectPage Mapper名称+方法名称 @@ -77,7 +80,7 @@ public class SysPower implements Serializable { private String powerCode; /** - * 权限类型 + * 当时数据权限时,过滤类型 */ private DataFilterTypeEnum dataFilterType; /** diff --git a/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java b/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java index 209d5fa..f9b9bcf 100644 --- a/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java +++ b/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java @@ -11,7 +11,7 @@ import com.laker.admin.module.sys.pojo.MenuVo; import com.laker.admin.module.sys.service.ISysMenuService; import com.laker.admin.module.sys.service.ISysRolePowerService; import com.laker.admin.module.sys.service.ISysUserRoleService; -import com.laker.admin.utils.TreeUtil; +import com.laker.admin.utils.EasyTreeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -63,7 +63,7 @@ public class SysMenuServiceImpl extends ServiceImpl imp menuVO.setPowerCode(e.getPowerCode()); menuInfo.add(menuVO); } - return TreeUtil.toTree(menuInfo, 0L); + return EasyTreeUtil.toTree(menuInfo, 0L); } private List getSysMenusPowerByLoginUser(Long loginId) { diff --git a/src/main/java/com/laker/admin/module/task/DynamicTaskTestController.java b/src/main/java/com/laker/admin/module/task/DynamicTaskTestController.java index 2063f4d..e98f660 100644 --- a/src/main/java/com/laker/admin/module/task/DynamicTaskTestController.java +++ b/src/main/java/com/laker/admin/module/task/DynamicTaskTestController.java @@ -15,8 +15,8 @@ import java.util.Date; import java.util.concurrent.ScheduledFuture; // https://my.oschina.net/sdlvzg/blog/1590946 -@Api(tags = "动态任务原理测试") -@ApiSupport(order = 1) +@Api(tags = "定时任务-动态任务原理测试") +@ApiSupport(order = 22) @RestController @Slf4j public class DynamicTaskTestController { @@ -64,4 +64,4 @@ public class DynamicTaskTestController { log.info("DynamicTask.MyRunnable.run()," + new Date()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/task/TaskManagerController.java b/src/main/java/com/laker/admin/module/task/TaskManagerController.java index e235d6d..c5a17c1 100644 --- a/src/main/java/com/laker/admin/module/task/TaskManagerController.java +++ b/src/main/java/com/laker/admin/module/task/TaskManagerController.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.model.PageResponse; import com.laker.admin.framework.model.Response; -import com.laker.admin.module.task.core.CoreProcessor; +import com.laker.admin.module.task.core.processor.EasyTaskProcessor; import com.laker.admin.module.task.entity.SysTask; import com.laker.admin.module.task.service.ISysTaskService; import io.swagger.annotations.Api; @@ -16,21 +16,24 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -@Api(tags = "定时任务管理") -@ApiSupport(order = 1) +/** + * @author laker + */ +@Api(tags = "定时任务-任务管理") +@ApiSupport(order = 20) @RestController @RequestMapping("/sys/task") @Slf4j public class TaskManagerController { @Autowired - private CoreProcessor coreProcessor; + private EasyTaskProcessor easyTaskProcessor; @Autowired ISysTaskService sysTaskService; @GetMapping - @ApiOperation(value = "分页查询") + @ApiOperation(value = "定义任务分页查询") public PageResponse pageAll(@RequestParam(required = false, defaultValue = "1") long page, @RequestParam(required = false, defaultValue = "10") long limit) { Page roadPage = new Page<>(page, limit); @@ -57,16 +60,16 @@ public class TaskManagerController { @ApiOperation("开始任务") @SaCheckPermission("task.start") public Response start(String taskCode) { - coreProcessor.startJob(taskCode); + easyTaskProcessor.startJob(taskCode); return Response.ok(); } @GetMapping("/stop") @ApiOperation("暂停任务") public Response stopCron(String taskCode) { - coreProcessor.stopJob(taskCode); + easyTaskProcessor.stopJob(taskCode); return Response.ok(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/task/TaskManagerMonitorController.java b/src/main/java/com/laker/admin/module/task/TaskManagerMonitorController.java index 19357e2..31e0d53 100644 --- a/src/main/java/com/laker/admin/module/task/TaskManagerMonitorController.java +++ b/src/main/java/com/laker/admin/module/task/TaskManagerMonitorController.java @@ -2,7 +2,7 @@ package com.laker.admin.module.task; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.model.Response; -import com.laker.admin.module.task.core.CoreProcessor; +import com.laker.admin.module.task.core.processor.EasyTaskProcessor; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -11,21 +11,23 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -@Api(tags = "定时任务管理监控") -@ApiSupport(order = 1) +/** + * @author laker + */ +@Api(tags = "定时任务-任务监控") +@ApiSupport(order = 22) @RestController @RequestMapping("/task-manager-monitor") @Slf4j public class TaskManagerMonitorController { @Autowired - private CoreProcessor coreProcessor; + private EasyTaskProcessor easyTaskProcessor; @GetMapping("/jvm-task-list") @ApiOperation("列表") public Response startCron() { - return Response.ok(coreProcessor.jvmTaskList()); + return Response.ok(easyTaskProcessor.runningTaskList()); } - -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/task/controller/SysTasklogController.java b/src/main/java/com/laker/admin/module/task/controller/SysTasklogController.java index 8300620..42aa522 100644 --- a/src/main/java/com/laker/admin/module/task/controller/SysTasklogController.java +++ b/src/main/java/com/laker/admin/module/task/controller/SysTasklogController.java @@ -3,9 +3,11 @@ package com.laker.admin.module.task.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.model.PageResponse; import com.laker.admin.module.task.entity.SysTasklog; import com.laker.admin.module.task.service.ISysTasklogService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -21,6 +23,8 @@ import org.springframework.web.bind.annotation.RestController; * @author laker * @since 2021-08-18 */ +@Api(tags = "定时任务-任务日志") +@ApiSupport(order = 22) @RestController @RequestMapping("/sys/tasklog") public class SysTasklogController { @@ -40,4 +44,4 @@ public class SysTasklogController { return PageResponse.ok(pageList.getRecords(), pageList.getTotal()); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/task/core/Job.java b/src/main/java/com/laker/admin/module/task/core/EasyJob.java similarity index 87% rename from src/main/java/com/laker/admin/module/task/core/Job.java rename to src/main/java/com/laker/admin/module/task/core/EasyJob.java index 14a4d21..471f439 100644 --- a/src/main/java/com/laker/admin/module/task/core/Job.java +++ b/src/main/java/com/laker/admin/module/task/core/EasyJob.java @@ -12,13 +12,13 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @Component -public @interface Job { +public @interface EasyJob { @AliasFor(annotation = Component.class) String value() default ""; /** - * cron 表达式默认不"-"代表不执行 + * cron表达式,默认"-",代表不执行 */ String cron() default "-"; @@ -32,4 +32,4 @@ public @interface Job { */ String taskName(); -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/task/core/ICallBack.java b/src/main/java/com/laker/admin/module/task/core/ICallBack.java deleted file mode 100644 index 6d5e771..0000000 --- a/src/main/java/com/laker/admin/module/task/core/ICallBack.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.laker.admin.module.task.core; - -public interface ICallBack { - void start(TaskDto taskDto); - - void exception(TaskDto taskDto, Exception e); - - void end(TaskDto taskDto); -} diff --git a/src/main/java/com/laker/admin/module/task/core/ITaskStore.java b/src/main/java/com/laker/admin/module/task/core/ITaskStore.java deleted file mode 100644 index cda8b4e..0000000 --- a/src/main/java/com/laker/admin/module/task/core/ITaskStore.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.laker.admin.module.task.core; - -public interface ITaskStore { - - void saveTask(TaskDto taskDto); - - - TaskDto findByTaskCode(String taskCode); - -} diff --git a/src/main/java/com/laker/admin/module/task/core/TaskDto.java b/src/main/java/com/laker/admin/module/task/core/TaskJob.java similarity index 93% rename from src/main/java/com/laker/admin/module/task/core/TaskDto.java rename to src/main/java/com/laker/admin/module/task/core/TaskJob.java index 559c943..cb83cc1 100644 --- a/src/main/java/com/laker/admin/module/task/core/TaskDto.java +++ b/src/main/java/com/laker/admin/module/task/core/TaskJob.java @@ -8,7 +8,7 @@ import lombok.Data; @Data @Builder @AllArgsConstructor -public class TaskDto { +public class TaskJob { /** * 任务的编码 必须全局唯一 */ @@ -33,7 +33,7 @@ public class TaskDto { */ private Boolean enable; - public TaskDto() { + public TaskJob() { } diff --git a/src/main/java/com/laker/admin/module/task/core/impl/MysqlTaskStore.java b/src/main/java/com/laker/admin/module/task/core/impl/MysqlTaskStore.java deleted file mode 100644 index c470143..0000000 --- a/src/main/java/com/laker/admin/module/task/core/impl/MysqlTaskStore.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.laker.admin.module.task.core.impl; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.laker.admin.module.enums.TaskStateEnum; -import com.laker.admin.module.task.core.ITaskStore; -import com.laker.admin.module.task.core.TaskDto; -import com.laker.admin.module.task.entity.SysTask; -import com.laker.admin.module.task.service.ISysTaskService; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.stream.Collectors; - -@Component -public class MysqlTaskStore implements ITaskStore { - - @Autowired - ISysTaskService taskService; - - @Override - public void saveTask(TaskDto taskDto) { - SysTask task = new SysTask(); - task.setEnable(true); - - BeanUtils.copyProperties(taskDto, task); - try { - int count = taskService.count(Wrappers.lambdaQuery().eq(SysTask::getTaskCode, taskDto.getTaskCode())); - if (count == 0) { - task.setTaskState(TaskStateEnum.START); - taskService.save(task); - } - } finally { - - } - } - - - @Override - public TaskDto findByTaskCode(String taskCode) { - SysTask task = taskService.getOne(Wrappers.lambdaQuery().eq(SysTask::getTaskCode, taskCode)); - TaskDto taskDto = new TaskDto(); - BeanUtils.copyProperties(task, taskDto); - return taskDto; - } - - -} diff --git a/src/main/java/com/laker/admin/module/task/core/listener/JobListener.java b/src/main/java/com/laker/admin/module/task/core/listener/JobListener.java new file mode 100644 index 0000000..d84f64d --- /dev/null +++ b/src/main/java/com/laker/admin/module/task/core/listener/JobListener.java @@ -0,0 +1,12 @@ +package com.laker.admin.module.task.core.listener; + +import com.laker.admin.module.task.core.TaskJob; + +public interface JobListener { + void start(TaskJob taskJob); + + void exception(TaskJob taskJob, Exception e); + + void end(TaskJob taskJob); + +} diff --git a/src/main/java/com/laker/admin/module/task/core/impl/LogCallBack.java b/src/main/java/com/laker/admin/module/task/core/listener/LogJobListener.java similarity index 53% rename from src/main/java/com/laker/admin/module/task/core/impl/LogCallBack.java rename to src/main/java/com/laker/admin/module/task/core/listener/LogJobListener.java index 3176347..c54a831 100644 --- a/src/main/java/com/laker/admin/module/task/core/impl/LogCallBack.java +++ b/src/main/java/com/laker/admin/module/task/core/listener/LogJobListener.java @@ -1,9 +1,8 @@ -package com.laker.admin.module.task.core.impl; +package com.laker.admin.module.task.core.listener; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.thread.ThreadUtil; -import com.laker.admin.module.task.core.ICallBack; -import com.laker.admin.module.task.core.TaskDto; +import com.laker.admin.module.task.core.TaskJob; import com.laker.admin.module.task.entity.SysTasklog; import com.laker.admin.module.task.service.ISysTasklogService; import lombok.extern.slf4j.Slf4j; @@ -12,41 +11,46 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; +/** + * @author laker + */ @Component @Slf4j -public class LogCallBack implements ICallBack { +public class LogJobListener implements JobListener { ThreadLocal threadLocal = ThreadUtil.createThreadLocal(true); @Autowired ISysTasklogService sysTasklogService; @Override - public void start(TaskDto taskDto) { - + public void start(TaskJob taskJob) { SysTasklog tasklog = new SysTasklog(); tasklog.setStartTime(LocalDateTime.now()); - tasklog.setTaskCode(taskDto.getTaskCode()); + tasklog.setTaskCode(taskJob.getTaskCode()); tasklog.setStatus(1); tasklog.setThreadName(Thread.currentThread().getName()); sysTasklogService.save(tasklog); threadLocal.set(tasklog); - log.info("start " + taskDto.getTaskCode() + " " + taskDto.getTaskName()); + log.debug("start taskCode: {},taskName:{}", taskJob.getTaskCode(), taskJob.getTaskName()); } @Override - public void exception(TaskDto taskDto, Exception e) { + public void exception(TaskJob taskJob, Exception e) { SysTasklog tasklog = threadLocal.get(); tasklog.setStatus(2); sysTasklogService.updateById(tasklog); - log.error(taskDto.toString(), e); + log.error(taskJob.toString(), e); } @Override - public void end(TaskDto taskDto) { + public void end(TaskJob taskJob) { SysTasklog tasklog = threadLocal.get(); - tasklog.setEndTime(LocalDateTime.now()); - tasklog.setCost((int) LocalDateTimeUtil.between(tasklog.getStartTime(), tasklog.getEndTime()).toMillis()); - sysTasklogService.updateById(tasklog); - threadLocal.remove(); - log.info("end " + taskDto.getTaskCode() + " " + taskDto.getTaskName()); + try { + tasklog.setEndTime(LocalDateTime.now()); + tasklog.setCost((int) LocalDateTimeUtil.between(tasklog.getStartTime(), tasklog.getEndTime()).toMillis()); + sysTasklogService.updateById(tasklog); + } finally { + threadLocal.remove(); + log.debug("end taskCode: {},taskName:{}", taskJob.getTaskCode(), taskJob.getTaskName()); + } } } diff --git a/src/main/java/com/laker/admin/module/task/core/CoreProcessor.java b/src/main/java/com/laker/admin/module/task/core/processor/EasyTaskProcessor.java similarity index 62% rename from src/main/java/com/laker/admin/module/task/core/CoreProcessor.java rename to src/main/java/com/laker/admin/module/task/core/processor/EasyTaskProcessor.java index fd1c802..69d02c0 100644 --- a/src/main/java/com/laker/admin/module/task/core/CoreProcessor.java +++ b/src/main/java/com/laker/admin/module/task/core/processor/EasyTaskProcessor.java @@ -1,37 +1,38 @@ -package com.laker.admin.module.task.core; +package com.laker.admin.module.task.core.processor; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.CacheObj; import cn.hutool.cache.impl.LFUCache; -import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.laker.admin.framework.EasyAdminConstants; import com.laker.admin.framework.utils.SpringUtils; import com.laker.admin.module.enums.TaskStateEnum; +import com.laker.admin.module.task.core.IJob; +import com.laker.admin.module.task.core.TaskJob; +import com.laker.admin.module.task.core.listener.JobListener; +import com.laker.admin.module.task.core.taskstore.ITaskStore; import com.laker.admin.module.task.entity.SysTask; import com.laker.admin.module.task.service.ISysTaskService; import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.context.ApplicationContext; -import org.springframework.core.annotation.AnnotationUtils; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +/** + * @author laker + */ @Component @Slf4j -public class CoreProcessor implements CommandLineRunner { +public class EasyTaskProcessor { - @Autowired - ApplicationContext applicationContext; @Autowired private ThreadPoolTaskScheduler threadPoolTaskScheduler; @@ -40,7 +41,7 @@ public class CoreProcessor implements CommandLineRunner { private ITaskStore taskStore; @Autowired - private List callBacks; + private List callBacks; @Autowired private ISysTaskService sysTaskService; @@ -51,49 +52,26 @@ public class CoreProcessor implements CommandLineRunner { private final static LFUCache JVM_RUNNING_TASK = CacheUtil.newLFUCache(1000, TimeUnit.DAYS.toMillis(3)); - @Override - public void run(String... args) throws Exception { - // 获取所有实现了IJob接口的类 - Map beansOfType = applicationContext.getBeansOfType(IJob.class); - if (MapUtil.isEmpty(beansOfType)) { - log.warn("未查询到IJob实现类"); - return; - } - // 遍历加入到任务执行器中 - beansOfType.forEach((s, job) -> { - Job annotation = AnnotationUtils.findAnnotation(job.getClass(), Job.class); - if (annotation != null) { - String cron = annotation.cron(); - String taskName = annotation.taskName(); - String taskCode = annotation.taskCode(); - TaskDto taskDto = TaskDto.builder() - .taskCode(taskCode) - .taskName(taskName) - .taskCron(cron) - .taskClassName(job.getClass().getName()).build(); - taskStore.saveTask(taskDto); - TaskDto storeTask = taskStore.findByTaskCode(taskCode); - if (storeTask.getEnable() && storeTask.getTaskState().equals(TaskStateEnum.START)) { - this.startJVMJob(storeTask, null); - } - } - }); - } - /** * 将任务加入到JVM执行器中 * * @return */ - private void startJVMJob(TaskDto task, Map param) { + private void startJVMJob(TaskJob task, Map param) { String taskCron = task.getTaskCron(); // TODO taskCron CHECK if (StrUtil.isNotBlank(taskCron) && !StrUtil.equals(taskCron, "-")) { ScheduledFuture future = threadPoolTaskScheduler .schedule(() -> { try { - callBacks.forEach(iCallBack -> { - iCallBack.start(task); + String traceId = MDC.get(EasyAdminConstants.TRACE_ID); + if (StrUtil.isBlank(traceId)) { + traceId = IdUtil.simpleUUID(); + } + MDC.put(EasyAdminConstants.TRACE_ID, traceId); + + callBacks.forEach(jobListener -> { + jobListener.start(task); }); String taskClassName = task.getTaskClassName(); Map beansOfType = SpringUtils.getBeansOfType(IJob.class); @@ -105,13 +83,14 @@ public class CoreProcessor implements CommandLineRunner { } } catch (Exception e) { - callBacks.forEach(iCallBack -> { - iCallBack.exception(task, e); + callBacks.forEach(jobListener -> { + jobListener.exception(task, e); }); } finally { - callBacks.forEach(iCallBack -> { - iCallBack.end(task); + callBacks.forEach(jobListener -> { + jobListener.end(task); }); + MDC.clear(); } }, new CronTrigger(taskCron)); @@ -129,7 +108,7 @@ public class CoreProcessor implements CommandLineRunner { JVM_RUNNING_TASK.remove(taskCode); } - public List jvmTaskList() { + public List runningTaskList() { List res = new ArrayList(); Iterator> cacheObjIterator = JVM_RUNNING_TASK.cacheObjIterator(); while (cacheObjIterator.hasNext()) { @@ -141,12 +120,20 @@ public class CoreProcessor implements CommandLineRunner { return res; } + public void init(TaskJob taskJob) { + taskStore.storeTask(taskJob); + TaskJob storeTask = taskStore.findByTaskCode(taskJob.getTaskCode()); + if (storeTask.getEnable() && storeTask.getTaskState().equals(TaskStateEnum.START)) { + this.startJVMJob(storeTask, new HashMap()); + } + } + public synchronized void startJob(String taskCode) { - TaskDto taskDto = taskStore.findByTaskCode(taskCode); - if (taskDto.getEnable()) { + TaskJob taskJob = taskStore.findByTaskCode(taskCode); + if (taskJob.getEnable()) { removeJvmTask(taskCode); - startJVMJob(taskDto, null); + startJVMJob(taskJob, null); sysTaskService.update(Wrappers.lambdaUpdate().set(SysTask::getTaskState, TaskStateEnum.START).eq(SysTask::getTaskCode, taskCode)); } @@ -158,5 +145,4 @@ public class CoreProcessor implements CommandLineRunner { sysTaskService.update(Wrappers.lambdaUpdate().set(SysTask::getTaskState, TaskStateEnum.STOP).eq(SysTask::getTaskCode, taskCode)); } - } diff --git a/src/main/java/com/laker/admin/module/task/core/runner/EasyTaskCommandLineRunner.java b/src/main/java/com/laker/admin/module/task/core/runner/EasyTaskCommandLineRunner.java new file mode 100644 index 0000000..edc98a0 --- /dev/null +++ b/src/main/java/com/laker/admin/module/task/core/runner/EasyTaskCommandLineRunner.java @@ -0,0 +1,54 @@ +package com.laker.admin.module.task.core.runner; + +import cn.hutool.core.map.MapUtil; +import com.laker.admin.module.task.core.EasyJob; +import com.laker.admin.module.task.core.IJob; +import com.laker.admin.module.task.core.TaskJob; +import com.laker.admin.module.task.core.processor.EasyTaskProcessor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author laker + */ +@Component +@Slf4j +public class EasyTaskCommandLineRunner implements CommandLineRunner { + + @Autowired + ApplicationContext applicationContext; + + @Autowired + private EasyTaskProcessor easyTaskProcessor; + + @Override + public void run(String... args) throws Exception { + // 获取所有实现了IJob接口的类 + Map beansOfType = applicationContext.getBeansOfType(IJob.class); + if (MapUtil.isEmpty(beansOfType)) { + log.warn("未查询到IJob实现类"); + return; + } + // 遍历加入到任务执行器中 + beansOfType.forEach((s, job) -> { + EasyJob annotation = AnnotationUtils.findAnnotation(job.getClass(), EasyJob.class); + if (annotation != null) { + String cron = annotation.cron(); + String taskName = annotation.taskName(); + String taskCode = annotation.taskCode(); + TaskJob taskJob = TaskJob.builder() + .taskCode(taskCode) + .taskName(taskName) + .taskCron(cron) + .taskClassName(job.getClass().getName()).build(); + easyTaskProcessor.init(taskJob); + } + }); + } +} diff --git a/src/main/java/com/laker/admin/module/task/core/taskstore/ITaskStore.java b/src/main/java/com/laker/admin/module/task/core/taskstore/ITaskStore.java new file mode 100644 index 0000000..3a5276d --- /dev/null +++ b/src/main/java/com/laker/admin/module/task/core/taskstore/ITaskStore.java @@ -0,0 +1,12 @@ +package com.laker.admin.module.task.core.taskstore; + +import com.laker.admin.module.task.core.TaskJob; + +public interface ITaskStore { + + void storeTask(TaskJob taskJob); + + + TaskJob findByTaskCode(String taskCode); + +} diff --git a/src/main/java/com/laker/admin/module/task/core/taskstore/MysqlTaskStore.java b/src/main/java/com/laker/admin/module/task/core/taskstore/MysqlTaskStore.java new file mode 100644 index 0000000..4d46e3c --- /dev/null +++ b/src/main/java/com/laker/admin/module/task/core/taskstore/MysqlTaskStore.java @@ -0,0 +1,47 @@ +package com.laker.admin.module.task.core.taskstore; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.laker.admin.module.enums.TaskStateEnum; +import com.laker.admin.module.task.core.TaskJob; +import com.laker.admin.module.task.entity.SysTask; +import com.laker.admin.module.task.service.ISysTaskService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +public class MysqlTaskStore implements ITaskStore { + + @Autowired + ISysTaskService taskService; + + @Override + public void storeTask(TaskJob taskJob) { + SysTask task = new SysTask(); + BeanUtils.copyProperties(taskJob, task); + int count = taskService.count(Wrappers.lambdaQuery().eq(SysTask::getTaskCode, taskJob.getTaskCode())); + if (count == 0) { + task.setEnable(true); + if (StrUtil.equals(task.getTaskCron(), "-")) { + task.setEnable(false); + } + task.setCreateTime(LocalDateTime.now()); + task.setTaskState(TaskStateEnum.START); + taskService.save(task); + } + } + + + @Override + public TaskJob findByTaskCode(String taskCode) { + SysTask task = taskService.getOne(Wrappers.lambdaQuery().eq(SysTask::getTaskCode, taskCode)); + TaskJob taskJob = new TaskJob(); + BeanUtils.copyProperties(task, taskJob); + return taskJob; + } + + +} diff --git a/src/main/java/com/laker/admin/module/task/core/impl/Test2Job.java b/src/main/java/com/laker/admin/module/task/job/Test2Job.java similarity index 61% rename from src/main/java/com/laker/admin/module/task/core/impl/Test2Job.java rename to src/main/java/com/laker/admin/module/task/job/Test2Job.java index 3f12922..0287497 100644 --- a/src/main/java/com/laker/admin/module/task/core/impl/Test2Job.java +++ b/src/main/java/com/laker/admin/module/task/job/Test2Job.java @@ -1,18 +1,18 @@ -package com.laker.admin.module.task.core.impl; +package com.laker.admin.module.task.job; +import com.laker.admin.module.task.core.EasyJob; import com.laker.admin.module.task.core.IJob; -import com.laker.admin.module.task.core.Job; import lombok.extern.slf4j.Slf4j; import java.util.Map; import java.util.concurrent.TimeUnit; -@Job(taskCode = "job2", taskName = "laker测试任务") +@EasyJob(taskCode = "job2", taskName = "laker测试任务") @Slf4j public class Test2Job implements IJob { @Override public void execute(Map map) throws Exception { - log.info("laker job run"); + log.info("laker job2 run"); TimeUnit.SECONDS.sleep(10); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/module/task/core/impl/TestJob.java b/src/main/java/com/laker/admin/module/task/job/TestJob.java similarity index 51% rename from src/main/java/com/laker/admin/module/task/core/impl/TestJob.java rename to src/main/java/com/laker/admin/module/task/job/TestJob.java index e0abe1f..860e4c1 100644 --- a/src/main/java/com/laker/admin/module/task/core/impl/TestJob.java +++ b/src/main/java/com/laker/admin/module/task/job/TestJob.java @@ -1,18 +1,18 @@ -package com.laker.admin.module.task.core.impl; +package com.laker.admin.module.task.job; import com.laker.admin.module.task.core.IJob; -import com.laker.admin.module.task.core.Job; +import com.laker.admin.module.task.core.EasyJob; import lombok.extern.slf4j.Slf4j; import java.util.Map; import java.util.concurrent.TimeUnit; -@Job(taskCode = "job1", taskName = "laker测试任务") +@EasyJob(taskCode = "job1", cron = "1/3 * * * * ?", taskName = "laker测试任务") @Slf4j public class TestJob implements IJob { @Override public void execute(Map map) throws Exception { - log.info("laker job run"); - TimeUnit.SECONDS.sleep(10); + log.info("laker job1 run"); + TimeUnit.SECONDS.sleep(1); } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/utils/TreeUtil.java b/src/main/java/com/laker/admin/utils/EasyTreeUtil.java similarity index 94% rename from src/main/java/com/laker/admin/utils/TreeUtil.java rename to src/main/java/com/laker/admin/utils/EasyTreeUtil.java index fc00f45..c27561b 100644 --- a/src/main/java/com/laker/admin/utils/TreeUtil.java +++ b/src/main/java/com/laker/admin/utils/EasyTreeUtil.java @@ -5,7 +5,10 @@ import com.laker.admin.module.sys.pojo.MenuVo; import java.util.ArrayList; import java.util.List; -public class TreeUtil { +/** + * @author laker + */ +public class EasyTreeUtil { public static List toTree(List treeList, Long pid) { List retList = new ArrayList(); @@ -27,4 +30,4 @@ public class TreeUtil { } return parent; } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/utils/IP2CityUtil.java b/src/main/java/com/laker/admin/utils/IP2CityUtil.java index 515a956..24b27eb 100644 --- a/src/main/java/com/laker/admin/utils/IP2CityUtil.java +++ b/src/main/java/com/laker/admin/utils/IP2CityUtil.java @@ -9,6 +9,9 @@ import org.springframework.core.io.ClassPathResource; import java.io.InputStream; +/** + * @author laker + */ @Slf4j public class IP2CityUtil { public static String getCityInfo(String ip) { @@ -20,8 +23,8 @@ public class IP2CityUtil { DataBlock dataBlock = searcher.memorySearch(ip); return dataBlock.getRegion(); } catch (Exception e) { - log.error("", e); + log.error("getCityInfo error.", e); } return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/laker/admin/utils/http/HttpServletRequestUtil.java b/src/main/java/com/laker/admin/utils/http/EasyRequestUtil.java similarity index 92% rename from src/main/java/com/laker/admin/utils/http/HttpServletRequestUtil.java rename to src/main/java/com/laker/admin/utils/http/EasyRequestUtil.java index 26334ab..bb9fd4a 100644 --- a/src/main/java/com/laker/admin/utils/http/HttpServletRequestUtil.java +++ b/src/main/java/com/laker/admin/utils/http/EasyRequestUtil.java @@ -17,9 +17,11 @@ import java.util.*; /** * request 工具类 + * + * @author laker */ @Slf4j -public class HttpServletRequestUtil { +public class EasyRequestUtil { /** * 获取request对象 @@ -27,9 +29,7 @@ public class HttpServletRequestUtil { * @return */ public static HttpServletRequest getRequest() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - return request; - + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } /** @@ -130,11 +130,12 @@ public class HttpServletRequestUtil { public static String getAllRequestInfo() { StringBuilder sb = new StringBuilder(); - sb.append("请求详情为:").append(StrUtil.CRLF); + sb.append("Detail").append(StrUtil.CRLF); sb.append("RemoteAddress: ").append(getRemoteIP()).append(StrUtil.CRLF); sb.append("Method: ").append(getRequest().getMethod()).append(StrUtil.CRLF); - sb.append("URI: ").append(getRequestURI()).append(StrUtil.CRLF); - sb.append("Headers: ").append(StrUtil.join(StrUtil.CRLF + " ", mapToList(getHeaders()))).append(StrUtil.CRLF); + sb.append("Uri: ").append(getRequestURI()).append(StrUtil.CRLF); + sb.append("Headers: ").append(StrUtil.join(StrUtil.CRLF + " ", + mapToList(getHeaders()))).append(StrUtil.CRLF); sb.append("Body: ").append(getBody()).append(StrUtil.CRLF); return sb.toString(); } @@ -146,4 +147,4 @@ public class HttpServletRequestUtil { }); return parametersList; } -} \ No newline at end of file +} diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 8480ed3..e32df4b 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -21,6 +21,11 @@ spring: password: timeout: 30s lock: + # redis/mysql type: mysql ratelimit: + # redis/local + type: local +cache: + # redis/local type: local diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml index 61804b8..853523f 100644 --- a/src/main/resources/application-prod.yaml +++ b/src/main/resources/application-prod.yaml @@ -10,10 +10,6 @@ spring: port: 6379 password: timeout: 30s -lock: - type: mysql -ratelimit: - type: local knife4j: # 是否生产环境 屏蔽所有资源接口 production: true @@ -22,3 +18,13 @@ management: health: # 生成环境的话注意安全问题 show-details: never +lock: + # redis/mysql + type: mysql +ratelimit: + # redis/local + type: redis +cache: + # redis/local + type: redis + diff --git a/web/admin/index.html b/web/admin/index.html index 3641ee7..4ec9b81 100644 --- a/web/admin/index.html +++ b/web/admin/index.html @@ -104,7 +104,7 @@ // 获取用户信息,用户名、昵称、头像等 easyAdmin.http({ - url: "/api/v1/userInfo", + url: "/sys/auth/v1/userInfo", dataType: 'json', success: function (data) { admin.setAvatar(data.data.avatar, data.data.nickName); @@ -133,7 +133,7 @@ // 登出逻辑 admin.logout(function () { - easyAdmin.httpGet("/api/v1/loginOut"); + easyAdmin.httpGet("/sys/auth/v1/logout"); popup.success("注销成功", function () { diff --git a/web/admin/login.html b/web/admin/login.html index 922203a..ede596f 100644 --- a/web/admin/login.html +++ b/web/admin/login.html @@ -75,7 +75,7 @@ /// 登录 data.field.uid = uid; easyAdmin.http({ - url: '/api/v1/login', + url: '/sys/auth/v1/login', sendToken: false, data: JSON.stringify(data.field), dataType: 'json', diff --git a/web/admin/view/system/onlineUser.html b/web/admin/view/system/onlineUser.html index ba1ef76..8c72a91 100644 --- a/web/admin/view/system/onlineUser.html +++ b/web/admin/view/system/onlineUser.html @@ -102,14 +102,14 @@ let module = "log"; easyAdmin.tableRender({ - url: "/api/v1/onlineUsers", + url: "/sys/auth/v1/onlineUsers", cols: cols, toolbar: null, defaultToolbar: null }); table.on('tool(table-filter)', function (obj) { if (obj.event === 'kick') { - easyAdmin.httpGet("/api/v1/kickOffline?token=" + obj.data.tokenValue, function (result) { + easyAdmin.httpGet("/sys/auth/v1/kickOffline?token=" + obj.data.tokenValue, function (result) { if (result.success) { layer.msg("踢人成功", { icon: 1, diff --git a/web/admin/view/system/role/power.html b/web/admin/view/system/role/power.html index f83f5df..0c62597 100644 --- a/web/admin/view/system/role/power.html +++ b/web/admin/view/system/role/power.html @@ -37,6 +37,7 @@ let easyAdmin = layui.easyAdmin; // 根据menuId获取详情,用于数据回显 var roleId = easyAdmin.getQueryString("roleId"); + easyAdmin.httpGet("/sys/role/getRolePower?roleId=" + roleId, function (result) { dtree.render({ elem: "#role-power", @@ -84,4 +85,4 @@ }) - \ No newline at end of file + diff --git a/web/admin/view/system/user/center.html b/web/admin/view/system/user/center.html index 5083982..b147d18 100644 --- a/web/admin/view/system/user/center.html +++ b/web/admin/view/system/user/center.html @@ -113,7 +113,7 @@ let easyAdmin = layui.easyAdmin; // 获取用户信息,用户名、昵称、头像等 easyAdmin.http({ - url: "/api/v1/userInfo", + url: "/sys/auth/v1/userInfo", dataType: 'json', success: function (result) { $("#avatar").attr("src", result.data.avatar || "../../../admin/images/avatar.jpg");