diff --git a/src/components/torrentdetailhelp.jsx b/src/components/torrentdetailhelp.jsx
new file mode 100644
index 0000000..8019e4c
--- /dev/null
+++ b/src/components/torrentdetailhelp.jsx
@@ -0,0 +1,353 @@
+import React, { useState, useEffect } from 'react';
+import { useParams, useNavigate, useLocation, useSearchParams } from 'react-router-dom'; // 添加 useLocation
+import {
+  Descriptions,
+  Table,
+  Button,
+  Modal,
+  Image,
+  message,
+  Spin,
+  Input,
+  Select,
+  Pagination,
+  Space,
+  Card
+} from 'antd';
+import { ExclamationCircleOutlined } from '@ant-design/icons';
+import axios from 'axios';
+
+const { confirm } = Modal;
+const { Option } = Select;
+
+//const { confirm } = Modal;
+
+const TorrentDetailhelp = () => {
+   // 从URL获取种子ID
+  const navigate = useNavigate(); // 用于返回上一页
+  const [torrent, setTorrent] = useState(null);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState(null);
+  const [isLoading, setIsLoading] = useState(false);
+  const [searchParams] = useSearchParams();
+  // 在组件状态中添加
+  // 获取参数并设置默认值
+  //const [manageId, setManageId] = useState(parseInt(searchParams.get('manageid')) || 1);
+  // const [rewardUserId, setRewardUserId] = useState(parseInt(searchParams.get('userid')) || 1);
+  // const [creditAmount, setCreditAmount] = useState(parseInt(searchParams.get('credit')) || 1);
+  const location = useLocation();
+
+  // 从路由state获取参数（可能为空）
+  const { loaduser, money, torrentid, helpedid } = location.state || {};
+
+  // 设置默认值
+  const [rewardUserId, setUserId] = useState(loaduser || null);
+  const [creditAmount, setCreditAmount] = useState(money || 1); // 默认1积分
+  const [torrentId, setTorrentId] = useState(torrentid); // 默认值为路由传递的torrentid
+  const [helpedId, setHelpedId] = useState(helpedid || null); // 新增的帮助者ID
+
+
+  const currentUserId = 1; // 示例，实际应从认证系统获取
+
+
+  // 格式化日期
+  const formatDate = (dateString) => {
+    if (!dateString) return '未知';
+    const date = new Date(dateString);
+    return date.toLocaleString('zh-CN', {
+      year: 'numeric',
+      month: '2-digit',
+      day: '2-digit',
+      hour: '2-digit',
+      minute: '2-digit'
+    });
+  };
+
+  console.log("Helped ID:", helpedId);
+
+  // 处理删除种子
+  const handleDeleteTorrent = async (torrentId) => {
+    if (!currentUserId) {
+      message.warning('请先登录');
+      return;
+    }
+
+    confirm({
+      title: '确认删除',
+      icon: <ExclamationCircleOutlined />,
+      content: '确定要删除这个种子吗？此操作不可恢复！',
+      onOk: async () => {
+        try {
+          await axios.delete(`http://localhost:8080/torrent/delete/${torrentId}`, {
+            params: { userid: currentUserId }
+          });
+          // 成功删除后，更新状态或返回上一页
+          setTorrent(null); // 清空当前种子详情
+          navigate(-1); // 返回上一页
+          message.success('种子删除成功');
+        } catch (err) {
+          console.error('删除种子失败', err);
+          if (err.response && err.response.status === 403) {
+            message.error('无权删除此种子');
+          } else {
+            message.error('删除种子失败');
+          }
+        }
+      }
+    });
+  };
+
+
+  const handleDownloadTorrent = async (torrentId) => {
+    if (!currentUserId) {
+      message.warning('请先登录');
+      return;
+    }
+
+    setIsLoading(true); // 开始加载
+    try {
+      // 使用axios发送带有参数的GET请求
+      // const response = await axios.get(`http://localhost:8080/torrent/download/${torrentId}`, {
+      //   params: { userId: currentUserId },  // 正确添加请求参数
+      //   responseType: 'blob'  // 重要：指定响应类型为blob以处理文件下载
+      // });
+
+      // // 创建下载链接
+      // const url = window.URL.createObjectURL(new Blob([response.data]));
+      // const link = document.createElement('a');
+      // link.href = url;
+      // //link.setAttribute('download', 'torrent_file.torrent');  // 可以设置为动态文件名
+      // document.body.appendChild(link);
+      // link.click();
+      // document.body.removeChild(link);
+      // window.URL.revokeObjectURL(url);
+      open(`http://localhost:8080/torrent/download/${torrentId}?userId=${currentUserId}`, '_blank');
+
+      message.success('种子下载开始');
+    } catch (err) {
+      console.error('下载种子失败', err);
+      if (err.response?.status === 404) {
+        message.error('种子不存在');
+      } else {
+        message.error('下载失败: ' + (err.response?.data?.message || err.message));
+      }
+    } finally {
+      setIsLoading(false); // 结束加载
+    }
+  };
+
+
+  // 格式化文件大小
+  const formatFileSize = (bytes) => {
+    if (bytes === 0) return '0 Bytes';
+    const k = 1024;
+    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+    const i = Math.floor(Math.log(bytes) / Math.log(k));
+    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
+  };
+
+  // 在组件函数内部添加这个函数
+  const getPromotionName = (promotionId) => {
+    const promotionMap = {
+      1: '上传加倍',
+      2: '下载减半',
+      3: '免费下载',
+      0: '无促销'
+    };
+
+    return promotionMap[promotionId] || '未知促销';
+  };
+
+  // 获取种子详情
+  useEffect(() => {
+    const fetchTorrentDetail = async () => {
+      try {
+        const response = await axios.get(`http://localhost:8080/torrent/${torrentid}`);
+        if (response.status === 200) {
+          setTorrent(response.data);
+        } else {
+          setError('获取种子详情失败');
+        }
+      } catch (err) {
+        console.error('获取种子详情失败:', err);
+        if (err.response) {
+          if (err.response.status === 404) {
+            setError('种子不存在');
+          } else {
+            setError('获取种子详情失败: ' + err.response.data);
+          }
+        } else {
+          setError('网络错误，请稍后重试');
+        }
+      } finally {
+        setLoading(false);
+      }
+    };
+
+    fetchTorrentDetail();
+  }, [torrentid]);
+
+  // 奖励保种积分处理函数（修正版）
+  const handleAddCredit = async (torrentId) => {
+    if (!currentUserId) { // 需要定义manageUserId
+      message.warning('缺少必要权限');
+      return;
+    }
+
+    setIsLoading(true);
+    try {
+      const params = new URLSearchParams();
+      params.append('manageid', currentUserId);
+      params.append('userid', rewardUserId);
+      params.append('credit', creditAmount);
+      params.append('helpedId', helpedId);
+
+      const response = await axios.post(`http://localhost:8080/torrent/addcredit`, params.toString(), {
+        headers: {
+          'Content-Type': 'application/x-www-form-urlencoded'
+        }
+      });
+
+      if (response.data.success !== false) {
+        message.success(`成功奖励 ${creditAmount} 保种积分`);
+      } else {
+        message.error(response.data.message || '奖励积分失败');
+      }
+    } catch (err) {
+      console.error('奖励积分失败', err);
+      if (err.response?.status === 500) {
+        message.error('服务器错误: ' + (err.response.data?.message || '未知错误'));
+      } else {
+        message.error('奖励积分失败: ' + (err.response?.data?.message || err.message));
+      }
+    } finally {
+      setIsLoading(false);
+    }
+  };
+
+  console.log('Torrent Detail:', torrent);
+
+  // 返回上一页
+  const handleBack = () => {
+    navigate(-1); // 返回上一页
+  };
+
+  // 如果正在加载
+  if (loading) {
+    return (
+      <div className="flex justify-center items-center h-96">
+        <Spin size="large" tip="加载中..." />
+      </div>
+    );
+  }
+
+  // 如果有错误
+  if (error) {
+    return (
+      <div className="p-6">
+        <Card>
+          <div className="text-center p-6">
+            <ExclamationCircleOutlined className="text-2xl text-red-500 mb-4" />
+            <h3 className="text-lg font-medium text-red-600 mb-2">错误</h3>
+            <p className="text-gray-600">{error}</p>
+            <Button type="primary" onClick={handleBack} className="mt-4">
+              返回
+            </Button>
+          </div>
+        </Card>
+      </div>
+    );
+  }
+
+  // 如果种子不存在
+  if (!torrent) {
+    return (
+      <div className="p-6">
+        <Card>
+          <div className="text-center p-6">
+            <ExclamationCircleOutlined className="text-2xl text-yellow-500 mb-4" />
+            <h3 className="text-lg font-medium text-yellow-600 mb-2">种子不存在</h3>
+            <p className="text-gray-600">抱歉，您查找的种子不存在或已被删除。</p>
+            <Button type="primary" onClick={handleBack} className="mt-4">
+              返回
+            </Button>
+          </div>
+        </Card>
+      </div>
+    );
+  }
+
+  // 渲染种子详情
+  return (
+    <div className="p-6">
+      <Card
+        title="种子详情"
+        extra={
+          <Button type="primary" onClick={handleBack}>
+            返回列表
+          </Button>
+        }
+      >
+        {/* 使用Descriptions组件展示详情 */}
+        <Descriptions bordered column={1}>
+          <Descriptions.Item label="ID">{torrent.torrentid}</Descriptions.Item>
+          {/* 新增的封面图片展示 */}
+          {torrent.coverImagePath && (
+            <Descriptions.Item label="封面图片">
+              <Image
+                src={torrent.coverImagePath}
+                alt="种子封面"
+                width={200}  // 设置图片宽度
+                placeholder={
+                  <div className="w-48 h-32 bg-gray-200 flex items-center justify-center">
+                    加载中...
+                  </div>
+                }
+              />
+            </Descriptions.Item>
+          )}
+          <Descriptions.Item label="文件名">{torrent.filename}</Descriptions.Item>
+          <Descriptions.Item label="大小">{formatFileSize(torrent.torrentSize)}</Descriptions.Item>
+          <Descriptions.Item label="上传者ID">{torrent.uploader_id}</Descriptions.Item>
+          <Descriptions.Item label="上传时间">{formatDate(torrent.uploadTime)}</Descriptions.Item>
+          <Descriptions.Item label="下载次数">{torrent.downloadCount}</Descriptions.Item>
+          <Descriptions.Item label="促销">
+            {getPromotionName(torrent.promotionid)}
+          </Descriptions.Item>
+          <Descriptions.Item label="描述">
+            {torrent.description || '无描述'}
+          </Descriptions.Item>
+        </Descriptions>
+
+
+        {/* 操作按钮区域 */}
+        <div className="mt-6 flex justify-end space-x-4">
+          <Button
+            danger
+            onClick={() => handleDeleteTorrent(torrent.torrentid)}
+            loading={isLoading}
+          >
+            删除
+          </Button>
+          <Button
+            type="primary"
+            onClick={() => handleDownloadTorrent(torrent.torrentid)}
+            loading={isLoading}
+          >
+            下载
+          </Button>
+          {/* 新增的奖励保种积分按钮 */}
+          <Button
+            type="default"
+            onClick={() => handleAddCredit(torrent.torrentid)}
+            loading={isLoading}
+          >
+            奖励保种积分
+          </Button>
+        </div>
+      </Card>
+    </div>
+  );
+};
+
+export default TorrentDetailhelp;
\ No newline at end of file
