From 6228a7a594df992f4562fbc45c646b7c66dbc2ce Mon Sep 17 00:00:00 2001 From: jianhao.cen Date: Mon, 7 Jul 2025 17:47:19 +0800 Subject: [PATCH] SNManage commit --- pom.xml | 8 ++------ src/main/java/com/ectrip/demo/SNManageApplication.java | 16 ++++++++++++++++ src/main/java/com/ectrip/demo/controller/SNController.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/ectrip/demo/dto/AddSNsDTO.java | 24 ++++++++++++++++++++++++ src/main/java/com/ectrip/demo/dto/DeleteSNsDTO.java | 17 +++++++++++++++++ src/main/java/com/ectrip/demo/exception/SNRepetitiveException.java | 11 +++++++++++ src/main/java/com/ectrip/demo/service/SNService.java | 35 +++++++++++++++++++++++++++++++++++ src/main/java/com/ectrip/demo/service/impl/SNServiceImpl.java | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/ectrip/demo/util/HttpResult.java | 40 ++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/demo/SNManageApplication.java | 17 ----------------- src/main/java/com/example/demo/controller/SNController.java | 94 ---------------------------------------------------------------------------------------------- src/main/java/com/example/demo/dto/AddSNsDTO.java | 24 ------------------------ src/main/java/com/example/demo/dto/DeleteSNsDTO.java | 17 ----------------- src/main/java/com/example/demo/exception/SNRepetitiveException.java | 11 ----------- src/main/java/com/example/demo/service/SNService.java | 36 ------------------------------------ src/main/java/com/example/demo/service/impl/SNServiceImpl.java | 171 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/main/java/com/example/demo/util/HttpResult.java | 40 ---------------------------------------- src/main/resources/log4j2.xml | 2 +- src/main/resources/sn/SN.txt | 4 +++- src/main/resources/sn/SNTemp.txt | 3 +++ 20 files changed, 420 insertions(+), 418 deletions(-) create mode 100644 src/main/java/com/ectrip/demo/SNManageApplication.java create mode 100644 src/main/java/com/ectrip/demo/controller/SNController.java create mode 100644 src/main/java/com/ectrip/demo/dto/AddSNsDTO.java create mode 100644 src/main/java/com/ectrip/demo/dto/DeleteSNsDTO.java create mode 100644 src/main/java/com/ectrip/demo/exception/SNRepetitiveException.java create mode 100644 src/main/java/com/ectrip/demo/service/SNService.java create mode 100644 src/main/java/com/ectrip/demo/service/impl/SNServiceImpl.java create mode 100644 src/main/java/com/ectrip/demo/util/HttpResult.java delete mode 100644 src/main/java/com/example/demo/SNManageApplication.java delete mode 100644 src/main/java/com/example/demo/controller/SNController.java delete mode 100644 src/main/java/com/example/demo/dto/AddSNsDTO.java delete mode 100644 src/main/java/com/example/demo/dto/DeleteSNsDTO.java delete mode 100644 src/main/java/com/example/demo/exception/SNRepetitiveException.java delete mode 100644 src/main/java/com/example/demo/service/SNService.java delete mode 100644 src/main/java/com/example/demo/service/impl/SNServiceImpl.java delete mode 100644 src/main/java/com/example/demo/util/HttpResult.java diff --git a/pom.xml b/pom.xml index 53f02d6..96078f5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.haoge - SNManageDemo + com.ectrip + SNManage 1.0 @@ -33,10 +33,6 @@ test - org.springframework.boot - spring-boot-starter-thymeleaf - - io.springfox springfox-swagger2 2.7.0 diff --git a/src/main/java/com/ectrip/demo/SNManageApplication.java b/src/main/java/com/ectrip/demo/SNManageApplication.java new file mode 100644 index 0000000..b479346 --- /dev/null +++ b/src/main/java/com/ectrip/demo/SNManageApplication.java @@ -0,0 +1,16 @@ +package com.ectrip.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + + +@SpringBootApplication +@EnableSwagger2 +public class SNManageApplication { + + public static void main(String[] args) { + SpringApplication.run(SNManageApplication.class, args); + } + +} diff --git a/src/main/java/com/ectrip/demo/controller/SNController.java b/src/main/java/com/ectrip/demo/controller/SNController.java new file mode 100644 index 0000000..30bd00a --- /dev/null +++ b/src/main/java/com/ectrip/demo/controller/SNController.java @@ -0,0 +1,90 @@ +package com.ectrip.demo.controller; + +import com.ectrip.demo.util.HttpResult; +import com.ectrip.demo.dto.AddSNsDTO; +import com.ectrip.demo.dto.DeleteSNsDTO; +import com.ectrip.demo.exception.SNRepetitiveException; +import com.ectrip.demo.service.SNService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@Api(tags = "SN操作") +@RestController +@RequestMapping("/sn") +public class SNController { + static Logger logger = LogManager.getLogger(SNController.class); + + @Autowired + SNService snService; + +// @ApiOperation("首页") +// @GetMapping("/index.html") +// public String index() { +// return "Index"; +// } + + @ApiOperation("添加SN") + @PostMapping("/add_sn") + @ResponseBody + public HttpResult addSN(@RequestBody @Valid AddSNsDTO addSNsDTO) { + + try { + snService.addSN(addSNsDTO); + return HttpResult.success("添加成功"); + } catch (SNRepetitiveException e) { + return HttpResult.fail(e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + return HttpResult.fail(); + } + + } + + +// @ApiOperation("获取全部SN") +// @GetMapping("/get_SNs") +// @ResponseBody +// public void getSNs(HttpServletRequest request, HttpServletResponse response) { +// try { +// snService.downloadSNFile(request, response); +// } catch (Exception e) { +// response.setStatus(500); +// } +// +// } + + @ApiOperation("获取全部base64加密后的SN") + @GetMapping("/get_sn") + @ResponseBody + public HttpResult getBase64SNs() { + try { + return HttpResult.success("",snService.getEncryptSNs()); + } catch (Exception e) { + logger.error(e.getMessage()); + return HttpResult.fail("服务器异常"); + } + + } + + @ApiOperation("删除指定SN") + @PostMapping("/delete_sn") + @ResponseBody + public HttpResult deleteSN(@RequestBody @Valid DeleteSNsDTO deleteSNsDTO) { + try { + snService.deleteSN(deleteSNsDTO); + return HttpResult.success("删除成功!"); + } + catch (Exception e) { + logger.error(e.getMessage()); + return HttpResult.fail("服务器异常!"); + } + } + + +} diff --git a/src/main/java/com/ectrip/demo/dto/AddSNsDTO.java b/src/main/java/com/ectrip/demo/dto/AddSNsDTO.java new file mode 100644 index 0000000..5b9f242 --- /dev/null +++ b/src/main/java/com/ectrip/demo/dto/AddSNsDTO.java @@ -0,0 +1,24 @@ +package com.ectrip.demo.dto; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +@Data +@ApiModel(description = "删除SNs入参") +public class AddSNsDTO { + + @ApiModelProperty(value = "项目名称") + @NotBlank(message = "项目名称不能为空!") + private String projectName; + + @ApiModelProperty(value = "设备码") + @NotNull(message = "设备码不能为空!") + private ArrayList sns; +} diff --git a/src/main/java/com/ectrip/demo/dto/DeleteSNsDTO.java b/src/main/java/com/ectrip/demo/dto/DeleteSNsDTO.java new file mode 100644 index 0000000..707ce1f --- /dev/null +++ b/src/main/java/com/ectrip/demo/dto/DeleteSNsDTO.java @@ -0,0 +1,17 @@ +package com.ectrip.demo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +@Data +@ApiModel(description = "删除SNs入参") +public class DeleteSNsDTO { + @ApiModelProperty(value = "设备码") + @NotNull(message = "设备码不能为空!") + private ArrayList sns; +} diff --git a/src/main/java/com/ectrip/demo/exception/SNRepetitiveException.java b/src/main/java/com/ectrip/demo/exception/SNRepetitiveException.java new file mode 100644 index 0000000..0be5e56 --- /dev/null +++ b/src/main/java/com/ectrip/demo/exception/SNRepetitiveException.java @@ -0,0 +1,11 @@ +package com.ectrip.demo.exception; + +public class SNRepetitiveException extends Exception{ + + public SNRepetitiveException() {} + + public SNRepetitiveException(String message) { + super(message); + } + +} diff --git a/src/main/java/com/ectrip/demo/service/SNService.java b/src/main/java/com/ectrip/demo/service/SNService.java new file mode 100644 index 0000000..d19f438 --- /dev/null +++ b/src/main/java/com/ectrip/demo/service/SNService.java @@ -0,0 +1,35 @@ +package com.ectrip.demo.service; + +import com.ectrip.demo.dto.AddSNsDTO; +import com.ectrip.demo.dto.DeleteSNsDTO; +import com.ectrip.demo.exception.SNRepetitiveException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public interface SNService { + /** + * 新增SN号 + * @param addSNsDTO SN号 + */ + void addSN(AddSNsDTO addSNsDTO) throws SNRepetitiveException, IOException; + + /** + * 下载所有SN号 + */ + void downloadSNFile(HttpServletRequest request, HttpServletResponse response) throws IOException; + + /** + * 获取所有加密后的SN字符串 + * @return - + */ + String getEncryptSNs() throws IOException; + + /** + * 删除指定SN记录 + * @param deleteSNsDTO SN号 + */ + void deleteSN(DeleteSNsDTO deleteSNsDTO) throws Exception; + +} diff --git a/src/main/java/com/ectrip/demo/service/impl/SNServiceImpl.java b/src/main/java/com/ectrip/demo/service/impl/SNServiceImpl.java new file mode 100644 index 0000000..a76a23f --- /dev/null +++ b/src/main/java/com/ectrip/demo/service/impl/SNServiceImpl.java @@ -0,0 +1,178 @@ +package com.ectrip.demo.service.impl; + +import cn.hutool.core.codec.Base64; +import com.ectrip.demo.dto.DeleteSNsDTO; +import com.ectrip.demo.service.SNService; +import com.ectrip.demo.dto.AddSNsDTO; +import com.ectrip.demo.exception.SNRepetitiveException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Service +public class SNServiceImpl implements SNService { + /** + * 多线程改写文件存在并发问题,需加锁操作 + */ + private static final Lock lock = new ReentrantLock(); + + static Logger logger = LogManager.getLogger(SNServiceImpl.class); + + @Value("${SN.file.path}") + String SNFilePath; + + @Value("${SN.file.temp.path}") + String SNTempFilePath; + + @Override + public void addSN(AddSNsDTO addSNsDTO) throws SNRepetitiveException, IOException { + + //加try,catch只为释放锁 + try { + //加锁 + lock.lock(); + logger.info("-----------------------------开始添加SNs-----------------------------"); + StringBuilder SNs = new StringBuilder(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String currTime = sdf.format(new Date()); + //读取文件,判断SN是否重复 + Set set = new HashSet<>(); + Reader reader = new InputStreamReader(Files.newInputStream(Paths.get(SNFilePath)),StandardCharsets.UTF_8); + BufferedReader bufferedReader = new BufferedReader(reader); + String br; + while ((br=bufferedReader.readLine()) != null) { + //截取SN + int index = br.indexOf("##"); + String SN = br.substring(0,index == -1? 0 : index); + set.add(SN); + } + for (String SN : addSNsDTO.getSns()) { + if (set.contains(SN)) { + throw new SNRepetitiveException("SN:" + SN + " 已存在,请勿重复添加"); + } + SNs.append(SN).append("##").append(addSNsDTO.getProjectName()).append("##").append(currTime); + SNs.append(System.lineSeparator()); + } + + + //写入 + FileOutputStream fileOutputStream = new FileOutputStream(SNFilePath,true); + fileOutputStream.write(SNs.toString().getBytes(StandardCharsets.UTF_8)); + fileOutputStream.flush(); + fileOutputStream.close(); + logger.info("成功写入SNs:{}",SNs); + } finally { //释放锁 + lock.unlock(); + } + } + + @Override + public String getEncryptSNs() throws IOException { + //读取文件 + Reader reader = new InputStreamReader(Files.newInputStream(Paths.get(SNFilePath)),StandardCharsets.UTF_8); + char[] chars = new char[1000]; + StringBuilder builder = new StringBuilder(); + int len = reader.read(chars); + while (len != -1) { + builder.append(chars,0,len); + len = reader.read(chars); + } + + //加密 + return Base64.encode(builder.toString()); + } + + @Override + public void deleteSN(DeleteSNsDTO deleteSNsDTO) throws Exception{ + try { + lock.lock(); + logger.info("-----------------------------开始删除SNs-----------------------------"); + + HashSet deleteSNsSet = new HashSet<>(deleteSNsDTO.getSns()); + + //读取文件,记录不用删除的数据 + Reader reader = new InputStreamReader(Files.newInputStream(new File(SNFilePath).toPath()), StandardCharsets.UTF_8); + BufferedReader bufferedReader = new BufferedReader(reader); + String br; + StringBuilder stringBuilder = new StringBuilder(); + StringBuilder existSNs = new StringBuilder(); + //所要删除的SN是否存在 + boolean SNExist = false; + while ((br=bufferedReader.readLine()) != null) { + //截取SN + int index = br.indexOf("##"); + String str = br.substring(0,index == -1? 0 : index); + if (!deleteSNsSet.contains(str)) { + stringBuilder.append(br); + stringBuilder.append(System.lineSeparator()); + } else { + existSNs.append(br).append(System.lineSeparator()); + SNExist = true; + } + } + bufferedReader.close(); + + //如果存在要删除的SN,先将数据备份,再将留存数据覆盖掉原SN文件。 + if (SNExist) { + //备份数据 + FileOutputStream tempFileOutputStream = new FileOutputStream(SNTempFilePath); + tempFileOutputStream.write(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); + tempFileOutputStream.flush(); + tempFileOutputStream.close(); + //覆盖掉原来的数据到SN文件中 + FileOutputStream fileOutputStream = new FileOutputStream(SNFilePath); + fileOutputStream.write(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); + fileOutputStream.flush(); + fileOutputStream.close(); + logger.warn("成功删除SNs:{}",existSNs); + } + + logger.info("-----------------------------结束删除SNs-----------------------------"); + + + } finally { + lock.unlock(); + } + } + + @Override + public void downloadSNFile(HttpServletRequest request, HttpServletResponse response) throws IOException { + File file = new File(SNFilePath); + + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-type","application/octet-stream;charset=UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(file.getName().trim(), "UTF-8")); + response.addHeader("Pargam", "no-cache"); + response.addHeader("Cache-Control", "no-cache"); + + //读取文件 + byte[] SNsByteArr = new byte[(int) file.length()]; + FileInputStream fileInputStream = new FileInputStream(file); + fileInputStream.read(SNsByteArr); + //加密 + String encodeSNs = Base64.encode(SNsByteArr); + + //写入到输出流 + response.addHeader("Content-Length",String.valueOf(encodeSNs.getBytes().length)); + OutputStream outputStream = response.getOutputStream(); + outputStream.write(encodeSNs.getBytes()); + outputStream.flush(); + outputStream.close(); + + } + +} diff --git a/src/main/java/com/ectrip/demo/util/HttpResult.java b/src/main/java/com/ectrip/demo/util/HttpResult.java new file mode 100644 index 0000000..6b61af8 --- /dev/null +++ b/src/main/java/com/ectrip/demo/util/HttpResult.java @@ -0,0 +1,40 @@ +package com.ectrip.demo.util; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class HttpResult implements Serializable { + public static final int CODE_SUCCESS = 200; + public static final int CODE_FAILED = 500; + + private Integer code; + + private String message; + + private T data; + + public static HttpResult success() { + return new HttpResult<>(200,"success",null); + } + + public static HttpResult success(String message) { + return new HttpResult<>(200,message,null); + } + + public static HttpResult success(String message, T data) { + return new HttpResult<>(200,message,data); + } + + public static HttpResult fail() { + return new HttpResult<>(500,"fail",null); + } + public static HttpResult fail(String message) { + return new HttpResult<>(500,message,null); + } +} diff --git a/src/main/java/com/example/demo/SNManageApplication.java b/src/main/java/com/example/demo/SNManageApplication.java deleted file mode 100644 index 211b750..0000000 --- a/src/main/java/com/example/demo/SNManageApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.demo; - -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - - -@SpringBootApplication -@EnableSwagger2 -public class SNManageApplication { - - public static void main(String[] args) { - SpringApplication.run(SNManageApplication.class, args); - } - -} diff --git a/src/main/java/com/example/demo/controller/SNController.java b/src/main/java/com/example/demo/controller/SNController.java deleted file mode 100644 index 20ada19..0000000 --- a/src/main/java/com/example/demo/controller/SNController.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.example.demo.controller; - -import com.example.demo.dto.AddSNsDTO; -import com.example.demo.dto.DeleteSNsDTO; -import com.example.demo.exception.SNRepetitiveException; -import com.example.demo.service.SNService; -import com.example.demo.util.HttpResult; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; - -@Api(tags = "SN操作") -@RestController -@RequestMapping("/sn") -public class SNController { - static Logger logger = LogManager.getLogger(SNController.class); - - @Autowired - SNService snService; - -// @ApiOperation("首页") -// @GetMapping("/index.html") -// public String index() { -// return "Index"; -// } - - @ApiOperation("添加SN") - @PostMapping("/add_sn") - @ResponseBody - public HttpResult addSN(@RequestBody @Valid AddSNsDTO addSNsDTO) { - - try { - snService.addSN(addSNsDTO); - return HttpResult.success("添加成功"); - } catch (SNRepetitiveException e) { - return HttpResult.fail(e.getMessage()); - } catch (Exception e) { - logger.error(e.getMessage()); - return HttpResult.fail(); - } - - } - - -// @ApiOperation("获取全部SN") -// @GetMapping("/get_SNs") -// @ResponseBody -// public void getSNs(HttpServletRequest request, HttpServletResponse response) { -// try { -// snService.downloadSNFile(request, response); -// } catch (Exception e) { -// response.setStatus(500); -// } -// -// } - - @ApiOperation("获取全部base64加密后的SN") - @GetMapping("/get_sn") - @ResponseBody - public HttpResult getBase64SNs() { - try { - return HttpResult.success("",snService.getEncryptSNs()); - } catch (Exception e) { - logger.error(e.getMessage()); - return HttpResult.fail("服务器异常"); - } - - } - - @ApiOperation("删除指定SN") - @PostMapping("/delete_sn") - @ResponseBody - public HttpResult deleteSN(@RequestBody @Valid DeleteSNsDTO deleteSNsDTO) { - try { - snService.deleteSN(deleteSNsDTO); - return HttpResult.success("删除成功!"); - } - catch (Exception e) { - logger.error(e.getMessage()); - return HttpResult.fail("服务器异常!"); - } - } - - -} diff --git a/src/main/java/com/example/demo/dto/AddSNsDTO.java b/src/main/java/com/example/demo/dto/AddSNsDTO.java deleted file mode 100644 index 7c2c6eb..0000000 --- a/src/main/java/com/example/demo/dto/AddSNsDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.demo.dto; - - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.util.ArrayList; -import java.util.List; - -@Data -@ApiModel(description = "删除SNs入参") -public class AddSNsDTO { - - @ApiModelProperty(value = "项目名称") - @NotBlank(message = "项目名称不能为空!") - private String projectName; - - @ApiModelProperty(value = "设备码") - @NotNull(message = "设备码不能为空!") - private ArrayList sns; -} diff --git a/src/main/java/com/example/demo/dto/DeleteSNsDTO.java b/src/main/java/com/example/demo/dto/DeleteSNsDTO.java deleted file mode 100644 index 20c7657..0000000 --- a/src/main/java/com/example/demo/dto/DeleteSNsDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.demo.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.ArrayList; -import java.util.List; - -@Data -@ApiModel(description = "删除SNs入参") -public class DeleteSNsDTO { - @ApiModelProperty(value = "设备码") - @NotNull(message = "设备码不能为空!") - private ArrayList sns; -} diff --git a/src/main/java/com/example/demo/exception/SNRepetitiveException.java b/src/main/java/com/example/demo/exception/SNRepetitiveException.java deleted file mode 100644 index 4299727..0000000 --- a/src/main/java/com/example/demo/exception/SNRepetitiveException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.demo.exception; - -public class SNRepetitiveException extends Exception{ - - public SNRepetitiveException() {} - - public SNRepetitiveException(String message) { - super(message); - } - -} diff --git a/src/main/java/com/example/demo/service/SNService.java b/src/main/java/com/example/demo/service/SNService.java deleted file mode 100644 index 570ef6a..0000000 --- a/src/main/java/com/example/demo/service/SNService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.example.demo.service; - -import com.example.demo.dto.AddSNsDTO; -import com.example.demo.dto.DeleteSNsDTO; -import com.example.demo.exception.SNRepetitiveException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.FileNotFoundException; -import java.io.IOException; - -public interface SNService { - /** - * 新增SN号 - * @param addSNsDTO SN号 - */ - void addSN(AddSNsDTO addSNsDTO) throws SNRepetitiveException, IOException; - - /** - * 下载所有SN号 - */ - void downloadSNFile(HttpServletRequest request, HttpServletResponse response) throws IOException; - - /** - * 获取所有加密后的SN字符串 - * @return - - */ - String getEncryptSNs() throws IOException; - - /** - * 删除指定SN记录 - * @param deleteSNsDTO SN号 - */ - void deleteSN(DeleteSNsDTO deleteSNsDTO) throws Exception; - -} diff --git a/src/main/java/com/example/demo/service/impl/SNServiceImpl.java b/src/main/java/com/example/demo/service/impl/SNServiceImpl.java deleted file mode 100644 index 9fcd65e..0000000 --- a/src/main/java/com/example/demo/service/impl/SNServiceImpl.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.example.demo.service.impl; - -import cn.hutool.core.codec.Base64; -import com.example.demo.controller.SNController; -import com.example.demo.dto.AddSNsDTO; -import com.example.demo.dto.DeleteSNsDTO; -import com.example.demo.exception.SNRepetitiveException; -import com.example.demo.service.SNService; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -@Service -public class SNServiceImpl implements SNService { - /** - * 多线程改写文件存在并发问题,需加锁操作 - */ - private static final Lock lock = new ReentrantLock(); - - static Logger logger = LogManager.getLogger(SNServiceImpl.class); - - @Value("${SN.file.path}") - String SNFilePath; - - @Value("${SN.file.temp.path}") - String SNTempFilePath; - - @Override - public void addSN(AddSNsDTO addSNsDTO) throws SNRepetitiveException, IOException { - - //加try,catch只为释放锁 - try { - //加锁 - lock.lock(); - logger.info("-----------------------------开始添加SNs-----------------------------"); - StringBuilder SNs = new StringBuilder(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String currTime = sdf.format(new Date()); - //读取文件,判断SN是否重复 - Set set = new HashSet<>(); - BufferedReader bufferedReader = new BufferedReader(new FileReader(SNFilePath)); - String br; - while ((br=bufferedReader.readLine()) != null) { - //截取SN - int index = br.indexOf('#'); - String SN = br.substring(0,index == -1? 0 : index); - set.add(SN); - } - for (String SN : addSNsDTO.getSns()) { - if (set.contains(SN)) { - throw new SNRepetitiveException("SN:" + SN + " 已存在,请勿重复添加"); - } - SNs.append(SN).append("##").append(addSNsDTO.getProjectName()).append("##").append(currTime); - SNs.append(System.lineSeparator()); - } - - - //写入 - FileWriter fileWriter = new FileWriter(SNFilePath,true); - fileWriter.write(SNs.toString()); - fileWriter.flush(); - fileWriter.close(); - logger.info("-----------------------------结束添加SNs-----------------------------"); - } finally { //释放锁 - lock.unlock(); - } - } - - @Override - public String getEncryptSNs() throws IOException { - File file = new File(SNFilePath); - //读取文件 - byte[] SNsByteArr = new byte[(int) file.length()]; - FileInputStream fileInputStream = new FileInputStream(file); - fileInputStream.read(SNsByteArr); - //加密 - String encodeSNs = Base64.encode(SNsByteArr); - - return encodeSNs; - } - - @Override - public void deleteSN(DeleteSNsDTO deleteSNsDTO) throws Exception{ - try { - lock.lock(); - logger.info("-----------------------------开始删除SNs-----------------------------"); - - HashSet deleteSNsSet = new HashSet<>(deleteSNsDTO.getSns()); - - //读取文件,记录不用删除的数据 - BufferedReader bufferedReader = new BufferedReader(new FileReader(SNFilePath)); - String br; - StringBuilder stringBuilder = new StringBuilder(); - StringBuilder existSNs = new StringBuilder(); - //所要删除的SN是否存在 - boolean SNExist = false; - while ((br=bufferedReader.readLine()) != null) { - //截取SN - int index = br.indexOf('#'); - String str = br.substring(0,index == -1? 0 : index); - if (!deleteSNsSet.contains(str)) { - stringBuilder.append(br); - stringBuilder.append(System.lineSeparator()); - } else { - existSNs.append(str).append("、"); - SNExist = true; - } - } - bufferedReader.close(); - - //如果存在要删除的SN,先将数据备份,再将留存数据覆盖掉原SN文件,避免数据写一半断电丢失。 - if (SNExist) { - //备份数据 - FileWriter SNTempfileWriter = new FileWriter(SNTempFilePath); - SNTempfileWriter.write(stringBuilder.toString()); - SNTempfileWriter.flush(); - SNTempfileWriter.close(); - //覆盖掉原来的数据到SN文件中 - FileWriter SNfileWriter = new FileWriter(SNFilePath); - SNfileWriter.write(stringBuilder.toString()); - SNfileWriter.flush(); - SNfileWriter.close(); - - } - logger.warn("成功删除SNs:{}",existSNs); - logger.info("-----------------------------结束删除SNs-----------------------------"); - - - } finally { - lock.unlock(); - } - } - - @Override - public void downloadSNFile(HttpServletRequest request, HttpServletResponse response) throws IOException { - File file = new File(SNFilePath); - - response.setCharacterEncoding("UTF-8"); - response.setHeader("Content-type","application/octet-stream;charset=UTF-8"); - response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(file.getName().trim(), "UTF-8")); - response.addHeader("Pargam", "no-cache"); - response.addHeader("Cache-Control", "no-cache"); - - //读取文件 - byte[] SNsByteArr = new byte[(int) file.length()]; - FileInputStream fileInputStream = new FileInputStream(file); - fileInputStream.read(SNsByteArr); - //加密 - String encodeSNs = Base64.encode(SNsByteArr); - - //写入到输出流 - response.addHeader("Content-Length",String.valueOf(encodeSNs.getBytes().length)); - OutputStream outputStream = response.getOutputStream(); - outputStream.write(encodeSNs.getBytes()); - outputStream.flush(); - outputStream.close(); - - } - -} diff --git a/src/main/java/com/example/demo/util/HttpResult.java b/src/main/java/com/example/demo/util/HttpResult.java deleted file mode 100644 index 3ae4f6c..0000000 --- a/src/main/java/com/example/demo/util/HttpResult.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.example.demo.util; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class HttpResult implements Serializable { - public static final int CODE_SUCCESS = 200; - public static final int CODE_FAILED = 500; - - private Integer code; - - private String message; - - private T data; - - public static HttpResult success() { - return new HttpResult<>(200,"success",null); - } - - public static HttpResult success(String message) { - return new HttpResult<>(200,message,null); - } - - public static HttpResult success(String message, T data) { - return new HttpResult<>(200,message,data); - } - - public static HttpResult fail() { - return new HttpResult<>(500,"fail",null); - } - public static HttpResult fail(String message) { - return new HttpResult<>(500,message,null); - } -} diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index abe7140..0b1296d 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -56,7 +56,7 @@ - + diff --git a/src/main/resources/sn/SN.txt b/src/main/resources/sn/SN.txt index 8b13789..7e6fc04 100644 --- a/src/main/resources/sn/SN.txt +++ b/src/main/resources/sn/SN.txt @@ -1 +1,3 @@ - +sn6##项目2##2024-03-20 19:22:17 +sn7##项目2##2024-03-20 19:22:17 +sn8##项目2##2024-03-20 19:22:17 diff --git a/src/main/resources/sn/SNTemp.txt b/src/main/resources/sn/SNTemp.txt index e69de29..7e6fc04 100644 --- a/src/main/resources/sn/SNTemp.txt +++ b/src/main/resources/sn/SNTemp.txt @@ -0,0 +1,3 @@ +sn6##项目2##2024-03-20 19:22:17 +sn7##项目2##2024-03-20 19:22:17 +sn8##项目2##2024-03-20 19:22:17 -- libgit2 0.21.4