当前位置: 首页 > news >正文

Hexo添加评论、阅读次数和分类/标签

添加评论

注册 OAuth Application

注册OAuth Application,其他内容可以随便写,但要确保填入正确的callback URL(一般是评论页面对应的域名,如:http://celesteting.com )

最后你会得到一个client ID 和client secret.

配置主题的_config.yml

在主题下_config.yml(themes/你的主题)文件中添加[在浏览器输入https://api.github.com/users/GitHub用户名可以获取对应的githubid]

# Gitment
 # Introduction: https://imsun.net/posts/gitment-introduction/
gitment:
  enable: true
  githubID: 你的 GitHub ID  // 可以是你的GitHub用户名,也可以是github id
  repo: 存储评论的 github repo // 在github新建一个仓库,这里只需填你刚建的仓库名
  ClientID: 你的 client id
  ClientSecret: 你的 client secret
  lazy: false
复制代码

lazy:是否懒加载相应评论框,如果为true,文章底部评论是手气状态,显示Gitment评论按钮。

懒加载按钮显示文字的设置: 在主题下languages/zh-Hans.yml中添加:gitmentbutton: 显示 Gitment 评论

懒加载按钮div以及事件设置

在主题下layout/ _partials/comments.swig文件中添加中间那段

 <div id="lv-container" data-id="city" data-uid="{{ theme.livere_uid }}"></div>
    {% elseif theme.changyan.appid and theme.changyan.appkey %}
      <div id="SOHUCS"></div>
      
      
    {% elseif theme.gitment.enable %}
     {% if theme.gitment.lazy %}
       <div onclick="ShowGitment()" id="gitment-display-button">{{ __('gitmentbutton') }}</div>
       <div id="gitment-container" style="display:none"></div>
     {% else %}
       <div id="gitment-container"></div>
     {% endif %}
     
     
    {% endif %}
  </div>
{% endif %}
复制代码

对应页面生成js代码配置

在主题下**layout/ _third-party/comments/**下添加gitment.swig并把以下代码复制进去

{% if theme.gitment.enable %}
   {% set owner = theme.gitment.githubID %}
   {% set repo = theme.gitment.repo %}
   {% set cid = theme.gitment.ClientID %}
   {% set cs = theme.gitment.ClientSecret %}
   <link rel="stylesheet" href="https://imsun.github.io/gitment/style/default.css">
   <script src="https://imsun.github.io/gitment/dist/gitment.browser.js"></script>
   {% if not theme.gitment.lazy %}
       <script type="text/javascript">
             var gitment = new Gitment({
                 id: document.location.href, 
                 owner: 'celesteting',
                 repo: 'Comment',
                 oauth: {
                     client_id: '04589948574cf32e0895',
                     client_secret: 'bfd0b5f2c307c781cd00d1657e9cfbf75ada3feb',
                 }});
             gitment.render('gitment-container');
         </script>
     {% else %}
         <script type="text/javascript">
             function ShowGitment(){
                 document.getElementById("gitment-display-button").style.display = "none";
                 document.getElementById("gitment-container").style.display = "block";
                 var gitment = new Gitment({
                     id: document.location.href, 
                     owner: 'celesteting',
                     repo: 'Comment',
                     oauth: {
                         client_id: '04589948574cf32e0895',
                         client_secret: 'bfd0b5f2c307c781cd00d1657e9cfbf75ada3feb',
                     }});
                 gitment.render('gitment-container');
             }
         </script>
     {% endif %}
 {% endif %}
复制代码

引入文件gitment.swig

添加gitment.swig文件后,在主题layout/ _third-party/comments/index.swig文件中引入gitment.swig

{% include 'gitment.swig' %}
复制代码

设置懒加载按钮CSS样式

在主题下source/css/ _common/components/third-party目录下添加gitment.styl文件,设置button样式

#gitment-display-button{
     display: inline-block;
     padding: 0 15px;
     color: #0a9caf;
     cursor: pointer;
     font-size: 14px;
     border: 1px solid #0a9caf;
     border-radius: 4px;
 }
 #gitment-display-button:hover{
     color: #fff;
     background: #0a9caf;
 }
复制代码

之后在主题下source/css/ _common/components/third-party/third-party.styl文件中引入相应样式

@import "gitment";
复制代码

初始化评论

访问页面并使用GitHub账号登陆,点击初始化按钮即可。

但是主页面的控制台会报下面的错,跪求指教!!!

[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[Autorun@2] TypeError: Cannot read property 'firstChild' of null
    at gitment.js:16
    at reactionRunner (mobx.js:123)
    at trackDerivedFunction (mobx.js:1000)
    at Reaction.track (mobx.js:1312)
    at Reaction.onInvalidate (mobx.js:120)
    at Reaction.runReaction (mobx.js:1288)
    at runReactionsHelper (mobx.js:1404)
    at reactionScheduler (mobx.js:1386)
    at runReactions (mobx.js:1390)
    at Reaction.schedule (mobx.js:1276)
复制代码

阅读次数

注册LeanCloud创建类并得到App ID以及App Key

在设置里面的应用Key中可以得到 App ID 以及 App Key 这两个参数

  1. 注册 LeanCloud
  2. 应用 -> 创建新应用 -> 创建
  3. 进入“应用”-> “存储”->“数据”->“创建Class”创建一个Counter的类
  4. 设置 -> 应用Key -> 复制 App ID 以及 App Key 在编辑 \themes\你的主题\ _config.yml 中相应位置输入即可。
    正确配置之后文件如下:
leancloud_visitors:
  enable: true
  app_id: yOW0YyukmCgRVHTlVKQrwuCX
  app_key: 8Cdt8dmYHgvO6tUDiD

复制代码

额外设置

设置_layout.swig

_layout.swig - themes\你的主题\layout\ _layout.swig:该文件是主题全局初始化引用接口,主要是引用leanCloud的代码文件

需要添加以下代码,因为我的主题集成了LeanCloud,所以直接引用该文件即可

{% include '_third-party/analytics/lean-analytics.swig' %}
复制代码

如果你的主题在**\themes\你的主题\layout\ _third-party\analytics没有lean-analytics.swig**该文件,需要在该路径创建文件“lean-analytics.swig”,并把以下代码复制进去

{% if theme.leancloud_visitors.enable %}

  {# custom analytics part create by xiamo #}
  <script src="https://cdn1.lncld.net/static/js/av-core-mini-0.6.4.js"></script>
  <script>AV.initialize("{{theme.leancloud_visitors.app_id}}", "{{theme.leancloud_visitors.app_key}}");</script>
  <script>
    function showTime(Counter) {
      var query = new AV.Query(Counter);
      var entries = [];
      var $visitors = $(".leancloud_visitors");

      $visitors.each(function () {
        entries.push( $(this).attr("id").trim() );
      });

      query.containedIn('url', entries);
      query.find()
        .done(function (results) {
          var COUNT_CONTAINER_REF = '.leancloud-visitors-count';

          if (results.length === 0) {
            $visitors.find(COUNT_CONTAINER_REF).text(0);
            return;
          }

          for (var i = 0; i < results.length; i++) {
            var item = results[i];
            var url = item.get('url');
            var time = item.get('time');
            var element = document.getElementById(url);

            $(element).find(COUNT_CONTAINER_REF).text(time);
          }
          for(var i = 0; i < entries.length; i++) {
            var url = entries[i];
            var element = document.getElementById(url);
            var countSpan = $(element).find(COUNT_CONTAINER_REF);
            if( countSpan.text() == '') {
              countSpan.text(0);
            }
          }
        })
        .fail(function (object, error) {
          console.log("Error: " + error.code + " " + error.message);
        });
    }

    function addCount(Counter) {
      var $visitors = $(".leancloud_visitors");
      var url = $visitors.attr('id').trim();
      var title = $visitors.attr('data-flag-title').trim();
      var query = new AV.Query(Counter);

      query.equalTo("url", url);
      query.find({
        success: function(results) {
          if (results.length > 0) {
            var counter = results[0];
            counter.fetchWhenSave(true);
            counter.increment("time");
            counter.save(null, {
              success: function(counter) {
                var $element = $(document.getElementById(url));
                $element.find('.leancloud-visitors-count').text(counter.get('time'));
              },
              error: function(counter, error) {
                console.log('Failed to save Visitor num, with error message: ' + error.message);
              }
            });
          } else {
            var newcounter = new Counter();
            /* Set ACL */
            var acl = new AV.ACL();
            acl.setPublicReadAccess(true);
            acl.setPublicWriteAccess(true);
            newcounter.setACL(acl);
            /* End Set ACL */
            newcounter.set("title", title);
            newcounter.set("url", url);
            newcounter.set("time", 1);
            newcounter.save(null, {
              success: function(newcounter) {
                var $element = $(document.getElementById(url));
                $element.find('.leancloud-visitors-count').text(newcounter.get('time'));
              },
              error: function(newcounter, error) {
                console.log('Failed to create');
              }
            });
          }
        },
        error: function(error) {
          console.log('Error:' + error.code + " " + error.message);
        }
      });
    }

    $(function() {
      var Counter = AV.Object.extend("Counter");
      if ($('.leancloud_visitors').length == 1) {
        addCount(Counter);
      } else if ($('.post-title-link').length > 1) {
        showTime(Counter);
      }
    });
  </script>

{% endif %}

复制代码

设置post.swig

post.swig - themes\你的主题\layout\ _macro\post.swig主要是文章主题代码文件(包括主题显示阅读数量的代码)

在需要的位置添加如下代码

{# LeanCould PageView #}
{% if theme.leancloud_visitors.enable %}
 <span id="{{ url_for(post.path) }}" class="leancloud_visitors" data-flag-title="{{ post.title }}">
   &nbsp; | &nbsp;
   <span class="post-meta-item-icon">
     <i class="fa fa-eye"></i>
   </span>
   <span class="post-meta-item-text">{{__('post.visitors')}} </span>
   <span class="leancloud-visitors-count"></span> 次
  </span>
{% endif %}
复制代码

Web安全

因为我弄了域名,为了确保应用的统计计数能用,你可以在应用->设置->安全中心的Web安全域名

中添加自己的博客域名,一确保数据的调用安全。

设置完成

完成以上设置,重新发布即可看到相关文章的统计内容

添加分类/标签

  1. 在命令行中输入以下代码,创建tags、categories页面,否则会报404错误
$ hexo new page tags
$ hexo new page categories
复制代码
  1. 在sources/categories有个index.md,加上以下代码(tags同理type: "tags")
type: "categories"
复制代码
  1. 在主题配置文件(\themes\你的主题_config.yml)中,在menu下,把tags和categories页打开
menu:
  home: /
  categories: /categories
  #about: /about/
  archives: /archives
  tags: /tags
  #sitemap: /sitemap.xml
  #commonweal: /404/
复制代码
  1. 重新发布即可看到分类和标签页有对应的内容

参考页面

  1. www.0101tx.com/pages/hexon…
  2. imsun.net/posts/gitme…

相关文章:

  • 颜色的生成
  • 360首曝人工智能研发三大神秘成果
  • ThinkSNS+ 移动端1.8.2.0704 版本更新简要说明
  • js蛋疼的Class(获取class对象)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 大数据教程(2.5):Linux系统搭建本地YUM源服务器
  • 每天学点SpringCloud(一):使用SpringBoot2.0.3整合SpringCloud
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • Vuejs响应式原理
  • SQL注入1——bugku
  • PS常识及技巧
  • 微擎用户账号加密方式
  • 新手应该如何学习python
  • 【Nebula系列】C++反射机制:可变参数模板实现C++反射
  • Vue核心思想:数据驱动、组件化
  • __proto__ 和 prototype的关系
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 77. Combinations
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Effective Java 笔记(一)
  • fetch 从初识到应用
  • input的行数自动增减
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel 实践之路: 数据库迁移与数据填充
  • Rancher-k8s加速安装文档
  • React as a UI Runtime(五、列表)
  • React+TypeScript入门
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 百度地图API标注+时间轴组件
  • 猴子数据域名防封接口降低小说被封的风险
  • 记录:CentOS7.2配置LNMP环境记录
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 写给高年级小学生看的《Bash 指南》
  • 一、python与pycharm的安装
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 运行时添加log4j2的appender
  • Semaphore
  • UI设计初学者应该如何入门?
  • ​如何防止网络攻击?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (力扣)1314.矩阵区域和
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (四)linux文件内容查看
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • 、写入Shellcode到注册表上线
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息