Explorar o código

用户行为记录

huangzhiguo %!s(int64=2) %!d(string=hai) anos
pai
achega
607ab182c8

+ 7 - 0
src/main/java/com/caimei365/tools/listener/IpSaveListener.java

@@ -1,6 +1,7 @@
 package com.caimei365.tools.listener;
 
 import com.caimei365.tools.model.po.IpSavePo;
+import com.caimei365.tools.service.CmBehaviorRecordService;
 import com.caimei365.tools.service.impl.IpSaveService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -30,6 +31,8 @@ public class IpSaveListener implements RocketMQListener<String> {
     @Autowired
     private IpSaveService ipSaveService;
 
+    @Autowired private CmBehaviorRecordService recordService;
+
     @Override
     public void onMessage(String message) {
         log.info("{}收到消息:{}", this.getClass().getSimpleName(), message);
@@ -88,5 +91,9 @@ public class IpSaveListener implements RocketMQListener<String> {
         Long aLong = Long.valueOf(nowDate);
         ipSavePo.setSaveTime(aLong);
         ipSaveService.save(ipSavePo);
+        // 用户行为记录
+        if ("/user/record/StatisticsPc".equals(ipSavePo.getRequestUrl().trim()) || "/user/record/StatisticsApp".equals(ipSavePo.getRequestUrl().trim())) {
+            recordService.insertRecord(ipSavePo);
+        }
     }
 }

+ 21 - 0
src/main/java/com/caimei365/tools/mapper/CmBehaviorRecordMapper.java

@@ -0,0 +1,21 @@
+package com.caimei365.tools.mapper;
+
+import com.caimei365.tools.model.po.CmBehaviorRecordPo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/11/2
+ */
+@Mapper
+public interface CmBehaviorRecordMapper {
+
+    /**
+     * 用户行为记录
+     * @param cmBehaviorRecordPo
+     * @return
+     */
+    void insertRecord(CmBehaviorRecordPo cmBehaviorRecordPo);
+}

+ 61 - 0
src/main/java/com/caimei365/tools/model/po/CmBehaviorRecordPo.java

@@ -0,0 +1,61 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/11/2
+ */
+@Data
+public class CmBehaviorRecordPo {
+
+    private Integer recordID ;
+    /**
+     * 访问人IP地址
+     */
+    private String ip;
+    /**
+     * 用户id、0为游客
+     */
+    private String userId;
+    /**
+     * 页面路径
+     */
+    private String pagePath;
+    /**
+     * 页面类型
+     */
+    private Integer pageType;
+    /**
+     * 页面标签
+     */
+    private String pageLabel;
+    /**
+     * 商品图片
+     */
+    private String productImage;
+    /**
+     * 商品ID
+     */
+    private String productId;
+    /**
+     * 商品名称
+     */
+    private String productName;
+    /**
+     * 访问时间
+     */
+    private Date accessTime;
+    /**
+     * 访问时长
+     */
+    private String accessDuration;
+    /**
+     * 访问日期
+     */
+    private String accessDate;
+}

+ 14 - 0
src/main/java/com/caimei365/tools/service/CmBehaviorRecordService.java

@@ -0,0 +1,14 @@
+package com.caimei365.tools.service;
+
+import com.caimei365.tools.model.po.CmBehaviorRecordPo;
+import com.caimei365.tools.model.po.IpSavePo;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/11/2
+ */
+public interface CmBehaviorRecordService {
+    void insertRecord(IpSavePo ipSavePo);
+}

+ 138 - 0
src/main/java/com/caimei365/tools/service/impl/CmBehaviorRecordServiceImpl.java

@@ -0,0 +1,138 @@
+package com.caimei365.tools.service.impl;
+
+import com.caimei365.tools.mapper.CmBehaviorRecordMapper;
+import com.caimei365.tools.model.po.CmBehaviorRecordPo;
+import com.caimei365.tools.model.po.IpSavePo;
+import com.caimei365.tools.service.CmBehaviorRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/11/2
+ */
+@Slf4j
+@Service
+public class CmBehaviorRecordServiceImpl implements CmBehaviorRecordService {
+
+    @Autowired private CmBehaviorRecordMapper recordMapper;
+
+    @Override
+    public void insertRecord(IpSavePo ipSavePo) {
+        if ("/user/record/StatisticsPc".equals(ipSavePo.getRequestUrl().trim()) || "/user/record/StatisticsApp".equals(ipSavePo.getRequestUrl().trim())) {
+            log.info("用户行为记录=================》" + ipSavePo.getIp());
+            CmBehaviorRecordPo cmBehaviorRecordPo = new CmBehaviorRecordPo();
+            cmBehaviorRecordPo.setIp(ipSavePo.getIp());
+            if (StringUtils.isNotBlank(ipSavePo.getUserId())) {
+                cmBehaviorRecordPo.setUserId(ipSavePo.getUserId());
+            } else {
+                cmBehaviorRecordPo.setUserId("0");
+            }
+            if (ipSavePo.getParams().contains("userId") || ipSavePo.getParams().contains("productId")) {
+                String[] split = ipSavePo.getParams().split("&");
+                for (String s : split) {
+                    // 页面路径
+                    if (s.contains("pagePath") && s.contains("=")) {
+                        String[] split1 = s.split("=");
+                        if (split1.length > 1) {
+                            String value = split1[1];
+                            String trim = value.trim();
+                            if (StringUtils.isNotBlank(trim)) {
+                                String decode = null;
+                                try {
+                                    decode = java.net.URLDecoder.decode(trim,"UTF-8");
+                                    if (decode.contains("%")) {
+                                        decode = java.net.URLDecoder.decode(decode, "UTF-8");
+                                    }
+                                } catch (UnsupportedEncodingException e) {
+                                    e.printStackTrace();
+                                }
+                                cmBehaviorRecordPo.setPagePath(decode);
+                            }
+                            if (StringUtils.isEmpty(cmBehaviorRecordPo.getPagePath())) {
+                                log.info("页面路径pagePath 值为====》" + trim);
+                                return ;
+                            }
+                        }
+                    }
+                    // 页面类型
+                    if (s.contains("pageType") && s.contains("=")) {
+                        String[] split1 = s.split("=");
+                        if (split1.length > 1) {
+                            String value = split1[1];
+                            String trim = value.trim();
+                            if (StringUtils.isNotBlank(trim)) {
+                                int parseInt = Integer.parseInt(trim);
+
+                                cmBehaviorRecordPo.setPageType(parseInt);
+                            }
+                        }
+                    }
+                    // 页面标签
+                    if (s.contains("pageLabel") && s.contains("=")) {
+                        String[] split1 = s.split("=");
+                        cmBehaviorRecordPo.setPageLabel("");
+                        if (split1.length > 1) {
+                            String value = split1[1];
+                            String trim = value.trim();
+                            if (StringUtils.isNotBlank(trim)) {
+
+                                // 接口参数解码
+                                String decode = null;
+                                try {
+                                    decode = java.net.URLDecoder.decode(trim, "UTF-8");
+                                    if (decode.contains("%")) {
+                                        decode = java.net.URLDecoder.decode(decode, "UTF-8");
+                                    }
+                                } catch (UnsupportedEncodingException e) {
+                                    e.printStackTrace();
+                                }
+                                cmBehaviorRecordPo.setPageLabel(decode);
+                            }
+                        }
+                    }
+                    // 商品ID
+                    if (s.contains("productId") && s.contains("=")) {
+                        String[] split1 = s.split("=");
+                        if (split1.length > 1) {
+                            String value = split1[1];
+                            String trim = value.trim();
+                            if (StringUtils.isNotBlank(trim)) {
+                                cmBehaviorRecordPo.setProductId(trim);
+                            }
+                        }
+                    }
+                    // 访问时长
+                    if (s.contains("accessDuration") && s.contains("=")) {
+                        String[] split1 = s.split("=");
+                        if (split1.length > 1) {
+                            String value = split1[1];
+                            String trim = value.trim();
+                            if (StringUtils.isNotBlank(trim)) {
+                                cmBehaviorRecordPo.setAccessDuration(trim);
+                            }
+                        }
+                    }
+                }
+            }
+
+            Date date = new Date();
+            cmBehaviorRecordPo.setAccessTime(date);
+
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            String format = simpleDateFormat.format(date);
+            cmBehaviorRecordPo.setAccessDate(format);
+            recordMapper.insertRecord(cmBehaviorRecordPo);
+        }
+    }
+}

+ 8 - 0
src/main/resources/mapper/CmBehaviorRecordMapper.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.caimei365.tools.mapper.CmBehaviorRecordMapper">
+    <insert id="insertRecord">
+        INSERT INTO cm_behavior_record (IP, userID, pagePath, pageType, pageLabel, productID, accessTime, accessDuration, accessDate)
+        VALUES(#{ip},#{userId},#{pagePath},#{pageType},#{pageLabel},#{productId},#{accessTime},#{accessDuration},#{accessDate})
+    </insert>
+</mapper>