| 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; |