前段时间终于把 Docker 给修好了,然后装上了 Memos,研究了半天,根据木木的教程折腾的差不多了,虽然这个功能我可能不会常用,但是抱着我可以不用但必须有的态度,还是研究了好一段时间。
其中在折腾单页版 Memos 的时候,看到木木给加上了 emaction.cool 类 Github 的点赞插件,顺势摸到了 emaction.cool 的官网。
上面其实写的很明白,基本上你只要引用下 CDN ,外加在你想显示的地方加上 <emoji-reaction></emoji-reaction> 就完活了,最多如果你想单页面多应用,或者多页面多应用之类的话,再加上 reactionTargetId 作为 ID 即可。
然后看到下面有可以自定义后端部分,来劲了,根据提示,我又摸到了自部署 GitHub 风格的 Reactions 点赞功能这篇文章,然后一脸懵逼的看完了,完全不懂怎么搞啊!(*ps 额,真没玩过文章里写的这些,哈哈,小辣鸡我是。。)
于是乎才有了这篇文章,根据官方的接口文档,自己实现一个 API ,把数据存档到自己的数据库。
本次实现总共分两步:
PHP API 文件
// 连接数据库,此处省略
// 获取特定 targetId 已收到的所有 reactions
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['targetId'])) {
$targetId = $_GET['targetId'];
$stmt = $pdo->prepare("SELECT * FROM reactions WHERE target_id = ?");
$stmt->execute([$targetId]);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 修改输出数据结构
$newResult = [];
foreach ($result as $row) {
$newRow = ['reaction_name' => $row['reaction_name'], 'count' => $row['diff']];
array_push($newResult, $newRow);
}
echo json_encode([
'code' => 0,
'msg' => 'success',
'data' => ['reactionsGot' => $newResult],
]);
}
// 新增或更新 reaction
if ($_SERVER['REQUEST_METHOD'] === 'PATCH' && isset($_GET['targetId'], $_GET['reaction_name'], $_GET['diff'])) {
$targetId = $_GET['targetId'];
$reactionName = $_GET['reaction_name'];
$diff = intval($_GET['diff']);
if (!in_array($diff, [1, -1])) {
$diff = $diff > 0 ? 1 : -1;
}
$stmt = $pdo->prepare("INSERT INTO reactions (target_id, reaction_name, diff) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE diff = diff + ?");
$stmt->execute([$targetId, $reactionName, $diff, $diff]);
$stmt = $pdo->prepare("SELECT * FROM reactions WHERE target_id = ?");
$stmt->execute([$targetId]);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'code' => 0,
'msg' => 'success',
'data' => ['reactionsGot' => $result]
]);
}
接下来在你的数据库中创建一个名为 reactions 的表:
在表页执行 sql 语句:
CREATE TABLE `reactions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`target_id` varchar(255) NOT NULL,
`reaction_name` varchar(255) NOT NULL,
`diff` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `target_id_reaction_name` (`target_id`,`reaction_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
现在,你可以通过访问 https://your-domain/php 文件/reactions?targetId=fakeid 和 https://your-domain/php 文件/reaction?targetId=fakeid&reaction_name=smile-face&diff=1 来测试你的 API。
若无意外的话,你只要在 <emoji-reaction> 里加入 endpoint 赋值为你自己的 API,即可把数据保存到自己的数据库。
如果你想更牛逼一点,甚至可以直接再写个后台管理你的点赞数和点赞文章页面。
当然,这只是一个很简单的 API 示例,如果你想更完善、更安全、更高效,也欢迎自行修改。