mirror of
https://github.com/next-theme/hexo-theme-next.git
synced 2026-01-17 18:22:33 +00:00
Refactor lean-analytics
This commit is contained in:
parent
55c429d677
commit
b84b0d6fd7
@ -1,25 +1,43 @@
|
|||||||
/* global CONFIG */
|
/* global CONFIG */
|
||||||
/* eslint-disable no-console */
|
/* eslint-disable no-console */
|
||||||
|
|
||||||
(function() {
|
class LeanCloudCounter {
|
||||||
const leancloudSelector = url => {
|
constructor(appId, appKey, apiServer) {
|
||||||
|
this.appId = appId;
|
||||||
|
this.appKey = appKey;
|
||||||
|
this.apiServer = apiServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
leancloudSelector(url) {
|
||||||
url = encodeURI(url);
|
url = encodeURI(url);
|
||||||
return document.getElementById(url).querySelector('.leancloud-visitors-count');
|
return document.getElementById(url).querySelector('.leancloud-visitors-count');
|
||||||
};
|
}
|
||||||
|
|
||||||
const addCount = async Counter => {
|
async request(method, url, data) {
|
||||||
|
return fetch(`${this.apiServer}/1.1${url}`, {
|
||||||
|
method,
|
||||||
|
headers: {
|
||||||
|
'X-LC-Id' : this.appId,
|
||||||
|
'X-LC-Key' : this.appKey,
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async addCount() {
|
||||||
const visitors = document.querySelector('.leancloud_visitors');
|
const visitors = document.querySelector('.leancloud_visitors');
|
||||||
const url = decodeURI(visitors.id);
|
const url = decodeURI(visitors.id);
|
||||||
const title = visitors.dataset.flagTitle;
|
const title = visitors.dataset.flagTitle;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url }))}`);
|
const response = await this.request('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url }))}`);
|
||||||
const { results } = await response.json();
|
const { results } = await response.json();
|
||||||
if (results.length > 0) {
|
if (results.length > 0) {
|
||||||
const counter = results[0];
|
const counter = results[0];
|
||||||
leancloudSelector(url).innerText = counter.time + 1;
|
this.leancloudSelector(url).innerText = counter.time + 1;
|
||||||
try {
|
try {
|
||||||
await Counter('put', '/classes/Counter/' + counter.objectId, {
|
await this.request('put', '/classes/Counter/' + counter.objectId, {
|
||||||
time: {
|
time: {
|
||||||
'__op' : 'Increment',
|
'__op' : 'Increment',
|
||||||
'amount': 1
|
'amount': 1
|
||||||
@ -29,13 +47,13 @@
|
|||||||
console.error('Failed to save visitor count', error);
|
console.error('Failed to save visitor count', error);
|
||||||
}
|
}
|
||||||
} else if (CONFIG.leancloud_visitors.security) {
|
} else if (CONFIG.leancloud_visitors.security) {
|
||||||
leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.';
|
this.leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.';
|
||||||
console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.');
|
console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.');
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
const response = await Counter('post', '/classes/Counter', { title, url, time: 1 });
|
const response = await this.request('post', '/classes/Counter', { title, url, time: 1 });
|
||||||
await response.json();
|
await response.json();
|
||||||
leancloudSelector(url).innerText = 1;
|
this.leancloudSelector(url).innerText = 1;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to create', error);
|
console.error('Failed to create', error);
|
||||||
}
|
}
|
||||||
@ -43,44 +61,36 @@
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('LeanCloud Counter Error', error);
|
console.error('LeanCloud Counter Error', error);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
const showTime = async Counter => {
|
async showTime() {
|
||||||
const visitors = document.querySelectorAll('.leancloud_visitors');
|
const visitors = document.querySelectorAll('.leancloud_visitors');
|
||||||
const entries = [...visitors].map(element => {
|
const entries = [...visitors].map(element => {
|
||||||
return decodeURI(element.id);
|
return decodeURI(element.id);
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url: { '$in': entries } }))}`);
|
const response = await this.request('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url: { '$in': entries } }))}`);
|
||||||
const { results } = await response.json();
|
const { results } = await response.json();
|
||||||
for (const url of entries) {
|
for (const url of entries) {
|
||||||
const target = results.find(item => item.url === url);
|
const target = results.find(item => item.url === url);
|
||||||
leancloudSelector(url).innerText = target ? target.time : 0;
|
this.leancloudSelector(url).innerText = target ? target.time : 0;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('LeanCloud Counter Error', error);
|
console.error('LeanCloud Counter Error', error);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(function() {
|
||||||
const { app_id, app_key, server_url } = CONFIG.leancloud_visitors;
|
const { app_id, app_key, server_url } = CONFIG.leancloud_visitors;
|
||||||
const fetchData = api_server => {
|
const fetchData = api_server => {
|
||||||
const Counter = (method, url, data) => {
|
const counter = new LeanCloudCounter(app_id, app_key, api_server);
|
||||||
return fetch(`${api_server}/1.1${url}`, {
|
|
||||||
method,
|
|
||||||
headers: {
|
|
||||||
'X-LC-Id' : app_id,
|
|
||||||
'X-LC-Key' : app_key,
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify(data)
|
|
||||||
});
|
|
||||||
};
|
|
||||||
if (CONFIG.page.isPost) {
|
if (CONFIG.page.isPost) {
|
||||||
if (CONFIG.hostname !== location.hostname) return;
|
if (CONFIG.hostname !== location.hostname) return;
|
||||||
addCount(Counter);
|
counter.addCount();
|
||||||
} else if (document.querySelectorAll('.post-title-link').length >= 1) {
|
} else if (document.querySelectorAll('.post-title-link').length >= 1) {
|
||||||
showTime(Counter);
|
counter.showTime();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user