前端简单界面

Change-Id: I7df9774daf4df8d92b13e659effe426ab0b6180b
diff --git a/pt--frontend/src/components/ChatBox.jsx b/pt--frontend/src/components/ChatBox.jsx
new file mode 100644
index 0000000..aec406a
--- /dev/null
+++ b/pt--frontend/src/components/ChatBox.jsx
@@ -0,0 +1,155 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { getMessagesByUserIds, sendMessage } from '../api/chat'; // 替换为新API
+
+const ChatBox = ({ senderId, receiverId }) => { // 不再接收relationId
+  const [messages, setMessages] = useState([]);
+  const [inputContent, setInputContent] = useState('');
+  const messagesEndRef = useRef(null);
+
+  // 加载历史消息(改为通过用户ID获取)
+  const loadMessages = async () => {
+    try {
+      if (!senderId || !receiverId) return;
+      const data = await getMessagesByUserIds(senderId, receiverId);
+
+      // 格式化消息:同时处理friend1(chatimformation1)和friend2(chatimformation2)的消息
+      const formattedMessages = data.flatMap(msg => {
+        const messages = [];
+        // 处理friend1的消息(chatimformation1)
+        if (msg.chatimformation1) {
+          messages.push({
+            content: msg.chatimformation1,
+            isSelf: msg.friend1 === senderId,  // 发送方是friend1,判断是否是当前用户
+            talkTime: msg.talkTime  // 保留时间用于排序和唯一key
+          });
+        }
+        // 处理friend2的消息(chatimformation2)
+        if (msg.chatimformation2) {
+          messages.push({
+            content: msg.chatimformation2,
+            isSelf: msg.friend2 === senderId,  // 发送方是friend2,判断是否是当前用户
+            talkTime: msg.talkTime  // 保留时间用于排序和唯一key
+          });
+        }
+        return messages;
+      }).sort((a, b) => new Date(a.talkTime) - new Date(b.talkTime)); // 按时间升序排列
+
+      setMessages(formattedMessages);
+    } catch (error) {
+      console.error('加载消息失败:', error.message);
+    }
+  };
+
+  // 发送消息(不再需要relationId)
+  const handleSend = async () => {
+    if (!inputContent.trim()) return;
+    if (!senderId || !receiverId) { // 新增:校验用户ID有效性
+      console.error('未获取到有效的用户ID');
+      return;
+    }
+
+    try {
+      const newMessage = await sendMessage({
+        senderId,
+        receiverId,
+        content: inputContent
+      });
+      setMessages(prev => [...prev, { content: inputContent, isSelf: true }]);
+      setInputContent('');
+      scrollToBottom();
+    } catch (error) {
+      console.error('发送消息失败:', error.message);
+    }
+  };
+
+  // 依赖改为用户ID变化时重新加载
+  useEffect(() => {
+    if (senderId && receiverId) loadMessages();
+  }, [senderId, receiverId]);
+
+  const scrollToBottom = () => {
+    messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
+  };
+
+  return (
+    <div className="chat-box" style={{
+      width: '400px',
+      height: '600px',
+      border: '1px solid #e5e7eb',
+      borderRadius: '8px',
+      display: 'flex',
+      flexDirection: 'column'
+    }}>
+      {/* 消息列表 */}
+      <div style={{
+        flex: 1,
+        padding: '16px',
+        overflowY: 'auto',
+        backgroundColor: '#f3f4f6'
+      }}>
+        {/* 消息列表渲染(使用数据库唯一ID作为key) */}
+        {messages.map((msg) => (
+          <div
+            key={msg.informationid}
+            style={{
+              marginBottom: '12px',
+              display: 'flex',
+              justifyContent: msg.isSelf ? 'flex-end' : 'flex-start'
+            }}
+          >
+            <div
+              style={{
+                maxWidth: '70%',
+                padding: '8px 12px',
+                borderRadius: '12px',
+                backgroundColor: msg.isSelf ? '#2563eb' : '#ffffff',
+                color: msg.isSelf ? 'white' : 'black'
+              }}
+            >
+              {msg.content}
+            </div>
+          </div>
+        ))}
+        <div ref={messagesEndRef} />
+      </div>
+
+      {/* 输入区域 */}
+      <div style={{
+        padding: '16px',
+        display: 'flex',
+        gap: '8px',
+        borderTop: '1px solid #e5e7eb'
+      }}>
+        <input
+          type="text"
+          value={inputContent}
+          onChange={(e) => setInputContent(e.target.value)}
+          onKeyPress={(e) => e.key === 'Enter' && handleSend()}
+          placeholder="输入消息..."
+          style={{
+            flex: 1,
+            padding: '8px 12px',
+            borderRadius: '6px',
+            border: '1px solid #d1d5db',
+            fontSize: '14px'
+          }}
+        />
+        <button
+          onClick={handleSend}
+          style={{
+            padding: '8px 16px',
+            backgroundColor: '#2563eb',
+            color: 'white',
+            border: 'none',
+            borderRadius: '6px',
+            cursor: 'pointer'
+          }}
+        >
+          发送
+        </button>
+      </div>
+    </div>
+  );
+};
+
+export default ChatBox;
\ No newline at end of file