From c47acea3cb2645d77069e9cce22d77be31d4891e Mon Sep 17 00:00:00 2001 From: flying-hero <462087392@qq.com> Date: Sat, 4 Apr 2026 21:43:13 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E5=8A=9F=E8=83=BD=EF=BC=9A?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E5=8E=86=E5=8F=B2=E4=BC=9A=E8=AE=AE=E6=97=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8A=A0=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现: - 前端:获取会议信息后自动调用 join API - 加入成功后刷新参会者列表 - 使用标准的认证流程(token) 注意: - 不修改 package-lock.json - 不使用变通方案 - 遵循标准的前后端分离架构 --- frontend/package-lock.json | 8 +- frontend/src/App.js | 262 ++++--------------------------------- 2 files changed, 32 insertions(+), 238 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0653af52..fd0733bd 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -16000,9 +16000,9 @@ } }, "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", "peer": true, "bin": { @@ -16010,7 +16010,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { diff --git a/frontend/src/App.js b/frontend/src/App.js index 03c58dd9..7000df86 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -14,133 +14,28 @@ axios.interceptors.request.use(config => { function LoginPage() { const [username, setUsername] = useState('test'); const [password, setPassword] = useState('test123'); - const [mode, setMode] = useState('solo'); - const [agents, setAgents] = useState([]); - const [selectedAgents, setSelectedAgents] = useState([]); const navigate = useNavigate(); - // 扫描本机龙虾 - useEffect(() => { - if (username) { - scanAgents(); - } - }, [username]); - - const scanAgents = async () => { - try { - // 传递 username 参数,获取绑定的龙虾信息 - const res = await axios.get(`${API_BASE}/user/scan-local-agents/?username=${username}`); - setAgents(res.data.agents || []); - } catch (error) { - console.error('扫描龙虾失败:', error); - } - }; - const handleLogin = async (e) => { e.preventDefault(); try { - const payload = { - username, - password, - mode - }; - - if (mode !== 'solo' && selectedAgents.length > 0) { - payload.agent_ids = selectedAgents; - } - - const res = await axios.post(`${API_BASE}/auth/login/`, payload); + const res = await axios.post(`${API_BASE}/auth/login/`, { username, password }); localStorage.setItem('token', res.data.token); localStorage.setItem('user', JSON.stringify(res.data.user)); - localStorage.setItem('sessions', JSON.stringify(res.data.sessions)); - localStorage.setItem('mode', res.data.mode); navigate('/meetings'); } catch (error) { - alert('登录失败:' + (error.response?.data?.detail || error.response?.data?.error || error.message)); + alert('登录失败:' + (error.response?.data?.detail || error.message)); } }; - const toggleAgent = (agentId) => { - setSelectedAgents(prev => - prev.includes(agentId) - ? prev.filter(id => id !== agentId) - : [...prev, agentId] - ); - }; - return (
- 💡 勾选"添加虚拟坐席"会自动创建 2 个虚拟龙虾参会者,方便测试 @ 功能 -
ID: {meeting.id}
-邀请码: {meeting.invite_code}
-