blob: 0c1a0bbd237053e0dadaa90110e44983b1770bcc [file] [log] [blame]
import React, { useState, useEffect } from "react";
import HelpIcon from "@mui/icons-material/Help";
import PeopleIcon from "@mui/icons-material/People";
import MonetizationOnIcon from "@mui/icons-material/MonetizationOn";
import AccessTimeIcon from "@mui/icons-material/AccessTime";
import CheckCircleIcon from "@mui/icons-material/CheckCircle";
import { useNavigate } from "react-router-dom";
import { API_BASE_URL } from "./config";
import "./BegSeedPage.css";
export default function BegSeedPage() {
const navigate = useNavigate();
const now = new Date();
const [begSeedList, setBegSeedList] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const [showForm, setShowForm] = useState(false);
const [refreshKey, setRefreshKey] = useState(0); // 用于强制重新渲染
const [formData, setFormData] = useState({
info: "",
reward_magic: "",
deadline: "",
});
// 从后端获取求种列表
const fetchBegSeedList = async () => {
setLoading(true);
try {
const response = await fetch(`${API_BASE_URL}/api/begseed-list`);
if (!response.ok) {
throw new Error(`请求失败,状态码: ${response.status}`);
}
const data = await response.json();
console.log("获取到的求种列表数据:", data);
// 格式化数据以匹配前端期望的格式
const formattedData = data.map(item => ({
beg_id: item.beg_id || item.begid || item.id,
info: item.info || item.description || item.content,
beg_count: item.beg_count || item.begCount || 1,
reward_magic: item.reward_magic || item.rewardMagic || item.magic,
deadline: item.deadline || item.endtime,
has_match: item.has_match || item.hasMatch || item.completed || 0,
}));
setBegSeedList(formattedData);
setError(null);
} catch (err) {
console.error('获取求种列表失败:', err);
setError(err.message);
// 如果API调用失败,使用默认数据
setBegSeedList([
{
beg_id: "beg001",
info: "求《三体》高清资源",
beg_count: 5,
reward_magic: 100,
deadline: "2025-06-10T23:59:59",
has_match: 0,
},
{
beg_id: "beg002",
info: "求《灌篮高手》国语配音版",
beg_count: 3,
reward_magic: 50,
deadline: "2024-05-01T23:59:59",
has_match: 1,
},
{
beg_id: "beg003",
info: "求《黑暗之魂3》PC版种子",
beg_count: 2,
reward_magic: 80,
deadline: "2024-04-01T23:59:59",
has_match: 0,
},
]);
} finally {
setLoading(false);
}
};
// 组件挂载时获取数据
useEffect(() => {
fetchBegSeedList();
}, []);
// 表单输入处理
const handleFormChange = (e) => {
const { name, value } = e.target;
setFormData((prev) => ({
...prev,
[name]: value,
}));
};
// 提交新求种任务
const handleSubmit = async (e) => {
e.preventDefault();
// 获取用户ID
const match = document.cookie.match('(^|;)\\s*userId=([^;]+)');
const userId = match ? match[2] : null;
if (!userId) {
alert("请先登录后再发布求种任务");
return;
}
try {
const response = await fetch(`${API_BASE_URL}/api/create-begseed`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
userid: userId,
info: formData.info,
reward_magic: Number(formData.reward_magic),
deadline: formData.deadline,
}),
});
if (response.ok) {
// 成功创建,重新获取列表并强制重新渲染
setLoading(true); // 显示加载状态
await fetchBegSeedList();
setShowForm(false);
setFormData({ info: "", reward_magic: "", deadline: "" });
setRefreshKey(prev => prev + 1); // 强制重新渲染
alert("发布成功!");
} else {
const errorData = await response.json();
alert(`发布失败: ${errorData.message || '未知错误'}`);
}
} catch (err) {
console.error('发布求种任务失败:', err);
// 如果后端调用失败,则使用前端演示逻辑
// setLoading(true); // 显示加载状态
// const newBegId = "beg" + Math.floor(Math.random() * 10000);
// setBegSeedList([
// {
// beg_id: newBegId,
// info: formData.info,
// beg_count: 1,
// reward_magic: Number(formData.reward_magic),
// deadline: formData.deadline,
// has_match: 0,
// },
// ...begSeedList,
// ]);
// setLoading(false); // 隐藏加载状态
// setShowForm(false);
// setFormData({ info: "", reward_magic: "", deadline: "" });
// setRefreshKey(prev => prev + 1); // 强制重新渲染
// alert("发布成功(前端演示)");
}
};
return (
<div className="begseed-container">
<div className="begseed-content">
<h1 className="begseed-title">
<HelpIcon className="begseed-title-icon" style={{ fontSize: 42 }} />
求种列表
</h1>
{/* 加载状态 */}
{loading && (
<div className="begseed-loading">
正在加载求种列表...
</div>
)}
{/* 错误状态 */}
{error && (
<div className="begseed-error">
加载失败: {error} (已显示默认数据)
</div>
)}
<div className="begseed-publish-section">
<button
onClick={() => setShowForm(true)}
disabled={loading}
className="begseed-publish-btn"
>
发布求种任务
</button>
</div>
{showForm && (
<div className="begseed-form-container">
<h3 className="begseed-form-title">发布求种任务</h3>
<form onSubmit={handleSubmit}>
<div className="begseed-form-group">
<label className="begseed-form-label">求种信息:</label>
<input
type="text"
name="info"
value={formData.info}
onChange={handleFormChange}
required
className="begseed-form-input"
placeholder="请输入您要求种的资源信息"
/>
</div>
<div className="begseed-form-group">
<label className="begseed-form-label">悬赏魔力值:</label>
<input
type="number"
name="reward_magic"
value={formData.reward_magic}
onChange={handleFormChange}
required
min={1}
className="begseed-form-input"
placeholder="请输入悬赏的魔力值"
/>
</div>
<div className="begseed-form-group">
<label className="begseed-form-label">截止日期:</label>
<input
type="datetime-local"
name="deadline"
value={formData.deadline}
onChange={handleFormChange}
required
className="begseed-form-input"
/>
</div>
<div className="begseed-form-actions">
<button type="submit" className="begseed-form-btn begseed-form-btn-primary">
提交
</button>
<button
type="button"
onClick={() => setShowForm(false)}
className="begseed-form-btn begseed-form-btn-secondary"
>
取消
</button>
</div>
</form>
</div>
)}
<div key={refreshKey} className="begseed-list">
{begSeedList.map((beg) => {
const isExpired = new Date(beg.deadline) < now || beg.has_match === 1;
const isCompleted = beg.has_match === 1;
const isActive = !isExpired && !isCompleted;
return (
<div
key={beg.beg_id}
className={`begseed-card ${isExpired ? 'begseed-card-expired' : ''}`}
onClick={() => navigate(`/begseed/${beg.beg_id}`)}
>
<div className="begseed-card-content">
<div className="begseed-card-title">
{beg.info}
</div>
<div className="begseed-card-info">
<PeopleIcon className="begseed-card-info-icon" />
求种人数:{beg.beg_count}
</div>
<div className="begseed-card-info">
<MonetizationOnIcon className="begseed-card-info-icon" />
悬赏魔力值:{beg.reward_magic}
</div>
<div className="begseed-card-info">
<AccessTimeIcon className="begseed-card-info-icon" />
截止时间:{new Date(beg.deadline).toLocaleString()}
</div>
<div className="begseed-card-info">
<CheckCircleIcon className="begseed-card-info-icon" />
<span
className={`begseed-card-status ${
isCompleted ? 'begseed-status-completed' :
isExpired ? 'begseed-status-expired' :
'begseed-status-active'
}`}
>
{isCompleted ? "已完成" : isExpired ? "已过期" : "进行中"}
</span>
</div>
</div>
</div>
);
})}
</div>
</div>
</div>
);
}