blob: e3be08ca78d9f2c6178d66cdcd55f51d38136b17 [file] [log] [blame]
223010095b28c672025-04-10 20:12:45 +08001import React, { useState } from 'react';
2import axios from 'axios';
2230100964011632025-06-04 21:57:22 +08003import Header from '../../components/Header';
4import './PublishSeed.css';
5import { useUser } from '../../context/UserContext';
223010095b28c672025-04-10 20:12:45 +08006
7const PublishSeed = () => {
8 const [title, setTitle] = useState('');
9 const [description, setDescription] = useState('');
10 const [tags, setTags] = useState([]);
11 const [category, setCategory] = useState('movie');
12 const [file, setFile] = useState(null);
13 const [imageUrl, setImageUrl] = useState('');
14 const [message, setMessage] = useState('');
15 const [isLoading, setIsLoading] = useState(false);
16
2230100964011632025-06-04 21:57:22 +080017 const { user } = useUser(); // 从上下文中获取当前登录用户信息
18
223010095b28c672025-04-10 20:12:45 +080019 const handleTagsChange = (e) => {
20 setTags(e.target.value.split(',').map(tag => tag.trim()));
21 };
22
23 const handleFileChange = (e) => {
24 setFile(e.target.files[0]);
25 };
26
27 const handleSubmit = async (e) => {
28 e.preventDefault();
29 setIsLoading(true);
30 setMessage('');
31
2230100964011632025-06-04 21:57:22 +080032 if (!user || !user.id) {
33 setMessage('请先登录');
34 setIsLoading(false);
35 return;
36 }
37
38 if (!file || !file.name.endsWith('.torrent')) {
39 setMessage('请上传一个 .torrent 文件');
40 setIsLoading(false);
41 return;
42 }
43
223010095b28c672025-04-10 20:12:45 +080044 const formData = new FormData();
2230100964011632025-06-04 21:57:22 +080045 formData.append('file', file); // 文件字段
223010095b28c672025-04-10 20:12:45 +080046 formData.append('title', title);
47 formData.append('description', description);
223010095b28c672025-04-10 20:12:45 +080048 formData.append('category', category);
2230100964011632025-06-04 21:57:22 +080049 formData.append('imageUrl', imageUrl);
50 formData.append('tags', tags.join(',')); // 后端使用字符串或数组自行处理
51 formData.append('uploader', user.id); // 添加上传者 ID(必须字段)
223010095b28c672025-04-10 20:12:45 +080052
53 try {
2230100964011632025-06-04 21:57:22 +080054 const response = await axios.post('/seeds/upload', formData, {
223010095b28c672025-04-10 20:12:45 +080055 headers: {
56 'Content-Type': 'multipart/form-data',
57 },
58 });
59
2230100964011632025-06-04 21:57:22 +080060 if (response.data.code === 0) {
223010095b28c672025-04-10 20:12:45 +080061 setMessage('种子上传成功');
62 } else {
2230100964011632025-06-04 21:57:22 +080063 setMessage(response.data.msg || '上传失败,请稍后再试');
223010095b28c672025-04-10 20:12:45 +080064 }
65 } catch (error) {
66 console.error(error);
67 setMessage('上传失败,发生了错误');
68 } finally {
69 setIsLoading(false);
70 }
71 };
72
73 return (
74 <div className="publish-seed-container">
2230100964011632025-06-04 21:57:22 +080075 <Header />
Krishyac0f7e9b2025-04-22 15:28:28 +080076 <div className="pub-card">
2230100964011632025-06-04 21:57:22 +080077 {message && <div className="message">{message}</div>}
78 <form onSubmit={handleSubmit} encType="multipart/form-data">
79 <div className="title-tag">
80 <label>标题</label>
81 <input
82 type="text"
83 value={title}
84 onChange={(e) => setTitle(e.target.value)}
85 required
86 />
87 </div>
223010095b28c672025-04-10 20:12:45 +080088
2230100964011632025-06-04 21:57:22 +080089 <div className="discription">
90 <label>描述</label>
91 <textarea
92 value={description}
93 onChange={(e) => setDescription(e.target.value)}
94 required
95 />
96 </div>
223010095b28c672025-04-10 20:12:45 +080097
2230100964011632025-06-04 21:57:22 +080098 <div className="title-tag">
99 <label>标签 (逗号分隔)</label>
100 <input
101 type="text"
102 value={tags.join(', ')}
103 onChange={handleTagsChange}
104 placeholder="例如:科幻, 动作"
105 required
106 />
107 </div>
223010095b28c672025-04-10 20:12:45 +0800108
2230100964011632025-06-04 21:57:22 +0800109 <div className="pub-categoty">
110 <label>分类</label>
111 <select
112 value={category}
113 onChange={(e) => setCategory(e.target.value)}
114 required
115 >
116 <option value="movie">电影</option>
117 <option value="tv">电视剧</option>
118 <option value="music">音乐</option>
119 </select>
120 </div>
223010095b28c672025-04-10 20:12:45 +0800121
2230100964011632025-06-04 21:57:22 +0800122 <div className="seed-file">
123 <label>种子文件</label>
124 <label className="seed-file-label">
Krishyaf1d0ea82025-05-03 17:01:58 +0800125 点击选择文件
126 <input
127 type="file"
2230100964011632025-06-04 21:57:22 +0800128 accept=".torrent"
Krishyaf1d0ea82025-05-03 17:01:58 +0800129 onChange={handleFileChange}
130 style={{ display: 'none' }}
131 />
2230100964011632025-06-04 21:57:22 +0800132 </label>
133 {file && <div style={{ marginTop: '5px' }}>{file.name}</div>}
134 </div>
223010095b28c672025-04-10 20:12:45 +0800135
2230100964011632025-06-04 21:57:22 +0800136 <div className="form-group">
137 <label>封面图URL</label>
138 <input
139 type="url"
140 value={imageUrl}
141 onChange={(e) => setImageUrl(e.target.value)}
142 placeholder="例如:http://example.com/images/cover.jpg"
143 required
144 style={{
145 padding: '1%',
146 width: '100%',
147 borderRadius: '6px',
148 border: '1px solid #e0c4a1',
149 backgroundColor: '#fff5f5',
150 color: '#5F4437',
151 fontSize: '1rem',
152 marginBottom: '2%',
153 }}
154 />
155 </div>
223010095b28c672025-04-10 20:12:45 +0800156
2230100964011632025-06-04 21:57:22 +0800157 <div className="upload-button">
158 <button type="submit" disabled={isLoading}>
159 {isLoading ? '正在上传...' : '上传种子'}
160 </button>
161 </div>
162 </form>
Krishyac0f7e9b2025-04-22 15:28:28 +0800163 </div>
223010095b28c672025-04-10 20:12:45 +0800164 </div>
165 );
166};
167
168export default PublishSeed;