blob: f90f2fb322c2ea02d81eb1040fe6b3fa821c0624 [file] [log] [blame]
import React, { useState, useEffect } from 'react';
import {
createRequest,
deleteRequest,
updateMoney,
findByUserid,
findByName,
getTotalMoneyByName,
updateLoaduserByName,
} from '../api/request';
const RequestBoard = ({ currentUserId }) => {
const [requests, setRequests] = useState([]); // 始终存储当前用户的求助帖
const [searchedRequests, setSearchedRequests] = useState([]); // 存储搜索结果
const [formData, setFormData] = useState({
userid: currentUserId,
name: '',
plot: '',
money: '',
year: '',
country: '',
photo: null,
});
const [searchName, setSearchName] = useState('');
const [totalMoney, setTotalMoney] = useState(null);
// 获取当前用户求助帖
const loadUserRequests = async () => {
const data = await findByUserid(currentUserId);
setRequests(data);
};
useEffect(() => {
loadUserRequests();
}, []);
// 表单变更处理
const handleChange = (e) => {
const { name, value, files } = e.target;
setFormData((prev) => ({
...prev,
[name]: files ? files[0] : value,
}));
};
// 提交创建
const handleCreate = async (e) => {
e.preventDefault();
const fd = new FormData();
Object.entries(formData).forEach(([key, value]) => {
if (value !== '' && value !== null) fd.append(key, value);
});
const res = await createRequest(fd);
if (res.data === true) {
alert('创建成功');
setFormData(prev => ({
...prev,
name: '',
plot: '',
money: '',
year: '',
country: '',
photo: null,
}));
loadUserRequests(); // 创建成功后刷新当前用户帖子
} else {
alert('创建失败');
}
};
// 删除
const handleDelete = async (id) => {
await deleteRequest(id);
loadUserRequests(); // 删除后刷新当前用户帖子
};
// 更新金额
const handleUpdateMoney = async (id, newMoney) => {
if (!newMoney) return;
await updateMoney(id, newMoney);
loadUserRequests(); // 更新金额后刷新当前用户帖子
};
// 按名称搜索并计算总金额
const handleSearch = async () => {
const data = await findByName(searchName);
const total = await getTotalMoneyByName(searchName);
setSearchedRequests(data); // 搜索结果存储到独立状态
setTotalMoney(total);
};
// 上传更新被协助用户 ID(批量更新同名求助帖)
const handleUploadLoaduser = async (name) => {
try {
await updateLoaduserByName(name, currentUserId);
alert('更新成功');
loadUserRequests(); // 更新后刷新当前用户帖子
setSearchedRequests([]); // 同步清空搜索结果(可选)
} catch (error) {
alert('更新失败,请稍后重试');
console.error(error);
}
};
return (
<div className="p-4 max-w-4xl mx-auto">
<h2 className="text-2xl font-bold mb-4">发布求助帖</h2>
<form className="grid grid-cols-2 gap-4 mb-6" onSubmit={handleCreate}>
<input
name="name"
placeholder="标题/名称"
className="border p-2"
value={formData.name}
onChange={handleChange}
/>
<textarea
name="plot"
placeholder="内容/情节"
className="border p-2 col-span-2"
value={formData.plot}
onChange={handleChange}
/>
<input
name="money"
type="number"
placeholder="金额"
className="border p-2"
value={formData.money}
onChange={handleChange}
/>
<input
name="year"
type="number"
placeholder="年份"
className="border p-2"
value={formData.year}
onChange={handleChange}
/>
<input
name="country"
placeholder="国家"
className="border p-2"
value={formData.country}
onChange={handleChange}
/>
<input
name="photo"
type="file"
className="border p-2 col-span-2"
onChange={handleChange}
/>
<button
type="submit"
className="bg-blue-500 text-white p-2 col-span-2 rounded"
>
发布
</button>
</form>
<div className="mb-6">
<h3 className="text-xl font-semibold mb-2">查找求助帖</h3>
<div className="flex gap-2 mb-2">
<input
type="text"
placeholder="输入标题"
value={searchName}
onChange={(e) => setSearchName(e.target.value)}
className="border p-2 flex-1"
/>
<button
onClick={handleSearch}
className="bg-green-500 text-white p-2 rounded"
>
查找
</button>
</div>
{totalMoney !== null && (
<p className="text-gray-700">
该名称对应的总金额:<strong>{totalMoney}</strong>
</p>
)}
</div>
{/* 搜索结果展示(有搜索结果时显示) */}
{searchedRequests.length > 0 && (
<div className="mb-6">
<h3 className="text-xl font-semibold mb-2">搜索结果</h3>
<button
onClick={() => {
setSearchedRequests([]);
setSearchName('');
setTotalMoney(null);
}}
className="bg-gray-500 text-white p-1 px-2 rounded mb-2"
>
返回我的求助帖
</button>
{searchedRequests.length === 0 ? (
<p className="text-gray-500">无匹配的求助帖</p>
) : (
<div className="grid grid-cols-1 gap-4">
{searchedRequests.map((request) => (
<div key={request.requestid} className="border p-3 rounded shadow">
<h4 className="text-lg font-semibold">{request.name}</h4>
<p className="text-gray-600 mb-2">{request.plot}</p>
<div className="flex gap-2 mb-2">
<span>金额:{request.money}</span>
<span>年份:{request.year || '未填写'}</span>
<span>国家:{request.country || '未填写'}</span>
</div>
{request.photo && (
<img
src={`http://localhost:8080${request.photo}`}
alt="求助帖"
className="w-32 h-auto mb-2"
/>
)}
<div className="flex gap-2">
<input
type="number"
placeholder="新金额"
onChange={(e) => handleUpdateMoney(request.requestid, e.target.value)}
className="border p-1 flex-1"
/>
<button
onClick={() => handleDelete(request.requestid)}
className="bg-red-500 text-white p-1 px-2 rounded"
>
删除
</button>
<button
onClick={() => handleUploadLoaduser(request.name)}
className="bg-blue-500 text-white p-1 px-2 rounded"
>
上传更新loaduser
</button>
</div>
</div>
))}
</div>
)}
</div>
)}
{/* 我的求助帖展示(无搜索结果时显示) */}
{searchedRequests.length === 0 && (
<div className="mb-6">
<h3 className="text-xl font-semibold mb-2">我的求助帖</h3>
{requests.length === 0 ? (
<p className="text-gray-500">暂无求助帖</p>
) : (
<div className="grid grid-cols-1 gap-4">
{requests.map((request) => (
<div key={request.requestid} className="border p-3 rounded shadow">
<h4 className="text-lg font-semibold">{request.name}</h4>
<p className="text-gray-600 mb-2">{request.plot}</p>
<div className="flex gap-2 mb-2">
<span>金额:{request.money}</span>
<span>年份:{request.year || '未填写'}</span>
<span>国家:{request.country || '未填写'}</span>
</div>
{request.photo && (
<img
src={`http://localhost:8080${request.photo}`}
alt="求助帖"
className="w-32 h-auto mb-2"
/>
)}
<div className="flex gap-2">
<input
type="number"
placeholder="新金额"
onChange={(e) => handleUpdateMoney(request.requestid, e.target.value)}
className="border p-1 flex-1"
/>
<button
onClick={() => handleDelete(request.requestid)}
className="bg-red-500 text-white p-1 px-2 rounded"
>
删除
</button>
<button
onClick={() => handleUploadLoaduser(request.name)}
className="bg-blue-500 text-white p-1 px-2 rounded"
>
上传更新loaduser
</button>
</div>
</div>
))}
</div>
)}
</div>
)}
</div>
);
};
export default RequestBoard;