合并冲突
Change-Id: I3b6ac5ae87aad8fe746eceecc8f92fc5574b50a8
diff --git a/src/pages/Relation/index.tsx b/src/pages/Relation/index.tsx
new file mode 100644
index 0000000..a5d2d97
--- /dev/null
+++ b/src/pages/Relation/index.tsx
@@ -0,0 +1,258 @@
+import { useEffect, useState } from 'react';
+import { Card, List, Button, message, Carousel, Modal } from 'antd';
+import { getUserInfo } from '@/services/session';
+import { getPlanetList, updateUserPlanet, getUserPlanet, getPlanetInfo, PlanetEntity, getRandomUserPlanets } from '@/services/planets/api';
+import { useRequest } from '@umijs/max';
+import { getUser } from '@/services/system/user';
+
+const RelationPage = () => {
+ const [planetList, setPlanetList] = useState<PlanetEntity[]>([]);
+ const [relatedUsers, setRelatedUsers] = useState<any[]>([]);
+ const [selectedUser, setSelectedUser] = useState<any>(null);
+ const [userModalVisible, setUserModalVisible] = useState(false);
+ // 获取用户信息
+ const { data: userInfo, loading: userLoading } = useRequest(async () => {
+ const userRes = await getUserInfo();
+ // 假设 userId 为字符串类型,需要将其转换为数字类型,同时处理可能的 undefined 情况
+ const userId = userRes.user.userId ? parseInt(userRes.user.userId, 10) : 1;
+ const UserplanetRes = await getUserPlanet({ userId });
+ console.log(UserplanetRes);
+ const planetId = UserplanetRes.planetId || 1;
+ const planetRes = await getPlanetInfo({ planetId });
+
+ return {
+ data: {
+ ...userRes.user,
+ planet: planetRes
+ }
+ };
+ });
+
+
+
+
+ console.log(userInfo);
+ const [listLoading, setListLoading] = useState(false);
+ // 获取所有GIF列表
+ const fetchPlanetList = async () => {
+ try {
+ setListLoading(true);
+ const res = await getPlanetList({ pageNum: 1, pageSize: 100 });
+ console.log(res);
+ setPlanetList(res);
+ } catch (error) {
+ message.error('获取GIF列表失败');
+ } finally {
+ setListLoading(false);
+ }
+ };
+
+ // 获取相关用户信息
+ const fetchRelatedUsers = async () => {
+ try {
+ // 获取随机用户星球列表
+ const randomPlanetsNo = await getRandomUserPlanets();
+ const userId = userInfo?.userId ? parseInt(userInfo.userId, 10) : 1;
+ const randomPlanets = randomPlanetsNo.filter((item) => item.userId !== userId);
+ // 获取完整用户信息并关联星球数据
+ const usersWithPlanets = await Promise.all(
+ randomPlanets.map(async (item) => {
+
+ // 确保 item.userId 为 number 类型,若为 undefined 则使用默认值 1
+ const userIdToUse = typeof item.userId === 'number' ? item.userId : 1;
+ const userRes = await getUser(userIdToUse);
+ const planetRes = await getPlanetInfo({ planetId: item.planetId });
+ return {
+ user: userRes.data,
+ planet: planetRes
+ };
+ })
+ );
+
+ setRelatedUsers(usersWithPlanets);
+ console.log(usersWithPlanets);
+ } catch (error) {
+ message.error('获取相关用户失败');
+ console.error(error);
+ }
+ };
+
+ useEffect(() => {
+ fetchPlanetList();
+ fetchRelatedUsers();
+ }, []);
+ // 显示用户详情
+ const showUserDetails = (user: any) => {
+ setSelectedUser(user);
+ setUserModalVisible(true);
+ };
+ console.log(planetList);
+ // 更新用户形象
+ const handleUpdateAvatar = async (id: number | undefined) => {
+ if (!id) {
+ message.error('无效的星球ID');
+ return;
+ }
+ try {
+ console.log(id);
+ // 处理 userInfo.userId 可能为 undefined 的情况,若为 undefined 则使用默认值 '1'
+ const userIdStr = userInfo?.userId || '1';
+ console.log(userIdStr);
+ await updateUserPlanet({ planetId: id, userId: parseInt(userIdStr, 10) });
+ message.success('更新形象成功');
+ window.location.reload();
+ } catch (error) {
+ message.error('更新形象失败');
+ }
+ };
+ if (userLoading) {
+ return <div>Loading...</div>;
+ }
+
+ return (
+ <div>
+ <Card title="当前形象" style={{ background: 'transparent', borderColor: '#3a3a5c' }}>
+ {userInfo?.planet && (
+ <div style={{ textAlign: 'center' }}>
+ <img
+ src={`/images/planets/${userInfo.planet.filename}.gif`}
+ alt="用户形象"
+ style={{
+ width: 200,
+ height: 200,
+ borderRadius: '50%',
+ border: '2px solid #4a4a7a',
+ boxShadow: '0 0 15px #6a5acd'
+ }}
+ />
+ <div style={{
+ marginTop: 16,
+ color: '#a8b2d1',
+ fontSize: 16
+ }}>
+ 当前形象: {userInfo.planet.name}
+ </div>
+ </div>
+ )}
+ </Card>
+
+ <Card title="选择新形象" style={{
+ marginTop: 24,
+ background: 'transparent',
+ borderColor: '#3a3a5c'
+ }}>
+ <Carousel
+ dots={false}
+ arrows={true}
+ style={{ width: '100%', maxWidth: 800, margin: '0 auto' }}
+ >
+ {planetList.map((item) => (
+ <div key={item.planetId} style={{ textAlign: 'center', padding: '0 40px' }}>
+ <div style={{ marginBottom: 16 }}>
+ <img
+ src={`/images/planets/${item.filename}.gif`}
+ alt={item.name}
+ style={{
+ width: 200,
+ height: 200,
+ borderRadius: '50%',
+ border: '2px solid #4a4a7a',
+ boxShadow: '0 0 15px #6a5acd',
+ marginTop: 16,
+ margin: '0 auto'
+ }}
+ />
+ </div>
+ <div style={{
+ color: '#a8b2d1',
+ marginBottom: 16
+ }}>
+ <div style={{ fontSize: 18, fontWeight: 'bold' }}>{item.name}</div>
+ <div style={{ margin: '8px 0' }}>{item.description}</div>
+ <div>创建时间: {item.createTime}</div>
+ </div>
+ <Button
+ type="primary"
+ onClick={() => handleUpdateAvatar(item.planetId)}
+ style={{
+ background: 'linear-gradient(45deg, #6a5acd, #9370db)',
+ border: 'none'
+ }}
+ >
+ 选择
+ </Button>
+ </div>
+ ))}
+ </Carousel>
+ </Card>
+
+ <Card title="与你相关的人" style={{
+ marginTop: 24,
+ background: 'transparent',
+ borderColor: '#3a3a5c'
+ }}>
+ <Carousel
+ dots={false}
+ arrows={true}
+ style={{ width: '100%', maxWidth: 800, margin: '0 auto' }}
+ >
+ {relatedUsers.map((item) => (
+ <div key={item.userId} style={{ textAlign: 'center', padding: '0 40px' }}>
+ <div style={{ marginBottom: 16 }}>
+ <img
+ src={`/images/planets/${item.planet.filename}.gif`}
+ alt={item.planet.name}
+ style={{
+ width: 200,
+ height: 200,
+ borderRadius: '50%',
+ border: '2px solid #4a4a7a',
+ boxShadow: '0 0 15px #6a5acd',
+ margin: '0 auto'
+ }}
+ />
+ </div>
+ <div style={{
+ color: '#a8b2d1',
+ marginBottom: 16
+ }}>
+ <div style={{ fontSize: 18, fontWeight: 'bold' }}>昵称:{item.user.nickName}</div>
+ <div style={{ margin: '8px 0' }}>邮箱:{item.user.email}</div>
+ <div>星球形象:{item.planet.name}</div>
+ </div>
+ <Button
+ type="primary"
+ onClick={() => showUserDetails(item.user)}
+ style={{
+ background: 'linear-gradient(45deg, #6a5acd, #9370db)',
+ border: 'none'
+ }}
+ >
+ 查看详情
+ </Button>
+ </div>
+ ))}
+ </Carousel>
+ </Card>
+
+ <Modal
+ title="用户详情"
+ visible={userModalVisible}
+ onCancel={() => setUserModalVisible(false)}
+ footer={null}
+ style={{ color: '#a8b2d1' }}
+ >
+ {selectedUser && (
+ <div>
+ <p>昵称: {selectedUser.nickName}</p>
+ <p>邮箱: {selectedUser.email}</p>
+ <p>电话: {selectedUser.phonenumber}</p>
+
+ </div>
+ )}
+ </Modal>
+ </div>
+ );
+};
+
+export default RelationPage;
\ No newline at end of file