imweb-report
Version:
report to tdw width cgi;you can report one data at least;if you have some question;please contact herbertliu
289 lines (254 loc) • 10.2 kB
JavaScript
/**
* @author herbertliu
* @date 2014-02-25 version 0.2 last modified by herbertliu 2014-04-14
* @description TDW数据上报
* @example report.tdw(params[,args][,table]) //支持单条上报和多条上报
* params {Object} 上报字段集合,支持对象或者对象数组,例如:{'uin':'','ts':'','opername':'','module':'','action':'','obj1':'','obj2':'','obj3':'','action':'','ver1':'','ver2':'','ver3':'','ver4':''},这里ts表示时间戳,不传使用服务器时间戳,objs表示用户ip,也不需要传
* args {Boolean} 可选,是否立即上报,默认false,不进行立即上报,可以调用report.toreport以及report不给后面参数来实现立即上报,以及设置10S内上报一次;当传true参数值的时候,表示立即上报
* table {String} 可选,上报数据表,默认群业务table=dc00141
* @example report.config(params[,args][,table])//设置公共项目,参数同report.tdw
* @example report.toreport() //立上报
*/
;(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD loading: define module named "badjs" with dependencies and build it
define(['report'],factory);
} else {
// traditional browser loading: build badjs object with dependencies and inject it into window object
root['report'] = factory(root['report']);
}
})(this, function(report) {
report = report || {};
var _CONF = {
TABLE : 'dc00149' ,//上报对应的数据表,群业务所有的默认dc00141,在线教育是dc00149
TIMER : 300, //立即上报的时间,单位s,上报之后,500ms内自动上报
DELAY_REPORT : false,//是否立即上报
DATA : {}//存放公共数据
}
var _FIELDS = [];//全局FIELDS数组
var _DATAS = [];//全局FIELDS数组
if (typeof JSON !== 'object') {
JSON = {};
}
if (typeof JSON.stringify !== 'function') {
JSON.stringify = function (value, replacer, space) {//依赖于json2.js
};
}
var REPORT_URL = {
TDW:'http://cgi.connect.qq.com/report/tdw/report?'//TDW上报
}
var _getImageFun = null;
//生成iamge上报对象
function _getImage(){
if(_getImageFun){
return _getImageFun;
}else{
var imageList = [],//保存上报所用的img对象
imageLength = 10,//预存上报所需要的对象池子
imageIndex = 0;//当前使用的上报对象索引
return _getImageFun = function(){
var _index = (imageIndex++)%imageLength;
return imageList[_index] || (imageList[_index] = new Image());//生成对象
}
}
}
//上报方法
function _report(url,params){
//console.log(url,params);
if(!url) return;
var _params =[];
if(params){
for(var i in params){
params[i] && (_params.push(i+ '=' + params[i]));
}
}
var url = url + _params.join('&');
//console.log(decodeURIComponent(url));
//增加chrome插件支持
var inputDom = document.getElementById("_CHROME_TDW");
if(inputDom){
inputDom.value = url;
}else{
var dom = document.createElement("input");
dom.setAttribute("type","hidden");
dom.value = url;
dom.id = "_CHROME_TDW";
document.getElementsByTagName("body")[0].appendChild(dom);
}
return (_getImage())().src = url;//上报
}
/**
* tdw上报,支持多记录上报
* @param table {string} 要上报的tdw表
* @param data {array} 要上报的数据,二维数组,数组的每一项即一个上报项,批量上报
* @param ipField {string} 要存放ip的字段名,如果不需要在数据表里记录ip,则该项放空或传空字符串
* @param ipField {string} 要存放时间戳字段名,如果不需要在数据表里记录时间戳,则该项放空或传空字符串
*
*/
var _tdw = function(table, fields, datas, ipField, timeField){
if(!table || !fields || !datas) return;
var _params = {
table : table || _CONF.TABLE,
fields : encodeURIComponent(JSON.stringify(fields)),
datas : encodeURIComponent(JSON.stringify(datas)),
pr_ip : ipField || 'obj3',//ip字段,默认有服务器获取用户的时间
pr_t : timeField || 'ts',//时间字段,默认用服务器时间戳
t : (+new Date())
};
_report(REPORT_URL.TDW,_params);
}
//toString
var _toString = Object.prototype.toString;
/**
* tdw组合上报
* @param table {string} 要上报的tdw表
* @param params {array} 要上报的fireds字段对象数组
* @param args {boolean} 可选,是否立即上报,默认false,不进行立即上报,可以调用report.toreport以及report不给后面参数来实现立即上报,以及设置10S内上报一次;当传true参数值的时候,表示立即上报
*
*/
var reportFields = {},
fields = [],
datas = [],//保存延迟数据集合
reportTable = _CONF.TABLE;
var reportTimer = null;//上报timer
var tdw = function(params , args , table){
if(!params) throw 'params can not be null';
args = args || _CONF.DELAY_REPORT;//立即上报属性
reportTable = table || reportTable ;//赋值table
var _params;
switch(_toString.call(params)){
case '[object Array]':
_params = params;//对数组上报
break;
case '[object Object]':
if(!args){
_params = [params];//延迟上报
}else{
var __fields = [];
var __datas = [];
for(var i in params){
if(i === 'obj3' || i === 'ts') continue;
__fields.push(i);
__datas.push(params[i]);
}
__fields = concatField(__fields ,_FIELDS);
__datas = concatDatas([__datas] , _DATAS ,__fields , _FIELDS );
// __fields = __fields.concat(_FIELDS);
// __datas = __datas.concat(_DATAS);
return _tdw(reportTable , __fields , __datas, params['obj3'] , params['ts']);//obj3表示ip字段,ts表示时间戳字段,这两个字段默认不填写
}
break;
}
//组装数据
for(var i = 0,len = _params.length; i < len ;i ++){
var __params = _params[i];
var _datas = [];
datas.push(_datas);
for(var j in __params){
var __index;
if(j in reportFields){
__index = reportFields[j];
fields[__index] = j;
}else{
fields.push(j);
reportFields[j] = __index = fields.length - 1;
}
_datas[__index] = __params[j] || '';
}
}
//立即处理数据
//console.log(args,'============');
if(args){
this.toreport();
}else{
//console.log(reportTimer, _CONF.TIMER,'============');
var _this = this;
if(!reportTimer && _CONF.TIMER){
reportTimer = window.setTimeout(function(){
_this.toreport();
},_CONF.TIMER ); //延迟500ms上报
}
}
}
var evalFieldsData = (function (){
//生成字符串
_FIELDS = [];
_DATAS = [];
for(var i in _CONF.DATA){
_FIELDS.push(i);//属性
var _datai = _CONF.DATA[i];
_DATAS.push(!_datai && _datai !== 0 ? '' : _datai);//属性值
}
return arguments.callee
})();//初始化自执行一遍
var concatField = function (newFields , oldField){
var sholdConcat = [];
for(var i = 0 ; i < oldField.length ; i ++){
var hadIn = false;
for(var j = 0 ; j < newFields.length ; j ++){
if(newFields[j] === oldField[i]){
hadIn = true;
}
}
if(!hadIn){
sholdConcat.push(oldField[i])
}
}
;
return newFields.concat(sholdConcat);
}
var concatDatas = function (newDatas , oldDatas , newFields , oldFields ){
var oldMap = {};
for(var i = 0 ; i < oldFields.length ; i ++){
oldMap[oldFields[i]] = oldDatas [i];
}
for(var j = 0 ; j < newDatas.length ; j++){
var datas = newDatas[j];
for(var z = 0 ; z < newFields.length ; z++){
if(!datas[z] && datas[z] !== 0){
datas[z] = oldMap[newFields[z]] || '';
}
}
}
return newDatas;
}
/**
* tdw立即执行上报
* @param null {string} 要上报的tdw表
* @param params {array} 要上报的fireds字段对象数组
* @param args {boolean} 可选,是否立即上报,默认false,不进行立即上报,可以调用report.toreport以及report不给后面参数来实现立即上报,以及设置10S内上报一次;当传true参数值的时候,表示立即上报
*
*/
report.toreport = function(){
var len = datas.length;
if(!len) return ;
//多于一条数据需要完善对齐数据
var concatedField = concatField(fields , _FIELDS);//合并fields
var concateDatas = concatDatas(datas , _DATAS ,concatedField , _FIELDS );
_tdw(reportTable , concatedField , concateDatas);//obj3表示ip字段,ts表示时间戳字段,这两个字段默认不填写
reportFields = {};
fields.length = datas.length = 0;//重置数据
reportTable = _CONF.TABLE;//重置数据
window.clearTimeout(reportTimer);//清除timmer
reportTimer = null;
}
/**
* tdw设置config属性值
* params {Object} 上报字段集合,支持对象或者对象数组,例如:{'uin':'','ts':'','opername':'','module':'','action':'','obj1':'','obj2':'','obj3':'','action':'','ver1':'','ver2':'','ver3':'','ver4':''},这里ts表示时间戳,不传使用服务器时间戳,objs表示用户ip,也不需要传
* args {Boolean} 可选,是否立即上报,默认false,不进行立即上报,可以调用report.toreport以及report不给后面参数来实现立即上报,以及设置10S内上报一次;当传true参数值的时候,表示立即上报
* table {String} 可选,上报数据表,默认群业务table=dc00141
*
*/
report.config = function(params , args , table){
if(params){
for(var i in params){
_CONF.DATA[i] = params[i];
}
}
_CONF.DELAY_REPORT =!!args;//设置是否需要延迟
table && (_CONF.TABLE = table);//设置上报对象表
evalFieldsData();
}
report.tdw = tdw;//tdw上报
return report;
});