Browse Source

修改上传逻辑,增加Minio上传

4228306 5 years ago
parent
commit
5fb7e62514
23 changed files with 469 additions and 43 deletions
  1. 5 0
      pom.xml
  2. 4 0
      src/main/java/edu/math/diagnosis/config/Constants.java
  3. 69 0
      src/main/java/edu/math/diagnosis/config/MinioConfig.java
  4. 55 0
      src/main/java/edu/math/diagnosis/config/MinioProperties.java
  5. 1 1
      src/main/java/edu/math/diagnosis/config/Swagger2Config.java
  6. 2 1
      src/main/java/edu/math/diagnosis/controller/FileController.java
  7. 4 3
      src/main/java/edu/math/diagnosis/controller/PaperController.java
  8. 19 4
      src/main/java/edu/math/diagnosis/controller/TestController.java
  9. 18 0
      src/main/java/edu/math/diagnosis/controller/UserManagerController.java
  10. 1 1
      src/main/java/edu/math/diagnosis/dao/OptionRepo.java
  11. 15 3
      src/main/java/edu/math/diagnosis/file/AliyunFileService.java
  12. 9 0
      src/main/java/edu/math/diagnosis/file/FileService.java
  13. 20 10
      src/main/java/edu/math/diagnosis/file/LocalFileService.java
  14. 93 0
      src/main/java/edu/math/diagnosis/file/MinioFileService.java
  15. 9 4
      src/main/java/edu/math/diagnosis/file/NginxFileService.java
  16. 79 0
      src/main/java/edu/math/diagnosis/model/MinioPolicy.java
  17. 1 1
      src/main/java/edu/math/diagnosis/service/CommitService.java
  18. 1 1
      src/main/java/edu/math/diagnosis/service/PaperService.java
  19. 6 0
      src/main/java/edu/math/diagnosis/service/UserService.java
  20. 6 8
      src/main/java/edu/math/diagnosis/word/WordService.java
  21. 10 4
      src/main/resources/application-dev.properties
  22. 4 2
      src/main/resources/application-prod.properties
  23. 38 0
      src/test/java/edu/math/diagnosis/service/MinioTest.java

+ 5 - 0
pom.xml

@@ -141,6 +141,11 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>6.0.11</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 4 - 0
src/main/java/edu/math/diagnosis/config/Constants.java

@@ -94,4 +94,8 @@ public class Constants {
     public static final int DEFAULT_SECTION_START_NUMBER = 1;
     public static final int DEFAULT_SECTION_DURATION = 20;
     public static final int DEFAULT_SECTION_REST = 2;
+
+    public static final String OLD_PASS = "YX_OLD_PASS";
+    public static final String NEW_PASS = "YX_NEW_PASS";
+    public static final String DEFAULT_PASSWORD = "Admin123";
 }

+ 69 - 0
src/main/java/edu/math/diagnosis/config/MinioConfig.java

@@ -0,0 +1,69 @@
+package edu.math.diagnosis.config;
+
+import edu.math.diagnosis.file.FileService;
+import edu.math.diagnosis.file.MinioFileService;
+import io.minio.MinioClient;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Configuration
+public class MinioConfig {
+
+    private static final Logger logger = LoggerFactory.getLogger(MinioConfig.class);
+
+    @Bean
+    MinioProperties minioProperties() {
+        return new MinioProperties();
+    }
+
+    @Bean
+    FileService fileService() {
+        return new MinioFileService();
+    }
+
+    @Bean
+    MinioClient minioClient(MinioProperties properties) throws Exception {
+        logger.info("init MinioClient,url is {} , accessKey is {} , secretKey is {}", properties.getUrl(), properties.getAccessKey(), properties.getSecretKey());
+        MinioClient client = new MinioClient(properties.getUrl(), properties.getAccessKey(), properties.getSecretKey());
+        Set<String> buckets = new HashSet<>(Arrays.asList(properties.getBuckets()));
+        buckets.add(properties.getDefaultBucket());
+        for (String bucket : buckets) {
+            boolean isExist = client.bucketExists(bucket);
+            if (isExist) {
+                logger.info("bucket {} already exists.", bucket);
+            } else {
+                client.makeBucket(bucket);
+                logger.info("made bucket {}", bucket);
+            }
+//            client.setBucketPolicy(bucket, "ReadOnly");
+        }
+        return client;
+    }
+
+    public String buildPolicy(String bucket) {
+        StringBuilder builder = new StringBuilder();
+        builder.append("{\n");
+        builder.append("    \"Statement\": [\n");
+        builder.append("        {\n");
+        builder.append("            \"Action\": [\n");
+        builder.append("                \"s3:GetObject\",\n");
+        builder.append("                \"s3:ListBucket\"\n");
+        builder.append("            ],\n");
+        builder.append("            \"Effect\": \"Allow\",\n");
+        builder.append("            \"Principal\": \"*\",\n");
+        builder.append("            \"Resource\": \"arn:aws:s3:::").append(bucket).append("\"\n");
+        builder.append("        }\n");
+        builder.append("    ],\n");
+        builder.append("    \"Version\": \"2012-10-17\"\n");
+        builder.append("}\n");
+        return builder.toString();
+    }
+}

+ 55 - 0
src/main/java/edu/math/diagnosis/config/MinioProperties.java

@@ -0,0 +1,55 @@
+package edu.math.diagnosis.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "minio")
+public class MinioProperties {
+
+    public static final String DEFAULT_BUCKET = "bucket";
+
+    private String url;
+    private String[] buckets = {};
+    private String defaultBucket = DEFAULT_BUCKET;
+    private String accessKey = "admin";
+    private String secretKey = "admin123";
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String[] getBuckets() {
+        return buckets;
+    }
+
+    public void setBuckets(String[] buckets) {
+        this.buckets = buckets;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getDefaultBucket() {
+        return defaultBucket;
+    }
+
+    public void setDefaultBucket(String defaultBucket) {
+        this.defaultBucket = defaultBucket;
+    }
+}

+ 1 - 1
src/main/java/edu/math/diagnosis/config/Swagger2Config.java

@@ -19,7 +19,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
  */
 @Configuration
 @EnableSwagger2
-@Profile("dev")
+//@Profile("dev")
 @ConditionalOnExpression("${swagger.enabled: true}")
 public class Swagger2Config {
 

+ 2 - 1
src/main/java/edu/math/diagnosis/controller/FileController.java

@@ -1,7 +1,8 @@
 package edu.math.diagnosis.controller;
 
+import edu.math.diagnosis.file.FileService;
 import edu.math.diagnosis.model.ResponseMessage;
-import edu.math.diagnosis.service.FileService;
+import edu.math.diagnosis.file.LocalFileService;
 import edu.math.diagnosis.util.OSSUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;

+ 4 - 3
src/main/java/edu/math/diagnosis/controller/PaperController.java

@@ -1,9 +1,10 @@
 package edu.math.diagnosis.controller;
 
 import edu.math.diagnosis.entity.Paper;
+import edu.math.diagnosis.file.FileService;
 import edu.math.diagnosis.model.PaperVo;
 import edu.math.diagnosis.model.Result;
-import edu.math.diagnosis.service.LocalFileService;
+import edu.math.diagnosis.file.NginxFileService;
 import edu.math.diagnosis.service.PaperService;
 import edu.math.diagnosis.util.CommonUtil;
 import io.swagger.annotations.Api;
@@ -36,7 +37,7 @@ public class PaperController {
     //    @Resource
 //    private FileService fileService;
     @Resource
-    private LocalFileService localFileService;
+    private FileService fileService;
 
     //   @PreAuthorize("hasRole('ROLE_ADMIN')")
     @ApiOperation(value = "查询所有试卷")
@@ -89,7 +90,7 @@ public class PaperController {
         byte[] data = baos.toByteArray();
 //        byte[] clone = data.clone();
 //        String url = fileService.upload(data, UploadProperties.DOC_PATH, saveName);
-        String url = localFileService.upload(data, saveName);
+        String url = fileService.upload(data, saveName);
         if (StringUtils.isEmpty(url)) {
             return Result.fail("文件上传失败,请重试");
         }

+ 19 - 4
src/main/java/edu/math/diagnosis/controller/TestController.java

@@ -3,14 +3,17 @@ package edu.math.diagnosis.controller;
 import edu.math.diagnosis.dao.OptionRepo;
 import edu.math.diagnosis.dao.QuestionRepo;
 import edu.math.diagnosis.entity.Question;
+import edu.math.diagnosis.file.FileService;
 import edu.math.diagnosis.model.AuthUser;
+import edu.math.diagnosis.model.Result;
+import edu.math.diagnosis.file.MinioFileService;
 import edu.math.diagnosis.util.SecurityUtil;
 import io.swagger.annotations.Api;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.util.Date;
@@ -29,9 +32,13 @@ public class TestController {
     private OptionRepo optionRepo;
     @Resource
     private QuestionRepo questionRepo;
+    @Resource
+    private FileService fileService;
 
     private AtomicLong visitCount = new AtomicLong();
 
+    private static final Logger logger = LoggerFactory.getLogger(TestController.class);
+
     @PreAuthorize("hasRole('ROLE_USER')")
     @RequestMapping(value = "/test", method = RequestMethod.GET)
     public String test() {
@@ -97,4 +104,12 @@ public class TestController {
         }
     }
 
+    @PostMapping("/upload")
+    public Result uploadMatter(@RequestBody MultipartFile file) throws Exception {
+        logger.info("upload file {}", file.getOriginalFilename());
+        byte[] data = file.getBytes();
+        fileService.upload(data, file.getOriginalFilename());
+        return Result.ok();
+    }
+
 }

+ 18 - 0
src/main/java/edu/math/diagnosis/controller/UserManagerController.java

@@ -2,12 +2,17 @@ package edu.math.diagnosis.controller;
 
 import edu.math.diagnosis.entity.UserInfo;
 import edu.math.diagnosis.config.Constants;
+import edu.math.diagnosis.model.AuthUser;
 import edu.math.diagnosis.service.UserService;
+import edu.math.diagnosis.util.MD5Util;
+import edu.math.diagnosis.util.SecurityUtil;
 import io.swagger.annotations.Api;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.Date;
+import java.util.Map;
 
 /**
  * @AUTHOR: DaiFengWen
@@ -32,4 +37,17 @@ public class UserManagerController {
         return new Date() + "";
     }
 
+    @PostMapping("updatePassword")
+    public boolean update(@RequestBody Map<String, String> params) {
+        String oldPass = params.get(Constants.OLD_PASS);
+        String newPass = params.get(Constants.NEW_PASS);
+        if (StringUtils.isBlank(newPass)) {
+            newPass = Constants.DEFAULT_PASSWORD;
+        }
+        AuthUser user = SecurityUtil.getCurrentUser();
+        if (MD5Util.INSTANCE.md5(oldPass).equals(user.getPassword())) {
+            return userService.updatePassword(user.getUser().getId(), newPass);
+        }
+        return false;
+    }
 }

+ 1 - 1
src/main/java/edu/math/diagnosis/dao/OptionRepo.java

@@ -16,6 +16,6 @@ import java.util.Map;
 public interface OptionRepo extends JpaRepository<QuestionOption, Long> {
     List<QuestionOption> findByQid(long qid);
 
-    List<QuestionOption> findByIdIn(List<Long> ids);
+    List<QuestionOption> findByQidIn(List<Long> qids);
 
 }

+ 15 - 3
src/main/java/edu/math/diagnosis/service/AliyunFileService.java → src/main/java/edu/math/diagnosis/file/AliyunFileService.java

@@ -1,15 +1,15 @@
-package edu.math.diagnosis.service;
+package edu.math.diagnosis.file;
 
 import edu.math.diagnosis.util.OSSUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 
-@Service
-public class AliyunFileService {
+public class AliyunFileService implements FileService {
 
     private static final Logger logger = LoggerFactory.getLogger(AliyunFileService.class);
 
@@ -48,4 +48,16 @@ public class AliyunFileService {
         byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
         return putFile(bytes, fileName);
     }
+
+    @Override
+    public String upload(byte[] data, String filename) {
+        String url = OSSUtil.INSTANCE.putFile(new ByteArrayInputStream(data), filename.substring(filename.lastIndexOf(".")));
+        logger.info("put file to aliyun,url is {}", url);
+        return url;
+    }
+
+    @Override
+    public ResponseEntity<byte[]> download(String url) {
+        return null;
+    }
 }

+ 9 - 0
src/main/java/edu/math/diagnosis/file/FileService.java

@@ -0,0 +1,9 @@
+package edu.math.diagnosis.file;
+
+import org.springframework.http.ResponseEntity;
+
+public interface FileService {
+    String upload(byte[] data, String filename);
+
+    ResponseEntity<byte[]> download(String url);
+}

+ 20 - 10
src/main/java/edu/math/diagnosis/service/FileService.java → src/main/java/edu/math/diagnosis/file/LocalFileService.java

@@ -1,4 +1,4 @@
-package edu.math.diagnosis.service;
+package edu.math.diagnosis.file;
 
 import edu.math.diagnosis.config.UploadProperties;
 import org.slf4j.Logger;
@@ -11,18 +11,24 @@ import org.springframework.util.FileCopyUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 
-@Service
-public class FileService {
+public class LocalFileService implements FileService{
 
     @Resource
     private UploadProperties properties;
 
-    private static final Logger logger = LoggerFactory.getLogger(FileService.class);
+    private static final Logger logger = LoggerFactory.getLogger(LocalFileService.class);
+
+    public String upload(byte[] data, String filename) {
+        try {
+            FileCopyUtils.copy(data, new File(properties.getUploadLocation() + filename));
+        } catch (IOException e) {
+            e.printStackTrace();
+            return "";
+        }
+        return properties.getUploadLocation() + filename;
+    }
 
     public String upload(byte[] data, String path, String filename) {
         String pathname = path + filename;
@@ -60,11 +66,15 @@ public class FileService {
         return result;
     }
 
-    public ResponseEntity<byte[]> download(String filename) throws Exception {
+    public ResponseEntity<byte[]> download(String filename){
         byte[] body = download(properties.getUploadLocation(), filename);
         HttpHeaders headers = new HttpHeaders();
         headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
-        headers.add("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
+        try {
+            headers.add("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
         headers.add("Pragma", "no-cache");
         headers.add("Expires", "0");
         return ResponseEntity.ok().headers(headers)

+ 93 - 0
src/main/java/edu/math/diagnosis/file/MinioFileService.java

@@ -0,0 +1,93 @@
+package edu.math.diagnosis.file;
+
+import edu.math.diagnosis.config.MinioProperties;
+import edu.math.diagnosis.util.CommonUtil;
+import io.minio.MinioClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import javax.annotation.Resource;
+import java.io.ByteArrayInputStream;
+
+public class MinioFileService implements FileService {
+
+    private static final Logger logger = LoggerFactory.getLogger(MinioFileService.class);
+
+    @Resource
+    private MinioProperties properties;
+    @Resource
+    private MinioClient minioClient;
+
+    public String upload(String filename) {
+        return "";
+//        return upload(filename, MinioProperties.DEFAULT_BUCKET);
+    }
+
+    private String upload(String filename, String bucket) throws Exception {
+        checkAndMake(bucket);
+//        minioClient.putObject(bucket,filename,);
+        return "";
+    }
+
+    private void checkAndMake(String bucket) throws Exception {
+        Assert.hasText(bucket, "bucket is blank");
+        if (!minioClient.bucketExists(bucket)) {
+            logger.info("bucket {} doesn't exists.", bucket);
+            minioClient.makeBucket(bucket);
+        }
+    }
+
+    public String uploadWithOriginName(byte[] data, String filename) {
+        try {
+            return uploadWithOriginName(data, filename, properties.getDefaultBucket());
+        } catch (Exception e) {
+            logger.error("upload file error", e);
+        }
+        return "";
+    }
+
+    public String uploadWithOriginName(byte[] data, String filename, String bucket) throws Exception {
+        ByteArrayInputStream bais = new ByteArrayInputStream(data);
+        checkAndMake(bucket);
+        String suffix = filename.substring(filename.lastIndexOf("."));
+        filename = CommonUtil.randomUUID() + suffix;
+        String url = buildUrl(bucket, filename);
+        logger.info("putting object {} to {}", filename, url);
+        minioClient.putObject(bucket, filename, bais, "application/octet-stream");
+        return url;
+    }
+
+    public String upload(byte[] data, String filename) {
+        try {
+            return upload(data, filename, properties.getDefaultBucket());
+        } catch (Exception e) {
+            logger.error("upload file error", e);
+        }
+        return "";
+    }
+
+    private String upload(byte[] data, String filename, String bucket) throws Exception {
+        ByteArrayInputStream bais = new ByteArrayInputStream(data);
+        checkAndMake(bucket);
+        String url = buildUrl(bucket, filename);
+        logger.info("putting object {} to {}", filename, url);
+        minioClient.putObject(bucket, filename, bais, "application/octet-stream");
+//        minioClient.setBucketPolicy();
+        return url;
+    }
+
+//    private String buildUrl(String bucket, String filename) throws Exception {
+//        return minioClient.getObjectUrl(bucket, filename);
+//    }
+
+    private String buildUrl(String bucket, String filename) {
+        return properties.getUrl() + bucket + "/" + filename;
+    }
+
+    public ResponseEntity<byte[]> download(String url) {
+        return null;
+    }
+}

+ 9 - 4
src/main/java/edu/math/diagnosis/service/LocalFileService.java → src/main/java/edu/math/diagnosis/file/NginxFileService.java

@@ -1,4 +1,4 @@
-package edu.math.diagnosis.service;
+package edu.math.diagnosis.file;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -8,6 +8,7 @@ import org.springframework.core.io.ByteArrayResource;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
@@ -15,8 +16,7 @@ import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.PostConstruct;
 
-@Service
-public class LocalFileService {
+public class NginxFileService implements FileService{
 
     @Value("${local.uploadUrl:}")
     private String localUploadUrl;
@@ -33,7 +33,7 @@ public class LocalFileService {
         headers.setContentType(type);
     }
 
-    private static final Logger logger = LoggerFactory.getLogger(LocalFileService.class);
+    private static final Logger logger = LoggerFactory.getLogger(NginxFileService.class);
 
     public String upload(byte[] data, String filename) {
         logger.info("upload file {} to {}", filename, localUploadUrl);
@@ -50,6 +50,11 @@ public class LocalFileService {
         return localDownloadUrl + "/" + filename;
     }
 
+    @Override
+    public ResponseEntity<byte[]> download(String url) {
+        return null;
+    }
+
     static class FileByteArrayResource extends ByteArrayResource {
         private String filename;
 

+ 79 - 0
src/main/java/edu/math/diagnosis/model/MinioPolicy.java

@@ -0,0 +1,79 @@
+package edu.math.diagnosis.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MinioPolicy {
+    private static final String DEFAULT_VERSION = "2012-10-17";
+    private final Statement DEFAULT_STATEMENT = new Statement(Arrays.asList("s3:GetObject","s3:ListBucket"),"Allow","*","arn:aws:s3:::%s");
+//    private static final MinioPolicy DEFAULT_POLICY =
+    private List<Statement> Statement;
+    private String Version;
+
+    public MinioPolicy() {
+
+    }
+
+    public List<MinioPolicy.Statement> getStatement() {
+        return Statement;
+    }
+
+    public void setStatement(List<MinioPolicy.Statement> statement) {
+        Statement = statement;
+    }
+
+    public String getVersion() {
+        return Version;
+    }
+
+    public void setVersion(String version) {
+        Version = version;
+    }
+
+    public class Statement {
+        private List<String> Action;
+        private String Effect;
+        private String Principal;
+        private String Resource;
+
+        public Statement(List<String> action, String effect, String principal, String resource) {
+            Action = action;
+            Effect = effect;
+            Principal = principal;
+            Resource = resource;
+        }
+
+        public List<String> getAction() {
+            return Action;
+        }
+
+        public void setAction(List<String> action) {
+            Action = action;
+        }
+
+        public String getEffect() {
+            return Effect;
+        }
+
+        public void setEffect(String effect) {
+            Effect = effect;
+        }
+
+        public String getPrincipal() {
+            return Principal;
+        }
+
+        public void setPrincipal(String principal) {
+            Principal = principal;
+        }
+
+        public String getResource() {
+            return Resource;
+        }
+
+        public void setResource(String resource) {
+            Resource = resource;
+        }
+    }
+}

+ 1 - 1
src/main/java/edu/math/diagnosis/service/CommitService.java

@@ -67,7 +67,7 @@ public class CommitService {
         for (Map.Entry<Long, List<Long>> entry : ans.entrySet()) {
             List<Long> choices = entry.getValue();
             Question question = questionRepo.getOne(entry.getKey());
-            List<QuestionOption> options = optionRepo.findByIdIn(choices);
+            List<QuestionOption> options = optionRepo.findByQidIn(choices);
             QuestionDetail questionDetail = new QuestionDetail();
             questionDetail.setDrid(report.getId());
             questionDetail.setChoices(StringUtils.join(choices, ","));

+ 1 - 1
src/main/java/edu/math/diagnosis/service/PaperService.java

@@ -112,7 +112,7 @@ public class PaperService {
         paper.setQuestions(questions);
         List<Long> qids = questions.stream().map(Question::getId).collect(Collectors.toList());
         //一次查出该试卷所有的选项
-        List<QuestionOption> options = optionRepo.findByIdIn(qids);
+        List<QuestionOption> options = optionRepo.findByQidIn(qids);
         //然后根据Id进行分组
         Map<Long, List<QuestionOption>> group = options.stream().collect(Collectors.groupingBy(QuestionOption::getQid));
         for (Question question : questions) {

+ 6 - 0
src/main/java/edu/math/diagnosis/service/UserService.java

@@ -87,4 +87,10 @@ public class UserService {
     public UserInfo getSimpleUser(Long id) {
         return userRepo.getOne(id);
     }
+
+    public boolean updatePassword(Long id,String password){
+        UserInfo info = getSimpleUser(id);
+        info.setPassword(MD5Util.INSTANCE.md5(password));
+        return userRepo.save(info) != null;
+    }
 }

+ 6 - 8
src/main/java/edu/math/diagnosis/word/WordService.java

@@ -5,8 +5,7 @@ import edu.math.diagnosis.entity.PaperTemplate;
 import edu.math.diagnosis.entity.Question;
 import edu.math.diagnosis.entity.QuestionOption;
 import edu.math.diagnosis.config.Constants;
-import edu.math.diagnosis.service.FileService;
-import edu.math.diagnosis.service.LocalFileService;
+import edu.math.diagnosis.file.FileService;
 import edu.math.diagnosis.util.CommonUtil;
 import edu.math.diagnosis.util.ObjectUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -34,8 +33,6 @@ public class WordService {
     @Resource
     private FileService fileService;
     @Resource
-    private LocalFileService localFileService;
-    @Resource
     private FormulaService formulaService;
 
     private static final Logger logger = LoggerFactory.getLogger(WordService.class);
@@ -203,7 +200,7 @@ public class WordService {
             List<XWPFParagraph> ps = map.get(tag);
             //标签不对
             if (ps == null) {
-                logger.error("unknown tag");
+                logger.error("unknown tag {}", tag);
                 continue;
             }
             ps.add(p);
@@ -280,7 +277,7 @@ public class WordService {
                 int width = Constants.DEFAULT_WIDTH, height = Constants.DEFAULT_HEIGHT;
                 try {
                     BufferedImage image = ImageIO.read(new ByteArrayInputStream(pData));
-                    width = image.getWidth() > Constants.MAX_WIDTH ? Constants.MAX_WIDTH : image.getWidth();
+                    width = Math.min(image.getWidth(), Constants.MAX_WIDTH);
                     //设置临界值
 //                    width = setBound(width, Constants.MIN_WIDTH, Constants.MAX_WIDTH);
 //                    if(width > Constants.MAX_WIDTH){
@@ -296,11 +293,12 @@ public class WordService {
                 //上传照片到阿里云,后续考虑不上传,存储到本地
 //                String url = aliyunFileService.putFile(pData, pName);
 //                String url = fileService.upload(pData, UploadProperties.IMAGE_PATH, saveName);
-                String url = localFileService.upload(pData, saveName);
+//                String url = localFileService.upload(pData, saveName);
+                String url = fileService.upload(pData, saveName);
 //                String url = "temp url";
 
                 insert.put(i, String.format(img, url, width));
-                logger.debug("picture des " + pp.getDescription());
+                logger.debug("picture url is {}, des is {} ", url, pp.getDescription());
             }
         }
         insert.forEach((k, v) -> {

+ 10 - 4
src/main/resources/application-dev.properties

@@ -10,9 +10,9 @@ spring.servlet.multipart.location=${baseLocation}/uploadTemp/
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${uploadLocation}
 
 #spring.datasource.url=jdbc:mysql://47.104.200.54:3306/OnlinePapers?useUnicode=true&characterEncoding=utf-8
-spring.datasource.url=jdbc:mysql://${serverAddress}:3307/OnlinePapers?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
+spring.datasource.url=jdbc:mysql://${serverAddress}:30875/OnlinePapers?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
 spring.datasource.username=root
-spring.datasource.password=134679258Aa_
+spring.datasource.password=lAWK54iuiZ
 spring.jpa.hibernate.ddl-auto=update
 
 management.endpoints.web.exposure.include=*
@@ -23,6 +23,12 @@ management.endpoint.health.show-details=always
 spring.redis.database=0
 spring.redis.password=134679258Aa_
 spring.redis.host=${serverAddress}
-spring.redis.port=6380
+spring.redis.port=32578
 local.uploadUrl=http://${serverAddress}:9001/file/upload
-local.downloadUrl=http://${serverAddress}:9001/file/download/
+local.downloadUrl=http://${serverAddress}:9001/file/download/
+
+minio.url=http://${serverAddress}:30240/
+minio.buckets=dev
+minio.defaultBucket=dev
+minio.accessKey=admin
+minio.secretKey=#admin123!

+ 4 - 2
src/main/resources/application-prod.properties

@@ -1,9 +1,11 @@
 server.port=8080
-serverAddress=172.18.129.124
+#serverAddress=172.18.129.124
+serverAddress=119.23.22.31
 serverOutsideAddress=www.yaoxiangedu.com
 
 uploadPattern=/upload/**
-baseLocation=/opt/diagnosis/${server.port}
+#baseLocation=/opt/diagnosis/${server.port}
+baseLocation=d:/diagnosis
 uploadLocation=${baseLocation}/upload/
 spring.servlet.multipart.location=${baseLocation}/uploadTemp/
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${uploadLocation}

+ 38 - 0
src/test/java/edu/math/diagnosis/service/MinioTest.java

@@ -0,0 +1,38 @@
+package edu.math.diagnosis.service;
+
+import io.minio.MinioClient;
+import io.minio.Result;
+import io.minio.messages.Bucket;
+import io.minio.messages.Item;
+import org.junit.Test;
+
+import java.util.List;
+
+public class MinioTest {
+
+    @Test
+    public void test() throws Exception {
+        MinioClient minioClient = new MinioClient("http://192.168.80.106:9000", "admin", "5tgbNHY^");
+
+        // Check if the bucket already exists.
+        boolean isExist = minioClient.bucketExists("feick");
+        if (isExist) {
+            System.out.println("Bucket already exists.");
+        } else {
+            minioClient.makeBucket("feick");
+        }
+
+//            minioClient.putObject("feick", "aaa.jpg", "./aaa.jpg");
+        List<Bucket> bucketList = minioClient.listBuckets();
+
+
+        Iterable<Result<Item>> feick = minioClient.listObjects("feick");
+        for (Result<Item> result : feick) {
+            Item item = result.get();
+            System.out.println(item.lastModified() + ", " + item.size() + ", " + item.objectName() + ", " + item.storageClass() + ", " + item.etag());
+        }
+//            InputStream feick1 = minioClient.getObject("feick", "aaa.jpg");
+
+//            System.out.println("./aaa.jpg is successfully uploaded as aaa.jpg to `feick` bucket.");
+    }
+}