22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 1 | import React, { useEffect, useState } from 'react'; |
| 2 | import axios from 'axios'; |
| 3 | import './UserProfile.css'; |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 4 | import UserNav from './UserNav'; |
Krishya | c0f7e9b | 2025-04-22 15:28:28 +0800 | [diff] [blame] | 5 | import Header from '../../components/Header'; |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 6 | import { useUser } from '../../context/UserContext'; |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 7 | |
22301009 | 7ff51f2 | 2025-04-15 21:35:28 +0800 | [diff] [blame] | 8 | const UserProfile = () => { |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 9 | const { user, loading } = useUser(); // 从上下文拿用户和加载状态 |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 10 | const [userProfile, setUserProfile] = useState(null); |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 11 | const [error, setError] = useState(null); |
| 12 | |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 13 | useEffect(() => { |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 14 | if (loading) return; // 用户信息还没加载完,先不请求 |
| 15 | console.log('用户:', user, '加载:', loading); |
| 16 | |
| 17 | if (!user || !user.userId) { |
| 18 | setError('未登录或用户信息缺失'); |
| 19 | setUserProfile(null); |
| 20 | return; |
| 21 | } |
| 22 | |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 23 | const fetchUserProfile = async () => { |
| 24 | try { |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 25 | setError(null); |
| 26 | const response = await axios.get(`/echo/user/${user.userId}/getProfile`); |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 27 | |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 28 | console.log('响应数据:', response); // 调试用 |
| 29 | const raw = response.data; |
| 30 | console.log('raw:', raw); // 调试用 |
| 31 | |
| 32 | if (!raw) { |
| 33 | setError('用户数据为空'); |
| 34 | setUserProfile(null); |
| 35 | return; |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 36 | } |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 37 | |
| 38 | const profile = { |
| 39 | avatar_url: raw.avatarUrl || 'https://example.com/default-avatar.jpg', |
| 40 | nickname: raw.username || '未知用户', |
| 41 | email: raw.email || '未填写', |
| 42 | gender: raw.gender || '保密', |
| 43 | bio: raw.description || '无', |
| 44 | interests: raw.hobbies ? raw.hobbies.split(',') : [], |
| 45 | level: raw.level || '未知', |
| 46 | experience: raw.experience ?? 0, |
| 47 | upload_amount: raw.uploadCount ?? 0, |
| 48 | download_amount: raw.downloadCount ?? 0, |
| 49 | share_rate: raw.shareRate ?? 0, |
| 50 | joined_date: raw.registrationTime, |
| 51 | }; |
| 52 | |
| 53 | setUserProfile(profile); |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 54 | } catch (err) { |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 55 | if (err.response?.status === 404) { |
| 56 | setError('用户不存在'); |
| 57 | } else { |
| 58 | setError('请求失败,请稍后再试'); |
| 59 | } |
| 60 | setUserProfile(null); |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 61 | } |
| 62 | }; |
| 63 | |
| 64 | fetchUserProfile(); |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 65 | }, [user, loading]); |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 66 | |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 67 | if (loading) return <p>正在加载用户信息...</p>; |
| 68 | if (error) return <p className="error">{error}</p>; |
| 69 | if (!userProfile) return null; |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 70 | |
| 71 | return ( |
Krishya | c0f7e9b | 2025-04-22 15:28:28 +0800 | [diff] [blame] | 72 | <div className="user-profile-container"> |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 73 | <Header /> |
| 74 | <div className="user-center"> |
| 75 | <div className="user-nav-container"> |
| 76 | <UserNav /> |
Krishya | c0f7e9b | 2025-04-22 15:28:28 +0800 | [diff] [blame] | 77 | </div> |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 78 | <div className="common-card"> |
| 79 | <div className="right-content"> |
| 80 | <div className="profile-header"> |
| 81 | <img |
| 82 | src={userProfile.avatar_url} |
| 83 | alt={userProfile.nickname} |
| 84 | className="avatar" |
| 85 | /> |
| 86 | <h1>{userProfile.nickname}</h1> |
| 87 | </div> |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 88 | |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 89 | <div className="profile-details"> |
| 90 | <p><strong>邮箱:</strong>{userProfile.email}</p> |
| 91 | <p><strong>性别:</strong>{userProfile.gender}</p> |
| 92 | <p><strong>个人简介:</strong>{userProfile.bio}</p> |
| 93 | <p><strong>兴趣:</strong>{userProfile.interests.length > 0 ? userProfile.interests.join(', ') : '无'}</p> |
| 94 | <p><strong>等级:</strong>{userProfile.level}</p> |
| 95 | <p><strong>经验:</strong>{userProfile.experience}</p> |
| 96 | <p><strong>上传量:</strong>{userProfile.upload_amount}</p> |
| 97 | <p><strong>下载量:</strong>{userProfile.download_amount}</p> |
| 98 | <p><strong>分享率:</strong>{(userProfile.share_rate * 100).toFixed(2)}%</p> |
| 99 | <p><strong>加入时间:</strong>{new Date(userProfile.joined_date).toLocaleDateString()}</p> |
| 100 | </div> |
| 101 | </div> |
Krishya | c0f7e9b | 2025-04-22 15:28:28 +0800 | [diff] [blame] | 102 | </div> |
| 103 | </div> |
22301009 | 7725311 | 2025-04-15 21:30:39 +0800 | [diff] [blame] | 104 | </div> |
| 105 | ); |
| 106 | }; |
| 107 | |
22301009 | 37ebec1 | 2025-06-03 21:17:04 +0800 | [diff] [blame] | 108 | export default UserProfile; |