Refactor lean-analytics

This commit is contained in:
Mimi 2025-07-10 11:05:03 +08:00
parent 55c429d677
commit b84b0d6fd7

View File

@ -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();
} }
}; };