Valine 是一款非常轻量级无后端实现的评论系统,目前很多静态博客如 Hexo、Jekyll、Hugo 等等都原生支持 Valine,本站使用的 halo 博客由于自带评论系统的表情包功能很让我抓狂(等于没有),所以我仍然选择继续使用 Valine(我不会说是因为我不想放弃攒了一年的评论🙁),并放弃了具有后台审核功能的自带评论系统。

Valine官方文档https://valine.js.org/!

截至到本文更新(2020/06/06)时,Valine 已经更新到了 v1.4.14 版本,之前很多不支持的功能在疫情期间由于作者大大 xCSS 闲置在家连续爆肝 N 个版本后也终于都得到了支持,当然,还有一些贴心的小功能我们也可以在其他人魔改的 Valine 中找到并使用,这个我稍后会推荐。

Valine 的使用

Valine 虽然自称是无后台实现的评论系统,但其实也是基于云数据库 LeanCloud 实现的评论存储,不过存储数据的操作都由作者在 js 中完成了,我们在使用前需要做的就是在 LeanCloud 中创建一个存储评论的表名为 Comment

不管你使用的是什么博客框架,原则上都可以使用 Valine 评论插件,这是因为 Valine 存储评论时依赖的是文章或者页面的 URL 相对路径,比如我的这篇文章的 URL 绝对路径是 https://bestzuo.cn/posts/763113948.html,那么在 LeanCloud 中存储的 URL 相对路径就是 /posts/763113948.html,Valine 通过识别这个相对路径获取对应的评论,所以如果你修改了文章的路径也不要紧,自己去 LeanCloud 中把 URL 相对路径修改为当前路径就行(这也是我换了几个框架都能保留评论的原因)。

Valine 使用的是 Gravatar 全球头像,在这个网站上通过邮箱注册后上传你的头像,那么在 Valine 评论中填写你的邮箱就可以获取到你上传的头像(由于 CDN 的原因,上传头像后一般不会立即生效,可能有 7 天的缓存时间)。

在 Valine 1.4.6 版本后,可以通过设置 enableQQ 属性为 true 拉取 QQ 邮箱的头像和昵称信息。

Valine-Admin 邮箱读取留言

这个地方是写给之前没使用过 Valine 的用户看的,老用户应该很早就配置了这个功能,目前关于邮箱收取评论信息的 Valine 插件较多,以下只推荐使用较多的两个。

Valine-Adminhttps://github.com/zhaojun1998/Valine-Admin

Valine-Adminhttps://github.com/DesertsP/Valine-Admin!

这两个选择一个使用即可,我个人使用的是 DesertsP 开发的 Valine-Admin 插件,详细使用方式在上面的 Github 地址中有文档说明,请移步阅读。

Valine 1.4.14 版本功能及界面美化(持续更新)

这个界面美化基本是萝卜白菜各有所爱了,有人喜欢原生 Valine 的 『素』,也有人喜欢根据自己的喜好进行美化。以下均是针对我的留言区样式进行的美化,如果你也是 v1.4.14 版本,你可以直接使用以下样式。

2020/06/26 更新:本站切换到 MiniValine 插件了,以下的配置信息仍可以在 Valine 1.4.14 版本正常使用。

使用表情包

这个在 Valine 1.4.5 版本时就已经支持自定义表情包功能了,主要是配置 emojiCDNemojiMaps 两个配置项,可以移步文档阅读。

更重要的应该是表情包的来源,这里推荐 xaoxuu 提供的 CDN 表情包接口,覆盖了 arutiebaqqweibo 等表情包。目前原生的表情包使用方法主要是在 emojiCDN 中写路径,emojiMaps 中写映射关系,这样在 js 中添加大量表情包的时候还是感觉写的非常繁琐,所以我建议最好修改 Valine 源码中的配置。

首先在源码中定位到这里,修改原新浪表情包的路径,对应 js 配置中的 emojiCDN 字段:

img

然后定位到这里,可修改表情包的映射路径,对应 js 中的 emojiMaps 字段,前面的 smile 意思为这个表情在评论系统中的名称,后面就是它的实际路径。

img

上面修改源码可以避免在 Valine 的 js 中配置字段 emojiMaps 中写大量繁琐的配置。由于在 js 里面导入,所以我们添加表情包时也不需要一个个手动添加,以上面给出的 xaoxuu 表情包为例,我们可以这么写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function(e,t){
//这里是自定义的一些特殊表情包,提前在这里添加
e.exports={
傲娇:"https://cdn.jsdelivr.net/gh/drew233/cdn/20200409103906.webp",
开心:"https://cdn.jsdelivr.net/gh/drew233/cdn/20200409104757.webp",
扣手手:"https://cdn.jsdelivr.net/gh/drew233/cdn/20200409130304.webp",
仙女下凡:"https://cdn.jsdelivr.net/gh/drew233/cdn/20200409130301.webp",
};

//这三个获取表情包路径名
function aru(str){
return "aru/aru-" + str + ".gif";
}
function tieba(str){
return "tieba/tieba-" + str + ".png";
}
function qq(str) {
return "qq/qq-" + str + ".gif";
}

//这三个写入到表情包路径中
for (var i = 1; i < 54; i++) { //54 是 tieba 表情包的个数
e.exports['tieba-' + i] = tieba(i);
}
for (var i = 1; i < 101; i++) { //101 是 qq 表情包的个数
e.exports['qq-' + i] = qq(i);
}
for (var i = 1; i < 116; i++) { //116 是 aru 表情包的个数
e.exports['aru-' + i] = aru(i);
}
},

JavaScript

Copy

表情包分类

在上面添加表情包后,进行分类应该是我们最直观的想法。但是原生 Valine 在目前并没有提供这个功能,以下我提供一个 MiniValine 可以实现表情包分类功能。

MiniValine 演示地址https://minivaline.github.io/xCss.html!

这个作者提供了两种类型的 Valine 评论插件,一个是 xCss 样式的,也就是原生 Valine 样式的作者;另外一种是 DesertP 样式的,我在之前的 Hexo 博客中也使用过(称为增强版 Valine)。由于现在原生 Valine 的功能已经追上来了,所以我切换回了 xCss 写的原生 Valine 插件。

扯远了,话说回来,如果要使用这种自带表情包分类功能的 Valine 插件的话,可以参考作者提供的 Github 文档,另外,这版的 MiniValine 不仅有表情包分类,下面要提供的博主、小伙伴标识之类的功能都已经集成了,还是很好用的。

注意:这个魔改后的 MiniValine 目前存在的问题还较多,作者开发的时间较短,我切换过该版本一段时间,整体样式非常好看,但是有些问题我难以忽略,此处根据个人需求去使用。

在 veditor 输入界面增加背景图

这个图是我抄的 drew 叔的(😅就是这么好意思),之前找了很多图,都觉得不是很好看,选来选去最后还是用 drew 叔的感觉比较好看。建议大家在找图的时候最好找白色背景或者透明背景的,不然看起来很难看。

使用方法如下,将 CSS 加到你的博客样式文件中。

1
2
3
4
5
6
7
8
#veditor {
background-image: url(https://cdn.jsdelivr.net/gh/drew233/cdn/20200409110727.webp);
background-size: contain;
background-repeat: no-repeat;
background-position: right;
background-color: rgba(255, 255, 255, 0);
resize: vertical
}

CSS

Copy

上述的 url 内的图片可以换成自己的。更细节一点,如果评论者在输入框中输入较长的内容,那么背景图会遮住部分文字,这样引起整体观感欠佳。所以可以设置当鼠标聚焦于输入框时,背景图消失,输入框失去焦点时,背景图重新显示,这个逻辑可以直接交给 CSS 完成。

1
2
3
4
#veditor:focus{
background-position-y: 200px;
transition: all 0.2s ease-in-out 0s;
}

CSS

Copy

其中的 200px 差不多代表了图片的高度,transition 中的 0.2s 代表了消失的时间,可以根据自己的图片进行调整。当然,这个操作也可以交给 js 完成,不过略显麻烦,而且动画被省略了。

1
2
3
4
5
6
//可以与 valine 的配置 js 文件放一起,或放置到公共 js 文件中
$("#veditor").focus(function(){$(this).css("background-image","none");});
$("#veditor").blur(function(){
$(this).css("background-image","url(https://cdn.jsdelivr.net/gh/drew233/cdn/20200409110727.webp)");
}
});

JavaScript

Copy

这个就根据自己口味改了,甚至可以模仿 Disqus 把这三个输入框放到与提交按钮在同一行。

使用前请确保 Valine 评论的 div 的 id 是 vcomments,即 <div id="vcomments"></div> 如果是 class 为 vcomments,那么将以下的 # 换成 . 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#vcomments .vheader .vnick {
width: 31%;
border: 2px solid #dedede;
padding-left: 10px;
padding-right: 10px;
border-radius: 5px
}

#vcomments .vheader .vmail {
width: 31%;
border: 2px solid #dedede;
margin-left: 34px;
padding-left: 10px;
padding-right: 10px;
border-radius: 5px
}

#vcomments .vheader .vlink {
width: 31%;
border: 2px solid #dedede;
margin-left: 34px;
padding-left: 10px;
padding-right: 10px;
border-radius: 5px
}

CSS

Copy

鼠标放置头像旋转

这个比较简单,也可以给博客添加一些动态性。

1
2
3
4
5
6
7
8
9
10
11
img.vimg {
transition: all 1s /* 旋转时间为 1s */
}

img.vimg:hover {
transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-o-transform: rotate(360deg);
-ms-transform: rotate(360deg);
}

CSS

Copy

评论卡片式背景

这个看我评论区样式就知道了,这里就不放图了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#vcomments .vcards .vcard {
padding: 15px 20px 0 20px;
border-radius: 10px;
margin-bottom: 15px;
box-shadow: 0 0 4px 1px rgba(0, 0, 0, .12);
transition: all .3s
}

#vcomments .vcards .vcard:hover {
box-shadow: 0 0 8px 3px rgba(0, 0, 0, .12)
}

#vcomments .vcards .vcard .vh .vcard {
border: none;
box-shadow: none;
}

CSS

Copy

增加博主、小伙伴标识以及浏览器图标

这个原生的 Valine 就不支持了,我们需要使用魔改的 Valine 文件,可以直接将原生的 Valine 替换为以下的 Valine.min.js 文件。

1
2
//魔改版 Valine.min.js
https://cdn.jsdelivr.net/gh/HCLonely/Valine@latest/dist/Valine.min.js

HTML

Copy

与原生的相比,多了以下功能:

  1. 添加博主,小伙伴,访客标签
  2. 添加浏览器和操作系统图标,需引入 fontawesome v5.0+ 的 CSS 样式
  3. 邮箱检测更严格
  4. 增加 QQ 邮箱识别(原版只能通过昵称栏输入 QQ 号识别)
  5. meta placeholder 可自定义

使用方法与原生的类似,不同的是可以多设置几个参数:

参数 类型 说明 默认 示例
tagMeta Array 标签要显示的文字 [“博主”,“小伙伴”,“访客”] [“博主”,”小伙伴”,”访客”]
master Array/String md5 加密后的博主邮箱 [] [“fe01ce2a7fbac8fafaed7c982a04e229”]
friends Array md5 加密后的小伙伴邮箱 [] [“fe01ce2a7fbac8fafaed7c982a04e229”]
metaPlaceholder Object meta placeholder 内容 {} {“nick”:“昵称 / QQ 号”,“mail”:“邮箱 (必填)”}
verify Boolean 评论时是否需要验证,需 jQuery 支持 false true

举个例子,我们可以在 Valine 的配置 js 中增加字段如下:

1
2
3
4
5
6
7
8
9
10
11
12
 new Valine({
el: '#vcomments',
appId: '',
appKey: '',
+ master: '48c8f1e79dd340e4b247820fee013082', //博主邮箱md5
+ tagMeta: ["博主","小伙伴","访客"], //标识字段名
+ friends: ["fe01ce2a7fbac8fafaed7c982a04e229","fe01ce2a7fbac8fafaed7c982a04e229"], //小伙伴邮箱Md5
metaPlaceholder: {"nick":"昵称/QQ号","mail":"邮箱(完全保密)"},
placeholder: "填写邮箱可以及时收到回复哦(●'◡'●)",
avatar: 'wavatar',
enableQQ: true,
});

Diff

Copy

以上在 Valine 的配置中加入参数就可以实现了,并且不影响原生的其它参数。MD5 加密可以推荐一个在线生成网站,不过 MD5 前端单次加密本身不安全,但是安不安全是相对的,只有邮箱信息本身价值不大。如果对博客安全要求比较高,希望留言的小伙伴邮箱不被泄露(这当然无法完全避免),那么还是不建议使用这个。

微信/QQ 通知评论消息

这个功能主要是用 Service 酱完成的,可以实现通过微信或者 qq 提示你的博客收到了评论。原作者小康博客已经写的非常详细了,如果需要开启这个功能,可以移步去阅读,我这里就不再花大篇幅赘述这个功能。