feat(torrents): 实现种子上传和列表展示功能

- 新增种子上传功能,包括用户认证和表单处理
- 实现种子列表展示,含搜索和筛选功能
- 调整布局和样式,优化用户体验
- 移除不必要的分类和筛选条件
- 重构部分代码以适应新功能

Change-Id: I86229123ba1e1a70e632042b2a9544e08c3c6876
diff --git a/src/features/torrents/pages/UploadTorrentPage.jsx b/src/features/torrents/pages/UploadTorrentPage.jsx
index 8e17a9e..6b94524 100644
--- a/src/features/torrents/pages/UploadTorrentPage.jsx
+++ b/src/features/torrents/pages/UploadTorrentPage.jsx
@@ -22,6 +22,8 @@
   InboxOutlined,
   InfoCircleOutlined,
 } from "@ant-design/icons";
+import { uploadTorrent } from "../../../api/torrents";
+import { useAuth } from "../../auth/contexts/AuthContext";
 
 const { Title, Paragraph, Text } = Typography;
 const { TabPane } = Tabs;
@@ -34,23 +36,16 @@
 const uploadProps = {
   name: "torrent",
   multiple: false,
-  action: "/api/upload-torrent",
   accept: ".torrent",
   maxCount: 1,
-  onChange(info) {
-    const { status } = info.file;
-    if (status === "done") {
-      message.success(`${info.file.name} 文件上传成功`);
-    } else if (status === "error") {
-      message.error(`${info.file.name} 文件上传失败`);
-    }
-  },
   beforeUpload(file) {
     const isTorrent = file.type === "application/x-bittorrent" || file.name.endsWith(".torrent");
     if (!isTorrent) {
       message.error("您只能上传 .torrent 文件!");
+      return Upload.LIST_IGNORE;
     }
-    return isTorrent || Upload.LIST_IGNORE;
+    // 阻止自动上传,我们将在表单提交时手动处理
+    return false;
   },
 };
 
@@ -142,7 +137,6 @@
     <Form.Item
       name="title"
       label="标题"
-      rules={[{ required: true, message: "请输入资源标题" }]}
     >
       <Input placeholder="请输入完整、准确的资源标题" />
     </Form.Item>
@@ -150,7 +144,6 @@
     <Form.Item
       name="chineseName"
       label="中文名"
-      rules={[{ required: true, message: "请输入资源中文名" }]}
     >
       <Input placeholder="请输入资源中文名称" />
     </Form.Item>
@@ -165,7 +158,6 @@
     <Form.Item
       name="year"
       label="年份"
-      rules={[{ required: true, message: "请选择年份" }]}
     >
       <DatePicker picker="year" placeholder="选择年份" />
     </Form.Item>
@@ -173,7 +165,6 @@
     <Form.Item
       name="region"
       label="地区"
-      rules={[{ required: true, message: "请选择地区" }]}
     >
       <Select placeholder="请选择地区">
         <Option value="china">中国大陆</Option>
@@ -194,7 +185,6 @@
     <Form.Item
       name="language"
       label="语言"
-      rules={[{ required: true, message: "请选择语言" }]}
     >
       <Select placeholder="请选择语言" mode="multiple">
         <Option value="chinese">中文</Option>
@@ -271,7 +261,6 @@
     <Form.Item
       name="movieType"
       label="电影类型"
-      rules={[{ required: true, message: "请选择电影类型" }]}
     >
       <Select placeholder="请选择电影类型" mode="multiple">
         <Option value="action">动作</Option>
@@ -295,7 +284,6 @@
     <Form.Item
       name="resolution"
       label="分辨率"
-      rules={[{ required: true, message: "请选择分辨率" }]}
     >
       <Select placeholder="请选择分辨率">
         <Option value="4K">4K</Option>
@@ -310,7 +298,6 @@
     <Form.Item
       name="source"
       label="片源"
-      rules={[{ required: true, message: "请选择片源" }]}
     >
       <Select placeholder="请选择片源">
         <Option value="bluray">蓝光原盘</Option>
@@ -784,10 +771,49 @@
 const UploadTorrentPage = () => {
   const [form] = Form.useForm();
   const [activeCategory, setActiveCategory] = useState("notice");
+  const { user } = useAuth();
 
-  const onFinish = (values) => {
-    console.log("提交的表单数据:", values);
-    message.success("种子上传成功!");
+  const onFinish = async (values) => {
+    try {
+      // 创建 FormData 对象
+      const formData = new FormData();
+      
+      // * 添加用户名
+      const username = user?.username || user?.uid;
+      if (!username) {
+        message.error('用户信息不完整,请重新登录');
+        return;
+      }
+      formData.append('username', username);
+      
+      // 添加描述信息
+      formData.append('description', values.description || '');
+      
+      // 添加种子文件
+      if (values.torrentFile && values.torrentFile.fileList && values.torrentFile.fileList.length > 0) {
+        const torrentFile = values.torrentFile.fileList[0].originFileObj;
+        formData.append('torrent', torrentFile);
+      } else {
+        message.error('请选择种子文件');
+        return;
+      }
+      
+      console.log('username', formData.get('username'));
+      console.log('description', formData.get('description'));
+      console.log('torrent', formData.get('torrent'));
+      // 调用上传接口
+      const response = await uploadTorrent(formData);
+      
+      if (response && response.message === "Resource published successfully") {
+        message.success('种子上传成功!');
+        form.resetFields(); // 重置表单
+      } else {
+        message.error('上传失败,请重试');
+      }
+    } catch (error) {
+      console.error('上传种子时出错:', error);
+      message.error('上传失败:' + (error.message || '网络错误,请重试'));
+    }
   };
 
   const renderFormByCategory = (category) => {