Files
teach_sys_Demo/src/pages/PersonalProfile/components/ProfileCard/index.jsx
2025-08-19 22:35:01 +08:00

134 lines
4.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Avatar } from "@arco-design/web-react";
import { useState, useEffect } from "react";
import { studentAPI } from "@/services/api";
import { mapProfile } from "@/utils/dataMapper";
import "./index.css";
const ProfileCard = () => {
const [profile, setProfile] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchProfile();
}, []);
const fetchProfile = async () => {
try {
setLoading(true);
// Get current logged-in student information
const studentData = await studentAPI.getCurrentStudent();
if (studentData) {
const mappedProfile = mapProfile(studentData);
setProfile(mappedProfile);
} else {
throw new Error("Failed to get current student data");
}
} catch (error) {
console.error("Failed to fetch profile:", error);
// Show error message instead of fake data
setProfile({
name: "数据加载失败",
studentId: "请检查后端服务",
school: error.message || "后端未运行",
major: "请确保数据库已初始化",
badges: {
credits: 0,
classRank: 0,
mbti: "-"
},
courses: []
});
} finally {
setLoading(false);
}
};
if (loading) {
return (
<div className="profile-card-wrapper" style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center'
}}>
<p>加载中...</p>
</div>
);
}
return (
<div className="profile-card-wrapper">
<div className="profile-card-user-info">
<Avatar className="profile-card-user-avatar">
<img
alt="avatar"
src="//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp"
/>
</Avatar>
<div className="profile-card-user-name">
<span className="profile-card-user-name-text">{profile?.name}</span>
<p className="profile-card-user-name-student-id">
学号 {profile?.studentId}
</p>
</div>
</div>
<ul className="profile-card-achievement-info">
<li className="profile-card-achievement-info-item">
<span className="profile-card-achievement-info-item-title">学分</span>
<span className="profile-card-achievement-info-item-text">
{profile?.badges?.credits || 0}
</span>
</li>
<li className="profile-card-achievement-info-item">
<span className="profile-card-achievement-info-item-title">
班级排名
</span>
<span className="profile-card-achievement-info-item-text">
{profile?.badges?.classRank || '-'}
</span>
</li>
<li className="profile-card-achievement-info-item">
<span className="profile-card-achievement-info-item-title">MBTI</span>
<span className="profile-card-achievement-info-item-text">
{profile?.badges?.mbti || '-'}
</span>
</li>
</ul>
<ul className="profile-card-class-info">
<li className="profile-card-class-info-item">
<i className="profile-card-class-info-item-icon icon-school" />
<span className="profile-card-class-info-item-title">学校</span>
<span className="profile-card-class-info-item-text">
{profile?.school || '-'}
</span>
</li>
<li className="profile-card-class-info-item">
<i className="profile-card-class-info-item-icon icon-major" />
<span className="profile-card-class-info-item-title">专业</span>
<span className="profile-card-class-info-item-text">
{profile?.major || '-'}
</span>
</li>
<li className="profile-card-class-info-item">
<i className="profile-card-class-info-item-icon icon-location" />
<span className="profile-card-class-info-item-title">
班级
</span>
<span className="profile-card-class-info-item-text">
{profile?.className || '-'}
</span>
</li>
<li className="profile-card-class-info-item">
<i className="profile-card-class-info-item-icon icon-course" />
<span className="profile-card-class-info-item-title">学习阶段</span>
<span className="profile-card-class-info-item-text">
{profile?.stageName || '-'}
</span>
</li>
</ul>
</div>
);
};
export default ProfileCard;