Przeglądaj źródła

feat:增加添加图片水印接口;优化代码

ChenYL 2 lat temu
rodzic
commit
0e6c92b848

+ 28 - 39
pom.xml

@@ -19,7 +19,6 @@
     <mapstruct.version>1.5.5.Final</mapstruct.version>
     <mybatis.plus.version>3.5.3.1</mybatis.plus.version>
     <thumbnailator.version>0.4.20</thumbnailator.version>
-    <org.mapstruct.extensions.spring.version>1.0.1</org.mapstruct.extensions.spring.version>
     <lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
   </properties>
   <dependencies>
@@ -46,11 +45,11 @@
       <artifactId>lombok</artifactId>
       <optional>true</optional>
     </dependency>
-    <!--    <dependency>-->
-    <!--      <groupId>org.projectlombok</groupId>-->
-    <!--      <artifactId>lombok-mapstruct-binding</artifactId>-->
-    <!--      <version>${lombok.mapstruct.binding.version}</version>-->
-    <!--    </dependency>-->
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok-mapstruct-binding</artifactId>
+      <version>${lombok.mapstruct.binding.version}</version>
+    </dependency>
 
     <dependency>
       <groupId>org.springframework.boot</groupId>
@@ -85,11 +84,6 @@
       <version>${mapstruct.version}</version>
       <scope>compile</scope>
     </dependency>
-    <!--    <dependency>-->
-    <!--      <groupId>org.mapstruct.extensions.spring</groupId>-->
-    <!--      <artifactId>mapstruct-spring-annotations</artifactId>-->
-    <!--      <version>${org.mapstruct.extensions.spring.version}</version>-->
-    <!--    </dependency>-->
   </dependencies>
 
   <!-- 配置阿里云仓库 -->
@@ -132,34 +126,29 @@
           </excludes>
         </configuration>
       </plugin>
-      <!--      <plugin>-->
-      <!--        <groupId>org.apache.maven.plugins</groupId>-->
-      <!--        <artifactId>maven-compiler-plugin</artifactId>-->
-      <!--        <configuration>-->
-      <!--          <annotationProcessorPaths>-->
-      <!--            <path>-->
-      <!--              <groupId>org.projectlombok</groupId>-->
-      <!--              <artifactId>lombok</artifactId>-->
-      <!--              <version>${lombok.version}</version>-->
-      <!--            </path>-->
-      <!--            <path>-->
-      <!--              <groupId>org.mapstruct</groupId>-->
-      <!--              <artifactId>mapstruct-processor</artifactId>-->
-      <!--              <version>${mapstruct.version}</version>-->
-      <!--            </path>-->
-      <!--            <path>-->
-      <!--              <groupId>org.projectlombok</groupId>-->
-      <!--              <artifactId>lombok-mapstruct-binding</artifactId>-->
-      <!--              <version>lombok.mapstruct.binding.version</version>-->
-      <!--            </path>-->
-      <!--            <path>-->
-      <!--              <groupId>org.mapstruct.extensions.spring</groupId>-->
-      <!--              <artifactId>mapstruct-spring-extensions</artifactId>-->
-      <!--              <version>${org.mapstruct.extensions.spring.version}</version>-->
-      <!--            </path>-->
-      <!--          </annotationProcessorPaths>-->
-      <!--        </configuration>-->
-      <!--      </plugin>-->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <annotationProcessorPaths>
+            <path>
+              <groupId>org.projectlombok</groupId>
+              <artifactId>lombok</artifactId>
+              <version>${lombok.version}</version>
+            </path>
+            <path>
+              <groupId>org.mapstruct</groupId>
+              <artifactId>mapstruct-processor</artifactId>
+              <version>${mapstruct.version}</version>
+            </path>
+            <path>
+              <groupId>org.projectlombok</groupId>
+              <artifactId>lombok-mapstruct-binding</artifactId>
+              <version>${lombok.mapstruct.binding.version}</version>
+            </path>
+          </annotationProcessorPaths>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 

+ 1 - 1
src/main/java/com/zhixinghe1/ots/atomic/service/IAttachmentService.java

@@ -14,7 +14,7 @@ public interface IAttachmentService {
    * @param id
    * @return
    */
-  AttachmentDto selectById(Long id);
+  AttachmentDto getById(Long id);
 
   /**
    * 增加附件记录

+ 6 - 6
src/main/java/com/zhixinghe1/ots/atomic/service/impl/AttachmentServiceImpl.java

@@ -4,10 +4,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhixinghe1.ots.atomic.entity.Attachment;
 import com.zhixinghe1.ots.atomic.mapper.AttachmentMapper;
 import com.zhixinghe1.ots.atomic.service.IAttachmentService;
+import com.zhixinghe1.ots.domain.converter.AttachmentConverter;
 import com.zhixinghe1.ots.domain.dto.AttachmentDto;
 import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.convert.ConversionService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -17,16 +17,16 @@ public class AttachmentServiceImpl extends ServiceImpl<AttachmentMapper, Attachm
     IAttachmentService {
 
   @Autowired
-  private ConversionService conversionService;
+  private AttachmentConverter attachmentConverter;
 
   @Override
-  public AttachmentDto selectById(Long id) {
+  public AttachmentDto getById(Long id) {
     if (id == null) {
       return null;
     }
 
-    Attachment attachment = getById(id);
-    return conversionService.convert(attachment, AttachmentDto.class);
+    Attachment attachment = baseMapper.selectById(id);
+    return attachmentConverter.convert2Dto(attachment);
   }
 
   @Override
@@ -36,7 +36,7 @@ public class AttachmentServiceImpl extends ServiceImpl<AttachmentMapper, Attachm
       return true;
     }
 
-    List<Attachment> attachments = conversionService.convert(attachmentDtoList, List.class);
+    List<Attachment> attachments = attachmentConverter.convert2EntityList(attachmentDtoList);
     return saveBatch(attachments);
   }
 }

+ 1 - 1
src/main/java/com/zhixinghe1/ots/common/converter/enumconverter/IJsonEnum.java → src/main/java/com/zhixinghe1/ots/common/converter/enums/IJsonEnum.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.common.converter.enumconverter;
+package com.zhixinghe1.ots.common.converter.enums;
 
 import com.fasterxml.jackson.annotation.JsonValue;
 

+ 1 - 1
src/main/java/com/zhixinghe1/ots/common/converter/enumconverter/IntegerToEnumConverter.java → src/main/java/com/zhixinghe1/ots/common/converter/enums/IntegerToEnumConverter.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.common.converter.enumconverter;
+package com.zhixinghe1.ots.common.converter.enums;
 
 import org.springframework.core.convert.converter.Converter;
 

+ 1 - 1
src/main/java/com/zhixinghe1/ots/common/converter/enumconverter/IntegerToEnumConverterFactory.java → src/main/java/com/zhixinghe1/ots/common/converter/enums/IntegerToEnumConverterFactory.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.common.converter.enumconverter;
+package com.zhixinghe1.ots.common.converter.enums;
 
 import org.springframework.core.convert.converter.Converter;
 import org.springframework.core.convert.converter.ConverterFactory;

+ 17 - 0
src/main/java/com/zhixinghe1/ots/common/converter/mapstruct/BaseEntityConverter.java

@@ -1,8 +1,11 @@
 package com.zhixinghe1.ots.common.converter.mapstruct;
 
+import java.util.List;
+
 /**
  * 对象转换工具
  *
+ * @author myou
  * @param <Entity>
  * @param <Dto>
  */
@@ -23,4 +26,18 @@ public interface BaseEntityConverter<Entity, Dto> {
      * @return
      */
     Entity convert2Entity(Dto dto);
+
+    /**
+     * 实体列表转换为DTO列表
+     * @param entityList
+     * @return
+     */
+    List<Dto> convert2DtoList(List<Entity> entityList);
+
+    /**
+     * DTO列表转换为实体列表
+     * @param dtoList
+     * @return
+     */
+    List<Entity> convert2EntityList(List<Dto> dtoList);
 }

+ 0 - 26
src/main/java/com/zhixinghe1/ots/common/converter/mapstruct/BaseMapStruct.java

@@ -1,26 +0,0 @@
-package com.zhixinghe1.ots.common.converter.mapstruct;
-
-import com.zhixinghe1.ots.domain.dto.Attach;
-import com.zhixinghe1.ots.domain.dto.AttachmentDto;
-import java.util.List;
-import org.mapstruct.Mapper;
-import org.springframework.core.convert.converter.Converter;
-
-public class BaseMapStruct<Entity, Dto> {
-
-  @Mapper(componentModel = "spring")
-  public interface AttachmentConverter extends Converter<Entity, Dto> {
-
-  }
-
-  @Mapper(componentModel = "spring")
-  public interface AttachListConverter extends Converter<List<Entity>, List<Dto>> {
-
-  }
-
-  @Mapper(componentModel = "spring")
-  public interface AttachConverter extends Converter<Attach, AttachmentDto> {
-
-  }
-
-}

+ 7 - 1
src/main/java/com/zhixinghe1/ots/config/MyBatisConfig.java

@@ -1,10 +1,16 @@
 package com.zhixinghe1.ots.config;
 
+import static com.zhixinghe1.ots.config.MyBatisConfig.MAPPER_SCAN_PATH;
+
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
-@MapperScan("com.zhixinghe1.ots.atomic.mapper")
+@MapperScan(basePackages = MAPPER_SCAN_PATH)
 public class MyBatisConfig {
 
+  /**
+   * MyBatis扫描路径
+   */
+  public static final String MAPPER_SCAN_PATH = "com.zhixinghe1.ots.atomic.mapper";
 }

+ 1 - 1
src/main/java/com/zhixinghe1/ots/config/WebMvcConfig.java

@@ -1,6 +1,6 @@
 package com.zhixinghe1.ots.config;
 
-import com.zhixinghe1.ots.common.converter.enumconverter.IntegerToEnumConverterFactory;
+import com.zhixinghe1.ots.common.converter.enums.IntegerToEnumConverterFactory;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.format.FormatterRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

+ 0 - 27
src/main/java/com/zhixinghe1/ots/domain/dto/Attach.java

@@ -1,27 +0,0 @@
-package com.zhixinghe1.ots.domain.dto;
-
-import lombok.Data;
-
-@Data
-public class Attach {
-
-  /**
-   * 主键
-   */
-  private Long id;
-
-  /**
-   * 文件名
-   */
-  private String name;
-
-  /**
-   * 文件路径
-   */
-  private String path;
-
-  /**
-   * 使用状态
-   */
-  private Boolean status;
-}

+ 1 - 1
src/main/java/com/zhixinghe1/ots/domain/dto/WaterMarkRequest.java

@@ -10,7 +10,7 @@ import lombok.Data;
 @Data
 public class WaterMarkRequest {
 
-    private String attachmentId;
+    private Long attachmentId;
 
     /**
      * 水印内容

+ 1 - 1
src/main/java/com/zhixinghe1/ots/service/constant/FontEnum.java

@@ -1,6 +1,6 @@
 package com.zhixinghe1.ots.service.constant;
 
-import com.zhixinghe1.ots.common.converter.enumconverter.IJsonEnum;
+import com.zhixinghe1.ots.common.converter.enums.IJsonEnum;
 
 /**
  * 字体

+ 1 - 1
src/main/java/com/zhixinghe1/ots/service/constant/FontStyleEnum.java

@@ -1,6 +1,6 @@
 package com.zhixinghe1.ots.service.constant;
 
-import com.zhixinghe1.ots.common.converter.enumconverter.IJsonEnum;
+import com.zhixinghe1.ots.common.converter.enums.IJsonEnum;
 
 import java.awt.*;
 

+ 1 - 1
src/main/java/com/zhixinghe1/ots/service/constant/PositionEnum.java

@@ -1,6 +1,6 @@
 package com.zhixinghe1.ots.service.constant;
 
-import com.zhixinghe1.ots.common.converter.enumconverter.IJsonEnum;
+import com.zhixinghe1.ots.common.converter.enums.IJsonEnum;
 import net.coobird.thumbnailator.geometry.Position;
 import net.coobird.thumbnailator.geometry.Positions;
 

+ 5 - 39
src/main/java/com/zhixinghe1/ots/service/controller/WaterMarkController.java

@@ -1,17 +1,15 @@
 package com.zhixinghe1.ots.service.controller;
 
-import com.zhixinghe1.ots.atomic.service.IAttachmentService;
-import com.zhixinghe1.ots.config.BizConfig;
-import com.zhixinghe1.ots.domain.dto.Attach;
-import com.zhixinghe1.ots.domain.dto.AttachmentDto;
 import com.zhixinghe1.ots.domain.dto.WaterMarkRequest;
 import com.zhixinghe1.ots.service.manager.IWaterMarkManager;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import java.io.UnsupportedEncodingException;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.convert.ConversionService;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 @Tag(name = "水印")
@@ -19,43 +17,11 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/watermark")
 public class WaterMarkController {
 
-  @Autowired
-  private BizConfig bizConfig;
-
   @Autowired
   private IWaterMarkManager waterMarkManager;
 
-  @Autowired
-  private IAttachmentService attachmentService;
-
-  @GetMapping(value = "/make")
-  public WaterMarkRequest make(WaterMarkRequest request) throws UnsupportedEncodingException {
+  @PostMapping(value = "/make")
+  public void make(@RequestBody WaterMarkRequest request) throws UnsupportedEncodingException {
     waterMarkManager.make(request);
-    return null;
-  }
-
-  @GetMapping("test2")
-  public AttachmentDto test2(Long id) {
-    System.out.println(("----- selectAll method test ------"));
-    AttachmentDto attachmentDto = attachmentService.selectById(id);
-    return attachmentDto;
-  }
-
-  @Autowired
-  private ConversionService conversionService;
-
-//  @Autowired
-//  private ConversionServiceAdapter adapter;
-
-  @GetMapping("test3")
-  public Attach test3() {
-    AttachmentDto attachmentDto = new AttachmentDto();
-    attachmentDto.setPath("/12342");
-    attachmentDto.setStatus(true);
-    attachmentDto.setName("测试.jpg");
-    Attach convert = conversionService.convert(attachmentDto, Attach.class);
-//    Attachment convert = adapter.m
-    return convert;
-//    return null;
   }
 }

+ 59 - 30
src/main/java/com/zhixinghe1/ots/service/manager/impl/WaterMarkManagerImpl.java

@@ -1,5 +1,8 @@
 package com.zhixinghe1.ots.service.manager.impl;
 
+import com.zhixinghe1.ots.atomic.service.IAttachmentService;
+import com.zhixinghe1.ots.common.exception.BusinessException;
+import com.zhixinghe1.ots.domain.dto.AttachmentDto;
 import com.zhixinghe1.ots.domain.dto.WaterMarkLayout;
 import com.zhixinghe1.ots.domain.dto.WaterMarkRequest;
 import com.zhixinghe1.ots.domain.dto.WaterMarkStyle;
@@ -7,15 +10,17 @@ import com.zhixinghe1.ots.service.constant.PositionEnum;
 import com.zhixinghe1.ots.service.core.TileImageFilter;
 import com.zhixinghe1.ots.service.manager.IWaterMarkManager;
 import jakarta.servlet.http.HttpServletResponse;
+import java.awt.Color;
+import java.awt.Font;
 import lombok.extern.slf4j.Slf4j;
 import net.coobird.thumbnailator.Thumbnails;
 import net.coobird.thumbnailator.filters.Caption;
 import net.coobird.thumbnailator.filters.ImageFilter;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
-import java.awt.*;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
@@ -26,34 +31,58 @@ import java.util.Optional;
 @Service
 public class WaterMarkManagerImpl implements IWaterMarkManager {
 
-    @Override
-    public void make(WaterMarkRequest request) throws UnsupportedEncodingException {
-        WaterMarkStyle style = request.getWaterMarkStyle();
-        WaterMarkLayout layout = request.getWaterMarkLayout();
-        Font font = new Font(style.getFont().getName(), style.getFontStyle().getCode(), style.getSize());
-
-        ImageFilter imageFilter = null;
-        if (PositionEnum.TILE.equals(layout.getPosition())) {
-            imageFilter = new TileImageFilter(request.getContent(), font, Color.WHITE, style.getAlpha(), layout.getDegree(),
-                    layout.getInterval(), layout.getInterval(), layout.getCriscross());
-        } else {
-            imageFilter = new Caption(request.getContent(), font, Color.BLUE, style.getAlpha(), layout.getPosition().getPosition(), 5);
-        }
-
-        HttpServletResponse response = Optional.ofNullable(
-                        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse())
-                .orElseThrow();
-        response.setContentType("application/force-download");
-        response.setCharacterEncoding("UTF-8");
-        response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("测试123.jpg", "UTF-8"));
-
-        try (OutputStream outputStream = response.getOutputStream()) {
-            Thumbnails.of("C:\\Users\\tyuio\\Desktop\\捕获(1).jpg")
-                    .scale(1, 1)
-                    .addFilter(imageFilter)
-                    .toOutputStream(outputStream);
-        } catch (IOException e) {
-            log.error("导出水印时发生异常", e);
-        }
+  @Autowired
+  private IAttachmentService attachmentService;
+
+  @Override
+  public void make(WaterMarkRequest request) throws UnsupportedEncodingException {
+    AttachmentDto attachmentDto = attachmentService.getById(request.getAttachmentId());
+    if (attachmentDto == null) {
+      throw BusinessException.fail(String.format("无效的附件:%d", request.getAttachmentId()));
+    }
+
+    HttpServletResponse response = Optional.ofNullable(
+            ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse())
+        .orElseThrow();
+    response.setContentType("application/octet-stream");
+    response.setCharacterEncoding("UTF-8");
+    response.setHeader("Content-Disposition",
+        "attachment;fileName=" + URLEncoder.encode(attachmentDto.getName(), "UTF-8"));
+
+    try (OutputStream outputStream = response.getOutputStream()) {
+        makeWaterMark(outputStream, request, attachmentDto);
+    } catch (IOException e) {
+      log.error("导出水印时发生异常", e);
     }
+  }
+
+    /**
+     * 添加水印
+     * @param outputStream
+     * @param request
+     * @param attachmentDto
+     * @throws IOException
+     */
+  private void makeWaterMark(OutputStream outputStream, WaterMarkRequest request, AttachmentDto attachmentDto)
+      throws IOException {
+      WaterMarkStyle style = request.getWaterMarkStyle();
+      WaterMarkLayout layout = request.getWaterMarkLayout();
+      Font font = new Font(style.getFont().getName(), style.getFontStyle().getCode(),
+          style.getSize());
+
+      ImageFilter imageFilter = null;
+      if (PositionEnum.TILE.equals(layout.getPosition())) {
+          imageFilter = new TileImageFilter(request.getContent(), font, Color.WHITE, style.getAlpha(),
+              layout.getDegree(),
+              layout.getInterval(), layout.getInterval(), layout.getCriscross());
+      } else {
+          imageFilter = new Caption(request.getContent(), font, Color.BLUE, style.getAlpha(),
+              layout.getPosition().getPosition(), 5);
+      }
+
+      Thumbnails.of(attachmentDto.getPath())
+          .scale(2, 2)
+          .addFilter(imageFilter)
+          .toOutputStream(outputStream);
+  }
 }

+ 1 - 0
src/main/resources/application.yml

@@ -12,6 +12,7 @@ spring:
   sql:
     init:
       schema-locations: classpath:db/schema-h2.sql
+#      mode: always
   h2:
     console:
       enabled: true