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.

236 lines
6.3 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;
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) {
// 从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] ?? '';
}