1 (function() {2 var CookieUtil ={3 //get the cookie of the key is name
4 get : function(name) {5 var cookieName = encodeURIComponent(name) + "=", cookieStart =document.cookie6 .indexOf(cookieName), cookieValue = null;7 if (cookieStart > -1) {8 var cookieEnd = document.cookie.indexOf(";", cookieStart);9 if (cookieEnd == -1) {10 cookieEnd =document.cookie.length;11 }12 cookieValue =decodeURIComponent(document.cookie.substring(13 cookieStart +cookieName.length, cookieEnd));14 }15 returncookieValue;16 },17 //set the name/value pair to browser cookie
18 set : function(name, value, expires, path, domain, secure) {19 var cookieText = encodeURIComponent(name) + "="
20 +encodeURIComponent(value);21
22 if(expires) {23 //set the expires time
24 var expiresTime = newDate();25 expiresTime.setTime(expires);26 cookieText += ";expires=" +expiresTime.toGMTString();27 }28
29 if(path) {30 cookieText += ";path=" +path;31 }32
33 if(domain) {34 cookieText += ";domain=" +domain;35 }36
37 if(secure) {38 cookieText += ";secure";39 }40
41 document.cookie =cookieText;42 },43 setExt : function(name, value) {44 this.set(name, value, new Date().getTime() + 315360000000, "/");45 }46 };47
48 //主体,其实就是tracker js
49 var tracker ={50 //config
51 clientConfig : {52 //TODO 这里的url需要传入具体的地址
53 serverUrl : "http://linux-hadoop3.ibeifeng.com/BEIfeng.gif",54 sessionTimeout : 360, //360s -> 6min 指定会话的过期时间,指的是操作停留最多的时间
55 maxWaitTime : 3600, //3600s -> 60min -> 1h 指定的是单页面的最多停留时间,当前这个参数无效
56 ver : "1"
57 },58
59 cookieExpiresTime : 315360000000, //cookie过期时间,10年
60
61 columns : {62 //发送到服务器的列名称
63 eventName : "en",64 version : "ver",65 platform : "pl",66 sdk : "sdk",67 uuid : "u_ud",68 memberId : "u_mid",69 sessionId : "u_sd",70 clientTime : "c_time",71 language : "l",72 userAgent : "b_iev",73 resolution : "b_rst",74 currentUrl : "p_url",75 referrerUrl : "p_ref",76 title : "tt",77 orderId : "oid",78 orderName : "on",79 currencyAmount : "cua",80 currencyType : "cut",81 paymentType : "pt",82 category : "ca",83 action : "ac",84 kv : "kv_",85 duration : "du"
86 },87
88 keys : {89 pageView : "e_pv",90 chargeRequestEvent : "e_crt",91 launch : "e_l",92 eventDurationEvent : "e_e",93 sid : "bftrack_sid",94 uuid : "bftrack_uuid",95 mid : "bftrack_mid",96 preVisitTime : "bftrack_previsit",97
98 },99
100 /**101 * 获取会话id102 */
103 getSid : function() {104 return CookieUtil.get(this.keys.sid);105 },106
107 /**108 * 保存会话id到cookie109 */
110 setSid : function(sid) {111 if(sid) {112 CookieUtil.setExt(this.keys.sid, sid);113 }114 },115
116 /**117 * 获取uuid,从cookie中118 */
119 getUuid : function() {120 return CookieUtil.get(this.keys.uuid);121 },122
123 /**124 * 保存uuid到cookie125 */
126 setUuid : function(uuid) {127 if(uuid) {128 CookieUtil.setExt(this.keys.uuid, uuid);129 }130 },131
132 /**133 * 获取memberID134 */
135 getMemberId : function() {136 return CookieUtil.get(this.keys.mid);137 },138
139 /**140 * 设置mid141 */
142 setMemberId : function(mid) {143 if(mid) {144 CookieUtil.setExt(this.keys.mid, mid);145 }146 },147
148 //入口方法
149 startSession : function() {150 //加载js就触发的方法
151 if (this.getSid()) {152 //会话id存在,表示uuid也存在
153 if (this.isSessionTimeout()) {154 //会话过期,产生新的会话
155 this.createNewSession();156 } else{157 //会话没有过期,更新最近访问时间
158 this.updatePreVisitTime(newDate().getTime());159 }160 } else{161 //会话id不存在,表示uuid也不存在
162 this.createNewSession();163 }164 this.onPageView();165 },166
167 onLaunch : function() {168 //触发launch事件
169 var launch ={};170 launch[this.columns.eventName] = this.keys.launch; //设置事件名称
171 this.setCommonColumns(launch); //设置公用columns
172 this.sendDataToServer(this.parseParam(launch)); //最终发送编码后的数据
173 },174
175 onPageView : function() {176 //触发page view事件
177 if (this.preCallApi()) {178 var time = newDate().getTime();179 var pageviewEvent ={};180 pageviewEvent[this.columns.eventName] = this.keys.pageView;181 pageviewEvent[this.columns.currentUrl] = window.location.href; //设置当前url
182 pageviewEvent[this.columns.referrerUrl] = document.referrer; //设置前一个页面的url
183 pageviewEvent[this.columns.title] = document.title; //设置title
184 this.setCommonColumns(pageviewEvent); //设置公用columns
185 this.sendDataToServer(this.parseParam(pageviewEvent)); //最终发送编码后的数据
186 this.updatePreVisitTime(time); //更新最近访问时间
187 }188 },189
190 onChargeRequest : function(orderId, name, currencyAmount, currencyType,191 paymentType) {192 //触发订单产生事件
193 if (this.preCallApi()) {194 if (!orderId || !currencyType || !paymentType) {195 this.log("订单id、货币类型以及支付方式不能为空");196 return;197 }198
199 if (typeof (currencyAmount) == "number") {200 //金额必须是数字
201 var time = newDate().getTime();202 var chargeRequestEvent ={};203 chargeRequestEvent[this.columns.eventName] = this.keys.chargeRequestEvent;204 chargeRequestEvent[this.columns.orderId] =orderId;205 chargeRequestEvent[this.columns.orderName] =name;206 chargeRequestEvent[this.columns.currencyAmount] =currencyAmount;207 chargeRequestEvent[this.columns.currencyType] =currencyType;208 chargeRequestEvent[this.columns.paymentType] =paymentType;209 this.setCommonColumns(chargeRequestEvent); //设置公用columns
210 this.sendDataToServer(this.parseParam(chargeRequestEvent)); //最终发送编码后的数据ss
211 this.updatePreVisitTime(time);212 } else{213 this.log("订单金额必须是数字");214 return;215 }216 }217 },218
219 onEventDuration : function(category, action, map, duration) {220 //触发event事件
221 if (this.preCallApi()) {222 if (category &&action) {223 var time = newDate().getTime();224 var event ={};225 event[this.columns.eventName] = this.keys.eventDurationEvent;226 event[this.columns.category] =category;227 event[this.columns.action] =action;228 if(map) {229 //map如果不为空,进行内容的添加
230 for ( var k inmap) {231 //循环key
232 if (k &&map[k]) {233 //当key和value不为空的时候,进行添加操作
234 event[this.columns.kv + k] = map[k]; //key添加前缀"kv_"
235 }236 }237 }238 if(duration) {239 event[this.columns.duration] = duration; //当duration不为0的时候进行添加
240 }241 this.setCommonColumns(event); //设置公用columns
242 this.sendDataToServer(this.parseParam(event)); //最终发送编码后的数据ss
243 this.updatePreVisitTime(time);244 } else{245 this.log("category和action不能为空");246 }247 }248 },249
250 /**251 * 执行对外方法前必须执行的方法252 */
253 preCallApi : function() {254 if (this.isSessionTimeout()) {255 //如果为true,表示需要新建
256 this.startSession();257 } else{258 this.updatePreVisitTime(newDate().getTime());259 }260 return true;261 },262
263 sendDataToServer : function(data) {264 //发送数据data到服务器,其中data是一个字符串
265 //TODO:发送以前发送失败的数据
266 var that = this;267 var i2 = new Image(1, 1);268 i2.onerror = function() {269 //这里可以进行重试操作
270 //当请求失败的情况下,执行这块的代码,可以将数据保存到local stroage中,下次再重新发送数据
271 };272 //给定图片的请求url
273 i2.src = this.clientConfig.serverUrl + "?" +data;274 },275
276 /**277 * 往data中添加发送到日志收集服务器的公用部分278 */
279 setCommonColumns : function(data) {280 data[this.columns.version] = this.clientConfig.ver;281 data[this.columns.platform] = "website";282 data[this.columns.sdk] = "js";283 data[this.columns.uuid] = this.getUuid(); //设置用户id
284 data[this.columns.memberId] = this.getMemberId(); //设置会员id
285 data[this.columns.sessionId] = this.getSid(); //设置sid
286 data[this.columns.clientTime] = new Date().getTime(); //设置客户端时间
287 data[this.columns.language] = window.navigator.language; //设置浏览器语言
288 data[this.columns.userAgent] = window.navigator.userAgent; //设置浏览器类型
289 data[this.columns.resolution] = screen.width + "*" + screen.height; //设置浏览器分辨率
290 },291
292 /**293 * 创建新的会员,并判断是否是第一次访问页面,如果是,进行launch事件的发送。294 */
295 createNewSession : function() {296 var time = new Date().getTime(); //获取当前操作时间
297 //1. 进行会话更新操作
298 var sid = this.generateId(); //产生一个session id
299 this.setSid(sid);300 this.updatePreVisitTime(time); //更新最近访问时间
301 //2. 进行uuid查看操作
302 if (!this.getUuid()) {303 //uuid不存在,先创建uuid,然后保存到cookie,最后触发launch事件
304 var uuid = this.generateId(); //产品uuid
305 this.setUuid(uuid);306 this.onLaunch(); //触发launch事件
307 }308 },309
310 /**311 * 参数编码返回字符串312 */
313 parseParam : function(data) {314 var params = "";315 for ( var e indata) {316 if (e &&data[e]) {317 //对key和value进行编码操作
318 params += encodeURIComponent(e) + "="
319 + encodeURIComponent(data[e]) + "&";320 }321 }322 if(params) {323 return params.substring(0, params.length - 1);324 } else{325 returnparams;326 }327 },328
329 /**330 * 产生uuid
331 * UUID的产生逻辑,可以参考Java中UUID的生产代码332 */
333 generateId : function() {334 var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';335 var tmpid =[];336 varr;337 tmpid[8] = tmpid[13] = tmpid[18] = tmpid[23] = '-';338 tmpid[14] = '4';339
340 for (i = 0; i < 36; i++) {341 if (!tmpid[i]) {342 r = 0 | Math.random() * 16;343 tmpid[i] = chars[(i == 19) ? (r & 0x3) | 0x8: r];344 }345 }346 return tmpid.join('');347 },348
349 /**350 * 判断这个会话是否过期,查看当前时间和最近访问时间间隔时间是否小于this.clientConfig.sessionTimeout
351 * 如果是小于,返回false;否则返回true。352 */
353 isSessionTimeout : function() {354 var time = newDate().getTime();355 var preTime = CookieUtil.get(this.keys.preVisitTime);356 if(preTime) {357 //最近访问时间存在,那么进行区间判断
358 return time - preTime > this.clientConfig.sessionTimeout * 1000;359 }360 return true;361 },362
363 /**364 * 更新最近访问时间365 */
366 updatePreVisitTime : function(time) {367 CookieUtil.setExt(this.keys.preVisitTime, time);368 },369
370 /**371 * 打印日志372 */
373 log : function(msg) {374 console.log(msg);375 },376
377 };378
379 //对外暴露的方法名称
380 window.__AE__ ={381 startSession : function() {382 tracker.startSession();383 },384 onPageView : function() {385 tracker.onPageView();386 },387 onChargeRequest : function(orderId, name, currencyAmount, currencyType,388 paymentType) {389 tracker.onChargeRequest(orderId, name, currencyAmount,390 currencyType, paymentType);391 },392 onEventDuration : function(category, action, map, duration) {393 tracker.onEventDuration(category, action, map, duration);394 },395 setMemberId : function(mid) {396 tracker.setMemberId(mid);397 }398 };399
400 //自动加载方法
401 var autoLoad = function() {402 //进行参数设置
403 var _aelog_ = _aelog_ || window._aelog_ ||[];404 var memberId = null;405 for (i = 0; i < _aelog_.length; i++) {406 _aelog_[i][0] === "memberId" && (memberId = _aelog_[i][1]);407 }408 //根据是给定memberid,设置memberid的值
409 memberId &&__AE__.setMemberId(memberId);410 //启动session
411 __AE__.startSession();412 };413
414 //调用
415 autoLoad();416 })();