201 lines
6.5 KiB
JavaScript
201 lines
6.5 KiB
JavaScript
'use client';
|
|
|
|
import { useState, useEffect } from 'react';
|
|
import { Box, Container, Typography, Paper, useTheme, alpha } from '@mui/material';
|
|
import StorageIcon from '@mui/icons-material/Storage';
|
|
import Navbar from '@/components/Navbar/index';
|
|
import { DatasetSearchBar } from '@/components/dataset-square/DatasetSearchBar';
|
|
import { DatasetSiteList } from '@/components/dataset-square/DatasetSiteList';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
export default function DatasetSquarePage() {
|
|
const [projects, setProjects] = useState([]);
|
|
const theme = useTheme();
|
|
const { t } = useTranslation();
|
|
|
|
// 获取项目列表和模型列表
|
|
useEffect(() => {
|
|
async function fetchData() {
|
|
try {
|
|
// 获取用户创建的项目详情
|
|
const response = await fetch('/api/projects');
|
|
if (response.ok) {
|
|
const projectsData = await response.json();
|
|
setProjects(projectsData);
|
|
}
|
|
} catch (error) {
|
|
console.error('获取数据失败:', error);
|
|
}
|
|
}
|
|
|
|
fetchData();
|
|
}, []);
|
|
|
|
return (
|
|
<main>
|
|
{/* 导航栏 */}
|
|
<Navbar projects={projects} />
|
|
|
|
{/* 头部区域 */}
|
|
<Box
|
|
sx={{
|
|
pt: 10,
|
|
pb: 8,
|
|
background:
|
|
theme.palette.mode === 'dark'
|
|
? `linear-gradient(135deg, ${alpha(theme.palette.primary.dark, 0.6)} 0%, ${alpha(theme.palette.background.default, 0.9)} 100%)`
|
|
: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.9)} 0%, ${alpha(theme.palette.primary.light, 0.7)} 100%)`,
|
|
borderBottom: `1px solid ${alpha(theme.palette.divider, 0.1)}`,
|
|
position: 'relative',
|
|
boxShadow: '0 4px 20px rgba(0,0,0,0.1)'
|
|
}}
|
|
>
|
|
{/* 背景装饰 */}
|
|
<Box
|
|
sx={{
|
|
position: 'absolute',
|
|
top: -100,
|
|
left: -100,
|
|
width: 300,
|
|
height: 300,
|
|
borderRadius: '50%',
|
|
background: `radial-gradient(circle, ${alpha(theme.palette.secondary.main, 0.2)} 0%, transparent 70%)`,
|
|
filter: 'blur(40px)',
|
|
zIndex: 0
|
|
}}
|
|
/>
|
|
<Box
|
|
sx={{
|
|
position: 'absolute',
|
|
bottom: -80,
|
|
right: -80,
|
|
width: 350,
|
|
height: 350,
|
|
borderRadius: '50%',
|
|
background: `radial-gradient(circle, ${alpha(theme.palette.primary.light, 0.15)} 0%, transparent 70%)`,
|
|
filter: 'blur(30px)',
|
|
zIndex: 0
|
|
}}
|
|
/>
|
|
<Box
|
|
sx={{
|
|
position: 'absolute',
|
|
top: '40%',
|
|
right: '10%',
|
|
width: 100,
|
|
height: 100,
|
|
borderRadius: '50%',
|
|
background: `radial-gradient(circle, ${alpha(theme.palette.secondary.light, 0.15)} 0%, transparent 70%)`,
|
|
filter: 'blur(20px)',
|
|
zIndex: 0
|
|
}}
|
|
/>
|
|
|
|
<Container maxWidth="lg" sx={{ position: 'relative', zIndex: 1 }}>
|
|
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', mb: 3 }}>
|
|
<StorageIcon
|
|
sx={{
|
|
fontSize: 48,
|
|
mr: 2.5,
|
|
color: theme.palette.mode === 'dark' ? theme.palette.secondary.light : 'white',
|
|
filter: 'drop-shadow(0 2px 5px rgba(0,0,0,0.2))'
|
|
}}
|
|
/>
|
|
<Typography
|
|
variant="h2"
|
|
component="h1"
|
|
sx={{
|
|
fontWeight: 800,
|
|
color: 'white',
|
|
textShadow: '0 2px 8px rgba(0,0,0,0.15)',
|
|
mb: 0,
|
|
letterSpacing: '-0.5px',
|
|
background:
|
|
theme.palette.mode === 'dark'
|
|
? 'linear-gradient(90deg, #ffffff 0%, #e0e0e0 100%)'
|
|
: 'linear-gradient(90deg, #ffffff 30%, #f5f5f5 100%)',
|
|
WebkitBackgroundClip: 'text',
|
|
WebkitTextFillColor: 'transparent',
|
|
backgroundClip: 'text',
|
|
textFillColor: 'transparent'
|
|
}}
|
|
>
|
|
{t('datasetSquare.title')}
|
|
</Typography>
|
|
</Box>
|
|
<Typography
|
|
variant="h5"
|
|
align="center"
|
|
sx={{
|
|
maxWidth: 800,
|
|
mx: 'auto',
|
|
mb: 6,
|
|
color: theme.palette.mode === 'dark' ? alpha('#FFFFFF', 0.9) : '#FFFFFF',
|
|
fontWeight: 400,
|
|
lineHeight: 1.6,
|
|
textShadow: '0 1px 3px rgba(0,0,0,0.1)'
|
|
}}
|
|
>
|
|
{t('datasetSquare.subtitle')}
|
|
</Typography>
|
|
|
|
{/* 搜索栏组件 */}
|
|
<Box
|
|
sx={{
|
|
maxWidth: 800,
|
|
mx: 'auto',
|
|
position: 'relative',
|
|
zIndex: 10
|
|
}}
|
|
>
|
|
<Paper
|
|
elevation={6}
|
|
sx={{
|
|
width: '100%',
|
|
p: 2.5,
|
|
borderRadius: 3,
|
|
background: 'transparent',
|
|
backdropFilter: 'blur(10px)',
|
|
boxShadow:
|
|
theme.palette.mode === 'dark' ? '0 10px 40px rgba(0,0,0,0.3)' : '0 10px 40px rgba(0,0,0,0.15)',
|
|
border: `1px solid ${alpha(theme.palette.primary.main, 0.1)}`,
|
|
transform: 'translateY(0)',
|
|
transition: 'transform 0.3s ease, box-shadow 0.3s ease',
|
|
'&:hover': {
|
|
transform: 'translateY(-5px)',
|
|
boxShadow:
|
|
theme.palette.mode === 'dark' ? '0 15px 50px rgba(0,0,0,0.4)' : '0 15px 50px rgba(0,0,0,0.2)'
|
|
},
|
|
overflow: 'visible' // 确保不裁剪子元素
|
|
}}
|
|
>
|
|
<DatasetSearchBar />
|
|
</Paper>
|
|
</Box>
|
|
</Container>
|
|
</Box>
|
|
|
|
{/* 内容区域 */}
|
|
<Container maxWidth="lg" sx={{ py: 8 }}>
|
|
{/* 数据集网站列表组件 */}
|
|
<Paper
|
|
elevation={0}
|
|
sx={{
|
|
p: { xs: 2, sm: 4 },
|
|
borderRadius: 3,
|
|
bgcolor:
|
|
theme.palette.mode === 'dark'
|
|
? alpha(theme.palette.background.paper, 0.6)
|
|
: theme.palette.background.paper,
|
|
backdropFilter: 'blur(8px)',
|
|
border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,
|
|
boxShadow: theme.palette.mode === 'dark' ? '0 4px 20px rgba(0,0,0,0.2)' : '0 4px 20px rgba(0,0,0,0.05)'
|
|
}}
|
|
>
|
|
<DatasetSiteList />
|
|
</Paper>
|
|
</Container>
|
|
</main>
|
|
);
|
|
}
|