从 Isso 迁移到 Waline

之前很长一段时间都是使用 Isso 作为评论系统,最近发现了一个 Valine 的替代品:Waline,更加符合需求,花了一个周末迁移了一下,写了个脚本,记录一下。

先说下 Waline 的特性,也是比较吸引我的点:

  • 支持 Markdown、表情、公式
  • 支持内容校验、防灌水
  • 允许匿名、也支持登录
  • 可以完全自托管独立部署
  • 支持浏览量统计
  • 多种通知方式

不过还有两个问题目前没有已经搞定:

1、首页显示评论数的字样是 Waline: 10 想修改为 评论数: 10,解决方案是创建 source/_data/languages.yml 文件,内容为:

1
2
3
4
zh-CN:
post:
comments:
waline: 评论数

2、在 Next 主题下,会连发两个请求,导致数据库重复,提 Issue 之后作者修复了!

部署配置

部署过程不赘述,官方文档很清晰,我采用 docker 部署,SQLite 数据库。不过官方文档中没找到如何对接 Next 主题,从 Github 仓库中找到描述,详见这里

此外有些东西文档里没有说,研究之后发现的,关于暗黑模式,因为我已经在 Next v8 主题中开启了,这里只需要在 waline: 配置下加上 dark: "auto" 即可,其他参数介绍可见 这篇文档

部署完成之后也不需要使用基于 leancloud 的浏览量统计插件了!

从 Isso 迁移

代码和说明见 https://github.com/zhangnew/isso_to_waline,脚本用于从 Isso 的 SQLite 数据读取评论,生成 Waline 需要的 json 格式。

脚本开头有些配置项,根据自己需要修改即可。

Waline 导入会覆盖所有数据,所以一定要先导出,并做好备份!!!

限制

isso 只支持二级回复,所以导出评论中的二级回复,回复@的都是一级回复的人(也就是层主)

如果需要完善,可以手动修改数据库 wl_Comment 表,修改点有 2 个字段、三处:

  • comment 字段:@ 后面的内容
  • comment 字段:# 后面的内容
  • pid 字段,值同上

对应的都改成回复的真实对象。如果评论很多,改起来还是比较麻烦的,不过有这个需求的人应该很少吧,欢迎 PR~

如有其他问题可以提 Issue 或者本文下面评论区见~

更新

来自 Waline 开发者在 Issue 提供的方案,直接导数据库,看起来更方便,未测试:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
CREATE TABLE "wl_Comment" (
"id" INTEGER,
"user_id" INTEGER,
"comment" TEXT,
"insertedAt" DATETIME DEFAULT (datetime('now', 'localtime')),
"ip" TEXT,
"link" TEXT,
"mail" TEXT,
"nick" TEXT,
"pid" INTEGER,
"rid" INTEGER,
"status" TEXT NOT NULL,
"ua" TEXT,
"url" TEXT,
"createdAt" DATETIME DEFAULT (datetime('now', 'localtime')),
"updatedAt" DATETIME DEFAULT (datetime('now', 'localtime')),
PRIMARY KEY("id" AUTOINCREMENT)
);
CREATE TABLE "wl_Counter" (
"id" INTEGER,
"time" INTEGER,
"url" TEXT,
"createdAt" DATETIME DEFAULT (datetime('now', 'localtime')),
"updatedAt" DATETIME DEFAULT (datetime('now', 'localtime')),
PRIMARY KEY("id" AUTOINCREMENT)
);
CREATE TABLE "wl_Users" (
"id" INTEGER,
"display_name" TEXT NOT NULL,
"email" TEXT NOT NULL,
"password" TEXT NOT NULL,
"type" TEXT NOT NULL,
"github" TEXT,
"avatar" TEXT,
"url" TEXT,
"createdAt" DATETIME DEFAULT (datetime('now', 'localtime')),
"updatedAt" DATETIME DEFAULT (datetime('now', 'localtime')),
PRIMARY KEY("id" AUTOINCREMENT)
);
INSERT INTO `wl_Comment` (
`id`,
`user_id`,
`comment`,
`ip`,
`link`,
`mail`,
`nick`,
`pid`,
`rid`,
`status`,
`ua`,
`url`,
`insertedAt`,
`createdAt`,
`updatedAt`
) SELECT
`comments`.`id` as `id`,
NULL as `user_id`,
`text` as `comment`,
`remote_addr` as `ip`,
`website` as `link`,
`email` as `mail`,
`author` as `nick`,
`parent` as `pid`,
`parent` as `rid`,
"approved" as `status`,
NULL as `ua`,
`threads`.`uri` as `url`,
datetime(`created`, "unixepoch") as `insertedAt`,
datetime(`created`, "unixepoch") as `createdAt`,
datetime(`created`, "unixepoch") as `updatedAt`
FROM `comments` LEFT JOIN `threads` ON `threads`.`id` = `comments`.`tid`;