记录用户点击方案--埋点

需求

在小程序上,用户点击了哪个页面,哪个按钮,要进行记录,方便甲方统计用户习惯。

难点

  1. 该接口的并发量会很大,所以必须要能够承受高并发(未特别开发)。

    **处理方案:**由于数据准确性要求不是很高,所以采用直接写库,不进行任何验证的方式。因此未进行特殊开发。

  2. 小程序banner图、按钮都是活动,也就是说,用户可以随时更换banner图、添加删除按钮。
    **处理方案:**大分类套小分类

开发

数据库表设计

-- 大分类表
CREATE TABLE `sys_point` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `point_name` varchar(200) NOT NULL COMMENT '点位名称',
  `page_name` varchar(200) DEFAULT NULL COMMENT '页面名称',
  `module_name` varchar(200) DEFAULT NULL COMMENT '模块名称',
  `create_by` bigint DEFAULT NULL COMMENT '创建人',
  `create_date` datetime(6) DEFAULT NULL COMMENT '创建时间',
  `update_by` bigint DEFAULT NULL COMMENT '更新人',
  `update_date` datetime(6) DEFAULT NULL COMMENT '更新时间.',
  `del_flag` bit(1) DEFAULT b'0' COMMENT '删除标志',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='点位信息表';
-- 小分类表
CREATE TABLE `sys_point_data` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `sys_point_id` bigint NOT NULL COMMENT '点位id',
  `ref` bigint NOT NULL COMMENT 'ID',
  `ref_name` varchar(200) DEFAULT NULL COMMENT 'ID详情',
  `pv` int DEFAULT '0' COMMENT '点击次数',
  `uv` int DEFAULT '0' COMMENT '点击人数',
  `latest_report_date` datetime(6) DEFAULT NULL COMMENT '最新上报时间',
  `create_by` bigint DEFAULT NULL COMMENT '创建人.',
  `create_date` datetime(6) DEFAULT NULL COMMENT '创建时间',
  `update_by` bigint DEFAULT NULL COMMENT '更新人.',
  `update_date` datetime(6) DEFAULT NULL COMMENT '更新时间.',
  `del_flag` bit(1) DEFAULT b'0' COMMENT '删除标志.',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='点位数据表';
-- 用户点击记录表
CREATE TABLE `sys_point_data_record` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `sys_point_id` bigint NOT NULL COMMENT '点位id',
  `ref` bigint NOT NULL COMMENT 'ID',
  `ref_name` varchar(200) DEFAULT NULL COMMENT 'ID详情',
  `user_id` bigint DEFAULT NULL COMMENT 'UserID',
  `open_id` varchar(200) DEFAULT NULL COMMENT '微信OpenID',
  `union_id` varchar(200) DEFAULT NULL COMMENT '微信UnionID',
  `create_by` bigint DEFAULT NULL COMMENT '创建人.',
  `create_date` datetime(6) DEFAULT NULL COMMENT '创建时间',
  `update_by` bigint DEFAULT NULL COMMENT '更新人.',
  `update_date` datetime(6) DEFAULT NULL COMMENT '更新时间.',
  `del_flag` bit(1) DEFAULT b'0' COMMENT '删除标志.',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='点位数据记录表';

埋点接口开发

    /**
     * 用户点击记录
     *
     * @param param param
     */
    public void recordPoint(SysPointDTO param) {
    
    
        // 保存点击记录
        SysPointDataRecord sysPointDataRecord = saveDataRecord(param);
        // 更新点位数据
        updatePointData(param);
    }
@Async
protected SysPointDataRecord saveDataRecord(SysPointDTO param) {
    
    
    SysPointDataRecord sysPointDataRecord = new SysPointDataRecord();
    sysPointDataRecord.setSysPointId(param.getSysPointId());
    sysPointDataRecord.setRef(param.getRef());
    sysPointDataRecord.setRefName(param.getRefName());
    sysPointDataRecord.setOpenId(SecurityUtils.getCurrentOpenid());
    sysPointDataRecord.setUnionId(SecurityUtils.getUnionId());
    sysPointDataRecord.setUserId(SecurityUtils.getCurrentUserId());
    sysPointDataRecord.setCreateDate(ZonedDateTime.now());
    sysPointDataRecord.setDelFlag(false);
    return sysPointDataRecordRepository.save(sysPointDataRecord);
}
/**
     * 异步 更新点位数据
     *
     * @param param param
     */
@Async
protected void updatePointData(SysPointDTO param) {
    
    
    // 先查询是否存在
    SysPointData bySysPointIdAndRef = sysPointDataRepository.findBySysPointIdAndRef(param.getSysPointId(), param.getRef());
    if (ObjectUtils.isEmpty(bySysPointIdAndRef)) {
    
    
        // 点位数据不存在
        SysPointData sysPointData = new SysPointData();
        sysPointData.setSysPointId(param.getSysPointId());
        sysPointData.setRef(param.getRef());
        sysPointData.setRefName(param.getRefName());
        sysPointData.setPv(1);
        sysPointData.setUv(1);
        sysPointData.setLatestReportDate(ZonedDateTime.now());
        sysPointData.setDelFlag(false);
        sysPointDataRepository.save(sysPointData);
    } else {
    
    
        // 单位数据存在
        sysPointDataRepository.addPv(bySysPointIdAndRef.getId(), ZonedDateTime.now());
    }
}

前端入参

{
    
    
    "sysPointId": 1,
    "ref": 1,
    "refName": "ID详情"
}

最后就需要前端同事受点累了,在需要统计的方法上请求这个接口

猜你喜欢

转载自blog.csdn.net/qq_45770147/article/details/133341046