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