193 lines
5.6 KiB
JavaScript
193 lines
5.6 KiB
JavaScript
|
/* global CONFIG */
|
||
|
// eslint-disable-next-line no-console
|
||
|
|
||
|
(function(window, document) {
|
||
|
// 查询存储的记录
|
||
|
function getRecord(Counter, target) {
|
||
|
return new Promise(function(resolve, reject) {
|
||
|
Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ target })))
|
||
|
.then(resp => resp.json())
|
||
|
.then(({ results, code, error }) => {
|
||
|
if (code === 401) {
|
||
|
throw error;
|
||
|
}
|
||
|
if (results && results.length > 0) {
|
||
|
var record = results[0];
|
||
|
resolve(record);
|
||
|
} else {
|
||
|
Counter('post', '/classes/Counter', { target, time: 0 })
|
||
|
.then(resp => resp.json())
|
||
|
.then((record, error) => {
|
||
|
if (error) {
|
||
|
throw error;
|
||
|
}
|
||
|
resolve(record);
|
||
|
}).catch(error => {
|
||
|
console.error('Failed to create: ', error);
|
||
|
reject(error);
|
||
|
});
|
||
|
}
|
||
|
}).catch((error) => {
|
||
|
console.error('LeanCloud Counter Error: ', error);
|
||
|
reject(error);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// 发起自增请求
|
||
|
function increment(Counter, incrArr) {
|
||
|
return new Promise(function(resolve, reject) {
|
||
|
Counter('post', '/batch', {
|
||
|
'requests': incrArr
|
||
|
}).then((res) => {
|
||
|
res = res.json();
|
||
|
if (res.error) {
|
||
|
throw res.error;
|
||
|
}
|
||
|
resolve(res);
|
||
|
}).catch((error) => {
|
||
|
console.error('Failed to save visitor count: ', error);
|
||
|
reject(error);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// 构建自增请求体
|
||
|
function buildIncrement(objectId) {
|
||
|
return {
|
||
|
'method': 'PUT',
|
||
|
'path' : `/1.1/classes/Counter/${objectId}`,
|
||
|
'body' : {
|
||
|
'time': {
|
||
|
'__op' : 'Increment',
|
||
|
'amount': 1
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// 校验是否为有效的 Host
|
||
|
function validHost() {
|
||
|
if (CONFIG.web_analytics.leancloud.ignore_local) {
|
||
|
var hostname = window.location.hostname;
|
||
|
if (hostname === 'localhost' || hostname === '127.0.0.1') {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// 校验是否为有效的 UV
|
||
|
function validUV() {
|
||
|
var key = 'LeanCloud_UV_Flag';
|
||
|
var flag = localStorage.getItem(key);
|
||
|
if (flag) {
|
||
|
// 距离标记小于 24 小时则不计为 UV
|
||
|
if (new Date().getTime() - parseInt(flag, 10) <= 86400000) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
localStorage.setItem(key, new Date().getTime().toString());
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function addCount(Counter) {
|
||
|
var enableIncr = CONFIG.web_analytics.enable && !Fluid.ctx.dnt && validHost();
|
||
|
var getterArr = [];
|
||
|
var incrArr = [];
|
||
|
|
||
|
// 请求 PV 并自增
|
||
|
var pvCtn = document.querySelector('#leancloud-site-pv-container');
|
||
|
if (pvCtn) {
|
||
|
var pvGetter = getRecord(Counter, 'site-pv').then((record) => {
|
||
|
enableIncr && incrArr.push(buildIncrement(record.objectId));
|
||
|
var ele = document.querySelector('#leancloud-site-pv');
|
||
|
if (ele) {
|
||
|
ele.innerText = (record.time || 0) + (enableIncr ? 1 : 0);
|
||
|
pvCtn.style.display = 'inline';
|
||
|
}
|
||
|
});
|
||
|
getterArr.push(pvGetter);
|
||
|
}
|
||
|
|
||
|
// 请求 UV 并自增
|
||
|
var uvCtn = document.querySelector('#leancloud-site-uv-container');
|
||
|
if (uvCtn) {
|
||
|
var uvGetter = getRecord(Counter, 'site-uv').then((record) => {
|
||
|
var incrUV = validUV() && enableIncr;
|
||
|
incrUV && incrArr.push(buildIncrement(record.objectId));
|
||
|
var ele = document.querySelector('#leancloud-site-uv');
|
||
|
if (ele) {
|
||
|
ele.innerText = (record.time || 0) + (incrUV ? 1 : 0);
|
||
|
uvCtn.style.display = 'inline';
|
||
|
}
|
||
|
});
|
||
|
getterArr.push(uvGetter);
|
||
|
}
|
||
|
|
||
|
// 如果有页面浏览数节点,则请求浏览数并自增
|
||
|
var viewCtn = document.querySelector('#leancloud-page-views-container');
|
||
|
if (viewCtn) {
|
||
|
var path = eval(CONFIG.web_analytics.leancloud.path || 'window.location.pathname');
|
||
|
var target = decodeURI(path.replace(/\/*(index.html)?$/, '/'));
|
||
|
var viewGetter = getRecord(Counter, target).then((record) => {
|
||
|
enableIncr && incrArr.push(buildIncrement(record.objectId));
|
||
|
var ele = document.querySelector('#leancloud-page-views');
|
||
|
if (ele) {
|
||
|
ele.innerText = (record.time || 0) + (enableIncr ? 1 : 0);
|
||
|
viewCtn.style.display = 'inline';
|
||
|
}
|
||
|
});
|
||
|
getterArr.push(viewGetter);
|
||
|
}
|
||
|
|
||
|
// 如果启动计数自增,批量发起自增请求
|
||
|
if (enableIncr) {
|
||
|
Promise.all(getterArr).then(() => {
|
||
|
incrArr.length > 0 && increment(Counter, incrArr);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var appId = CONFIG.web_analytics.leancloud.app_id;
|
||
|
var appKey = CONFIG.web_analytics.leancloud.app_key;
|
||
|
var serverUrl = CONFIG.web_analytics.leancloud.server_url;
|
||
|
|
||
|
if (!appId) {
|
||
|
throw new Error('LeanCloud appId is empty');
|
||
|
}
|
||
|
if (!appKey) {
|
||
|
throw new Error('LeanCloud appKey is empty');
|
||
|
}
|
||
|
|
||
|
function fetchData(api_server) {
|
||
|
var Counter = (method, url, data) => {
|
||
|
return fetch(`${api_server}/1.1${url}`, {
|
||
|
method,
|
||
|
headers: {
|
||
|
'X-LC-Id' : appId,
|
||
|
'X-LC-Key' : appKey,
|
||
|
'Content-Type': 'application/json'
|
||
|
},
|
||
|
body: JSON.stringify(data)
|
||
|
});
|
||
|
};
|
||
|
|
||
|
addCount(Counter);
|
||
|
}
|
||
|
|
||
|
var apiServer = serverUrl || `https://${appId.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
|
||
|
|
||
|
if (apiServer) {
|
||
|
fetchData(apiServer);
|
||
|
} else {
|
||
|
fetch('https://app-router.leancloud.cn/2/route?appId=' + appId)
|
||
|
.then(resp => resp.json())
|
||
|
.then((data) => {
|
||
|
if (data.api_server) {
|
||
|
fetchData('https://' + data.api_server);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
})(window, document);
|