需求
在小程序上,用户点击了哪个页面,哪个按钮,要进行记录,方便甲方统计用户习惯。
难点
-
该接口的并发量会很大,所以必须要能够承受高并发(未特别开发)。
**处理方案:**由于数据准确性要求不是很高,所以采用直接写库,不进行任何验证的方式。因此未进行特殊开发。
-
小程序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详情"
}
最后就需要前端同事受点累了,在需要统计的方法上请求这个接口