宠物部分
Change-Id: I57d26086523c2588778f55873c36c58a2597d6fc
diff --git a/src/views/homepage/homepage.module.css b/src/views/homepage/homepage.module.css
index fdcc060..cd57580 100644
--- a/src/views/homepage/homepage.module.css
+++ b/src/views/homepage/homepage.module.css
@@ -1,25 +1,9 @@
-/* 主题色变量 */
-/* :root {
- --primary-color: #3498db;
- --primary-hover: #2980b9;
- --secondary-color: #f1c40f;
- --dark-color: #2c3e50;
- --light-color: #ecf0f1;
- --text-color: #333;
- --text-secondary: #7f8c8d;
- --border-color: #ddd;
- } */
-
- /* --bg-color: #2b2b2b;
- --text-color: #f1f1f1;
- --card-bg: #1e1e1e;
- --border-color: #444444; */
-
.container {
min-height: 100vh;
background-color: var(--bg-color);
color: var(--text-color);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ overflow: hidden;
}
/* 顶部导航栏 */
@@ -157,8 +141,14 @@
/* 作品区 */
.worksSection {
margin-top: 30px;
+ max-height: 450px;
+ overflow-y: auto;
}
-
+
+ .worksSection::-webkit-scrollbar {
+ width: 6px;
+ }
+
.sectionTitle {
margin: 0 0 20px 0;
color: var(--dark-color);
diff --git a/src/views/homepage/homepage.tsx b/src/views/homepage/homepage.tsx
index ec74187..dab0c0f 100644
--- a/src/views/homepage/homepage.tsx
+++ b/src/views/homepage/homepage.tsx
@@ -1,10 +1,10 @@
import React, { useCallback, useEffect,useState,useRef } from 'react';
import styles from './homepage.module.css';
import { useApi } from '@/hooks/request';
-import { useSelector } from 'react-redux';
+import { useAppSelector } from '@/hooks/store';
import { RootState } from '@/store';
import { useNavigate } from 'react-router';
-import logo from '&/assets/logo.png';
+import Logo from '&/assets/logo.png';
import { getUserMessage } from '@/api/homepage'
import { getUserDetail } from '@/api/homepage'
import request from '@/utils/request'
@@ -12,6 +12,14 @@
import { postUserLogin } from '@/api/auth';
import { debounce } from 'lodash';
import { Q } from 'react-router/dist/development/fog-of-war-CGNKxM4z';
+import head from '&/assets/head.jpg'
+import lv_one from '&/assets/pet/lv_one.png'
+import lv_two from '&/assets/pet/lv_two.png'
+import lv_three from '&/assets/pet/lv_three.png'
+import lv_four from '&/assets/pet/lv_four.png'
+import lv_five from '&/assets/pet/lv_five.png'
+import PetGame from '@/components/pet'
+
interface WorkItem {
postId: number,
@@ -46,25 +54,47 @@
const [works, setWorks] = useState<WorkItem[]>([]);
const worksRef = useRef<WorkItem[]>([]);
-
const navigate = useNavigate();
- const userInfo = useSelector((state: RootState) => state.user);
+ const userInfo = useAppSelector((state: RootState) => state.user);
const userId = userInfo.userId; // 从Redux获取当前用户ID
+ const levelImages: { [key: string]: string } = {
+ 'lv1': lv_one,
+ 'lv2': lv_two,
+ 'lv3': lv_three,
+ 'lv4': lv_four,
+ 'lv5': lv_five
+ };
+
const { data:userdata, loading:userloading, error:usererror, refresh: getUserDetailRefresh } = useApi(
- () => request.get(getUserDetail, {params: {userId}}).then(res => res.data.data),
+ () => request.get(getUserDetail, {params: {userId}}),
+ false
);
- const { data:workdata, loading:workloading, error:workerror, refresh: getUserMessageRefresh } = useApi(
- () => request.get(getUserMessage, { params: { userId } }).then(res => res.data.data),
+ const { data: workdata, loading: workloading, error: workerror, refresh: getUserMessageRefresh } = useApi(
+ () => request.get(`${getUserMessage}/${userId}`), // 注意这里拼接了 userId
false
);
const getUserDetails = debounce(async () => {
try{
- const res = await getUserDetailRefresh({userId});
- console.log("res", res);
- setUserStats(res);
+ // const res = await getUserDetailRefresh({userId});
+ const res = await getUserDetailRefresh();
+ const data_1 = res?.userInfo;
+ const data_2 = res?.statistics;
+ console.log('data', data_1)
+ const formatted: UserStats = {
+ username: data_1.userName,
+ uploadAmount: data_1.uploadAmount,
+ level: data_1.userLevel,
+ likes: data_2.likes,
+ following: data_2.followingCount,
+ followers: data_2.followersCount,
+ mutualFollows: data_2.mutualFollows
+ };
+
+ setUserStats(formatted);
+ console.log('formatted:',formatted)
}catch(error){
console.error('获取用户信息错误', error);
}
@@ -72,15 +102,21 @@
const getUserPost = debounce(async () => {
- try{
- const res = await getUserMessageRefresh({userId});
+ try {
+ const url = `${getUserMessage}/${userId}`; // ✅ 正确的 URL 拼接方式
+ console.log("请求发送:", url);
+
+ // 不需要传 userId 参数了,因为 URL 已包含它
+ const res = await getUserMessageRefresh();
console.log("res", res);
+
worksRef.current = res;
setWorks(res);
- }catch(error) {
+ } catch (error) {
console.error('获取帖子列表错误', error);
}
- },1000) as () => void;
+ }, 1000) as () => void;
+
useEffect(() => {
if (!userId) {
@@ -105,13 +141,13 @@
<div className={styles.userProfile}>
<div className={styles.userHeader}>
<img
- src={userInfo.avatar || '/default-avatar.png'}
+ src={head}
alt="用户头像"
className={styles.userAvatar}
/>
<div className={styles.userInfo}>
- <h2 className={styles.username}>阳菜,放睛!</h2>
- <div className={styles.inviteCode}>邀请码:1314520</div>
+ <h2 className={styles.username}>{userStats?.username}</h2>
+ <div className={styles.inviteCode}>邀请码:123456</div>
<button className={styles.editButton}>编辑主页</button>
</div>
</div>
@@ -129,10 +165,10 @@
<div className={styles.statNumber}>{userStats?.followers ?? '--'}</div>
<div className={styles.statLabel}>粉丝</div>
</div>
- <div className={styles.statItem}>
+ {/* <div className={styles.statItem}>
<div className={styles.statNumber}>{userStats?.mutualFollows ?? '--'}</div>
<div className={styles.statLabel}>互关</div>
- </div>
+ </div> */}
</div>
<div className={styles.userData}>
@@ -168,14 +204,15 @@
<div className={styles.petSection}>
<h3 className={styles.sectionTitle}>宠物图</h3>
<div className={styles.petContainer}>
- <img
- src="/assets/pet-blue-star.png"
- alt="蓝色星星宠物"
- className={styles.petImage}
- />
+ <img
+ src={levelImages[userStats?.level || 'lv5']} // 默认用 '1' 级
+ alt={`等级${userStats?.level}宠物`}
+ className={styles.petImage}
+ />
</div>
+ <PetGame/>
</div>
-
+
</div>
</div>
</div>