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;
+}
