Browse Source

添加upload图片的接口

郭超 4 years ago
parent
commit
bd8ab2c3e6
36 changed files with 1134 additions and 135 deletions
  1. 3 0
      src/main/java/edu/nju/configuration/OSSConfiguration.java
  2. 21 4
      src/main/java/edu/nju/controller/UploadController.java
  3. 8 0
      src/main/java/edu/nju/model/enums/UploadType.java
  4. 5 3
      src/main/java/edu/nju/service/FileService.java
  5. 21 1
      src/main/java/edu/nju/service/NginxFileService.java
  6. 214 1
      src/main/java/edu/nju/service/OssFileService.java
  7. 11 0
      src/main/java/edu/nju/service/UploadService.java
  8. 34 0
      src/main/java/edu/nju/service/UploadServiceImpl.java
  9. 534 0
      src/main/java/edu/nju/util/FileUtil.java
  10. 0 0
      src/main/resources/apidoc/V1.0/.cache.json
  11. 117 117
      src/main/resources/apidoc/V1.0/apidoc.log
  12. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_AnalyzeController.html
  13. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_AnnotationController.html
  14. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ConfigurationController.html
  15. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_CrowdsourcingToReviewController.html
  16. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_DataController.html
  17. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_DeleteController.html
  18. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ExportController.html
  19. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ExtraController.html
  20. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_GraphController.html
  21. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_HistoryController.html
  22. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_NodeController.html
  23. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_OAuthController.html
  24. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_OssController.html
  25. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_RecommendController.html
  26. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_RelationController.html
  27. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ReportController.html
  28. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewAnalyzeController.html
  29. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewController.html
  30. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewJobController.html
  31. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewPaperController.html
  32. 4 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_SettingController.html
  33. 42 0
      src/main/resources/apidoc/V1.0/edu_nju_controller_UploadController.html
  34. 4 0
      src/main/resources/apidoc/V1.0/index.html
  35. 21 0
      src/main/resources/apidoc/V1.0/众测服务-V1.0-api-docs.md
  36. 15 9
      src/main/resources/application.yml

+ 3 - 0
src/main/java/edu/nju/configuration/OSSConfiguration.java

@@ -29,6 +29,9 @@ public class OSSConfiguration {
     @Value("${oss.bucketName}")
     private String bucketName;
 
+    @Value("${oss.idleConnectionTime}")
+    private String idleConnectionTime;
+
     public String getBaseUrl() {
         return "http://" + bucketName + "." + endPoint;
     }

+ 21 - 4
src/main/java/edu/nju/controller/UploadController.java

@@ -5,17 +5,16 @@ import java.io.PrintWriter;
 
 import javax.servlet.http.HttpServletResponse;
 
+import edu.nju.service.UploadService;
 import edu.nju.util.BlockChainAspect;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 import edu.nju.service.CTBService;
 import edu.nju.service.SaveService;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 上传 /upload
@@ -34,6 +33,9 @@ public class UploadController {
 	@Autowired
 	BlockChainAspect blockChainAspect;
 
+	@Autowired
+	UploadService uploadService;
+
 	/**
 	 * 上传新的Bug报告    /submit  返回具体bug报告的id
 	 * @param useCase   用例id
@@ -244,4 +246,19 @@ public class UploadController {
 			e.printStackTrace();
 		}
 	}
+
+	/**
+	 * 上传图片 /image
+	 * @param file
+	 * @param caseId
+	 * @param work_id
+	 * @return
+	 */
+	@RequestMapping(value = "/image", method = RequestMethod.POST)
+	@ResponseBody
+	public String uploadImage(MultipartFile file, String caseId, String work_id){
+		String uploadImage = uploadService.uploadImage(file, caseId, work_id);
+		System.out.println(uploadImage);
+		return uploadImage;
+	}
 }

+ 8 - 0
src/main/java/edu/nju/model/enums/UploadType.java

@@ -0,0 +1,8 @@
+package edu.nju.model.enums;
+
+/**
+ * @说明: 上传文件的类型表示,与OSS中的文件夹相对应
+ */
+public class UploadType {
+    public static final String IMAGE = "image/";
+}

+ 5 - 3
src/main/java/edu/nju/service/FileService.java

@@ -11,7 +11,9 @@ import java.util.List;
  * @Email xjwhhh233@outlook.com
  */
 public interface FileService {
-    public void uploadImage();
-    public List<BugDetail> importBugInfo(MultipartFile sourceZipFile, MultipartFile sourceJsonFile, String originalCaseId, String cpSerialNum);
-    public List<BugDetail> exportBugInfo(String caseId);
+    void uploadImage();
+    List<BugDetail> importBugInfo(MultipartFile sourceZipFile, MultipartFile sourceJsonFile, String originalCaseId, String cpSerialNum);
+    List<BugDetail> exportBugInfo(String caseId);
+
+    String sliceUploadFile(String fileName, String caseId, MultipartFile file);
 }

+ 21 - 1
src/main/java/edu/nju/service/NginxFileService.java

@@ -2,6 +2,8 @@ package edu.nju.service;
 
 import edu.nju.entities.BugDetail;
 import edu.nju.entities.Exam;
+import edu.nju.model.enums.UploadType;
+import edu.nju.util.FileUtil;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 
 import java.io.File;
@@ -88,6 +90,24 @@ public class NginxFileService implements FileService {
     }
 
     @Override
+    public String sliceUploadFile(String fileName, String caseId, MultipartFile file) {
+        String[] split = fileName.split("/");
+        String fileNameOrigin = "";
+        String fileTypePath = "";
+        if(split.length > 0){
+            fileTypePath = fileName.substring(0, fileName.lastIndexOf('/'));
+            fileNameOrigin = fileName.substring(fileName.lastIndexOf('/') + 1, fileName.length());
+        }
+
+        try {
+            return FileUtil.save(savePath + "/" + fileTypePath, file, fileNameOrigin);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
     public List<BugDetail> importBugInfo(MultipartFile sourceZipFile, MultipartFile sourceJsonFile, String originalCaseId, String cpSerialNum) {
         return saveBugDetail(sourceZipFile,sourceJsonFile,originalCaseId,cpSerialNum);
     }
@@ -267,7 +287,7 @@ public class NginxFileService implements FileService {
         exportCsv(titles, bugDetailList, caseId);
         exportJson(bugDetailList, caseId);
         //导出图片zip包
-        String sourceFile = savePath + folderName + "/image/" + caseId;
+        String sourceFile = savePath + folderName + "/" + UploadType.IMAGE + caseId;
         try {
             File dest = new File(savePath + folderName + outputName + "/imageZip/" + caseId + ".zip");
             if (!dest.getParentFile().exists()) {

+ 214 - 1
src/main/java/edu/nju/service/OssFileService.java

@@ -1,7 +1,13 @@
 package edu.nju.service;
 
+import com.aliyun.oss.ClientBuilderConfiguration;
+import com.aliyun.oss.ClientException;
+import com.aliyun.oss.OSSException;
+import com.aliyun.oss.model.*;
 import edu.nju.configuration.OSSConfiguration;
 import edu.nju.entities.BugDetail;
+import edu.nju.model.enums.UploadType;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -21,6 +27,9 @@ import java.io.*;
 import java.lang.reflect.Field;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
@@ -30,6 +39,7 @@ import java.util.zip.ZipOutputStream;
  * @Date 2021-01-04 15:53
  * @Email xjwhhh233@outlook.com
  */
+@Slf4j
 @Service
 @ConditionalOnExpression("${useOss}==true")
 public class OssFileService implements FileService {
@@ -64,6 +74,24 @@ public class OssFileService implements FileService {
 	@Autowired
 	private OSSConfiguration ossConfig;
 
+	private OSS client;
+
+	private String key;
+
+	@Value("${upload.thread.maxSize}")
+	private String uploadThreadMaxSize;
+
+	@Value("${upload.chunkSize}")
+	private String uploadChunkSize;
+
+	@Value("${upload.chunkMaxPartCount}")
+	private String uploadChunkMaxPartCount;
+
+	private ExecutorService executorService;
+
+	private List<PartETag> partETags = Collections.synchronizedList(new ArrayList<PartETag>());
+
+
 	@Value("${cpSerialNum}")
 	private String cpSerialNum;
 
@@ -96,6 +124,178 @@ public class OssFileService implements FileService {
 		return bugDetailList;
 	}
 
+	@Override
+	public String sliceUploadFile(String fileName, String caseId, MultipartFile file){
+		key = fileName;
+		executorService = Executors.newFixedThreadPool(Integer.parseInt(uploadThreadMaxSize));
+
+		ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
+		// 连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。
+		conf.setIdleConnectionTime(Long.parseLong(ossConfig.getIdleConnectionTime()));
+		client = ossConfig.ossClientConf(conf);
+
+		try {
+			// 获取文件后缀并新建一个类型为File的targetFile,用于后续MultipartFile转File
+			String prefix=fileName.substring(fileName.lastIndexOf("."));
+			final File targetFile = File.createTempFile(fileName, prefix);
+
+			// 声明一个上传ID,uploadId
+			String uploadId = claimUploadId();
+			log.info("声明一个上传ID:" + uploadId);
+
+			// 分片上传的每片的大小
+			final long partSize = Integer.parseInt(uploadChunkSize) * 1024 * 1024L;   // 5MB
+
+			// MultipartFile转成File
+			file.transferTo(targetFile);
+
+			long fileLength = targetFile.length();
+			// 计算分片的数量
+			int partCount = (int) (fileLength / partSize);
+			if (fileLength % partSize != 0) {
+				partCount++;
+			}
+			// 校验是否超过限制的最大分片数量
+			if (partCount > Integer.parseInt(uploadChunkMaxPartCount)) {
+				throw new RuntimeException("分片数量不能超过" + uploadChunkMaxPartCount);
+			} else {
+				log.info("分片数量为: " + partCount);
+			}
+
+			// 分片上传文件到OSS
+			log.info("------------开始分片上传文件到OSS------------");
+			// 重新初始化,否则会一直add导致数量不一致
+			partETags = Collections.synchronizedList(new ArrayList<PartETag>());
+			for (int i = 0; i < partCount; i++) {
+				long startPos = i * partSize;
+				long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
+				executorService.execute(new PartUploader(targetFile, startPos, curPartSize, i + 1, uploadId));
+			}
+
+			// 等待所有分片上传完成
+			executorService.shutdown();
+			while (!executorService.isTerminated()) {
+				try {
+					executorService.awaitTermination(1, TimeUnit.SECONDS);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+
+			log.info("partETags的数量:" + partETags.size());
+			// 判断是否所有的分片上传完成
+			if (partETags.size() != partCount) {
+				throw new RuntimeException("文件上传失败,由于存在部分分片未上传完成。");
+			} else {
+				log.info("----------文件分片上传成功 " + fileName + "----------");
+			}
+
+			// View all parts uploaded recently
+//            listAllParts(uploadId);
+
+			// Complete to upload multiparts
+			completeMultipartUpload(uploadId);
+
+			// Fetch the object that newly created at the step below.
+//            log.info("Fetching an object");
+//            client.getObject(new GetObjectRequest(ossConfig.getBucketName(), key), targetFile);
+			return ossConfig.getBaseUrl() + "/" + key;
+		} catch (OSSException oe) {
+			log.info("Caught an OSSException, which means your request made it to OSS, "
+					+ "but was rejected with an error response for some reason.");
+			log.info("Error Message: " + oe.getErrorMessage());
+			log.info("Error Code:       " + oe.getErrorCode());
+			log.info("Request ID:      " + oe.getRequestId());
+			log.info("Host ID:           " + oe.getHostId());
+		} catch (ClientException ce) {
+			log.info("Caught an ClientException, which means the client encountered "
+					+ "a serious internal problem while trying to communicate with OSS, "
+					+ "such as not being able to access the network.");
+			log.info("Error Message: " + ce.getMessage());
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			/*
+			 * Do not forget to shut down the client finally to release all allocated resources.
+			 */
+			if (client != null) {
+				client.shutdown();
+			}
+		}
+		return "";
+	}
+
+	private class PartUploader implements Runnable {
+
+		private File localFile;
+		private long startPos;
+		private long partSize;
+		private int partNumber;
+		private String uploadId;
+
+		public PartUploader(File localFile, long startPos, long partSize, int partNumber, String uploadId) {
+			this.localFile = localFile;
+			this.startPos = startPos;
+			this.partSize = partSize;
+			this.partNumber = partNumber;
+			this.uploadId = uploadId;
+		}
+
+		@Override
+		public void run() {
+			InputStream instream = null;
+			try {
+				instream = new FileInputStream(this.localFile);
+				instream.skip(this.startPos);
+
+				UploadPartRequest uploadPartRequest = new UploadPartRequest();
+				uploadPartRequest.setBucketName(ossConfig.getBucketName());
+				uploadPartRequest.setKey(key);
+				uploadPartRequest.setUploadId(this.uploadId);
+				uploadPartRequest.setInputStream(instream);
+				uploadPartRequest.setPartSize(this.partSize);
+				uploadPartRequest.setPartNumber(this.partNumber);
+
+				UploadPartResult uploadPartResult = client.uploadPart(uploadPartRequest);
+				log.info("分片 " + this.partNumber + " 完成");
+
+				synchronized (partETags) {
+					partETags.add(uploadPartResult.getPartETag());
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			} finally {
+				if (instream != null) {
+					try {
+						instream.close();
+					} catch (IOException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+	}
+
+	private String claimUploadId() {
+		InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(ossConfig.getBucketName(), key);
+		InitiateMultipartUploadResult result = client.initiateMultipartUpload(request);
+		return result.getUploadId();
+	}
+
+	private void completeMultipartUpload(String uploadId) {
+		// Make part numbers in ascending order
+		Collections.sort(partETags, new Comparator<PartETag>() {
+			@Override
+			public int compare(PartETag p1, PartETag p2) {
+				return p1.getPartNumber() - p2.getPartNumber();
+			}
+		});
+
+		log.info("Completing to upload multiparts");
+		CompleteMultipartUploadRequest completeMultipartUploadRequest =
+				new CompleteMultipartUploadRequest(ossConfig.getBucketName(), key, uploadId, partETags);
+		client.completeMultipartUpload(completeMultipartUploadRequest);
+	}
 
 	/**
 	 * 根据caseId获取对应bug信息
@@ -239,7 +439,7 @@ public class OssFileService implements FileService {
 					if(!"".equals(imageUrl)) {
 						String[] filePath = imageUrlStr.split("/");
 						String fileName = filePath[filePath.length - 1];
-						String newImageUrl = ossConfig.getBaseUrl() + folderName + "/image/" + originalCaseId + "/" + cpSerialNum + "/" + fileName;
+						String newImageUrl = ossConfig.getBaseUrl() + folderName + "/" + UploadType.IMAGE + originalCaseId + "/" + cpSerialNum + "/" + fileName;
 						stringBuilder.append(newImageUrl).append(",");
 					}
 				}
@@ -273,6 +473,19 @@ public class OssFileService implements FileService {
 		String jsonObjectName = folderName.substring(1) + outputName + "/"+caseId+"/"+cpSerialNum+"/" + jsonFile.getName();
 		uploadToOss(csvObjectName,csvFile);
 		uploadToOss(jsonObjectName,jsonFile);
+		//导出图片zip包
+//		String sourceFile = savePath + folderName + "/" + UploadType.IMAGE + caseId;
+//		try {
+//			File dest = new File(savePath + folderName + outputName + "/imageZip/" + caseId + ".zip");
+//			if (!dest.getParentFile().exists()) {
+//				dest.getParentFile().mkdirs();
+//			}
+//			FileOutputStream fileOutputStream = new FileOutputStream(dest);
+//			toZip(sourceFile, fileOutputStream, false);
+//			uploadToOss(jsonObjectName,jsonFile);
+//		} catch (FileNotFoundException e) {
+//			e.printStackTrace();
+//		}
 	}
 
 	private File exportJson(List<BugDetail> bugDetailList, String caseId) {

+ 11 - 0
src/main/java/edu/nju/service/UploadService.java

@@ -0,0 +1,11 @@
+package edu.nju.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ *
+ */
+public interface UploadService {
+
+    String uploadImage(MultipartFile file, String case_take_id, String work_id);
+}

+ 34 - 0
src/main/java/edu/nju/service/UploadServiceImpl.java

@@ -0,0 +1,34 @@
+package edu.nju.service;
+
+import edu.nju.model.enums.UploadType;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+@Slf4j
+@Service
+public class UploadServiceImpl implements UploadService {
+
+    @Autowired
+    private FileService fileService;
+
+	@Value("${save.folder}")
+	private String folderName;
+
+	@Value("${save.input}")
+	private String inputName;
+
+	@Override
+	public String uploadImage(MultipartFile file, String caseId, String work_id) {
+		String fileName = folderName.substring(1) + "/" + UploadType.IMAGE + caseId +"/"+ work_id +"_"+System.currentTimeMillis()+""
+				+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
+		return doUpload(fileName, caseId, file);
+	}
+
+
+    private String doUpload(String fileName, String caseId, MultipartFile file){
+        return fileService.sliceUploadFile(fileName, caseId, file);
+    }
+}

+ 534 - 0
src/main/java/edu/nju/util/FileUtil.java

@@ -0,0 +1,534 @@
+package edu.nju.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.multipart.MultipartFile;
+import sun.misc.Cleaner;
+
+import java.io.*;
+import java.lang.reflect.Method;
+import java.nio.MappedByteBuffer;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-05 19:57
+ */
+@Slf4j
+public class FileUtil {
+
+    public static final String PATH_HEAD = "/vagrant/";
+    public static final String USER_HEAD = "/data/User";
+    public static final String DOT = ".";
+    public static final String SLASH_ONE = "/";
+    public static final String SLASH_TWO = "\\";
+    public static final String HOME = "";
+    private static String uploadWindowRoot;
+
+    public static final Map<String, String> FILE_TYPE_MAP = new HashMap<>(); //本系统中合法的文件类型
+
+    static {
+
+        //图片
+        FILE_TYPE_MAP.put("ffd8ff", "jpg"); //JPEG (jpg)
+        FILE_TYPE_MAP.put("89504e", "png"); //PNG (png)
+        FILE_TYPE_MAP.put("474946", "gif"); //GIF (gif)
+
+        FILE_TYPE_MAP.put("49492a", "tif"); //TIFF (tif)
+        FILE_TYPE_MAP.put("492049", "tif");
+        FILE_TYPE_MAP.put("4d4d00", "tif");
+
+        FILE_TYPE_MAP.put("424d22", "bmp"); //16色位图(bmp)
+        FILE_TYPE_MAP.put("424d82", "bmp"); //24位位图(bmp)
+        FILE_TYPE_MAP.put("424d8e", "bmp"); //256色位图(bmp)
+
+        //压缩文件
+        FILE_TYPE_MAP.put("504b03", "zip");
+        FILE_TYPE_MAP.put("504b05", "zip");
+        FILE_TYPE_MAP.put("504b07", "zip");
+        FILE_TYPE_MAP.put("526172", "rar");
+
+        //文档
+        FILE_TYPE_MAP.put("255044", "pdf"); //Adobe Acrobat (pdf)
+        FILE_TYPE_MAP.put("7b5c72", "doc"); //doc文件
+        FILE_TYPE_MAP.put("504b03", "docx");//docx文件,xlsx等一致
+        FILE_TYPE_MAP.put("d0cf11", "doc/dot"); //MS Excel 注意:word、msi 和 excel的文件头一样
+        FILE_TYPE_MAP.put("0d444f", "doc/dot");
+        FILE_TYPE_MAP.put("cf11e0", "doc/dot");
+        FILE_TYPE_MAP.put("dba52d", "doc/dot");
+        FILE_TYPE_MAP.put("d0cf11", "wps/wks");//WPS文字wps、表格et、演示dps都是一样的
+        FILE_TYPE_MAP.put("0e574b", "wps/wks");
+        FILE_TYPE_MAP.put("ff0002", "wps/wks");
+
+        //exe可执行文件
+        FILE_TYPE_MAP.put("4d5a90", "exe");
+    }
+
+    public static String save(String dirPath, MultipartFile inputFile, String fileName) throws IOException {
+        byte[] bs = new byte[1024];
+        int len;
+
+        File saveDir = new File(dirPath);
+        if (!saveDir.exists()) {
+            saveDir.mkdirs();
+        }
+        if(fileName.equals("")){
+            fileName = inputFile.getOriginalFilename();
+        }
+        String saveFilePath = saveDir.getPath() + "/"  + fileName;
+        OutputStream os = new FileOutputStream( saveFilePath );
+        InputStream is = inputFile.getInputStream();
+        while ((len = is.read(bs)) != -1) {
+            os.write(bs, 0, len);
+        }
+
+        os.close();
+        is.close();
+
+        return saveFilePath.replaceAll("\\\\", "/" );
+    }
+
+    public static boolean checkFile(InputStream inputStream){
+        try {
+            byte[] headBytes = new byte[3];
+            inputStream.read(headBytes, 0, headBytes.length);
+            String headStr = bytesToHexString(headBytes).toLowerCase();
+            log.info("The Head of File: "+headStr);
+//            log.info("Whether the map contain the " + headStr +": " + FILE_TYPE_MAP.containsKey(headStr));
+            return FILE_TYPE_MAP.containsKey(headStr);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return true;
+    }
+
+    public static boolean checkExcel(InputStream inputStream){
+        String headStr = getHeadStr(inputStream);
+        log.info("The Head of File: "+headStr);
+        String name = FILE_TYPE_MAP.get(headStr);
+        if (name == null || (!name.contains("doc")&&(!name.contains("wps"))))
+            return false;
+        return true;
+    }
+
+    public static String getHeadStr(InputStream inputStream){
+        try {
+            byte[] headBytes = new byte[3];
+            inputStream.read(headBytes, 0, headBytes.length);
+            return bytesToHexString(headBytes).toLowerCase();
+        } catch (IOException e) {
+            throw new RuntimeException("读取文件头出错!", e);
+        }
+    }
+
+    private static String bytesToHexString(byte[] src) {
+        StringBuilder builder = new StringBuilder();
+        if (src == null || src.length <= 0) {
+            return null;
+        }
+        String hv;
+        for (int i = 0; i < src.length; i++) {
+            // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
+            hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
+            if (hv.length() < 2) {
+                builder.append(0);
+            }
+            builder.append(hv);
+        }
+        log.info("HexString: " + builder.toString());
+        return builder.toString();
+    }
+
+    public static void moveFiles(String oldPath, String newPath) throws IOException {
+
+        String[] filePaths = new File(oldPath).list();
+
+        if (filePaths != null && filePaths.length > 0) {
+            if (!new File(newPath).exists()) {
+                new File(newPath).mkdirs();
+            }
+
+            for (int i = 0; i < filePaths.length; i++) {
+                if (new File(oldPath + File.separator + filePaths[i]).isDirectory()) {
+                    moveFiles(oldPath + File.separator + filePaths[i],
+                            newPath + File.separator + filePaths[i]);
+                } else if (new File(oldPath + File.separator + filePaths[i]).isFile()) {
+                    copyFile(oldPath + File.separator + filePaths[i],
+                            newPath + File.separator + filePaths[i]);
+                    new File(oldPath + File.separator + filePaths[i])
+                            .renameTo(new File(newPath + File.separator + filePaths[i]));
+                }
+            }
+        }
+    }
+
+    public static void copyFile(String oldPath, String newPath) {
+
+        try {
+            File oldFile = new File(oldPath);
+            File file = new File(newPath);
+            FileInputStream in = new FileInputStream(oldFile);
+            FileOutputStream out = new FileOutputStream(file);
+            byte[] buffer = new byte[2097152];
+
+            while ((in.read(buffer)) != -1) {
+                out.write(buffer);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("文件拷贝失败");
+        }
+    }
+
+    /**
+     * 获取含扩展名的文件名(不包含path路径)
+     */
+    public static String getFileName(String fileName) {
+
+        String name = "";
+        if (StringUtils.lastIndexOf(fileName, SLASH_ONE) >= StringUtils
+                .lastIndexOf(fileName, SLASH_TWO)) {
+            name = StringUtils
+                    .substring(fileName, StringUtils.lastIndexOf(fileName, SLASH_ONE) + 1,
+                            fileName.length());
+
+        } else {
+            name = StringUtils
+                    .substring(fileName, StringUtils.lastIndexOf(fileName, SLASH_TWO) + 1,
+                            fileName.length());
+        }
+        return StringUtils.trimToEmpty(name);
+    }
+
+    /**
+     * 获取没有扩展名的文件名
+     */
+    public static String getWithoutExtension(String fileName) {
+
+        String ext = StringUtils.substring(fileName, 0,
+                StringUtils.lastIndexOf(fileName, DOT) == -1 ? fileName.length() : StringUtils.lastIndexOf(fileName, DOT));
+        return StringUtils.trimToEmpty(ext);
+    }
+
+    /**
+     * 获取扩展名
+     */
+    public static String getExtension(String fileName) {
+
+        if (StringUtils.INDEX_NOT_FOUND == StringUtils.indexOf(fileName, DOT)) {
+            return StringUtils.EMPTY;
+        }
+        String ext = StringUtils.substring(fileName,
+                StringUtils.lastIndexOf(fileName, DOT) + 1);
+        return StringUtils.trimToEmpty(ext);
+    }
+
+    /**
+     * 判断是否同为扩展名
+     */
+    public static boolean isExtension(String fileName, String ext) {
+
+        return StringUtils.equalsIgnoreCase(getExtension(fileName), ext);
+    }
+
+    /**
+     * 判断是否存在扩展名
+     */
+    public static boolean hasExtension(String fileName) {
+
+        return !isExtension(fileName, StringUtils.EMPTY);
+    }
+
+    /**
+     * 得到正确的扩展名
+     */
+    public static String trimExtension(String ext) {
+
+        return getExtension(DOT + ext);
+    }
+
+    /**
+     * 向path中填充扩展名(如果没有或不同的话)
+     */
+    public static String fillExtension(String fileName, String ext) {
+
+        fileName = replacePath(fileName + DOT);
+        ext = trimExtension(ext);
+        if (!hasExtension(fileName)) {
+            return fileName + getExtension(ext);
+        }
+        if (!isExtension(fileName, ext)) {
+            return getWithoutExtension(fileName) + getExtension(ext);
+        }
+        return fileName;
+    }
+
+    /**
+     * 判断是否是文件PATH
+     */
+    public static boolean isFile(String fileName) {
+
+        return hasExtension(fileName);
+    }
+
+    /**
+     * 判断是否是文件夹PATH
+     */
+    public static boolean isFolder(String fileName) {
+
+        return !hasExtension(fileName);
+    }
+
+    public static String replacePath(String path) {
+
+        return StringUtils.replace(StringUtils.trimToEmpty(path), SLASH_ONE,
+                SLASH_TWO);
+    }
+
+    /**
+     * 链接PATH前处理
+     */
+    public static String trimLeftPath(String path) {
+
+        if (isFile(path)) {
+            return path;
+        }
+        path = replacePath(path);
+        String top = StringUtils.left(path, 1);
+        if (StringUtils.equalsIgnoreCase(SLASH_TWO, top)) {
+            return StringUtils.substring(path, 1);
+        }
+        return path;
+    }
+
+    /**
+     * 链接PATH后处理
+     */
+    public static String trimRightPath(String path) {
+
+        if (isFile(path)) {
+            return path;
+        }
+        path = replacePath(path);
+        String bottom = StringUtils.right(path, 1);
+        if (StringUtils.equalsIgnoreCase(SLASH_TWO, bottom)) {
+            return StringUtils.substring(path, 0, path.length() - 2);
+        }
+        return path + SLASH_TWO;
+    }
+
+    /**
+     * 链接PATH前后处理,得到准确的链接PATH
+     */
+    public static String trimPath(String path) {
+
+        path = StringUtils.replace(StringUtils.trimToEmpty(path), SLASH_ONE,
+                SLASH_TWO);
+        path = trimLeftPath(path);
+        path = trimRightPath(path);
+        return path;
+    }
+
+    /**
+     * 通过数组完整链接PATH
+     */
+    public static String bulidFullPath(String... paths) {
+
+        StringBuffer sb = new StringBuffer();
+        for (String path : paths) {
+            sb.append(trimPath(path));
+        }
+        return sb.toString();
+    }
+
+    public static void delFile(String filepath) {
+
+        File f = new File(filepath);//定义文件路径
+        if (f.exists() && f.isDirectory()) {//判断是文件还是目录
+            if (f.listFiles().length != 0) {
+                //若有则把文件放进数组,并判断是否有下级目录
+                File delFile[] = f.listFiles();
+                int i = f.listFiles().length;
+                for (int j = 0; j < i; j++) {
+                    if (delFile[j].isDirectory()) {
+                        delFile(delFile[j].getAbsolutePath());//递归调用del方法并取得子目录路径
+                    }
+                    delFile[j].delete();//删除文件
+                }
+            }
+            f.delete();
+        }
+    }
+
+    public static void delFileList(List<String> filePaths) {
+
+        for (String filePath : filePaths) {
+            delFile(filePath);
+        }
+    }
+
+
+
+    /**
+     * 不确定是否能准确,待测试 判断文本文件的字符集,文件开头三个字节表明编码格式。 <a href="http://blog.163.com/wf_shunqiziran/blog/static/176307209201258102217810/">参考的博客地址</a>
+     */
+    public static String charset(String path) {
+
+        String charset = "GBK";
+        byte[] first3Bytes = new byte[3];
+        try {
+            boolean checked = false;
+            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
+            bis.mark(0); // 读者注: bis.mark(0);修改为 bis.mark(100);我用过这段代码,需要修改上面标出的地方。
+            // Wagsn注:不过暂时使用正常,遂不改之
+            int read = bis.read(first3Bytes, 0, 3);
+            if (read == -1) {
+                bis.close();
+                return charset; // 文件编码为 ANSI
+            } else if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {
+                charset = "UTF-16LE"; // 文件编码为 Unicode
+                checked = true;
+            } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) {
+                charset = "UTF-16BE"; // 文件编码为 Unicode big endian
+                checked = true;
+            } else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB
+                    && first3Bytes[2] == (byte) 0xBF) {
+                charset = "UTF-8"; // 文件编码为 UTF-8
+                checked = true;
+            }
+            bis.reset();
+            if (!checked) {
+                while ((read = bis.read()) != -1) {
+                    if (read >= 0xF0) {
+                        break;
+                    }
+                    if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
+                    {
+                        break;
+                    }
+                    if (0xC0 <= read && read <= 0xDF) {
+                        read = bis.read();
+                        if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
+                        // (0x80 - 0xBF),也可能在GB编码内
+                        {
+                            continue;
+                        } else {
+                            break;
+                        }
+                    } else if (0xE0 <= read && read <= 0xEF) { // 也有可能出错,但是几率较小
+                        read = bis.read();
+                        if (0x80 <= read && read <= 0xBF) {
+                            read = bis.read();
+                            if (0x80 <= read && read <= 0xBF) {
+                                charset = "UTF-8";
+                                break;
+                            } else {
+                                break;
+                            }
+                        } else {
+                            break;
+                        }
+                    }
+                }
+            }
+            bis.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return charset;
+    }
+
+    public static boolean isBase64(String str) {
+
+        String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
+        return Pattern.matches(base64Pattern, str);
+    }
+
+    @Value("${upload.window.root}")
+    public void setUploadWindowRoot(String windowRoot) {
+        uploadWindowRoot = windowRoot;
+    }
+
+    public static void close(final Closeable closeable){
+        if(closeable != null){
+            try {
+                closeable.close();
+            } catch (IOException e) {
+                log.error("close fail:"+e.getMessage(),e);
+            } finally {
+            }
+        }
+    }
+
+    /**
+     * 在MappedByteBuffer释放后再对它进行读操作的话就会引发jvm crash,在并发情况下很容易发生 正在释放时另一个线程正开始读取,于是crash就发生了。所以为了系统稳定性释放前一般需要检 查是否还有线程在读或写
+     */
+    public static void freedMappedByteBuffer(final MappedByteBuffer mappedByteBuffer) {
+
+        try {
+            if (mappedByteBuffer == null) {
+                return;
+            }
+
+            mappedByteBuffer.force();
+            AccessController.doPrivileged(new PrivilegedAction<Object>() {
+                @Override
+                public Object run() {
+
+                    try {
+                        Method getCleanerMethod = mappedByteBuffer.getClass().getMethod("cleaner", new Class[0]);
+                        getCleanerMethod.setAccessible(true);
+                        Cleaner cleaner = (Cleaner) getCleanerMethod.invoke(mappedByteBuffer,
+                                new Object[0]);
+                        cleaner.clean();
+                    } catch (Exception e) {
+                        log.error("clean MappedByteBuffer error!!!", e);
+                    }
+                    log.info("clean MappedByteBuffer completed!!!");
+                    return null;
+                }
+            });
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void clean(final Object buffer) {
+
+        AccessController.doPrivileged(new PrivilegedAction() {
+            public Object run() {
+
+                try {
+                    Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
+                    getCleanerMethod.setAccessible(true);
+                    Cleaner cleaner = (Cleaner) getCleanerMethod.invoke(buffer, new Object[0]);
+                    cleaner.clean();
+                } catch (Exception e) {
+                    log.error("clean fail :" + e.getMessage(), e);
+                }
+                return null;
+            }
+        });
+
+    }
+
+    public static void close(FileInputStream in, MappedByteBuffer byteBuffer) {
+
+        if (null != in) {
+            try {
+                in.getChannel().close();
+                in.close();
+            } catch (IOException e) {
+                log.error("close error:"+e.getMessage(), e);
+            }
+        }
+        if (null != byteBuffer) {
+            freedMappedByteBuffer(byteBuffer);
+        }
+    }
+}

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/apidoc/V1.0/.cache.json


+ 117 - 117
src/main/resources/apidoc/V1.0/apidoc.log

@@ -1,234 +1,234 @@
-五月 17, 2021 6:52:19 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:52 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find java src paths:  [/Users/guochao/Desktop/project/crowdsource-backend/src/main/java/]
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:52 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: project type not set, try to figure out...
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:52 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start find controllers in path : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : DeleteController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ReviewJobController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ReviewAnalyzeController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ExtraController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : RecommendController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ExportController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : AnalyzeController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : SettingController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : AnnotationController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ConfigurationController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : DataController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ReviewController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : UploadController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : HistoryController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : GraphController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : RelationController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : OAuthController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : OssController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ReportController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : NodeController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : ReviewPaperController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: find controller file : CrowdsourcingToReviewController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : DeleteController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : DeleteController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ReviewJobController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ReviewJobController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ReviewAnalyzeController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ReviewAnalyzeController.java
-五月 17, 2021 6:52:20 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:53 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ExtraController.java
-五月 17, 2021 6:52:22 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ExtraController.java
-五月 17, 2021 6:52:22 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : RecommendController.java
-五月 17, 2021 6:52:22 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : RecommendController.java
-五月 17, 2021 6:52:22 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ExportController.java
-五月 17, 2021 6:52:22 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ExportController.java
-五月 17, 2021 6:52:22 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : AnalyzeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : AnalyzeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : SettingController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : SettingController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : AnnotationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : AnnotationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ConfigurationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ConfigurationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:55 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : DataController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : DataController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : UploadController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : UploadController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : HistoryController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : HistoryController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : GraphController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : GraphController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : RelationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : RelationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : OAuthController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : OAuthController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : OssController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : OssController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ReportController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ReportController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : NodeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : NodeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : ReviewPaperController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : ReviewPaperController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to parse controller file : CrowdsourcingToReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to parse controller file : CrowdsourcingToReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: generate api docs start...
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/DeleteController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/DeleteController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewJobController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewJobController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewAnalyzeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewAnalyzeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ExtraController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ExtraController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/RecommendController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/RecommendController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ExportController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ExportController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/AnalyzeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/AnalyzeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/SettingController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/SettingController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/AnnotationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/AnnotationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ConfigurationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ConfigurationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/DataController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/DataController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/UploadController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/UploadController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/HistoryController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/HistoryController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/GraphController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/GraphController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/RelationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/RelationController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/OAuthController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/OAuthController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/OssController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/OssController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReportController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReportController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/NodeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/NodeController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewPaperController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/ReviewPaperController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: start to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/CrowdsourcingToReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: success to generate docs for controller file : /Users/guochao/Desktop/project/crowdsource-backend/src/main/java/edu/nju/controller/CrowdsourcingToReviewController.java
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: generate index start !!!
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: generate index done !!!
-五月 17, 2021 6:52:23 下午 io.github.yedaxia.apidocs.LogUtils info
+五月 17, 2021 7:58:56 下午 io.github.yedaxia.apidocs.LogUtils info
 信息: info: generate api docs done !!!

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_AnalyzeController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -1367,6 +1370,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_AnnotationController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -844,6 +847,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ConfigurationController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -821,6 +824,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_CrowdsourcingToReviewController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -833,6 +836,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_DataController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -1078,6 +1081,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_DeleteController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -857,6 +860,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ExportController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -821,6 +824,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ExtraController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -1480,6 +1483,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_GraphController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -893,6 +896,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_HistoryController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -941,6 +944,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_NodeController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -881,6 +884,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_OAuthController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -845,6 +848,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_OssController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -842,6 +845,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_RecommendController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -943,6 +946,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_RelationController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -895,6 +898,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ReportController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -969,6 +972,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewAnalyzeController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -854,6 +857,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -926,6 +929,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewJobController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -912,6 +915,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_ReviewPaperController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -936,6 +939,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_SettingController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -831,6 +834,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 42 - 0
src/main/resources/apidoc/V1.0/edu_nju_controller_UploadController.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -884,6 +887,44 @@ bug信息保存为json,csv文件,图片打包为zip文件
     <pre class="prettyprint lang-json">{}</pre>
                         </div>
                         <hr>
+                        <div class="action-item">
+<h2 id="uploadImage"><a href="#">上传图片 /image </a></h2>
+<p><strong>请求URL</strong></p>
+<p>
+    <code>/upload/image</code>
+        <span class="label label-default">POST</span>
+</p>
+        <p><strong>请求参数</strong> <span class="badge">application/x-www-form-urlencoded</span></p>
+        <table class="table table-bordered">
+            <tr>
+                <th>参数名</th>
+                <th>类型</th>
+                <th>必须</th>
+                <th>描述</th>
+            </tr>
+                    <tr>
+                        <td>file</td>
+                        <td>file</td>
+                        <td>否</td>
+                        <td></td>
+                    </tr>
+                    <tr>
+                        <td>caseId</td>
+                        <td>string</td>
+                        <td>否</td>
+                        <td></td>
+                    </tr>
+                    <tr>
+                        <td>work_id</td>
+                        <td>string</td>
+                        <td>否</td>
+                        <td></td>
+                    </tr>
+        </table>
+    <p><strong>返回结果</strong></p>
+    <pre class="prettyprint lang-json">string{}</pre>
+                        </div>
+                        <hr>
                     </div>
                 </div>
             </div>
@@ -1001,6 +1042,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
             {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
             {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
             {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+            {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
             {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
             {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
             {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 4 - 0
src/main/resources/apidoc/V1.0/index.html

@@ -444,6 +444,9 @@ bug信息保存为json,csv文件,图片打包为zip文件
                     <a class="catalog-item" href="edu_nju_controller_UploadController.html#repairTime">
                         repairTime
                     </a>
+                    <a class="catalog-item" href="edu_nju_controller_UploadController.html#uploadImage">
+                        上传图片 /image
+                    </a>
             </div>
         </div>
         <div class="panel">
@@ -835,6 +838,7 @@ bug信息保存为json,csv文件,图片打包为zip文件', url: 'edu_nju_cont
         {name: '上传 /upload.saveTitle', url: 'edu_nju_controller_UploadController.html#saveTitle'},
         {name: '上传 /upload.repairThums', url: 'edu_nju_controller_UploadController.html#repairThums'},
         {name: '上传 /upload.repairTime', url: 'edu_nju_controller_UploadController.html#repairTime'},
+        {name: '上传 /upload.上传图片 /image', url: 'edu_nju_controller_UploadController.html#uploadImage'},
         {name: 'HistoryController.getHistory', url: 'edu_nju_controller_HistoryController.html#getHistory'},
         {name: 'HistoryController.getRoots', url: 'edu_nju_controller_HistoryController.html#getRoots'},
         {name: 'HistoryController.getTrees', url: 'edu_nju_controller_HistoryController.html#getTrees'},

+ 21 - 0
src/main/resources/apidoc/V1.0/众测服务-V1.0-api-docs.md

@@ -1792,6 +1792,27 @@ worker_id|string|否|人员id
 ```json
 {}
 ```
+## 上传图片 /image
+
+**
+
+**请求URL**
+
+/upload/image `POST` 
+
+**请求参数**
+
+参数名|类型|必须|描述
+--:|:--:|:--:|:--
+file|file|否|
+caseId|string|否|
+work_id|string|否|
+
+**返回结果**
+
+```json
+string{}
+```
 # HistoryController
 ## getHistory
 

+ 15 - 9
src/main/resources/application.yml

@@ -7,9 +7,6 @@ spring.profiles.active: dev-online
 
 cpSerialNum: cp_mooctest_dev
 
-oss:
-  bucketName: mooctest-site
-
 this:
   server:
     ip: 127.0.0.1
@@ -21,6 +18,21 @@ thirdPartTool:
     path: ""
 sanjiPageUrl: "changeThis"
 
+oss:
+  accessKeyId: LTAI4FdrT3HsfdR5edBVN7ws
+  accessKeySecret: yroxrpm46DzTyzHrLBZzS3MRNIicP6
+  endPoint: oss-cn-shanghai.aliyuncs.com
+  bucketName: mooctest-site
+  idleConnectionTime: 1000
+
+upload:
+  chunkSize: 5 #单位为M
+  chunkMaxPartCount: 10000 #文件上传大小上限为:chunkSize * chunkMaxPartCount
+  thread:
+    maxSize: 25
+  queue:
+    maxSize: 100
+
 # 配置输出日志
 logging:
   level:
@@ -46,12 +58,6 @@ server:
   tomcat:
     uri-encoding: UTF-8
 useOss: true
-oss:
-  accessKeyId: LTAI4FdrT3HsfdR5edBVN7ws
-  accessKeySecret: yroxrpm46DzTyzHrLBZzS3MRNIicP6
-  endPoint: oss-cn-shanghai.aliyuncs.com
-  bucketName: mooctest-site
-
 save:
   path: /Users/guochao/Desktop/corwd-file
   folder: /xinchuang

Some files were not shown because too many files changed in this diff