diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java new file mode 100644 index 0000000..3cb69eb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.config.PoolConfig; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; +import com.casic.missiles.modular.system.util.ExcelUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + *

+ * 测试链接记录 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + @Autowired + private PoolConfig threadPoolTaskExecutor; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String url) { + + String result = LinkTestUtil.testUrl(url); + return this.save(new BusinessConnectTestrecord(result.split(","))); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List urls) { + List> listList = ListUtils.partition(urls, 50); + listList.forEach(list -> { + threadPoolTaskExecutor.taskExecutor().execute(new Runnable() { + @Override + public void run() { + list.forEach(s -> { + String result = LinkTestUtil.testUrl(s); + save(new BusinessConnectTestrecord(result.split(","))); + }); + } + }); + }); + return true; + } + + @Override + public List parseSourceFile(MultipartFile file) { + List stringList = new ArrayList<>(); + try { + + File Filefile = new File(downloadPath + file.getOriginalFilename()); + file.transferTo(Filefile); + FileInputStream inputStream = new FileInputStream(Filefile); + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + List rows = list.get(i); + stringList.add(rows.get(0) + ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java new file mode 100644 index 0000000..3cb69eb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.config.PoolConfig; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; +import com.casic.missiles.modular.system.util.ExcelUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + *

+ * 测试链接记录 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + @Autowired + private PoolConfig threadPoolTaskExecutor; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String url) { + + String result = LinkTestUtil.testUrl(url); + return this.save(new BusinessConnectTestrecord(result.split(","))); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List urls) { + List> listList = ListUtils.partition(urls, 50); + listList.forEach(list -> { + threadPoolTaskExecutor.taskExecutor().execute(new Runnable() { + @Override + public void run() { + list.forEach(s -> { + String result = LinkTestUtil.testUrl(s); + save(new BusinessConnectTestrecord(result.split(","))); + }); + } + }); + }); + return true; + } + + @Override + public List parseSourceFile(MultipartFile file) { + List stringList = new ArrayList<>(); + try { + + File Filefile = new File(downloadPath + file.getOriginalFilename()); + file.transferTo(Filefile); + FileInputStream inputStream = new FileInputStream(Filefile); + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + List rows = list.get(i); + stringList.add(rows.get(0) + ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java new file mode 100644 index 0000000..dbde4a4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.ssl; + +import cn.hutool.core.date.DateUtil; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import java.net.InetAddress; +import java.net.URL; +import java.util.Date; + +public class LinkTestUtil { + + public static String testUrl(String url) { + long startMill = System.currentTimeMillis(); + long endMill; + String testTime = DateUtil.formatDateTime(new Date()); + try { + if (url.indexOf("https") == 0 || url.indexOf("HTTPS") == 0) { + + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL serverUrl = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); + conn.setSSLSocketFactory(sslcontext.getSocketFactory()); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-type", "application/json"); + //必须设置false,否则会自动redirect到重定向后的地址 + conn.setInstanceFollowRedirects(false); + conn.connect(); + int result = conn.getResponseCode(); + endMill = System.currentTimeMillis(); + conn.disconnect(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:" + result + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + "," + result + "," + testTime; + + } + + + InetAddress.getByName(url).isReachable(2000); //Replace with your name +// URL url1=new URL("url"); +// url1.openConnection(); + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:200" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",200," + testTime; + + } catch (Exception e) { + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:404" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",404," + testTime; + } + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java new file mode 100644 index 0000000..3cb69eb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.config.PoolConfig; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; +import com.casic.missiles.modular.system.util.ExcelUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + *

+ * 测试链接记录 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + @Autowired + private PoolConfig threadPoolTaskExecutor; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String url) { + + String result = LinkTestUtil.testUrl(url); + return this.save(new BusinessConnectTestrecord(result.split(","))); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List urls) { + List> listList = ListUtils.partition(urls, 50); + listList.forEach(list -> { + threadPoolTaskExecutor.taskExecutor().execute(new Runnable() { + @Override + public void run() { + list.forEach(s -> { + String result = LinkTestUtil.testUrl(s); + save(new BusinessConnectTestrecord(result.split(","))); + }); + } + }); + }); + return true; + } + + @Override + public List parseSourceFile(MultipartFile file) { + List stringList = new ArrayList<>(); + try { + + File Filefile = new File(downloadPath + file.getOriginalFilename()); + file.transferTo(Filefile); + FileInputStream inputStream = new FileInputStream(Filefile); + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + List rows = list.get(i); + stringList.add(rows.get(0) + ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java new file mode 100644 index 0000000..dbde4a4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.ssl; + +import cn.hutool.core.date.DateUtil; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import java.net.InetAddress; +import java.net.URL; +import java.util.Date; + +public class LinkTestUtil { + + public static String testUrl(String url) { + long startMill = System.currentTimeMillis(); + long endMill; + String testTime = DateUtil.formatDateTime(new Date()); + try { + if (url.indexOf("https") == 0 || url.indexOf("HTTPS") == 0) { + + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL serverUrl = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); + conn.setSSLSocketFactory(sslcontext.getSocketFactory()); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-type", "application/json"); + //必须设置false,否则会自动redirect到重定向后的地址 + conn.setInstanceFollowRedirects(false); + conn.connect(); + int result = conn.getResponseCode(); + endMill = System.currentTimeMillis(); + conn.disconnect(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:" + result + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + "," + result + "," + testTime; + + } + + + InetAddress.getByName(url).isReachable(2000); //Replace with your name +// URL url1=new URL("url"); +// url1.openConnection(); + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:200" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",200," + testTime; + + } catch (Exception e) { + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:404" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",404," + testTime; + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java new file mode 100644 index 0000000..d2e8484 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.ssl; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] ax509certificate,String s) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java new file mode 100644 index 0000000..3cb69eb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.config.PoolConfig; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; +import com.casic.missiles.modular.system.util.ExcelUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + *

+ * 测试链接记录 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + @Autowired + private PoolConfig threadPoolTaskExecutor; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String url) { + + String result = LinkTestUtil.testUrl(url); + return this.save(new BusinessConnectTestrecord(result.split(","))); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List urls) { + List> listList = ListUtils.partition(urls, 50); + listList.forEach(list -> { + threadPoolTaskExecutor.taskExecutor().execute(new Runnable() { + @Override + public void run() { + list.forEach(s -> { + String result = LinkTestUtil.testUrl(s); + save(new BusinessConnectTestrecord(result.split(","))); + }); + } + }); + }); + return true; + } + + @Override + public List parseSourceFile(MultipartFile file) { + List stringList = new ArrayList<>(); + try { + + File Filefile = new File(downloadPath + file.getOriginalFilename()); + file.transferTo(Filefile); + FileInputStream inputStream = new FileInputStream(Filefile); + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + List rows = list.get(i); + stringList.add(rows.get(0) + ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java new file mode 100644 index 0000000..dbde4a4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.ssl; + +import cn.hutool.core.date.DateUtil; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import java.net.InetAddress; +import java.net.URL; +import java.util.Date; + +public class LinkTestUtil { + + public static String testUrl(String url) { + long startMill = System.currentTimeMillis(); + long endMill; + String testTime = DateUtil.formatDateTime(new Date()); + try { + if (url.indexOf("https") == 0 || url.indexOf("HTTPS") == 0) { + + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL serverUrl = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); + conn.setSSLSocketFactory(sslcontext.getSocketFactory()); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-type", "application/json"); + //必须设置false,否则会自动redirect到重定向后的地址 + conn.setInstanceFollowRedirects(false); + conn.connect(); + int result = conn.getResponseCode(); + endMill = System.currentTimeMillis(); + conn.disconnect(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:" + result + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + "," + result + "," + testTime; + + } + + + InetAddress.getByName(url).isReachable(2000); //Replace with your name +// URL url1=new URL("url"); +// url1.openConnection(); + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:200" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",200," + testTime; + + } catch (Exception e) { + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:404" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",404," + testTime; + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java new file mode 100644 index 0000000..d2e8484 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.ssl; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] ax509certificate,String s) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java new file mode 100644 index 0000000..03942c8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,135 @@ +package com.casic.missiles.modular.system.util; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ExcelUtils { + private final static String excel2003L =".xls"; //2003- 版本的excel + private final static String excel2007U =".xlsx"; //2007版本 + + /** + * @Description:获取IO流中的数据,组装成List>对象 + * @param in,fileName + * @return + * @throws + */ + public static List> getListByExcel(InputStream in, String fileName) throws Exception{ + List> list = null; + + //创建Excel工作薄 + Workbook work = getWorkbook(in,fileName); + if(null == work){ + throw new Exception("创建Excel工作薄为空!"); + } + Sheet sheet = null; //页数 + Row row = null; //行数 + Cell cell = null; //列数 + + list = new ArrayList>(); + //遍历Excel中所有的sheet + for (int i = 0; i < work.getNumberOfSheets(); i++) { + sheet = work.getSheetAt(i); + if(sheet==null){continue;} + + //遍历当前sheet中的所有行 + for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) { + row = sheet.getRow(j); + if(row==null){continue;} + + //遍历所有的列 + List li = new ArrayList(); + for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { + cell = row.getCell(y); + li.add(getValue(cell)); + } + list.add(li); + } + } + + return list; + + } + + /** + * @Description:根据文件后缀,自适应上传文件的版本 + * @param inStr,fileName + * @return + * @throws Exception + */ + public static Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ + Workbook wb = null; + String fileType = fileName.substring(fileName.lastIndexOf(".")); + if(excel2003L.equals(fileType)){ + wb = new HSSFWorkbook(inStr); //2003- + }else if(excel2007U.equals(fileType)){ + wb = new XSSFWorkbook(inStr); //2007+ + }else{ + throw new Exception("解析的文件格式有误!"); + } + return wb; + } + + /** + * @Description:对表格中数值进行格式化 + * @param cell + * @return + */ + //解决excel类型问题,获得数值 + public static String getValue(Cell cell) { + String value = ""; + if(null==cell){ + return value; + } + switch (cell.getCellType()) { + //数值型 + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + //如果是date类型则 ,获取该cell的date值 + Date date = DateUtil.getJavaDate(cell.getNumericCellValue()); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + value = format.format(date);; + }else {// 纯数字 + BigDecimal big=new BigDecimal(cell.getNumericCellValue()); + value = big.toString(); + //解决1234.0 去掉后面的.0 + if(null!=value&&!"".equals(value.trim())){ + String[] item = value.split("[.]"); + if(1${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java new file mode 100644 index 0000000..3cb69eb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.config.PoolConfig; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; +import com.casic.missiles.modular.system.util.ExcelUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + *

+ * 测试链接记录 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + @Autowired + private PoolConfig threadPoolTaskExecutor; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String url) { + + String result = LinkTestUtil.testUrl(url); + return this.save(new BusinessConnectTestrecord(result.split(","))); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List urls) { + List> listList = ListUtils.partition(urls, 50); + listList.forEach(list -> { + threadPoolTaskExecutor.taskExecutor().execute(new Runnable() { + @Override + public void run() { + list.forEach(s -> { + String result = LinkTestUtil.testUrl(s); + save(new BusinessConnectTestrecord(result.split(","))); + }); + } + }); + }); + return true; + } + + @Override + public List parseSourceFile(MultipartFile file) { + List stringList = new ArrayList<>(); + try { + + File Filefile = new File(downloadPath + file.getOriginalFilename()); + file.transferTo(Filefile); + FileInputStream inputStream = new FileInputStream(Filefile); + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + List rows = list.get(i); + stringList.add(rows.get(0) + ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java new file mode 100644 index 0000000..dbde4a4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.ssl; + +import cn.hutool.core.date.DateUtil; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import java.net.InetAddress; +import java.net.URL; +import java.util.Date; + +public class LinkTestUtil { + + public static String testUrl(String url) { + long startMill = System.currentTimeMillis(); + long endMill; + String testTime = DateUtil.formatDateTime(new Date()); + try { + if (url.indexOf("https") == 0 || url.indexOf("HTTPS") == 0) { + + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL serverUrl = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); + conn.setSSLSocketFactory(sslcontext.getSocketFactory()); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-type", "application/json"); + //必须设置false,否则会自动redirect到重定向后的地址 + conn.setInstanceFollowRedirects(false); + conn.connect(); + int result = conn.getResponseCode(); + endMill = System.currentTimeMillis(); + conn.disconnect(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:" + result + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + "," + result + "," + testTime; + + } + + + InetAddress.getByName(url).isReachable(2000); //Replace with your name +// URL url1=new URL("url"); +// url1.openConnection(); + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:200" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",200," + testTime; + + } catch (Exception e) { + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:404" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",404," + testTime; + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java new file mode 100644 index 0000000..d2e8484 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.ssl; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] ax509certificate,String s) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java new file mode 100644 index 0000000..03942c8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,135 @@ +package com.casic.missiles.modular.system.util; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ExcelUtils { + private final static String excel2003L =".xls"; //2003- 版本的excel + private final static String excel2007U =".xlsx"; //2007版本 + + /** + * @Description:获取IO流中的数据,组装成List>对象 + * @param in,fileName + * @return + * @throws + */ + public static List> getListByExcel(InputStream in, String fileName) throws Exception{ + List> list = null; + + //创建Excel工作薄 + Workbook work = getWorkbook(in,fileName); + if(null == work){ + throw new Exception("创建Excel工作薄为空!"); + } + Sheet sheet = null; //页数 + Row row = null; //行数 + Cell cell = null; //列数 + + list = new ArrayList>(); + //遍历Excel中所有的sheet + for (int i = 0; i < work.getNumberOfSheets(); i++) { + sheet = work.getSheetAt(i); + if(sheet==null){continue;} + + //遍历当前sheet中的所有行 + for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) { + row = sheet.getRow(j); + if(row==null){continue;} + + //遍历所有的列 + List li = new ArrayList(); + for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { + cell = row.getCell(y); + li.add(getValue(cell)); + } + list.add(li); + } + } + + return list; + + } + + /** + * @Description:根据文件后缀,自适应上传文件的版本 + * @param inStr,fileName + * @return + * @throws Exception + */ + public static Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ + Workbook wb = null; + String fileType = fileName.substring(fileName.lastIndexOf(".")); + if(excel2003L.equals(fileType)){ + wb = new HSSFWorkbook(inStr); //2003- + }else if(excel2007U.equals(fileType)){ + wb = new XSSFWorkbook(inStr); //2007+ + }else{ + throw new Exception("解析的文件格式有误!"); + } + return wb; + } + + /** + * @Description:对表格中数值进行格式化 + * @param cell + * @return + */ + //解决excel类型问题,获得数值 + public static String getValue(Cell cell) { + String value = ""; + if(null==cell){ + return value; + } + switch (cell.getCellType()) { + //数值型 + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + //如果是date类型则 ,获取该cell的date值 + Date date = DateUtil.getJavaDate(cell.getNumericCellValue()); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + value = format.format(date);; + }else {// 纯数字 + BigDecimal big=new BigDecimal(cell.getNumericCellValue()); + value = big.toString(); + //解决1234.0 去掉后面的.0 + if(null!=value&&!"".equals(value.trim())){ + String[] item = value.split("[.]"); + if(1> converters) { + Iterator> iterator = converters.iterator(); + //先把JackSon的消息转换器删除. 在SpringBoot2.X时代,必须要排除JackSon消息转换器。 + while (iterator.hasNext()) { + HttpMessageConverter converter = iterator.next(); + if (converter instanceof MappingJackson2HttpMessageConverter) { + iterator.remove(); + } + } + FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); + converter.setFastJsonConfig(fastjsonConfig()); + converter.setSupportedMediaTypes(getSupportedMediaType()); + converters.add(converter); + } + + /** + * fastjson的配置 + */ + public FastJsonConfig fastjsonConfig() { + FastJsonConfig fastJsonConfig = new FastJsonConfig(); + fastJsonConfig.setSerializerFeatures( + SerializerFeature.PrettyFormat, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteEnumUsingToString + ); + //修改,设置全局时间为精确到天,页面列表显示不带时分秒 + fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); +// fastJsonConfig.setDateFormat("yyyy-MM-dd"); + ValueFilter valueFilter = new ValueFilter() { + @Override + public Object process(Object o, String s, Object o1) { + if (null == o1) { + o1 = ""; + } + return o1; + } + }; + fastJsonConfig.setCharset(Charset.forName("utf-8")); + fastJsonConfig.setSerializeFilters(valueFilter); + + //解决Long转json精度丢失的问题 + SerializeConfig serializeConfig = SerializeConfig.globalInstance; + serializeConfig.put(BigInteger.class, ToStringSerializer.instance); + serializeConfig.put(Long.class, ToStringSerializer.instance); + serializeConfig.put(BigDecimal.class, ToStringSerializer.instance); +// serializeConfig.put(Long.TYPE, ToStringSerializer.instance); + fastJsonConfig.setSerializeConfig(serializeConfig); + return fastJsonConfig; + } + + /** + * 支持的mediaType类型 + */ + public List getSupportedMediaType() { + ArrayList mediaTypes = new ArrayList<>(); + mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); + + return mediaTypes; + } + +} + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java new file mode 100644 index 0000000..3cb69eb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.config.PoolConfig; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; +import com.casic.missiles.modular.system.util.ExcelUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + *

+ * 测试链接记录 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + @Autowired + private PoolConfig threadPoolTaskExecutor; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String url) { + + String result = LinkTestUtil.testUrl(url); + return this.save(new BusinessConnectTestrecord(result.split(","))); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List urls) { + List> listList = ListUtils.partition(urls, 50); + listList.forEach(list -> { + threadPoolTaskExecutor.taskExecutor().execute(new Runnable() { + @Override + public void run() { + list.forEach(s -> { + String result = LinkTestUtil.testUrl(s); + save(new BusinessConnectTestrecord(result.split(","))); + }); + } + }); + }); + return true; + } + + @Override + public List parseSourceFile(MultipartFile file) { + List stringList = new ArrayList<>(); + try { + + File Filefile = new File(downloadPath + file.getOriginalFilename()); + file.transferTo(Filefile); + FileInputStream inputStream = new FileInputStream(Filefile); + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + List rows = list.get(i); + stringList.add(rows.get(0) + ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java new file mode 100644 index 0000000..dbde4a4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.ssl; + +import cn.hutool.core.date.DateUtil; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import java.net.InetAddress; +import java.net.URL; +import java.util.Date; + +public class LinkTestUtil { + + public static String testUrl(String url) { + long startMill = System.currentTimeMillis(); + long endMill; + String testTime = DateUtil.formatDateTime(new Date()); + try { + if (url.indexOf("https") == 0 || url.indexOf("HTTPS") == 0) { + + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL serverUrl = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); + conn.setSSLSocketFactory(sslcontext.getSocketFactory()); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-type", "application/json"); + //必须设置false,否则会自动redirect到重定向后的地址 + conn.setInstanceFollowRedirects(false); + conn.connect(); + int result = conn.getResponseCode(); + endMill = System.currentTimeMillis(); + conn.disconnect(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:" + result + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + "," + result + "," + testTime; + + } + + + InetAddress.getByName(url).isReachable(2000); //Replace with your name +// URL url1=new URL("url"); +// url1.openConnection(); + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:200" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",200," + testTime; + + } catch (Exception e) { + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:404" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",404," + testTime; + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java new file mode 100644 index 0000000..d2e8484 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.ssl; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] ax509certificate,String s) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java new file mode 100644 index 0000000..03942c8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,135 @@ +package com.casic.missiles.modular.system.util; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ExcelUtils { + private final static String excel2003L =".xls"; //2003- 版本的excel + private final static String excel2007U =".xlsx"; //2007版本 + + /** + * @Description:获取IO流中的数据,组装成List>对象 + * @param in,fileName + * @return + * @throws + */ + public static List> getListByExcel(InputStream in, String fileName) throws Exception{ + List> list = null; + + //创建Excel工作薄 + Workbook work = getWorkbook(in,fileName); + if(null == work){ + throw new Exception("创建Excel工作薄为空!"); + } + Sheet sheet = null; //页数 + Row row = null; //行数 + Cell cell = null; //列数 + + list = new ArrayList>(); + //遍历Excel中所有的sheet + for (int i = 0; i < work.getNumberOfSheets(); i++) { + sheet = work.getSheetAt(i); + if(sheet==null){continue;} + + //遍历当前sheet中的所有行 + for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) { + row = sheet.getRow(j); + if(row==null){continue;} + + //遍历所有的列 + List li = new ArrayList(); + for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { + cell = row.getCell(y); + li.add(getValue(cell)); + } + list.add(li); + } + } + + return list; + + } + + /** + * @Description:根据文件后缀,自适应上传文件的版本 + * @param inStr,fileName + * @return + * @throws Exception + */ + public static Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ + Workbook wb = null; + String fileType = fileName.substring(fileName.lastIndexOf(".")); + if(excel2003L.equals(fileType)){ + wb = new HSSFWorkbook(inStr); //2003- + }else if(excel2007U.equals(fileType)){ + wb = new XSSFWorkbook(inStr); //2007+ + }else{ + throw new Exception("解析的文件格式有误!"); + } + return wb; + } + + /** + * @Description:对表格中数值进行格式化 + * @param cell + * @return + */ + //解决excel类型问题,获得数值 + public static String getValue(Cell cell) { + String value = ""; + if(null==cell){ + return value; + } + switch (cell.getCellType()) { + //数值型 + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + //如果是date类型则 ,获取该cell的date值 + Date date = DateUtil.getJavaDate(cell.getNumericCellValue()); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + value = format.format(date);; + }else {// 纯数字 + BigDecimal big=new BigDecimal(cell.getNumericCellValue()); + value = big.toString(); + //解决1234.0 去掉后面的.0 + if(null!=value&&!"".equals(value.trim())){ + String[] item = value.split("[.]"); + if(1> converters) { + Iterator> iterator = converters.iterator(); + //先把JackSon的消息转换器删除. 在SpringBoot2.X时代,必须要排除JackSon消息转换器。 + while (iterator.hasNext()) { + HttpMessageConverter converter = iterator.next(); + if (converter instanceof MappingJackson2HttpMessageConverter) { + iterator.remove(); + } + } + FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); + converter.setFastJsonConfig(fastjsonConfig()); + converter.setSupportedMediaTypes(getSupportedMediaType()); + converters.add(converter); + } + + /** + * fastjson的配置 + */ + public FastJsonConfig fastjsonConfig() { + FastJsonConfig fastJsonConfig = new FastJsonConfig(); + fastJsonConfig.setSerializerFeatures( + SerializerFeature.PrettyFormat, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteEnumUsingToString + ); + //修改,设置全局时间为精确到天,页面列表显示不带时分秒 + fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); +// fastJsonConfig.setDateFormat("yyyy-MM-dd"); + ValueFilter valueFilter = new ValueFilter() { + @Override + public Object process(Object o, String s, Object o1) { + if (null == o1) { + o1 = ""; + } + return o1; + } + }; + fastJsonConfig.setCharset(Charset.forName("utf-8")); + fastJsonConfig.setSerializeFilters(valueFilter); + + //解决Long转json精度丢失的问题 + SerializeConfig serializeConfig = SerializeConfig.globalInstance; + serializeConfig.put(BigInteger.class, ToStringSerializer.instance); + serializeConfig.put(Long.class, ToStringSerializer.instance); + serializeConfig.put(BigDecimal.class, ToStringSerializer.instance); +// serializeConfig.put(Long.TYPE, ToStringSerializer.instance); + fastJsonConfig.setSerializeConfig(serializeConfig); + return fastJsonConfig; + } + + /** + * 支持的mediaType类型 + */ + public List getSupportedMediaType() { + ArrayList mediaTypes = new ArrayList<>(); + mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); + + return mediaTypes; + } + +} + diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 29bc64e..d955c33 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -24,6 +24,8 @@ db: init: enable: false + file-upload-path: C:\casic\tmp\ + file-down-path: C:\casic\tmp\ logging: level.root: info level.com.casic: debug diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 14b4974..19e8eb1 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -40,6 +40,10 @@ ${boot.version} provided + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java new file mode 100644 index 0000000..7dfab9a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/config/PoolConfig.java @@ -0,0 +1,36 @@ +package com.casic.missiles.modular.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + + +@Configuration +public class PoolConfig { + + @Bean("syncExecutorPool") + public Executor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心池大小 + taskExecutor.setCorePoolSize(5); + // 最大线程数 + taskExecutor.setMaxPoolSize(10); + // 队列程度 + taskExecutor.setQueueCapacity(100); + // 线程空闲时间 + taskExecutor.setKeepAliveSeconds(60); + // 线程前缀名称 + taskExecutor.setThreadNamePrefix("syncExecutor--"); + // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean, + // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + taskExecutor.setAwaitTerminationSeconds(60); + // 线程不够用时由调用的线程处理该任务 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return taskExecutor; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java new file mode 100644 index 0000000..e99f022 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.exception.BusinessException; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends ExportController { + + + @Autowired + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ +// @RequestMapping(value = "/list") +// @ResponseBody +// public Object list(String condition) { +// return businessConnectTestrecordService.selectList(null); +// } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(String condition) { + Page page = PageFactory.defaultPage(); + page=businessConnectTestrecordService.page(page); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTestrecord -> { + businessConnectTestrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTestrecord.getTestResult()) ? + DictEnum.TEST_PASSED : DictEnum.TEST_FAILED); + }); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增测试链接记录表 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(@RequestBody @Valid BusinessConnectTestrecord businessConnectTestrecord) { + Assert.isFalse(ObjectUtil.isEmpty(businessConnectTestrecord.getTestUrl()), () -> { + throw new BusinessException(BusinessExceptionEnum.TEST_URL_NULL); + }); + return businessConnectTestrecordService.saveBusinessConnectTestRecord(businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + /** + * 批量导入测试 + */ + @RequestMapping(value = "/fileImport", method = RequestMethod.POST) + @ResponseBody + public Object fileImport(@RequestParam("file") MultipartFile file) { + Assert.isFalse(Objects.isNull(file), () -> { + throw new BusinessException(BusinessExceptionEnum.FILE_NULL); + }); + List urlList = businessConnectTestrecordService.parseSourceFile(file); + return businessConnectTestrecordService.saveBatchBusinessConnectTestRecord(urlList) ? + ResponseData.success() : ResponseData.error(BusinessExceptionEnum.SAVE_FAILED.getMessage()); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return SUCCESS_TIP; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java index 3067b81..356535f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessHandleRecordController.java @@ -2,17 +2,12 @@ import com.casic.missiles.core.base.controller.ExportController; -import com.casic.missiles.modular.system.model.BusinessHandleRecord; import com.casic.missiles.modular.system.service.IBusinessHandleRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.List; - /** * 处置信息控制器 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java index 5d87130..aa7d939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/JudgmentController.java @@ -8,6 +8,7 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.model.Judgment; import com.casic.missiles.modular.system.service.IJudgmentService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -105,4 +106,18 @@ // resultData.setData(judgmentService.selectById(judgmentId)); // return resultData; // } + + + /** + * 校验url有效性 + */ + @RequestMapping(value = "/testUrl") + @ResponseBody + public Object testUrl(String url) throws Exception { + + LinkTestUtil.testUrl(url); + return true; + + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java new file mode 100644 index 0000000..6d7f7fb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/BusinessConnectTestrecordMapper.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; + +/** + *

+ * 测试链接记录 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface BusinessConnectTestrecordMapper extends BaseMapper { + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml new file mode 100644 index 0000000..0d02de0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dao/mapping/BusinessConnectTestrecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + ID AS id, TEST_PLATFORM AS testPlatform, TEST_URL AS testUrl, TEST_RESULT AS testResult, TEST_TIME AS testTime, CREATE_TIME AS createTime, DESCRIPTION AS description + + + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java new file mode 100644 index 0000000..8b6167c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/BusinessExceptionEnum.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.model.exception.AbstractBaseExceptionEnum; + +/** + * @Description: + */ +public enum BusinessExceptionEnum implements AbstractBaseExceptionEnum { + + ID_NULL(2400, "主键不能为空"), + HANDLE_FAILED(500, "操作失败"), + + SAVE_FAILED(400, "保存失败"), + + TEST_URL_NULL(2090, "测试地址为空!"), + + FILE_NULL(2091, "导入文件为空!"), + + FILE_READ_ROW_FAILED(2092, "读入excel异常!"), + + MONITOR_VALID_FAILED(2099, "云台登录地址重复"); + + + private Integer code; + private String message; + + BusinessExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return this.code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java new file mode 100644 index 0000000..480e5bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.system.enums; + +/** + * @Description: 字典名枚举 + * @Author: zt + * @Date: 2023/4/20 10:41 + */ +public interface DictEnum { + //测试通过 + String TEST_PASSED = "通过"; + //测试不通过 + String TEST_FAILED = "不通过"; + //测试状态 + String TEST_STATUS = "1"; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java new file mode 100644 index 0000000..d3408e0 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/exception/BusinessException.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.system.exception; + +import com.casic.missiles.modular.system.enums.BusinessExceptionEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * @Description: 业务异常 + */ +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + @Getter + @Setter + private Integer code; + @Getter + @Setter + private String message; + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public BusinessException(BusinessExceptionEnum exceptionEnum) { + super(exceptionEnum.getMessage()); + this.code = exceptionEnum.getCode(); + this.message = exceptionEnum.getMessage(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..dc2f09b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/handler/GlobalExceptionHandler.java @@ -0,0 +1,43 @@ +package com.casic.missiles.modular.system.handler; + +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Slf4j +@Order(1) +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 业务异常捕获处理 + */ + @ResponseBody + @ExceptionHandler({BusinessException.class}) + public Object handleError(BusinessException exception) { + return ResponseData.error(exception.getCode(), exception.getMessage()); + } + +// /** +// * 编号重复异常捕获处理 +// */ +// @ResponseBody +// @ExceptionHandler({DuplicateKeyException.class}) +// public Object handleDuplicateKeyException() { +// return ReturnUtil.failed(BusinessExceptionEnum.DUPLICATE_NUMBER.getCode(), BusinessExceptionEnum.DUPLICATE_NUMBER.getMessage()); +// } +// +// /** +// * 参数校验失败异常 +// */ +// @ResponseBody +// @ExceptionHandler({MethodArgumentNotValidException.class}) +// public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { +// return ReturnUtil.failed(BusinessExceptionEnum.PARAM_INVALID.getCode(), exception.getFieldError().getDefaultMessage()); +// } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java new file mode 100644 index 0000000..d52bb99 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 测试链接记录 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Data +@TableName("business_connect_testrecord") +public class BusinessConnectTestrecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("ID") + private Long id; + /** + * 测试平台 + */ + @TableField("TEST_PLATFORM") + private String testPlatform; + /** + * 链接地址 + */ + @TableField("TEST_URL") + private String testUrl; + /** + * 测试结果1:通过,0,无效 + */ + @TableField("TEST_RESULT") + private String testResult; + /** + * 消耗时间 + */ + @TableField("TEST_TIME") + private String testTime; + /** + * 测试时间 + */ + @TableField("CREATE_TIME") + private Date createTime; + /** + * 备注 + */ + @TableField("DESCRIPTION") + private String description; + + + public BusinessConnectTestrecord() { + } + + public BusinessConnectTestrecord(String[] dto) { + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java index a0a532a..f13bb3c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessReportInfo.java @@ -74,86 +74,6 @@ private Date reportTime; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public String getLabels() { - return labels; - } - - public void setLabels(String labels) { - this.labels = labels; - } - - public String getPlatform() { - return platform; - } - - public void setPlatform(String platform) { - this.platform = platform; - } - - public String getReportDepartment() { - return reportDepartment; - } - - public void setReportDepartment(String reportDepartment) { - this.reportDepartment = reportDepartment; - } - - public String getArea() { - return area; - } - - public void setArea(String area) { - this.area = area; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getReportTime() { - return reportTime; - } - - public void setReportTime(Date reportTime) { - this.reportTime = reportTime; - } - @Override public String toString() { return "BusinessReportInfo{" + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java new file mode 100644 index 0000000..4b23c72 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 测试链接记录 服务类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String url); + + boolean saveBatchBusinessConnectTestRecord(List urls); + + //解析文件流 + List parseSourceFile(MultipartFile file); + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java new file mode 100644 index 0000000..3cb69eb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,91 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.config.PoolConfig; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import com.casic.missiles.modular.system.ssl.LinkTestUtil; +import com.casic.missiles.modular.system.util.ExcelUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + *

+ * 测试链接记录 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + @Autowired + private PoolConfig threadPoolTaskExecutor; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String url) { + + String result = LinkTestUtil.testUrl(url); + return this.save(new BusinessConnectTestrecord(result.split(","))); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List urls) { + List> listList = ListUtils.partition(urls, 50); + listList.forEach(list -> { + threadPoolTaskExecutor.taskExecutor().execute(new Runnable() { + @Override + public void run() { + list.forEach(s -> { + String result = LinkTestUtil.testUrl(s); + save(new BusinessConnectTestrecord(result.split(","))); + }); + } + }); + }); + return true; + } + + @Override + public List parseSourceFile(MultipartFile file) { + List stringList = new ArrayList<>(); + try { + + File Filefile = new File(downloadPath + file.getOriginalFilename()); + file.transferTo(Filefile); + FileInputStream inputStream = new FileInputStream(Filefile); + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + List rows = list.get(i); + stringList.add(rows.get(0) + ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java new file mode 100644 index 0000000..dbde4a4 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/LinkTestUtil.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.ssl; + +import cn.hutool.core.date.DateUtil; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import java.net.InetAddress; +import java.net.URL; +import java.util.Date; + +public class LinkTestUtil { + + public static String testUrl(String url) { + long startMill = System.currentTimeMillis(); + long endMill; + String testTime = DateUtil.formatDateTime(new Date()); + try { + if (url.indexOf("https") == 0 || url.indexOf("HTTPS") == 0) { + + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL serverUrl = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); + conn.setSSLSocketFactory(sslcontext.getSocketFactory()); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-type", "application/json"); + //必须设置false,否则会自动redirect到重定向后的地址 + conn.setInstanceFollowRedirects(false); + conn.connect(); + int result = conn.getResponseCode(); + endMill = System.currentTimeMillis(); + conn.disconnect(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:" + result + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + "," + result + "," + testTime; + + } + + + InetAddress.getByName(url).isReachable(2000); //Replace with your name +// URL url1=new URL("url"); +// url1.openConnection(); + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:200" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",200," + testTime; + + } catch (Exception e) { + endMill = System.currentTimeMillis(); + System.out.println("*****************链接地址:" + url + "消耗时间:" + (endMill - startMill) + ",测试状态:404" + ",测试时间:" + testTime); + return url + "," + (endMill - startMill) + ",404," + testTime; + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java new file mode 100644 index 0000000..d2e8484 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/ssl/MyX509TrustManager.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.ssl; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] ax509certificate,String s) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java new file mode 100644 index 0000000..03942c8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,135 @@ +package com.casic.missiles.modular.system.util; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ExcelUtils { + private final static String excel2003L =".xls"; //2003- 版本的excel + private final static String excel2007U =".xlsx"; //2007版本 + + /** + * @Description:获取IO流中的数据,组装成List>对象 + * @param in,fileName + * @return + * @throws + */ + public static List> getListByExcel(InputStream in, String fileName) throws Exception{ + List> list = null; + + //创建Excel工作薄 + Workbook work = getWorkbook(in,fileName); + if(null == work){ + throw new Exception("创建Excel工作薄为空!"); + } + Sheet sheet = null; //页数 + Row row = null; //行数 + Cell cell = null; //列数 + + list = new ArrayList>(); + //遍历Excel中所有的sheet + for (int i = 0; i < work.getNumberOfSheets(); i++) { + sheet = work.getSheetAt(i); + if(sheet==null){continue;} + + //遍历当前sheet中的所有行 + for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) { + row = sheet.getRow(j); + if(row==null){continue;} + + //遍历所有的列 + List li = new ArrayList(); + for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { + cell = row.getCell(y); + li.add(getValue(cell)); + } + list.add(li); + } + } + + return list; + + } + + /** + * @Description:根据文件后缀,自适应上传文件的版本 + * @param inStr,fileName + * @return + * @throws Exception + */ + public static Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ + Workbook wb = null; + String fileType = fileName.substring(fileName.lastIndexOf(".")); + if(excel2003L.equals(fileType)){ + wb = new HSSFWorkbook(inStr); //2003- + }else if(excel2007U.equals(fileType)){ + wb = new XSSFWorkbook(inStr); //2007+ + }else{ + throw new Exception("解析的文件格式有误!"); + } + return wb; + } + + /** + * @Description:对表格中数值进行格式化 + * @param cell + * @return + */ + //解决excel类型问题,获得数值 + public static String getValue(Cell cell) { + String value = ""; + if(null==cell){ + return value; + } + switch (cell.getCellType()) { + //数值型 + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + //如果是date类型则 ,获取该cell的date值 + Date date = DateUtil.getJavaDate(cell.getNumericCellValue()); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + value = format.format(date);; + }else {// 纯数字 + BigDecimal big=new BigDecimal(cell.getNumericCellValue()); + value = big.toString(); + //解决1234.0 去掉后面的.0 + if(null!=value&&!"".equals(value.trim())){ + String[] item = value.split("[.]"); + if(1> converters) { + Iterator> iterator = converters.iterator(); + //先把JackSon的消息转换器删除. 在SpringBoot2.X时代,必须要排除JackSon消息转换器。 + while (iterator.hasNext()) { + HttpMessageConverter converter = iterator.next(); + if (converter instanceof MappingJackson2HttpMessageConverter) { + iterator.remove(); + } + } + FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); + converter.setFastJsonConfig(fastjsonConfig()); + converter.setSupportedMediaTypes(getSupportedMediaType()); + converters.add(converter); + } + + /** + * fastjson的配置 + */ + public FastJsonConfig fastjsonConfig() { + FastJsonConfig fastJsonConfig = new FastJsonConfig(); + fastJsonConfig.setSerializerFeatures( + SerializerFeature.PrettyFormat, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteEnumUsingToString + ); + //修改,设置全局时间为精确到天,页面列表显示不带时分秒 + fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); +// fastJsonConfig.setDateFormat("yyyy-MM-dd"); + ValueFilter valueFilter = new ValueFilter() { + @Override + public Object process(Object o, String s, Object o1) { + if (null == o1) { + o1 = ""; + } + return o1; + } + }; + fastJsonConfig.setCharset(Charset.forName("utf-8")); + fastJsonConfig.setSerializeFilters(valueFilter); + + //解决Long转json精度丢失的问题 + SerializeConfig serializeConfig = SerializeConfig.globalInstance; + serializeConfig.put(BigInteger.class, ToStringSerializer.instance); + serializeConfig.put(Long.class, ToStringSerializer.instance); + serializeConfig.put(BigDecimal.class, ToStringSerializer.instance); +// serializeConfig.put(Long.TYPE, ToStringSerializer.instance); + fastJsonConfig.setSerializeConfig(serializeConfig); + return fastJsonConfig; + } + + /** + * 支持的mediaType类型 + */ + public List getSupportedMediaType() { + ArrayList mediaTypes = new ArrayList<>(); + mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); + + return mediaTypes; + } + +} + diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 29bc64e..d955c33 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -24,6 +24,8 @@ db: init: enable: false + file-upload-path: C:\casic\tmp\ + file-down-path: C:\casic\tmp\ logging: level.root: info level.com.casic: debug diff --git a/pom.xml b/pom.xml index fbfd088..5e6815a 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,10 @@ ${mysql.driver.version} + com.dameng + DmJdbcDriver18 + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus-boot-starter} @@ -113,6 +117,11 @@ mysql-connector-java ${mysql.driver.version} + + com.dameng + DmJdbcDriver18 + 1.8 +