调试种子列表、下载种子

Change-Id: Iaf8fc868ae0f26af06e7e1e0ef4af436cd4f959d
diff --git a/src/pages/PublishSeed/PublishSeed.jsx b/src/pages/PublishSeed/PublishSeed.jsx
index f27ebc2..7287e82 100644
--- a/src/pages/PublishSeed/PublishSeed.jsx
+++ b/src/pages/PublishSeed/PublishSeed.jsx
@@ -1,54 +1,81 @@
-import React, { useState, useRef } from 'react';
+// export default PublishSeed;
+import React, { useState, useRef, useEffect } from 'react';
 import axios from 'axios';
 import Header from '../../components/Header';
 import './PublishSeed.css';
 import { useUser } from '../../context/UserContext';
 
 const PublishSeed = () => {
+  console.log('[DEBUG] PublishSeed 组件渲染');
+
   const [title, setTitle] = useState('');
   const [description, setDescription] = useState('');
   const [tags, setTags] = useState([]);
   const [category, setCategory] = useState('movie');
-  const [imageUrl, setImageUrl] = useState('');
   const [message, setMessage] = useState('');
   const [isLoading, setIsLoading] = useState(false);
   const [fileName, setFileName] = useState('');
+  const [imageFile, setImageFile] = useState(null);
+  const [previewUrl, setPreviewUrl] = useState('');
 
-  const fileInputRef = useRef(null); // ✅ 获取 input file 引用
+  const fileInputRef = useRef(null);
+  const imageInputRef = useRef(null);
   const { user } = useUser();
 
+  useEffect(() => {
+    console.log('[DEBUG] 当前用户:', user);
+  }, [user]);
+
   const handleTagsChange = (e) => {
-    setTags(e.target.value.split(',').map(tag => tag.trim()));
+    console.log('[DEBUG] 标签输入变化:', e.target.value);
+    setTags(e.target.value.split(',').map(tag => tag.trim()).filter(Boolean));
   };
 
   const handleFileButtonClick = () => {
-    fileInputRef.current?.click(); // 点击隐藏的 input
+    console.log('[DEBUG] 触发文件选择按钮点击');
+    fileInputRef.current?.click();
+  };
+
+  const handleImageButtonClick = () => {
+    console.log('[DEBUG] 触发封面图片选择按钮点击');
+    imageInputRef.current?.click();
   };
 
   const handleFileChange = (e) => {
+    console.log('[DEBUG] 种子文件选择变化:', e.target.files);
     const selectedFile = e.target.files[0];
     if (selectedFile) {
-      setFileName(selectedFile.name); // 仅展示文件名
+      setFileName(selectedFile.name);
     }
   };
 
-  const handleSubmit = async (e) => {
-    e.preventDefault();
-    console.log('[handleSubmit] 表单提交开始');
+  const handleImageChange = (e) => {
+    console.log('[DEBUG] 封面图片选择变化:', e.target.files);
+    const img = e.target.files[0];
+    if (!img) return;
+    setImageFile(img);
+    setPreviewUrl(URL.createObjectURL(img));
+  };
 
-    const currentFile = fileInputRef.current?.files[0]; // ✅ 获取文件
-    console.log('[handleSubmit] currentFile:', currentFile);
+  const handleSubmit = async (e) => {
+    console.log('[DEBUG] handleSubmit 被触发', e);
+    e.preventDefault();
 
     setIsLoading(true);
     setMessage('');
 
-    if (!user || !user.id) {
+    const currentFile = fileInputRef.current?.files[0];
+    console.log('[DEBUG] 当前选择文件:', currentFile);
+
+    if (!user || !user.userId) {
+      console.log('[DEBUG] 用户未登录,阻止上传');
       setMessage('请先登录');
       setIsLoading(false);
       return;
     }
 
     if (!currentFile || !currentFile.name.toLowerCase().endsWith('.torrent')) {
+      console.log('[DEBUG] 文件校验失败');
       setMessage('请上传一个 .torrent 文件');
       setIsLoading(false);
       return;
@@ -59,21 +86,25 @@
     formData.append('title', title);
     formData.append('description', description);
     formData.append('category', category);
-    formData.append('imageUrl', imageUrl);
-    formData.append('tags', tags.join(','));
-    formData.append('uploader', user.id);
+    formData.append('tags', tags.join(',')); // 逗号分隔字符串
+    formData.append('uploader', user.userId);
+
+    if (imageFile) {
+      formData.append('image_url', imageFile);
+    }
 
     try {
+      console.log('[DEBUG] 发送上传请求...');
       const response = await axios.post('/seeds/upload', formData, {
-        headers: {
-          'Content-Type': 'multipart/form-data',
-        },
+        // axios 会自动处理 multipart/form-data Content-Type 边界,不用手动设置
+        // headers: { 'Content-Type': 'multipart/form-data' },
       });
+      console.log('[DEBUG] 请求成功,响应:', response.data);
 
-      if (response.data.code === 0) {
+      if (response.data.status === 'success') {
         setMessage('种子上传成功');
       } else {
-        setMessage(response.data.msg || '上传失败,请稍后再试');
+        setMessage(response.data.message || '上传失败,请稍后再试');
       }
     } catch (error) {
       console.error('[handleSubmit] 上传失败:', error);
@@ -88,13 +119,22 @@
       <Header />
       <div className="pub-card">
         {message && <div className="message">{message}</div>}
-        <form onSubmit={handleSubmit} encType="multipart/form-data">
+        <form
+          onSubmit={(e) => {
+            console.log('[DEBUG] form onSubmit 触发');
+            handleSubmit(e);
+          }}
+          encType="multipart/form-data"
+        >
           <div className="title-tag">
             <label>标题</label>
             <input
               type="text"
               value={title}
-              onChange={(e) => setTitle(e.target.value)}
+              onChange={(e) => {
+                console.log('[DEBUG] 标题输入变化:', e.target.value);
+                setTitle(e.target.value);
+              }}
               required
             />
           </div>
@@ -103,7 +143,10 @@
             <label>描述</label>
             <textarea
               value={description}
-              onChange={(e) => setDescription(e.target.value)}
+              onChange={(e) => {
+                console.log('[DEBUG] 描述输入变化:', e.target.value);
+                setDescription(e.target.value);
+              }}
               required
             />
           </div>
@@ -123,7 +166,10 @@
             <label>分类</label>
             <select
               value={category}
-              onChange={(e) => setCategory(e.target.value)}
+              onChange={(e) => {
+                console.log('[DEBUG] 分类选择变化:', e.target.value);
+                setCategory(e.target.value);
+              }}
               required
             >
               <option value="movie">电影</option>
@@ -134,7 +180,11 @@
 
           <div className="seed-file">
             <label>种子文件</label>
-            <div className="seed-file-label" onClick={handleFileButtonClick}>
+            <div
+              className="seed-file-label"
+              onClick={handleFileButtonClick}
+              style={{ cursor: 'pointer' }}
+            >
               点击选择文件
             </div>
             <input
@@ -148,28 +198,36 @@
           </div>
 
           <div className="form-group">
-            <label>封面图URL</label>
-            <input
-              type="url"
-              value={imageUrl}
-              onChange={(e) => setImageUrl(e.target.value)}
-              placeholder="例如:http://example.com/images/cover.jpg"
-              required
-              style={{
-                padding: '1%',
-                width: '100%',
-                borderRadius: '6px',
-                border: '1px solid #e0c4a1',
-                backgroundColor: '#fff5f5',
-                color: '#5F4437',
-                fontSize: '1rem',
-                marginBottom: '2%',
-              }}
-            />
+            <label>封面图</label>
+            <div className="cover-upload">
+              <button type="button" onClick={handleImageButtonClick}>
+                上传图片
+              </button>
+              <input
+                type="file"
+                accept="image/*"
+                ref={imageInputRef}
+                onChange={handleImageChange}
+                style={{ display: 'none' }}
+              />
+            </div>
+            {previewUrl && (
+              <div style={{ marginTop: '10px' }}>
+                <img
+                  src={previewUrl}
+                  alt="封面预览"
+                  style={{ maxWidth: '100%', maxHeight: '200px' }}
+                />
+              </div>
+            )}
           </div>
 
           <div className="upload-button">
-            <button type="submit" disabled={isLoading}>
+            <button
+              type="submit"
+              disabled={isLoading}
+              onClick={() => console.log('[DEBUG] 上传按钮 onClick 触发')}
+            >
               {isLoading ? '正在上传...' : '上传种子'}
             </button>
           </div>