| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?php
- /**
- * BCJD 导航 - RESTful API 接口
- *
- * 使用 OOP 类库重构,引入控制器模式。
- *
- * 端点:
- * GET ?action=get_links - 获取链接列表
- * POST ?action=login - 登录
- * POST ?action=logout - 退出
- * POST ?action=check_login - 检查登录状态
- * POST ?action=get_csrf - 获取 CSRF Token
- * POST ?action=add_link - 添加链接(需登录)
- * POST ?action=delete_link - 删除链接(需登录)
- * POST ?action=update_link - 更新链接(需登录)
- * POST ?action=update_password - 修改密码(需登录)
- */
- require_once __DIR__ . '/../init.php';
- use BCJD\Auth;
- use BCJD\LinkManager;
- use BCJD\Response;
- // ---- CORS 头 ----
- header('Access-Control-Allow-Origin: *');
- header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
- header('Access-Control-Allow-Headers: Content-Type, X-CSRF-Token');
- // 预检请求直接返回
- if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
- http_response_code(204);
- exit;
- }
- $action = $_GET['action'] ?? $_POST['action'] ?? '';
- $csrfToken = $_POST['csrf_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? '';
- try {
- switch ($action) {
- // ===== 获取链接 =====
- case 'get_links':
- $lm = new LinkManager();
- Response::json([
- 'logged_in' => Auth::isLoggedIn(),
- 'groups' => $lm->getLinks(),
- ]);
- break;
- // ===== 登录 =====
- case 'login':
- $password = $_POST['password'] ?? '';
- if (empty($password)) {
- Response::error('请输入密码');
- }
- if (Auth::verifyPassword($password)) {
- Auth::login();
- Response::success(['message' => '登录成功']);
- } else {
- Response::error('密码错误', 401);
- }
- break;
- // ===== 退出 =====
- case 'logout':
- Auth::logout();
- Response::success(['message' => '已退出']);
- break;
- // ===== 检查登录状态 =====
- case 'check_login':
- Response::json(['logged_in' => Auth::isLoggedIn()]);
- break;
- // ===== 获取 CSRF Token =====
- case 'get_csrf':
- Auth::requireLogin();
- Response::json(['csrf_token' => Auth::getCsrfToken()]);
- break;
- // ===== 添加链接 =====
- case 'add_link':
- if (!Auth::validateCsrfToken($csrfToken)) {
- Response::error('CSRF 验证失败,请刷新页面重试', 403);
- }
- $lm = new LinkManager();
- $id = $lm->addLink($_POST);
- Response::success(['id' => $id]);
- break;
- // ===== 删除链接 =====
- case 'delete_link':
- if (!Auth::validateCsrfToken($csrfToken)) {
- Response::error('CSRF 验证失败,请刷新页面重试', 403);
- }
- $lm = new LinkManager();
- $lm->deleteLink((int)($_POST['id'] ?? 0));
- Response::success();
- break;
- // ===== 更新链接 =====
- case 'update_link':
- if (!Auth::validateCsrfToken($csrfToken)) {
- Response::error('CSRF 验证失败,请刷新页面重试', 403);
- }
- $lm = new LinkManager();
- $lm->updateLink((int)($_POST['id'] ?? 0), $_POST);
- Response::success();
- break;
- // ===== 修改密码 =====
- case 'update_password':
- if (!Auth::validateCsrfToken($csrfToken)) {
- Response::error('CSRF 验证失败,请刷新页面重试', 403);
- }
- LinkManager::updatePassword(
- $_POST['old_password'] ?? '',
- $_POST['new_password'] ?? '',
- $_POST['confirm_password'] ?? ''
- );
- Response::success(['message' => '密码已更新']);
- break;
- default:
- Response::error('未知操作: ' . $action, 400);
- }
- } catch (\PDOException $e) {
- // 生产环境不暴露数据库错误细节
- error_log('Database error: ' . $e->getMessage());
- Response::error('数据库操作失败,请稍后重试', 500);
- } catch (\Throwable $e) {
- error_log('Unexpected error: ' . $e->getMessage());
- Response::error('服务器内部错误', 500);
- }
|