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

文章讲述了在小程序中如何处理高并发的用户点击记录需求,采用直接写库策略以保证数据准确性,介绍了数据库表的设计,包括大分类表(sys_point)、小分类表(sys_point_data)和用户点击记录表(sys_point_data_record),并给出了埋点接口的开发方法和前端入参示例。
摘要由CSDN通过智能技术生成

需求

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

难点

  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详情"
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值