blob: c1109a0d0f53c85ee68716cf687f3febc694b33c [file] [log] [blame] [edit]
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;