如何用 PHP 给 emaction 写个传参 API

146天前890

前段时间终于把 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=fakeidhttps://your-domain/php 文件/reaction?targetId=fakeid&reaction_name=smile-face&diff=1 来测试你的 API。

若无意外的话,你只要在 <emoji-reaction> 里加入 endpoint 赋值为你自己的 API,即可把数据保存到自己的数据库。

如果你想更牛逼一点,甚至可以直接再写个后台管理你的点赞数和点赞文章页面。

当然,这只是一个很简单的 API 示例,如果你想更完善、更安全、更高效,也欢迎自行修改。

* 若非特殊说明,本站文章均为博主原创,码字不易,如需转载,请注明出处!有疑问可留言交流,谢谢。

PHPSQLAPI15 

如何用 PHP 给 emaction 写个传参 API - Jdeal | Life is like a Design.