Merge "fix: hot trend, thread-detail" into main
diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx
index c48b626..5f6642b 100644
--- a/src/app/search/page.tsx
+++ b/src/app/search/page.tsx
@@ -1,12 +1,120 @@
'use client';
-import React from 'react';
-const EmptyPage: React.FC = () => {
+import React, { useRef, useState } from 'react';
+import { InputText } from 'primereact/inputtext';
+import { Button } from 'primereact/button';
+import { Card } from 'primereact/card';
+import { Tag } from 'primereact/tag';
+import { Image } from 'primereact/image';
+import { Paginator, PaginatorPageChangeEvent } from 'primereact/paginator';
+// 页面跳转
+import { useRouter } from 'next/navigation';
+// 评分图标
+import { Fire } from '@icon-park/react';
+import { RobotOne } from '@icon-park/react';
+import axios from 'axios';
+
+import './search-page.scss';
+
+interface Resource {
+ resourceId: number;
+ resourceName: string;
+ resourcePicture: string;
+ resourceSummary: string;
+ lastUpdateTime: string;
+ hot: number;
+ gamePlayList: { gameplayName: string }[];
+}
+
+export default function SmartSearchPage() {
+ const [input, setInput] = useState('');
+ const [isSearched, setIsSearched] = useState(false);
+
+ const [resources, setResources] = useState<Resource[]>([]);
+ const [page, setPage] = useState(0);
+ const [rows, setRows] = useState(5);
+ const [totalRecords, setTotalRecords] = useState(0);
+ const scrollRef = useRef<HTMLDivElement>(null);
+ const router = useRouter();
+ const fetchSearch = async (query: string, page: number, size: number) => {
+ console.log(page, size,)
+ const res = await axios.get(process.env.PUBLIC_URL + '/ai', {
+ params: { input: query, pageNumber: page + 1, rows: size }
+ });
+ console.log(res.data.records)
+ setResources(res.data.records);
+ setTotalRecords(res.data.total);
+ scrollRef.current?.scrollTo({ top: 0, behavior: 'smooth' });
+ };
+
+ const handleSearch = () => {
+ if (input.trim()) {
+ setIsSearched(true); // ⬅️ 设置为 true,触发样式移动
+ setPage(0); // 重置到第一页
+ fetchSearch(input, 0, rows);
+ }
+ };
+
+ const onPageChange = (e: PaginatorPageChangeEvent) => {
+ setPage(e.page);
+ setRows(e.rows);
+ fetchSearch(input, e.page, e.rows);
+ };
+
return (
- <div className="p-d-flex p-jc-center p-ai-center" style={{ height: '100vh' }}>
- {"一个空页面"}
+ <div className={`smart-search-page ${!isSearched ? 'centered' : ''}`}>
+ <div className="search-header">AI 智能搜索助手</div>
+
+ <div className="search-input">
+ <InputText
+ value={input}
+ onChange={(e) => setInput(e.target.value)}
+ onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
+ placeholder="请输入你的需求"
+ className="input-text"
+ />
+ <Button icon={<RobotOne theme="outline" size="24" fill="#ffffff" />} onClick={handleSearch} className="search-btn" />
+ </div>
+
+ <div className="all-resources-list" ref={scrollRef}>
+ {resources.map((item) => (
+ <Card key={item.resourceId} className="all-resources-card" onClick={() => router.push(`/resource/resource-detail/${item.resourceId}`)}>
+ {/* 左侧图片 */}
+ <Image
+ src={process.env.NEXT_PUBLIC_NGINX_URL + item.resourcePicture}
+ alt={item.resourceName}
+ width="250" height="140"
+ preview
+ />
+
+ {/* 中间内容 */}
+ <div className="resource-header">
+ <div className="resource-content">
+ <h3>{item.resourceName}</h3>
+ <div className="tags">
+ {item.gamePlayList.map((tag, i) => (
+ <Tag key={i} value={tag.gameplayName} />
+ ))}
+ </div>
+ </div>
+
+ {/* 右侧状态栏 */}
+ <div className="resources-states">
+ <div className="state-item">
+ <Fire theme="outline" size="16" fill="#FF8D1A" />
+ <span>热度:{item.hot}</span>
+ </div>
+ <div className="state-item">
+ <span>最新更新时间:{item.lastUpdateTime}</span>
+ </div>
+ </div>
+
+ </div>
+ </Card>
+ ))}
+ </div>
+
+ {totalRecords > 5 && (<Paginator className="Paginator" first={page * rows} rows={rows} totalRecords={totalRecords} rowsPerPageOptions={[5, 10]} onPageChange={onPageChange} />)}
</div>
);
-};
-
-export default EmptyPage;
+}
diff --git a/src/app/search/search-page.scss b/src/app/search/search-page.scss
new file mode 100644
index 0000000..13c701c
--- /dev/null
+++ b/src/app/search/search-page.scss
@@ -0,0 +1,35 @@
+.smart-search-page {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 2rem 1rem;
+ display: flex;
+ flex-direction: column;
+ transition: all 5s ease;
+
+ .search-header {
+ font-size: 1.8rem;
+ font-weight: bold;
+ text-align: center;
+ margin-bottom: 2rem;
+ }
+
+ .search-input {
+ display: flex;
+ margin-bottom: 1.5rem;
+
+ .input-text {
+ flex: 1;
+ border-radius: 10px 0 0 10px;
+ }
+
+ .search-btn {
+ min-width: 100px;
+ border-radius: 0 10px 10px 0;
+ }
+ }
+}
+
+.smart-search-page.centered {
+ justify-content: center; // 使其上下居中
+ height: 80vh; // 占满整页高度实现居中效果
+}
\ No newline at end of file