初始化仓库及v1.0.0提交

This commit is contained in:
2026-05-05 03:21:58 +08:00
commit 813bb02672
67 changed files with 5263 additions and 0 deletions

138
public/api.php Normal file
View 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' => '服务器内部错误']);
}