在成功建立本地 Waline 服务后,我们自己掌控了数据库,可以做更多事情,本文记录基于本地数据库的 Waline 为文章添加评论数统计的方法。
url
文档数量def __init__(self):
conter_path = Path(__file__).with_name('conter.json')
self.conter_dict = mt.json_load(conter_path)
try:
conn = MongoClient('127.0.0.1', 27017)
db = conn.admin
self.collection = db['Comment']
except:
self.collection = None
url
后查询评论数返回def get_comment_num(self, sub_url):
if self.collection is None:
return 0
else:
return self.collection.count_documents({'url': sub_url})
def post_pv(self, sub_url):
url = self.root_url + 'stats?start_at=1350679719687&end_at=1990039038644' + '&url=' + sub_url
res = requests.get(url=url, data=json.dumps({}), headers=self.header)
res_dict = json.loads(res.text)
pv = max(1, res_dict['pageviews']['value'] + self.conter_dict.get(sub_url, 0))
uv = max(1, res_dict['uniques']['value'])
comment_num = self.get_comment_num(sub_url)
return pv, uv, comment_num
@app.route("/poststats", methods=['GET','POST'])
def poststats():
url = request.data.decode('utf8')[1:-1]
pv, uv, comment_num = statis_obj.post_pv(url)
return {'pv': pv, 'uv': uv, 'cn': comment_num}
也就是说访问该链接后返回
{'pv': 3, 'uv': 1, 'cn': 0}
之类的信息
修改 themes\fluid\layout\_partials\post\meta-top.ejs
文件(在 PVUV 修改基础上)
前端代码加入评论数:
<span id="vvdpost_container_page_pvuv" style="display: none">
<i class="iconfont icon-eye" aria-hidden="true"></i>
<%- views_texts[0] %><span id="vvdpost_value_page_pv">0</span><%- views_texts[1] + '  ' %>
<i class="iconfont icon-users" aria-hidden="true"></i>
<%- views_texts[0] %><span id="vvdpost_value_page_uv">0</span><%- ' 人  ' %>
<i class="iconfont icon-comment" aria-hidden="true"></i>
<%- views_texts[0] %><span id="vvdpost_value_page_cn">0</span><%- ' 条' %>
</span>
script 代码获取后端返回数据,解析填入前端代码
if (pvCtn) {
var pv_ele = document.querySelector('#vvdpost_value_page_pv');
console.log(pv_ele);
var uv_ele = document.querySelector('#vvdpost_value_page_uv');
console.log(uv_ele);
var cn_ele = document.querySelector('#vvdpost_value_page_cn');
console.log(cn_ele);
if (uv_ele && uv_ele) {
pv_ele.innerText = obj.pv;
uv_ele.innerText = obj.uv;
cn_ele.innerText = obj.cn;
pvCtn.style.display = 'inline';
}
}
}