feat: 添加基金监控系统基础功能

添加基金监控系统相关文件,包括邮件发送功能、基金数据配置、测试脚本等。主要包含以下内容:

1. 添加PHPMailer库及相关语言文件
2. 添加基金配置数据文件(fund_config.json, fund_names.json等)
3. 添加邮件发送测试脚本(test_email.php, test_fund_email.php等)
4. 添加.gitignore文件忽略不必要的文件
5. 添加composer.json配置依赖

Signed-off-by: LL <LL>
This commit is contained in:
LL
2025-12-12 14:14:07 +08:00
commit 0cfefbebd8
106 changed files with 26164 additions and 0 deletions

144
utils/ApiBase.php Normal file
View File

@@ -0,0 +1,144 @@
<?php
/**
* API基类
* 提供API请求处理的通用功能减少代码重复
*/
class ApiBase {
/**
* 解析请求参数
* @return array 包含action和其他参数的数组
*/
protected function parseRequest() {
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$params = [];
$action = '';
// 解析GET参数
$queryString = $_SERVER['QUERY_STRING'] ?? '';
parse_str($queryString, $params);
$action = $params['action'] ?? '';
// 解析POST数据
if ($method === 'POST') {
$input = file_get_contents('php://input');
$postData = json_decode($input, true);
// 如果POST数据是有效的JSON合并到params中
if (json_last_error() === JSON_ERROR_NONE && is_array($postData)) {
$params = array_merge($params, $postData);
$action = $postData['action'] ?? $action;
}
}
return [
'method' => $method,
'action' => $action,
'params' => $params
];
}
/**
* 发送JSON响应
* @param mixed $data 要发送的数据
* @param int $statusCode HTTP状态码默认200
*/
protected function sendResponse($data, $statusCode = 200) {
http_response_code($statusCode);
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
/**
* 发送错误响应
* @param string $message 错误信息
* @param int $statusCode HTTP状态码默认400
*/
protected function sendError($message, $statusCode = 400) {
$this->sendResponse([
'success' => false,
'message' => $message
], $statusCode);
}
/**
* 发送成功响应
* @param mixed $data 响应数据(默认空数组)
* @param string $message 成功信息(默认空字符串)
*/
protected function sendSuccess($data = [], $message = '') {
$response = [
'success' => true
];
if (!empty($data)) {
$response['data'] = $data;
}
if (!empty($message)) {
$response['message'] = $message;
}
$this->sendResponse($response);
}
/**
* 处理OPTIONS请求
*/
protected function handleOptionsRequest() {
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
exit(0);
}
}
/**
* 记录操作日志
* @param string $action 操作类型
* @param array $data 操作数据
* @param string $logFile 日志文件路径
*/
protected function logOperation($action, $data = [], $logFile = 'data/operation_log.json') {
require_once 'FileManager.php';
// 加载现有日志
$logData = FileManager::loadJsonFile($logFile, ['operations' => []]);
// 添加新日志条目
$logEntry = [
'timestamp' => date('Y-m-d H:i:s'),
'action' => $action,
'data' => $data,
'ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown'
];
array_unshift($logData['operations'], $logEntry);
// 限制日志数量保留最新的500条
if (count($logData['operations']) > 500) {
$logData['operations'] = array_slice($logData['operations'], 0, 500);
}
// 保存日志
FileManager::saveJsonFile($logFile, $logData);
}
/**
* 获取操作日志
* @param int $limit 日志数量限制默认20
* @param string $logFile 日志文件路径
* @return array 日志数据
*/
protected function getOperationLog($limit = 20, $logFile = 'data/operation_log.json') {
require_once 'FileManager.php';
$logData = FileManager::loadJsonFile($logFile, ['operations' => []]);
$operations = $logData['operations'] ?? [];
// 限制返回的日志数量
if (count($operations) > $limit) {
$operations = array_slice($operations, 0, $limit);
}
return ['success' => true, 'operations' => $operations];
}
}
?>