初始化仓库及v1.0.0提交
This commit is contained in:
138
public/api.php
Normal file
138
public/api.php
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
use App\Config\AppConfig;
|
||||
use App\Controllers\AuthController;
|
||||
use App\Controllers\SessionController;
|
||||
use App\Controllers\MessageController;
|
||||
use App\Controllers\ChatController;
|
||||
use App\Controllers\UploadController;
|
||||
use App\Controllers\ConfigController;
|
||||
use App\Controllers\InstallController;
|
||||
use App\Middleware\AuthMiddleware;
|
||||
use App\Middleware\AdminMiddleware;
|
||||
|
||||
// 设置响应头
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
// CORS 设置
|
||||
$corsOrigin = AppConfig::get('corsOrigin', '*');
|
||||
header("Access-Control-Allow-Origin: {$corsOrigin}");
|
||||
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
|
||||
header('Access-Control-Allow-Headers: Content-Type, Authorization');
|
||||
|
||||
// 处理 OPTIONS 预检请求
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
||||
http_response_code(200);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 路由表定义
|
||||
$routes = [
|
||||
// 认证路由(无需认证)
|
||||
['POST', 'auth/login', [AuthController::class, 'login'], false, false],
|
||||
|
||||
// 认证路由(需认证)
|
||||
['GET', 'auth/me', [AuthController::class, 'me'], true, false],
|
||||
|
||||
// 会话路由
|
||||
['GET', 'sessions', [SessionController::class, 'index'], true, false],
|
||||
['POST', 'sessions', [SessionController::class, 'create'], true, false],
|
||||
['PUT', 'sessions/{id}', [SessionController::class, 'update'], true, false],
|
||||
['DELETE', 'sessions/{id}', [SessionController::class, 'delete'], true, false],
|
||||
|
||||
// 消息路由
|
||||
['GET', 'sessions/{id}/messages', [MessageController::class, 'index'], true, false],
|
||||
['POST', 'sessions/{id}/messages', [MessageController::class, 'create'], true, false],
|
||||
|
||||
// 聊天路由
|
||||
['POST', 'chat/completions', [ChatController::class, 'completions'], true, false],
|
||||
|
||||
// 上传路由
|
||||
['POST', 'upload', [UploadController::class, 'upload'], true, false],
|
||||
|
||||
// 配置路由
|
||||
['GET', 'config', [ConfigController::class, 'getConfig'], true, false],
|
||||
['PUT', 'config', [ConfigController::class, 'updateConfig'], true, true],
|
||||
|
||||
// 人格路由
|
||||
['GET', 'personalities', [ConfigController::class, 'listPersonalities'], true, false],
|
||||
['POST', 'personalities', [ConfigController::class, 'createPersonality'], true, true],
|
||||
['PUT', 'personalities/{id}', [ConfigController::class, 'updatePersonality'], true, true],
|
||||
['DELETE', 'personalities/{id}', [ConfigController::class, 'deletePersonality'], true, true],
|
||||
|
||||
// 安装路由(无需认证)
|
||||
['GET', 'install/status', [InstallController::class, 'status'], false, false],
|
||||
['POST', 'install/test-db', [InstallController::class, 'testDb'], false, false],
|
||||
['POST', 'install/setup', [InstallController::class, 'setup'], false, false],
|
||||
];
|
||||
|
||||
// 解析请求路径
|
||||
$requestUri = $_SERVER['REQUEST_URI'];
|
||||
$path = parse_url($requestUri, PHP_URL_PATH);
|
||||
$basePath = '/api/';
|
||||
|
||||
// 去除 /api/ 前缀
|
||||
if (str_starts_with($path, $basePath)) {
|
||||
$path = substr($path, strlen($basePath));
|
||||
}
|
||||
$path = rtrim($path, '/');
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
|
||||
// 路由匹配
|
||||
$matched = false;
|
||||
|
||||
try {
|
||||
foreach ($routes as $route) {
|
||||
[$routeMethod, $routePattern, $handler, $needAuth, $needAdmin] = $route;
|
||||
|
||||
if ($method !== $routeMethod) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 将路由模式转换为正则表达式
|
||||
$paramNames = [];
|
||||
$regexPattern = preg_replace_callback('/\{(\w+)\}/', function ($m) use (&$paramNames) {
|
||||
$paramNames[] = $m[1];
|
||||
return '([^/]+)';
|
||||
}, $routePattern);
|
||||
|
||||
$regex = '#^' . $regexPattern . '$#';
|
||||
|
||||
if (preg_match($regex, $path, $matches)) {
|
||||
$matched = true;
|
||||
|
||||
// 提取路径参数
|
||||
$params = [];
|
||||
for ($i = 0; $i < count($paramNames); $i++) {
|
||||
$params[$paramNames[$i]] = $matches[$i + 1];
|
||||
}
|
||||
|
||||
// 认证检查
|
||||
if ($needAuth) {
|
||||
AuthMiddleware::handle();
|
||||
}
|
||||
|
||||
// 管理员检查
|
||||
if ($needAdmin) {
|
||||
AdminMiddleware::handle();
|
||||
}
|
||||
|
||||
// 调用控制器方法
|
||||
$controllerMethod = $handler[1];
|
||||
$handler[0]::$controllerMethod(...array_values($params));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$matched) {
|
||||
http_response_code(404);
|
||||
echo json_encode(['success' => false, 'message' => '接口不存在']);
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode(['success' => false, 'message' => '服务器内部错误']);
|
||||
}
|
||||
Reference in New Issue
Block a user