xiongzhu 5 жил өмнө
parent
commit
c9eb82bdaa

+ 7 - 0
pom.xml

@@ -278,6 +278,13 @@
             <artifactId>javacv-platform</artifactId>
             <version>1.5.4</version>
         </dependency>
+
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.13</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 3 - 0
src/main/java/com/izouma/jiashanxia/domain/User.java

@@ -114,4 +114,7 @@ public class User extends BaseEntity implements Serializable {
     @JoinColumn(name = "companyId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     @NotFound(action = NotFoundAction.IGNORE)
     private Company company;
+
+    @ApiModelProperty("分享图片")
+    private String shareImg;
 }

+ 46 - 0
src/main/java/com/izouma/jiashanxia/service/UserService.java

@@ -1,6 +1,7 @@
 package com.izouma.jiashanxia.service;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
@@ -27,11 +28,14 @@ import com.izouma.jiashanxia.service.storage.StorageService;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import com.izouma.jiashanxia.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import net.coobird.thumbnailator.Thumbnails;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -39,11 +43,16 @@ import org.springframework.data.domain.Page;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
+import javax.imageio.ImageIO;
 import javax.persistence.criteria.Predicate;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.List;
 import java.util.stream.Collectors;
 
 @Service
@@ -473,4 +482,41 @@ public class UserService {
             return criteriaBuilder.and(and.toArray(new Predicate[0]));
         }), JpaUtils.toPageRequest(pageQuery));
     }
+
+    public String shareImg(Long userId) throws IOException, WxErrorException {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
+        if (!(StringUtils.isNotEmpty(user.getShareImg()) && user.getShareImg().contains("/v1/"))) {
+            String url = createShareImg(userId);
+            user.setShareImg(url);
+            userRepo.save(user);
+        }
+        return user.getShareImg();
+    }
+
+    public String createShareImg(Long userId) throws IOException, WxErrorException {
+        BufferedImage shareImg = ImageIO.read(this.getClass().getResourceAsStream("/static/shareImg.png"));
+        BufferedImage result = new BufferedImage(shareImg.getWidth(), shareImg.getHeight(), BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = result.createGraphics();
+        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+        g.setComposite(AlphaComposite.SrcOver);
+        g.drawImage(shareImg, 0, 0, null);
+
+        byte[] bytes = wxMaService.getQrcodeService()
+                .createWxaCodeUnlimitBytes("invitor=" + userId, "pages/home", 94 * 2, false, new WxMaCodeLineColor("0", "0", "0"), true);
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
+        BufferedImage codeImg = ImageIO.read(byteArrayInputStream);
+
+        g.drawImage(codeImg, 251 * 2, 543 * 2, 94 * 2, 94 * 2, null);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
+        Thumbnails.of(result)
+                .scale(1)
+                .outputQuality(.9f)
+                .outputFormat("jpg")
+                .toOutputStream(out);
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+        return storageService.uploadFromInputStream(in, "share_img/v1/" + userId + ".jpg");
+    }
 }

+ 7 - 0
src/main/java/com/izouma/jiashanxia/web/UserController.java

@@ -17,6 +17,8 @@ import com.izouma.jiashanxia.utils.SecurityUtils;
 import com.izouma.jiashanxia.utils.excel.ExcelUtils;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -201,4 +203,9 @@ public class UserController extends BaseController {
     public Page<User> children(@RequestBody PageQuery pageQuery) {
         return userService.children(pageQuery);
     }
+
+    @GetMapping("/shareImg")
+    public String shareImg() throws IOException, WxErrorException {
+        return userService.shareImg(SecurityUtils.getAuthenticatedUser().getId());
+    }
 }

BIN
src/main/resources/static/shareImg.png


+ 8 - 1
src/test/java/com/izouma/jiashanxia/service/UserServiceTest.java

@@ -3,9 +3,9 @@ package com.izouma.jiashanxia.service;
 import cn.hutool.core.collection.CollUtil;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.dto.PageQuery;
-import com.izouma.jiashanxia.dto.PromotionDTO;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.UserRepo;
+import me.chanjar.weixin.common.error.WxErrorException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,6 +13,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.data.domain.Page;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -71,4 +72,10 @@ public class UserServiceTest {
     public void test4() {
         System.out.println(userService.childrenId(928L));
     }
+
+    @Test
+    public void shareImg() throws IOException, WxErrorException {
+        System.out.println(userService.createShareImg(1L));
+
+    }
 }