阅读视图

发现新文章,点击刷新页面。
🔲 ⭐

2020 年第 36 周

期末结束了。新学期也快要开始了。新增了这周看了什么板块。

这周做了什么

PM2

PM2 是用来管理,监控 Node.js 服务和进程的,当然它也支持监控 bash 程序。

在这之前我们使用node app.js来启动一个 Node.js 服务。如果想要保证这个服务在 SSH 窗口退出后保持运行,我们需要将其放在 Screen 或者 Tmux 中。

有了 PM2 后,执行pm2 app.js就可以启动 Node.js 程序了。退出 ssh 窗口也不会中止app.js。PM2 还提供了查看app.js的日志,重启,中止程序的功能。我们也可执行pm2 plus以登录 PM2 账号,这样就可以在 PM 官网的仪表盘上管理和监控我们的服务。

如果想要传入参数,可以执行以下命令。pm2 start app.js --name my-api -- --port 4000。这样就传入了port参数给 Node,并且将app.js这个进程命名为 my-api。

Steam 挂卡&卖卡

Steam 挂卡通过使用 Steam 机器人 24 小时不间断玩游戏来获取集换卡片。卖卡就是将这些集换卡片在市场卖出。如果用 Steam 令牌添加了新设备,集换卡片七天内不能交易。

ASF 是比较热门的挂卡程序。我们可以选择在本地挂卡或者在 VPS 上进行挂卡。本地不可能 24 小时开机,所以我选择在 VPS 上进行挂卡。教程 1教程 2

在教程 1 当中,作者将 ASF 程序放在另一个 Screen 中运行。像上一节描述的那样,我么可以用 PM2 来达到更好的效果。pm2 ./ArchiSteamFarm

Pixiv

写了一个脚本把点赞的图收集起来,每周都可以回顾一下过去一周点赞的图,好好的欣赏,评价一下。至于怎么评价可以看怎么判断画的是神作,还是被无脑吹捧的狗屎。由于点赞列表数据里不含时间,所以就增量更新。以前下载到哪里,我们就把在那之后的点赞的图下载一遍。图片相关信息就直接写进图片元数据中,这样移动起来比较方便。

图片元数据的格式分为 EXIF,IPTC,XMP 这几种格式。每一种格式有着自己的数据规范。比如 EXIF 是没有 Title 这一栏的,但是 XMP 却有。对比了他们所提供的格式和我自己所获取的图片数据,我选择 XMP。

虽然将所有图片信息写入元数据方便图片的移动,但我比较担心读取和写入数据时的性能开销。如果影响不大,这个方法比把数据单独写入数据库要简洁很多。即便图片改了名字,元数据也不会丢。

这个 工具 可以在线查看元数据。

Star Renegade

像素风,回合制,Roguelike,RPG 游戏。虽然是像素风格,光影却是正常的。打击特效和音效做的不错,但是看上那么多遍还是会疲劳。

作为一个 Roguelike 游戏,随机的成分并不是特别多,地图虽然是随机,但是 Boss 和资源变化并不大。在每次旅途中会有装备,等级,和队友互相之间的好感系统。这个养成系统感觉是很 RPG 的。但这个 RPG 是在 Roguelike 的框架下,也就是每次死亡,装备,等级,好感都会重置,需要重新获取。由于回合制的节奏,以及 RPG 的机制,每一把的时间都特别长,大概在三个小时左右,这还是打到一大半的位置。

地图与其他简洁明了的 Roguelike 不同,这款游戏并没有地图,取而代之的是 2D RPG 游戏的那种设计。玩家可以在区域内走来走去。整个大区域被划分成更加细小的区划,通过限制玩家进入新的区划的次数来限制玩家的行动点。整个大区域的设计更像是图,而不是 Slay the Spire 那样的树。Star Renegade 通过这种方式更好的展示了游戏的美术设定,玩家也可以与区域中的一些物品进行互动,从而触发一些关于背景文化的对话。这样的坏处就是玩家不容易看清图的结构,游戏的节奏也会被拉慢,因为玩家在游戏战斗之间需要探索。

游戏中独特的扎营机制也放缓了游戏节奏。消耗完三个行动点,玩家就需要扎营,等待新的一天。在扎营期间,玩家可以培养人物之间的好感,使用各种 Buff 的卡片。

相比 Slay the Spire,选择节点,打怪,选择节点,打怪,这款游戏的节奏慢了很多。打一把需要更长的时间。那么每一把之后,玩家会变强从而在下一次走的更远吗?我个人觉得不怎么会。每一把之后的结算所能获取的东西并不多,我至今还卡在第三关。每一次花费两三个小时来到第三关,然后死亡,然后重来,最后放弃。我想这是游戏节奏的问题,又或者是去掉 Roguelike 可以解决的问题。

Ansible

Ansible 是一个来自 Red Hat 的运维工具。它可以自动化,批量进行许多操作。它适合用来在已有的服务器上安装和管理软件。

我日常会用到 VPS,并在上面安装或者管理软件。常用的软件也就那几个。那么我们可以把这几个软件的安装和管理写成 Ansible Playbook。以后我们就不再需要重复安装和管理软件的步骤,只需要执行 Playbook 就可以了。用自动化解放了我们的双手。

Ansible 的 Playbook 编写采用渐进式,用户需要写下每一步需要做什么。Ansible 有丰富的 Role(库,插件,比如 安装 Node.js),组件支持,大部分操作都可以用现成的 Role 或者组件实现,不需要自己额外进行编写。

Ansible 没有 Master 的概念,任何一个节点都可以推送命令。Ansible 通过 SSH 连接上节点后,执行对应的命令。由于采用 SSH 进行命令推送,接受命令推送的节点不需要安装 Ansible 客户端。

因此对于我来说最好的实践便是在本地安装好 Ansible,注意它不支持 Windows。将常用的软件配置写成 Ansible Playbook。介于丰富的组件和 Role,这并不难。每当有新的 VPS 时,我们执行相应的 Ansible Playbook 就可以完成所有工作。比如我写了 Tiny Tiny Rss,Unblock Netease Music 的 Playbook,如果以后更换 VPS 就可以很方便的安装这些软件。

我们可以把用到的 Role 放到 Requirement.yml 中,这可以保证换个环境,安装完依赖后,我们之前写的 Playbook 还可以正常运行。

最后推荐一个 视频教程,视频教程虽然看起来慢但是比较容易理解使用者的思路,易于模仿。

这周看了什么

  • 回到夏天: 作曲:爱写歌的小田,作词:雷壮、爱写歌的小田,编曲:罗洋(卡其漠)。然而这个旋律从头到尾就没怎么变过。
  • Trasfer: 这个工具整合了所有主流的文件分享工具,比如 airpotal,奶牛快传等。文件的分享和下载可以通过命令行完成。传输方法不是点对点,因此借助第三方服务器需要消耗更多的时间。如果想要点对点,节省时间的传输方式可以用 WinSCP 等软件采用 SFTP 的传输方式。
  • Batch Git Pull: 批量更新 Git 仓库。我想很少有人一次性更新所有仓库吧。对于那些不怎么维护的 Git 仓库,更新了之后只会徒增 bug。那些正在维护的仓库,应该会一个个的更新,慢慢解决 Bug。
  • Tabnine: 非常好用的 AI 自动补全。当别人只能一个词一个词补全的时候,它可以补全整句话。连for语句也可以帮你补全,list 的 index 也可以帮我补全。
  • Applied ML: 大公司发的人工智能文章。
  • Hero Pattern: 可以自定义的 SVG 几何背景图。
  • autoscrapper: 一个智能的爬虫库。用户将目标告诉它,这个库会返回类似的结果。比如要抓取一个博客中所有文章的标题,用户可以将一个文章的标题告诉它,它便输出所有标题。
  • 怎么判断画的是神作,还是被无脑吹捧的狗屎: 这个视频讲述了作者自己如何判断一幅画好看不好看。
    • 艺术元素:
      • 线条
      • 明暗和颜色
      • 主体形状
      • 材质
      • 空间
    • 艺术原理:
      • 平衡
      • 引导线(视线运动)
      • 对比
        • 颜色明暗
        • 颜色冷暖
        • 颜色饱和
      • 风格统一
      • 规则变化(不重复和呆板)
        • 软的线条和硬的线条组合
        • 直和弯的组合
    • 数据指标:
      • 初次观看时长
      • 重复观看次数
      • 观看后的思考
  • Thoughts on the market: Morgan Stanley 对于市场的分析。
  • MyFonts: 识别图片中的字体。
  • 《乔布斯传》作者沃尔特,艾萨克森:“一个具有强烈个性的人身上集合了人文和科学的天赋后所产生的创造力,是在 21 世纪建立创新型经济的关键因素。”

下周做什么

  • GRE 备考
  • 极简欧洲史
  • Pixiv 完善
  • 图片展示网站 UI 设计
  • 整理手机浏览器标签页
🔲 ☆

Hexo 博客美化

注意,本文方法主要用于 Butterfly 主题,其他主题需要有一定的前端知识 !!!
DIY 前请先备份!!!

本文基于 Butterfly 主题 3.0.0 之前的版本修改!
3.0.0 版本之后的部分内容可能需要调整!

对前端及自己使用的主题不太了解的话建议不要随意修改!

本文介绍的所有修改效果都可以在Demo 网站中查看!
如果修改过程中出现问题请先查看Demo 网站源码对比一下有没有错误!

Pixiv 日榜

Butterfly 主题

  1. themes\Butterfly\layout\includes\widget文件夹新建card_pixiv.pug文件,文件内容如下:

    .card-widget.card-pixiv  .card-content    .item-headline      i.fa.fa-image(aria-hidden="true")      span= _p('aside.card_pixiv')    iframe(src="https://cloud.mokeyjay.com/pixiv" frameborder="0" style="width:99%;height:380px;margin:0;")

    https://cloud.mokeyjay.com/pixiv使用的是超能小紫提供的服务,也可以自行搭建,搭建方式请看这里

  2. 编辑themes\Butterfly\layout\includes\widget\index.pug文件,在你想要显示的位置插入以下代码:

    if theme.aside.card_pixiv  include ./card_pixiv.pug
  3. 编辑butterfly.yml文件,在card_webinfo下面添加一行card_pixiv: true

  4. 编辑themes\Butterfly\languages\zh-CN.yml文件(请根据你的网站语言选择),找到card_announcement: 公告, 在下面添加一行card_pixiv: Pixiv日榜Top50(后面的文本可自定义)

  5. 如果不想显示,直接把butterfly.yml文件的card_pixiv: true改为card_pixiv: false即可

其他主题

将以下内容插入到需要显示的地方:

<iframe src="https://cloud.mokeyjay.com/pixiv" frameborder="0" style="width:100%;height:380px;margin:0;"></iframe>

访客地图

Butterfly 主题

  1. 前往clustrmaps网站注册一个帐号

  2. 找到Free Tools下面的Website Widget, 点击Get Map Widget

  3. 输入你的博客网址,点击Next

  4. 根据你自己的喜好选择样式Map widgetGlobe Widget

  5. 找到如下代码,记住 src(******的部分):

    <script type="text/javascript" id="clstr_globe" src="**********************">
  6. themes\Butterfly\layout\includes\widget文件夹新建card_map.pug文件,文件内容如下:

    .card-widget.card-map  .card-content    .item-headline      i.fas.fa-globe-asia(aria-hidden="true")      span= _p('aside.card_map')    //- 下面这行适用于3D地图(Globe Widget)    script#clstr_globe(type="text/javascript" defer="defer" src="******************")    //- 下面这行适用于平面地图(Map Widget)    script#clustrmaps(type="text/javascript" defer="defer" src="******************")

    ******部分填写上面的 src, 3D 地图和平面地图任选一个,不用的把代码删掉

  7. 编辑themes\Butterfly\layout\includes\widget\index.pug文件,在你想要显示的位置插入以下代码:

    if theme.aside.card_map  include ./card_map.pug
  8. 编辑butterfly.yml文件,在card_webinfo下面添加一行card_map: true

  9. 编辑themes\Butterfly\languages\zh-CN.yml文件(请根据你的网站语言选择),找到card_announcement: 公告, 在下面添加一行card_map: 访客地图(后面的文本可自定义)

  10. 如果不想显示,直接把butterfly.yml文件的card_map: true改为card_map: false即可

其他主题

将上面第 5 步中的代码插入到需要显示的地方。

文章日历

本方法只适用于 Butterfly 主题!

  1. 安装hexo-generator-calendar插件

    npm install --save git://github.com/howiefh/hexo-generator-calendar.git
  2. 下载calendar.jslanguages.js文件,保存到themes\Butterfly\source\js目录

  3. 编辑calendar.js文件,在文件最后}(jQuery));之前添加:

    $(document).ready(function () {    $('#calendar').aCalendar('zh-CN');//'zh-CN'请根据自己博客的语言选择});
  4. 编辑butterfly.yml文件, 以下两个你butterfly.yml文件里有哪个就用那个,不要都用!

    • CDN_USE->js下面添加如下内容:
    - /js/calendar.js- /js/languages.js
    • inject->bottom下面添加如下内容:
    - <script src="/js/calendar.js"></script>- <script src="/js/languages.js"></script>
  5. 下载calendar.styl文件,保存到themes\Butterfly\source\css\_layout目录

  6. themes\Butterfly\layout\includes\widget文件夹新建card_calendar.pug文件,文件内容如下:

    .card-widget.card-calendar  .card-content    .item-headline      i.far.fa-calendar-alt(aria-hidden="true")      span= _p('aside.card_calendar')    div.widget-wrap    div#calendar.widget
  7. 编辑themes\Butterfly\layout\includes\widget\index.pug文件,在你想要显示的位置插入以下代码:

    if theme.aside.card_calendar  include ./card_calendar.pug
  8. 编辑butterfly.yml文件,在card_webinfo下面添加一行card_calendar: true

  9. 编辑themes\Butterfly\languages\zh-CN.yml文件(请根据你的网站语言选择),找到card_announcement: 公告, 在下面添加一行card_calendar: 文章日历(后面的文本可自定义)

  10. 如果不想显示,直接把butterfly.yml文件的card_calendar: true改为card_calendar: false即可

投票系统

Butterfly 主题

  1. 前往widgetpack注册账号

  2. 登陆后在点击左侧侧边栏Rating->Install, 你会看到如下代码,记住id:

    <div id="wpac-rating"></div><script type="text/javascript">wpac_init = window.wpac_init || [];wpac_init.push({widget: 'Rating', id: *****});(function() {    if ('WIDGETPACK_LOADED' in window) return;    WIDGETPACK_LOADED = true;    var mc = document.createElement('script');    mc.type = 'text/javascript';    mc.async = true;    mc.src = 'https://embed.widgetpack.com/widget.js';    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(mc, s.nextSibling);})();</script><a href="https://widgetpack.com" class="wpac-cr">Star Rating WIDGET PACK</a>
  3. 博客根目录/themes/Butterfly/layout/includes/post/目录内新建文件rate.pug, 内容如下:

    #wpac-ratingscript.  wpac_init = window.wpac_init || [];  wpac_init.push({widget: 'Rating', id: #{theme.rate.id}});  (function() {    if ('WIDGETPACK_LOADED' in window) return;    WIDGETPACK_LOADED = true;    var mc = document.createElement('script');    mc.type = 'text/javascript';    mc.async = true;    mc.src = '//embed.widgetpack.com/widget.js';    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(mc, s.nextSibling);  })();style.  #wpac-rating {    margin-top: 20px;    text-align: center;  }
  4. 编辑博客根目录/themes/Butterfly/layout/post.pug文件,在!=partial('includes/post/reward', {}, {cache:theme.fragment_cache})下方添加:

    if theme.rate.enable  include includes/post/rate.pug

    注意缩进if与上面的if对齐

  5. Butterfly.yml文件内添加:

    rate:  enable: true  id: #上面记住的id

其他主题

将第 2 步生成的代码插入到需要显示的位置。

加载中动画

Butterfly 主题

更新到最新版即可。

其他主题

  1. 将以下内容添加到<head></head>标签内:

    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/HCLonely/images@master/others/loading.min.css">
  2. 将以下内容添加到<body>标签后面:

    <div id="loading-box">  <div class="loading-left-bg"></div>  <div class="loading-right-bg"></div>  <div class="spinner-box">    <div class="configure-border-1">      <div class="configure-core"></div>    </div>    <div class="configure-border-2">      <div class="configure-core"></div>    </div>    <div class="loading-word">加载中...</div>  </div></div>
  3. 将以下内容添加到</body>标签前面:

    <script>  var endLoading = function () {    document.body.style.overflow = 'auto';    document.getElementById('loading-box').classList.add("loaded");  }  window.addEventListener('load',endLoading);</script>

页脚跳动的♥

Butterfly 主题

  1. 编辑博客根目录/themes/Butterfly/layout/includes/footer.pug文件,将&copy;${theme.since} - ${nowYear} By ${config.author}改为&copy;${theme.since} - ${nowYear + ' '} <i id="heartbeat" class="fa fas fa-heartbeat"></i> ${config.author}, 将&copy;${nowYear} By ${config.author}改为&copy;${nowYear + ' '} <i id="heartbeat" class="fa fas fa-heartbeat"></i> ${config.author}

  2. 编辑butterfly.yml文件, 以下两个你butterfly.yml文件里有哪个就用那个,不要都用!

    • CDN_USE->css下面添加如下内容:
    - https://cdn.jsdelivr.net/gh/HCLonely/images@master/others/heartbeat.min.css
    • inject->head下面添加如下内容:
    - <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/HCLonely/images@master/others/heartbeat.min.css">

其他主题

  1. <i id="heartbeat" class="fa fas fa-heartbeat"></i>添加到需要显示的位置

  2. 将以下内容添加到<head></head>标签内:

    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/HCLonely/images@master/others/heartbeat.min.css">

页脚显示网站运行时间

Butterfly 主题

  • 编辑博客根目录/themes/Butterfly/layout/includes/footer.pug文件,在最后span=theme.ICP.text下一行添加以下内容:
  #running-time    script.      setInterval(()=>{let create_time=Math.round(new Date('2020-01-03 00:00:00').getTime()/1000);let timestamp=Math.round((new Date().getTime()+8*60*60*1000)/1000);let second=timestamp-create_time;let time=new Array(0,0,0,0,0);if(second>=365*24*3600){time[0]=parseInt(second/(365*24*3600));second%=365*24*3600;}if(second>=24*3600){time[1]=parseInt(second/(24*3600));second%=24*3600;}if(second>=3600){time[2]=parseInt(second/3600);second%=3600;}if(second>=60){time[3]=parseInt(second/60);second%=60;}if(second>0){time[4]=second;}currentTimeHtml='本站已安全运行 '+time[0]+' 年 '+time[1]+' 天 '+time[2]+' 时 '+time[3]+' 分 '+time[4]+' 秒';document.getElementById("running-time").innerHTML=currentTimeHtml;},1000);

注意#running-time与上面的if theme.ICP.enable对齐!
要将2020-01-03 00:00:00改为你网站的起始时间!

其他主题

  • 将以下内容添加到需要显示的位置
<div id="running-time"></div><script>setInterval(()=>{let create_time=Math.round(new Date('2020-01-03 00:00:00').getTime()/1000);let timestamp=Math.round((new Date().getTime()+8*60*60*1000)/1000);let second=timestamp-create_time;let time=new Array(0,0,0,0,0);if(second>=365*24*3600){time[0]=parseInt(second/(365*24*3600));second%=365*24*3600;}if(second>=24*3600){time[1]=parseInt(second/(24*3600));second%=24*3600;}if(second>=3600){time[2]=parseInt(second/3600);second%=3600;}if(second>=60){time[3]=parseInt(second/60);second%=60;}if(second>0){time[4]=second;}currentTimeHtml='本站已安全运行 '+time[0]+' 年 '+time[1]+' 天 '+time[2]+' 时 '+time[3]+' 分 '+time[4]+' 秒';document.getElementById("running-time").innerHTML=currentTimeHtml;},1000);</script>

要将2020-01-03 00:00:00改为你网站的起始时间!

双评论系统

此方法只适用于 Butterfly 主题!

这里以同时使用ValineGitalk, 默认使用Valine为例。
请确认ValineGitalk已开启并正确配置。

  1. 修改themes/Butterfly/layout/includes/comments/index.pug文件,将所有的else if改为if, 并在span= ' ' + _p('comment')下面添加:

    a#switch-comment(href="javascript:void(0);" title="切换为Gitalk" target="_self")  i.fa.fas.fa-toggle-off(aria-hidden="true")

    index.pug

  2. 隐藏一个评论,保留一个默认评论

    • 隐藏valine: 修改themes/Butterfly/layout/includes/comments/valine.pug文件,在#vcomment.vcomment后面添加(style=‘display:none;’)
    • 隐藏gitalk: 修改themes/Butterfly/layout/includes/comments/gitalk.pug文件,在#gitalk-container后面添加(style=‘display:none;’)
    • 隐藏其他评论系统方法与上面类似
  3. themes/Butterfly/source/js/third-party/目录新建switch_comments.js文件,内容如下:

    $('#switch-comment').click(function () {  switchComment()  return false})function switchComment () {  const title = $('#switch-comment').attr('title') === '切换为Gitalk' ? '切换为Valine' : '切换为Gitalk'  const i = $('#switch-comment>i')  if ($('#gitalk-container').css('display') === 'none') {    $('#vcomment').slideUp('normal', () => {      $('#gitalk-container').slideDown('normal', () => {        $('#switch-comment').attr('title', title)        i.hasClass('fa-toggle-off') ? i.removeClass('fa-toggle-off').addClass('fa-toggle-on') : i.removeClass('fa-toggle-on').addClass('fa-toggle-off')      })    })  } else {    $('#gitalk-container').slideUp('normal', () => {      $('#vcomment').slideDown('normal', () => {        $('#switch-comment').attr('title', title)        i.hasClass('fa-toggle-off') ? i.removeClass('fa-toggle-off').addClass('fa-toggle-on') : i.removeClass('fa-toggle-on').addClass('fa-toggle-off')      })    })  }}
  4. 编辑butterfly.yml文件, 以下两个你butterfly.yml文件里有哪个就用那个,不要都用!

    • CDN_USE->js下面添加如下内容:
    - /js/third-party/switch_comments.js
    • inject->bottom下面添加如下内容:
    - <script src="/js/third-party/switch_comments.js"></script>

如果你使用的其他评论系统注意替换上面的切换为Gitalk, 切换为Valine, #gitalk-container, #vcomment
切换图标使用的fontawesome, 兼容V4V5, 如果你是用的其他图标库,请替换fa-toggle-onfa-toggle-off

随机文章跳转

  • 博客根目录/scripts(没有请自行创建)下新建random.js文件,内容如下:

    hexo.extend.generator.register('random', function (locals) {  const config = hexo.config.random || {}  const posts = []  for (const post of locals.posts.data) {    if (post.random !== false) posts.push(post.path)  }  return {    path: config.path || 'random/index.html',    data: `<html><head><script>var posts=${JSON.stringify(posts)};window.open('/'+posts[Math.floor(Math.random() * posts.length)],"_self")</script></head></html>`  }})

    打开/random/就会随机跳转一篇文章

  • 可选配置

    • 可以在_config.yml添加以下配置:

      random:  path: # 随机链接路径,默认"random/index.html"
    • 如果不想随机跳转到某篇文章,只需在这篇文章Front-matter添加random: false

文章统计图表

matery 主题上看到了文章发布统计图标签统计图文章分类统计图,觉得挺好看,就扒下来做了个插件。
因为使用 Tag 会导致文章获取不全,所以本插件直接使用 html 标签渲染,而不是使用 Tag。由于使用了 cheerio 模块,如果你使用了 html 压缩插件,可能会出现压缩报错,暂时无解。

安装

npm install hexo-charts -S

使用

注意!下面的标签可以放到post和不含typepagemd文件中,含有typepage请自行修改相应的模板文件,这个就不要来问我了,因为每个人用的主题可能都不一样,建议去问主题的作者。

文章发布统计图

<div id="posts-chart"></div>

标签统计图

<!-- "data-length"为显示标签个数(从多到少),默认为10 --><div id="tags-chart" data-length="10"></div>

文章分类统计图

<div id="categories-chart"></div>

示例

文章发布统计图
标签统计图
文章分类统计图

Butterfly 主题将图表添加到归档、分类、标签页面

将文章发布统计图添加到归档页面

主题目录/Butterfly/layout/archive.pug文件的#archive下面添加一行#posts-chart, 新添加的比上一行多缩进两个空格。

block content  include ./includes/mixins/article-sort.pug  #archive    #posts-chart

将标签统计图和分类统计图分别添加到标签和分类页面

  • 编辑主题目录/Butterfly/layout/page.pug文件,在.tag-cloud下面添加一行#tags-chart,在.category-content下面添加一行#categories-chart,新添加的比上一行多缩进两个空格。
block content  if page.type === 'tags'    .tag-cloud      #tags-chart
  else if page.type === 'categories'    .category-content      #categories-chart

文章二维码(仅 Butterfly 主题)

  1. 安装hexo-helper-qrcode插件:
npm install hexo-helper-qrcode -S
  1. 编辑主题目录/Butterfly/layout/includes/header/post-info.pug, 在文件最后添加以下内容:
      span.post-qrcode        span.post-meta__separator |        i.fa.fa-qrcode.post-meta__icon.fa-fw(aria-hidden="true")        a(href="javasvript:;" onmouseover='document.getElementById("post-qrcode").style.display="block"' onmouseout='document.getElementById("post-qrcode").style.display="none"')='二维码'        div#post-qrcode.post-qrcode-img          img#post-img(src=qrcode(page.permalink))

注意span.post-qrcode要与上面的span.post-meta-commentcount对齐!

valine 评论添加博主等标签(仅 Butterfly 主题)

以下内容仅适用于 Butterfly 主题 <= V2.3.5,其他主题可以根据本教程和这篇文章自行修改!
Butterfly 主题 >= V4.0 请往下翻!

  1. 下载valine.pug文件,替换themes/Butterfly/layout/includes/comments/valine.pug

  2. 编辑butterfly.yml文件,找到valine配置,添加以下配置项:

  master: # md5加密后的博主邮箱    - f8c7c3961aea2c203160e90cd3b3a26a  friends: # md5加密后的小伙伴邮箱    - 5c2105bbfe6rfc02a6f6ae26dad3819c    - a0adabb31677df92a2405fb18a02ee4d  metaPlaceholder: # 输入框的背景文字    nick: 昵称/QQ号(必填)    mail: 邮箱(必填)    link: 网址(https://)  tagMeta: '博主,小伙伴,访客' # 标签要显示的文字,默认'博主,小伙伴,访客'  verify: false # 评论时是否需要验证,需jQuery支持
  1. 编辑butterfly.yml文件,将CDN中的valine链接改为https://cdn.jsdelivr.net/gh/HCLonely/Valine@latest/dist/Valine.min.js

  2. 改完之后hexo clean一下,不然不会生效


以下内容仅适用于 Butterfly 主题 >= V4.0!

  1. 编辑butterfly.yml文件,找到valine配置,在option下添加以下配置项(注意缩进!):
  option:    master: # md5加密后的博主邮箱      - f8c7c3961aea2c203160e90cd3b3a26a    friends: # md5加密后的小伙伴邮箱      - 5c2105bbfe6rfc02a6f6ae26dad3819c      - a0adabb31677df92a2405fb18a02ee4d    metaPlaceholder: # 输入框的背景文字      nick: 昵称/QQ号(必填)      mail: 邮箱(必填)      link: 网址(https://)    tagMeta:  # 标签要显示的文字,请注意顺序!      - 博主      - 小伙伴      - 访客
  1. 编辑butterfly.yml文件,将CDN中的valine链接改为https://cdn.jsdelivr.net/gh/HCLonely/Valine@latest/dist/Valine.min.js

  2. 改完之后hexo clean一下,不然不会生效

❌