From b84b0d6fd7ce670053c49e17a09a34b1bf1ea741 Mon Sep 17 00:00:00 2001 From: Mimi <1119186082@qq.com> Date: Thu, 10 Jul 2025 11:05:03 +0800 Subject: [PATCH] Refactor lean-analytics --- .../third-party/statistics/lean-analytics.js | 66 +++++++++++-------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/source/js/third-party/statistics/lean-analytics.js b/source/js/third-party/statistics/lean-analytics.js index 5c624ef..430c538 100644 --- a/source/js/third-party/statistics/lean-analytics.js +++ b/source/js/third-party/statistics/lean-analytics.js @@ -1,25 +1,43 @@ /* global CONFIG */ /* eslint-disable no-console */ -(function() { - const leancloudSelector = url => { +class LeanCloudCounter { + constructor(appId, appKey, apiServer) { + this.appId = appId; + this.appKey = appKey; + this.apiServer = apiServer; + } + + leancloudSelector(url) { url = encodeURI(url); 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 url = decodeURI(visitors.id); const title = visitors.dataset.flagTitle; 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(); if (results.length > 0) { const counter = results[0]; - leancloudSelector(url).innerText = counter.time + 1; + this.leancloudSelector(url).innerText = counter.time + 1; try { - await Counter('put', '/classes/Counter/' + counter.objectId, { + await this.request('put', '/classes/Counter/' + counter.objectId, { time: { '__op' : 'Increment', 'amount': 1 @@ -29,13 +47,13 @@ console.error('Failed to save visitor count', error); } } 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`.'); } else { 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(); - leancloudSelector(url).innerText = 1; + this.leancloudSelector(url).innerText = 1; } catch (error) { console.error('Failed to create', error); } @@ -43,44 +61,36 @@ } catch (error) { console.error('LeanCloud Counter Error', error); } - }; + } - const showTime = async Counter => { + async showTime() { const visitors = document.querySelectorAll('.leancloud_visitors'); const entries = [...visitors].map(element => { return decodeURI(element.id); }); 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(); for (const url of entries) { 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) { console.error('LeanCloud Counter Error', error); } - }; + } +} +(function() { const { app_id, app_key, server_url } = CONFIG.leancloud_visitors; const fetchData = api_server => { - const Counter = (method, url, data) => { - 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) - }); - }; + const counter = new LeanCloudCounter(app_id, app_key, api_server); if (CONFIG.page.isPost) { if (CONFIG.hostname !== location.hostname) return; - addCount(Counter); + counter.addCount(); } else if (document.querySelectorAll('.post-title-link').length >= 1) { - showTime(Counter); + counter.showTime(); } };