Hexo Sakura主题美化 超详细

樱花🌸 

在简书上看很别扭,建议在这网址

目录和文件分析

分析下themes/Sakura目录结构和文件

首先分析下目录,主要包括以下几个

languages  这个文件夹中存放的是语言文件,主要是博客中的一些字符以简体中文、繁体中文、英文显示的定义

layout  这个是布局文件夹,所有的博客页面HTML和JavaScript以ejs模板存放在这

Search  这里存放的是页内搜索的ejs文件

_partial  这里的和下面的都是公共的页面,可以引入到HTML的任意位置

_widget

source  这个文件夹和博客根目录下的source文件夹是一样的,但是为了存放主题相关的文件

css  这里存放css文件

fonts  字体文件

images  图片

js  js文件

代码插入位置

再接着就是需要知道我们插入的文件和代码应该放到哪里

一般来说我们的js、css代码一般以文件形式存放到js、css文件夹中,接着再引入HTML代码中,引入位置一般在<head></head>标签中,当然啦css、js位置也不是固定的,你也可以直接放到HTML页面结构的中央和结尾,也就是<body></body>之间或者</body>之后、</head>之前

要是CSS或者JavaScript的代码很少的话,可以直接放到HTML中,不需要先存为文件再引入

具体参考:HTML中引入js、css的三种方式——行内样式、页面中样式、外部文件导入

就对应我们现在要修改的文件中的_partial目录下head.ejs——这个<html><head></head>就在这个文件中

footer.ejs是底部元素,一般个人、企业版权写在这里,因为一般大部分文件都会引入,因此js代码也可以写在这

layout.ejs这个也是所有页面需要引入的,因为</body></html>标签在这里

要是想将功能单独添加到某个页面,那你就找到那个ejs文件放到里面就醒了

博客原有功能的修改

博客原有功能修改主要指的是博客根目录配置文件和主题配置文件的修改

因为大部分的都已经在上次的博客搭建文章中写了

就不多说了吧

主要包括各种页面结构的修改:

首页轮播图

站点图标、头像、赞赏等图片的链接修改

个人化的站点标题、副标题、描述、关键词等

导航栏的修改、添加、删除等

通知的修改

startdash的图片、链接修改

社交链接的修改等

这上面这些应该都是不需要再讲了的

导航栏中的关于

主要是关于>我?这个的修改

这个要修改的文件在Sakura/source/js目录下,名字为botui.js

主要修改content后面双引号里的内容,自行修改为自己的就行

导航栏中的客户端

这个可以使用Fusion App把你自己的博客封装成APP

然后放到蓝奏云上,生成二维码放上来

导航栏中的RSS

根目录下的配置文件中已经有了

#RSS

feed:

  type: atom

  path: atom.xml

  limit: 20

  hub:

  content:

  content_limit: 140

  content_limit_delim: ' '

  order_by: -date

这些代码

因此我们只需要安装好插件就行了

npm install hexo-generator-feed

当然啦,如果本来就能显示内容,那么就不需要安装了

每个页面中的顶部图片

就比如关于>主题这个页面

我们进入根目录下,再进入source目录找到theme-sakura,进入该目录点击index.md,修改photos后面的内容,改为你想要的图片链接

---title: theme-sakura

comments: false

date: 2019-01-04 22:53:25

keywords: Hexo 主题 Sakura 🌸

description:photos: https://static.2heng.xin/wp-content/uploads//2018/05/sakura2.jpeg

---Hexo主题Sakura修改自WordPress主题[Sakura](https://github.com/mashirozx/Sakura/),感谢原作者[Mashiro](https://2heng.xin/)

文章上面和首页文章列表的图片

也是修改的你新建的文章中的photos后面的图片链接

这些都是这个主题支持的内容,在上篇文章中写过的文章模板

---

title: 文章标题

author: 作者名

avatar: 作者头像链接

authorLink: hojun.cn  #作者的域名

authorAbout: 一个好奇的人  #关于

authorDesc: 一个好奇的人  #作者描述

categories: 分类

date: 2018-12-12 22:16:01 #时间,这个一般都自动创建

comments: true  # 是否需要留言

tags:        # 下面可以写多个标签

- web

- 悦读

keywords: Sakura   # 文章关键词

description: hexo-sakura主题使用教程   #文章描述

photos: https://static.2heng.xin/wp-content/uploads//2019/02/wallhaven-672007-1-1024x576.png

---

清单下的番组

这个是在source下bangumi下的index.md中修改的

---

layout: bangumi

title: bangumi

comments: false

date: 2019-02-10 21:32:48

keywords:

description:

bangumis:

  - img: https://lain.bgm.tv/pic/cover/l/0e/1e/218971_2y351.jpg # 番的图片

   title: 朝花夕誓——于离别之朝束起约定之花  # 番的中文标题

   status: 已追完  # 追番状态

   progress: 100   # 追番进度

   jp: さよならの朝に約束の花をかざろう   # 日文标题

   time: 2018-02-24 SUN.  # 这个是出版的时间

   desc: 这里是你追的番的描述

---

清单下的歌单和左下角悬浮歌单

主要是修改你的id,歌单id的获取方式:

进入网易云网页版https://music.163.com/

登录账号,选择一个歌单打开

浏览器的链接将会显示id,就最后一个字段,把那些数字复制到下面就行

https://music.163.com/?from=infinity#/playlist?id=2162711186

清单下的歌单文件是source/music/index.md

---

title: music

date: 2018-12-20 23:14:28

keywords: 喜欢的音乐

description:

comments: false

photos: https://cdn.jsdelivr.net/gh/honjun/cdn@1.4/img/banner/music.jpg

---

{% raw %}

修改这里就可以

{% endraw %}

悬浮音乐的代码在主题配置文件中

aplayer:

  id: 2660651585

  server: netease

  type: playlist

  fixed: true

  autoplay: false

  loop: all

  order: random

  preload: auto

  volume: 0.7

  mutex: true

友链添加

友链修改文件在source/links/index.md

---

layout: links

title: links

date: 2018-12-19 23:11:06

keywords: 友人帐

description:

comments: true

photos: https://cdn.jsdelivr.net/gh/honjun/cdn@1.4/img/banner/links.jpg

links:

  - group: 个人项目

    desc: 充分说明这家伙是条咸鱼 < ( ̄︶ ̄)>

    items:

    - url: https://shino.cc/fgvf

      img: https://cloud.moezx.cc/Picture/svg/landscape/fields.svg

      name: Google

      desc: Google 镜像

    - url: https://shino.cc/fgvf

      img: https://cloud.moezx.cc/Picture/svg/landscape/fields.svg

      name: Google

      desc: Google 镜像

  - group: 小伙伴们

    desc: 欢迎交换友链 ꉂ(ˊᗜˋ)

    items:  ## 友链添加主要是在这里

    - url: https://shino.cc/fgvf # 他的链接

      img: https://cloud.moezx.cc/Picture/svg/landscape/fields.svg # 他的头像

      name: Google # 他的博客名

      desc: Google 镜像 # 博客描述

    - url: https://shino.cc/fgvf

      img: https://cloud.moezx.cc/Picture/svg/landscape/fields.svg

      name: Google

      desc: Google 镜像

---

不需要修改layout目录下文件的应该就这些了

接下来就直接按点添加功能和美化了

添加标题恶搞

默认的是离开时候还是现实自己的文字标题

添加之后离开和回到这个页面时显示

为了达到上述效果,我们可以在head.ejs或者footer.ejs中加入代码

<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn@latest/js/hititle.js"></script>

例如加入到head.ejs的该位置

加入之后刷新就能生效了

鼠标点击特效

单击特效有很多种,这里给出三个吧

现在我们把这个代码放到layout.ejs的``标签前

<!-- 点击出现社会主义彩色文字 --><script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/shehuizhuyi.js"></script><!-- 点击出现爱心 --><script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/love.js"></script><!-- 点击出现彩色气球爆炸效果 --><canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> <script type="text/javascript" src="//cdn.bootcss.com/animejs/2.2.0/anime.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/clickBom.js"></script>

可以分别添加一种,也可以多种混合,但是三种一起使用感觉效果不太好

下面是前两者结合的效果:

最后一种:

这个有很多个,这里展示一个

把代码插入到layout.ejs中

<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/xuehua.js"></script>

效果如下:

背景显示飘动的彩带

在需要的页面添加,我们还是在所有页面都加上,layout.ejs中加入代码

<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/piao.js"></script>

背景添加动态线条,随鼠标动

仍是layout.ejs中

<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/canvas-nest.min.js"></script>

樱花飘落或雪花飘落

仍是layout.ejs中

樱花飘落:

<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/sakura.js"></script>

雪花飘落:

<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/xuehuapiaoluo.js"></script>或者<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/snow.js"></script>

选择一个就行了

禁用一些按键

为了阻止某些使用F12、Ctrl+Alt+I调用开发者选项的用户

还有禁用了鼠标右键,可以开启禁用鼠标左键拖动选择文字

<script src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/noSomeKey.js"></script>

添加画板娘

这次不用插件来添加,直接引入js代码

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css"> <!-- 这条在sakura中已有,可不添加 --><script src="https://cdn.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/autoload.js"></script>

仓库链接在这:

live2d-widget https://github.com/stevenjoezhang/live2d-widget

添加前往GitHub的彩带

前往

GitHub Ribbons https://github.blog/2008-12-19-github-ribbons/

挑选样式之后,复制相应的代码,粘贴到合适的地方

加入预加载

sakura主题集成了图片懒加载,可是页面放到GitHub加载还是很慢,matery主题就加入了预加载,从那里得到灵感,因此我们加入预加载

还是在layout.ejs中添加

<script src="//instant.page/3.0.0" type="module" defer integrity="sha384-OeDn4XE77tdHo8pGtE1apMPmAipjoxUQ++eeJa6EtJCfHlvijigWiJpD7VDPWXV1"></script>

官网在这:预加载https://instant.page/

添加计数

主要使用的是不蒜子和LeanCloud

LeanCloud我使用起来并不理想,因此不讲,想要了解自己去官网看

不蒜子的:

<script src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

再进入不蒜子官网查看访问量pv、用户访问量uv使用

添加一言API、诗词

今日诗词 https://www.jinrishici.com/#

提供了诗词的API

我们将这个诗词放到以前的描述那里,社交图标的上方

修改headertop.ejs,找到下面的代码

<div class="header-info">  <!-- 找到这个位置 -->

        <!-- <p><%= theme.description %></p> -->  把这句注释掉        <p id="jinrishici-sentence">正在加载今日诗词....</p>

        <script src="https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset="utf-8"></script>

  <!-- 添加上面的两句 -->

        <div class="top-social_v2">

一言API的可以前往这个网址查看使用:

一言开发者中心 https://developer.hitokoto.cn/sentence/

正好通知也没有啥用,把他换掉

进入index.ejs,查找<%= theme.notice%>,将其替换为下面的

      <span id="hitokoto" style="margin-left:5px;"> :D 获取中...</span>

      <p align="right" id="afrom"></p>

      <script src="https://cdn.jsdelivr.net/npm/bluebird@3/js/browser/bluebird.min.js"></script>

      <script src="https://cdn.jsdelivr.net/npm/whatwg-fetch@2.0.3/fetch.min.js"></script>

      <script>

        fetch('https://v1.hitokoto.cn/?c=h')

          .then(function (res){

            return res.json();

          })

          .then(function (data) {

            var hitokoto = document.getElementById('hitokoto');

            var afrom = document.getElementById('afrom');

            hitokoto.innerText = data.hitokoto;

            afrom.innerText =  '——【' + data.from + ' ' + data.from_who + '】';

          })

          .catch(function (err) {

            console.error(err);

          })

      </script>

添加底部的网站运行时间

在footer.ejs选择合适位置添加代码

<span id="timeDate">载入天数...</span><span id="times">载入时分秒...</span><script>

  var now = new Date();

  function createtime() {

    var grt= new Date("03/08/2020 16:44:00");//此处修改你的建站时间或者网站上线时间

    now.setTime(now.getTime()+250);

    days = (now - grt ) / 1000 / 60 / 60 / 24; dnum = Math.floor(days);

    hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum); hnum = Math.floor(hours);

    if(String(hnum).length ==1 ){hnum = "0" + hnum;} minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum);

    mnum = Math.floor(minutes); if(String(mnum).length ==1 ){mnum = "0" + mnum;}

    seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum);

    snum = Math.round(seconds); if(String(snum).length ==1 ){snum = "0" + snum;}

    document.getElementById("timeDate").innerHTML = "本站已安全运行 "+dnum+" 天 ";

    document.getElementById("times").innerHTML = hnum + " 小时 " + mnum + " 分 " + snum + " 秒";

  }

  setInterval("createtime()",250);</script>

添加底部动态滚动文字

<div id="binft"></div>

  <script>

    var binft = function (r) {

      function t() {

        return b[Math.floor(Math.random() * b.length)]

      }

      function e() {

        return String.fromCharCode(94 * Math.random() + 33)

      }

      function n(r) {

        for (var n = document.createDocumentFragment(), i = 0; r > i; i++) {

          var l = document.createElement("span");

          l.textContent = e(), l.style.color = t(), n.appendChild(l)

        }

        return n

      }

      function i() {

        var t = o[c.skillI];

        c.step ? c.step-- : (c.step = g, c.prefixP < l.length ? (c.prefixP >= 0 && (c.text += l[c.prefixP]), c.prefixP++) : "forward" === c.direction ? c.skillP < t.length ? (c.text += t[c.skillP], c.skillP++) : c.delay ? c.delay-- : (c.direction = "backward", c.delay = a) : c.skillP > 0 ? (c.text = c.text.slice(0, -1), c.skillP--) : (c.skillI = (c.skillI + 1) % o.length, c.direction = "forward")), r.textContent = c.text, r.appendChild(n(c.prefixP < l.length ? Math.min(s, s + c.prefixP) : Math.min(s, t.length - c.skillP))), setTimeout(i, d)

      }

      var l = "",

      o = ["青青陵上柏,磊磊涧中石。", "人生天地间,忽如远行客。","斗酒相娱乐,聊厚不为薄。", "驱车策驽马,游戏宛与洛。","洛中何郁郁,冠带自相索。","长衢罗夹巷,王侯多第宅。","两宫遥相望,双阙百余尺。","极宴娱心意,戚戚何所迫?"].map(function (r) {

      return r + ""

      }),

      a = 2,

      g = 1,

      s = 5,

      d = 75,

      b = ["rgb(110,64,170)", "rgb(150,61,179)", "rgb(191,60,175)", "rgb(228,65,157)", "rgb(254,75,131)", "rgb(255,94,99)", "rgb(255,120,71)", "rgb(251,150,51)", "rgb(226,183,47)", "rgb(198,214,60)", "rgb(175,240,91)", "rgb(127,246,88)", "rgb(82,246,103)", "rgb(48,239,130)", "rgb(29,223,163)", "rgb(26,199,194)", "rgb(35,171,216)", "rgb(54,140,225)", "rgb(76,110,219)", "rgb(96,84,200)"],

      c = {

        text: "",

        prefixP: -s,

        skillI: 0,

        skillP: 0,

        direction: "forward",

        delay: a,

        step: g

      };

      i()

      };

      binft(document.getElementById('binft'));

  </script>

加入天气插件

前往

中国天气 https://cj.weather.com.cn/plugin/pc

这个网址查看详情

可以选用小视图,添加到link.ejs中

顶部加载条

这个sakura有,但是想记录一下

head中加入

<script src="//cdn.bootcss.com/pace/1.0.2/pace.min.js"></script><link href="//cdn.bootcss.com/pace/1.0.2/themes/pink/pace-theme-flash.css" rel="stylesheet"><style>

  .pace .pace-progress {  background: #1E92FB; /*进度条颜色*/

  height: 3px;  }

  .pace .pace-progress-inner {  box-shadow: 0 0 10px #1E92FB, 0 0 5px    #1E92FB; /*阴影颜色*/

  }

  .pace .pace-activity {  border-top-color: #1E92FB;    /*上边框颜色*/

  border-left-color: #1E92FB;    /*左边框颜色*/

  }</style>

修改鼠标样式

在style.css中添加,sakura已有,可不管,当然啦,也可以去找一下其他好看的图标

// 鼠标样式

  * {

      cursor: url("https://cdn.jsdelivr.net/gh/wallleap/cdn@latest/img/cursor/normal.cur"),auto!important

  }

  :active {

      cursor: url("https://cdn.jsdelivr.net/gh/wallleap/cdn@latest/img/cursor/No_Disponible.cur"),auto!important

  }

评论系统

sakura自带的系统为valine,我们可以自行替换成其他的

就比如来必力,前往

来必力官网 https://www.livere.com/

注册登录后,点击菜单栏的【安装】,出现这个界面,直接点击【现在安装】

前往管理页,点击左边的【代码管理】

你将会看到这样的代码

data-uid后面的双引号中的内容剪切出来

然后到主题配置文件下修改,找到最下面的valine

将valine改成false,添加最后两行

# Valine

valine: false

v_appId: Cu2IPPUW8BnkmwzFa8WrS9VC-gzGzoHsz

v_appKey: kgcNfaHXq91mfCaAIcbjGChl

# livere

livere: true

  data_uid: 刚刚复制的uid

接着把下面的代码复制到comment.ejs中

<% if (theme.livere && post.comments) { %><!-- 来必力City版安装代码 --><div id="lv-container" data-id="city" data-uid="<%= theme.livere.data_uid %>"><script type="text/javascript">

  (function(d, s) {      var j, e = d.getElementsByTagName(s)[0];      if (typeof LivereTower === 'function') { return; }

      j = d.createElement(s);

      j.src = 'https://cdn-city.livere.com/js/embed.dist.js';

      j.async = true;

      e.parentNode.insertBefore(j, e);

  })(document, 'script');</script><noscript>为正常使用来必力评论功能请激活JavaScript</noscript></div><!-- Ci

在线联系

DaoVoice 在线联系

前往网站

DaoVoice https://www.daovoice.io/

可以使用GitHub或者微信登录,也可以前往

这里注册 http://dashboard.daovoice.io/get-started

进入之后点击应用设置,再点击安装到网站

再将第一个代码复制到``之前,将下面两个复制到layout.ejs

添加优美的标签页

这个标签页和分类页提取自matery,不得不说matery真的很漂亮

首先我们要创建几个文件,文件所在目录如下

layout

tags.ejs

_widget

tag-cloud.ejs

tag-wordcloud.ejs

也就是tags.ejs放在layout根目录下,下面两个文件放在layout子目录_widget下

tags.ejs

<%- partial('_partial/header') %>

<main class="content">

    <%- partial('_widget/tag-cloud') %>

    <%- partial('_widget/tag-wordcloud') %>

</main>

_widget/tag-cloud.ejs

<%

var colorArr = ['#F9EBEA', '#F5EEF8', '#D5F5E3', '#E8F8F5', '#FEF9E7',

    '#F8F9F9', '#82E0AA', '#D7BDE2', '#A3E4D7', '#85C1E9', '#F8C471', '#F9E79F', '#FFF'];

var colorCount = colorArr.length;

var hashCode = function (str) {

    if (!str && str.length === 0) {

        return 0;

    }

    var hash = 0;

    for (var i = 0, len = str.length; i < len; i++) {

        hash = ((hash << 5) - hash) + str.charCodeAt(i);

        hash |= 0;

    }

    return hash;

};

var i = 0;

var isTag = is_tag();

%>

<div id="tags" class="container chip-container">

    <div class="card">

        <div class="card-content">

            <div class="tag-title center-align">

                <i class="fa fa-tags"></i>&nbsp;&nbsp;文章标签

            </div>

            <div class="tag-chips">

                <% site.tags.map(function(tag) { %>

                <%

                    i++;

                    var color = i >= colorCount ? colorArr[Math.abs(hashCode(tag.name) % colorCount)]

                            : colorArr[i - 1];

                %>

                <a href="<%- url_for(tag.path) %>" title="<%- tag.name %>: <%- tag.length %>">

                    <span class="chip center-align waves-effect waves-light

                            <% if (isTag && tag.name == page.tag) { %> chip-active <% } else { %> chip-default <% } %>"

                            data-tagname="<%- tag.name %>" style="background-color: <%- color %>;"><%- tag.name %>

                        <span class="tag-length"><%- tag.length %></span>

                    </span>

                </a>

                <% }); %>

            </div>

        </div>

    </div>

</div>

_widget/tag-wordcloud.ejs

<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/wallleap/cdn/css/jqcloud.css">

<style type="text/css">

    #tag-wordcloud {

        width: 100%;

        height: 300px;

    }

</style>

<div class="container" data-aos="fade-up">

    <div class="card">

        <div id="tag-wordcloud" class="card-content"></div>

    </div>

</div>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/jqcloud-1.0.4.js"></script>

<script type="text/javascript">

    <%

    let tagWordArr = [];

    site.tags.map(function(tag) {

        tagWordArr.push({'text': tag.name, 'weight': tag.length, 'link': tag.permalink});

    });

    let tagWords = JSON.stringify(tagWordArr);

    %>

    $('#tag-wordcloud').jQCloud(<%- tagWords %>, {

        autoResize: true

    });

</script>

将这段代码复制到style.css末尾

.chip-container {    margin-top: 60px;}.chip-container .tag-title {    margin-bottom: 10px;    color: #3C4858;    font-size: 1.75rem;    font-weight: 400;}.chip-container .tag-chips {    margin: 1rem auto 0.5rem;    max-width: 850px;    text-align: center;}.chip-container .tags-posts {    margin-top: 20px;}.chip-container .chip-default {    color: #34495e;}.chip-container .chip-active {    color: #FFF !important;    background: linear-gradient(to bottom right, #FF5E3A 0%, #FF2A68 100%) !important;    box-shadow: 2px 5px 10px #aaa !important;}.chip-container .chip {    margin: 10px 10px;    padding: 19px 14px;    display: inline-flex;    line-height: 0;    font-size: 1rem;    font-weight: 500;    border-radius: 5px;    cursor: pointer;    box-shadow: 0 3px 5px rgba(0, 0, 0, .12);}.chip-container .chip:hover {    color: #fff;    background: linear-gradient(to right, #4cbf30 0%, #0f9d58 100%) !important;}.chip .tag-length {    margin-left: 5px;    margin-right: -2px;    font-size: 0.5rem;}.chip-default .tag-length {    color: #e91e63;    margin-top: 1px;}.chip-active .tag-length {    color: #fff;}.tag-title.center-align{    margin-top: 100px;    text-align : center;}

使用命令hexo new page "tags",修改博客根目录下source/tags/index.md

---

title: tags

date: 2020-03-09 13:50:05

layout: tags

---

http://localhost:4000/tags查看页面

添加优美的分类页

接着创建几个文件,文件所在目录如下

layout

categories.ejs

_widget

category-cloud.ejs

category-radar.ejs

也就是categories.ejs放在layout根目录下,下面两个文件放在layout子目录_widget下

添加代码

categories.ejs

<%- partial('_partial/header') %>

<main class="content">

    <%- partial('_widget/category-cloud') %>

    <% if (site.categories && site.categories.length > 0) { %>

    <%- partial('_widget/category-radar') %>

    <% } %>

</main>

category-cloud.ejs

<%

var colorArr = ['#F9EBEA', '#F5EEF8', '#D5F5E3', '#E8F8F5', '#FEF9E7',

    '#F8F9F9', '#82E0AA', '#D7BDE2', '#A3E4D7', '#85C1E9', '#F8C471', '#F9E79F', '#FFF'];

var colorCount = colorArr.length;

var hashCode = function (str) {

    if (!str && str.length === 0) {

        return 0;

    }

    var hash = 0;

    for (var i = 0, len = str.length; i < len; i++) {

        hash = ((hash << 5) - hash) + str.charCodeAt(i);

        hash |= 0;

    }

    return hash;

};

var i = 0;

var isCategory = is_category();

%>

<div id="category-cloud" class="container chip-container">

    <div class="card">

        <div class="card-content">

            <div class="tag-title center-align">

                <i class="fa fa-bookmark"></i>&nbsp;&nbsp;文章分类

            </div>

            <div class="tag-chips">

                <% if (site.categories && site.categories.length > 0) { %>

                <% site.categories.map(function(category) { %>

                <%

                    i++;

                    var color = i >= colorCount ? colorArr[Math.abs(hashCode(category.name) % colorCount)]

                            : colorArr[i - 1];

                %>

                <a href="<%- url_for(category.path) %>" title="<%- category.name %>: <%- category.length %>">

                    <span class="chip center-align waves-effect waves-light

                            <% if (isCategory && category.name == page.category) { %> chip-active <% } else { %> chip-default <% } %>"

                            style="background-color: <%- color %>;"><%- category.name %>

                        <span class="tag-length"><%- category.length %></span>

                    </span>

                </a>

                <% }); %>

                <% } else { %>

                <%= __('categoryEmptyTip') %>

                <% } %>

            </div>

        </div>

    </div>

</div>

category-radar.ejs

<style type="text/css">

    #category-radar {

        margin-top: 50px;

        width: 100%;

        height: 360px;

    }

</style>

<div class="container" data-aos="fade-up">

    <div class="card">

        <div id="category-radar" class="card-content"></div>

    </div>

</div>

<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/wallleap/cdn/js/echarts.min.js"></script>

<script type="text/javascript">

    let radarChart = echarts.init(document.getElementById('category-radar'));

    <%

        var categories = site.categories;

        // Find the maximum and average values of the post categories.

        var radarValueArr = [];

        categories.some(function(category) {

            radarValueArr.push(category.length);

        });

        var max = Math.max.apply(null, radarValueArr) + Math.min.apply(null, radarValueArr);

        // Calculate the data needed for the radar chart.

        var indicatorArr = [];

        categories.map(function(category) {

            indicatorArr.push({'name': category.name, 'max': max});

        });

        var indicatorData = JSON.stringify(indicatorArr);

        var radarValueData = JSON.stringify(radarValueArr);

    %>

    let option = {

        title: {

            left: 'center',

            text: '文章分类雷达图',

            textStyle: {

                fontWeight: 500,

                fontSize: 22

            }

        },

        tooltip: {},

        radar: {

            name: {

                textStyle: {

                    color: '#3C4858'

                }

            },

            indicator: <%- indicatorData %>,

            nameGap: 5,

            center: ['50%','55%'],

            radius: '66%'

        },

        series: [{

            type: 'radar',

            color: ['#3ecf8e'],

            itemStyle: {normal: {areaStyle: {type: 'default'}}},

            data : [

                {

                    value : <%- radarValueData %>,

                    name : '文章分类数量'

                }

            ]

        }]

    };

    radarChart.setOption(option);

</script>

接着用命令hexo new page "categories"创建分类页

修改博客根目录下source/categories/index.md

---

title: categories

date: 2020-03-09 13:50:05

layout: categories

---

http://localhost:4000/categories

查看

接着就是把这两个页面放到导航栏上面去

修改主题配置文件,将这两行代码放到留言板之前

    标签: {path: /tags/, fa: fa-tag }

  分类: {path: /categories/, fa: fa-bookmark }

已经集成的一些插件

emoji表情:

hexo-filter-github-emojis https://github.com/crimx/hexo-filter-github-emojis

正常插件安装版画板娘:

hexo-helper-live2d https://github.com/EYHN/hexo-helper-live2d

图片懒加载(sakura已经有了,但不是这种方式):

hexo-lazyload-image https://www.npmjs.com/package/hexo-lazyload-image

hexo-lazyload-image-enhance https://github.com/barretlee/hexo-lazyload-image-enhance

字数统计(好像没装):

hexo-wordcount https://github.com/willin/hexo-wordcount

fancybox:

hexo-tag-fancybox_img https://github.com/honjun/hexo-tag-fancybox_img

bilibili:

hexo-tag-bili https://github.com/honjun/hexo-tag-bili

文章末尾版权信息添加

首先我们在_partial目录下新建文件article_copyright.ejs

<div class="my_post_copyright">

  <script src="//cdn.bootcss.com/clipboard.js/1.5.10/clipboard.min.js"></script>

  <!-- JS库 sweetalert 可修改路径 -->

  <script src="https://cdn.bootcss.com/jquery/2.0.0/jquery.min.js"></script>

  <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>

  <p><span>本文标题:</span><%= post.title %></p>

  <p><span>文章字数:</span><span class="post-count"><%=wordcount(post.content) %></span></p>

  <p><span>文章作者:</span><a  title="<%=config.author%>"><%=config.author%></a></p>

  <p><span>发布时间:</span><%= post.date.format("YYYY-MM-DD, HH:mm:ss") %></p>

  <p><span>最后更新:</span><%= post.updated.format("YYYY-MM-DD, HH:mm:ss") %></p>

  <p><span>原始链接:</span></span><a class="post-url" href="<%- url_for(post.path) %>" title="<%= post.title %>"><%= post.permalink %></a>

    <span class="copy-path"  title="点击复制文章链接"><i class="fa fa-clipboard" data-clipboard-text="{{ page.permalink }}"  aria-label="复制成功!"></i></span>

  </p>

  <p><span>许可协议:</span><i class="fa fa-creative-commons"></i> <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" title="Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)">署名-非商业性使用-禁止演绎 4.0 国际</a> 转载请保留原文链接及作者。</p>

</div>

<script>

    var clipboard = new Clipboard('.fa-clipboard');

    $(".fa-clipboard").click(function(){

      clipboard.on('success', function(){

        swal({

          title: "",

          text: '复制成功',

          icon: "success",

          showConfirmButton: true

          });

    });

    });

</script>

需要文章字数的,一定要先安装字数统计插件,上面列出了,不用就把那行注释掉

接着将下面的代码

        <% if (post.copyright) { %>

          <%- partial('../_partial/article_copyright') %>

        <% } %>

复制到common-article.ejs的这个位置

将CSS代码复制到style.css中

.my_post_copyright {

  width: 85%;

  max-width: 45em;

  margin: 2.8em auto 0;

  padding: 0.5em 1.0em;

  border: 1px solid #d3d3d3;

  font-size: 0.93rem;

  line-height: 1.6em;

  word-break: break-all;

  background: rgba(255,255,255,0.4);

}

.my_post_copyright p{margin:0;}

.my_post_copyright span {

  display: inline-block;

  width: 5.2em;

  color: #b5b5b5;

  font-weight: bold;

}

.my_post_copyright .raw {

  margin-left: 1em;

  width: 5em;

}

.my_post_copyright a {

  color: #808080;

  border-bottom:0;

}

.my_post_copyright a:hover {

  color: #a3d2a3;

  text-decoration: underline;

}

.my_post_copyright:hover .fa-clipboard {

  color: #000;

}

.my_post_copyright .post-url:hover {

  font-weight: normal;

}

.my_post_copyright .copy-path {

  margin-left: 1em;

  width: 1em;

  +mobile(){display:none;}

}

.my_post_copyright .copy-path:hover {

  color: #808080;

  cursor: pointer;

}

添加404页面

在博客根目录的source目录下新建404.html

随便找个模板,在开头加入代码

---

layout: false

---

例如

---

layout: false

---<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="format-detection" content="telephone=no"><title>404</title></head><body>

      <p>404页面</p>

      <a>返回主页</a></body></html>

部署到GitHub之后,访问不存在的页面就会跳出来了

域名绑定

在博客根目录下的source目录下新建CNAME文件,如果主题source目录下有这个文件请删除

修改CNAME文件,内容为你的域名,例如我的

www.sakura521.cn

接着去GitHub pages更改域名,开启SSL

前往阿里云的的域名解析页面添加CANME解析

@ → 用户名.github.io

之后就可以以新的域名访问了 https://www.sakura521.cn

网站收录

主要是向各大搜索引擎提交链接

谷歌收录

360站长平台 http://zhanzhang.so.com/sitetool/site_manage

百度搜索资源平台 https://ziyuan.baidu.com/linksubmit/

百度的需要注意一下,由于GitHub将百度封了,因此你需要把博客双线部署到gitlab或coding才能收录

搜狗站长平台 http://zhanzhang.sogou.com/

网站分析

百度统计

前往百度统计官网

Baidu统计 https://tongji.baidu.com/web/welcome/login

以百度账号登录后,点击【管理】,在【网站列表】中新增网站

获取代码,将代码复制到标签前,进行代码检测

以后就可以查看访问情况了

cnzz

点击

友盟+ https://passport.umeng.com/login?appId=cnzz

前往,注册登录后,添加站点

根据自己喜好获取代码

粘贴到前

之后就可以点击查看信息了

小技巧

博客备份

有一个博客备份插件

hexo-git-backup https://github.com/coneycode/hexo-git-backup

能够传到backup分支

我们还可以把整个博客文件夹上传到GitHub私有仓库

本地预览

使用命令换个端口预览hexo s -p 5000

也可以添加下列代码到博客配置文件中,使用hexo s时将会以5000端口运行

server:

  port: 5000

  compress: true

  header: true

快捷命令

alias设置命令别名,将下面代码复制到*.bashrc*文件中

alias hs='hexo clean && hexo g && hexo s'

alias hd='hexo clean && hexo g && hexo d'

alias gp='git add . && git commit -m "update" && git push -f'

以后输入hs命令就可以本地预览、hd部署、gp上传到仓库

静态资源压缩

博客使用了图片懒加载和预加载虽然加快了一点速度,但访问还是有点慢

那么直接把html、css、js代码中的空格去掉,进行压缩

还有压缩一下图片,能够一定程度上缩小public文件夹的大小

参考这篇文章:

Hexo博客使用gulp压缩静态资源

安装全局gulp

npm install gulp -g

安装插件

npm install gulp-minify-css gulp-uglify gulp-htmlmin gulp-htmlclean gulp gulp-imagemin --save

# 解决【Gulp打包问题】 GulpUglifyError: unable to minify JavaScript

# 解决 gulp-uglify 压缩JavaScript 不兼容 es5 语法的问题

npm install babel-core@6.26.3 --save

npm install gulp-babel@7.0.1 --save

npm install babel-preset-es2015@6.24.1 --save

# gulp-babel 取消严格模式方法("use strict")

npm install babel-plugin-transform-remove-strict-mode --save

问题:如果安装gulp-imagemin错误请执行以下语句sudo npm i gulp-imagemin --unsafe-perms

博客根目录创建gulpfile.js

上面文章中有一句在这个版本会报错,已修改

var gulp = require('gulp');var minifycss = require('gulp-minify-css');var uglify = require('gulp-uglify');var htmlmin = require('gulp-htmlmin');var htmlclean = require('gulp-htmlclean');var imagemin = require('gulp-imagemin');var babel = require('gulp-babel');// 压缩css文件gulp.task('minify-css', function (done) {    return gulp.src('./public/**/*.css')

        .pipe(minifycss())

        .pipe(gulp.dest('./public'));

    done();

});// 压缩html文件gulp.task('minify-html', function (done) {    return gulp.src('./public/**/*.html')

        .pipe(htmlclean())

        .pipe(htmlmin({

            removeComments: true,

            minifyJS: true,

            minifyCSS: true,

            minifyURLs: true,

        }))

        .pipe(gulp.dest('./public'));

    done();

});// 压缩js文件gulp.task('minify-js', function (done) {    return gulp.src(['./public/**/*.js', '!./public/**/*.min.js'])

        .pipe(babel({            //将ES6代码转译为可执行的JS代码

            presets: ['es2015'] // es5检查机制

        }))

        .pipe(uglify())

        .pipe(gulp.dest('./public'));

    done();

});// 压缩 public/images 目录内图片(Version<3)// gulp.task('minify-images', function () {//    gulp.src('./public/images/**/*.*')//        .pipe(imagemin({//            optimizationLevel: 5, //类型:Number  默认:3  取值范围:0-7(优化等级)//            progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片//            interlaced: false, //类型:Boolean 默认:false 隔行扫描gif进行渲染//            multipass: false, //类型:Boolean 默认:false 多次优化svg直到完全优化//        }))//        .pipe(gulp.dest('./public/images'));// });// 压缩 public/images 目录内图片(Version>3)gulp.task('minify-images', function (done) {

    gulp.src('./public/images/**/*.*')

        .pipe(imagemin([

            imagemin.gifsicle({interlaced: true}),            // imagemin.jpegtran({progressive: true}), // 版本升级,改用下面这个

            imagemin.mozjpeg({progressive: true,}),

            imagemin.optipng({optimizationLevel: 5}),

            imagemin.svgo({

                plugins: [

                    {removeViewBox: true},

                    {cleanupIDs: false}

                ]

            })

        ]))

        .pipe(gulp.dest('./public/images'));

    done();

});//4.0以前的写法 //gulp.task('default', [//  'minify-html', 'minify-css', 'minify-js', 'minify-images'//]);//4.0以后的写法// 执行 gulp 命令时执行的任务gulp.task('default', gulp.series(gulp.parallel('minify-html', 'minify-css', 'minify-js', 'minify-images')), function () {    console.log("----------gulp Finished----------");    // Do something after a, b, and c are finished.});

根目录下创建.babelrc

{

    'presets': ['es2015'],

    "plugins": ["transform-remove-strict-mode"]

}

转载源地址

https://mp.weixin.qq.com/s/OAyOA28-bTJLE6aKtzpoqg

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容