hexo同步
hexo同步
以下操作在你的第二个平台上进行,并确定已安装 node.js & npm。
在你想要同步博客的文件夹下执行
1 | git clone <远端博客仓库地址> |
执行hexo指令
1 | hexo clean && proxy4 hexo d -g |
以下操作在你的第二个平台上进行,并确定已安装 node.js & npm。
在你想要同步博客的文件夹下执行
1 | git clone <远端博客仓库地址> |
执行hexo指令
1 | hexo clean && proxy4 hexo d -g |
swimminghao.netlify.app
因为本人比较喜欢简介风格的,所以整个界面都是简约风格的,一个好的博客,应该让人一眼就能看清楚技术分类,文章也应该就是文章,让人能够最好的阅读你的博客 这才是我们应该做的,所以没有太多花里胡哨的东西。
使用工具:
Git
Github
visual studio code
Chrome
软件版本
HEXO: 6.0.6
Hero-theme-next: 8.10.0
1 | npm install -g hexo-cli |
进入命令行,下载 NexT 主题,输入:
1 | git clone https://github.com/next-theme/hexo-theme-next/ themes/next |
修改站点配置文件_config.yml,找到如下代码:
1 | ## Themes: https://hexo.io/themes/ |
将 landscape 修改为 next 即可。
在 Hexo 中有两份主要的配置文件,其名称都是 _config.yml。 其中,一份位于站点根目录下,主要包含 Hexo 本身的站点配置;另一份位于主题目录下,这份配置由主题作者提供,主要用于配置主题相关的选项。
为了描述方便,在以下说明中,将前者称为 **站点配置文件**, 后者称为 **主题配置文件**。
1 | /hexo/_config.yml |
打开站点配置文件,搜索 language,找到如下代码:
1 | author: authorName |
打开 主题配置文件,搜索 menu,找到如下代码:
1 | menu: |
把 tags 和 categories 前面的 # 删除,
next 主题自带四种样式。
在主题配置文件/next/_config.yml中查找:scheme,找到如下代码:
1 | # Schemes |
打开 themes/next/layout/_partials/footer.njk
找到:
1 | {\%- if theme.footer.powered %} |
把这段代码首尾分别加上:<!-- 和-->,或者直接删除。
参考: Hexo NexT 主题美化记录
打开themes\next\source\css\_common\components\post\index.styl文件,将post-block更改为如下代码:
1 | if (hexo-config('motion.transition.post_block')) { |
themes/next/layout/_partials/footer.njk文件,在如下图位置加入代码:1 | {\%- if config.symbols_count_time.total_symbols or config.symbols_count_time.total_time %} |
倒计时代码:
1 | <span id="sitetime"></span> |
themes\next\source\css\main.styl文件中给倒计时添加样式不生效
1 | #sitetime { |
打开 themes/next/_config.yml,搜索关键字 scrollpercent,把 false 改为 true。
效果图:
安装插件hexo-generator-searchdb,执行以下命令:
1 | npm install hexo-generator-searchdb --save |
修改hexo/_config.yml站点配置文件,新增以下内容到任意位置:
1 | search: |
编辑 主题配置文件,启用本地搜索功能:
1 | # Local search |
效果图:
在 EasyIcon 中找一张(32 * 32)的 ico 图标,或者去别的网站下载或者制作,并将图标名称改为 favicon.ico,然后把图标放在 /themes/next/source/images 里,并且修改主题配置文件:
1 | Put your favicon.ico into `hexo-site/source/` directory. |
修改模板/themes/next/layout/_macro/post.swig
搜索 rel="tag">{{ tag_indicate }},将 {{ tag_indicate }} 换成<i class="fa fa-tag"></i>
效果图:
打开themes/next/_config.yml 搜索关键字needmoreshare2 修改为下面设置
用npm卸载掉hexo-next-share,搜索所有hexo-next-share文件夹删除干净,然后切换到网站文件夹下,运行npm install theme-next/hexo-next-share --save,将以下代码都复制进主题配置文件里
1 | # NeedMoreShare2 |
效果图:postbottom为文章末尾分享 float则是在页面侧端分享
参考链接: hexo文章加密访问
安装字数统计插件 npm i hexo-symbols-count-time
在hexo的_config.yml下找到# Extensions在下面配置插件配置如下
1 | # 字数统计插件 npm i hexo-symbols-count-time |
移除默认安装的插件:
npm uninstall hexo-generator-index --save
安装新插件:
npm install hexo-generator-index-pin-top --save
最后编辑有这需求的相关文章时,在Front-matter(文件最上方以—分隔的区域)加上一行:
1 | top: true |
如果你置顶了多篇,怎么控制顺序呢?设置top的值(大的在前面),比如:
1 | # Post a.md |
文章 b 便会显示在文章 a 的前面
设置置顶图标
打开/themes/next/layout/_macro/post.swig文件,在<div class="post-meta-container">下方,插入如下代码:
1 | {\% if post.top %} |

修改themes/next/source/css/_common/components/post/index.styl文件,加入自定义样式
1 | // [Read More]按钮样式 |
效果图:
打开 themes/next/_config.yml,搜索关键字 auto_excerpt, 修改length即可修改阅读全文前显示文字数量
1 | auto_excerpt: |
或者在文章中任意位置添加<!-- more -->
建议在文章中加入 <!-- more -->
自定义 [Read More] 按钮之前要显示的内容!
打开themes/next/source/css/_common/components/post/index.styl添加以下代码:
1 | .post-body p a{ |
效果图:
修改next主题配置文件,修改成以下代码:
1 | # Sidebar Avatar |
效果图:
hexo主站source 目录下创建 _data/sidebar.njk 文件,加入如下内容:
1 | {# recent posts #} |
并修改theme主题配置文件,取消sidebar的注释:
1 | custom_file_path: |
编辑themes/next/source/css/_common/outline/sidebar/sidebar-blogroll.styl文件,标题溢出隐藏
1 | .links-of-blogroll-list { |
在 themes/next/_config.yml中修改成下方代码
1 | # 近期文章设置 |
效果图:
在目录themes/next/layout/_macro/下添加passage-end-tag.swig,内容如下:
1 | <div> |
打开themes/next/layout/_macro/post.swig文件,新增内容如下:
```HTML
//以下为新增代码
1 |
|
live2d与busuanzi组件有bug冲突,安装了live2d,busuanzi就失效,所以我没有使用。
npm install -save hexo-helper-live2d
然后在在 hexo 的 _config.yml中添加参数:
1 | live2d: |
可供选择模型:
live2d-widget-model-chitoselive2d-widget-model-epsilon2_1live2d-widget-model-gflive2d-widget-model-haru/01 (use npm install --save live2d-widget-model-haru)live2d-widget-model-haru/02 (use npm install --save live2d-widget-model-haru)live2d-widget-model-harutolive2d-widget-model-hibikilive2d-widget-model-hijikilive2d-widget-model-izumilive2d-widget-model-koharulive2d-widget-model-mikulive2d-widget-model-ni-jlive2d-widget-model-nicolive2d-widget-model-nietzschelive2d-widget-model-nipsilonlive2d-widget-model-nitolive2d-widget-model-shizukulive2d-widget-model-tororolive2d-widget-model-tsumikilive2d-widget-model-unitychanlive2d-widget-model-wankolive2d-widget-model-z16在站点目录下建文件夹live2d_models,
再在live2d_models下建文件夹<你喜欢的模型名字>,
再在<你喜欢的模型名字>下建json文件:<你喜欢的模型名字>.model.json
安装模型。在命令行(即Git Bash)运行以下命令即可:
1 | npm install --save live2d-widget-model-<你喜欢的模型名字> |
复制你喜欢的模型名字:
Next6 中自带了复制代码按钮,Next5 需要自己手动配置。
搜索 codeblock,找到如下配置:
1 | codeblock: |
由于网页不可能一直都秒进,总会等待一段时间的,所以可以设置顶部加载条。Next 已经集成了很多加载特效,可以在下面选项中在线调试测试一下。
next主题配置文件搜索pace,找到如下代码:
1 | # Progress bar in the top during page loading. |
在做次优化之前,hexo-next文章链接默认的生成规则是::year/:month/:day/:title,是按照年、月、日、标题来生成的。
比如:https://zxiaoxuan.github.io/2019/08/12/hello-world/ 这样,如果文章标题是中文的话,URL链接是也会是中文,
那么要生存简洁且唯一的URL,怎么办呢
安装插件
1 | npm install hexo-abbrlink --save |
执行此命令可能会不成功,提示你缺少相应的依赖,比如babel-eslint、mini-css-extract-plugin、webpack-cli…
使用npm命令安装即可,比如npm install eslint@4.x babel-eslint@8 –save-dev
修改根目录站点配置文件config.yml,改为:
1 | permalink: posts/:abbrlink/ |
生成的链接将会是这样的(官方样例):
四种可供选择
1 | crc16 & hex |
生成完后,原md文件的Front-matter 内会增加abbrlink 字段,值为生成的ID 。这个字段确保了在我们修改了Front-matter 内的博客标题title或创建日期date字段之后而不会改变链接地址。
内容板块透明
博客根目录 themes\next\source\css\_schemes\Pisces\_layout.styl文件 .content-wrap 标签下 background: white修改为:
1 | background: rgba(255,255,255,0.7); //0.7是透明度 |
菜单栏背景
博客根目录 themes\next\source\css\_schemes\Pisces\_layout.styl文件.header-inner标签下 background: white修改为:
1 | background: rgba(255,255,255,0.7); //0.7是透明度 |
站点概况背景
博客根目录themes\next\source\css\_schemes\Pisces\_sidebar.styl 文件.sidebar-inner 标签下 background: white修改为:
1 | background: rgba(255,255,255,0.7); //0.7是透明度 |
然后修改博客根目录themes\next\source\css\_schemes\Pisces\_layout.styl文件.sidebar 标签下 background: $body-bg-color修改为:
1 | background: rgba(255,255,255,0.7); //0.7是透明度 |
按钮背景
博客根目录themes\next\source\css\_common\components\post\post-button.styl 同上修改对应位置为 background: transparent;
打开themes/next/layout/page.swig
修改这里可以修改标签页的标签显示
在这里添加东西会在标签页面上显示
在/themes/next/layout/目录下,新增tag-color.swig文件,加入下方代码:
1 | <script type="text/javascript"> |
在/themes/next/layout/page.swig/中引入tag-color.swig:
在下方加上 {\% include 'tag-color.swig' %} 代码
1 | <div class="tag-cloud"> |
或者将上方代码直接添加到下方

在路径:/themes/next/layout/index.swig 中
{\% block content %}下面添加下方代码
1 | {\% block content %} |

修改/themes/next/layout/_macro/post-collapse.swig后的代码如下:
1 | {\% macro render(post) %} |
版本:1.6
该章节我们将分三种情况为您说明该如何同时使用 Docker + MySQL 来部署 Halo
前提条件: 我们默认您的机器上已经安装好 Docker
Docker 运行 MySQL 和 Halo 请参考小节《统一使用 Docker 安装》Docker部署的 MySQL,想安装 Halo 请参考小节《MySQL 部署在 Docker 如何使用 Docker 安装 Halo》MySQL 但部署在宿主机,想通过 Docker 安装 Halo 请参考小节《MySQL 在宿主机如何通过 Docker 安装 Halo》如果你的机器上没有现成的 MySQL 可供使用,那么您可以选择使用 Docker 来运行 MySQL 和 Halo
1 | docker network create halo-net |
提示
如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来使容器互联。
但随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 –link 参数。 Docker 官方文档中称:该–link 标志是 Docker 的遗留功能。它可能最终会被删除。除非您确定需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用 –link。
MySQL 镜像1 | docker pull mysql:8.0.27 |
MySQL 数据目录1 | mkdir -p ~/.halo/mysql |
MySQL 实例1 | docker run --name some-mysql -v ~/.halo/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw --net halo-net --restart=unless-stopped -d mysql:8.0.27 |
注意: 请将 my-secret-pw 修改为自己需要的密码后再执行,密码尽量包含小写字母、大写字母、数字和特殊字符且长度超过 8 位。
释意
1 | -e MYSQL_ROOT_PASSWORD=my-secret-pw`: 指定`MySQL`的登录密码为 `my-secret-pw |
-v ~/.halo/mysql:/var/lib/mysql 命令: 将宿主机的目录 ~/.halo/mysql 挂载到容器内部的目录 /var/lib/mysql,默认情况下 MySQL 将向 ~/.halo/mysql 写入其数据文件。
--net halo-net: 将该容器加入到 halo-net 网络,连接到 halo-net 网络的任何其他容器都可以访问 some-mysql容器上的所有端口。
(1) some-mysql 为 MySQL 实例的容器名称
1 | docker exec -it some-mysql /bin/bash |
(2) 登录 MySQL
1 | mysql -u root -p |
(3) 输入 MySQL 数据库密码
(4) 创建数据库
1 | create database halodb character set utf8mb4 collate utf8mb4_bin; |
(5) 使用 exit退出MySQL 并退出容器
Halo 工作目录1 | mkdir ~/.halo && cd ~/.halo |
1 | wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml |
1 | vim application.yaml |
你需要做如下几个步骤:
MySQL 密码修改后的内容如下:
1 | spring: |
1 | docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --net halo-net --restart=unless-stopped halohub/halo:1.6.0 |
http://ip:端口号 即可看到安装引导界面。如果您已有 Docker 部署的 MySQL 实例,那么为了保证 Halo 和 MySQL 两个容器的网络可以互通,和上文同样的思路可以创建一个网络让 MySQL 和 Halo 都加入进来。
docker ps 来查看的你 MySQL 容器实例的名称或 container id, 例如 some-mysqlMySQL 加入,首先使用 docker network ls 来查看一下都有哪些网络名称,起一个不会冲突的网络名称,例如 halo-net,其次让已经存在的 MySQL 容器实例加入到该网络中1 | docker network connect halo-net some-mysql |
Halo 工作目录1 | mkdir ~/.halo && cd ~/.halo |
1 | wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml |
MySQL 的数据库连接和密码1 | vim application.yaml |
你需要做如下几个步骤:
MySQL 密码修改后的内容如下:
1 | spring: |
Halo 容器实例,并使用 --net 指定网络为刚才创建的halo-net1 | docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --net halo-net --restart=unless-stopped halohub/halo:1.6.0 |
如果你已有 MySQL 但安装在宿主机,你想使用 Docker 安装 Halo 那么此时为了保证 MySQL 和 Halo 能网络互通,可以使用 host 网络模式即 --net host。
Halo 的工作目录1 | mkdir ~/.halo && cd ~/.halo |
1 | wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml |
Docker 启动 Halo 实例并指定网络模式为 host1 | docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --net host --restart=unless-stopped halohub/halo:1.6.0 |
今天在工作的时候遇到了一个问题,就是List的去重,不想用双重for,感觉太low,不想用for+Map,感觉应该有更好的方法,于是,google之。发现java8的stream流能完美解决这个问题。
1 | List<BookInfoVo> list |
比如在 BookInfoVo 中有一个 recordId 属性,现在需要对此去重.
怎么办呢?
有两种方法:
1 | private List<BookInfoVo> removeDupliByRecordId(List<BookInfoVo> books) { |
1 | /** |
1 | /*方法二:炫酷的java8写法*/ |
1 | ArrayList<BookInfoVo> distinctLiost = list.stream().collect(Collectors.collectingAndThen( |
其实理解起来也不难:
关键在于Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingLong(BookInfoVo::getRecordId))), ArrayList::new)的理解,
collectingAndThen 这个方法的意思是: 将收集的结果转换为另一种类型: collectingAndThen,
因此上面的方法可以理解为,把 new TreeSet<>(Comparator.comparingLong(BookInfoVo::getRecordId))这个set转换为 ArrayList,这个结合第一种方法不难理解.
可以看到java8这种写法真是炫酷又强大!!!
1. 类外注释
该注释放在 package 关键字之后,class 或者 interface 关键字之前。
1 | package com.huawei.msg.relay.comm; |
1 | /** |
1 | /** |
2. 类内注释
类属性、公有和保护方法必须写注释。geter、seter方法不用写注释
示例:
1 | /** |
1).成员变量注释内容:成员变量的意义、目的、功能,可能被用到的地方。
2).公有和保护方法注释内容:列出方法的一句话功能 简述、功能详细描述、输入参数、输出参数、返回值、违例等。
格式:
1 | /** |
说明: @exception或throws 列出可能仍出的异常。
示例:
1 | /** |
说明:
1).注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2).注释与所描述内容进行同样的缩排。
3).将注释与其上面的代码用空行隔开。
示例:
1 | //注释 |
对变量的定义和分支语句(条件分支、循环语句等)对复杂的分支必须编写注释,如果时间允许,建议对所有分支语句写注释。
说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。
1 | // 如果 receiveFlag 为真 |
1 | // 如果从连结收到消息 |
1 | if (...) |
1 | //1、 判断输入参数是否有效。 |
java //1. 如果能被4整除,是闰年; //2. 如果能被100整除,不是闰年.; //3. 如果能被400整除,是闰年.。 星期五, 23. 八月 2019 07:42下午**
**