blob: f9891d7ba6d71a8311264a424063a4d0721e2df8 [file] [log] [blame]
zhaoyumaof8f81842025-06-09 00:00:46 +08001// 写一个简单的欢迎界面
2import React, { useEffect, useState } from 'react';
3import { Card, Statistic, Row, Col, Divider, Button } from 'antd';
4import { LikeOutlined, HeartOutlined, EyeOutlined } from '@ant-design/icons';
5import { getUserInfo } from '@/services/session';
6import styles from './index.module.css'; // 假设我们创建了一个CSS模块文件
7import './css/stars-style.css'
8import { Flex } from 'antd';
9import { Typography } from "@mui/material";
10import { useRequest } from '@umijs/max';
11import { getPlanetList, updatePlanet, getUserPlanet, getPlanetInfo, PlanetEntity } from '@/services/planets/api';
Jiarenxiang56cbf662025-06-09 21:46:47 +080012import {generatePassKey} from '../../services/bt/index'
Jiarenxiang36728482025-06-07 21:51:26 +080013
zhaoyumaof8f81842025-06-09 00:00:46 +080014const Welcome: React.FC = () => {
15 // 获取用户信息
16 // const { data: userInfo, loading } = useRequest(async () => {
17 // return { data: await getUserInfo() };
18 // });
Jiarenxiang36728482025-06-07 21:51:26 +080019
zhaoyumaof8f81842025-06-09 00:00:46 +080020 const { data: userInfo, loading } = useRequest(async () => {
21 const userRes = await getUserInfo();
22 // 假设 userId 为字符串类型,需要将其转换为数字类型,同时处理可能的 undefined 情况
23 const userId = userRes.user.userId ? parseInt(userRes.user.userId, 10) : 1;
24 const UserplanetRes = await getUserPlanet({ userId });
25 const planetId = UserplanetRes.planetId || 1;
26 const planetRes = await getPlanetInfo({ planetId });
Jiarenxiang36728482025-06-07 21:51:26 +080027
zhaoyumaof8f81842025-06-09 00:00:46 +080028 return {
29 data: {
30 ...userRes.user,
31 planet: planetRes
32 }
33 };
34 });
Jiarenxiang36728482025-06-07 21:51:26 +080035
zhaoyumaof8f81842025-06-09 00:00:46 +080036 if (loading) {
37 return <div>loading...</div>;
38 }
Jiarenxiang36728482025-06-07 21:51:26 +080039
zhaoyumaof8f81842025-06-09 00:00:46 +080040 const currentUser = userInfo;
Jiarenxiang36728482025-06-07 21:51:26 +080041
zhaoyumaof8f81842025-06-09 00:00:46 +080042 console.log(currentUser)
43 return (
44 <div>
45 <div className="origin">
46 <div className="control">
47 <div className="galaxy">
48 <div className="star"></div>
49 <div className="star"></div>
50 <div className="star"></div>
51 <div className="star"></div>
52 <div className="star"></div>
53 <div className="star"></div>
54 <div className="star"></div>
55 <div className="star"></div>
56 <div className="star"></div>
57 <div className="star"></div>
58 <div className="star"></div>
59 <div className="star"></div>
60 <div className="star"></div>
61 <div className="star"></div>
62 <div className="star"></div>
63 <div className="star"></div>
64 <div className="star"></div>
65 <div className="star"></div>
66 <div className="star"></div>
67 <div className="star"></div>
68 <div className="star"></div>
69 <div className="star"></div>
70 <div className="star"></div>
71 <div className="star"></div>
72 <div className="star"></div>
73 <div className="star"></div>
74 <div className="star"></div>
75 <div className="star"></div>
76 <div className="star"></div>
77 <div className="star"></div>
78 <div className="star"></div>
79 <div className="star"></div>
80 <div className="star"></div>
81 <div className="star"></div>
82 <div className="star"></div>
83 <div className="star"></div>
84 <div className="star"></div>
85 <div className="star"></div>
86 <div className="star"></div>
87 <div className="star"></div>
88 <div className="star"></div>
89 <div className="star"></div>
90 <div className="star"></div>
91 <div className="star"></div>
92 <div className="star"></div>
93 <div className="star"></div>
94 <div className="star"></div>
95 <div className="star"></div>
96 <div className="star"></div>
97 <div className="star"></div>
98 <div className="star"></div>
99 <div className="star"></div>
100 <div className="star"></div>
101 <div className="star"></div>
102 <div className="star"></div>
103 <div className="star"></div>
104 <div className="star"></div>
105 <div className="star"></div>
106 <div className="star"></div>
107 <div className="star"></div>
108 <div className="star"></div>
109 <div className="star"></div>
110 <div className="star"></div>
111 <div className="star"></div>
112 <div className="star"></div>
113 <div className="star"></div>
114 <div className="star"></div>
115 <div className="star"></div>
116 <div className="star"></div>
117 <div className="star"></div>
118 <div className="star"></div>
119 <div className="star"></div>
120 <div className="star"></div>
121 <div className="star"></div>
122 <div className="star"></div>
123 <div className="star"></div>
124 <div className="star"></div>
125 <div className="star"></div>
126 <div className="star"></div>
127 <div className="star"></div>
128 <div className="star"></div>
129 <div className="star"></div>
130 <div className="star"></div>
131 <div className="star"></div>
132 <div className="star"></div>
133 <div className="star"></div>
134 <div className="star"></div>
135 <div className="star"></div>
136 <div className="star"></div>
137 <div className="star"></div>
138 <div className="star"></div>
139 <div className="star"></div>
140 <div className="star"></div>
141 <div className="star"></div>
142 <div className="star"></div>
143 <div className="star"></div>
144 <div className="star"></div>
145 <div className="star"></div>
146 <div className="star"></div>
147 <div className="star"></div>
148 <div className="star"></div>
149 <div className="star"></div>
150 <div className="star"></div>
151 <div className="star"></div>
152 <div className="star"></div>
153 <div className="star"></div>
154 <div className="star"></div>
155 <div className="star"></div>
156 <div className="star"></div>
157 <div className="star"></div>
158 <div className="star"></div>
159 <div className="star"></div>
160 <div className="star"></div>
161 <div className="star"></div>
162 <div className="star"></div>
163 <div className="star"></div>
164 <div className="star"></div>
165 <div className="star"></div>
166 <div className="star"></div>
167 <div className="star"></div>
168 <div className="star"></div>
169 <div className="star"></div>
170 <div className="star"></div>
171 <div className="star"></div>
172 <div className="star"></div>
173 <div className="star"></div>
174 <div className="star"></div>
175 <div className="star"></div>
176 <div className="star"></div>
177 <div className="star"></div>
178 <div className="star"></div>
179 <div className="star"></div>
180 <div className="star"></div>
181 <div className="star"></div>
182 <div className="star"></div>
183 <div className="star"></div>
184 <div className="star"></div>
185 <div className="star"></div>
186 <div className="star"></div>
187 <div className="star"></div>
188 <div className="star"></div>
189 <div className="star"></div>
190 <div className="star"></div>
191 <div className="star"></div>
192 <div className="star"></div>
193 <div className="star"></div>
194 <div className="star"></div>
195 <div className="star"></div>
196 <div className="star"></div>
197 <div className="star"></div>
198 <div className="star"></div>
199 <div className="star"></div>
200 <div className="star"></div>
201 <div className="star"></div>
202 <div className="star"></div>
203 <div className="star"></div>
204 <div className="star"></div>
205 <div className="star"></div>
206 <div className="star"></div>
207 <div className="star"></div>
208 <div className="star"></div>
209 <div className="star"></div>
210 <div className="star"></div>
211 <div className="star"></div>
212 <div className="star"></div>
213 <div className="star"></div>
214 <div className="star"></div>
215 <div className="star"></div>
216 <div className="star"></div>
217 <div className="star"></div>
218 <div className="star"></div>
219 <div className="star"></div>
220 <div className="star"></div>
221 <div className="star"></div>
222 <div className="star"></div>
223 <div className="star"></div>
224 <div className="star"></div>
225 <div className="star"></div>
226 <div className="star"></div>
227 <div className="star"></div>
228 <div className="star"></div>
229 <div className="star"></div>
230 <div className="star"></div>
231 <div className="star"></div>
232 <div className="star"></div>
233 <div className="star"></div>
234 <div className="star"></div>
235 <div className="star"></div>
236 <div className="star"></div>
237 <div className="star"></div>
238 <div className="star"></div>
239 <div className="star"></div>
240 <div className="star"></div>
241 <div className="star"></div>
242 <div className="star"></div>
243 <div className="star"></div>
244 <div className="star"></div>
245 <div className="star"></div>
246 <div className="star"></div>
247 <div className="star"></div>
248 </div>
Jiarenxiang36728482025-06-07 21:51:26 +0800249 </div>
zhaoyumaof8f81842025-06-09 00:00:46 +0800250 </div>
251 <div className="main">
252 <div>
253
254 {/* 第一排:悬浮搜索框 */}
Jiarenxiang56cbf662025-06-09 21:46:47 +0800255 <div style={{ display: 'flex', alignItems: 'center' }}>
256 <div className={styles.searchBarContainer}>
257 <input type="text" placeholder="Search for everything..." className={styles.searchInput} />
258 </div>
259 <Button
260 type="primary"
261 style={{ marginLeft: 16 }}
262 onClick={async () => {
263 try {
264 const res = await generatePassKey();
265 if (res && res.code === 0 && res.data && res.data.passkey) {
266 window.alert(`邀请码: ${res.data.passkey}`);
267 } else {
268 window.alert('邀请码生成失败');
269 }
270 } catch (e) {
271 window.alert('邀请码生成失败');
272 }
273 }}
274 >
275 邀请他人
276 </Button>
277 </div>
zhaoyumaof8f81842025-06-09 00:00:46 +0800278 <div style={{ display: "flex", marginTop: '40px' }}>
279 <div className={styles.leftBox}>
280 <div className={styles.textContent}>
281 <Typography
282 variant="h4"
283 sx={{
284 color: "#fff",
285 fontWeight: 600,
286 mb: 2,
287 letterSpacing: 2,
288 textShadow: "0 2px 16px #0ea5e9",
289 }}
290 >
291 Welcome Back!
292 </Typography>
293
294 <h2 className={styles.titlebox}>{currentUser?.nickName},整点什么?</h2>
295 <Button style={{ width: "100px" }} size='small' type="primary" onClick={() => window.location.href = '/relation'}>我的形象</Button>
296 </div>
297 <div className={styles.gitAnimation}>
298 <img
299 src={`/images/planets/${userInfo?.planet?.filename}.gif`}
300 alt="用户形象"
301 style={{
302 width: 150,
303 height: 150,
304 borderRadius: '50%',
305 border: '2px solid #4a4a7a',
306 boxShadow: '0 0 15px #6a5acd'
307 }}
308 />
309 </div>
310 </div>
311
312 {/* 新增右侧统计卡片(使用Ant Design组件) */}
313 <Card className={styles.rightCard} title="种子统计" bordered={false}>
314 <Row gutter={16}>
315 <Col span={8}>
316 <Statistic title="总种子数" value={128} />
317 </Col>
318 <Col span={8}>
319 <Statistic title="活跃种子" value={42} />
320 </Col>
321 <Col span={8}>
322 <Statistic title="完成种子" value={86} />
323 </Col>
324 </Row>
325 <Divider />
326 </Card>
327 <Card className={styles.rightCard2} >
328
329 <Flex className={styles.buttonGroup}>
330 <div style={{
331 fontSize: '16px',
332 color: '#a8b2d1',
333 letterSpacing: '1px'
334 }}>来看看星球的
335 </div>
336 <div style={{
337 fontSize: '23px',
338 color: '#0abde3',
339 letterSpacing: '1px',
340 fontWeight: 'bold',
341 }}>
342 种子
343 </div>
344 <Button type="primary" onClick={() => window.location.href = '/torrent-upload'}>新建种子</Button>
Jiarenxiang56cbf662025-06-09 21:46:47 +0800345 <Button onClick={() => window.location.href = '/torrent-list-my'}>我的种子</Button>
zhaoyumaof8f81842025-06-09 00:00:46 +0800346 </Flex>
347 </Card>
348
349 <Card className={styles.rightCard2} >
350
351 <Flex className={styles.buttonGroup}>
352 <div style={{
353 fontSize: '16px',
354 color: '#a8b2d1',
355 letterSpacing: '1px'
356 }}>现在看看星球
357 </div>
358 <div style={{
359 fontSize: '23px',
360 color: '#e1b12c',
361 letterSpacing: '1px',
362 fontWeight: 'bold',
363 }}>
364 动态
365 </div>
366 <Button color="orange" variant="solid" onClick={() => window.location.href = '/user-center'}>立即创作</Button>
367 <Button onClick={() => window.location.href = '/user-center'}>我的创作</Button>
368 </Flex>
369 </Card>
370
371 </div>
372
373 <div className={styles.homeContainer}>
374
375 {/* 第二排:左侧欢迎信息和右侧通知公告 */}
376 <div className={styles.secondRow}>
377 {/* 左侧框 */}
378 {/* 中间框:最新热点 */}
379 <div className={styles.middleBox}>
380 <div className={styles.hotSpot}>
381 <h3 className={styles.hotTitle}>排行榜动态</h3>
382 <ul className={styles.hotList}>
383 {Array.from({ length: 5 }, (_, i) => (
384 <li key={i} className={styles.hotItem}>
385 <span className={styles.hotItemNumber}>{`${i + 1}`}</span>
386 <span className={styles.hotItemText}>综合榜{`${i + 1}`}</span>
387 </li>
388 ))}
389 </ul>
390 </div>
391 </div>
392
393 {/* 右侧框:通知公告(轮播样式) */}
394 <div className={styles.rightBox}>
395 <div className={styles.carouselContainer}>
396 {/* 轮播内容,这里用几个div模拟 */}
397 <div className={styles.carouselItem}>通知公告 1</div>
398 <div className={styles.carouselItem}>通知公告 2</div>
399 <div className={styles.carouselItem}>通知公告 3</div>
400 </div>
401 </div>
402 </div>
403 {/* 第三排:帖子卡片 */}
404 <div className={styles.thirdRow}>
405 {Array.from({ length: 16 }, (_, i) => (
406 <div className={styles.postCard} key={i}>
407 <div className={styles.cardContent}>
408 <h3 className={styles.postTitle}>模拟帖子标题{`${i + 1}`}(这是一个可能会很长的标题测试单行缩略效果)</h3>
409 <img src="/images/post-cover.jpg" alt="帖子封面" className={styles.cardImage} />
410 <div className={styles.infoWrapper}>
411 <p className={styles.postAuthor}>作者:用户{`${i + 1}`}</p>
412 <div className={styles.tagsContainer}>
413 {['技术', '生活', '分享'].map((tag, idx) => (
414 <span className={styles.tag} key={idx}>{tag}</span>
415 ))}
416 </div>
417 <div className={styles.statsContainer}>
418 <span className={styles.statItem}><LikeOutlined /> {Math.floor(Math.random() * 1000)}</span>
419 <span className={styles.statItem}><HeartOutlined /> {Math.floor(Math.random() * 500)}</span>
420 <span className={styles.statItem}><EyeOutlined /> {Math.floor(Math.random() * 5000)}</span>
421 </div>
422 </div>
423 </div>
424 </div>
425 ))}
426 </div>
427 </div>
428 </div>
429 </div>
430 </div>
431 );
Jiarenxiang36728482025-06-07 21:51:26 +0800432};
433
zhaoyumaof8f81842025-06-09 00:00:46 +0800434export default Welcome;