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
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] ?? '';
|
|
}
|