From fab5e0c02f9d480ebe92e951d5950d684f473d16 Mon Sep 17 00:00:00 2001 From: canglan Date: Mon, 13 Apr 2026 18:29:48 +0800 Subject: [PATCH] =?UTF-8?q?v0.3=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fix-login-session-sync/proposal.md | 19 +++ .../changes/fix-login-session-sync/task.md | 37 ++++++ frontend/api/save_session.php | 117 ++++++++++++++++++ frontend/index.php | 31 ++++- 4 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 .cospec/plan/changes/fix-login-session-sync/proposal.md create mode 100644 .cospec/plan/changes/fix-login-session-sync/task.md create mode 100644 frontend/api/save_session.php diff --git a/.cospec/plan/changes/fix-login-session-sync/proposal.md b/.cospec/plan/changes/fix-login-session-sync/proposal.md new file mode 100644 index 0000000..4aad873 --- /dev/null +++ b/.cospec/plan/changes/fix-login-session-sync/proposal.md @@ -0,0 +1,19 @@ +# 变更:修复登录状态问题(Session与Token同步) + +## 原因 +用户反馈"登录后无法保存token,登录后跳转回登录页"。经深度探索发现,系统存在 Session(PHP后端)+ Token(API后端)双轨制认证架构: + +- **登录API** (`/api/auth/login`) 返回 JWT Token,前端存入 localStorage +- **Dashboard页面** 检查 PHP Session (`$_SESSION['user_id']`) +- **问题根因**:登录成功时只设置了 localStorage 中的 Token,没有同步设置 PHP Session,导致 dashboard 页面的 Session 检查失败,跳转回登录页 + +## 变更内容 +- **新建** `frontend/api/save_session.php`:PHP Session 保存接口 +- **修改** `frontend/index.php`:登录成功后调用 save_session.php 同步设置 PHP Session +- **修改** `frontend/config.php`:添加 API_BASE_URL 配置(如果缺失) + +## 影响 +- **受影响的规范**:登录认证流程 +- **受影响的代码**: + - `frontend/index.php`:登录成功后增加同步Session逻辑 + - `frontend/api/save_session.php`:新建,用于接收登录信息并设置PHP Session \ No newline at end of file diff --git a/.cospec/plan/changes/fix-login-session-sync/task.md b/.cospec/plan/changes/fix-login-session-sync/task.md new file mode 100644 index 0000000..fbf9b8c --- /dev/null +++ b/.cospec/plan/changes/fix-login-session-sync/task.md @@ -0,0 +1,37 @@ +## 实施 + +- [ ] 1.1 创建 `frontend/api/save_session.php` Session 同步接口 + 【目标对象】`frontend/api/save_session.php` + 【修改目的】提供接收前端登录信息并设置 PHP Session 的接口,解决登录后跳转回登录页的问题 + 【修改方式】新建 PHP 文件,实现 Session 设置逻辑 + 【相关依赖】`frontend/config.php`(用于引入必要的常量定义) + 【修改内容】 + - 文件顶部添加 ` false, + 'message' => '仅支持 POST 请求' + ]); + exit(); +} + +// 获取原始输入 +$input = file_get_contents('php://input'); + +if (empty($input)) { + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => '请求数据为空' + ]); + exit(); +} + +// 解析 JSON 数据 +$data = json_decode($input, true); + +if (json_last_error() !== JSON_ERROR_NONE) { + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => 'JSON 解析失败: ' . json_last_error_msg() + ]); + exit(); +} + +// 验证必要字段 +$requiredFields = ['user_id', 'user_type', 'username']; +$missingFields = []; + +foreach ($requiredFields as $field) { + if (!isset($data[$field]) || empty($data[$field])) { + $missingFields[] = $field; + } +} + +if (!empty($missingFields)) { + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => '缺少必要字段: ' . implode(', ', $missingFields) + ]); + exit(); +} + +// 验证 user_type 是否合法 +$validUserTypes = ['student', 'parent', 'admin']; +if (!in_array($data['user_type'], $validUserTypes)) { + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => '无效的用户类型' + ]); + exit(); +} + +// 设置 Session 变量 +$_SESSION['user_id'] = $data['user_id']; +$_SESSION['user_type'] = $data['user_type']; +$_SESSION['username'] = $data['username']; +$_SESSION['real_name'] = $data['real_name'] ?? ''; +$_SESSION['login_time'] = time(); + +// 如果是学生,额外设置 student_id(与 user_id 相同) +if ($data['user_type'] === 'student') { + $_SESSION['student_id'] = $data['user_id']; +} + +// 保存 Session +session_write_close(); + +// 返回成功响应 +http_response_code(200); +echo json_encode([ + 'success' => true, + 'message' => 'Session 保存成功' +]); +exit(); \ No newline at end of file diff --git a/frontend/index.php b/frontend/index.php index 7befd55..2bdf52e 100644 --- a/frontend/index.php +++ b/frontend/index.php @@ -82,9 +82,34 @@ if (isset($_SESSION['user_id']) && isset($_SESSION['user_type'])) { const data = await response.json(); if (data.success && data.data) { - localStorage.setItem(JWT_STORAGE_KEY, data.data.token); - localStorage.setItem(USER_STORAGE_KEY, JSON.stringify(data.data)); - window.location.href = data.data.redirect; + const userData = data.data; + + // 保存 Token 和用户信息到 localStorage + localStorage.setItem(JWT_STORAGE_KEY, userData.token); + localStorage.setItem(USER_STORAGE_KEY, JSON.stringify(userData)); + + // 同步设置 PHP Session(保持 Session + Token 双轨制认证) + try { + const sessionResponse = await fetch('/api/save_session.php', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + user_id: userData.user_id, + user_type: userData.user_type, + username: userData.username, + real_name: userData.real_name + }) + }); + + if (!sessionResponse.ok) { + console.warn('Session 同步失败,但继续跳转'); + } + } catch (sessionError) { + console.warn('Session 同步异常:', sessionError); + } + + // 跳转到对应端首页 + window.location.href = userData.redirect; } else { showError(data.message || '登录失败'); }