最近在开发一个后台管理系统(https://oa.hixiaoe.com),临近上线的前一周,产品组要求即时收集用户的所有行为,后台分析用户数据,为以后的业务发展,以及页面设计,用户体验等方面提供决策参考。例如:(1)用户浏览一篇文章,停留了多长时间,滚动条滚动到文章页面长度的百分之几的位置。(2)页面上的同类功能的不同按钮,点击的次数,点击时间。主要的逻辑就是某人在什么地方做了什么事情,做了多长时间,怎么做的,从哪里进入,然后又到了另一个哪里。用户敢在我这挥一挥衣袖,绝对带走他所有的云彩,甚至底裤;

 

问题是临近上线的前一周,产品组提这种需求,而且必须要按原项目计划如期上线,产品组还表达了中心思想:如果缺了这功能,就像一个不完美的男人进了女人堆,而无法了解到女人的心,更无法得到女人的爱。此时作为一个程序猿的你,是不是已经拔出了42米的长刀。

但是我们有一个叫某小小的猿类,不信邪,就是要挑战一下,在一周时间内证明自己是个完美的男人。

 

首先,系统的功能都已经开发完了,在页面的元素和js代码里一个一个埋点,显然工作量太大,而且侵入性太强,对现有系统造成破坏性很大;

能不能在现有的事件源上,加一个标记,页面渲染完之后,自动给事件源注册埋点函数,自动收集相关数据,然后异步提交到后台;经过一番论证和Demo实验,得出的结论是可行的,于是开发出一套前端代码,并且是可以同时给多个系统进行接入的;

 

现在就分享前端代码,坐稳了,马上开车:

1)假如有OA系统,CRM系统都要埋点,那么需要有个区分系统的标识。即在每个系统的需要埋点页面上(当然可以统一写到你的公共头页面上)增加一个系统标识,代码如下:

这里的标识tenant-admin,就代表一个接入的系统。后台数据分析系统就能区别不同的业务系统的埋点数据了。

2)在页面的事件源元素上,扩展一个叫event_id的属性,值是一个埋点编号,该编号就代表一个用户行为,后台数据分析时,就是按埋点编号进行区分;

在一个很完善的系统上,增加埋点功能收集用户行为,而不大规模改变现有代码,如何做?_第1张图片

3)然后通过js代码,在设置了event_id属性的元素上,自动注册‘点击’事件,如果是滚动条滚动事件,鼠标移动事件,也是类似方式;‘点击’事件的js代码的核心逻辑如下:

在页面渲染完后,自动注册事件:

$(function(){
    
$(document).on("click""[event_id]"function (e) {
        
console.log("click进入了burying-point")
        
var targetUrl this.nodeName =="A"&&$(this).attr('href')&&$(this).attr('href').indexOf("javascript")==-1?$(this).attr('href'):'';
        
buryingPoint($(this).attr('event_id'),targetUrl)
    });
})

提交埋点数据的实际函数,代码如斯:

function buryingPoint(eventId){
    if(!eventId){
        return ;
    }
    var targetUrl =  arguments[1]?arguments[1]:'';
    var params={
        eventId: eventId,
        lappClientId:$("[name=lapp_client_id]").attr("content")?$("[name=lapp_client_id]").attr("content"):'',
        location:window.location.href,
        triggeringTime:new Date().getTime(),
        targetUrl:targetUrl,
        clientType:getClient(),
        externalMount :getMount(),
        os:getOS(),
        deviceNum:whaleToken?md5(whaleToken):"",
        browser:getBrowser(),
        screenRatio:window.screen.width+"*"+window.screen.height
    }
    $.ajax({
        url:getUrl()+"/track/bpl/event/add?token="+whaleToken,
        dataType: "json",
        contentType: 'application/json',
        data: JSON.stringify(params),
        type: "POST"
    })
}

到此,前端的核心代码展示完毕,至于后台如何接收数据?如何在几百万用户时时刻刻并发提交埋点数据的情况下,做到系统稳定?即时数据落盘?实时分析用户行为,生成用户画像?请继续关注我的博客,了解更多技术内幕。如果您愿意一键三连,我会更新地更快哦,^_^;

作者介绍:小文文,狐小E智慧办公 (https://www.hixiaoe.com)开发工程师,专注移动办公软件的SaaS平台建设以及轻应用开发