You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
7.0 KiB

<?php
/**
* 用户设置API
*/
// 设置错误报告
error_reporting(E_ALL);
ini_set('display_errors', 0);
// 设置JSON响应头
header('Content-Type: application/json; charset=utf-8');
// 包含必要的类
require_once '../../utils/Config.php';
require_once '../../utils/Logger.php';
require_once '../../utils/Helper.php';
require_once '../../utils/Database.php';
// 处理请求
try {
// 获取请求方法
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
// 连接数据库
$db = Database::getInstance();
// 根据请求方法处理
switch ($method) {
case 'GET':
// 获取用户设置
getSettings($db);
break;
case 'POST':
// 保存用户设置
saveSettings($db);
break;
case 'PUT':
// 处理特殊设置更新
$action = isset($_GET['action']) ? $_GET['action'] : '';
if ($action === 'password') {
// 修改密码
changePassword($db);
} elseif ($action === 'autoreply') {
// 设置自动回复
setAutoReply($db);
} else {
echo json_encode([
'success' => false,
'message' => '不支持的操作类型'
]);
}
break;
default:
echo json_encode([
'success' => false,
'message' => '不支持的请求方法'
]);
break;
}
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => '服务器内部错误: ' . $e->getMessage()
]);
}
/**
* 获取用户设置
* @param Database $db 数据库实例
*/
function getSettings($db) {
// 获取请求参数
$username = isset($_GET['username']) ? $_GET['username'] : '';
// 验证必要参数
if (empty($username)) {
echo json_encode([
'success' => false,
'message' => '缺少用户名参数'
]);
return;
}
// 查询用户设置
$settings = $db->fetchAll("SELECT setting_key, setting_value FROM user_settings WHERE user_id = ?", [$username]);
// 转换为关联数组
$settingsArray = [];
foreach ($settings as $setting) {
$settingsArray[$setting['setting_key']] = $setting['setting_value'];
}
echo json_encode([
'success' => true,
'data' => [
'settings' => $settingsArray
]
]);
}
/**
* 保存用户设置
* @param Database $db 数据库实例
*/
function saveSettings($db) {
// 获取请求数据
$data = json_decode(file_get_contents('php://input'), true);
// 验证请求数据
if (!$data || empty($data['username']) || empty($data['settings'])) {
echo json_encode([
'success' => false,
'message' => '缺少必要参数'
]);
return;
}
$username = $data['username'];
$settings = $data['settings'];
// 开始事务
$pdo = $db->beginTransaction();
try {
// 删除现有设置
$db->execute("DELETE FROM user_settings WHERE user_id = ?", [$username]);
// 插入新设置
foreach ($settings as $key => $value) {
$db->insert(
"INSERT INTO user_settings (user_id, setting_key, setting_value) VALUES (?, ?, ?)",
[$username, $key, $value]
);
}
// 提交事务
$db->commit($pdo);
echo json_encode([
'success' => true,
'message' => '设置保存成功'
]);
} catch (Exception $e) {
// 回滚事务
$db->rollback($pdo);
echo json_encode([
'success' => false,
'message' => '保存设置失败: ' . $e->getMessage()
]);
}
}
/**
* 修改密码
* @param Database $db 数据库实例
*/
function changePassword($db) {
// 获取请求数据
$data = json_decode(file_get_contents('php://input'), true);
// 验证请求数据
if (!$data || empty($data['username']) || empty($data['oldPassword']) || empty($data['newPassword'])) {
echo json_encode([
'success' => false,
'message' => '缺少必要参数'
]);
return;
}
$username = $data['username'];
$oldPassword = $data['oldPassword'];
$newPassword = $data['newPassword'];
// 获取用户当前密码
$user = $db->fetchOne("SELECT password FROM user WHERE username = ?", [$username]);
if (!$user) {
echo json_encode([
'success' => false,
'message' => '用户不存在'
]);
return;
}
// 验证旧密码
if (!password_verify($oldPassword, $user['password'])) {
echo json_encode([
'success' => false,
'message' => '旧密码不正确'
]);
return;
}
// 更新密码
$encryptedPassword = Helper::encryptPassword($newPassword);
$db->execute("UPDATE user SET password = ? WHERE username = ?", [$encryptedPassword, $username]);
echo json_encode([
'success' => true,
'message' => '密码修改成功'
]);
}
/**
* 设置自动回复
* @param Database $db 数据库实例
*/
function setAutoReply($db) {
// 获取请求数据
$data = json_decode(file_get_contents('php://input'), true);
// 验证请求数据
if (!$data || empty($data['username'])) {
echo json_encode([
'success' => false,
'message' => '缺少必要参数'
]);
return;
}
$username = $data['username'];
$isEnabled = isset($data['isEnabled']) ? (bool)$data['isEnabled'] : false;
$subject = isset($data['subject']) ? $data['subject'] : '';
$content = isset($data['content']) ? $data['content'] : '';
// 保存自动回复设置
$autoReplySettings = [
'auto_reply_enabled' => $isEnabled ? '1' : '0',
'auto_reply_subject' => $subject,
'auto_reply_content' => $content
];
// 开始事务
$pdo = $db->beginTransaction();
try {
// 删除现有自动回复设置
$db->execute("DELETE FROM user_settings WHERE user_id = ? AND setting_key LIKE 'auto_reply_%'", [$username]);
// 插入新设置
foreach ($autoReplySettings as $key => $value) {
$db->insert(
"INSERT INTO user_settings (user_id, setting_key, setting_value) VALUES (?, ?, ?)",
[$username, $key, $value]
);
}
// 提交事务
$db->commit($pdo);
echo json_encode([
'success' => true,
'message' => '自动回复设置成功'
]);
} catch (Exception $e) {
// 回滚事务
$db->rollback($pdo);
echo json_encode([
'success' => false,
'message' => '设置自动回复失败: ' . $e->getMessage()
]);
}
}