You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用PHP MySQL如何实现重启应用后点赞按钮状态保留?

实现点赞按钮状态持久化的方案

核心逻辑是将用户的点赞关系落地存储,页面加载时主动读取存储的状态来渲染按钮样式,完整实现步骤如下:

1. 调整数据库结构

新增点赞关联表存储用户和内容的绑定关系,避免重复记录:

CREATE TABLE `user_likes` (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `user_id` int UNSIGNED NOT NULL COMMENT '点赞用户ID,未登录场景可替换为设备唯一标识device_uuid',
  `content_id` int UNSIGNED NOT NULL COMMENT '被点赞内容的ID',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `unique_user_content` (`user_id`, `content_id`) COMMENT '唯一键避免重复点赞'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

如果支持未登录用户点赞,可生成唯一的设备ID存在用户本地Cookie中,用该ID替代user_id字段存储即可。

2. 页面渲染时查询点赞状态

渲染内容页时,同步查询当前用户对内容的点赞状态,传递给前端模板:

session_start();
// 取当前登录用户ID,未登录场景取Cookie中的设备ID
$userId = $_SESSION['user_id'] ?? $_COOKIE['device_uuid'] ?? 0;
$contentId = 123; // 替换为当前页面对应的内容ID
$isLiked = false;

if ($userId) {
    // 查询是否存在点赞记录
    $stmt = $pdo->prepare("SELECT id FROM user_likes WHERE user_id = ? AND content_id = ?");
    $stmt->execute([$userId, $contentId]);
    $isLiked = $stmt->rowCount() > 0;
}

3. 前端根据状态渲染按钮样式

直接用后端传递的状态值给按钮绑定对应高亮类:

<button class="like-btn <?php echo $isLiked ? 'liked' : ''; ?>" data-content-id="<?php echo $contentId; ?>">点赞</button>

提前写好对应的CSS样式:

.like-btn {
  color: #666;
  border: none;
  background: none;
}
.like-btn.liked {
  color: #ec4141;
}

4. 交互时同步更新状态

用户点击点赞按钮时,先切换前端样式,再发请求更新数据库记录,避免刷新才生效:

document.querySelectorAll('.like-btn').forEach(btn => {
  btn.addEventListener('click', function() {
    const contentId = this.dataset.contentId;
    const isLiked = this.classList.contains('liked');
    // 先切换前端样式
    this.classList.toggle('liked');
    // 发请求同步后端状态
    fetch('/handle_like.php', {
      method: 'POST',
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      body: `content_id=${contentId}&action=${isLiked ? 'cancel' : 'like'}`
    });
  })
})

后端handle_like.php处理逻辑:

session_start();
$userId = $_SESSION['user_id'] ?? $_COOKIE['device_uuid'] ?? 0;
$contentId = $_POST['content_id'] ?? 0;
$action = $_POST['action'] ?? 'like';

if (!$userId || !$contentId) {
    exit(json_encode(['code' => 1, 'msg' => '参数错误']));
}

if ($action === 'like') {
    // 新增点赞记录,IGNORE避免唯一键冲突报错
    $stmt = $pdo->prepare("INSERT IGNORE INTO user_likes (user_id, content_id) VALUES (?, ?)");
    $stmt->execute([$userId, $contentId]);
} else {
    // 取消点赞删除对应记录
    $stmt = $pdo->prepare("DELETE FROM user_likes WHERE user_id = ? AND content_id = ?");
    $stmt->execute([$userId, $contentId]);
}
echo json_encode(['code' => 0, 'msg' => '操作成功']);

内容的提问来源于stack exchange,提问作者Unknoen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:54:00