diff --git a/code/frontend/src/components/LobsterRiver/index.js b/code/frontend/src/components/LobsterRiver/index.js index a617801..1fe1e2a 100644 --- a/code/frontend/src/components/LobsterRiver/index.js +++ b/code/frontend/src/components/LobsterRiver/index.js @@ -2,10 +2,11 @@ import React, { useState } from 'react'; const API_BASE = 'http://localhost:8000/api'; -function LobsterRiver({ agents, onRefresh }) { +function LobsterRiver({ agents, onRefresh, onAgentToRiver, onAgentFromRiver }) { const [isOverRiver, setIsOverRiver] = useState(false); const [riverAgents, setRiverAgents] = useState([]); const [hoveredAgent, setHoveredAgent] = useState(null); + const [showHint, setShowHint] = useState(false); // 拖拽进入河水 const handleDragOver = (e) => { @@ -39,6 +40,12 @@ function LobsterRiver({ agents, onRefresh }) { // 添加到河中 if (!riverAgents.find(a => a.id === agent.id)) { setRiverAgents([...riverAgents, agent]); + + // 通知父组件:龙虾已入河 + if (onAgentToRiver) { + onAgentToRiver(parseInt(agentId)); + } + alert(`🦐 ${agentName} 已放归河水中!🌊`); } @@ -58,18 +65,33 @@ function LobsterRiver({ agents, onRefresh }) { // 从河中移除 setRiverAgents(riverAgents.filter(a => a.id !== agent.id)); + + // 通知父组件:龙虾已出河 + if (onAgentFromRiver) { + onAgentFromRiver(agent.id); + } + }; + + // 鼠标移入河水区域 + const handleMouseEnter = () => { + setShowHint(true); + }; + + // 鼠标离开河水区域 + const handleMouseLeave = () => { + setShowHint(false); }; return (
-

🌊 龙虾池 - 放虾归海

- {/* 河水区域 */}
{/* 波浪动画 */}
@@ -102,13 +124,21 @@ function LobsterRiver({ agents, onRefresh }) { ))}
- {/* 提示文字 */} - {riverAgents.length === 0 && ( -
-

- {isOverRiver ? '🦐 松开手,放虾归海!' : '拖拽龙虾到河水中'} -

-

将左侧的龙虾拖到这里,放虾归海

+ {/* 提示文字(鼠标悬停时显示) */} + {showHint && riverAgents.length === 0 && ( +
+
+

💡 使用提示

+

🖱️ 拖动展示方块到水池中 '放虾'

+

🦐 拖动虾到池子 '用虾'

+
+
+ )} + + {/* 空状态提示 */} + {!showHint && riverAgents.length === 0 && ( +
+ 🌊
)}
@@ -116,8 +146,6 @@ function LobsterRiver({ agents, onRefresh }) { {/* 河水分界线 */}
-
══════ 河岸 ══════
-
diff --git a/code/frontend/src/pages/Dashboard/index.js b/code/frontend/src/pages/Dashboard/index.js index 0c8818e..02a149a 100644 --- a/code/frontend/src/pages/Dashboard/index.js +++ b/code/frontend/src/pages/Dashboard/index.js @@ -9,6 +9,7 @@ function Dashboard() { const [agents, setAgents] = useState([]); const [loading, setLoading] = useState(true); const [scanning, setScanning] = useState(false); + const [riverAgentIds, setRiverAgentIds] = useState([]); // 河中的龙虾 ID const navigate = useNavigate(); useEffect(() => { @@ -57,6 +58,18 @@ function Dashboard() { e.target.style.opacity = '1'; }; + // 龙虾放入河中 + const handleAgentToRiver = (agentId) => { + if (!riverAgentIds.includes(agentId)) { + setRiverAgentIds([...riverAgentIds, agentId]); + } + }; + + // 龙虾从河中拖出 + const handleAgentFromRiver = (agentId) => { + setRiverAgentIds(riverAgentIds.filter(id => id !== agentId)); + }; + if (loading) { return
加载中...
; } @@ -78,19 +91,26 @@ function Dashboard() {
{/* 龙虾池 - 放虾归海 */} - +

🦐 待归海的龙虾

- {agents.map(agent => ( -
handleDragStart(e, agent)} - onDragEnd={handleDragEnd} - title="拖拽我到龙虾池" - > + {agents + .filter(agent => !riverAgentIds.includes(agent.id)) // 过滤掉已在河中的龙虾 + .map(agent => ( +
handleDragStart(e, agent)} + onDragEnd={handleDragEnd} + title="拖拽我到龙虾池" + >
{agent.emoji} {agent.name} {agent.status}