前端简单界面

Change-Id: I7df9774daf4df8d92b13e659effe426ab0b6180b
diff --git a/pt--frontend/src/components/FriendManager.jsx b/pt--frontend/src/components/FriendManager.jsx
new file mode 100644
index 0000000..d28f93d
--- /dev/null
+++ b/pt--frontend/src/components/FriendManager.jsx
@@ -0,0 +1,156 @@
+import React, { useState, useEffect } from 'react';
+import { addFriend, deleteFriend, getFriendsByUserId } from '../api/friends';
+
+const FriendManager = ({ currentUser, onSelectRelation }) => {
+    const [friendId, setFriendId] = useState('');
+    const [friends, setFriends] = useState([]);
+    const [isLoading, setIsLoading] = useState(false);
+    const [isRefreshing, setIsRefreshing] = useState(false);
+
+    useEffect(() => {
+        if (currentUser?.id) loadFriends(currentUser.id);
+    }, [currentUser]);
+
+    const loadFriends = async (userid) => {
+        setIsRefreshing(true);
+        try {
+            const res = await getFriendsByUserId(userid);
+            setFriends(res.data);
+        } catch (err) {
+            console.error('加载好友失败', err);
+            alert('加载好友失败,请稍后重试');
+        }
+        setIsRefreshing(false);
+    };
+
+    const handleFriendIdChange = (e) => {
+        const value = e.target.value;
+        if (/^\d*$/.test(value)) setFriendId(value);
+    };
+
+    const handleAddFriend = async () => {
+        if (!friendId) return alert('请输入好友ID');
+
+        const newFriendId = parseInt(friendId, 10);
+        if (newFriendId === currentUser.id) return alert('不能添加自己为好友');
+
+        if (friends.some(f => f.friend1 === newFriendId || f.friend2 === newFriendId)) {
+            return alert('该用户已是您的好友');
+        }
+
+        setIsLoading(true);
+        try {
+            const res = await addFriend({ friend1: currentUser.id, friend2: newFriendId });
+            if (res.data) {
+                alert('添加成功');
+                setFriendId('');
+                loadFriends(currentUser.id);
+            } else {
+                alert('添加失败');
+            }
+        } catch (err) {
+            alert('添加好友失败');
+            console.error(err);
+        }
+        setIsLoading(false);
+    };
+
+    /* ---------- 这里开始:删除好友逻辑改为 friend1 + friend2 ---------- */
+    const handleDelete = async (friend1, friend2) => {
+        if (!window.confirm('确认删除该好友吗?')) return;
+        setIsLoading(true);
+        try {
+            const res = await deleteFriend(friend1, friend2);
+            if (res.data) {
+                alert('删除成功');
+                loadFriends(currentUser.id);
+            } else {
+                alert('删除失败');
+            }
+        } catch (err) {
+            alert('删除好友失败');
+            console.error(err);
+        }
+        setIsLoading(false);
+    };
+    /* ------------------------------------------------------------------- */
+
+    return (
+        <div className="max-w-xl mx-auto p-4">
+            <h2 className="text-2xl font-bold mb-4">好友管理</h2>
+
+            {/* 添加好友区域 */}
+            <div className="mb-6 space-y-2">
+                <input
+                    type="text"
+                    placeholder="输入好友的用户ID"
+                    value={friendId}
+                    onChange={handleFriendIdChange}
+                    className="border p-2 rounded w-full"
+                />
+                <button
+                    onClick={handleAddFriend}
+                    disabled={isLoading}
+                    className={`bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600 ${isLoading ? 'opacity-50 cursor-not-allowed' : ''}`}
+                >
+                    {isLoading ? '添加中…' : '添加好友'}
+                </button>
+            </div>
+
+            {/* 好友列表 */}
+            <div className="flex justify-between items-center mb-3">
+                <h3 className="text-xl font-semibold">我的好友列表</h3>
+                <button
+                    onClick={() => loadFriends(currentUser.id)}
+                    disabled={isRefreshing}
+                    className="text-sm text-blue-500 hover:underline disabled:text-gray-400"
+                >
+                    {isRefreshing ? '刷新中…' : '刷新'}
+                </button>
+            </div>
+
+            {friends.length === 0 ? (
+                <p className="text-gray-500">暂无好友</p>
+            ) : (
+                <ul className="space-y-3">
+                    {friends.map((f) => {
+                        const friendUserId =
+                            f.friend1 === currentUser.id ? f.friend2 : f.friend1;
+                        return (
+                            <li
+                                key={f.relationid}
+                                className="border p-3 rounded flex justify-between items-center hover:bg-gray-100 cursor-pointer"
+                                onClick={() =>
+                                    onSelectRelation({
+                                        relationid: f.relationid,
+                                        friendId: friendUserId,
+                                    })
+                                }
+                            >
+                                <div>
+                                    <p>好友用户ID:{friendUserId}</p>
+                                    <p className="text-sm text-gray-500">
+                                        添加时间:{new Date(f.requestTime).toLocaleString()}
+                                    </p>
+                                </div>
+                                <button
+                                    onClick={(e) => {
+                                        e.stopPropagation();
+                                        /* ------- 传入正确的 friend1 & friend2 -------- */
+                                        handleDelete(f.friend1, f.friend2);
+                                    }}
+                                    className="text-red-500 hover:underline"
+                                    disabled={isLoading}
+                                >
+                                    删除
+                                </button>
+                            </li>
+                        );
+                    })}
+                </ul>
+            )}
+        </div>
+    );
+};
+
+export default FriendManager;