blob: 5076a0a969b466dcee5632b4e139ecd5f3d39421 [file] [log] [blame]
'use client';
import React, { useEffect, useState, useRef } from "react";
import { Button } from 'primereact/button';
import { Card } from 'primereact/card';
import { Image } from 'primereact/image';
import { Carousel } from 'primereact/carousel';
// 页面跳转
import { useRouter } from 'next/navigation';
// 消息提醒
import { Toast } from 'primereact/toast';
// 评分图标
import { Fire } from '@icon-park/react';
// 接口传输
import axios from 'axios';
import { useLocalStorage } from './hook/useLocalStorage';
// 样式
import './main.scss';
interface User {
Id: number;
}
// 模组列表数据
interface Mod {
resourceId: number;
resourceName: string;
resourcePicture: string;
likes: number;
}
interface ModList {
records: Mod[];
}
// 地图列表数据
interface Map {
resourceId: number;
resourceName: string;
resourcePicture: string;
likes: number;
}
interface MapList {
records: Mod[];
}
// 帖子列表数据
interface Modpack {
resourceId: number;
resourceName: string;
resourcePicture: string;
likes: number;
}
interface ModpackList {
records: Modpack[];
}
// 帖子列表数据
interface Texture {
resourceId: number;
resourceName: string;
resourcePicture: string;
likes: number;
}
interface TextureList {
records: Texture[];
}
// 热门资源幻灯片数据
interface HotResource {
resourceId: number;
resourceName: string;
resourcePicture: string;
}
interface HotResourceList {
records: HotResource[];
}
// 站点统计数据
interface Stats {
threadCount: number;
downloadCount: number;
authorCount: number;
resourceCount: number;
}
// 悬赏列表
interface Reward {
rewardId: number;
userId: number;
rewardPicture: string;
rewardName: string;
createdAt: string;
rewardDescription: string;
price: number;
}
interface RewardList {
total: number; // 总记录数
records: Reward[];
}
// 主页
export default function Home() {
const user = useLocalStorage<User>('user');
const userId: number = user?.Id ?? -1;
console.log(userId)
// 模组列表
const [mods, setMods] = useState<Mod[]>([]);
// 悬赏列表
const [reward, setReweard] = useState<Reward[]>([]);
// 地图列表
const [maps, setMaps] = useState<Map[]>([]);
// 整合包列表
const [modpacks, setModpacks] = useState<Modpack[]>([]);
// 材质包列表
const [textures, setTextures] = useState<Texture[]>([]);
// 热门资源列表
const [hotResources, setHotResources] = useState<HotResource[]>([]);
// 站点统计信息
const [stats, setStats] = useState<Stats>({
threadCount: 0,
downloadCount: 0,
authorCount: 0,
resourceCount: 0
});
// 消息提醒
const toast = useRef<Toast>(null);
const router = useRouter();
// 获取帖子列表
useEffect(() => {
fetchHotResources();
fetchRewards();
fetchstats();
fetchRecommendMods();
fetchRecommendMaps();
fetchRecommendModpacks();
fetchRecommendTextures();
}, []);
// 获取悬赏列表
const fetchRewards = async () => {
try {
const response = await axios.get<RewardList>(process.env.PUBLIC_URL + `/reward`, {
params: { pageNumber: 1, rows: 5, searchValue: '', option: '' }
});
console.log('获取悬赏列表:', response.data.records);
setReweard(response.data.records);
} catch (err) {
console.error('获取悬赏失败', err);
toast.current?.show({ severity: 'error', summary: 'error', detail: '获取悬赏失败' });
}
};
// 获取热门资源幻灯片
const fetchHotResources = async () => {
try {
const response = await axios.get<HotResourceList>(process.env.PUBLIC_URL + `/resource/hot/slide`);
console.log('获取热门社区幻灯片:', response.data.records);
setHotResources(response.data.records);
} catch (err) {
console.error('获取Mod失败', err);
toast.current?.show({ severity: 'error', summary: 'error', detail: '获取Mod失败' });
}
};
// 获取全站数据
const fetchstats = async () => {
try {
const response = await axios.get<Stats>(process.env.PUBLIC_URL + `/total/info`);
console.log('获取全站数据:', response.data);
setStats(response.data);
} catch (err) {
console.error('获取数据失败', err);
toast.current?.show({ severity: 'error', summary: 'error', detail: '获取数据失败' });
}
};
// 获取推荐模组、地图、整合包、材质包
const fetchRecommendMods = async () => {
try {
const response = await axios.get<ModList>(process.env.PUBLIC_URL + `/resource/recommend`, {
params: { userId, pageNumber: 1, rows: 3, classify: '模组', searchValue: '' }
});
console.log('获取模组列表:', response.data.records);
setMods(response.data.records);
} catch (err) {
console.error('获取Mod失败', err);
toast.current?.show({ severity: 'error', summary: 'error', detail: '获取Mod失败' });
}
};
const fetchRecommendMaps = async () => {
try {
const response = await axios.get<MapList>(process.env.PUBLIC_URL + `/resource/recommend`, {
params: { userId, pageNumber: 1, rows: 3, classify: '地图', searchValue: '' }
});
console.log('获取模组列表:', response.data.records);
setMaps(response.data.records);
} catch (err) {
console.error('获取地图失败', err);
toast.current?.show({ severity: 'error', summary: 'error', detail: '获取地图失败' });
}
};
const fetchRecommendModpacks = async () => {
try {
const response = await axios.get<ModpackList>(process.env.PUBLIC_URL + `/resource/recommend`, {
params: { userId, pageNumber: 1, rows: 3, classify: '整合包', searchValue: '' }
});
console.log('获取模组列表:', response.data.records);
setModpacks(response.data.records);
} catch (err) {
console.error('获取整合包失败', err);
toast.current?.show({ severity: 'error', summary: 'error', detail: '获取整合包失败' });
}
};
const fetchRecommendTextures = async () => {
try {
const response = await axios.get<TextureList>(process.env.PUBLIC_URL + `/resource/recommend`, {
params: { userId, pageNumber: 1, rows: 3, classify: '材质包', searchValue: '' }
});
console.log('获取模组列表:', response.data.records);
setTextures(response.data.records);
} catch (err) {
console.error('获取材质包失败', err);
toast.current?.show({ severity: 'error', summary: 'error', detail: '获取材质包失败' });
}
};
return (
<div className="Home">
{/* 轮播图部分 */}
<div className="main-header">
<div className="carousel-wrapper">
<Carousel
value={hotResources}
numVisible={1}
numScroll={1}
showIndicators={false}
showNavigators={true}
className="custom-carousel"
itemTemplate={(hotResource) => (
<div className="carousel-item" onClick={() => router.push(`/resource/resource-detail/${hotResource.resourceId}`)}>
<Image alt="slide" src={process.env.NEXT_PUBLIC_NGINX_URL + hotResource.resourcePicture} className="carousel-avatar" width="700" height="350" />
</div>
)}
/>
</div>
<div className="rewards-panel">
<h2>悬赏排行</h2>
<div className="rewards-list">
{reward.map((item) => (
<div key={item.rewardId} className="reward-item" onClick={() => router.push(`/reward/reward-detail/${item.rewardId}`)}>
<span className="reward-title">{item.rewardName}</span>
<span className="reward-price">${item.price}</span>
</div>
))}
</div>
<Button
label="查看全部悬赏"
className="view-all-button"
onClick={() => router.push('/reward')}
/>
</div>
</div>
{/* 站点统计信息 */}
<div className="site-stats">
<div className="stat-item">
<span className="stat-value">{stats.threadCount}</span>
<span className="stat-label">总帖子数</span>
</div>
<div className="stat-item">
<span className="stat-value">{stats.downloadCount}</span>
<span className="stat-label">下载总数</span>
</div>
<div className="stat-item">
<span className="stat-value">{stats.authorCount}</span>
<span className="stat-label">人数统计</span>
</div>
<div className="stat-item">
<span className="stat-value">{stats.resourceCount}</span>
<span className="stat-label">内容总数</span>
</div>
</div>
{/* 推荐模组列表 */}
<div className="recommended-mods">
<div className="section-header">
<h1>推荐模组资源</h1>
<Button
label="显示更多"
link
onClick={() => router.push('/resource/recommend/模组')}
/>
</div>
<div className="resource-grid">
{mods.map((mod) => (
<Card key={mod.resourceId} className="resource-card" onClick={() => router.push(`/resource/resource-detail/${mod.resourceId}`)}>
<Image
src={process.env.NEXT_PUBLIC_NGINX_URL + mod.resourcePicture}
alt={mod.resourceName}
width="368"
height="200"
/>
<div className="card-content">
<h3>{mod.resourceName}</h3>
<div className="view-count">
<Fire theme="outline" size="16" fill="#FF8D1A" />
<span>{mod.likes}</span>
</div>
</div>
</Card>
))}
</div>
</div>
{/* 推荐地图列表 */}
<div className="recommended-maps">
<div className="section-header">
<h1>推荐地图资源</h1>
<Button
label="显示更多"
link
onClick={() => router.push('/resource/recommend/地图')}
/>
</div>
<div className="resource-grid">
{maps.map((map) => (
<Card key={map.resourceId} className="resource-card" onClick={() => router.push(`/resource/resource-detail/${map.resourceId}`)}>
<Image
src={process.env.NEXT_PUBLIC_NGINX_URL + map.resourcePicture}
alt={map.resourceName}
width="368"
height="200"
/>
<div className="card-content">
<h3>{map.resourceName}</h3>
<div className="view-count">
<Fire theme="outline" size="16" fill="#FF8D1A" />
<span>{map.likes}</span>
</div>
</div>
</Card>
))}
</div>
</div>
{/* 推荐材质包列表 */}
<div className="recommended-textures">
<div className="section-header">
<h1>推荐材质包资源</h1>
<Button
label="显示更多"
link
onClick={() => router.push('/resource/recommend/材质包')}
/>
</div>
<div className="resource-grid">
{textures.map((texture) => (
<Card key={texture.resourceId} className="resource-card" onClick={() => router.push(`/resource/resource-detail/${texture.resourceId}`)}>
<Image
src={process.env.NEXT_PUBLIC_NGINX_URL + texture.resourcePicture}
alt={texture.resourceName}
width="368"
height="200"
/>
<div className="card-content">
<h3>{texture.resourceName}</h3>
<div className="view-count">
<Fire theme="outline" size="16" fill="#FF8D1A" />
<span>{texture.likes}</span>
</div>
</div>
</Card>
))}
</div>
</div>
{/* 推荐整合包列表 */}
<div className="recommended-Modpacks">
<div className="section-header">
<h1>推荐整合包资源</h1>
<Button
label="显示更多"
link
onClick={() => router.push('/resource/recommend/整合包')}
/>
</div>
<div className="resource-grid">
{modpacks.map((modpack) => (
<Card key={modpack.resourceId} className="resource-card" onClick={() => router.push(`/resource/${modpack.resourceId}`)}>
<Image
src={process.env.NEXT_PUBLIC_NGINX_URL + modpack.resourcePicture}
alt={modpack.resourceName}
width="368"
height="200"
/>
<div className="card-content">
<h3>{modpack.resourceName}</h3>
<div className="view-count">
<Fire theme="outline" size="16" fill="#FF8D1A" />
<span>{modpack.likes}</span>
</div>
</div>
</Card>
))}
</div>
</div>
</div>
);
}