Commit 9f87bedef77ebf74f6a18c655d446edcfd4dac16

Authored by 岑健浩
0 parents

SNManage init

.gitignore 0 → 100644
  1 +++ a/.gitignore
  1 +target/
  2 +!.mvn/wrapper/maven-wrapper.jar
  3 +!**/src/main/**/target/
  4 +!**/src/test/**/target/
  5 +
  6 +### IntelliJ IDEA ###
  7 +.idea/
  8 +
  9 +### Eclipse ###
  10 +.apt_generated
  11 +.classpath
  12 +.factorypath
  13 +.project
  14 +.settings
  15 +.springBeans
  16 +.sts4-cache
  17 +
  18 +### NetBeans ###
  19 +/nbproject/private/
  20 +/nbbuild/
  21 +/dist/
  22 +/nbdist/
  23 +/.nb-gradle/
  24 +build/
  25 +!**/src/main/**/build/
  26 +!**/src/test/**/build/
  27 +
  28 +### VS Code ###
  29 +.vscode/
  30 +
  31 +### Mac OS ###
  32 +.DS_Store
0 33 \ No newline at end of file
... ...
README.md 0 → 100644
  1 +++ a/README.md
  1 +**配置SN文件路径:**
  2 +在resources下设置**application.properties**文件中的**SN.file.path**属性(该属性是存储SN的文件的路径,文件格式是txt,例:D:/temp/SN.txt)
  3 +以及设置**SN.file.temp.path**属性(该属性是SN备份文件的路径,文件格式是txt,例:D:/temp/SNTemp.txt)
  4 +
  5 +**配置日志文件路径:**
  6 +在resources下设置**log4j2.xml**文件中"Property name="baseDir" value="./log"/"标签内的value值(该值为存储日志文件的文件夹路径,例:D:/temp/log)
... ...
pom.xml 0 → 100644
  1 +++ a/pom.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
  3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5 + <modelVersion>4.0.0</modelVersion>
  6 +
  7 + <groupId>com.haoge</groupId>
  8 + <artifactId>SNManageDemo</artifactId>
  9 + <version>1.0</version>
  10 +
  11 + <properties>
  12 +
  13 + </properties>
  14 +
  15 +
  16 + <parent>
  17 + <groupId>org.springframework.boot</groupId>
  18 + <artifactId>spring-boot-starter-parent</artifactId>
  19 + <version>2.3.1.RELEASE</version>
  20 + <relativePath/>
  21 + </parent>
  22 +
  23 + <dependencies>
  24 + <!--springboot启动类依赖导入-->
  25 + <dependency>
  26 + <groupId>org.springframework.boot</groupId>
  27 + <artifactId>spring-boot-starter-web</artifactId>
  28 + </dependency>
  29 + <!--junit5-->
  30 + <dependency>
  31 + <groupId>org.springframework.boot</groupId>
  32 + <artifactId>spring-boot-starter-test</artifactId>
  33 + <scope>test</scope>
  34 + </dependency>
  35 + <dependency>
  36 + <groupId>org.springframework.boot</groupId>
  37 + <artifactId>spring-boot-starter-thymeleaf</artifactId>
  38 + </dependency>
  39 + <dependency>
  40 + <groupId>io.springfox</groupId>
  41 + <artifactId>springfox-swagger2</artifactId>
  42 + <version>2.7.0</version>
  43 + </dependency>
  44 + <dependency>
  45 + <groupId>io.springfox</groupId>
  46 + <artifactId>springfox-swagger-ui</artifactId>
  47 + <version>2.7.0</version>
  48 + </dependency>
  49 + <!--hutool工具类-->
  50 + <dependency>
  51 + <groupId>cn.hutool</groupId>
  52 + <artifactId>hutool-http</artifactId>
  53 + <version>4.1.14</version>
  54 + </dependency>
  55 + <dependency>
  56 + <groupId>org.projectlombok</groupId>
  57 + <artifactId>lombok</artifactId>
  58 + <version>1.16.10</version>
  59 + </dependency>
  60 + <!--排除springboot自带的日志依赖-->
  61 + <dependency>
  62 + <groupId>org.springframework.boot</groupId>
  63 + <artifactId>spring-boot-starter</artifactId>
  64 + <exclusions>
  65 + <exclusion>
  66 + <groupId>org.springframework.boot</groupId>
  67 + <artifactId>spring-boot-starter-logging</artifactId>
  68 + </exclusion>
  69 + </exclusions>
  70 + </dependency>
  71 + <!--导入log4j2日志依赖-->
  72 + <dependency>
  73 + <groupId>org.springframework.boot</groupId>
  74 + <artifactId>spring-boot-starter-log4j2</artifactId>
  75 + </dependency>
  76 +
  77 +
  78 + </dependencies>
  79 +
  80 + <build>
  81 +
  82 + <resources>
  83 + <resource>
  84 + <directory>src/main/java</directory>
  85 + <includes>
  86 + <include>**/*.xml</include>
  87 + </includes>
  88 + </resource>
  89 + <resource>
  90 + <directory>src/main/resources</directory>
  91 + <includes>
  92 + <include>**/*.*</include>
  93 + </includes>
  94 + </resource>
  95 + </resources>
  96 + </build>
  97 +
  98 +</project>
0 99 \ No newline at end of file
... ...
src/main/java/com/example/demo/SNManageApplication.java 0 → 100644
  1 +++ a/src/main/java/com/example/demo/SNManageApplication.java
  1 +package com.example.demo;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +import springfox.documentation.swagger2.annotations.EnableSwagger2;
  6 +
  7 +
  8 +@SpringBootApplication
  9 +@EnableSwagger2
  10 +public class SNManageApplication {
  11 +
  12 + public static void main(String[] args) {
  13 + SpringApplication.run(SNManageApplication.class, args);
  14 + }
  15 +
  16 +}
... ...
src/main/java/com/example/demo/controller/SNController.java 0 → 100644
  1 +++ a/src/main/java/com/example/demo/controller/SNController.java
  1 +package com.example.demo.controller;
  2 +
  3 +import com.example.demo.exception.SNRepetitiveException;
  4 +import com.example.demo.service.SNService;
  5 +import com.example.demo.util.HttpResult;
  6 +import io.swagger.annotations.Api;
  7 +import io.swagger.annotations.ApiOperation;
  8 +import org.apache.logging.log4j.LogManager;
  9 +import org.apache.logging.log4j.Logger;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.stereotype.Controller;
  12 +import org.springframework.web.bind.annotation.*;
  13 +
  14 +import javax.servlet.http.HttpServletRequest;
  15 +import javax.servlet.http.HttpServletResponse;
  16 +import java.io.IOException;
  17 +
  18 +@Api(tags = "SN操作")
  19 +@Controller
  20 +public class SNController {
  21 + static Logger logger = LogManager.getLogger(SNController.class);
  22 +
  23 + @Autowired
  24 + SNService snService;
  25 +
  26 + @ApiOperation("首页")
  27 + @GetMapping("/index.html")
  28 + public String index() {
  29 + return "Index";
  30 + }
  31 +
  32 + @ApiOperation("添加SN")
  33 + @PostMapping("/add_SN")
  34 + @ResponseBody
  35 + public HttpResult addSN(@RequestBody String SNDto) {
  36 +
  37 + try {
  38 + snService.addSN(SNDto);
  39 + return HttpResult.success("添加成功");
  40 + } catch (SNRepetitiveException e) {
  41 + return HttpResult.fail("SN已存在,请勿重复添加!");
  42 + } catch (Exception e) {
  43 + logger.error(e.getMessage());
  44 + return HttpResult.fail();
  45 + }
  46 +
  47 + }
  48 +
  49 +
  50 +// @ApiOperation("获取全部SN")
  51 +// @GetMapping("/get_SNs")
  52 +// @ResponseBody
  53 +// public void getSNs(HttpServletRequest request, HttpServletResponse response) {
  54 +// try {
  55 +// snService.downloadSNFile(request, response);
  56 +// } catch (Exception e) {
  57 +// response.setStatus(500);
  58 +// }
  59 +//
  60 +// }
  61 +
  62 + @ApiOperation("获取全部base64加密后的SN")
  63 + @GetMapping("/get_SNs")
  64 + @ResponseBody
  65 + public HttpResult<String> getBase64SNs() throws IOException {
  66 + try {
  67 + return HttpResult.success("",snService.getEncryptSNs());
  68 + } catch (Exception e) {
  69 + logger.error(e.getMessage());
  70 + return HttpResult.fail("服务器异常");
  71 + }
  72 +
  73 + }
  74 +
  75 + @ApiOperation("删除指定SN")
  76 + @PostMapping("/delete_SN")
  77 + @ResponseBody
  78 + public HttpResult deleteSN(@RequestBody String SN) {
  79 + try {
  80 + snService.deleteSN(SN);
  81 + return HttpResult.success("SN已删除或不存在!");
  82 + }
  83 + catch (Exception e) {
  84 + logger.error(e.getMessage());
  85 + return HttpResult.fail("服务器异常!");
  86 + }
  87 + }
  88 +
  89 +
  90 +}
... ...
src/main/java/com/example/demo/exception/SNRepetitiveException.java 0 → 100644
  1 +++ a/src/main/java/com/example/demo/exception/SNRepetitiveException.java
  1 +package com.example.demo.exception;
  2 +
  3 +public class SNRepetitiveException extends Exception{
  4 +
  5 + public SNRepetitiveException() {}
  6 +
  7 + public SNRepetitiveException(String message) {
  8 + super(message);
  9 + }
  10 +
  11 +}
... ...
src/main/java/com/example/demo/service/SNService.java 0 → 100644
  1 +++ a/src/main/java/com/example/demo/service/SNService.java
  1 +package com.example.demo.service;
  2 +
  3 +import com.example.demo.exception.SNRepetitiveException;
  4 +
  5 +import javax.servlet.http.HttpServletRequest;
  6 +import javax.servlet.http.HttpServletResponse;
  7 +import java.io.FileNotFoundException;
  8 +import java.io.IOException;
  9 +
  10 +public interface SNService {
  11 + /**
  12 + * 新增SN号
  13 + * @param SN SN号
  14 + */
  15 + void addSN(String SN) throws SNRepetitiveException, IOException;
  16 +
  17 + /**
  18 + * 下载所有SN号
  19 + */
  20 + void downloadSNFile(HttpServletRequest request, HttpServletResponse response) throws IOException;
  21 +
  22 + /**
  23 + * 获取所有加密后的SN字符串
  24 + * @return -
  25 + */
  26 + String getEncryptSNs() throws IOException;
  27 +
  28 + /**
  29 + * 删除指定SN记录
  30 + * @param SN SN号
  31 + */
  32 + void deleteSN(String SN) throws Exception;
  33 +
  34 +}
... ...
src/main/java/com/example/demo/service/impl/SNServiceImpl.java 0 → 100644
  1 +++ a/src/main/java/com/example/demo/service/impl/SNServiceImpl.java
  1 +package com.example.demo.service.impl;
  2 +
  3 +import cn.hutool.core.codec.Base64;
  4 +import com.example.demo.exception.SNRepetitiveException;
  5 +import com.example.demo.service.SNService;
  6 +import org.springframework.beans.factory.annotation.Value;
  7 +import org.springframework.stereotype.Service;
  8 +
  9 +import javax.servlet.http.HttpServletRequest;
  10 +import javax.servlet.http.HttpServletResponse;
  11 +import java.io.*;
  12 +import java.util.HashSet;
  13 +import java.util.Set;
  14 +import java.util.concurrent.locks.Lock;
  15 +import java.util.concurrent.locks.ReentrantLock;
  16 +
  17 +@Service
  18 +public class SNServiceImpl implements SNService {
  19 + /**
  20 + * 多线程改写文件存在并发问题,需加锁操作
  21 + */
  22 + private static final Lock lock = new ReentrantLock();
  23 +
  24 + @Value("${SN.file.path}")
  25 + String SNFilePath;
  26 +
  27 + @Value("${SN.file.temp.path}")
  28 + String SNTempFilePath;
  29 +
  30 + @Override
  31 + public void addSN(String SNDto) throws SNRepetitiveException, IOException {
  32 + //加try,catch只为释放锁
  33 + try {
  34 + //加锁
  35 + lock.lock();
  36 +
  37 + //读取文件,判断SN是否重复
  38 + Set<String> set = new HashSet<>();
  39 + BufferedReader bufferedReader = new BufferedReader(new FileReader(SNFilePath));
  40 + String br;
  41 + while ((br=bufferedReader.readLine()) != null) {
  42 + //截取SN
  43 + int index = br.indexOf('#');
  44 + String SN = br.substring(0,index == -1? 0 : index);
  45 + set.add(SN);
  46 + }
  47 +
  48 + String addSn = SNDto.substring(0,SNDto.indexOf('#'));
  49 + if (set.contains(addSn)) {
  50 + throw new SNRepetitiveException("SN:" + addSn + " 已存在,请勿重复添加");
  51 + }
  52 +
  53 + //写入
  54 + FileWriter fileWriter = new FileWriter(SNFilePath,true);
  55 + fileWriter.write(SNDto+System.lineSeparator());
  56 + fileWriter.flush();
  57 + fileWriter.close();
  58 + } finally { //释放锁
  59 + lock.unlock();
  60 + }
  61 + }
  62 +
  63 + @Override
  64 + public String getEncryptSNs() throws IOException {
  65 + File file = new File(SNFilePath);
  66 + //读取文件
  67 + byte[] SNsByteArr = new byte[(int) file.length()];
  68 + FileInputStream fileInputStream = new FileInputStream(file);
  69 + fileInputStream.read(SNsByteArr);
  70 + //加密
  71 + String encodeSNs = Base64.encode(SNsByteArr);
  72 +
  73 + return encodeSNs;
  74 + }
  75 +
  76 + @Override
  77 + public void deleteSN(String SN) throws Exception{
  78 + try {
  79 + lock.lock();
  80 +
  81 + //读取文件,记录不用删除的数据
  82 + BufferedReader bufferedReader = new BufferedReader(new FileReader(SNFilePath));
  83 + String br;
  84 + StringBuilder stringBuilder = new StringBuilder();
  85 + boolean SNExist = false;
  86 + while ((br=bufferedReader.readLine()) != null) {
  87 + //截取SN
  88 + int index = br.indexOf('#');
  89 + String str = br.substring(0,index == -1? 0 : index);
  90 + if (!SN.equals(str)) {
  91 + stringBuilder.append(br);
  92 + stringBuilder.append(System.lineSeparator());
  93 + } else {
  94 + SNExist = true;
  95 + }
  96 + }
  97 + bufferedReader.close();
  98 +
  99 + //如果存在要删除的SN,先将数据备份,再将留存数据覆盖掉原SN文件,避免数据写一半断电丢失。
  100 + if (SNExist) {
  101 + //备份数据
  102 + FileWriter SNTempfileWriter = new FileWriter(SNTempFilePath);
  103 + SNTempfileWriter.write(stringBuilder.toString());
  104 + SNTempfileWriter.flush();
  105 + SNTempfileWriter.close();
  106 + //覆盖掉原来的数据到SN文件中
  107 + FileWriter SNfileWriter = new FileWriter(SNFilePath);
  108 + SNfileWriter.write(stringBuilder.toString());
  109 + SNfileWriter.flush();
  110 + SNfileWriter.close();
  111 +
  112 + }
  113 +
  114 +
  115 + } finally {
  116 + lock.unlock();
  117 + }
  118 + }
  119 +
  120 + @Override
  121 + public void downloadSNFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
  122 + File file = new File(SNFilePath);
  123 +
  124 + response.setCharacterEncoding("UTF-8");
  125 + response.setHeader("Content-type","application/octet-stream;charset=UTF-8");
  126 + response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(file.getName().trim(), "UTF-8"));
  127 + response.addHeader("Pargam", "no-cache");
  128 + response.addHeader("Cache-Control", "no-cache");
  129 +
  130 + //读取文件
  131 + byte[] SNsByteArr = new byte[(int) file.length()];
  132 + FileInputStream fileInputStream = new FileInputStream(file);
  133 + fileInputStream.read(SNsByteArr);
  134 + //加密
  135 + String encodeSNs = Base64.encode(SNsByteArr);
  136 +
  137 + //写入到输出流
  138 + response.addHeader("Content-Length",String.valueOf(encodeSNs.getBytes().length));
  139 + OutputStream outputStream = response.getOutputStream();
  140 + outputStream.write(encodeSNs.getBytes());
  141 + outputStream.flush();
  142 + outputStream.close();
  143 +
  144 + }
  145 +
  146 +}
... ...
src/main/java/com/example/demo/util/HttpResult.java 0 → 100644
  1 +++ a/src/main/java/com/example/demo/util/HttpResult.java
  1 +package com.example.demo.util;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +import java.io.Serializable;
  8 +
  9 +@Data
  10 +@AllArgsConstructor
  11 +@NoArgsConstructor
  12 +public class HttpResult<T> implements Serializable {
  13 + public static final int CODE_SUCCESS = 200;
  14 + public static final int CODE_FAILED = 500;
  15 +
  16 + private Integer code;
  17 +
  18 + private String message;
  19 +
  20 + private T data;
  21 +
  22 + public static <T> HttpResult<T> success() {
  23 + return new HttpResult<>(200,"success",null);
  24 + }
  25 +
  26 + public static <T> HttpResult<T> success(String message) {
  27 + return new HttpResult<>(200,message,null);
  28 + }
  29 +
  30 + public static <T> HttpResult<T> success(String message, T data) {
  31 + return new HttpResult<>(200,message,data);
  32 + }
  33 +
  34 + public static <T> HttpResult<T> fail() {
  35 + return new HttpResult<>(500,"fail",null);
  36 + }
  37 + public static <T> HttpResult<T> fail(String message) {
  38 + return new HttpResult<>(500,message,null);
  39 + }
  40 +}
... ...
src/main/resources/application.properties 0 → 100644
  1 +++ a/src/main/resources/application.properties
  1 + server.port=8080
  2 +
  3 +
  4 +spring.web.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
  5 +
  6 +
  7 +logging.config=classpath:log4j2.xml
  8 +
  9 +#swagger.basic.enable = true
  10 +#swagger.basic.username = test
  11 +#swagger.basic.password = 123
  12 +
  13 +spring.thymeleaf.cache=false
  14 +spring.thymeleaf.prefix=classpath:/templates/
  15 +spring.thymeleaf.suffix=.html
  16 +
  17 +
  18 +SN.file.path=D:/temp/SN.txt
  19 +SN.file.temp.path=D:/temp/SNTemp.txt
0 20 \ No newline at end of file
... ...
src/main/resources/log4j2.xml 0 → 100644
  1 +++ a/src/main/resources/log4j2.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
  3 +<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
  4 +<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
  5 +<configuration status="WARN" monitorInterval="30">
  6 + <Properties>
  7 + <Property name="baseDir" value="D:/temp/log"/>
  8 + </Properties>
  9 + <!--先定义所有的appender-->
  10 + <appenders>
  11 + <!--这个输出控制台的配置-->
  12 + <console name="Console" target="SYSTEM_OUT">
  13 + <!--输出日志的格式-->
  14 + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  15 + </console>
  16 + <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,个这也挺有用的,适合临时测试用-->
  17 +<!-- <File name="log" fileName="${baseDir}/all.log" append="false">-->
  18 +<!-- <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
  19 +<!-- </File>-->
  20 + <!--这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
  21 + <RollingFile name="RollingFileInfo" fileName="${baseDir}/info.log"
  22 + filePattern="${baseDir}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
  23 + <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  24 + <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
  25 + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  26 + <Policies>
  27 + <TimeBasedTriggeringPolicy/>
  28 + <SizeBasedTriggeringPolicy size="100 MB"/>
  29 + </Policies>
  30 + </RollingFile>
  31 + <RollingFile name="RollingFileWarn" fileName="${baseDir}/warn.log"
  32 + filePattern="${baseDir}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
  33 + <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
  34 + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  35 + <Policies>
  36 + <TimeBasedTriggeringPolicy/>
  37 + <SizeBasedTriggeringPolicy size="100 MB"/>
  38 + </Policies>
  39 + <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
  40 + <DefaultRolloverStrategy max="20"/>
  41 + </RollingFile>
  42 + <RollingFile name="RollingFileError" fileName="${baseDir}/error.log"
  43 + filePattern="${baseDir}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
  44 + <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
  45 + <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
  46 + <Policies>
  47 + <TimeBasedTriggeringPolicy/>
  48 + <SizeBasedTriggeringPolicy size="100 MB"/>
  49 + </Policies>
  50 + </RollingFile>
  51 + </appenders>
  52 + <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
  53 + <loggers>
  54 + <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
  55 + <logger name="org.springframework" level="INFO"></logger>
  56 + <logger name="org.mybatis" level="INFO"></logger>
  57 + <root level="all">
  58 + <appender-ref ref="Console"/>
  59 +<!-- <appender-ref ref="RollingFileInfo"/>-->
  60 + <appender-ref ref="RollingFileWarn"/>
  61 + <appender-ref ref="RollingFileError"/>
  62 + </root>
  63 + </loggers>
  64 +</configuration>
0 65 \ No newline at end of file
... ...
src/main/resources/templates/Index.html 0 → 100644
  1 +++ a/src/main/resources/templates/Index.html
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<meta charset="UTF-8">
  4 +
  5 +<body>
  6 + <div>
  7 + <div>
  8 + <input type="text" placeholder="请输入SN号" id="SNContent"/>
  9 + <input type="text" placeholder="请输入项目名称" id="projectName"/>
  10 + </div>
  11 + <button id="add">添加</button>
  12 + </div>
  13 + <br/>
  14 +
  15 + <div>
  16 + <div>
  17 + <input type="text" placeholder="请输入SN号" id="SNContentDelete"/>
  18 + </div>
  19 + <button id="delete">删除</button>
  20 + </div>
  21 + <br/>
  22 +
  23 + <div>
  24 + <button id="show">获取所有</button>
  25 +
  26 + </div>
  27 + <span id="SNShow" style="display: inline-block;
  28 + width: 500px;
  29 + word-break: break-all;
  30 + white-space: normal;"></span>
  31 +
  32 + <script>
  33 + //添加
  34 + var addButton = document.getElementById("add");
  35 + addButton.onclick = function () {
  36 + let SNcontent = document.getElementById("SNContent").value.trim();
  37 + let projectName = document.getElementById("projectName").value.trim();
  38 + let dateTime = formattedDate().trim();
  39 +
  40 + //数据判空
  41 + if (typeof SNcontent === 'undefined' || SNcontent == null || SNcontent === '') {
  42 + alert("请输入SN号")
  43 + return;
  44 + }
  45 + if (typeof projectName === 'undefined' || projectName == null || projectName === '') {
  46 + alert("请输入projectName")
  47 + return;
  48 + }
  49 +
  50 + let SNDto = SNcontent + "##" + projectName + "##" +dateTime;
  51 + //ajax请求提交数据
  52 + var xhr = new XMLHttpRequest();
  53 + xhr.open('POST','/add_SN');
  54 + xhr.setRequestHeader('Content-Type','application/json')
  55 + xhr.send(SNDto);
  56 + xhr.onreadystatechange = function () {
  57 + if (xhr.readyState === XMLHttpRequest.DONE) {
  58 + let responseObject = JSON.parse(xhr.responseText);
  59 + alert(responseObject.message);
  60 + }
  61 + }
  62 + }
  63 +
  64 + //查询
  65 + var showButton = document.getElementById("show");
  66 + showButton.onclick = function () {
  67 + //ajax请求获取数据
  68 + var xhr = new XMLHttpRequest();
  69 + xhr.open('GET','/get_SNs',true);
  70 + xhr.send();
  71 + xhr.onreadystatechange = function () {
  72 +
  73 + // if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
  74 + // var blob = new Blob([this.response], {type: 'application/octet-stream'});
  75 + // var url = URL.createObjectURL(blob);
  76 + // var a = document.createElement('a');
  77 + // a.href = url;
  78 + // a.download = 'SNs.txt';
  79 + // a.target = '_blank';
  80 + // a.click();
  81 + // }
  82 + if (xhr.readyState === XMLHttpRequest.DONE) {
  83 + if (xhr.status === 200) {
  84 + let responseObject = JSON.parse(xhr.responseText);
  85 + let SNs = responseObject.data;
  86 + document.getElementById("SNShow").innerText = SNs;
  87 + } else {
  88 + document.getElementById("SNShow").innerText = "出错了!";
  89 + }
  90 + }
  91 + }
  92 +
  93 + }
  94 +
  95 + //删除
  96 + var deleteButton = document.getElementById("delete");
  97 + deleteButton.onclick = function () {
  98 + let SNContentDelete = document.getElementById("SNContentDelete").value.trim();
  99 + if (typeof SNContentDelete === 'undefined' || SNContentDelete == null || SNContentDelete === '') {
  100 + alert("请输入SN号")
  101 + return;
  102 + }
  103 +
  104 + //ajax请求获取数据
  105 + var xhr = new XMLHttpRequest();
  106 + xhr.open('POST','/delete_SN',true);
  107 + xhr.send(SNContentDelete);
  108 + xhr.onreadystatechange = function () {
  109 + if (xhr.readyState === XMLHttpRequest.DONE) {
  110 + let responseObject = JSON.parse(xhr.responseText);
  111 + alert(responseObject.message);
  112 + }
  113 + }
  114 +
  115 + }
  116 +
  117 +
  118 +
  119 + function formattedDate() {
  120 + const date = new Date();
  121 + const year = date.getFullYear();
  122 + const month = (date.getMonth() + 1).toString().padStart(2, '0');
  123 + const day = date.getDate().toString().padStart(2, '0');
  124 + const hour = date.getHours().toString().padStart(2, '0');
  125 + const minute = date.getMinutes().toString().padStart(2, '0');
  126 + const second = date.getSeconds().toString().padStart(2, '0');
  127 + const formattedDate = `${year}-${month}-${day} ${hour}:${minute}:${second}`;
  128 + return formattedDate;
  129 + }
  130 +
  131 +
  132 +
  133 +
  134 + </script>
  135 +
  136 +</body>
  137 +
  138 +
  139 +</html>
0 140 \ No newline at end of file
... ...
src/test/java/com/example/demo/SNManageApplicationTest.java 0 → 100644
  1 +++ a/src/test/java/com/example/demo/SNManageApplicationTest.java
  1 +package com.example.demo;
  2 +
  3 +import com.example.demo.service.SNService;
  4 +import org.junit.Test;
  5 +import org.junit.runner.RunWith;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.beans.factory.annotation.Value;
  8 +import org.springframework.boot.test.context.SpringBootTest;
  9 +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  10 +import org.springframework.util.StringUtils;
  11 +
  12 +import java.io.File;
  13 +import java.util.Date;
  14 +
  15 +@RunWith(SpringJUnit4ClassRunner.class)
  16 +@SpringBootTest
  17 +public class SNManageApplicationTest {
  18 + @Autowired
  19 + SNService snService;
  20 +
  21 + @Value("${SN.file.path}")
  22 + String SNFilePath;
  23 +
  24 + @Value("${SN.file.temp.path}")
  25 + String SNTempFilePath;
  26 +
  27 + @Test
  28 + public void test() throws Exception {
  29 + String encryptedSN = "c24x";
  30 + snService.deleteSN(encryptedSN);
  31 +
  32 + }
  33 +}
... ...