From f7b578e94bc6176c95162903b4e61c99b45ae524 Mon Sep 17 00:00:00 2001 From: khalil Date: Thu, 14 Mar 2024 02:01:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=80=E8=AF=B7=E6=B4=BB=E5=8A=A8-=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../accompany-admin-service/pom.xml | 5 - .../link/impl/ShortLinkAdminServiceImpl.java | 5 +- .../com/accompany/admin/util/QrCodeUtil.java | 42 -------- .../business/model/UserInviteCode.java | 84 +--------------- .../vo/invite/UserInviteProfitVo.java | 4 + .../accompany-business-service/pom.xml | 5 + .../service/user/UserInviteCodeService.java | 39 +++++++- .../service/user/UserInviteService.java | 15 ++- .../accompany/business/util/QrCodeUtil.java | 97 +++++++++++++++++++ .../invite/UserInviteController.java | 2 + accompany-dependencies/pom.xml | 2 +- 11 files changed, 166 insertions(+), 134 deletions(-) delete mode 100644 accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/util/QrCodeUtil.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/util/QrCodeUtil.java diff --git a/accompany-admin/accompany-admin-service/pom.xml b/accompany-admin/accompany-admin-service/pom.xml index ff18e558a..4683bad18 100644 --- a/accompany-admin/accompany-admin-service/pom.xml +++ b/accompany-admin/accompany-admin-service/pom.xml @@ -72,11 +72,6 @@ tomcat-embed-core compile - - com.google.zxing - javase - ${zxing.version} - diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/link/impl/ShortLinkAdminServiceImpl.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/link/impl/ShortLinkAdminServiceImpl.java index a80b4584c..f76b364bc 100644 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/link/impl/ShortLinkAdminServiceImpl.java +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/link/impl/ShortLinkAdminServiceImpl.java @@ -5,14 +5,13 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.StrUtil; import com.accompany.admin.dto.link.ShortLinkAdminDto; import com.accompany.admin.service.link.ShortLinkAdminService; -import com.accompany.admin.util.QrCodeUtil; +import com.accompany.business.util.QrCodeUtil; import com.accompany.admin.vo.link.ShortLinkAdminVo; import com.accompany.business.enums.link.ShortLinkTypeEnum; import com.accompany.business.model.link.ShortLink; import com.accompany.business.model.link.ShortLinkRecord; import com.accompany.business.mybatismapper.link.ShortLinkMapper; import com.accompany.business.mybatismapper.link.ShortLinkRecordMapper; -import com.accompany.business.service.api.QinniuService; import com.accompany.common.constant.Constant; import com.accompany.common.model.PageReq; import com.accompany.common.tencent.cos.TencentCosUploadService; @@ -109,7 +108,7 @@ public class ShortLinkAdminServiceImpl implements ShortLinkAdminService { String url = linkUrl + code; InputStream inputStream = null; try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - QrCodeUtil.encode(url, 200, 200, outputStream); + QrCodeUtil.encode(url, outputStream); inputStream = new ByteArrayInputStream(outputStream.toByteArray()); String fileName = UUIDUtil.get() + ".png"; qrcode = uploadService.uploadByStream(inputStream, fileName); diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/util/QrCodeUtil.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/util/QrCodeUtil.java deleted file mode 100644 index 0e29a33de..000000000 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/util/QrCodeUtil.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.accompany.admin.util; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.MultiFormatWriter; -import com.google.zxing.client.j2se.MatrixToImageWriter; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; - -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Hashtable; -import java.util.Map; - -/** - * 二维码生成工具类 - */ -public class QrCodeUtil { - - /** - * 生成二维码 - * David - * - * @param url url 网址 - * @param width 二维码宽度 - * @param height 二维码高度 - */ - public static void encode(String url, int width, int height, OutputStream outputStream) { - Map hints = new Hashtable<>(); - // 指定纠错等级 - hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); - // 指定编码格式 - hints.put(EncodeHintType.CHARACTER_SET, "UTF8"); - try { - BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints); - MatrixToImageWriter.writeToStream(bitMatrix, "png", outputStream); - } catch (Exception ignored) { - } - } - -} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserInviteCode.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserInviteCode.java index bc183698f..d21b3cdf7 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserInviteCode.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserInviteCode.java @@ -3,9 +3,11 @@ package com.accompany.business.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; import java.util.Date; +@Data public class UserInviteCode { @TableId(value = "id", type = IdType.AUTO) @@ -35,86 +37,10 @@ public class UserInviteCode { @TableField("gen_scene") private Byte genScene; + @TableField("qr_code_url") + private String qrCodeUrl; + @TableField("creator") private String creator; - public Byte getGenScene() { - return genScene; - } - - public void setGenScene(Byte genScene) { - this.genScene = genScene; - } - - public String getCreator() { - return creator; - } - - public void setCreator(String creator) { - this.creator = creator; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Long getUid() { - return uid; - } - - public void setUid(Long uid) { - this.uid = uid; - } - - public String getInviteCode() { - return inviteCode; - } - - public void setInviteCode(String inviteCode) { - this.inviteCode = inviteCode == null ? null : inviteCode.trim(); - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public Date getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } - - public Byte getStatus() { - return status; - } - - public void setStatus(Byte status) { - this.status = status; - } - - public Boolean getIsPrimary() { - return isPrimary; - } - - public void setIsPrimary(Boolean isPrimary) { - this.isPrimary = isPrimary; - } - - public Integer getInviteCodeType() { - return inviteCodeType; - } - - public void setInviteCodeType(Integer inviteCodeType) { - this.inviteCodeType = inviteCodeType; - } } \ No newline at end of file diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/invite/UserInviteProfitVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/invite/UserInviteProfitVo.java index 0f80d5e99..69a72c345 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/invite/UserInviteProfitVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/invite/UserInviteProfitVo.java @@ -1,5 +1,6 @@ package com.accompany.business.vo.invite; +import com.accompany.common.annotation.ReplaceAppDomain; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -43,4 +44,7 @@ public class UserInviteProfitVo { @ApiModelProperty("间接邀请收益") private Long indirectProfit = 0L; + @ReplaceAppDomain + @ApiModelProperty("二维码url") + private String qRCodeUrl; } diff --git a/accompany-business/accompany-business-service/pom.xml b/accompany-business/accompany-business-service/pom.xml index 0d3728f61..aab8618d0 100644 --- a/accompany-business/accompany-business-service/pom.xml +++ b/accompany-business/accompany-business-service/pom.xml @@ -105,6 +105,11 @@ cloudauth20190307 ${cloudauth20190307.version} + + com.google.zxing + javase + ${zxing.version} + \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInviteCodeService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInviteCodeService.java index 494ac6c45..95e62fd7f 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInviteCodeService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInviteCodeService.java @@ -3,11 +3,21 @@ package com.accompany.business.service.user; import com.accompany.business.model.UserInviteCode; import com.accompany.business.mybatismapper.UserInviteCodeMapper; import com.accompany.business.util.InviteCodeUtil; +import com.accompany.business.util.QrCodeUtil; +import com.accompany.common.constant.AppEnum; +import com.accompany.common.tencent.cos.TencentCosUploadService; +import com.accompany.common.utils.UUIDUtil; +import com.accompany.core.base.SpringContextHolder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; import java.util.List; import java.util.stream.Collectors; @@ -16,6 +26,7 @@ import java.util.stream.Collectors; * 3 * @Date: 2018/10/26 10:44 * 4 */ +@Slf4j @Service public class UserInviteCodeService extends ServiceImpl { @@ -69,8 +80,34 @@ public class UserInviteCodeService extends ServiceImpl userInviteCodes = userInviteCodeMapper.selectList(Wrappers.lambdaQuery() + List userInviteCodes = userInviteCodeService.lambdaQuery() .eq(UserInviteCode::getUid, uid) - .eq(UserInviteCode::getStatus, UserInviteCodeService.INVITE_CODE_STATUS_VALID)); + .eq(UserInviteCode::getStatus, UserInviteCodeService.INVITE_CODE_STATUS_VALID) + .list(); if (CollectionUtil.isEmpty(userInviteCodes)) { return profit; } @@ -57,6 +59,13 @@ public class UserInviteService { } UserInviteCode userInviteCode = userInviteCodes.get(0); profit.setInviteCode(userInviteCode.getInviteCode()); + + //todo 如有性能问题可异步 + if (StringUtils.isEmpty(userInviteCode.getQrCodeUrl())) { + userInviteCodeService.buildInviteQRCodeUrl(userInviteCode); + } + profit.setQRCodeUrl(userInviteCode.getQrCodeUrl()); + List records = userInviteFissionRewardRecordMapper.selectList(Wrappers.lambdaQuery() .eq(UserInviteFissionRewardRecord::getUid, uid) .between(config.getStartTime() != null && config.getEndTime() != null, UserInviteFissionRewardRecord::getCreateTime, config.getStartTime(), config.getEndTime())); diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/util/QrCodeUtil.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/util/QrCodeUtil.java new file mode 100644 index 000000000..0d5cdbff9 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/util/QrCodeUtil.java @@ -0,0 +1,97 @@ +package com.accompany.business.util; + +import com.accompany.common.config.TencentCosConfig; +import com.accompany.common.tencent.cos.TencentCosUploadService; +import com.accompany.core.base.SpringContextHolder; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.client.j2se.MatrixToImageConfig; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import lombok.SneakyThrows; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.OutputStream; +import java.net.URI; +import java.net.URL; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +/** + * 二维码生成工具类 + */ +public class QrCodeUtil { + + private static final String LOGO_FILE = "piko_logo_60x60.png"; + + /** + * 生成二维码 + * David + * + * @param url url 网址 + * @return + */ + @SneakyThrows + public static void encode(String url, OutputStream outputStream) { + Map hints = new Hashtable<>(); + // 指定纠错等级 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); + // 指定编码格式 + hints.put(EncodeHintType.CHARACTER_SET, "UTF8"); + BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 200, 200, hints); + MatrixToImageWriter.writeToStream(bitMatrix, "png", outputStream); + } + + /** + * 生成二维码 + */ + @SneakyThrows + public static void encodeWithLogo(String url, OutputStream outputStream) { + Map hints = new HashMap<>(); + //内容编码格式 + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + // 指定纠错等级 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + //设置二维码边的空度,非负数 + hints.put(EncodeHintType.MARGIN, 1); + BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 150, 150, hints); + //MatrixToImageWriter.writeToPath(bitMatrix, "png", new File("C:\\Users\\84232\\Desktop\\321.png").toPath());// 输出原图片 + MatrixToImageConfig matrixToImageConfig = new MatrixToImageConfig(0xFF000001, 0xFFFFFFFF); + BufferedImage logoImage = LogoMatrix(MatrixToImageWriter.toBufferedImage(bitMatrix,matrixToImageConfig)); + ImageIO.write(logoImage, "png", outputStream); + } + + /** + * 二维码添加logo + * @return 返回带有logo的二维码图片 + */ + @SneakyThrows + public static BufferedImage LogoMatrix(BufferedImage bufferedImage) { + Graphics2D g2 = bufferedImage.createGraphics(); + + int matrixWidth = bufferedImage.getWidth(); + int matrixHeigh = bufferedImage.getHeight(); + + String url = SpringContextHolder.getBean(TencentCosConfig.class).getUrlPrefix() + "/" + LOGO_FILE; + BufferedImage logo = ImageIO.read(new URL(url)); + + //开始绘制图片 + g2.drawImage(logo,matrixWidth/5*2,matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5, null);//绘制 + BasicStroke stroke = new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); + g2.setStroke(stroke);// 设置笔画对象 + + g2.dispose(); + bufferedImage.flush() ; + + return bufferedImage ; + } + +} diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/invite/UserInviteController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/invite/UserInviteController.java index 7fc754bd2..6758a13d6 100644 --- a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/invite/UserInviteController.java +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/invite/UserInviteController.java @@ -10,6 +10,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.ByteArrayOutputStream; + /** * @author: liaozetao * @date: 2024/3/12 15:26 diff --git a/accompany-dependencies/pom.xml b/accompany-dependencies/pom.xml index aa757e5ef..f217bdcd9 100644 --- a/accompany-dependencies/pom.xml +++ b/accompany-dependencies/pom.xml @@ -99,7 +99,7 @@ 1.5.0 0.0.20131108.vaadin1 1.64 - 3.2.0 + 3.5.3 1.20 1.34.0 2.5.1