Procházet zdrojové kódy

feat: 新增用户信息二维码

hidewnd před 1 měsícem
rodič
revize
31e2b80efa

+ 4 - 2
yt-common/src/main/java/com/ytpm/app/model/YtDyzUser.java

@@ -2,7 +2,6 @@ package com.ytpm.app.model;
 
 import com.ytpm.app.enums.LoginType;
 import com.ytpm.custom.CustomField;
-import com.ytpm.general.PageMeta;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -24,7 +23,7 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 @ApiModel("用户信息")
-public class YtDyzUser extends PageMeta {
+public class YtDyzUser extends YtUser {
     /** 用户ID */
     @ApiModelProperty("用户ID")
     private String userId;
@@ -158,4 +157,7 @@ public class YtDyzUser extends PageMeta {
 
     @ApiModelProperty(value = "体力不足提示语模板")
     private String powerLimitTip;
+
+    @ApiModelProperty(value = "校验二维码")
+    private String qrCode;
 }

+ 158 - 0
yt-common/src/main/java/com/ytpm/app/model/YtUser.java

@@ -0,0 +1,158 @@
+package com.ytpm.app.model;
+
+
+import com.ytpm.app.enums.LoginType;
+import com.ytpm.custom.CustomField;
+import com.ytpm.general.PageMeta;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author lih
+ * @date 2025-09-30 09:28
+ */
+@Data
+@ApiModel("广告联盟用户用户")
+@EqualsAndHashCode(callSuper = true)
+public class YtUser extends PageMeta {
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户ID")
+    private String userId;
+    /**
+     * 用户昵称
+     */
+    @ApiModelProperty("用户昵称")
+    private String nickName;
+    /**
+     * 用户头像
+     */
+    @ApiModelProperty("用户头像")
+    private String headImg;
+    /**
+     * 注册时间
+     */
+    @CustomField(node = 1)
+    @ApiModelProperty("注册时间")
+    private Date registryTime;
+    /**
+     * 最新登录时间
+     */
+    @ApiModelProperty("最新登录时间")
+    private Date lastLoginTime;
+    /**
+     * 注册时间
+     */
+    @CustomField(node = 1)
+    @ApiModelProperty("注册时间")
+    private String registryTimeStr;
+    /**
+     * 最新登录时间
+     */
+    @ApiModelProperty("最新登录时间")
+    private String lastLoginTimeStr;
+    /**
+     * 最新登录IP
+     */
+    @ApiModelProperty("最新登录IP")
+    private String lastLoginIp;
+    /**
+     * 登录天数
+     */
+    @CustomField(node = 1)
+    @ApiModelProperty("登录天数")
+    private Integer loginDays;
+
+    /**
+     * 用户签到天数
+     */
+    @ApiModelProperty("用户签到天数")
+    private Integer signDays;
+    /**
+     * 用户状态
+     */
+    @CustomField(value = "user_status", desc = "用户状态", node = 1)
+    @ApiModelProperty("用户状态")
+    private Integer userStatus;
+    /**
+     * 风控原因
+     */
+    @ApiModelProperty("风控原因")
+    private String riskReason;
+
+    /**
+     * 微信openid
+     */
+    @ApiModelProperty("微信openid")
+    private String wxOpenId;
+    /**
+     * iosId
+     */
+    @ApiModelProperty("iosId")
+    private String iosId;
+    /**
+     * 平台ID 唯一标识
+     */
+    @ApiModelProperty("平台ID")
+    private String platformId;
+
+    @ApiModelProperty(value = "渠道ID")
+    private Long ditchId;
+
+    @ApiModelProperty(value = "渠道名称")
+    private String ditchName;
+
+    @ApiModelProperty(value = "应用ID")
+    private String appId;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "设备ID")
+    private String deviceId;
+
+    @ApiModelProperty(value = "手机json收集信息")
+    private String phoneJson;
+
+    /**
+     * 总收益
+     */
+    @ApiModelProperty("总收益")
+    private BigDecimal totalIncome;
+
+    @ApiModelProperty("前三日总收益")
+    private BigDecimal nearlyIncome;
+
+    @ApiModelProperty(value = "今日收益")
+    private BigDecimal todayIncome;
+
+    /**
+     * 登录历史记录
+     */
+    @ApiModelProperty("登录历史记录")
+    private List<YtDyzLoginRecord> loginRecordList;
+
+    @ApiModelProperty(value = "登陆前三条广告记录")
+    List<YtDyzAdRecord> preAdRecordList;
+
+
+    // feign传参
+    @ApiModelProperty("风控编码")
+    private String riskCode;
+
+    @ApiModelProperty(value = "当前登陆方式")
+    private LoginType loginType;
+
+    @ApiModelProperty(value = "服务名")
+    private String serviceName;
+
+
+}

+ 6 - 0
yt-question/yt-question-service/pom.xml

@@ -17,6 +17,7 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <hikar-icp.version>4.0.3</hikar-icp.version>
+        <zxing.version>3.5.1</zxing.version>
     </properties>
 
     <dependencies>
@@ -52,6 +53,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>${zxing.version}</version>
+        </dependency>
     </dependencies>
 
 

+ 32 - 0
yt-question/yt-question-service/src/main/java/com/ytpm/question/controller/UserController.java

@@ -3,6 +3,8 @@ package com.ytpm.question.controller;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.ytpm.advertise.enums.AdSourceTypeEnum;
@@ -35,6 +37,8 @@ import com.ytpm.risk.enums.BannedTypeEnum;
 import com.ytpm.risk.view.RiskConfigView;
 import com.ytpm.risk.view.RiskTemplateView;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -43,6 +47,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -75,6 +82,9 @@ public class UserController {
     @Resource
     private RiskFeign riskFeign;
 
+    @Value("${spring.application.name:}")
+    private String applicationName;
+
     /**
      * 根据应用ID查询当月注册用户
      */
@@ -165,9 +175,31 @@ public class UserController {
                 }
             }
         }
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("serverName", applicationName);
+        jsonObject.put("appId", user.getAppId());
+        jsonObject.put("userId", userId);
+        jsonObject.put("deviceId", user.getDeviceId());
+        String content = new Base64().encodeToString(JSONObject.toJSONString(jsonObject).getBytes());
+        BufferedImage qrCode = QrCodeUtil.generate(content, 50, 50);
+        user.setQrCode(bufferedImageToBase64(qrCode));
         return Result.resultObjOk(user);
     }
 
+    public String bufferedImageToBase64(BufferedImage bufferedImage) {
+        try {
+            ByteArrayOutputStream stream = new ByteArrayOutputStream();
+            ImageIO.write(bufferedImage, "png", stream);
+            Base64 base64 = new Base64();
+            String base64String = base64.encodeToString(stream.toByteArray());
+            return "data:image/png;base64," + base64String;
+        } catch (Exception e) {
+            log.error("生成qrCode失败", e);
+            return "";
+        }
+    }
+
+
     /**
      * 查询用户信息
      */