前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >引入基于LCloud的页面访问统计到Hexo博客中

引入基于LCloud的页面访问统计到Hexo博客中

原创
作者头像
ZONGLYN
修改2020-06-29 10:22:54
1.9K0
修改2020-06-29 10:22:54
举报
文章被收录于专栏:程序萌部落程序萌部落

由于本主题(Volantis)使用的 Valine 暂时仍然无法正常开启 Counter 页面计数,所以,在单一页面上展示出该页面的访问量就成了一个问题。不蒜子是个解决方式,但其加载巨慢而且仍属于个人维护、并不稳定。所以综合到最后,选择采用 LeanCloud 来完成这一功能。其主要思路就是访问页面时到对应的 LeanCloud 数据表中更新访问次数。不过暂时只能记录PV值。

<!-- more -->

从零开始引入计数代码

第一步

新增leancloud代码主体(lc_visitors.ejs),主要实现的是访问页面时leancloud访问数+1,并且返回该页面已有的访问量。

{% codeblock ~\volantis_third-party\lc_visitors.ejs lang:javascript %}

<!--由于主题包含valine.js,所以只引入av.js-->

<script src="//cdn1.lncld.net/static/js/2.5.0/av-min.js"></script>

<script type="text/javascript">

if(true){

代码语言:txt
复制
var leancloud_app_id  = 'WbLE88***********gzGzoHsz';  //y=偷懒直接硬写了
代码语言:txt
复制
var leancloud_app_key = 'ycqjmt***********RkrdO';
代码语言:txt
复制
AV.init({
代码语言:txt
复制
    appId: leancloud_app_id,
代码语言:txt
复制
    appKey: leancloud_app_key
代码语言:txt
复制
});
代码语言:txt
复制
var pageViewsLength = $(".pageViews").length;
代码语言:txt
复制
var isIndex = $(".pageViews").length > 1 ?true:false;
代码语言:txt
复制
function showTime() {
代码语言:txt
复制
    var Pageview = AV.Object.extend("Pageview");
代码语言:txt
复制
    if(isIndex){
代码语言:txt
复制
        $(".pageViews").each(function(){
代码语言:txt
复制
            showPageViewsNum($(this), Pageview);
代码语言:txt
复制
        });
代码语言:txt
复制
    }else{
代码语言:txt
复制
        addPageViewsNum($(".pageViews"));
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
//仅显示阅读量
代码语言:txt
复制
function showPageViewsNum(ele, Pageview){
代码语言:txt
复制
    var id = ele.attr('id').trim();
代码语言:txt
复制
    var query = new AV.Query("Pageview");
代码语言:txt
复制
    query.equalTo("post_id", id);
代码语言:txt
复制
    query.descending('createdAt');
代码语言:txt
复制
    query.limit(1);
代码语言:txt
复制
    query.find().then(function (results) {
代码语言:txt
复制
        $(document.getElementById(id)).text(results && results.length > 0?  results[0].get("count") : '0');
代码语言:txt
复制
    }, function (error) {
代码语言:txt
复制
         $(document.getElementById(id)).text('0');
代码语言:txt
复制
    });
代码语言:txt
复制
}
代码语言:txt
复制
//追加并显示阅读量
代码语言:txt
复制
function addPageViewsNum(ele){
代码语言:txt
复制
    var id = ele.attr('id').trim();
代码语言:txt
复制
    var title = ele.attr('data-flag-title').trim();
代码语言:txt
复制
    var query = new AV.Query("Pageview");
代码语言:txt
复制
    query.equalTo("post_id", id);
代码语言:txt
复制
    query.descending('createdAt');
代码语言:txt
复制
    query.limit(1);
代码语言:txt
复制
    query.find().then(function (results) {
代码语言:txt
复制
        if (results.length == 0) {
代码语言:txt
复制
           saveNewPageview(id, title);
代码语言:txt
复制
           return;
代码语言:txt
复制
        }
代码语言:txt
复制
        var pageview = results[0];
代码语言:txt
复制
        var count = pageview.get("count");
代码语言:txt
复制
        count++;
代码语言:txt
复制
        pageview.set("count", count);
代码语言:txt
复制
        pageview.set("title", title);
代码语言:txt
复制
        pageview.save().then(function (pageview) {
代码语言:txt
复制
            $(document.getElementById(id)).text(count);
代码语言:txt
复制
        })
代码语言:txt
复制
    }, function (error) {
代码语言:txt
复制
        saveNewPageview(id, title);
代码语言:txt
复制
    })
代码语言:txt
复制
}
代码语言:txt
复制
function saveNewPageview(id, title) {
代码语言:txt
复制
   var Pageview = AV.Object.extend("Pageview");
代码语言:txt
复制
   var query = new Pageview;
代码语言:txt
复制
   query.save({
代码语言:txt
复制
       post_id: id,
代码语言:txt
复制
       title: title,
代码语言:txt
复制
       count: 1
代码语言:txt
复制
   }).then(function (pageview) {
代码语言:txt
复制
       $(document.getElementById(id)).text(pageview.count);
代码语言:txt
复制
   }, function (error) {
代码语言:txt
复制
   });
代码语言:txt
复制
}
代码语言:txt
复制
if(pageViewsLength){ //此处判断等于 1 在执行 可去除循环
代码语言:txt
复制
    showTime();
代码语言:txt
复制
}

}

</script>

{% endcodeblock %}

第二步

将leancloud代码主体(lc_visitors.ejs)引入到原来的主题模板中,紧跟在jquery的后面。

{% codeblock ~\volantis\layout_partial\scripts.ejs lang:javascript %}

<%- js(theme.plugins.jquery) %>

<!--引入代码-->

<%- partial('_third-party/lc_visitors') %>

<% if (theme.search && theme.search.enable) { %>

... ...

<% } %>

... ...

{% endcodeblock %}

第三步

在原页面中插入显示访问量的代码段,这里我直接紧跟在meta信息的阅读时长统计后面了。

{% codeblock ~\volantis_meta\wordcount.ejs lang:javascript %}

<% if (theme.plugins.wordcount) { %>

<div class="new-meta-item wordcount">

代码语言:txt
复制
<a class='notlink'>
代码语言:txt
复制
  <i class="<%- theme.meta.wordcount.icon_wordcount %>" aria-hidden="true"></i>
代码语言:txt
复制
  <p><%- __('post.wordcount', wordcount(post.content))%></p>
代码语言:txt
复制
</a>

</div>

<div class="new-meta-item readtime">

代码语言:txt
复制
<a class='notlink'>
代码语言:txt
复制
  <i class="<%- theme.meta.wordcount.icon_duration %>" aria-hidden="true"></i>
代码语言:txt
复制
  <p><%- __('post.duration', min2read(post.content))%></p>
代码语言:txt
复制
</a>

</div>

<!--添加显示访问量的代码(火焰图标+℃)-->

<div class="new-meta-item readtime">

代码语言:txt
复制
<a class='notlink'>
代码语言:txt
复制
  <i class="fas fa-fire" aria-hidden="true"></i>
代码语言:txt
复制
  <p><span id="<%= post.path %>" class="pageViews" data-flag-title="<%= post.title || post.path %>"></span></p>
代码语言:txt
复制
</a>

</div>

<% } %>

{% endcodeblock %}

注意:以上只有部署后访问才有作用,在本地访问无效果。

LeanCloud并发查询429错误

这是第二次遇到了,每次鼓捣LeanCloud都会出现这个问题,主要还是其对访问做了限制。错误主要出现在列表页面,因为会同时查询多篇文章的访问量,所以会导致触发429错误。

我上次的解决方案:应对LeanCloud对于查询性能的限制

具体只需修改以下代码:

{% codeblock ~\volantis_third-party\lc_visitors.ejs lang:javascript %}

<!--循环间隔地控制查询的触发-->

function showTime() {

代码语言:txt
复制
if(isIndex){
代码语言:txt
复制
	var cnt = $(".pageViews").length;
代码语言:txt
复制
	var i = 0; 
代码语言:txt
复制
	var interval = setInterval(function(){
代码语言:txt
复制
		if(i >= cnt) 
代码语言:txt
复制
			clearInterval(interval);
代码语言:txt
复制
		else
代码语言:txt
复制
			showPageViewsNum($($(".pageViews")[i++]), AV.Object.extend("Pageview"));
代码语言:txt
复制
	},500);
代码语言:txt
复制
}else{
代码语言:txt
复制
	addPageViewsNum($(".pageViews"));
代码语言:txt
复制
}

}

... ...

{% endcodeblock %}

最终效果:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从零开始引入计数代码
    • 第一步
      • 第二步
        • 第三步
        • LeanCloud并发查询429错误
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档