# TeachAgent 新前端迁移开发清单 > 本文档记录从旧版 Flask 模板前端迁移到新版 React 前端的完整开发任务。 > 更新日期:2026-04-13 --- ## 一、项目架构概览 | 层级 | 技术栈 | 端口 | |------|--------|------| | 新前端 | React 19 + Vite + Ant Design + TailwindCSS + Redux | 3000 | | 旧前端 | Flask Jinja2 + Bootstrap 5 + 原生JS | 7860(与后端同源) | | 后端 API | Flask + Blueprint | 7860 | | 数据库 | Elasticsearch 9.3.3 (向量+文档) + SQLite (用户) | 9200 | | AI 服务 | SiliconFlow (Embedding/Rerank) + DeepSeek (Chat) | 外部API | --- ## 二、迁移状态总览 ### 已完成模块 | 模块 | 新前端文件 | 状态 | 备注 | |------|-----------|------|------| | 登录 | `LoginPage.jsx` | ✅ 完成 | 邮箱/手机/密码三种方式 | | 注册 | `RegisterPage.jsx` | ✅ 完成 | 用户名+密码 | | 路由保护 | `ProtectedRoute.jsx` | ✅ 完成 | JWT + 角色校验 | | 教师 Dashboard | `teacher/Dashboard.jsx` | ✅ 完成 | 统计卡片、快速入门 | | Agent 列表 | `teacher/AgentList.jsx` | ✅ 完成 | CRUD、分发链接、详情查看 | | Agent 创建 | `teacher/CreateAgent.jsx` | ✅ 完成 | 4步向导、AI工作流生成 | | 工作流编辑器 | `components/common/WorkflowEditor.jsx` | ✅ 完成 | React Flow 可视化 | | 知识库管理 | `teacher/KnowledgeBase.jsx` | ⚠️ 基本完成 | 缺批量上传、拖拽 | | 学生管理 | `teacher/StudentManagement.jsx` | ✅ 完成 | CRUD、密码重置、进度 | | 学生门户 | `student/StudentPortal.jsx` | ✅ 完成 | Agent列表、Token验证、活动记录 | | Agent 对话 | `student/AgentChat.jsx` | ⚠️ 部分完成 | 流式对话可用,插件系统缺失 | | 打字机 Hook | `hooks/useTypewriter.js` | ✅ 已实现 | 未接入使用 | ### 未实现模块 | 模块 | 旧版位置 | 优先级 | |------|----------|--------| | 代码执行插件(对话内嵌) | `student.html` 侧面板 | P0 | | 3D 可视化插件(对话内嵌) | `student.html` 侧面板 | P1 | | 思维导图插件(对话内嵌) | `student.html` 侧面板 | P1 | | 独立代码执行页 | `code_execution.html` | P1 | | Token 直接访问入口(登录页) | `login.html` | P2 | --- ## 三、关键 BUG 与问题 ### 3.1 流式输出 SSE 实现问题(P0) **当前实现**: `AgentChat.jsx` 使用 `fetch` + `ReadableStream reader` 手动解析 SSE **后端发送格式**: ``` data: {"type": "start", "plugins": [...], "references": [...]} data: {"type": "content", "content": "文本片段"} data: {"type": "metadata", "content": {...}} data: {"type": "done"} ``` **问题清单**: | # | 问题 | 严重度 | 说明 | |---|------|--------|------| | 1 | `metadata` 事件未处理 | 中 | 前端只处理 start/content/done,metadata 被忽略 | | 2 | 无 `error` 事件类型 | 高 | 后端出错时直接断流,前端会一直卡在"思考中" | | 3 | `[DONE]` 哨兵检测无效 | 低 | 前端检查 `[DONE]` 但后端从不发送此标记 | | 4 | 流结束时 buffer 未清空 | 中 | 如果流在 `\n\n` 结尾,最后一个事件可能丢失 | | 5 | 断流时无 JSON 恢复 | 中 | 连接中断时 partial JSON 直接丢失 | | 6 | 无超时/重连机制 | 中 | 网络波动时前端无法恢复 | **建议重构方向**: - 后端增加 `type: "error"` 事件 - 前端增加 metadata 事件处理 - 添加流超时检测(如 30s 无数据则提示) - 清理无用的 `[DONE]` 检查 ### 3.2 API 路径不一致(P0) | 前端调用 | 后端实际路径 | 问题 | |----------|-------------|------| | `axios.post('/api/verify_token')` (AgentChat.jsx:84) | `/api/verify_token` | axios baseURL 是 `/api`,实际请求变成 `/api/api/verify_token`(双重前缀)| | `getProgress(taskId)` → `/knowledge/progress/${taskId}` | `/api/progress/${taskId}`(在 app.py 主路由) | 路径不在 knowledge blueprint 下 | | `getDistributions(agentId)` → `/agent/${agentId}/distributions` | 后端未实现此端点 | 404 | | `authService.refreshToken()` → `/auth/refresh` | 后端未实现 | 404 | | `authService.getCurrentUser()` → `/auth/me` | 后端未实现 | 404 | | `authService.changePassword()` → `/auth/change_password` | 后端未实现 | 404 | ### 3.3 其他前端问题 | # | 问题 | 位置 | 说明 | |---|------|------|------| | 1 | Agent 编辑路由缺失 | `CreateAgent.jsx` | 编辑模式通过 localStorage 传参,无独立路由 | | 2 | 知识库进度轮询路径错误 | `knowledgeService.js` | 应直接调 `/api/progress/` 而非通过 knowledge 前缀 | | 3 | 学生 Dashboard 是空壳 | `StudentDashboard.jsx` | 只是路由容器,无独立内容 | --- ## 四、完整 API 端点对照表 ### 4.1 认证模块 `/api/auth/*` | 端点 | 方法 | 后端 | 前端调用 | 状态 | |------|------|------|---------|------| | `/api/auth/login` | POST | ✅ 旧版密码登录 | ❌ 未使用 | 可废弃 | | `/api/auth/login-password` | POST | ✅ | ✅ | 正常 | | `/api/auth/login-email` | POST | ✅ | ✅ | 正常 | | `/api/auth/login-phone` | POST | ✅ | ✅ | 正常 | | `/api/auth/send-email-code` | POST | ✅ | ✅ | 正常(邮件服务不可用) | | `/api/auth/send-phone-code` | POST | ✅ | ✅ | 正常(开发模式模拟) | | `/api/auth/register` | POST | ✅ | ✅ | 正常 | | `/api/auth/verify` | GET | ✅ | ❌ 未使用 | - | | `/api/auth/logout` | POST | ✅ | ✅ | 正常 | | `/api/auth/refresh` | POST | ❌ 未实现 | ✅ 有调用 | **需实现** | | `/api/auth/me` | GET | ❌ 未实现 | ✅ 有调用 | **需实现** | | `/api/auth/change_password` | POST | ❌ 未实现 | ✅ 有调用 | **需实现** | | `/api/auth/check` | GET | ✅ session检查 | ❌ 未使用 | 旧版遗留 | ### 4.2 知识库模块 `/api/knowledge/*` | 端点 | 方法 | 后端 | 前端调用 | 状态 | |------|------|------|---------|------| | `/api/knowledge/` | GET | ✅ | ✅ | 正常 | | `/api/knowledge/` | POST | ✅ 文件上传创建 | ✅ | 正常 | | `/api/knowledge/` | DELETE | ✅ | ✅ | 正常 | | `/api/knowledge//documents` | GET | ✅ | ✅ | 正常 | | `/api/knowledge//documents` | POST | ✅ | ✅ | 正常 | | `/api/knowledge//documents/` | DELETE | ✅ | ✅ | 正常 | | `/api/progress/` | GET | ✅(app.py主路由) | ⚠️ 路径可能错 | **需核实** | ### 4.3 Agent 模块 `/api/agent/*` | 端点 | 方法 | 后端 | 前端调用 | 状态 | |------|------|------|---------|------| | `/api/agent/create` | POST | ✅ | ✅ | 正常 | | `/api/agent/list` | GET | ✅ | ✅ | 正常 | | `/api/agent/` | GET | ✅ | ✅ | 正常 | | `/api/agent/` | PUT | ✅ | ✅ | 正常 | | `/api/agent/` | DELETE | ✅ | ✅ | 正常 | | `/api/agent//distribute` | POST | ✅ | ✅ | 正常 | | `/api/agent//distributions` | GET | ❌ 未实现 | ✅ 有调用 | **需实现** | | `/api/agent/ai-assist` | POST | ✅ | ✅ | 正常 | ### 4.4 代码执行模块 `/api/code/*` | 端点 | 方法 | 后端 | 前端调用 | 状态 | |------|------|------|---------|------| | `/api/code/execute` | POST | ✅ | ❌ 未接入 | **需前端实现** | | `/api/code/input` | POST | ✅ | ❌ 未接入 | **需前端实现** | | `/api/code/stop` | POST | ✅ | ❌ 未接入 | **需前端实现** | | `/api/code/generate` | POST | ✅ | ❌ 未接入 | **需前端实现** | ### 4.5 可视化模块 `/api/visualization/*` | 端点 | 方法 | 后端 | 前端调用 | 状态 | |------|------|------|---------|------| | `/api/visualization/mindmap` | POST | ✅ | ❌ 未接入 | **需前端实现** | | `/api/visualization/3d-surface` | POST | ✅ | ❌ 未接入 | **需前端实现** | ### 4.6 学生模块 | 端点 | 方法 | 后端 | 前端调用 | 状态 | |------|------|------|---------|------| | `/api/student/agents` | GET | ✅ | ✅ | 正常 | | `/api/student/activities` | GET | ✅ | ✅ | 正常 | | `/api/student/chat/` | POST (SSE) | ✅ | ✅ | ⚠️ 有解析问题 | | `/api/verify_token` | POST | ✅ (app.py) | ⚠️ 路径双重前缀 | **需修复** | ### 4.7 学生管理模块 `/api/teacher/students/*` | 端点 | 方法 | 后端 | 前端调用 | 状态 | |------|------|------|---------|------| | `/api/teacher/students` | GET | ✅ | ✅ | 正常 | | `/api/teacher/students` | POST | ✅ | ✅ | 正常 | | `/api/teacher/students/` | PUT | ✅ | ✅ | 正常 | | `/api/teacher/students/` | DELETE | ✅ | ✅ | 正常 | | `/api/teacher/students//reset-password` | POST | ✅ | ✅ | 正常 | | `/api/teacher/students//progress` | GET | ✅ | ✅ | 正常 | --- ## 五、分阶段开发计划 ### 第一阶段:基础修复(让现有功能跑通) - [ ] **修复 API 路径双重前缀问题** - `AgentChat.jsx` 中 `axios.post('/api/verify_token')` 改为用 api 实例或去掉 `/api` 前缀 - 排查所有直接使用 `axios` 而非 `api` 实例的调用 - [ ] **修复知识库进度轮询路径** - `knowledgeService.js` 中 `getProgress()` 路径对齐后端 `/api/progress/` - [ ] **修复 SSE 流式输出** - 前端增加 `metadata` 事件处理(至少不报错) - 后端增加 `type: "error"` 事件,出错时通知前端 - 移除前端无用的 `[DONE]` 检查 - 添加流超时检测(30s 无数据提示用户) - 修复流结束时 buffer 未清空问题 - [ ] **实现缺失的后端端点** - `GET /api/agent//distributions` — 获取 Agent 的分发链接列表 - `GET /api/auth/me` — 返回当前登录用户信息 - `POST /api/auth/refresh` — JWT token 刷新(或前端去掉此调用) - `POST /api/auth/change_password` — 修改密码(或前端暂时隐藏入口) ### 第二阶段:插件系统迁移(核心差异) - [ ] **AgentChat 插件框架设计** - 在对话界面右侧增加可展开的插件面板(Ant Design Drawer 或自定义侧栏) - 根据后端 SSE `start` 事件返回的 `plugins` 字段决定显示哪些插件 Tab - 插件自动激活:后端检测到关键词后在 `start` 事件中标记 `suggested_plugins` - 插件面板状态:折叠/展开/全屏 - 布局:左侧对话区 + 右侧插件面板,移动端改为底部抽屉 - [ ] **代码执行插件** - 使用 CodeMirror 6 (`@uiw/react-codemirror` + `@codemirror/lang-python`) - 上半区:代码编辑器(Python语法高亮、行号) - 下半区:终端输出面板(深色背景、绿色提示符、支持 ANSI 颜色) - 交互式输入:检测到 `input()` 时显示输入框 - 控制按钮:运行 / 停止 / 清除 - 对接 API: - `POST /api/code/execute` → 发送代码,轮询输出 - `POST /api/code/input` → 发送用户输入 - `POST /api/code/stop` → 终止执行 - AI 回复中的代码块可一键复制到编辑器 - AI 代码生成按钮 → `POST /api/code/generate` - [ ] **3D 可视化插件**(保持旧版 Plotly iframe 方案) - 从 AI 回复中提取 Python 代码(包含 `create_3d_plot` 函数) - `POST /api/visualization/3d-surface` 发送代码 - 返回 `html_url` 后在插件面板中用 `