fanxp 1 year ago
parent
commit
420141b37a

+ 0 - 1
pom.xml

@@ -65,7 +65,6 @@
         <license.version>2.0</license.version>
         <easy.captcha.version>1.6.2</easy.captcha.version>
         <paho.mqttv5.version>1.2.5</paho.mqttv5.version>
-
     </properties>
 
     <dependencies>

+ 98 - 0
src/main/java/com/xjrsoft/common/utils/ImageUtil.java

@@ -0,0 +1,98 @@
+package com.xjrsoft.common.utils;
+
+import javax.imageio.ImageIO;
+import javax.imageio.stream.FileImageOutputStream;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Base64;
+
+public class ImageUtil {
+    public static byte[] getByteByPic(String imageUrl) throws IOException {
+        File imageFile = new File(imageUrl);
+        InputStream inStream = new FileInputStream(imageFile);
+        BufferedInputStream bis = new BufferedInputStream(inStream);
+        BufferedImage bm = ImageIO.read(bis);
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        String type = imageUrl.substring(imageUrl.length() - 3);
+        ImageIO.write(bm, type, bos);
+        bos.flush();
+        byte[] data = bos.toByteArray();
+        return data;
+    }
+    /**
+     * 将图片压缩到指定大小以内
+     *
+     * @param srcImgData 源图片数据
+     * @param maxSize 目的图片大小
+     * @return 压缩后的图片数据
+     */
+    public static byte[] compressUnderSize(byte[] srcImgData, long maxSize) {
+        double scale = 0.9;
+        byte[] imgData = Arrays.copyOf(srcImgData, srcImgData.length);
+
+        if (imgData.length > maxSize) {
+            do {
+                try {
+                    imgData = compress(imgData, scale);
+
+                } catch (IOException e) {
+                    throw new IllegalStateException("压缩图片过程中出错,请及时联系管理员!", e);
+                }
+
+            } while (imgData.length > maxSize);
+        }
+
+        return imgData;
+    }
+
+    /**
+     * 按照 宽高 比例压缩
+     *
+     * @param imgIs 待压缩图片输入流
+     * @param scale 压缩刻度
+     * @param out 输出
+     * @return 压缩后图片数据
+     * @throws IOException 压缩图片过程中出错
+     */
+    public static byte[] compress(byte[] srcImgData, double scale) throws IOException {
+        BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
+        int width = (int) (bi.getWidth() * scale); // 源图宽度
+        int height = (int) (bi.getHeight() * scale); // 源图高度
+
+        Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+        BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+        Graphics g = tag.getGraphics();
+        g.setColor(Color.RED);
+        g.drawImage(image, 0, 0, null); // 绘制处理后的图
+        g.dispose();
+
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        ImageIO.write(tag, "JPEG", bOut);
+
+        return bOut.toByteArray();
+    }
+
+    //byte数组到图片
+    public static void byte2image(byte[] data,String path){
+        if(data.length<3||path.equals("")) return;
+        try{
+            FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
+            imageOutput.write(data, 0, data.length);
+            imageOutput.close();
+            System.out.println("Make Picture success,Please find image in " + path);
+        } catch(Exception ex) {
+            System.out.println("Exception: " + ex);
+            ex.printStackTrace();
+        }
+    }
+
+    public static String bytesEncode2Base64(byte[] bytes) {
+        return new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8);
+    }
+
+
+}

+ 47 - 5
src/main/java/com/xjrsoft/module/personnel/controller/FaceManagementController.java

@@ -7,12 +7,15 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.ImageUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.personnel.dto.*;
@@ -23,12 +26,19 @@ import com.xjrsoft.module.system.service.ICodeRuleService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.springframework.web.bind.annotation.RequestMethod.POST;
 
@@ -79,11 +89,16 @@ public class FaceManagementController {
         return R.ok(BeanUtil.toBean(faceManagement, FaceManagementVo.class));
     }
 
-    @RequestMapping(method = POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
-    @ApiOperation(value = "新增人脸", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @PostMapping
+    @ApiOperation(value = "新增人脸")
     @SaCheckPermission("facemanager:add")
-    public R add(@Valid @RequestBody AddFaceManagementDto dto, @RequestPart MultipartFile file) {
+    public R add(AddFaceManagementDto dto, @RequestParam("file") MultipartFile file) {
         FaceManagement faceManagement = BeanUtil.toBean(dto, FaceManagement.class);
+        try {
+            faceManagement.setRegisterBase64(ImageHandler(file));
+        } catch (Exception e) {
+            return R.error(e.getMessage());
+        }
         boolean isSuccess = faceManagementService.add(faceManagement);
         codeRuleService.useEncode("FACECODE");
         return R.ok(isSuccess);
@@ -93,9 +108,13 @@ public class FaceManagementController {
     @PutMapping
     @ApiOperation(value = "修改人脸")
     @SaCheckPermission("facemanager:edit")
-    public R update(@Valid @RequestBody UpdateFaceManagementDto dto) {
-
+    public R update(UpdateFaceManagementDto dto, @RequestParam("file") MultipartFile file) {
         FaceManagement faceManagement = BeanUtil.toBean(dto, FaceManagement.class);
+        try {
+            faceManagement.setRegisterBase64(ImageHandler(file));
+        } catch (Exception e) {
+            return R.error(e.getMessage());
+        }
         return R.ok(faceManagementService.update(faceManagement));
 
     }
@@ -114,4 +133,27 @@ public class FaceManagementController {
     public R delete(@Valid @RequestBody List<Long> ids) {
         return R.ok(faceManagementService.delete(ids));
     }
+
+    // 图片处理
+    public String ImageHandler(@NotNull MultipartFile file) throws IOException {
+        String filename = file.getOriginalFilename();
+        String suffix = StringUtils.substringAfterLast(filename, StringPool.DOT);
+        String[] imgSuffix = new String[]{"png", "jpg", "jpeg"};
+
+        if (!Arrays.asList(imgSuffix).contains(suffix)) {
+            throw new MyException("图片格式不正确!");
+        }
+        Map<String, String> map = new HashMap<String, String>() {
+            {
+                put("jpg", "data:image/jpg;base64,");
+                put("jpeg", "data:image/jpeg;base64,");
+                put("png", "data:image/png;base64,");
+            }
+        };
+
+        Long maxSize = 2097152L; // 最大文件2M
+        byte[] resultImg = ImageUtil.compressUnderSize(file.getBytes(), maxSize);
+
+        return map.get(imgSuffix) + ImageUtil.bytesEncode2Base64(resultImg);
+    }
 }

+ 9 - 25
src/main/java/com/xjrsoft/module/personnel/dto/AddFaceManagementDto.java

@@ -38,39 +38,23 @@ public class AddFaceManagementDto {
     /**
      * 名单有效期开始时间
      */
-    @ApiModelProperty("名单有效期开始时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Timestamp peopleStartDate;
-    /**
-     * 名单有效期结束时间
-     */
-    @ApiModelProperty("名单有效期结束时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Timestamp peopleEndDate;
+//    @ApiModelProperty("名单有效期开始时间")
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private Timestamp peopleStartDate;
+//    /**
+//     * 名单有效期结束时间
+//     */
+//    @ApiModelProperty("名单有效期结束时间")
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private Timestamp peopleEndDate;
     /**
      * ic卡号(10位10进制)
      */
     @ApiModelProperty("ic卡号(10位10进制)")
     private String icno;
-    /**
-     * 图片
-     */
-    @ApiModelProperty("图片")
-    private MultipartFile file;
     /**
      * 状态 1=启用 2=禁用
      */
     @ApiModelProperty("状态 1=启用 2=禁用")
     private Integer status;
-
-    /**
-     * 验证状态 1=未验证 2=通过 3=失败
-     */
-    @ApiModelProperty("验证状态 1=未验证 2=通过 3=失败")
-    private Integer verifyStatus;
-    /**
-     * 验证失败说明
-     */
-    @ApiModelProperty("验证失败说明")
-    private String verifyErrorMsg;
 }

+ 77 - 1
src/main/java/com/xjrsoft/module/personnel/vo/FaceManagementVo.java

@@ -1,8 +1,84 @@
 package com.xjrsoft.module.personnel.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.xjrsoft.module.personnel.dto.UpdateFaceManagementDto;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+
 @Data
-public class FaceManagementVo extends UpdateFaceManagementDto {
+public class FaceManagementVo {
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+     * 用户ID(xjr_user)
+     */
+    @ApiModelProperty("用户ID(xjr_user)")
+    private Long userId;
+    /**
+     * 人脸编码
+     */
+    @ApiModelProperty("人脸编码")
+    private String faceCode;
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 性别 男, 女
+     */
+    @ApiModelProperty("性别 男, 女")
+    private String sex;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String idno;
+    /**
+     * 名单有效期开始时间
+     */
+    @ApiModelProperty("名单有效期开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime peopleStartDate;
+    /**
+     * 名单有效期结束时间
+     */
+    @ApiModelProperty("名单有效期结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime peopleEndDate;
+    /**
+     * ic卡号(10位10进制)
+     */
+    @ApiModelProperty("ic卡号(10位10进制)")
+    private String icno;
+    /**
+     * 图片的base64字符串
+     */
+    @ApiModelProperty("图片的base64字符串")
+    private String registerBase64;
+    /**
+     * 数据同步状态 1=未同步 2=已同步 3=同步失败
+     */
+    @ApiModelProperty("数据同步状态 1=未同步 2=已同步 3=同步失败")
+    private Integer syncStatus;
+    /**
+     * 状态 1=启用 2=禁用
+     */
+    @ApiModelProperty("状态 1=启用 2=禁用")
+    private Integer status;
+    /**
+     * 验证状态 1=未验证 2=通过 3=失败
+     */
+    @ApiModelProperty("验证状态 1=未验证 2=通过 3=失败")
+    private Integer verifyStatus;
+    /**
+     * 验证失败说明
+     */
+    @ApiModelProperty("验证失败说明")
+    private String verifyErrorMsg;
 }

+ 102 - 0
src/test/java/com/xjrsoft/common/utils/ImageTest.java

@@ -0,0 +1,102 @@
+package com.xjrsoft.common.utils;
+
+import org.junit.jupiter.api.Test;
+
+import javax.imageio.ImageIO;
+import javax.imageio.stream.FileImageOutputStream;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.Arrays;
+
+public class ImageTest {
+    @Test
+    public void picTest() throws IOException {
+        long timeStart = System.currentTimeMillis();
+        String imgLocalUrl = "/Users/fanxp/Downloads/d3b1cc193f33a7ce8f6b1aa9dc6887e5.jpeg";
+
+        byte[] imgBytes = getByteByPic(imgLocalUrl);
+        byte[] resultImg = compressUnderSize(imgBytes,2097152);
+        byte2image(resultImg,"/Users/fanxp/Downloads/111.jpg");
+        long timeEnd = System.currentTimeMillis();
+        System.out.println("耗时:"+ (timeEnd - timeStart));
+    }
+
+    public static byte[] getByteByPic(String imageUrl) throws IOException {
+        File imageFile = new File(imageUrl);
+        InputStream inStream = new FileInputStream(imageFile);
+        BufferedInputStream bis = new BufferedInputStream(inStream);
+        BufferedImage bm = ImageIO.read(bis);
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        String type = imageUrl.substring(imageUrl.length() - 3);
+        ImageIO.write(bm, type, bos);
+        bos.flush();
+        byte[] data = bos.toByteArray();
+        return data;
+    }
+    /**
+     * 将图片压缩到指定大小以内
+     *
+     * @param srcImgData 源图片数据
+     * @param maxSize 目的图片大小
+     * @return 压缩后的图片数据
+     */
+    public static byte[] compressUnderSize(byte[] srcImgData, long maxSize) {
+        double scale = 0.9;
+        byte[] imgData = Arrays.copyOf(srcImgData, srcImgData.length);
+
+        if (imgData.length > maxSize) {
+            do {
+                try {
+                    imgData = compress(imgData, scale);
+
+                } catch (IOException e) {
+                    throw new IllegalStateException("压缩图片过程中出错,请及时联系管理员!", e);
+                }
+
+            } while (imgData.length > maxSize);
+        }
+
+        return imgData;
+    }
+
+    /**
+     * 按照 宽高 比例压缩
+     *
+     * @param scale 压缩刻度
+     * @return 压缩后图片数据
+     * @throws IOException 压缩图片过程中出错
+     */
+    public static byte[] compress(byte[] srcImgData, double scale) throws IOException {
+        BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
+        int width = (int) (bi.getWidth() * scale); // 源图宽度
+        int height = (int) (bi.getHeight() * scale); // 源图高度
+
+        Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+        BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+        Graphics g = tag.getGraphics();
+        g.setColor(Color.RED);
+        g.drawImage(image, 0, 0, null); // 绘制处理后的图
+        g.dispose();
+
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        ImageIO.write(tag, "JPEG", bOut);
+
+        return bOut.toByteArray();
+    }
+
+    //byte数组到图片
+    public static void byte2image(byte[] data,String path){
+        if(data.length<3||path.equals("")) return;
+        try{
+            FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
+            imageOutput.write(data, 0, data.length);
+            imageOutput.close();
+            System.out.println("Make Picture success,Please find image in " + path);
+        } catch(Exception ex) {
+            System.out.println("Exception: " + ex);
+            ex.printStackTrace();
+        }
+    }
+}