false, 'message' => '不支持的请求方法' ]); break; } } catch (Exception $e) { echo json_encode([ 'success' => false, 'message' => '服务器内部错误: ' . $e->getMessage() ]); } /** * 获取服务器设置 * @param Database $db 数据库实例 */ function getSettings($db) { // 从config表获取所有设置 $settings = $db->fetchAll("SELECT config_key, config_value FROM server_configs"); // 将设置转换为关联数组 $config = []; foreach ($settings as $setting) { $config[$setting['config_key']] = $setting['config_value']; } // 从配置文件获取默认值 $defaultConfig = Config::getInstance()->getAll(); // 合并设置,使用数据库中的设置覆盖默认值 $mergedConfig = array_replace_recursive($defaultConfig, parseSettings($config)); // 返回响应 echo json_encode([ 'success' => true, 'data' => $mergedConfig ]); } /** * 保存服务器设置 * @param Database $db 数据库实例 */ function saveSettings($db) { // 获取请求数据 $data = json_decode(file_get_contents('php://input'), true); if (!$data) { echo json_encode([ 'success' => false, 'message' => '无效的请求数据' ]); return; } // 验证必填字段 if (!isset($data['smtp']) || !isset($data['pop3']) || !isset($data['server'])) { echo json_encode([ 'success' => false, 'message' => '缺少必要的设置字段' ]); return; } // 验证端口号 if (!is_numeric($data['smtp']['port']) || $data['smtp']['port'] < 1 || $data['smtp']['port'] > 65535) { echo json_encode([ 'success' => false, 'message' => '无效的SMTP端口号' ]); return; } if (!is_numeric($data['pop3']['port']) || $data['pop3']['port'] < 1 || $data['pop3']['port'] > 65535) { echo json_encode([ 'success' => false, 'message' => '无效的POP3端口号' ]); return; } // 将设置转换为平面数组 $flatSettings = flattenSettings($data); // 开始事务 $pdo = $db->beginTransaction(); try { // 删除现有设置 $db->execute("DELETE FROM server_configs"); // 插入新设置 foreach ($flatSettings as $key => $value) { $db->insert( "INSERT INTO server_configs (config_key, config_value, description) VALUES (?, ?, ?)", [$key, $value, getSettingDescription($key)] ); } // 提交事务 $db->commit($pdo); echo json_encode([ 'success' => true, 'message' => '服务器设置保存成功' ]); } catch (Exception $e) { // 回滚事务 $db->rollback($pdo); echo json_encode([ 'success' => false, 'message' => '保存设置失败: ' . $e->getMessage() ]); } } /** * 将平面数组转换为嵌套数组 * @param array $settings 平面数组 * @return array 嵌套数组 */ function parseSettings($settings) { $result = []; foreach ($settings as $key => $value) { // 解析嵌套键,例如 smtp.port -> smtp['port'] $keys = explode('.', $key); $current = &$result; foreach ($keys as $k) { if (!isset($current[$k])) { $current[$k] = []; } $current = &$current[$k]; } // 尝试将数值字符串转换为数值 if (is_numeric($value)) { $value = (strpos($value, '.') !== false) ? (float)$value : (int)$value; } else if (strtolower($value) === 'true' || strtolower($value) === 'false') { // 转换布尔值 $value = strtolower($value) === 'true'; } $current = $value; } return $result; } /** * 将嵌套数组转换为平面数组 * @param array $settings 嵌套数组 * @param string $prefix 前缀(用于递归) * @return array 平面数组 */ function flattenSettings($settings, $prefix = '') { $result = []; foreach ($settings as $key => $value) { $newKey = empty($prefix) ? $key : $prefix . '.' . $key; if (is_array($value)) { // 递归处理嵌套数组 $result = array_merge($result, flattenSettings($value, $newKey)); } else { // 直接添加值 $result[$newKey] = (string)$value; } } return $result; } /** * 获取设置的描述 * @param string $key 设置键名 * @return string 描述 */ function getSettingDescription($key) { $descriptions = [ 'smtp.port' => 'SMTP服务器端口', 'smtp.host' => 'SMTP服务器监听地址', 'smtp.max_connections' => 'SMTP服务器最大连接数', 'pop3.port' => 'POP3服务器端口', 'pop3.host' => 'POP3服务器监听地址', 'pop3.max_connections' => 'POP3服务器最大连接数', 'server.domain' => '服务器域名', 'server.max_email_size' => '最大邮件大小', 'server.max_mailbox_size' => '最大邮箱大小', 'log.level' => '日志级别', 'log.path' => '日志文件路径' ]; return $descriptions[$key] ?? ''; }