diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..db2fe85 --- /dev/null +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/**/** + file-down-path: D:\casic\tmp\ + file-upload-path: D:\code\xinjiang\casic-xj-connector\casic-web\src\main\resources\temp\ +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..db2fe85 --- /dev/null +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/**/** + file-down-path: D:\casic\tmp\ + file-upload-path: D:\code\xinjiang\casic-xj-connector\casic-web\src\main\resources\temp\ +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..d11b173 --- /dev/null +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -0,0 +1,22 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken +logging: + level.root: error + level.com.casic: error + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..db2fe85 --- /dev/null +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/**/** + file-down-path: D:\casic\tmp\ + file-upload-path: D:\code\xinjiang\casic-xj-connector\casic-web\src\main\resources\temp\ +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..d11b173 --- /dev/null +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -0,0 +1,22 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken +logging: + level.root: error + level.com.casic: error + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..86cf017 --- /dev/null +++ b/casic-web/src/main/resources/config/application-test.yml @@ -0,0 +1,30 @@ +server: + port: 11307 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + #flowable数据源和多数据源配置 + flowable: + datasource: + url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! +flowable: + checkProcessDefinitions: false #不校验process文件 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..db2fe85 --- /dev/null +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/**/** + file-down-path: D:\casic\tmp\ + file-upload-path: D:\code\xinjiang\casic-xj-connector\casic-web\src\main\resources\temp\ +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..d11b173 --- /dev/null +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -0,0 +1,22 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken +logging: + level.root: error + level.com.casic: error + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..86cf017 --- /dev/null +++ b/casic-web/src/main/resources/config/application-test.yml @@ -0,0 +1,30 @@ +server: + port: 11307 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + #flowable数据源和多数据源配置 + flowable: + datasource: + url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! +flowable: + checkProcessDefinitions: false #不校验process文件 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml new file mode 100644 index 0000000..33366ab --- /dev/null +++ b/casic-web/src/main/resources/config/application.yml @@ -0,0 +1,28 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + http: + multipart: + max-file-size: 50MB + max-request-size: 80MB +mybatis-plus: + global-config: + sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector +################### mybatis-plus配置 ################### +################### guns配置 ################### +flowable: + checkProcessDefinitions: false +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: false #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + nologin-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..db2fe85 --- /dev/null +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/**/** + file-down-path: D:\casic\tmp\ + file-upload-path: D:\code\xinjiang\casic-xj-connector\casic-web\src\main\resources\temp\ +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..d11b173 --- /dev/null +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -0,0 +1,22 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken +logging: + level.root: error + level.com.casic: error + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..86cf017 --- /dev/null +++ b/casic-web/src/main/resources/config/application-test.yml @@ -0,0 +1,30 @@ +server: + port: 11307 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + #flowable数据源和多数据源配置 + flowable: + datasource: + url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! +flowable: + checkProcessDefinitions: false #不校验process文件 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml new file mode 100644 index 0000000..33366ab --- /dev/null +++ b/casic-web/src/main/resources/config/application.yml @@ -0,0 +1,28 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + http: + multipart: + max-file-size: 50MB + max-request-size: 80MB +mybatis-plus: + global-config: + sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector +################### mybatis-plus配置 ################### +################### guns配置 ################### +flowable: + checkProcessDefinitions: false +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: false #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + nologin-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ \ No newline at end of file diff --git a/casic-web/src/main/resources/logback-spring.xml b/casic-web/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..6e939ec --- /dev/null +++ b/casic-web/src/main/resources/logback-spring.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + ${LOG_PATH}${LOG_FILE} + + %date [%level] [%thread] %logger{60} [%file : %line] %msg%n + + + + ${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz + 30 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..db2fe85 --- /dev/null +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/**/** + file-down-path: D:\casic\tmp\ + file-upload-path: D:\code\xinjiang\casic-xj-connector\casic-web\src\main\resources\temp\ +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..d11b173 --- /dev/null +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -0,0 +1,22 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken +logging: + level.root: error + level.com.casic: error + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..86cf017 --- /dev/null +++ b/casic-web/src/main/resources/config/application-test.yml @@ -0,0 +1,30 @@ +server: + port: 11307 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + #flowable数据源和多数据源配置 + flowable: + datasource: + url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! +flowable: + checkProcessDefinitions: false #不校验process文件 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml new file mode 100644 index 0000000..33366ab --- /dev/null +++ b/casic-web/src/main/resources/config/application.yml @@ -0,0 +1,28 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + http: + multipart: + max-file-size: 50MB + max-request-size: 80MB +mybatis-plus: + global-config: + sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector +################### mybatis-plus配置 ################### +################### guns配置 ################### +flowable: + checkProcessDefinitions: false +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: false #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + nologin-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ \ No newline at end of file diff --git a/casic-web/src/main/resources/logback-spring.xml b/casic-web/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..6e939ec --- /dev/null +++ b/casic-web/src/main/resources/logback-spring.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + ${LOG_PATH}${LOG_FILE} + + %date [%level] [%thread] %logger{60} [%file : %line] %msg%n + + + + ${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz + 30 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-web/src/main/resources/temp/testTemplate.xlsx b/casic-web/src/main/resources/temp/testTemplate.xlsx new file mode 100644 index 0000000..b8c9bd2 --- /dev/null +++ b/casic-web/src/main/resources/temp/testTemplate.xlsx Binary files differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e20bc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +**/target/** +logs/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..d67ac77 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# casic项目 V1.0.0 + +## 介绍 +基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springboot + shiro + mybatis-plus ! +基于casic项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块), +可以直接作为一个后台管理系统的脚手架! 目标 `更简洁`,`更规范`! + + +#### 其他 +>* [git地址](http://192.168.0.203:8080/gitbucket) +>* [本地免登地址](http://localhost:8083/route/mockToken) + + + + + diff --git a/casic-server/pom.xml b/casic-server/pom.xml new file mode 100644 index 0000000..180d0a8 --- /dev/null +++ b/casic-server/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + 1.0.0 + ../pom.xml + + + casic-server + ${pro.version} + jar + casic-server + casic 的spring boot版本 + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + + com.casic + casic-export-support + 1.0.0.alpha + + + + cn.hutool + hutool-all + 5.7.2 + + + com.alibaba + easyexcel + 3.1.0 + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + + + + + src/main/java + + **/*.xml + + + + + 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..38921fc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/BusinessConnectTestrecordController.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dto.BusinessReportInfoRequest; +import com.casic.missiles.modular.system.dto.IdsDTO; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import com.casic.missiles.modular.system.service.IBusinessConnectTestrecordService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.List; + +/** + * 测试链接记录表控制器 + * + * @author dev + * @Date 2023-05-17 11:04:13 + */ +@Controller +@RequestMapping("/businessConnectTestrecord") +public class BusinessConnectTestrecordController extends BaseController { + + + @Resource + private IBusinessConnectTestrecordService businessConnectTestrecordService; + + + /** + * 获取测试链接记录表列表 + */ + @RequestMapping(value = "/batchDelete") + @ResponseBody + public Object batchDelete(@RequestBody @Valid IdsDTO idsDTO) { +// Assert.isFalse(cn.hutool.core.util.ObjectUtil.isEmpty(idsDTO.getIds()), () -> { +// throw new BusinessException(BusinessExceptionEnum.ID_NULL); +// }); + return ResponseData.success(businessConnectTestrecordService.deleteBatchIds(idsDTO.getIds())); + } + + /** + * 获取测试链接记录表分页列表 + */ + @RequestMapping(value = "/listPage") + @ResponseBody + public Object listPage(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest) { + Page page = new PageFactory().defaultPage(); + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME", false); + page = businessConnectTestrecordService.selectPage(page, queryWrapper); + List businessConnectTestrecordList = page.getRecords(); + businessConnectTestrecordList.forEach(businessConnectTesrecord -> { + businessConnectTesrecord.setTestResult(DictEnum.TEST_STATUS.equals(businessConnectTesrecord.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.getTestPlatform(), businessConnectTestrecord.getTestUrl()) ? + ResponseData.success() : ResponseData.error("save failed"); + } + + /** + * 批量导入测试 + */ + @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("save failed"); + } + + + /** + * 批量导出测试记录 + */ + @RequestMapping(value = "/fileExport") + @ResponseBody + public void fileExport(@RequestBody @Valid BusinessReportInfoRequest reportInfoRequest, HttpServletResponse response) { + EntityWrapper queryWrapper = new EntityWrapper<>(); + queryWrapper.ge(ObjectUtil.isNotEmpty(reportInfoRequest.getBeginTime()), "CREATE_TIME", reportInfoRequest.getBeginTime()); + queryWrapper.le(ObjectUtil.isNotEmpty(reportInfoRequest.getEndTime()), "CREATE_TIME", reportInfoRequest.getEndTime()); + queryWrapper.orderBy("CREATE_TIME",false); + businessConnectTestrecordService.exportUsersToExcel(businessConnectTestrecordService.selectList(queryWrapper), response); + } + + + /** + * 修改测试链接记录表 + */ + @RequestMapping(value = "/update") + @ResponseBody + public Object update(BusinessConnectTestrecord businessConnectTestrecord) { + businessConnectTestrecordService.updateById(businessConnectTestrecord); + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java new file mode 100644 index 0000000..5a00c42 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.response.ResponseData; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName DemoController + * @Description TODO + * @Author lenovo + * @Date 2020/6/13 15:38 + * @Version 1.0 + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + /** + * 获取mockToken + */ + @PostMapping("/list") + @ResponseBody + public Object list(){ + return ResponseData.success(); + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..08482c1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,71 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + @Value("${casic.file-down-path}") + private String downloadPath; + + + /** + * 文件模板下载 + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + logger.info(downloadPath); + if (downloadPath.startsWith("/")) { + downloadPath = downloadPath.substring(1); + } + File file = new File(downloadPath, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } +} 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..d787992 --- /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.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/dto/BusinessConnectRecordDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java new file mode 100644 index 0000000..c9fbd5a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessConnectRecordDTO.java @@ -0,0 +1,56 @@ +package com.casic.missiles.modular.system.dto; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.modular.system.enums.DictEnum; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class BusinessConnectRecordDTO implements Serializable { + + private static final long serialVersionUID = 1L; +// @ExportModel(sort = 0, title = "平台类型") + @ExcelProperty(value = "平台类型", order = 0) + private String testPlatform; +// @ExportModel(sort = 1, title = "链接地址") + @ExcelProperty(value = "链接地址", order = 1) + private String testUrl; +// @ExportModel(sort = 2, title = "测试时间") + @ExcelProperty(value = "测试时间", order = 2) + private String createTime; +// @ExportModel(sort = 3, title = "消耗时间/ms") + @ExcelProperty(value = "消耗时间/ms", order = 3) + private String testTime; +// @ExportModel(sort = 4, title = "证书号") + @ExcelProperty(value = "测试结果", order = 4) + private String testResult; + + + public static List convert(List testrecordList) { + List businessConnectRecordDTOList = new ArrayList<>(); + testrecordList.forEach(testrecord -> { + businessConnectRecordDTOList.add(new BusinessConnectRecordDTO(testrecord)); + }); + return businessConnectRecordDTOList; + } + + + public BusinessConnectRecordDTO(BusinessConnectTestrecord testrecord) { + this.testPlatform = ObjectUtil.isNotEmpty(testrecord.getTestPlatform())?testrecord.getTestPlatform():"-"; + this.testResult = DictEnum.TEST_STATUS.equals(testrecord.getTestResult()) ? DictEnum.TEST_PASSED : DictEnum.TEST_FAILED; + this.testTime = testrecord.getTestTime(); + this.createTime = DateUtil.formatDateTime(testrecord.getCreateTime()); + this.testUrl = testrecord.getTestUrl(); + } + + public BusinessConnectRecordDTO() { + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java new file mode 100644 index 0000000..9cbe7cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/BusinessReportInfoRequest.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +@Data +public class BusinessReportInfoRequest { + + private String specialItem; + + private String beginTime; + + private String endTime; + + private Long id; + + private Long thirdId; + + //用于初始化和点击事件刷新地图数据区分 1:点击事件,0:初始化 + private boolean flag; + + private int page; + + //用于是否是实时刷新 true实时刷新 + private Boolean isReal; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java new file mode 100644 index 0000000..a359449 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/dto/IdsDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Description: for batch use + * @Author: wangpeng + * @Date: 2022/11/26 9:51 + */ +@Data +public class IdsDTO { + @NotNull + private List ids; +} 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..5bcaa79 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/DictEnum.java @@ -0,0 +1,26 @@ +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"; + //发布平台 + String PLATE = "plate"; + //一级标签 + String FIRST_TAG = "tags"; + //下发 + String PROCESS_SEND = "4"; + + //投票支持 + String VOTE_APPROVE = "1"; + //投票反对 + String VOTE_AGAINST = "0"; +} 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..5a43beb --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/model/BusinessConnectTestrecord.java @@ -0,0 +1,78 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; +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, String plate) { + this.testPlatform =plate; + this.testUrl = dto[0]; + this.testTime = dto[1]; + this.createTime = new Date(); + this.testResult = "200".equals(dto[2]) ? "1" : "0"; + } + + @Override + protected Serializable pkVal() { + return null; + } +} 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..5f9b0f5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/IBusinessConnectTestrecordService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.BusinessConnectTestrecord; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +public interface IBusinessConnectTestrecordService extends IService { + + + boolean saveBusinessConnectTestRecord(String plate,String url); + + boolean saveBatchBusinessConnectTestRecord(List> urls); + + //解析文件流 + List> parseSourceFile(MultipartFile file); + + void exportUsersToExcel(List list, HttpServletResponse response); + +} 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..f9f5e66 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/BusinessConnectTestrecordServiceImpl.java @@ -0,0 +1,195 @@ +package com.casic.missiles.modular.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +//import com.casic.missiles.core.base.service.IBaseExportService; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.dao.BusinessConnectTestrecordMapper; +import com.casic.missiles.modular.system.dto.BusinessConnectRecordDTO; +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.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + + +/** + *

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

+ * + * @author stylefeng123 + * @since 2023-05-17 + */ +@Service +public class BusinessConnectTestrecordServiceImpl extends ServiceImpl implements IBusinessConnectTestrecordService { + + + @Autowired +// private IBaseExportService iBaseExportService; + + protected static final Map mapperExcel = new HashMap<>(); + + static { + mapperExcel.put("链接地址", "testUrl"); + } + + + @Value("${casic.file-down-path}") + private String downloadPath; + + @Override + public boolean saveBusinessConnectTestRecord(String plate,String url) { + + String result = LinkTestUtil.testUrl(url); + return this.insert(new BusinessConnectTestrecord(result.split(","), plate)); + } + + @Override + public boolean saveBatchBusinessConnectTestRecord(List> urls) { + //小于50个测试地址直接返回,大于50用线程返回 + if (ObjectUtil.isNotEmpty(urls) && urls.size() <= 20) { + List testrecordList = new ArrayList<>(); + urls.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return this.insertBatch(testrecordList); + } + List>> listList = ListUtils.partition(urls, 20); + ExecutorService es = Executors.newFixedThreadPool(10); + List testrecordTasks = new ArrayList<>(); + listList.forEach(list -> { + testrecordTasks.add(new BusinessConnectTestrecordTask(list)); + + }); + List> futures = null; + try { + futures = es.invokeAll(testrecordTasks); + } catch (InterruptedException e) { + e.printStackTrace(); + } + es.shutdown(); + + //汇总各个子线程的数据结果 + //这里处理线程结果 + while (futures.size() > 0) { + for (int i = 0; i < futures.size(); i++) { + Future mapFuture = futures.get(i); + System.out.println("index:" + i + ",future:" + mapFuture.isDone()); + if (mapFuture.isDone()) futures.remove(futures.get(i)); + } + } + return true; + } + + class BusinessConnectTestrecordTask implements Callable { + + List> connectTestrecordList; + + public BusinessConnectTestrecordTask(List> list) { + this.connectTestrecordList = list; + } + + @Override + public Boolean call() throws Exception { + List testrecordList = new ArrayList<>(); + connectTestrecordList.forEach(s -> { + String result = LinkTestUtil.testUrl(s.get("url") + ""); + testrecordList.add(new BusinessConnectTestrecord(result.split(","), s.get("plate") + "")); + }); + return insertBatch(testrecordList); + } + } + + @Override + public List> parseSourceFile(MultipartFile file) { + List> stringList = new ArrayList<>(); + try { + File tempFile = new File(downloadPath , System.currentTimeMillis() + file.getOriginalFilename()); + if (!tempFile.exists()) { + tempFile.createNewFile(); + } + FileCopyUtils.copy(file.getBytes(), tempFile); + FileInputStream inputStream = new FileInputStream(tempFile); + + List> list = ExcelUtils.getListByExcel(inputStream, file.getOriginalFilename()); + for (int i = 1; i < list.size(); i++) { + HashMap map = new HashMap<>(); + List rows = list.get(i); + if (ObjectUtil.isEmpty(rows.get(0))) continue; + map.put("url", rows.get(0)); + map.put("plate", rows.get(1)); + stringList.add(map); + } + } catch (Exception e) { + e.printStackTrace(); + } + return stringList; + } + + + @Override + public void exportUsersToExcel(List list, HttpServletResponse response) { +// Workbook workBook = Workbook.getInstance(1); +// Sheet sheet = workBook.createSheet("测试结果导出"); +// // 给标题行加上背景色,加颜色时,会对字体加粗 +// sheet.addCellStyle(new CellStyle(0, "66cc66")); +// sheet.write(BusinessConnectRecordDTO.class).createRow(BusinessConnectRecordDTO.convert(list)); + try { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("fileName", "UTF-8")); +// response.setHeader("Access-Control-Allow-Origin", "*"); +// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); +// response.setHeader("Access-Control-Max-Age", "3600"); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", "*"); +// response.setContentType("application/octet-stream;charset=UTF-8"); +// ServletOutputStream os = response.getOutputStream(); +// WebUtil.writeExcel(workBook, "测试结果导出".concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx"), response); +// workBook.write(os); + +// iBaseExportService.exportExcel(response, BusinessConnectRecordDTO.class, BusinessConnectRecordDTO.convert(list), "testRecords"); + + try { + EasyExcel.write(response.getOutputStream(), BusinessConnectRecordDTO.class).autoCloseStream(Boolean.FALSE).sheet(StrUtil.isNotEmpty("testRecords") ? "testRecords" : "数据").doWrite(BusinessConnectRecordDTO.convert(list)); + } catch (Exception var6) { + + this.setCatchResponse(response, var6.getMessage()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setCatchResponse(HttpServletResponse response, String msg) throws IOException { + response.reset(); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSON.toJSONString(ResponseData.error("下载文件失败" + msg))); + } + +} 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..33c8e93 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/util/ExcelUtils.java @@ -0,0 +1,137 @@ +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; + +import static java.sql.Types.NUMERIC; + +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(10; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getDeptPids +-- ---------------------------- +DROP FUNCTION IF EXISTS `getDeptPids`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getDeptPids`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(PID) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(ID,sParentTemp)>0 AND PID >=0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getMenuParentCodes +-- ---------------------------- +DROP FUNCTION IF EXISTS `getMenuParentCodes`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getMenuParentCodes`(`rootId` varchar(512)) RETURNS varchar(512) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(100); +SET sParentTemp =rootId ; +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(pcode) INTO sParentTemp FROM SYS_MENU WHERE FIND_IN_SET(CODE,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; + +-- ---------------------------- +-- Function structure for getParentList +-- ---------------------------- +DROP FUNCTION IF EXISTS `getParentList`; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8 +BEGIN +DECLARE sParentList VARCHAR(1000); +DECLARE sParentTemp VARCHAR(1000); +SET sParentTemp =CAST(rootId AS CHAR); +WHILE sParentTemp IS NOT NULL DO +IF (sParentList IS NOT NULL) THEN +SET sParentList = CONCAT('[',sParentTemp,'],',sParentList,''); +ELSE +SET sParentList = CONCAT('[',sParentTemp,']'); +END IF; +SELECT GROUP_CONCAT(target_pid_sync) INTO sParentTemp FROM SYS_DEPT WHERE FIND_IN_SET(target_id_sync,sParentTemp)>0; +END WHILE; +RETURN sParentList; + END +;; +DELIMITER ; diff --git a/casic-web/doc/init/clear.sql b/casic-web/doc/init/clear.sql new file mode 100644 index 0000000..68cedf3 --- /dev/null +++ b/casic-web/doc/init/clear.sql @@ -0,0 +1,7 @@ +--删除admin意外的用户 +delete from sys_user where account != 'admin' + +--删除非保留角色信息 +--select * from sys_role where tips not in('administrator') +--删除角色人员关系 +delete from sys_user_role_relation where USERID not in(select id from sys_user) diff --git a/casic-web/pom.xml b/casic-web/pom.xml new file mode 100644 index 0000000..8864253 --- /dev/null +++ b/casic-web/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.casic + casic-xj-connector + ../pom.xml + 1.0.0 + + casic-web + ${pro.version} + jar + + casic-web + casic web启动入口 + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + + + + com.casic + casic-core + ${core.version} + + + com.casic + casic-admin-support + ${admin.version} + + + com.casic + casic-admin-core + ${admin.version} + + + com.casic + casic-admin-area + ${admin.version} + + + + com.casic + casic-server + ${pro.version} + + + + + + + + + org.codehaus.groovy + groovy-all + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + javax.servlet + javax.servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + /config/*-*.yml + **/MockController.class + + + + com.casic.missiles.CasicApplication + true + ./ + + + + + + + maven-assembly-plugin + + + false + + src/main/build/package.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + ${resource.delimiter} + + true + + + + copy-resources + validate + + copy-resources + + + ${project.build.outputDirectory} + + + + src/main/resources + true + + + + + + + + + + + src/main/resources + + + /config/*/* + /config/*-*.yml + + true + + + src/main/java + + **/*.xml + + true + + + + + diff --git a/casic-web/src/main/bin/start.bat b/casic-web/src/main/bin/start.bat new file mode 100644 index 0000000..1db4e88 --- /dev/null +++ b/casic-web/src/main/bin/start.bat @@ -0,0 +1,4 @@ +@echo off +title ${project.build.finalName} +java -jar ./lib/${project.build.finalName}.jar +@pause diff --git a/casic-web/src/main/bin/start.sh b/casic-web/src/main/bin/start.sh new file mode 100644 index 0000000..c00b1ef --- /dev/null +++ b/casic-web/src/main/bin/start.sh @@ -0,0 +1,2 @@ +java -jar ./lib/${project.build.finalName}.jar + diff --git a/casic-web/src/main/build/package.xml b/casic-web/src/main/build/package.xml new file mode 100644 index 0000000..a2bff56 --- /dev/null +++ b/casic-web/src/main/build/package.xml @@ -0,0 +1,42 @@ + + + package + + zip + tar.gz + + true + + + true + true + lib + runtime + + + + + src/main/build/bin + + start.bat + start.sh + + true + 0744 + / + + + src/main/resources/config + true + + *.yml + /*/* + + /config + + + src/main/resources/i18n + / + + + \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java new file mode 100644 index 0000000..78a1b63 --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -0,0 +1,32 @@ +package com.casic.missiles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * SpringBoot方式启动类 + * + * @author lwh + * @Date 2017/5/21 12:06 + */ +@SpringBootApplication +@ServletComponentScan +@EnableCaching +@EnableTransactionManagement(proxyTargetClass = true) +@EnableAsync +public class CasicApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); + + public static void main(String[] args) { + SpringApplication.run(CasicApplication.class, args); + logger.info("CasicApplication is success!"); + } + +} diff --git a/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java new file mode 100644 index 0000000..269025c --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/CasicServletInitializer.java @@ -0,0 +1,18 @@ +package com.casic.missiles; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * Guns Web程序启动类 + * + * @author fengshuonan + * @date 2017-05-21 9:43 + */ +public class CasicServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(CasicApplication.class); + } +} diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java new file mode 100644 index 0000000..ecc332e --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -0,0 +1,92 @@ +package com.casic.missiles.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.base.response.SuccessResponseData; +import com.casic.missiles.core.log.LogManager; +import com.casic.missiles.core.log.factory.LogTaskFactory; +import com.casic.missiles.core.shiro.ShiroKit; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.RSAUtils; +import com.casic.missiles.core.util.ToolUtil; + +import com.casic.missiles.modular.constant.PermissionContant; +import com.casic.missiles.modular.system.dto.LoginResult; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import static com.casic.missiles.core.support.HttpKit.getIp; + +/** + * 仅为mock登录使用 + */ +@Controller +@RequestMapping("/route") +public class MockController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MockController.class); + + /** + * 获取mockToken + */ + @GetMapping("/sync") + @ResponseBody + public Object sync(String batchId) { + System.out.println("成功调用" + batchId); + return ResponseData.success(); + } + + /** + * 获取mockToken + */ + @GetMapping("/mockToken") + @ResponseBody + public Object mockToken(HttpServletRequest request, String username, String password) { + super.getSession().setAttribute(PermissionContant.IS_APP, false); + SuccessResponseData resultData = new SuccessResponseData(); + if (ToolUtil.isOneEmpty(username, password)) { + username = "admin"; + password = "111111"; + } + Subject currentUser = ShiroKit.getSubject(); + + try { + Map key = RSAUtils.genKeyPair(); + ShiroKit.getSession().setAttribute(PermissionContant.PRIVATE_KEY, key.get(RSAUtils.RSAPrivateKey)); + logger.info("秘钥:".concat(key.get(RSAUtils.RSAPublicKey))); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + + UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); + token.setRememberMe(false); + try { + currentUser.login(token); + } catch (Exception e) { + e.printStackTrace(); + } + ShiroUser shiroUser = ShiroKit.getUser(); + super.getSession().setAttribute("shiroUser", shiroUser); + super.getSession().setAttribute("username", shiroUser.getAccount()); + + super.getSession().setAttribute(PermissionContant.SESSION_KEY, shiroUser.getId()); + + LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); + + ShiroKit.getSession().setAttribute("sessionFlag", true); + resultData.setData(new LoginResult(ShiroKit.getSession().getId().toString(), null)); + resultData.setMessage("登录成功"); + return resultData; + } + +} diff --git a/casic-web/src/main/resources/META-INF/spring-devtools.properties b/casic-web/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..e3b0a7f --- /dev/null +++ b/casic-web/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.beetl=/beetl-2.7.15.jar \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..db2fe85 --- /dev/null +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/**/** + file-down-path: D:\casic\tmp\ + file-upload-path: D:\code\xinjiang\casic-xj-connector\casic-web\src\main\resources\temp\ +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..d11b173 --- /dev/null +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -0,0 +1,22 @@ +server: + port: 8081 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken +logging: + level.root: error + level.com.casic: error + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml new file mode 100644 index 0000000..86cf017 --- /dev/null +++ b/casic-web/src/main/resources/config/application-test.yml @@ -0,0 +1,30 @@ +server: + port: 11307 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://111.198.10.15:11102/casic_xj_connector?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! + initial-size: 2 + min-idle: 1 + jms: + pub-sub-domain: true +# session: +# store-type: redis +casic: + # kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + #flowable数据源和多数据源配置 + flowable: + datasource: + url: jdbc:mysql://localhost:3306/template_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: root + password: Casic203! +flowable: + checkProcessDefinitions: false #不校验process文件 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml new file mode 100644 index 0000000..33366ab --- /dev/null +++ b/casic-web/src/main/resources/config/application.yml @@ -0,0 +1,28 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## +spring: + profiles: + active: dev + http: + multipart: + max-file-size: 50MB + max-request-size: 80MB +mybatis-plus: + global-config: + sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector +################### mybatis-plus配置 ################### +################### guns配置 ################### +flowable: + checkProcessDefinitions: false +casic: + swagger-open: false #是否开启swagger (true/false) + kaptcha-open: false #是否开启登录时验证码 (true/false) + muti-datasource-open: false #是否开启多数据源(true/false) + spring-session-open: false #是否开启spring session,如果是多机环境需要开启(true/false) + session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 + session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 + nologin-urls: /user/login,/kaptcha,/config/baseConfig + config: + export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ \ No newline at end of file diff --git a/casic-web/src/main/resources/logback-spring.xml b/casic-web/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..6e939ec --- /dev/null +++ b/casic-web/src/main/resources/logback-spring.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + ${LOG_PATH}${LOG_FILE} + + %date [%level] [%thread] %logger{60} [%file : %line] %msg%n + + + + ${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz + 30 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-web/src/main/resources/temp/testTemplate.xlsx b/casic-web/src/main/resources/temp/testTemplate.xlsx new file mode 100644 index 0000000..b8c9bd2 --- /dev/null +++ b/casic-web/src/main/resources/temp/testTemplate.xlsx Binary files differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..05095c1 --- /dev/null +++ b/pom.xml @@ -0,0 +1,86 @@ + + 4.0.0 + com.casic + casic-xj-connector + 1.0.0 + casic-xj-connector + pom + + casic-web + casic-server + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + UTF-8 + UTF-8 + 1.8 + + 1.0.0 + + 1.0.1.alpha + + 1.0.1.alpha + + 1.0.1.alpha + 1.0.0.alpha + 1.0.5 + 1.4.0 + 2.1.8 + 1.2.44 + 2.5 + 1.7 + 2.3.2 + 3.3.1 + 3.2.1 + 1.1.6 + 2.7.15 + 1.7 + 2.2.2 + 3.6 + 2.6.11 + 5.1.38 + + + + + + org.springframework.boot + spring-boot-dependencies + 1.5.9.RELEASE + pom + import + + + + com.casic + casic-core + ${core.version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.9.RELEASE + + + + +