feat(torrents): 优化种子页面功能和交互

- 调整 torrents API 调用,增加更多接口支持
- 优化种子列表展示和操作,支持下载和查看详情
- 新增种子详情页面路由和组件
- 改进上传种子功能,增加表单验证和错误提示
- 优化用户信息展示

Change-Id: I9343f2f446639733ee5800a86bab85a4ac6d1a72
diff --git a/src/features/torrents/pages/UploadTorrentPage.jsx b/src/features/torrents/pages/UploadTorrentPage.jsx
index 6b94524..fe0a075 100644
--- a/src/features/torrents/pages/UploadTorrentPage.jsx
+++ b/src/features/torrents/pages/UploadTorrentPage.jsx
@@ -20,7 +20,6 @@
 import {
   UploadOutlined,
   InboxOutlined,
-  InfoCircleOutlined,
 } from "@ant-design/icons";
 import { uploadTorrent } from "../../../api/torrents";
 import { useAuth } from "../../auth/contexts/AuthContext";
@@ -137,6 +136,7 @@
     <Form.Item
       name="title"
       label="标题"
+      rules={[{ required: true, message: "请输入资源标题" }]}
     >
       <Input placeholder="请输入完整、准确的资源标题" />
     </Form.Item>
@@ -786,9 +786,17 @@
       }
       formData.append('username', username);
       
-      // 添加描述信息
+      // 添加必需的字段
+      formData.append('title', values.title || '未命名资源'); // 添加标题字段
       formData.append('description', values.description || '');
       
+      // 添加可选字段
+      // if (values.chineseName) formData.append('chineseName', values.chineseName);
+      // if (values.englishName) formData.append('englishName', values.englishName);
+      // if (values.year) formData.append('year', values.year.format('YYYY'));
+      // if (values.region) formData.append('region', values.region);
+      // if (values.language) formData.append('language', Array.isArray(values.language) ? values.language.join(',') : values.language);
+      
       // 添加种子文件
       if (values.torrentFile && values.torrentFile.fileList && values.torrentFile.fileList.length > 0) {
         const torrentFile = values.torrentFile.fileList[0].originFileObj;
@@ -798,9 +806,10 @@
         return;
       }
       
-      console.log('username', formData.get('username'));
-      console.log('description', formData.get('description'));
-      console.log('torrent', formData.get('torrent'));
+      for (let [key, value] of formData.entries()) {
+        console.log(key, ':', value);
+      }
+      
       // 调用上传接口
       const response = await uploadTorrent(formData);
       
@@ -812,7 +821,14 @@
       }
     } catch (error) {
       console.error('上传种子时出错:', error);
-      message.error('上传失败:' + (error.message || '网络错误,请重试'));
+      // 更详细的错误信息
+      if (error.response) {
+        const status = error.response.status;
+        const errorMessage = error.response.data?.message || '未知错误';
+        message.error(`上传失败 (${status}): ${errorMessage}`);
+      } else {
+        message.error('上传失败:' + (error.message || '网络错误,请重试'));
+      }
     }
   };