diff --git a/src/pages/InterestGroup/InterestGroup.jsx b/src/pages/InterestGroup/InterestGroup.jsx
new file mode 100644
index 0000000..c1109a0
--- /dev/null
+++ b/src/pages/InterestGroup/InterestGroup.jsx
@@ -0,0 +1,155 @@
+import React, { useEffect, useState } from 'react';
+import axios from 'axios';
+import './InterestGroup.css';
+import Header from '../../components/Header'; // 导入 Header 组件
+
+const API_BASE = process.env.REACT_APP_API_BASE;
+
+const InterestGroup = () => {
+  const [groups, setGroups] = useState([]);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState(null);
+  const [category, setCategory] = useState('');
+  const [name, setName] = useState('');
+  const [page, setPage] = useState(1);
+  const [size, setSize] = useState(10);
+  const [totalPages, setTotalPages] = useState(1);
+  const [sortBy, setSortBy] = useState('member_count'); // 默认按照成员数排序
+
+  useEffect(() => {
+    // 请求兴趣小组列表
+    const fetchGroups = async () => {
+      try {
+        setLoading(true);
+        setError(null);
+        const response = await axios.get(`${API_BASE}/echo/groups`, {
+          params: {
+            category,
+            name,
+            page,
+            size,
+            sort_by: sortBy
+          }
+        });
+
+        if (response.data.status === 'success') {
+          setGroups(response.data.items);
+          setTotalPages(response.data.total_pages); // 更新总页数
+        } else {
+          setError('获取兴趣小组列表失败');
+        }
+      } catch (err) {
+        setError('请求失败，请稍后再试');
+      } finally {
+        setLoading(false);
+      }
+    };
+
+    fetchGroups();
+  }, [category, name, page, size, sortBy]);
+
+  const handleCategoryChange = (e) => {
+    setCategory(e.target.value);
+    setPage(1); // 重置为第一页
+  };
+
+  const handleSearchChange = (e) => {
+    setName(e.target.value);
+    setPage(1); // 重置为第一页
+  };
+
+  const handleSortChange = (e) => {
+    setSortBy(e.target.value);
+  };
+
+  const handlePageChange = (newPage) => {
+    if (newPage > 0 && newPage <= totalPages) {
+      setPage(newPage);
+    }
+  };
+
+  return (
+    <div className="interest-group-container">
+      {/* Header 组件放在页面最上方 */}
+      <Header />
+
+      <h1>兴趣小组列表</h1>
+      {/* 分类筛选 */}
+      <div className="filter">
+        <label>分类：</label>
+        <select onChange={handleCategoryChange} value={category}>
+          <option value="">全部</option>
+          <option value="影视">影视</option>
+          <option value="游戏">游戏</option>
+          <option value="学习">学习</option>
+          <option value="体育">体育</option>
+          <option value="其他">其他</option>
+        </select>
+      </div>
+
+      {/* 搜索框 */}
+      <div className="search">
+        <label>搜索：</label>
+        <input
+          type="text"
+          value={name}
+          onChange={handleSearchChange}
+          placeholder="输入小组名称搜索"
+        />
+      </div>
+
+      {/* 排序 */}
+      <div className="sort">
+        <label>排序：</label>
+        <select onChange={handleSortChange} value={sortBy}>
+          <option value="member_count">按成员数排序</option>
+          <option value="name">按名称排序</option>
+          <option value="category">按分类排序</option>
+        </select>
+      </div>
+
+      {/* 加载中提示 */}
+      {loading && <p>加载中...</p>}
+
+      {/* 错误提示 */}
+      {error && <p className="error">{error}</p>}
+
+      {/* 小组列表 */}
+      {!loading && !error && (
+        <div className="group-list">
+          {groups.map((group) => (
+            <div className="group-item" key={group.group_id}>
+              <img
+                src={group.cover_image}
+                alt={group.name}
+                className="group-cover"
+              />
+              <div className="group-info">
+                <h2>{group.name}</h2>
+                <p>{group.description}</p>
+                <p>成员数：{group.member_count}</p>
+                <p>分类：{group.category}</p>
+              </div>
+            </div>
+          ))}
+        </div>
+      )}
+
+      {/* 分页 */}
+      <div className="pagination">
+        <button onClick={() => handlePageChange(page - 1)} disabled={page <= 1}>
+          上一页
+        </button>
+        <span>第 {page} 页 / 共 {totalPages} 页</span>
+        <button
+          onClick={() => handlePageChange(page + 1)}
+          disabled={page >= totalPages}
+        >
+          下一页
+        </button>
+      </div>
+    </div>
+  );
+};
+
+export default InterestGroup;
