版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

关于 Waline

Waline 是一个轻量级、快速且安全的评论系统,适用于静态网站。

其主要特点包括:

  • 轻量级:前端仅约 50KB,加载速度快。

  • 支持 Markdown:支持完整的 Markdown 语法,方便用户撰写格式化评论。

  • 多种部署方式:支持 Vercel、Netlify、CloudBase、Docker 等多种部署方式。

  • 多种存储后端支持:支持 LeanCloud、MongoDB、MySQL、SQLite 等多种数据库。

  • 安全性:具备防刷频、IP 黑名单、评论内容重复检查等安全功能。

  • 社交登录支持:支持 QQ、微信、Telegram 等社交平台登录。

  • 通知功能:支持邮件、微信、QQ、Telegram 等通知方式。

Waline 是开源的,采用 GPL-2.0 许可证。

LeanCloud 设置 (数据库)

创建评论数据存储数据库。

word/media/image1.png

1、登录 或 注册 LeanCloud 国际版 并进入 控制台

https://console.leancloud.app/apps

2、点击左上角 创建应用 并起一个你喜欢的名字 (请选择免费的开发版):

word/media/image2.png

3、进入应用,选择左下角的 设置 > 应用 Key。你可以看到你的 APP ID,APP Key 和 Master Key。请记录它们,以便后续使用。

word/media/image3.png

Vercel 部署 (服务端)

1、点击下面链接,跳转至 Vercel 进行 Server 端部署。

https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwalinejs%2Fwaline%2Ftree%2Fmain%2Fexample

注:如果你未登录的话,Vercel 会让你注册或登录,请使用 GitHub 账户进行快捷登录。

2、安装 Vercel

word/media/image4.png

3、输入一个你喜欢的 Vercel 项目名称并点击 Create 继续:

word/media/image5.png

4、此时 Vercel 会基于 Waline 模板帮助你新建并初始化仓库,仓库名为你之前输入的项目名。

word/media/image6.png

一两分钟后,满屏的烟花会庆祝你部署成功。此时点击 Go to Dashboard 可以跳转到应用的控制台。

word/media/image7.png

5、点击顶部的 Settings - Environment Variables 进入环境变量配置页,并配置三个环境变量 LEAN_ID, LEAN_KEY 和 LEAN_MASTER_KEY 。它们的值分别对应上一步在 LeanCloud 中获得的 APP ID, APP KEY, Master Key。

word/media/image8.png https://vercel.com/cyrus-studios-projects/waline/settings/environment-variables

6、环境变量配置完成之后点击顶部的 Deployments 点击顶部最新的一次部署右侧的 Redeploy 按钮进行重新部署。该步骤是为了让刚才设置的环境变量生效。

word/media/image9.png

7、此时会跳转到 Overview 界面开始部署,等待片刻后 STATUS 会变成 Ready。此时请点击 Visit ,即可跳转到部署好的网站地址,此地址即为你的服务端地址。

word/media/image10.png

点击 Visit 访问 serverURL,可以看到评论输入框,接着把它集成到 hugo

word/media/image11.png

将 Waline 集成到 Hugo

在你的 Hugo 主题中添加 Waline 的前端代码,一般是在 themes\m10c\layouts_default\single.html

1、导入 Waline 样式 https://unpkg.com/@waline/client@v3/dist/waline.css

<head>
  <!-- ... -->
  <link
    rel="stylesheet"
    href="https://unpkg.com/@waline/client@v3/dist/waline.css"
  />
  <!-- ... -->
</head>

2、创建 <script> 标签使用来自 https://unpkg.com/@waline/client@v3/dist/waline.js 的 init() 函数初始化,并传入必要的 el 与 serverURL 选项。

  • el 选项是 Waline 渲染使用的元素,你可以设置一个字符串形式的 CSS 选择器或者一个 HTMLElement 对象。

  • serverURL 是服务端的地址,即上一步获取到的值。

<body>
  <!-- ... -->
  <div id="waline"></div>
  <script type="module">
    import { init } from 'https://unpkg.com/@waline/client@v3/dist/waline.js';

    init({
      el: '#waline',
      serverURL: 'https://your-domain.vercel.app',
    });
  </script>
</body>

修改后如下:

word/media/image12.png 重新 push 代码,等待网站构建完成。

评论服务此时就会在你的网站上成功运行 🎉

word/media/image13.png

Waline 如何区分不同的评论列表

Waline 确实所有评论都提交到同一个 serverURL,如果有很多文章用到,它是如何区分不同的评论列表呢

Waline 会使用你在前端传入的 path 字段(如果未设置,默认使用 location.pathname)来标识是哪一篇文章:

<script type="module">
  import { init } from 'https://unpkg.com/@waline/client@v3/dist/waline.js';

  init({
    el: '#waline',
    serverURL: 'https://waline-15wtwfoa7-cyrus-studios-projects.vercel.app',
    path: location.pathname, // ← 默认就是这个
  });
</script>

举例:

  • /posts/first-post/ 的评论 path = “/posts/first-post/”

  • /posts/second-post/ 的评论 path = “/posts/second-post/”

这样,每篇文章在数据库中会对应一个不同的评论列表,互不干扰。

对应数据库中 Comment 表的 url 字段

word/media/image14.png

Failed to fetch

发表评论发现不能正常,报 401

word/media/image15.png

请求测试返回是一个 Vercel 的登录页面

word/media/image16.png 原因是默认开启了 Vercel Authentication。

Vercel Authentication 是 Vercel 提供的一个安全功能,主要用于限制对部署内容的访问。

启用后:

  • 访问者在访问部署链接时会被重定向到 Vercel 登录页面。

  • 登录成功后,Vercel 会检查该用户是否是你的团队成员。

  • 非成员用户将无法访问该部署页面。

只需要把 Vercel Authentication 关闭即可。

word/media/image17.png

评论管理 (管理端)

  1. 部署完成后,请访问 /ui/register 进行注册。首个注册的人会被设定成管理员。

  2. 管理员登陆后,即可看到评论管理界面。在这里可以修改、标记或删除评论。

  3. 用户也可通过评论框注册账号,登陆后会跳转到自己的档案页。

word/media/image18.png

访问 <serverURL>/ui 进入评论管理页面。

浏览量统计

编辑 themes\m10c\layouts_default\single.html

1. 在合适位置添加页面浏览量 DOM 元素

找到你想显示“阅读量”的位置,比如 post-meta 内,可以插入:

  <div>
    <span class="meta-item">
      {{ partial "icon.html" (dict "ctx" $ "name" "eye") }}
      阅读量: <span class="waline-pageview-count" data-path="{{ .RelPermalink }}"></span>
    </span>
  </div>

这将为当前文章动态生成唯一的 data-path,供 Waline 使用。

2. 更新 Waline 初始化代码,添加 path 和启用 pageview: true

你已有的初始化代码中应补充如下内容:

<script type="module">
  import { init } from 'https://unpkg.com/@waline/client@v3/dist/waline.js';

  init({
    el: '#waline',
    serverURL: 'https://waline-15wtwfoa7-cyrus-studios-projects.vercel.app',
    path: location.pathname, // ← 当前页面路径
    pageview: true,          // ← 启用浏览量统计
  });
</script>

修改完成后,重新 push 代码。

构建完成后,可以看到效果如下:

word/media/image19.png

参考:https://waline.js.org/guide/features/pageview.html

完整源码

开源地址:https://github.com/CYRUS-STUDIO/blog