getOne('vote', "id = $topicId"); if (!$vote) { ajaxReturn(1, '投票不存在'); } // 验证投票状态 $now = date('Y-m-d H:i:s'); if ($vote['status'] != 1) { ajaxReturn(1, '该投票已被禁用'); } if ($vote['statime'] > $now) { ajaxReturn(1, '该投票尚未开始'); } if ($vote['endtime'] < $now) { ajaxReturn(1, '该投票已经结束'); } // 检查用户是否已投票 $hasVoted = $db->count('recs', "topic_id = $topicId AND user_id = {$user['id']}"); if ($hasVoted > 0) { ajaxReturn(1, '您已经参与过该投票'); } // 验证选项数量 if ($vote['itype'] == 1 && count($options) > $vote['maxtime']) { ajaxReturn(1, "最多只能选择 {$vote['maxtime']} 项"); } // 验证选项是否存在 foreach ($options as $optionId) { $option = $db->getOne('xuan', "id = $optionId AND topic_id = $topicId"); if (!$option) { ajaxReturn(1, '选项不存在'); } } // 开始事务 $db->startTransaction(); try { // 添加投票记录 $ip = $_SERVER['REMOTE_ADDR']; $time = date('Y-m-d H:i:s'); foreach ($options as $optionId) { $result = $db->insert('recs', [ 'topic_id' => $topicId, 'user_id' => $user['id'], 'option_id' => $optionId, 'vote_time' => $time, 'ip' => $ip ]); if (!$result) { throw new Exception('提交投票失败'); } } // 记录日志 writeLog($user['id'], 'vote', "参与投票:{$vote['title']}"); // 提交事务 $db->commit(); ajaxReturn(0, '投票成功'); } catch (Exception $e) { // 回滚事务 $db->rollback(); ajaxReturn(1, $e->getMessage()); } break; // 检查是否已投票 case 'checkVoted': // 验证权限 $user = checkAuth('checkVoted'); if (!$user) { exit; } // 获取参数 $topicId = isset($_REQUEST['topic_id']) ? intval($_REQUEST['topic_id']) : 0; // 参数验证 if (empty($topicId)) { ajaxReturn(1, '参数错误'); } // 检查用户是否已投票 $hasVoted = $db->count('recs', "topic_id = $topicId AND user_id = {$user['id']}"); ajaxReturn(0, '查询成功', ['hasVoted' => $hasVoted > 0]); break; // 获取投票结果 case 'getResult': // 获取参数 $topicId = isset($_REQUEST['topic_id']) ? intval($_REQUEST['topic_id']) : 0; // 参数验证 if (empty($topicId)) { ajaxReturn(1, '参数错误'); } // 获取投票信息 $vote = $db->getOne('vote', "id = $topicId"); if (!$vote) { ajaxReturn(1, '投票不存在'); } // 获取选项列表 $options = $db->getAll('xuan', "topic_id = $topicId", '*', 'sort ASC, id ASC'); if (empty($options)) { ajaxReturn(1, '暂无投票选项'); } // 获取投票结果 $sql = "SELECT option_id, COUNT(*) as vote_count FROM " . $db->table('recs') . " WHERE topic_id = $topicId GROUP BY option_id"; $result = $db->query($sql); $voteResults = []; $totalVotes = 0; if ($result) { while ($row = $result->fetch_assoc()) { $voteResults[$row['option_id']] = $row['vote_count']; $totalVotes += $row['vote_count']; } } // 格式化结果 $formattedResults = []; foreach ($options as $option) { $voteCount = isset($voteResults[$option['id']]) ? $voteResults[$option['id']] : 0; $percentage = $totalVotes > 0 ? round(($voteCount / $totalVotes) * 100, 1) : 0; $formattedResults[] = [ 'id' => $option['id'], 'name' => $option['name'], 'count' => $voteCount, 'percentage' => $percentage ]; } // 用户是否已投票 $hasVoted = false; $userVotes = []; if (isset($_SESSION['user']) && !empty($_SESSION['user']['id'])) { $userId = $_SESSION['user']['id']; $userVoteRecords = $db->getAll('recs', "topic_id = $topicId AND user_id = $userId"); if (!empty($userVoteRecords)) { $hasVoted = true; foreach ($userVoteRecords as $record) { $userVotes[] = $record['option_id']; } } } ajaxReturn(0, '获取成功', [ 'vote' => $vote, 'options' => $options, 'results' => $formattedResults, 'totalVotes' => $totalVotes, 'hasVoted' => $hasVoted, 'userVotes' => $userVotes ]); break; // 未知操作 default: ajaxReturn(1, '未知操作'); break; }