由于本主题(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){
var leancloud_app_id = 'WbLE88***********gzGzoHsz'; //y=偷懒直接硬写了var leancloud_app_key = 'ycqjmt***********RkrdO';AV.init({ appId: leancloud_app_id, appKey: leancloud_app_key});var pageViewsLength = $(".pageViews").length;var isIndex = $(".pageViews").length > 1 ?true:false;function showTime() { var Pageview = AV.Object.extend("Pageview"); if(isIndex){ $(".pageViews").each(function(){ showPageViewsNum($(this), Pageview); }); }else{ addPageViewsNum($(".pageViews")); }}//仅显示阅读量function showPageViewsNum(ele, Pageview){ var id = ele.attr('id').trim(); var query = new AV.Query("Pageview"); query.equalTo("post_id", id); query.descending('createdAt'); query.limit(1); query.find().then(function (results) { $(document.getElementById(id)).text(results && results.length > 0? results[0].get("count") : '0'); }, function (error) { $(document.getElementById(id)).text('0'); });}//追加并显示阅读量function addPageViewsNum(ele){ var id = ele.attr('id').trim(); var title = ele.attr('data-flag-title').trim(); var query = new AV.Query("Pageview"); query.equalTo("post_id", id); query.descending('createdAt'); query.limit(1); query.find().then(function (results) { if (results.length == 0) { saveNewPageview(id, title); return; } var pageview = results[0]; var count = pageview.get("count"); count++; pageview.set("count", count); pageview.set("title", title); pageview.save().then(function (pageview) { $(document.getElementById(id)).text(count); }) }, function (error) { saveNewPageview(id, title); })}function saveNewPageview(id, title) { var Pageview = AV.Object.extend("Pageview"); var query = new Pageview; query.save({ post_id: id, title: title, count: 1 }).then(function (pageview) { $(document.getElementById(id)).text(pageview.count); }, function (error) { });}if(pageViewsLength){ //此处判断等于 1 在执行 可去除循环 showTime();}}
</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">
<a class='notlink'> <i class="<%- theme.meta.wordcount.icon_wordcount %>" aria-hidden="true"></i> <p><%- __('post.wordcount', wordcount(post.content))%></p></a></div>
<div class="new-meta-item readtime">
<a class='notlink'> <i class="<%- theme.meta.wordcount.icon_duration %>" aria-hidden="true"></i> <p><%- __('post.duration', min2read(post.content))%></p></a></div>
<!--添加显示访问量的代码(火焰图标+℃)-->
<div class="new-meta-item readtime">
<a class='notlink'> <i class="fas fa-fire" aria-hidden="true"></i> <p><span id="<%= post.path %>" class="pageViews" data-flag-title="<%= post.title || post.path %>"></span></p></a></div>
<% } %>
{% endcodeblock %}
注意:以上只有部署后访问才有作用,在本地访问无效果。
这是第二次遇到了,每次鼓捣LeanCloud都会出现这个问题,主要还是其对访问做了限制。错误主要出现在列表页面,因为会同时查询多篇文章的访问量,所以会导致触发429错误。
我上次的解决方案:应对LeanCloud对于查询性能的限制
具体只需修改以下代码:
{% codeblock ~\volantis_third-party\lc_visitors.ejs lang:javascript %}
<!--循环间隔地控制查询的触发-->
function showTime() {
if(isIndex){ var cnt = $(".pageViews").length; var i = 0; var interval = setInterval(function(){ if(i >= cnt) clearInterval(interval); else showPageViewsNum($($(".pageViews")[i++]), AV.Object.extend("Pageview")); },500);}else{ addPageViewsNum($(".pageViews"));}}
... ...
{% endcodeblock %}
最终效果:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。