1572 行
55 KiB
PHP
1572 行
55 KiB
PHP
<?php
|
||
// 启动会话
|
||
session_start();
|
||
|
||
// 设置CORS头
|
||
header('Access-Control-Allow-Origin: *');
|
||
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
|
||
header('Access-Control-Allow-Headers: Content-Type');
|
||
|
||
// 处理OPTIONS请求
|
||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
||
exit;
|
||
}
|
||
|
||
// 引入模块
|
||
require_once 'config.php';
|
||
require_once 'modules/user.php';
|
||
require_once 'modules/message.php';
|
||
require_once 'modules/friend.php';
|
||
require_once 'modules/group.php';
|
||
|
||
// 获取配置
|
||
$config = include 'config.php';
|
||
|
||
// 设置响应头
|
||
header('Content-Type: application/json');
|
||
|
||
// 检查用户是否已登录
|
||
function checkLogin() {
|
||
if (!isLoggedIn()) {
|
||
echo json_encode(['success' => false, 'message' => '用户未登录']);
|
||
exit;
|
||
}
|
||
}
|
||
|
||
// 获取当前登录用户ID
|
||
function getCurrentUserId() {
|
||
return $_SESSION['user_id'];
|
||
}
|
||
|
||
// 网页信息缓存
|
||
$pageInfoCache = [];
|
||
|
||
// 获取网页OG信息
|
||
function fetchPageOGInfo($url) {
|
||
global $pageInfoCache;
|
||
|
||
// 检查缓存
|
||
$cacheKey = md5($url);
|
||
if (isset($pageInfoCache[$cacheKey])) {
|
||
return $pageInfoCache[$cacheKey];
|
||
}
|
||
|
||
$result = [
|
||
'title' => '',
|
||
'description' => '',
|
||
'image' => null,
|
||
'site_name' => '',
|
||
'favicon' => ''
|
||
];
|
||
|
||
try {
|
||
// 解析URL获取域名
|
||
$urlParts = parse_url($url);
|
||
$scheme = isset($urlParts['scheme']) ? $urlParts['scheme'] : 'https';
|
||
$host = isset($urlParts['host']) ? $urlParts['host'] : '';
|
||
$origin = $scheme . '://' . $host;
|
||
|
||
// 设置默认favicon
|
||
$result['favicon'] = $origin . '/favicon.ico';
|
||
$result['site_name'] = $host;
|
||
|
||
// 使用cURL获取网页内容
|
||
$ch = curl_init();
|
||
curl_setopt($ch, CURLOPT_URL, $url);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // 减少超时时间
|
||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); // 减少连接超时
|
||
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||
curl_setopt($ch, CURLOPT_HEADER, false);
|
||
curl_setopt($ch, CURLOPT_NOBODY, false);
|
||
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
|
||
|
||
$html = curl_exec($ch);
|
||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||
curl_close($ch);
|
||
|
||
if ($httpCode !== 200 || !$html) {
|
||
// 获取失败,返回基本信息
|
||
$result['title'] = $host;
|
||
$pageInfoCache[$cacheKey] = $result;
|
||
return $result;
|
||
}
|
||
|
||
// 创建DOMDocument对象解析HTML
|
||
$dom = new DOMDocument();
|
||
libxml_use_internal_errors(true);
|
||
|
||
// 尝试加载HTML,处理编码问题
|
||
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
|
||
|
||
if (@$dom->loadHTML($html)) {
|
||
// 清除错误
|
||
libxml_clear_errors();
|
||
|
||
// 解析meta标签
|
||
$metas = $dom->getElementsByTagName('meta');
|
||
|
||
foreach ($metas as $meta) {
|
||
$property = $meta->getAttribute('property');
|
||
$name = $meta->getAttribute('name');
|
||
$content = $meta->getAttribute('content');
|
||
|
||
if (empty($content)) continue;
|
||
|
||
// 解析OG标签
|
||
switch ($property) {
|
||
case 'og:title':
|
||
$result['title'] = trim($content);
|
||
break;
|
||
case 'og:description':
|
||
$result['description'] = trim($content);
|
||
break;
|
||
case 'og:image':
|
||
$result['image'] = trim($content);
|
||
break;
|
||
case 'og:site_name':
|
||
$result['site_name'] = trim($content);
|
||
break;
|
||
}
|
||
|
||
// 解析Twitter卡片标签
|
||
switch ($name) {
|
||
case 'twitter:title':
|
||
if (empty($result['title'])) {
|
||
$result['title'] = trim($content);
|
||
}
|
||
break;
|
||
case 'twitter:description':
|
||
if (empty($result['description'])) {
|
||
$result['description'] = trim($content);
|
||
}
|
||
break;
|
||
case 'twitter:image':
|
||
if (empty($result['image'])) {
|
||
$result['image'] = trim($content);
|
||
}
|
||
break;
|
||
}
|
||
|
||
// 解析description
|
||
if ($name === 'description' && empty($result['description'])) {
|
||
$result['description'] = trim($content);
|
||
}
|
||
}
|
||
|
||
// 如果没有找到OG title,尝试获取HTML title标签
|
||
if (empty($result['title'])) {
|
||
$titles = $dom->getElementsByTagName('title');
|
||
if ($titles->length > 0) {
|
||
$result['title'] = trim($titles->item(0)->nodeValue);
|
||
}
|
||
}
|
||
|
||
// 如果还是没有title,使用域名
|
||
if (empty($result['title'])) {
|
||
$result['title'] = $host;
|
||
}
|
||
|
||
// 处理相对路径的图片URL
|
||
if (!empty($result['image'])) {
|
||
if (strpos($result['image'], 'http') !== 0) {
|
||
if (strpos($result['image'], '//') === 0) {
|
||
$result['image'] = $scheme . ':' . $result['image'];
|
||
} elseif (strpos($result['image'], '/') === 0) {
|
||
$result['image'] = $origin . $result['image'];
|
||
} else {
|
||
$path = isset($urlParts['path']) ? dirname($urlParts['path']) : '/';
|
||
$result['image'] = $origin . $path . '/' . $result['image'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 缓存结果
|
||
$pageInfoCache[$cacheKey] = $result;
|
||
return $result;
|
||
|
||
} catch (Exception $e) {
|
||
// 发生异常,返回基本信息
|
||
$urlParts = parse_url($url);
|
||
$host = isset($urlParts['host']) ? $urlParts['host'] : $url;
|
||
$scheme = isset($urlParts['scheme']) ? $urlParts['scheme'] : 'https';
|
||
|
||
$result['title'] = $host;
|
||
$result['site_name'] = $host;
|
||
$result['favicon'] = $scheme . '://' . $host . '/favicon.ico';
|
||
|
||
// 缓存错误结果
|
||
$pageInfoCache[$cacheKey] = $result;
|
||
return $result;
|
||
}
|
||
}
|
||
|
||
// 处理API请求
|
||
$action = isset($_GET['action']) ? $_GET['action'] : (isset($_POST['action']) ? $_POST['action'] : '');
|
||
|
||
switch ($action) {
|
||
// 获取GitHub登录配置
|
||
case 'getGitHubConfig':
|
||
$githubConfig = $config['github'] ?? [];
|
||
echo json_encode(['success' => true, 'config' => $githubConfig]);
|
||
break;
|
||
|
||
// 获取QQ登录配置
|
||
case 'getQQConfig':
|
||
$qqConfig = $config['qq'] ?? [];
|
||
echo json_encode(['success' => true, 'config' => $qqConfig]);
|
||
break;
|
||
|
||
// 获取微软登录配置
|
||
case 'getMicrosoftConfig':
|
||
$microsoftConfig = $config['microsoft'] ?? [];
|
||
echo json_encode(['success' => true, 'config' => $microsoftConfig]);
|
||
break;
|
||
|
||
// 获取Discord登录配置
|
||
case 'getDiscordConfig':
|
||
$discordConfig = $config['discord'] ?? [];
|
||
echo json_encode(['success' => true, 'config' => $discordConfig]);
|
||
break;
|
||
|
||
// 设置备注
|
||
case 'setNote':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$targetId = $_POST['target_id'] ?? '';
|
||
$targetType = $_POST['target_type'] ?? '';
|
||
$note = $_POST['note'] ?? '';
|
||
|
||
if (!$targetId || !$targetType) {
|
||
echo json_encode(['success' => false, 'message' => '缺少必要参数']);
|
||
break;
|
||
}
|
||
|
||
$db = Database::getInstance();
|
||
$currentTime = time();
|
||
|
||
// 确保notes表存在
|
||
$db->query("CREATE TABLE IF NOT EXISTS notes (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
user_id TEXT NOT NULL,
|
||
target_id TEXT NOT NULL,
|
||
target_type TEXT NOT NULL,
|
||
note TEXT DEFAULT '',
|
||
created_at INTEGER NOT NULL,
|
||
updated_at INTEGER NOT NULL,
|
||
UNIQUE(user_id, target_id, target_type)
|
||
)");
|
||
|
||
// 先检查是否已存在备注
|
||
$existing = $db->query("SELECT id FROM notes WHERE user_id = :user_id AND target_id = :target_id AND target_type = :target_type", [
|
||
'user_id' => $userId,
|
||
'target_id' => $targetId,
|
||
'target_type' => $targetType
|
||
]);
|
||
|
||
if (!empty($existing)) {
|
||
// 更新现有备注
|
||
$result = $db->execute("UPDATE notes SET note = :note, updated_at = :updated_at WHERE user_id = :user_id AND target_id = :target_id AND target_type = :target_type", [
|
||
'note' => $note,
|
||
'updated_at' => $currentTime,
|
||
'user_id' => $userId,
|
||
'target_id' => $targetId,
|
||
'target_type' => $targetType
|
||
]);
|
||
} else {
|
||
// 插入新备注
|
||
$result = $db->execute("INSERT INTO notes (user_id, target_id, target_type, note, created_at, updated_at) VALUES (:user_id, :target_id, :target_type, :note, :created_at, :updated_at)", [
|
||
'user_id' => $userId,
|
||
'target_id' => $targetId,
|
||
'target_type' => $targetType,
|
||
'note' => $note,
|
||
'created_at' => $currentTime,
|
||
'updated_at' => $currentTime
|
||
]);
|
||
}
|
||
|
||
echo json_encode(['success' => true, 'message' => '备注设置成功']);
|
||
break;
|
||
|
||
// 获取备注
|
||
case 'getNote':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$targetId = $_GET['target_id'] ?? '';
|
||
$targetType = $_GET['target_type'] ?? '';
|
||
|
||
if (!$targetId || !$targetType) {
|
||
echo json_encode(['success' => false, 'message' => '缺少必要参数']);
|
||
break;
|
||
}
|
||
|
||
$db = Database::getInstance();
|
||
$result = $db->query("SELECT note FROM notes WHERE user_id = :user_id AND target_id = :target_id AND target_type = :target_type", [
|
||
'user_id' => $userId,
|
||
'target_id' => $targetId,
|
||
'target_type' => $targetType
|
||
]);
|
||
|
||
$note = !empty($result) ? $result[0]['note'] : '';
|
||
echo json_encode(['success' => true, 'note' => $note]);
|
||
break;
|
||
|
||
// 添加好友(发送好友请求)
|
||
case 'addFriend':
|
||
checkLogin();
|
||
$username = isset($_POST['username']) ? $_POST['username'] : '';
|
||
$userId = getCurrentUserId();
|
||
|
||
if (addFriend($userId, $username)) {
|
||
echo json_encode(['success' => true, 'message' => '好友请求已发送,请等待对方确认']);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '添加好友失败,用户不存在或已经是好友']);
|
||
}
|
||
break;
|
||
|
||
// 获取用户信息
|
||
case 'getUserInfo':
|
||
checkLogin();
|
||
$username = isset($_POST['username']) ? $_POST['username'] : '';
|
||
|
||
if (!$username) {
|
||
echo json_encode(['success' => false, 'message' => '用户名不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查是否是系统账户
|
||
if ($username === 'Parlz官方') {
|
||
// 返回系统账户信息
|
||
$systemUser = [
|
||
'id' => 100000,
|
||
'username' => 'Parlz官方',
|
||
'avatar' => '',
|
||
'online' => true,
|
||
'is_admin' => true,
|
||
'is_banned' => false
|
||
];
|
||
echo json_encode(['success' => true, 'user' => $systemUser]);
|
||
} else {
|
||
// 获取用户信息
|
||
$userInfo = getUserByUsername($username);
|
||
if ($userInfo) {
|
||
echo json_encode(['success' => true, 'user' => $userInfo]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '用户不存在']);
|
||
}
|
||
}
|
||
break;
|
||
|
||
// 获取IP地理位置
|
||
case 'getIPLocation':
|
||
// 获取用户真实IP
|
||
function getRealIP() {
|
||
$ip = $_SERVER['REMOTE_ADDR'];
|
||
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
|
||
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
|
||
$ip = trim($ips[0]);
|
||
}
|
||
return $ip;
|
||
}
|
||
|
||
$ip = getRealIP();
|
||
|
||
// 简单的IP地理位置映射(可根据需要扩展)
|
||
$location = '未知';
|
||
|
||
// 这里可以添加更复杂的IP地理位置数据库查询
|
||
// 暂时返回IP地址作为位置
|
||
$location = $ip;
|
||
|
||
echo json_encode(['success' => true, 'location' => $location, 'ip' => $ip]);
|
||
break;
|
||
|
||
// 检查好友关系
|
||
case 'checkFriendship':
|
||
checkLogin();
|
||
$friendId = isset($_POST['friendId']) ? $_POST['friendId'] : '';
|
||
$userId = getCurrentUserId();
|
||
|
||
if (!$friendId) {
|
||
echo json_encode(['success' => false, 'message' => '好友ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查是否是好友
|
||
$isFriend = isFriend($userId, $friendId);
|
||
echo json_encode(['success' => true, 'isFriend' => $isFriend]);
|
||
break;
|
||
|
||
// 获取好友请求列表
|
||
case 'getFriendRequests':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$requests = getFriendRequests($userId);
|
||
echo json_encode(['success' => true, 'requests' => $requests]);
|
||
break;
|
||
|
||
// 接受好友请求
|
||
case 'acceptFriendRequest':
|
||
checkLogin();
|
||
$requestId = isset($_POST['requestId']) ? $_POST['requestId'] : '';
|
||
|
||
if (!$requestId) {
|
||
echo json_encode(['success' => false, 'message' => '请求ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (acceptFriendRequest($requestId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '接受好友请求失败']);
|
||
}
|
||
break;
|
||
|
||
// 拒绝好友请求
|
||
case 'rejectFriendRequest':
|
||
checkLogin();
|
||
$requestId = isset($_POST['requestId']) ? $_POST['requestId'] : '';
|
||
|
||
if (!$requestId) {
|
||
echo json_encode(['success' => false, 'message' => '请求ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (rejectFriendRequest($requestId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '拒绝好友请求失败']);
|
||
}
|
||
break;
|
||
|
||
// 踢出好友(删除好友)
|
||
case 'removeFriend':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$friendId = isset($_POST['friendId']) ? $_POST['friendId'] : '';
|
||
|
||
if (!$friendId) {
|
||
echo json_encode(['success' => false, 'message' => '好友ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (removeFriend($userId, $friendId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '删除好友失败']);
|
||
}
|
||
break;
|
||
|
||
// 获取好友列表
|
||
case 'getFriends':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$friends = getFriends($userId);
|
||
echo json_encode(['success' => true, 'friends' => $friends]);
|
||
break;
|
||
|
||
// 获取聊天历史
|
||
case 'getChatHistory':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$targetId = isset($_GET['targetId']) ? $_GET['targetId'] : '';
|
||
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
|
||
$limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 20;
|
||
$olderThan = isset($_GET['olderThan']) ? (int)$_GET['olderThan'] : null;
|
||
$isGroup = isset($_GET['isGroup']) ? ($_GET['isGroup'] === 'true') : false;
|
||
|
||
if (!$targetId) {
|
||
echo json_encode(['success' => false, 'message' => '目标ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
$result = getChatHistory($userId, $targetId, $page, $limit, $olderThan, $isGroup);
|
||
echo json_encode(['success' => true, 'messages' => $result['messages'], 'hasMore' => $result['hasMore']]);
|
||
break;
|
||
|
||
// 发送消息
|
||
case 'sendMessage':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
|
||
$content = isset($_POST['content']) ? $_POST['content'] : '';
|
||
$quote = isset($_POST['quote']) ? json_decode($_POST['quote'], true) : null;
|
||
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
|
||
|
||
if (!$targetId || !$content) {
|
||
echo json_encode(['success' => false, 'message' => '目标ID和消息内容不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否在群组中被禁言
|
||
if ($isGroup) {
|
||
if (isUserMuted($targetId, $userId)) {
|
||
echo json_encode(['success' => false, 'message' => '您已被禁言,无法发送消息']);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (sendMessage($userId, $targetId, $content, false, $quote, $isGroup)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '发送消息失败']);
|
||
}
|
||
break;
|
||
|
||
// 获取未读消息
|
||
case 'getUnreadMessages':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$messages = getUnreadMessages($userId);
|
||
echo json_encode(['success' => true, 'messages' => $messages]);
|
||
break;
|
||
|
||
// 标记消息为已读
|
||
case 'markAsRead':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$senderId = isset($_GET['senderId']) ? $_GET['senderId'] : '';
|
||
|
||
if (!$senderId) {
|
||
echo json_encode(['success' => false, 'message' => '发送者ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (markMessagesAsRead($userId, $senderId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '标记消息失败']);
|
||
}
|
||
break;
|
||
|
||
// 标记消息为已送达
|
||
case 'markAsDelivered':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$senderId = isset($_GET['senderId']) ? $_GET['senderId'] : '';
|
||
|
||
if (!$senderId) {
|
||
echo json_encode(['success' => false, 'message' => '发送者ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (markMessagesAsDelivered($userId, $senderId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '标记消息失败']);
|
||
}
|
||
break;
|
||
|
||
// 发送图片
|
||
case 'sendImage':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
|
||
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
|
||
|
||
if (!$targetId) {
|
||
echo json_encode(['success' => false, 'message' => '目标ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查是否有文件上传
|
||
if (!isset($_FILES['image']) || $_FILES['image']['error'] !== UPLOAD_ERR_OK) {
|
||
echo json_encode(['success' => false, 'message' => '图片上传失败']);
|
||
break;
|
||
}
|
||
|
||
// 创建图片存储目录
|
||
$uploadDir = __DIR__ . '/uploads/';
|
||
if (!is_dir($uploadDir)) {
|
||
mkdir($uploadDir, 0777, true);
|
||
}
|
||
|
||
// 生成唯一文件名
|
||
$fileExtension = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
|
||
$fileName = uniqid() . '.' . $fileExtension;
|
||
$filePath = $uploadDir . $fileName;
|
||
|
||
// 移动上传文件
|
||
if (move_uploaded_file($_FILES['image']['tmp_name'], $filePath)) {
|
||
// 生成相对路径
|
||
$relativePath = 'uploads/' . $fileName;
|
||
|
||
// 发送图片消息
|
||
if (sendMessage($userId, $targetId, $relativePath, true, null, $isGroup)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
// 删除已上传的图片
|
||
if (file_exists($filePath)) {
|
||
unlink($filePath);
|
||
}
|
||
echo json_encode(['success' => false, 'message' => '发送图片失败']);
|
||
}
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '图片保存失败']);
|
||
}
|
||
break;
|
||
|
||
// 发送附件
|
||
case 'sendAttachment':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
|
||
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
|
||
|
||
if (!$targetId) {
|
||
echo json_encode(['success' => false, 'message' => '目标ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查是否有文件上传
|
||
if (!isset($_FILES['attachment']) || $_FILES['attachment']['error'] !== UPLOAD_ERR_OK) {
|
||
echo json_encode(['success' => false, 'message' => '附件上传失败']);
|
||
break;
|
||
}
|
||
|
||
// 验证文件大小(30MB)
|
||
$maxSize = 30 * 1024 * 1024;
|
||
if ($_FILES['attachment']['size'] > $maxSize) {
|
||
echo json_encode(['success' => false, 'message' => '文件大小不能超过30MB']);
|
||
break;
|
||
}
|
||
|
||
// 验证文件类型
|
||
$validExtensions = ['zip', 'rar', '7z'];
|
||
$fileExtension = strtolower(pathinfo($_FILES['attachment']['name'], PATHINFO_EXTENSION));
|
||
if (!in_array($fileExtension, $validExtensions)) {
|
||
echo json_encode(['success' => false, 'message' => '只能上传zip、rar、7z格式的压缩文件']);
|
||
break;
|
||
}
|
||
|
||
// 创建附件存储目录
|
||
$uploadDir = __DIR__ . '/message_upload/';
|
||
if (!is_dir($uploadDir)) {
|
||
mkdir($uploadDir, 0777, true);
|
||
}
|
||
|
||
// 生成唯一文件名
|
||
$fileName = uniqid() . '.' . $fileExtension;
|
||
$filePath = $uploadDir . $fileName;
|
||
|
||
// 移动上传文件
|
||
if (move_uploaded_file($_FILES['attachment']['tmp_name'], $filePath)) {
|
||
// 生成相对路径
|
||
$relativePath = 'message_upload/' . $fileName;
|
||
|
||
// 发送附件消息
|
||
if (sendMessage($userId, $targetId, $relativePath, false, null, $isGroup)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
// 删除已上传的附件
|
||
if (file_exists($filePath)) {
|
||
unlink($filePath);
|
||
}
|
||
echo json_encode(['success' => false, 'message' => '发送附件失败']);
|
||
}
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '附件保存失败']);
|
||
}
|
||
break;
|
||
|
||
// 更改用户名
|
||
case 'changeUsername':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$newUsername = isset($_POST['newUsername']) ? $_POST['newUsername'] : '';
|
||
|
||
if (!$newUsername) {
|
||
echo json_encode(['success' => false, 'message' => '用户名不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (strlen($newUsername) < 2 || strlen($newUsername) > 20) {
|
||
echo json_encode(['success' => false, 'message' => '用户名长度应在2-20个字符之间']);
|
||
break;
|
||
}
|
||
|
||
if (changeUsername($userId, $newUsername)) {
|
||
// 更新会话中的用户名
|
||
$_SESSION['username'] = $newUsername;
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '用户名已存在']);
|
||
}
|
||
break;
|
||
|
||
// 更改用户简介
|
||
case 'changeBio':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$newBio = isset($_POST['newBio']) ? $_POST['newBio'] : '';
|
||
|
||
if (strlen($newBio) > 200) {
|
||
echo json_encode(['success' => false, 'message' => '简介长度不能超过200个字符']);
|
||
break;
|
||
}
|
||
|
||
if (changeUserBio($userId, $newBio)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '修改简介失败']);
|
||
}
|
||
break;
|
||
|
||
// 更新在线状态
|
||
case 'updateOnlineStatus':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$online = isset($_POST['online']) ? ($_POST['online'] === '1') : true;
|
||
|
||
updateUserOnlineStatus($userId, $online);
|
||
echo json_encode(['success' => true]);
|
||
break;
|
||
|
||
// 撤回消息
|
||
case 'recallMessage':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
|
||
$content = isset($_POST['content']) ? $_POST['content'] : '';
|
||
$messageId = isset($_POST['messageId']) ? $_POST['messageId'] : '';
|
||
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
|
||
|
||
if (!$targetId || (!$content && !$messageId)) {
|
||
echo json_encode(['success' => false, 'message' => '目标ID和消息内容或消息ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (recallMessage($userId, $targetId, $content, $isGroup, $messageId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '撤回消息失败']);
|
||
}
|
||
break;
|
||
|
||
// 举报消息
|
||
case 'reportMessage':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$messageId = isset($_POST['messageId']) ? $_POST['messageId'] : '';
|
||
$reason = isset($_POST['reason']) ? $_POST['reason'] : '';
|
||
|
||
if (!$messageId) {
|
||
echo json_encode(['success' => false, 'message' => '消息ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (reportMessage($messageId, $userId, $reason)) {
|
||
echo json_encode(['success' => true, 'message' => '举报成功,管理员将尽快处理']);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '举报失败,消息不存在或您已举报过']);
|
||
}
|
||
break;
|
||
|
||
// 获取当前头像
|
||
case 'getCurrentAvatar':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
|
||
$avatar = getCurrentUserAvatar($userId);
|
||
echo json_encode(['success' => true, 'avatar' => $avatar]);
|
||
break;
|
||
|
||
// 修改头像
|
||
case 'changeAvatar':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
|
||
// 检查是否有文件上传
|
||
if (!isset($_FILES['avatar']) || $_FILES['avatar']['error'] !== UPLOAD_ERR_OK) {
|
||
echo json_encode(['success' => false, 'message' => '头像上传失败']);
|
||
break;
|
||
}
|
||
|
||
// 创建头像存储目录
|
||
$uploadDir = __DIR__ . '/uploads/avatars/';
|
||
if (!is_dir($uploadDir)) {
|
||
mkdir($uploadDir, 0777, true);
|
||
}
|
||
|
||
// 生成唯一文件名
|
||
$fileExtension = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);
|
||
$fileName = uniqid() . '.' . $fileExtension;
|
||
$filePath = $uploadDir . $fileName;
|
||
|
||
// 移动上传文件
|
||
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $filePath)) {
|
||
// 生成相对路径
|
||
$relativePath = 'uploads/avatars/' . $fileName;
|
||
|
||
// 更新用户头像
|
||
if (updateUserAvatar($userId, $relativePath)) {
|
||
echo json_encode(['success' => true, 'avatar' => $relativePath]);
|
||
} else {
|
||
// 删除已上传的头像
|
||
if (file_exists($filePath)) {
|
||
unlink($filePath);
|
||
}
|
||
echo json_encode(['success' => false, 'message' => '更新头像失败']);
|
||
}
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '头像保存失败']);
|
||
}
|
||
break;
|
||
|
||
// 修改位置
|
||
case 'changeLocation':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$newLocation = isset($_POST['newLocation']) ? $_POST['newLocation'] : '';
|
||
|
||
// 更新用户位置
|
||
$db = Database::getInstance();
|
||
$result = $db->execute("UPDATE users SET last_ip = :last_ip WHERE id = :id", [
|
||
'last_ip' => $newLocation,
|
||
'id' => $userId
|
||
]);
|
||
|
||
if ($result) {
|
||
echo json_encode(['success' => true, 'location' => $newLocation]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '更新位置失败']);
|
||
}
|
||
break;
|
||
|
||
// 群组管理相关接口
|
||
|
||
// 创建群组
|
||
case 'createGroup':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupName = isset($_POST['groupName']) ? $_POST['groupName'] : '';
|
||
$memberIds = isset($_POST['memberIds']) ? json_decode($_POST['memberIds'], true) : [];
|
||
|
||
if (!$groupName) {
|
||
echo json_encode(['success' => false, 'message' => '群组名称不能为空']);
|
||
break;
|
||
}
|
||
|
||
$group = createGroup($userId, $groupName, $memberIds);
|
||
echo json_encode(['success' => true, 'group' => $group]);
|
||
break;
|
||
|
||
// 获取用户群组列表
|
||
case 'getUserGroups':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groups = getUserGroups($userId);
|
||
echo json_encode(['success' => true, 'groups' => $groups]);
|
||
break;
|
||
|
||
// 获取群组成员
|
||
case 'getGroupMembers':
|
||
checkLogin();
|
||
$groupId = isset($_GET['groupId']) ? $_GET['groupId'] : '';
|
||
|
||
if (!$groupId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
$members = getGroupMembers($groupId);
|
||
echo json_encode(['success' => true, 'members' => $members]);
|
||
break;
|
||
|
||
// 添加群成员
|
||
case 'addGroupMember':
|
||
checkLogin();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
|
||
|
||
if (!$groupId || !$userId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID和用户ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (addGroupMember($groupId, $userId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '添加成员失败']);
|
||
}
|
||
break;
|
||
|
||
// 移除群成员
|
||
case 'removeGroupMember':
|
||
checkLogin();
|
||
$currentUserId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
|
||
|
||
if (!$groupId || !$userId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID和用户ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群组管理员
|
||
$userRole = getUserGroupRole($groupId, $currentUserId);
|
||
if ($userRole !== 'admin') {
|
||
echo json_encode(['success' => false, 'message' => '只有群组管理员可以移除成员']);
|
||
break;
|
||
}
|
||
|
||
// 管理员不能移除自己
|
||
if ($currentUserId === $userId) {
|
||
echo json_encode(['success' => false, 'message' => '管理员不能移除自己']);
|
||
break;
|
||
}
|
||
|
||
if (removeGroupMember($groupId, $userId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '移除成员失败']);
|
||
}
|
||
break;
|
||
|
||
// 更新群组信息
|
||
case 'updateGroup':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$groupName = isset($_POST['groupName']) ? $_POST['groupName'] : '';
|
||
|
||
if (!$groupId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群组管理员
|
||
$userRole = getUserGroupRole($groupId, $userId);
|
||
if ($userRole !== 'admin') {
|
||
echo json_encode(['success' => false, 'message' => '只有群组管理员可以修改群组信息']);
|
||
break;
|
||
}
|
||
|
||
$groupData = [];
|
||
if ($groupName) {
|
||
$groupData['name'] = $groupName;
|
||
}
|
||
|
||
if (updateGroup($groupId, $groupData)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '更新群组失败']);
|
||
}
|
||
break;
|
||
|
||
// 删除群组
|
||
case 'deleteGroup':
|
||
checkLogin();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
|
||
if (!$groupId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (deleteGroup($groupId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '删除群组失败']);
|
||
}
|
||
break;
|
||
|
||
// 退出群组
|
||
case 'leaveGroup':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
|
||
if (!$groupId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (leaveGroup($groupId, $userId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '退出群组失败']);
|
||
}
|
||
break;
|
||
|
||
// 禁言/解禁用户
|
||
case 'muteUser':
|
||
checkLogin();
|
||
$currentUserId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
|
||
$muted = isset($_POST['muted']) ? ($_POST['muted'] === 'true') : false;
|
||
|
||
if (!$groupId || !$userId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID和用户ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群组管理员
|
||
$userRole = getUserGroupRole($groupId, $currentUserId);
|
||
if ($userRole !== 'admin') {
|
||
echo json_encode(['success' => false, 'message' => '只有群组管理员可以禁言用户']);
|
||
break;
|
||
}
|
||
|
||
if (muteUser($groupId, $userId, $muted)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '操作失败']);
|
||
}
|
||
break;
|
||
|
||
// 更新成员角色
|
||
case 'updateGroupMemberRole':
|
||
checkLogin();
|
||
$currentUserId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
|
||
$role = isset($_POST['role']) ? $_POST['role'] : '';
|
||
|
||
if (!$groupId || !$userId || !$role) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID、用户ID和角色不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群组管理员
|
||
$userRole = getUserGroupRole($groupId, $currentUserId);
|
||
if ($userRole !== 'admin') {
|
||
echo json_encode(['success' => false, 'message' => '只有群组管理员可以修改成员角色']);
|
||
break;
|
||
}
|
||
|
||
// 不能修改自己的角色
|
||
if ($currentUserId === $userId) {
|
||
echo json_encode(['success' => false, 'message' => '不能修改自己的角色']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群成员
|
||
if (!isGroupMember($groupId, $userId)) {
|
||
echo json_encode(['success' => false, 'message' => '用户不是群成员']);
|
||
break;
|
||
}
|
||
|
||
// 更新用户角色
|
||
$db = Database::getInstance();
|
||
$result = $db->execute("UPDATE group_members SET role = :role WHERE group_id = :groupId AND user_id = :userId", [
|
||
'role' => $role,
|
||
'groupId' => $groupId,
|
||
'userId' => $userId
|
||
]);
|
||
|
||
if ($result) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '操作失败']);
|
||
}
|
||
break;
|
||
|
||
// 通过群号获取群组信息
|
||
case 'getGroupByGroupId':
|
||
checkLogin();
|
||
$group_id = isset($_GET['group_id']) ? $_GET['group_id'] : '';
|
||
|
||
if (!$group_id) {
|
||
echo json_encode(['success' => false, 'message' => '群号不能为空']);
|
||
break;
|
||
}
|
||
|
||
$group = getGroupByGroupId($group_id);
|
||
if ($group) {
|
||
echo json_encode(['success' => true, 'group' => $group]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '群组不存在']);
|
||
}
|
||
break;
|
||
|
||
// 通过群号加入群组
|
||
case 'joinGroupByGroupId':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$group_id = isset($_POST['group_id']) ? $_POST['group_id'] : '';
|
||
|
||
if (!$group_id) {
|
||
echo json_encode(['success' => false, 'message' => '群号不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (joinGroupByGroupId($group_id, $userId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '加入群组失败,可能是群号不存在或您已经是群成员']);
|
||
}
|
||
break;
|
||
|
||
// 修改群头像
|
||
case 'changeGroupAvatar':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
|
||
if (!$groupId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群组管理员
|
||
$userRole = getUserGroupRole($groupId, $userId);
|
||
if ($userRole !== 'admin') {
|
||
echo json_encode(['success' => false, 'message' => '只有群组管理员可以修改群头像']);
|
||
break;
|
||
}
|
||
|
||
// 检查是否有文件上传
|
||
if (!isset($_FILES['avatar']) || $_FILES['avatar']['error'] !== UPLOAD_ERR_OK) {
|
||
echo json_encode(['success' => false, 'message' => '头像上传失败']);
|
||
break;
|
||
}
|
||
|
||
// 创建头像存储目录
|
||
$uploadDir = __DIR__ . '/uploads/group_avatars/';
|
||
if (!is_dir($uploadDir)) {
|
||
mkdir($uploadDir, 0777, true);
|
||
}
|
||
|
||
// 生成唯一文件名
|
||
$fileExtension = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);
|
||
$fileName = uniqid() . '.' . $fileExtension;
|
||
$filePath = $uploadDir . $fileName;
|
||
|
||
// 移动上传文件
|
||
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $filePath)) {
|
||
// 生成相对路径
|
||
$relativePath = 'uploads/group_avatars/' . $fileName;
|
||
|
||
// 更新群组头像
|
||
$groupData = ['avatar' => $relativePath];
|
||
if (updateGroup($groupId, $groupData)) {
|
||
echo json_encode(['success' => true, 'avatar' => $relativePath]);
|
||
} else {
|
||
// 删除已上传的头像
|
||
if (file_exists($filePath)) {
|
||
unlink($filePath);
|
||
}
|
||
echo json_encode(['success' => false, 'message' => '更新群头像失败']);
|
||
}
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '头像保存失败']);
|
||
}
|
||
break;
|
||
|
||
// 邀请好友加入群组
|
||
case 'inviteToGroup':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$friendUsername = isset($_POST['friendUsername']) ? $_POST['friendUsername'] : '';
|
||
$friendId = isset($_POST['userId']) ? $_POST['userId'] : null;
|
||
|
||
if (!$groupId || (!$friendUsername && !$friendId)) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID和好友信息不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群成员
|
||
if (!isGroupMember($groupId, $userId)) {
|
||
echo json_encode(['success' => false, 'message' => '您不是群成员,无法邀请他人']);
|
||
break;
|
||
}
|
||
|
||
// 获取好友用户信息
|
||
if (!$friendId) {
|
||
$friends = getAllUsers();
|
||
foreach ($friends as $friend) {
|
||
if ($friend['username'] === $friendUsername) {
|
||
$friendId = $friend['id'];
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!$friendId) {
|
||
echo json_encode(['success' => false, 'message' => '好友不存在']);
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 邀请好友加入群组
|
||
if (addGroupMember($groupId, $friendId)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '邀请失败,可能是好友已经是群成员']);
|
||
}
|
||
break;
|
||
|
||
// 获取群组分享链接
|
||
case 'getGroupShareLink':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
|
||
if (!$groupId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群成员
|
||
if (!isGroupMember($groupId, $userId)) {
|
||
echo json_encode(['success' => false, 'message' => '您不是群成员,无法分享群组']);
|
||
break;
|
||
}
|
||
|
||
// 获取群组信息
|
||
$group = getGroupById($groupId);
|
||
if (!$group) {
|
||
echo json_encode(['success' => false, 'message' => '群组不存在']);
|
||
break;
|
||
}
|
||
|
||
// 生成分享链接
|
||
$shareLink = 'https://www.parlz.com/join_group.php?group_id=' . $group['group_id'];
|
||
|
||
echo json_encode(['success' => true, 'shareLink' => $shareLink, 'groupName' => $group['name']]);
|
||
break;
|
||
|
||
// 群组公告相关接口
|
||
|
||
// 获取群组公告
|
||
case 'getGroupAnnouncements':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_GET['groupId']) ? $_GET['groupId'] : '';
|
||
|
||
if (!$groupId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群成员
|
||
if (!isGroupMember($groupId, $userId)) {
|
||
echo json_encode(['success' => false, 'message' => '您不是群成员,无法查看群公告']);
|
||
break;
|
||
}
|
||
|
||
// 获取群组信息
|
||
$group = getGroupById($groupId);
|
||
if (!$group) {
|
||
echo json_encode(['success' => false, 'message' => '群组不存在']);
|
||
break;
|
||
}
|
||
|
||
// 获取公告
|
||
$db = Database::getInstance();
|
||
$announcements = $db->query("SELECT * FROM group_announcements WHERE group_id = :groupId ORDER BY created_at DESC", ['groupId' => $groupId]);
|
||
echo json_encode(['success' => true, 'announcements' => $announcements]);
|
||
break;
|
||
|
||
// 创建/更新群组公告
|
||
case 'updateGroupAnnouncement':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$content = isset($_POST['content']) ? $_POST['content'] : '';
|
||
|
||
if (!$groupId || !$content) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID和公告内容不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群组管理员
|
||
$userRole = getUserGroupRole($groupId, $userId);
|
||
if ($userRole !== 'admin') {
|
||
echo json_encode(['success' => false, 'message' => '只有群组管理员可以发布公告']);
|
||
break;
|
||
}
|
||
|
||
// 获取群组信息
|
||
$group = getGroupById($groupId);
|
||
if (!$group) {
|
||
echo json_encode(['success' => false, 'message' => '群组不存在']);
|
||
break;
|
||
}
|
||
|
||
// 构建公告数据
|
||
$announcement = [
|
||
'id' => generateId(),
|
||
'group_id' => $groupId,
|
||
'content' => $content,
|
||
'created_by' => $userId,
|
||
'created_at' => getCurrentTimestamp()
|
||
];
|
||
|
||
// 插入新公告
|
||
$db = Database::getInstance();
|
||
$db->execute("INSERT INTO group_announcements (id, group_id, content, created_by, created_at)
|
||
VALUES (:id, :group_id, :content, :created_by, :created_at)", $announcement);
|
||
|
||
echo json_encode(['success' => true, 'announcement' => $announcement]);
|
||
break;
|
||
|
||
// 删除群组公告
|
||
case 'deleteGroupAnnouncement':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
|
||
$announcementId = isset($_POST['announcementId']) ? $_POST['announcementId'] : '';
|
||
|
||
if (!$groupId || !$announcementId) {
|
||
echo json_encode(['success' => false, 'message' => '群组ID和公告ID不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 检查用户是否是群组管理员
|
||
$userRole = getUserGroupRole($groupId, $userId);
|
||
if ($userRole !== 'admin') {
|
||
echo json_encode(['success' => false, 'message' => '只有群组管理员可以删除公告']);
|
||
break;
|
||
}
|
||
|
||
// 获取群组信息
|
||
$group = getGroupById($groupId);
|
||
if (!$group) {
|
||
echo json_encode(['success' => false, 'message' => '群组不存在']);
|
||
break;
|
||
}
|
||
|
||
// 删除公告
|
||
$db = Database::getInstance();
|
||
$result = $db->execute("DELETE FROM group_announcements WHERE id = :announcementId AND group_id = :groupId", [
|
||
'announcementId' => $announcementId,
|
||
'groupId' => $groupId
|
||
]);
|
||
|
||
if ($result) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '删除公告失败']);
|
||
}
|
||
break;
|
||
|
||
// 获取网页信息(解析OG标签)
|
||
case 'getPageInfo':
|
||
$url = isset($_GET['url']) ? $_GET['url'] : '';
|
||
|
||
if (!$url) {
|
||
echo json_encode(['success' => false, 'message' => 'URL不能为空']);
|
||
break;
|
||
}
|
||
|
||
// 验证URL格式
|
||
if (!filter_var($url, FILTER_VALIDATE_URL)) {
|
||
echo json_encode(['success' => false, 'message' => '无效的URL']);
|
||
break;
|
||
}
|
||
|
||
// 获取网页内容
|
||
$pageInfo = fetchPageOGInfo($url);
|
||
|
||
if ($pageInfo) {
|
||
echo json_encode(['success' => true, 'data' => $pageInfo]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '获取网页信息失败']);
|
||
}
|
||
break;
|
||
|
||
// 管理员获取举报列表
|
||
case 'getReports':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
|
||
// 检查是否是管理员
|
||
if (!isAdmin($userId)) {
|
||
echo json_encode(['success' => false, 'message' => '权限不足']);
|
||
break;
|
||
}
|
||
|
||
$status = isset($_GET['status']) ? $_GET['status'] : null;
|
||
$reports = getReports($status);
|
||
|
||
// 获取每个举报的消息详情和用户信息
|
||
$detailedReports = [];
|
||
foreach ($reports as $report) {
|
||
$message = getReportedMessage($report['message_id']);
|
||
$reporter = getUserById($report['reporter_id']);
|
||
$processedBy = $report['processed_by'] ? getUserById($report['processed_by']) : null;
|
||
|
||
$detailedReports[] = [
|
||
'report' => $report,
|
||
'message' => $message,
|
||
'reporter' => $reporter,
|
||
'processed_by' => $processedBy
|
||
];
|
||
}
|
||
|
||
echo json_encode(['success' => true, 'reports' => $detailedReports]);
|
||
break;
|
||
|
||
// 管理员处理举报
|
||
case 'processReport':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
|
||
// 检查是否是管理员
|
||
if (!isAdmin($userId)) {
|
||
echo json_encode(['success' => false, 'message' => '权限不足']);
|
||
break;
|
||
}
|
||
|
||
$reportId = isset($_POST['reportId']) ? $_POST['reportId'] : '';
|
||
$action = isset($_POST['action']) ? $_POST['action'] : '';
|
||
$reason = isset($_POST['reason']) ? $_POST['reason'] : '';
|
||
|
||
if (!$reportId || !$action) {
|
||
echo json_encode(['success' => false, 'message' => '举报ID和操作不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (processReport($reportId, $userId, $action, $reason)) {
|
||
echo json_encode(['success' => true]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '处理举报失败']);
|
||
}
|
||
break;
|
||
|
||
// 更新用户邮箱
|
||
case 'updateEmail':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$email = isset($_POST['email']) ? $_POST['email'] : '';
|
||
|
||
if (!$email) {
|
||
echo json_encode(['success' => false, 'message' => '邮箱不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||
echo json_encode(['success' => false, 'message' => '无效的邮箱格式']);
|
||
break;
|
||
}
|
||
|
||
if (updateUserEmail($userId, $email)) {
|
||
echo json_encode(['success' => true, 'message' => '邮箱更新成功,请检查您的邮箱进行验证']);
|
||
} else {
|
||
// 检查邮箱是否已被使用
|
||
$db = Database::getInstance();
|
||
$existingUser = $db->query("SELECT * FROM users WHERE email = :email AND id != :id", [
|
||
'email' => $email,
|
||
'id' => $userId
|
||
]);
|
||
if (!empty($existingUser)) {
|
||
echo json_encode(['success' => false, 'message' => '该邮箱已被其他用户使用']);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '邮件发送失败,请稍后重试或联系管理员']);
|
||
}
|
||
}
|
||
break;
|
||
|
||
// 获取当前登录用户信息
|
||
case 'getCurrentUser':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
$username = $_SESSION['username'];
|
||
|
||
// 获取用户详细信息
|
||
$user = getUserById($userId);
|
||
if ($user) {
|
||
echo json_encode(['success' => true, 'user' => $user]);
|
||
} else {
|
||
// 如果获取失败,返回会话中的基本信息
|
||
echo json_encode(['success' => true, 'user' => [
|
||
'id' => $userId,
|
||
'username' => $username
|
||
]]);
|
||
}
|
||
break;
|
||
|
||
// 更新用户协议设置
|
||
case 'updateTermsSettings':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
|
||
$requireTermsAgreement = isset($_POST['require_terms_agreement']) ? (int)$_POST['require_terms_agreement'] : 0;
|
||
|
||
// 更新用户个人设置
|
||
$db = Database::getInstance();
|
||
$sql = "UPDATE users SET getip = :value WHERE id = :user_id";
|
||
$result = $db->execute($sql, [
|
||
'value' => $requireTermsAgreement,
|
||
'user_id' => $userId
|
||
]);
|
||
|
||
if ($result) {
|
||
echo json_encode(['success' => true, 'message' => '设置更新成功']);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '设置更新失败']);
|
||
}
|
||
break;
|
||
|
||
// 获取用户协议设置
|
||
case 'getTermsSettings':
|
||
checkLogin();
|
||
$userId = getCurrentUserId();
|
||
|
||
$db = Database::getInstance();
|
||
$result = $db->query("SELECT getip FROM users WHERE id = :user_id", ['user_id' => $userId]);
|
||
|
||
if (empty($result)) {
|
||
echo json_encode(['success' => true, 'getip' => 1]); // 默认开启
|
||
} else {
|
||
echo json_encode(['success' => true, 'getip' => (int)$result[0]['getip']]);
|
||
}
|
||
break;
|
||
|
||
// 登录API
|
||
case 'login':
|
||
$username = isset($_POST['username']) ? $_POST['username'] : '';
|
||
// 必须使用加密后的密码
|
||
$password = isset($_POST['password_hash']) ? $_POST['password_hash'] : '';
|
||
|
||
if (!$username || !$password) {
|
||
echo json_encode(['success' => false, 'message' => '无效的请求']);
|
||
break;
|
||
}
|
||
|
||
if (login($username, $password)) {
|
||
// 登录成功,返回用户信息
|
||
$userId = $_SESSION['user_id'];
|
||
$user = getUserById($userId);
|
||
echo json_encode(['success' => true, 'user' => $user]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '用户名或密码错误']);
|
||
}
|
||
break;
|
||
|
||
// 注册API
|
||
case 'register':
|
||
$username = isset($_POST['username']) ? $_POST['username'] : '';
|
||
$password = isset($_POST['password']) ? $_POST['password'] : '';
|
||
$email = isset($_POST['email']) ? $_POST['email'] : '';
|
||
|
||
if (!$username || !$password || !$email) {
|
||
echo json_encode(['success' => false, 'message' => '用户名、密码和邮箱不能为空']);
|
||
break;
|
||
}
|
||
|
||
if (register($username, $password, $email)) {
|
||
// 注册成功后自动登录
|
||
login($username, $password);
|
||
// 返回用户信息
|
||
$userId = $_SESSION['user_id'];
|
||
$user = getUserById($userId);
|
||
echo json_encode(['success' => true, 'user' => $user]);
|
||
} else {
|
||
echo json_encode(['success' => false, 'message' => '用户名已存在']);
|
||
}
|
||
break;
|
||
|
||
// 默认响应
|
||
default:
|
||
echo json_encode(['success' => false, 'message' => '无效的API请求']);
|
||
break;
|
||
}
|
||
?>
|