普通视图

发现新文章,点击刷新页面。
昨天以前HCLonely

树莓派搭建私有在线PS网站

作者 HCLonely
2025年6月5日 14:57

厌倦了大型图像编辑软件对电脑性能的压榨?担心在线工具泄露敏感设计?让你的树莓派不在吃灰!只需一台树莓派,你就能拥有完全私有的、功能媲美 Photoshop 的在线编辑利器——Photopea!通过部署Docker项目 photopea,我们将把强大的图像处理能力装进小小的树莓派里。

为什么选择树莓派 + Photopea?

  • 隐私至上: 所有图片处理都在你的本地网络或树莓派上进行,敏感设计稿绝不外流。
  • 离线可用: 无需连接官方服务器,断网也能畅快编辑。
  • 轻量低耗: 树莓派功耗极低,7x24 小时运行也毫无压力,静音环保。
  • 成本低廉: 利用闲置树莓派,无需额外投入高性能电脑或订阅费用。
  • 跨平台访问: 家里任何设备(电脑、平板、手机)的浏览器都能随时使用。
  • 开源自由: 基于开源项目部署,掌控自己的工具。

所需设备:

  1. 树莓派: 推荐树莓派 4B (2GB/4GB/8GB 内存均可) 或树莓派 5,性能更佳。树莓派 3B+ 也可尝试(性能稍弱)。
  2. 操作系统: ubuntu 22.04 (理论上能运行Docker的系统均可)。
  3. 网络: 树莓派接入你的家庭/办公室局域网。
  4. 存储: 一张容量足够的 microSD 卡 (建议 16GB 或以上)。
  5. 电源: 合适的电源适配器。

手把手搭建指南 (基于 Docker)

Docker 让部署变得异常简单。如果你的树莓派还没安装 Docker,请先安装:https://docs.docker.com/engine/install/

核心步骤:一键部署 Photopea

# 运行 Photopea 容器 (将内部 8887 端口映射到树莓派的 8080 端口)sudo docker run -d --name ps-online --restart always -p 8080:8887 ramuses/photopea:latest

访问你的私有 Photopea

  1. 本地测试: 在树莓派本身的浏览器中访问:http://localhost:8080
  2. 局域网访问: 在同一局域网内的其他设备浏览器中,输入你的树莓派 IP 地址 + :8080,例如:http://192.168.1.100:8080

重要提示

  • 性能考虑: Photopea 在浏览器中运行,主要依赖访问设备的 CPU/内存。树莓派本身主要负责提供服务。树莓派 4/5 能流畅服务多个客户端。复杂操作(如超大图、大量滤镜)在客户端设备上可能变慢。
  • 数据存储: 默认部署下,用户上传或处理的图片仅保存在浏览器缓存中。关闭浏览器标签页或清理缓存可能导致未保存的更改丢失!务必养成使用 File > Save As PSD (或导出其他格式) 保存到本地设备的习惯。
  • 首次加载: 镜像较大,首次拉取和启动可能需要几分钟,请耐心等待。

将 Node.js 项目打包为一个可执行文件

作者 HCLonely
2024年3月5日 11:22

简介

Node.js 从v18.16.0,v19.7.0版本开始原生支持了打包为可执行文件(Single executable applications), 常用的打包工具pkg也因此不在更新,下面介绍一下我在使用 NodeJs Single executable applications功能时的一些经验和问题。

使用

创建并打包你的项目文件

因为目前该功能只能将单个 js 文件封装为可执行文件,所以我们要借助打包工具(如 webpack, rollup 等)将 js 项目大包围一个 js 文件。由于 wenpack 的配置过于繁杂,这里介绍使用 rollup 工具进行打包。

  1. 安装 rollup: npm install --global rollup;

  2. 在项目根目录新建rollup.config.js文件,内容如下(根据项目内容进行调整):

    const commonjs  = require('@rollup/plugin-commonjs'); // commonjs支持,使用es模块可不使用此插件,安装:npm install @rollup/plugin-commonjs -Dconst { nodeResolve } = require('@rollup/plugin-node-resolve');const json = require('@rollup/plugin-json'); // 将静态json文件作为模块导入,按需安装,安装:npm install @rollup/plugin-json -Dconst { string } = require('rollup-plugin-string'); // 将静态文件文本作为模块导入,按需安装,安装:npm install @rollup/plugin-json -Dconst terser = require('@rollup/plugin-terser');// 压缩打包后的文件大小,按需安装,安装:npm install @rollup/plugin-json -Dmodule.exports = {  input: 'dist/main.js', // 项目入口文件  output: {    dir: 'output', // 输出文件目录    format: 'cjs' // 输出文件格式  },  plugins: [terser({    format: {      comments: false    }  }), nodeResolve({    preferBuiltins: true,    exportConditions: ['node']  }),  commonjs(),  json(),  string({    include: ['**/*.html', '**/*.yml']  })]};
  3. 打包项目:rollup -c

封装为可执行文件

  1. 在项目根目录新建your-project-config.json文件,内容如下(根据项目需求进行调整,官方说明):

    {  "main": "output/main.js", // 打包后的项目入口文件  "output": "your-project.blob",  "disableExperimentalSEAWarning": true,  "useCodeCache": true,  "disableExperimentalSEAWarning": true, // 禁用Nodejs的试验性更能警告  "useSnapshot": false,  // 使用快照  "useCodeCache": true // 使用代码缓存}
  2. 封装文件:

    • Windows:
    node --experimental-sea-config your-project-config.jsonnode -e "require('fs').copyFileSync(process.execPath, 'your-project.exe')"npx postject your-project.exe NODE_SEA_BLOB your-project.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
    • Linux:
    node --experimental-sea-config your-project-config.jsoncp $(command -v node) your-projectnpx postject your-project.exe NODE_SEA_BLOB your-project.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
  3. 等待封装完成。

哔哩哔哩硬核会员搜题脚本

作者 HCLonely
2023年5月29日 21:11

一个用于哔哩哔哩硬核会员搜题的 Tampermonkey 脚本。

安装

  1. 安装Tampermonkey(建议)或其他脚本管理器;
  2. 点此安装搜题脚本。

使用

  1. 手机哔哩哔哩客户端进入答题;
  2. 浏览器登录哔哩哔哩(已登录可跳过此步骤);;
  3. 浏览器打开调试工具(F12), 将浏览器切换为移动设备(Ctrl+Shift+M);
  4. 在地址栏输入https://www.bilibili.com/h5/senior-newbie/qa并回车,等待网页加载完成;
  5. 启动脚本(Alt+N);
    • 加载题库(需要题目完全匹配):可从本地加载题库(支持txt,doc,docx,xls,xlsx格式),题库中搜索不到则使用搜索引擎搜索
    • 直接运行:使用搜索引擎搜索(支持百度搜狗必应谷歌)
  6. 点击题目即可进行搜索。

注意事项

  1. 使用此脚本时建议关闭其他插件/脚本,避免冲突;
  2. 建议选择文史知识音乐等答案比较好搜索判断的类型。

在静态网站上实现浏览记录功能

作者 HCLonely
2023年2月3日 17:29

在静态网站上实现浏览记录功能,浏览记录保存在用户本地

安装

  1. 下载visit-history.min.js文件;

  2. 在你的网页中插入

    <script src="path/to/visit-history.min.js"></script>

或直接使用CND

<script src="https://cdn.jsdelivr.net/gh/HCLonely/visit-history@1visit-history.min.js"></script>

使用

保存浏览记录

const { visitHistory } = require('visit-history');visitHistory.set({  data: { }, // [必需]保存的数据  identifier: () => window.location.pathname, // [可选]网页的位移标识符, 默认为 () => window.location.pathname  limit: 20 // [可选]最大保存的浏览历史数量,默认为 20});

Example:

const { visitHistory } = require('visit-history');visitHistory.set({  data: {    title: document.querySelector('title').innerText.trim(),    link: window.location.href  },  identifier: () => window.location.href,  limit: 30});

读取浏览记录

const { visitHistory } = require('visit-history');visitHistory.get({  htmlTemplate: '', // [可选]Html模板, 使用'{{key}}'替换data中的变量. 留空则返回保存的data数据, 默认为空  limit: 10 // [可选]读取的浏览记录数量, 留空则返回所有数据, 默认为空});

Example:

const { visitHistory } = require('visit-history');const history = visitHistory.get({  htmlTemplate: '<div class="title><a href="{{link}}">{{title}}</a></div>',  limit: 10});document.querySelector('.history').innerHTML = history.join('');

鸣谢

在线答题搜答案脚本

作者 HCLonely
2022年4月5日 23:12

想必大家都经历过学校/公司要求在网上答题的情况,为了更方面的搜索答案,于是这个脚本就出现了。

安装说明

  1. 安装Tampermonkey或类似浏览器扩展(脚本基于此扩展使用)

  2. 安装此脚本

必读说明

  • 不用时请关闭此脚本!
  • 启用此脚本后刷新网页才会生效!
  • 使用无题库模式时不要将弹出的窗口最大化
  • 支持txt, html, word, excel格式的题库,其他格式自行转换成支持的格式
  • 选择/复制受限时可配合网页限制解除(改)脚本使用

使用说明

  1. 使用前先在Tampermonkey中启用此脚本;

  2. 点击浏览器的Tampermonkey扩展图标,找到此脚本下面的启动启动选项并点击;

  3. 按要求选择模式

    • 题库模式[建议]: 如果你已经有该题目相关题库了就选这个,题库文件支持txt, html, word, excel格式,其他格式的题库请自行转换成支持的格式;
    • 无题库模式: 搜索时会弹出使用百度/搜狗/必应/谷歌的搜索结果,弹出的窗口不要全屏显示;
    • 直接运行: 之前使用题库模式导入过题库,并且题库不需要更新,避免重复导入题库操作;
  4. 选择题目后会弹出按钮,点击此按钮即可搜索;

  5. 用完记得关闭此脚本,否则可能会造成访问其他网页出现BUG;

青年大学习安卓跳过方法

作者 HCLonely
2022年3月3日 19:09

微信版本 <= 8.0.18

  1. 开启 X5 内核: debugmm.qq.com/?forcex5=true 复制这个在微信团队后点开或用微信扫描二维码
    二维码
    出现下图说明开启成功
    x5内核已开启

  2. 安装 X5 内核(以下线上与本地内核二选一)

    • 安装线上内核:http://debugtbs.qq.com 复制这个在微信发送出去后打开下载线上内核,重启即可;
    • 安装本地内核:点此下载 本地内核(不要直接打开),下载完把文件复制到 /sdcard/Android/data/com.tencent.mm/files/tbs 目录(没有这个目录的话新建一个),然后回到 http://debugtbs.qq.com 点击安装本地内核,安装完成后重启微信;
  3. 打开vConsole调试功能:http://debugx5.qq.com 复制这个在微信发送出去后打开,选择顶部信息,下面勾选打开vConsole调试功能
    打开vConsole调试功能

  4. 在大学习界面点击右下角的绿色按钮,在弹出的控制台输入下面的代码(最好等视频加载完开始播放后在执行,太快了可能没反应,没反应的话再输一遍就好了)

    var videoEle = document.getElementsByTagName('video')[0]; // 获取播放器元素videoEle.controls = true; // 显示进度条videoEle.currentTime = videoEle.duration; // 时间拉到最后videoEle.ended = true; // 视频播放结束score = 100; // 成绩__vconsole.style.display = 'none'; // 隐藏右下角绿色按钮

全微信版本(需电脑)

  1. 启用Inspector调试功能:

    • 如果使用 x5 内核,按上述步骤走到第三步,勾选打开TBS内核Inspector调试功能;
    • 如果不使用 x5 内核,debugmm.qq.com/?forcex5=false 复制这个在微信团队后点开或用微信扫描二维码
      二维码
      出现下图说明开启成功
      x5内核已关闭
      然后复制这个在微信发送出去后打开http://debugxweb.qq.com/?inspector=true,等加载完关闭就行
  2. 手机通过数据线连接电脑并启用 USB 调试功能(如何打开?

  3. 下载 Chrome 或 Edge 浏览器,安装ADB扩展,网址打不开可以使用离线安装

  4. 点击ADB扩展图标,点击View Inspaction Targets(如果手机上弹出是否允许调试,点击允许)
    ADB

  5. 在弹出的页面上勾选Discover USB devicesDiscover network targets

  6. 打开大学习页面,等待加载设备,出现如下图所示
    示例

  7. 手机上开始播放视频,电脑上点击inspect,在弹出的窗口右侧一栏点击控制台Console
    控制台

  8. 在控制台输入以下代码:

    var videoEle = document.getElementsByTagName('video')[0]; // 获取播放器元素videoEle.controls = true; // 显示进度条
  9. 手机上拖动进度条跳过

部分微信版本(需root)

此方法需要手机 root, 并安装XPosed框架,这里建议安装LSPosed框架!
具体支持情况点此查看
如果你不了解 Root, XPosed, Lsposed, 刷机等内容,请不要使用此方法!
此方法默认你已安装 XPosed 框架并可用!

  1. 安装Enable WebView Debugging [启用 WebView 调试]模块,可在 XPosed 和 LSPosed 官方仓库找到
  2. 启用此模块,LSPosed 需要勾选微信作用域并重启微信
  3. 按照微信版本<=8.0.18的第四步进行操作

基于 NodeJs 的 live2d 后端 Api 服务器

作者 HCLonely
2021年1月27日 18:18

适用于live2d.user.js,live2d_demo的基于 Nodejs 的后端 Api.

使用方法

  1. 安装NodeJs,Git
  2. 克隆本项目git clone https://github.com/HCLonely/live2dNodeApi.git
  3. 定位到项目目录cd live2dNodeApi
  4. 安装依赖npm i -Scnpm i -S
  5. 启动服务器npm start

命令

命令功能额外说明
npm start启动 api 服务器
npm run update重新生成modelList.json文件用于增加或删除模型后更新模型列表
npm run check检测模型的主配置文件格式及模型文件的完整性
npm run screenshot生成模型的预览图,放在preview文件夹
npm run pre在网页上查看模型的预览图,需要先生成

配置

修改config.json文件进行配置:

{  "port": 2333, // 监听端口,默认2333  "ssl":{    "enable":false, // 是否启用ssl    "privateCrt":"", // ssl证书文件路径    "privateKey":"" // ssl私钥文件路径  }}

模型目录结构

models├─模型文件夹 # 同一角色不同皮肤,不同皮肤共用一个index.json文件│  ├─index.json # 必须,或model.json│  └─...├─模型文件夹 # 同一角色不同皮肤,每个皮肤都有各自的index.json文件│  ├─模型文件夹 # 单个模型│  │  ├─index.json # 必须,或model.json│  │  └─...│  └─模型文件夹 # 单个模型│      ├─index.json # 必须,或model.json│      └─...└─模型文件夹 # 单个模型    ├─index.json # 必须,或model.json    └─...

详情请参考models目录

常见问题

依赖安装慢

npm 安装慢

下载 Chromium 慢

更新模型后顺序乱了

请重命名模型文件夹进行排序,参考models目录。

百度分析和谷歌分析适配 pjax

作者 HCLonely
2020年8月7日 15:41

现在有很多网站使用 pjax, 包括本站也是。本站主题是从 Typecho 的 hansome 主题移植过来的,在移植过程中就遇到了这个问题:
开启 pjax 后百度分析和谷歌分析之统计首次访问的页面,之后的页面都不会统计。
下面来说一下我是如何解决的。

百度分析

pjax:complete添加以下回调:

if(typeof _hmt !== "undefined" && typeof _hmt.push === "function") _hmt.push(['_trackPageview',window.location.pathname]);

谷歌分析

谷歌分析似乎有两种,请根据你引用的 js 库修改:

  • ga: 使用https://www.google-analytics.com/analytics.js
  • gtag: 使用https://www.googletagmanager.com/gtag/js?id=UA-*******

ga

pjax:complete添加以下回调:

if(typeof ga === "function") ga('send', 'pageview', window.location.href);

gtag

pjax:complete添加以下回调(感谢@FGHRSH):

if(typeof gtag === "function") gtag('event', 'pageview', {page_location: window.location.href});

hexo-calendar 活动日历插件

作者 HCLonely
2020年7月28日 19:38

在博客中插入类似 Github contributions 的活动日历。

注意:此插件会和hexo g命令冲突,请使用hexo gehexo generate替代hexo g命令!

前提条件

注意:不满足前提条件的无法使用此插件,在不满足前提条件的情况下安装此插件出现的问题不予以处理,如何实现以下前提条件的问题不予以处理!

  1. Node.js >= 12.0
  2. 使用Git对博客**源码(不是使用 git 部署)**进行管理;
  3. 在博客根目录使用git log -1 --date=iso --pretty=format:"%ad"命令能够输出一个日期;
  4. 如何确定第一项是否符合:
    1. 博客根目录含有.git文件夹,这是一个隐藏文件夹;
    2. 符合上面的第三项。

安装

npm i hexo-calendar -S

or

cnpm i hexo-calendar -S

使用

作为辅助函数在主题模板中使用

<%- calendar({monthLang: 'cn', dayLang: 'cn', title: '活动日历'}) %>

作为标签在 md 文件中使用

注意:这种方法请使用严格的 JSON 格式!

{% calendar %}{"monthLang": "cn", "dayLang": "cn", "title": "活动日历"}{% endcalendar %}

如果你使用了自动部署

如果你使用了Travis CI, Github Action之类的自动部署,那么你需要在推送源码之前使用hexo gc -w=40命令生成一个calendar.json文件。-w=40代表显示 40 周之前至今的活动记录。

选项

名称类型默认值描述
widthString"600"日历宽度,单位:px
heightString"165"日历高度,单位:px
idString"calendar"日历元素 id
monthLangString or Array"en"月份语言,可选:en, cn自定义
dayLangString or Array"en"一周中每一天的语言,可选:en, cn自定义
weeksNumber40显示多少周之前至今的活动记录
titleString"calendar"日历标题
insertScriptBooleantrue是否自动插入echarts库。如果你已全局引入echarts库,请将此项设为false;如果你的站点启用了pjax,请将此项设为false,并全局引用echarts库。

示例

示例

一款基于 webstack 的 hexo 主题

作者 HCLonely
2020年6月5日 11:08

一款基于WebStackPage的 Hexo 主题。Demo

screenshot

安装

git clone https://github.com/HCLonely/hexo-theme-webstack themes/webstack

配置

favicon

网站图标

示例:

favicon: /favicon.ico

banner

[可选]分享网站到 twitter 和 facebook 时的图片。

示例:

banner: /images/webstack_banner_cn.png

logo

网站 logo

  • expanded: 侧边栏展开时左上角的 logo
    expanded
  • collapsed: 侧边栏收起时左上角的 logo
    collapsed
  • dark: 顶栏为暗色时左上角的 logo, 仅 about 页面生效
    dark

示例:

logo:  expanded: /images/logo@2x.png  collapsed: /images/logo-collapsed@2x.png  dark: /images/logo_dark@2x.png

flag

语言标识,多语言请配合子页面使用

  • icon: 语言图标,默认仅有flag-cnflag-us, 其他图标自行寻找存放于主题目录/source/images/flags/
  • name: 语言名称
  • default: 该语言是否为默认语言
  • index: 页面链接

示例:

flag:  - name: Chinese    default: true    icon: flag-cn    index: /index.html

flag

search

是否显示搜索框

示例:

search: true

userDefinedSearchData

自定义搜索引擎

  • custom: 是否启用自定义配置
  • thisSearch: 当前搜索引擎的搜索链接
  • thisSearchIcon: 当前搜索引擎的图标链接,格式为url(图片链接)
  • hotStatus: 是否启用搜热词功能
  • data: 多搜索引擎配置
    • name: 搜索引擎名字
      img: 搜索引擎的搜索链接
      url: 搜索引擎的图标链接,格式为url(图片链接)

示例:

userDefinedSearchData:  custom: true  thisSearch: https://www.baidu.com/s?wd=  thisSearchIcon: url(https://www.baidu.com/favicon.ico)  hotStatus: true  data:    - name: 百度      img: url(https://www.baidu.com/favicon.ico)      url: https://www.baidu.com/s?wd=    - name: 谷歌      img: url(https://www.google.com/favicon.ico)      url: https://www.google.com/search?q=

githubCorner

右上角的 github corner

示例:

githubCorner: '<a href="https://github.com/HCLonely/hexo-theme-webstack" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>'

github

since

建站年份,显示在页面底部

示例:

since: 2020

since

menu

[主要]侧边栏菜单设置

  • name: 分组名
  • icon: 分组图标
  • config: [主要]分组内容(详细设置查看Config),如果有二级菜单则不需要此项!
  • submenu: 二级菜单,如果有二级菜单则不需要config, 此选项内容包含name, icon, config选项

示例:

menu:  - name: 常用工具    icon: far fa-star    config: hotTools  - name: 其他工具    icon: fas fa-tools    submenu:      - name: 开发工具        icon: fas fa-tools        config: devTools      - name: 我的博客        icon: fas fa-blog        config: myBlog

menu

expandAll

是否将侧边栏全部展开

示例:

expandAll: true

about

侧边栏的关于本站

  • url: 关于页面链接
  • name: 在侧边栏显示的文字
  • icon: 图标

示例:

about:  url: /about/  icon: far fa-heart  name: 关于本站

about

aboutPage

关于页面设置

  1. 生成关于页面
hexo new page about
  1. 编辑source/about/index.md, 添加type: 'about'
---title: aboutdate: 2020-06-04 18:11:54type: 'about'---
  1. 编辑主题配置文件的aboutPage
  • website: 关于本站内容
    • head: 标题
    • html: 内容,支持html语法
  • webmaster: 关于站长内容
    • head: 标题
    • name: 站长名字
    • url: 链接
    • img: 头像
    • description: 描述
    • html: 其他内容,支持html语法

示例:

aboutPage:  website:    head: 关于本站    html: '<blockquote><p>本站是hexo主题<a href="https://github.com/HCLonely/hexo-theme-webstack">hexo-theme-webstack</a>的demo站。</p></blockquote>'  webmaster:    head: 关于站长    name: HCLonely    url: https://blog.hclonely.com/    img: /images/logos/myblog.png    description: 懒人一个    html: '<br /><blockquote><p>本站是<a href="https://github.com/HCLonely">HCLonely</a>基于<a href="https://github.com/WebStackPage/WebStackPage.github.io">WebStackPage</a>项目做的一款<a href="https://hexo.io/">Hexo</a>主题。</p></blockquote>'

aboutPage

busuanzi

不蒜子统计

  • enable: 是否启用不蒜子统计
  • position: 访问量显示位置, footer显示在页脚, sidebar显示在侧边栏
  • pv: 访问量显示的内容, $pv会被替换为访问量
  • uv: 访客数显示的内容, $uv会被替换为访客数

示例:

busuanzi:  enable: true  position: sidebar  pv: 本站总访问量$pv  uv: 本站总访客数$uv

sidebar
footer

custom

自定义html内容

  • head: 插入到<head></head>标签内的内容
  • body: 插入到</body>标签之前的内容

示例:

custom:  head: |- # 以下内容插入到<head></head>标签内,可设置多行,注意每行开头至少四个空格    <link rel="stylesheet" type="text/css" href="custom.css">    <script src="custom.js"></script>  body: |- # 以下内容插入到</body>标签之前,可设置多行,注意每行开头至少四个空格    <div>custom text</div>    <script src="custom.js"></script>

config

[主要]网站内容设置

参数

  • name: 网站名称
  • url: 网站链接
  • img: 网站图标
  • description: 网站描述

示例:

- name: HCLonely Blog  url: https://blog.hclonely.com/  img: /images/logos/myBlog.png  description: 一个懒人的博客。

关联设置名称并添加网站

menusubmenu中设置的config的内容为此选项的名称。

menu

menu:  - name: 常用工具    icon: far fa-star    config: hotTools

常用工具分组里的网站有以下两种添加方式:

  • 在主题的_config.yml里添加:
hotTools:  - name: HCLonely Blog    url: https://blog.hclonely.com/    img: /images/logos/myBlog.png    description: 一个懒人的博客。  - name: Github    url: https://github.com/    img: /images/logos/github.png    description: 面向开源及私有软件项目的托管平台。
  • 站点根目录/source/_data/(没有自行创建)内新建hotTools.yml文件,文件内容如下:
- name: HCLonely Blog  url: https://blog.hclonely.com/  img: /images/logos/myBlog.png  description: 一个懒人的博客。- name: Github  url: https://github.com/  img: /images/logos/github.png  description: 面向开源及私有软件项目的托管平台。

以上两种方式任选一种即可,建议使用第二种。

子页面配置

创建子页面

使用hexo new page xxx创建子页面,这里包括下面的说明都以hexo new page child为例。

修改子页面配置文件

使用上面的命令生成子页面后,打开根目录/source/child/index.md文件(子页面配置文件),在两个---之间添加一行type: 'child'使此配置文件生效,子页面默认使用主页的配置,子页面优先使用子页面配置文件两个---之间的配置,各配置项和主页的配置功能相同。

示例请看https://github.com/HCLonely/hexo-theme-webstack/tree/gh-pages/source/child/index.md

由于子页面在很久之前就基本做完了,后来比较忙就鸽了,可能有些配置或 bug 给忘了,有问题请及时反馈!

使用 cron-job 解决 LeanCloud 因流控原因自动唤醒失败的问题

作者 HCLonely
2020年5月17日 22:10

Valine-admin 由于 Leancloud 流控原因,自动唤醒任务可能会失败,详情:https://forum.leancloud.cn/t/topic/22595

所以这里介绍一个使用第三方计划任务网站进行定时唤醒 Valine-admin 的方法。

注册cron-job帐号

注册地址:https://cron-job.org/en/signup/

注册时的时区请选择Asia/Shanghai

注册

添加一个计划任务

  1. 登陆之后依次点击Members,cronjobs,Create cronjob

    First

  2. Title, Address

    • Title可以随便填一个
    • Address填写你的云引擎环境变量的ADMIN_URL,也就是 Leancloud 的Web 主机域名。如果你用的我Valine 添加博主标签及评论微信、QQ 通知文章里的最新版的仓库,还需要在后面加上/start,当然也可以不加,加上会有唤醒日志。
  3. Schedule

    • 选择User-defined进行自定义设置
    • Days of month: 全选
    • Days of week: 全选
    • Months: 全选
    • Hours: 你需要在哪个时间段唤醒就选择什么
    • Minutes: 选择0,20,40
    • 按住Ctrl可多选
  4. Notifications

    • 可以不用修改,也可以根据自己的需要修改
  5. Common

    • 勾选Save responses, 保存唤醒日志
  6. 点击Create cronjob

Valine 添加验证码、博主标签及评论微信、QQ 通知

作者 HCLonely
2020年4月23日 19:01

本教程介绍了如何给 Valine 评论系统添加博主小伙伴访客标签,添加浏览器操作系统图标,以及评论微信QQ通知。

建议有一定 JS 基础的用户根据本教程进行自定义修改,至少能够自己找到为什么会报错,否则不建议修改!

添加标签及图标

基于https://github.com/xCss/Valine修改。

由于 1.4.0 以后 Valine 作者不再发布源码,所以这里不说如何修改了,只放出我修改好的 js 链接及使用方法。

参数如何添加请查看 Demo 站源码的butterfly.yml 文件valine.pug 文件

链接

https://cdn.jsdelivr.net/gh/HCLonely/Valine@latest/dist/Valine.min.js

与原版相比

  • 添加博主小伙伴访客标签
  • 添加浏览器操作系统图标,需fontawesomeV5支持
  • 邮箱检测更严格
  • meta placeholder可自定义

使用方法

基本方法同原版相同,请先查看原版使用文档并配置好。

Butterfly 主题可以根据这篇文章修改,其他主题请自行修改!

本版比原版多了以下参数:

参数类型说明默认示例
tagMetaArray标签要显示的文字[“博主”,“小伙伴”,“访客”][“博主”,“小伙伴”,“访客”]
masterArray/Stringmd5 加密后的博主邮箱[][“fe01ce2a7fbac8fafaed7c982a04e229”]
friendsArraymd5 加密后的小伙伴邮箱[][“fe01ce2a7fbac8fafaed7c982a04e229”]
metaPlaceholderObjectmeta placeholder 内容{}{“nick”:“昵称/QQ 号”,“mail”:“邮箱(必填)”}

示例

博主
小伙伴
访客

评论微信通知及 QQ 通知

基于https://github.com/DesertsP/Valine-Admin修改。

修改方法不在多说,直接使用我的源码即可,如果你有一定的 NodeJS 知识,可以参考我的源码自行修改。

注意!由于 leancloud 的原因,自动唤醒任务可能会失败!

详情:https://forum.leancloud.cn/t/topic/22595

解决办法: https://blog.hclonely.com/posts/ac04080d/

仓库地址

https://github.com/HCLonely/Valine-Admin.git

与原版相比

  • 添加微信提醒功能
  • 添加 QQ 提醒功能
  • 添加禁止邮件提醒功能

使用方法

基本方法同原版相同,请先查看原版使用文档并配置好。

本版比原版多了以下参数:

变量示例说明
SERVER_KEYSCUxxxxxxxx[可选]Server酱 SCKEY 用于微信通知
SERVER_TURBO_KEYSCTxxxxxxxx[可选]Server酱·Turbo版 SendKey 用于微信通知
SERVER_TURBO_MDtrue[可选]使用Server酱·Turbo版通知时是否使用 MD 模板,默认为false
QMSG_KEYxxxxxxxx[可选]Qmsg key 用于 QQ 通知
QQ_SHAKE(已失效)true[可选]QQ 通知时发送戳一戳
DISABLE_EMAILtrue[可选]禁止邮件通知博主,@仍然会提醒
TEMPLATE_NAMErainbow[可选]rainbowdefault邮件通知模板

邮件通知模板(模板变量与原版不同)

邮件通知模板在云引擎环境变量中设定,可自定义通知邮件标题及内容模板。

环境变量示例说明
MAIL_SUBJECT${PARENT_NICK},您在${SITE_NAME}上的评论收到了回复[可选]@通知邮件主题(标题)模板
MAIL_TEMPLATE见下文[可选]@通知邮件内容模板
MAIL_SUBJECT_ADMIN${SITE_NAME}上有新评论了[可选]博主邮件通知主题模板
MAIL_TEMPLATE_ADMIN见下文[可选]博主邮件通知内容模板

邮件通知包含两种,分别是被@通知和博主通知,这两种模板都可以完全自定义。默认使用经典的蓝色风格模板(样式来源未知)。

默认被@通知邮件内容模板如下:

<html> <head></head> <body> <table style="width: 99.8%;height:99.8% "> <tbody> <tr> <td> <div style="border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);"> <div style="width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;"> <p style="font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;">您在<a style="text-decoration:none;color: #ffffff;" href="<%=siteUrl%>"> <%=siteName%> </a>上的留言有新回复啦! </p> </div> <div style="margin:40px auto;width:90%"> <p><%=pname%> 同学,您曾在文章上发表评论:</p> <div style="background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;"><%-ptext%></div> <p><%=name%> 给您的回复如下:</p> <div style="background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;"><%-text%></div> <p>您可以点击 <a style="text-decoration:none; color:#12addb" href="<%=url%>">查看回复的完整內容 </a>,欢迎再次光临 <a style="text-decoration:none; color:#12addb" href="<%=siteUrl%>"> <%=siteName%> </a></p> <style type="text/css">a:link{text-decoration:none}a:visited{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}</style> </div> </div> </td> </tr> </tbody> </table> </body> </html>

@通知模板中的可用变量如下(注,这是邮件模板变量,请勿与云引擎环境变量混淆):

模板变量说明
<%=siteName%>博客名称
<%=siteUrl%>博客首页地址
<%=url%>文章地址(完整路径)
<%=pname%>收件人昵称(被@者,父级评论人)
<%-ptext%>父级评论内容
<%=name%>新评论者昵称
<%-text%>新评论内容

默认博主通知邮件内容模板如下:

<html> <head> <style> .wrap span { display: inline-block; } .w260{ width: 260px;} .w20{ width: 20px;} .wauto{ width: auto;} </style> </head> <body> <table style="width: 99.8%;height:99.8% "> <tbody> <tr> <td> <div style="border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);"> <div style="width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;"> <p style="font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;">您的<a style="text-decoration:none;color: #ffffff;" href="<%=siteUrl%>"> <%=siteName%> </a>上有新的评论啦! </p> </div> <div style="margin:40px auto;width:90%"> <p><%=name%> 发表评论:</p> <div style="background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;"><%-text%></div> <p><a style="text-decoration:none; color:#12addb" href="<%=url%>" target="_blank">[查看评论]</a></p> <style type="text/css">a:link{text-decoration:none}a:visited{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}</style> </div> </div> </td> </tr> </tbody> </table> </body> </html>

博主通知邮件模板中的可用变量与@通知中的基本一致,<%=pname%><%-ptext%>变量不再可用。

示例

微信
QQ

使用 Cloud Studio 在线搭建、编辑、部署 Hexo

作者 HCLonely
2020年4月3日 17:02

创建工作空间

  1. 前往Coding注册一个帐号

  2. 登录后点击右上角的Cloud Studio

    Cloud Studio

  3. 点击设置,将 ssh 公钥添加到CodingGithub或者其他的 Git 仓库的个人公钥列表

    SSH

  4. 点击工作空间,新建工作空间

    工作空间

从零开始搭建 Hexo

  1. 工作空间名称能自己看懂就行,运行环境选择预置环境Node.js代码来源,然后创建

    从零开始

  2. 点击刚刚创建的工作空间

  3. 按下键盘Ctrl+~打开终端

  4. 按照官方教程依次输入以下命令就可以了

    npm install hexo-cli -ghexo init blogcd blognpm install
  5. 到这里一个博客就基本搭建完成了,其他的去看Hexo 官方文档就可以了

已经搭建好了 Hexo

  1. 工作空间名称能自己看懂就行,运行环境选择预置环境Node.js代码来源仓库,并在下面输入你源码仓库的SSH地址,然后创建

    我已经搭建好了

  2. 点击刚刚创建的工作空间,它会自动克隆你的源码,你只需要运行npm install命令安装所需依赖就可以了

预览

我们在本地只需运行hexo server就可以在http://localhost:4000预览了,不过用Cloud Studio的话运行hexo server命令后,需要Ctrl+Shift+P打开命令面板,输入preview,选择Preview: Open Preview Tab输入端口号(默认 4000)回车就可以了

插件(可选)

如果你用过 Vscode, 下面可以不用看了,安装你喜欢的插件就可以了

点击左边的Extensions可以安装扩展,这里推荐几个适用于编辑 Hexo 的插件

JavaScript 支持

欢迎使用页面点击安装对JavaScript的支持,右下角会有弹窗,确定即可

Extensions

Markdown Preview Enhanced

Markdown 预览插件

给你的网页添加一个 moc3 格式的 Live2d 模型

作者 HCLonely
2020年3月26日 11:34

前言

之前搞网页 Live2d 模型的时候在网上找了很多文章,但大部分都只支持moc格式的模型,不支持moc3格式的模型。

如果你的模型是moc格式,请参考给网页添加一个 Live2D 看板娘(前端)

最近在Github上看到这个项目AzurLaneL2DViewer, 根据这个项目做成了 JS 库。

使用前请查看live2dcubismcore许可协议

使用方法

  1. <body>标签内添加如下内容:

    <!-- 用于存放Live2d的元素,可自定义 --><div class="Canvas" style="position: fixed; right: 10px; bottom: 10px;z-index: 99999999" id="L2dCanvas"></div>
  2. </body>之前添加以下内容:

    <!------ 位置可自定义 ------><div class="Canvas" style="position: fixed; right: 10px; bottom: 10px;z-index: 99999999" id="L2dCanvas"></div><!------ 依赖 JS ------><!---- 可选 ----><!-- 兼容低版本浏览器 --><script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"> </script><!-- 音频播放兼容 --><script src="https://cdn.jsdelivr.net/npm/howler@2.1.3/dist/howler.min.js"></script><!---- 必需 ----><script src="https://cubism.live2d.com/sdk-web/cubismcore/live2dcubismcore.min.js"></script><script src="https://cdn.jsdelivr.net/npm/pixi.js@4.6.1/dist/pixi.min.js"></script><!-- live2dv3.js --><script src="https://cdn.jsdelivr.net/npm/live2dv3@1.2.2/live2dv3.min.js"></script><!------ 加载Live2d模型 ------><script>window.onload = () => {    new l2dViewer({        el: document.getElementById('L2dCanvas'), // 要添加Live2d的元素, 支持dom选择器和jq选择器        basePath: 'https://cdn.jsdelivr.net/gh/HCLonely/Live2dV3/assets', // 模型根目录        modelName: 'biaoqiang_3', // 模型名称        sounds: [ // 触摸播放声音            'sounds/demo.mp3', // 相对路径是相对于模型文件夹            'https://cdn.jsdelivr.net/npm/live2dv3@latest/assets/biaoqiang_3/sounds/demo.mp3' // 也可以是网址        ]    })}</script>

参数

参数类型描述默认
el[必需] DOM 对象或 jQuery 对象要挂载 Live2d 模型的元素, 支持 DOM 选择器和 jQuery 选择器,例:document.getElementById('L2dCanvas')document.querySelector('#L2dCanvas')$('#L2dCanvas')null
basePath[必需] String模型根目录null
modelName[必需] String模型目录null
width[可选] NumberCanvas 宽度,单位: px500
height[可选] NumberCanvas 高度,单位: px300
sizeLimit[可选] Boolean当窗口大小小于设置的宽或高时不加载模型false
mobileLimit[可选] Boolean移动端不加载模型false
sounds[可选] Array触摸播放声音, 留空则不播放null

方法

loadModel(modelName?)

重新加载/更换模型

Demo

https://live2dv3demo.hclonely.com/

Hexo-tag-steamgame 插件

作者 HCLonely
2020年3月5日 20:18

GitHub starsGitHub language countGitHub top languageGitHub repo sizeGitHub code size in bytesnpm bundle sizenpmGitHub issuesGitHub commit activityGitHub last commitnpmNPM

用于在 Hexo 博客中嵌入 steam 游戏。

安装

npm install hexo-tag-steamgame --save

使用方法

  • 嵌入单个游戏
{% steamgame appid description %}```* 批量嵌入游戏```Nunjucks{% steamgames %}appidappidappidappidappidappid{% endsteamgames %}

参数

appid: Steam 游戏 id.description(可选): 用于替换默认游戏简介。

Demo

{% steamgame 1057090 %}```{% steamgame 1057090 %}```Nunjucks{% steamgame 1057090 "I like it." %}```{% steamgame 1057090 "I like it." %}```Nunjucks{% steamgames %}2615701057090{% endsteamgames %}

License

MIT

Hexo-online-server 在线编辑发布文章插件

作者 HCLonely
2020年2月26日 22:46

本项目不再维护,在线编辑建议使用code-server!

本插件已实现以下功能:

  • 在线新建,编辑,删除 post 和 page(默认路径)
  • hexo clean,hexo server,hexo deploy
  • 源码同步

需求

  • Node.js >= 10.0
  • Hexo 4.X(只测试了 4.X)
  • Git
  • mac 系统close server功能无法使用(我没有 mac 设备,无法测试)

准备工作

  • 源码托管到 Git 仓库(建议使用私人仓库, 只在本地使用可无视)
  • 配置好 git, 确认可以使用以下默认命令进行同步:
    • git pull
    • git add --all .
    • git commit -m "..."
    • git push

使用

安装

npm install hexo-online-server

配置

  1. 新建config.json文件, 内容如下(注释删掉):

    {    "indexPath":"/",// 自定义主页路径, 以"/"结尾    "port": 4001,// http监听端口    "wsPort": 4002,//websocke监听端口    "secret":"",//用来签名session ID cookie,https://www.npmjs.com/package/express-session#secret    "user":"",//登录用户名    "passwordHash": "",//密码加密后的字符串    "autoSave": 300000,//编辑文章时自动保存时间, 单位:ms, 0为不自动保存    "noticeUrl":"",//当有用户登录时向`此链接+message`发送get请求,留空则不通知    "pull":["git pull"],//从git同步命令    "push":["git add --all .","git commit -m 'Update at {time}'","git push"],//同步到git命令    "ssl":false,//是否启用SSL    "private":{//启用ssl需配置此项        "key":"",//SSL证书key路径        "crt":""//SSL证书路径    }}

    注意把后面的注释删掉!

  2. config.json文件保存到你的博客目录以外的地方, 在_config.yml中添加:

    onlineConfigPath: '../config.json' #`config.json`文件路径
  3. 使用以下命令获取加密密码, 将得到的passwordHash添加到config.json文件:

    > hexo bcrypt 你的密码
  4. 运行hexo online, 浏览器打开http://localhost:4001/

常见问题

源码同步

  • 如果你只在本地或只在服务器使用,可以选择不进行同步,
  • 如果你本地和服务器都使用,每次编辑前请从git同步,编辑完成后同步到git

部署

如果你使用的自动部署,直接将源码同步到 git 仓库即可,不用hexo deploy

LICENSE

MIT

Hexo 博客美化

作者 HCLonely
2020年2月18日 14:37

注意,本文方法主要用于 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一下,不然不会生效

实用 npm 包

作者 HCLonely
2020年2月15日 14:15

为了避免每次找模块时都要百度,这里记一下我比较常用的模块及其简单的使用。

cheerio

cheerio是 jquery 核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对 DOM 进行操作的地方。

安装

npm install cheerio

使用

const cheerio = require('cheerio'),$ = cheerio.load('<html><body>Hello, <b>world</b>!</body></html>');

axios-https-proxy-fix

axios-https-proxy-fix是修复axios代理 https 失败的分支版本。

安装

npm install axios-https-proxy-fix

使用

中文文档

moment

moment 是一个 JavaScript 日期处理类库,用于解析、检验、操作、以及显示日期。

安装

npm install moment

使用

const moment  = require('moment '),moment().format('YYYY-MM-DD HH:mm:ss');

Lodash

Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。

安装

npm install lodash

使用

中文文档

ali-oss

ali-oss 是使用 NodeJs 操作阿里云 OSS 官方模块。

安装

npm install ali-oss

使用

中文文档

Puppeteer

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。

安装

npm i puppeteer

使用

中文文档

nrm

nrm(npm registry manager )是 npm 的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换。

安装

npm install -g nrm

使用

查看可选的源

> nrm ls* npm -------- https://registry.npmjs.org/  yarn ------- https://registry.yarnpkg.com/  cnpm ------- http://r.cnpmjs.org/  taobao ----- https://registry.npm.taobao.org/  nj --------- https://registry.nodejitsu.com/  npmMirror -- https://skimdb.npmjs.com/registry/  edunpm ----- http://registry.enpmjs.org/

切换到 taobao 源

> nrm use taobao  Registry has been set to: https://registry.npm.taobao.org/
❌
❌