blob: c297fa8d1bddf25d99dbbb6ba43eaff80b682630 [file] [log] [blame]
刘嘉昕b845fa02025-06-09 17:34:59 +08001import React, { useState, useEffect } from 'react';
2import axios from 'axios';
3import "../upload.css";
4import "../uploadtorrent.css";
5import { Form, Input, Select, Button, Typography, Space, message,Switch } from 'antd';
6import { InboxOutlined } from '@ant-design/icons';
7const { TextArea } = Input;
8const { Text } = Typography;
9import Navbar from './Navbar';
10
11
12function UploadTorrent() {
13 const [userid,setuserid] = useState(1);
14 const [title, setTitle] = useState('');
15 const [description, setDescription] = useState('');
16 const [categoryId, setCategoryId] = useState('');
17 const [file, setFile] = useState(null);
18 const [categories, setCategories] = useState([]);
19 const [showSuccess, setShowSuccess] = useState(false);
20 const [form] = Form.useForm();
21
22 // 通用参数
23 const [dpi, setDpi] = useState('');
24 const [caption, setCaption] = useState('');
25 const [region, setRegion] = useState('');
26 const [year, setYear] = useState('');
27 const [genre, setGenre] = useState('');
28 const [format, setFormat] = useState('');
29 const [resolution, setResolution] = useState('');
30 const [coverImage, setCoverImage] = useState(null);
31
32 // 特殊参数
33 const [codecFormat, setCodecFormat] = useState('');
34 const [platform, setPlatform] = useState('');
35 const [language, setLanguage] = useState('');
36 const [eventType, setEventType] = useState('');
37 const [source, setSource] = useState('');
38 const [style, setStyle] = useState('');
39 const [dataType, setdataType] = useState('');
40 const [isMainland, setIsMainland] = useState(false);
41
42 // 根据分类显示不同的表单字段
43 const [showMovieFields, setShowMovieFields] = useState(false);
44 const [showMusicFields, setShowMusicFields] = useState(false);
45 const [showGameFields, setShowGameFields] = useState(false);
46 const [showTvFields, setShowTvFields] = useState(false);
47 const [showAnimeFields, setShowAnimeFields] = useState(false);
48 const [showlearningFields, setShowlearningFields] = useState(false);
49 const [showsoftwareFields, setShowsoftwareFields] = useState(false);
50 const [showvarietyFields, setShowvarietyFields] = useState(false);
51 const [showsportsFields, setShowsportsFields] = useState(false);
52 const [showdocFields, setShowdocFields] = useState(false);
53 const [showotherFields, setShowotherFields] = useState(false);
54 // 其他分类字段...
55 // 编码格式选项
56 const codecFormats = [
57 { value: 'H.264', label: 'H.264' },
58 { value: 'H.265', label: 'H.265' },
59 { value: 'AV1', label: 'AV1' },
60 { value: 'VP9', label: 'VP9' },
61 { value: 'VC1', label: 'VC1' },
62 { value: 'X264', label: 'X264' },
63 ];
64 const regions = [
65 { value: '大陆', label: '大陆' },
66 { value: '港台', label: '港台' },
67 { value: '欧美', label: '欧美' },
68 { value: '日韩', label: '日韩' },
69 { value: '其他', label: '其他' },
70 ];
71 const genres = [
72 { value: '动作', label: '动作' },
73 { value: '喜剧', label: '喜剧' },
74 { value: '爱情', label: '爱情' },
75 { value: '科幻', label: '科幻' },
76 { value: '恐怖', label: '恐怖' },
77 { value: '动作', label: '动作' },
78 { value: '冒险', label: '冒险' },
79 { value: '历史', label: '历史' },
80 { value: '悬疑', label: '悬疑' },
81 { value: '其他', label: '其他' },
82 ];
83 const resolutions = [
84 { value: '720p', label: '720p' },
85 { value: '1080p', label: '1080p' },
86 { value: '2K', label: '2K' },
87 { value: '4K', label: '4K' },
88 { value: '8K', label: '8K' },
89 { value: '其他', label: '其他' },
90 ];
91
92
93 const eventTypes = [
94 { value: '足球', label: '足球' },
95 { value: '篮球', label: '篮球' },
96 { value: '网球', label: '网球' },
97 { value: '乒乓球', label: '乒乓球' },
98 { value: '羽毛球', label: '羽毛球' },
99 ]
100 const styles = [
101 { value: '大陆综艺', label: '大陆综艺' },
102 { value: '日韩综艺', label: '日韩综艺' },
103 { value: '欧美综艺', label: '欧美综艺' },
104 { value: '其他', label: '其他' },
105 ]
106 const platforms = [
107 { value: 'PC', label: 'PC' },
108 { value: 'PS5', label: 'PS5' },
109 { value: 'Xbox', label: 'Xbox' },
110 { value: 'Switch', label: 'Switch' },
111 { value: '手机', label: '手机' },
112 { value: '其他', label: '其他' },
113 ]
114 const gamegenres = [
115 { value: '角色扮演', label: '角色扮演' },
116 { value: '射击', label: '射击' },
117 { value: '冒险', label: '冒险' },
118 { value: '策略', label: '策略' },
119 { value: '体育', label: '体育' },
120 { value: '桌面游戏', label: '桌面游戏'},
121 { value: '其他', label: '其他' },
122 ]
123 const dataTypes = [
124 { value: '压缩包', label: '压缩包' },
125 { value: '补丁', label: '补丁' },
126 { value: '安装包', label: '安装包' },
127 { value: 'nds', label: 'nds' },
128 { value: '其他', label: '其他' },
129 ]
130 const languages = [
131 { value: '中文', label: '中文' },
132 { value: '英文', label: '英文' },
133 { value: '日文', label: '日文' },
134 { value: '其他', label: '其他' },
135 ]
136 const musicgenres = [
137 { value: '专辑', label: '专辑' },
138 { value: '单曲', label: '单曲' },
139 { value: 'EP', label: 'EP' },
140 { value: '现场', label: '现场' },
141 { value: '其他', label: '其他' },
142 ]
143 const musicstyles = [
144 { value: '流行', label: '流行' },
145 { value: '摇滚', label: '摇滚' },
146 { value: '电子', label: '电子' },
147 { value: '古典', label: '古典' },
148 { value: '爵士', label: '爵士' },
149 { value: '民谣', label: '民谣' },
150 { value: '说唱', label: '说唱' },
151 { value: '其他', label: '其他' },
152 ]
153 const musicformats = [
154 { value: 'MP3', label: 'MP3' },
155 { value: 'FLAC', label: 'FLAC' },
156 { value: 'WAV', label: 'WAV' },
157 { value: 'AAC', label: 'AAC' },
158 { value: 'OGG', label: 'OGG' },
159 { value: '其他', label: '其他' },
160 ]
161 const anigenres = [
162 { value: '新番连载', label: '新番连载' },
163 { value: '剧场版', label: '剧场版' },
164 { value: 'OVA', label: 'OVA' },
165 { value: '完结动漫', label: '完结动漫' },
166 { value: '其他', label: '其他' },
167 ]
168 const animeformats = [
169 { value: 'ZIP', label: 'ZIP' },
170 { value: 'RAR', label: 'RAR' },
171 { value: '7Z', label: '7Z' },
172 { value: 'MKV', label: 'MKV' },
173 { value: 'MP4', label: 'MP4' },
174 { value: '其他', label: '其他' },
175 ]
176 const varietygenres = [
177 { value: '真人秀', label: '真人秀' },
178 { value: '选秀', label: '选秀' },
179 { value: '访谈', label: '访谈' },
180 { value: '游戏', label: '游戏' },
181 { value: '音乐', label: '音乐' },
182 { value: '其他', label: '其他' },
183 ]
184 const sportsgenres = [
185 { value: '足球', label: '足球' },
186 { value: '篮球', label: '篮球' },
187 { value: '网球', label: '网球' },
188 { value: '乒乓球', label: '乒乓球' },
189 { value: '羽毛球', label: '羽毛球' },
190 { value: '其他', label: '其他' },
191 ]
192 const softwaregenres = [
193 { value: '系统软件', label: '系统软件' },
194 { value: '应用软件', label: '应用软件' },
195 { value: '游戏软件', label: '游戏软件' },
196 { value: '驱动程序', label: '驱动程序' },
197 { value: '办公软件', label: '办公软件' },
198 { value: '其他', label: '其他' },
199 ]
200 const softwareplatforms = [
201 { value: 'Windows', label: 'Windows' },
202 { value: 'Mac', label: 'Mac' },
203 { value: 'Linux', label: 'Linux' },
204 { value: 'Android', label: 'Android' },
205 { value: 'iOS', label: 'iOS' },
206 { value: '其他', label: '其他' },
207 ]
208 const softwareformats = [
209 { value: 'EXE', label: 'EXE' },
210 { value: 'DMG', label: 'DMG' },
211 { value: '光盘镜像', label: '光盘镜像' },
212 { value: 'APK', label: 'APK' },
213 { value: 'IPA', label: 'IPA' },
214 { value: '其他', label: '其他' },
215 ]
216 const learninggenres = [
217 { value: '计算机', label: '计算机' },
218 { value: '软件', label: '软件' },
219 { value: '人文', label: '人文' },
220 { value: '外语', label: '外语' },
221 { value: '理工类', label: '理工类' },
222 { value: '其他', label: '其他' },
223 ]
224 const learningformats = [
225 { value: 'PDF', label: 'PDF' },
226 { value: 'EPUB', label: 'EPUB' },
227 { value: '视频', label: '视频' },
228 { value: '音频', label: '音频' },
229 { value: 'PPT', label: 'PPT' },
230 { value: '其他', label: '其他' },
231 ]
232 const sourceTypes = [
233 { value: 'CCTV', label: 'CCTV' },
234 { value: '卫视', label: '卫视' },
235 { value: '国家地理', label: '国家地理' },
236 { value: 'BBC', label: 'BBC' },
237 { value: 'Discovery', label: 'Discovery' },
238 { value: '其他', label: '其他' },
239 ]
240 const othergenres = [
241 { value: '电子书', label: '电子书' },
242 { value: '视频', label: '视频' },
243 { value: 'MP3', label: 'MP3' },
244 { value: '图片', label: '图片' },
245 { value: '其他', label: '其他' },
246 ]
247 useEffect(() => {
248 axios.get('http://localhost:8080/categories')
249 .then(res => setCategories(res.data))
250 .catch(err => console.error('加载分类失败', err));
251 }, []);
252
253 // 根据选择的分类显示不同的表单字段
254 useEffect(() => {
255 setShowMovieFields(categoryId === '1');
256 setShowMusicFields(categoryId === '3');
257 setShowGameFields(categoryId === '5');
258 setShowTvFields(categoryId === '2');
259 setShowAnimeFields(categoryId === '4');
260 setShowlearningFields(categoryId === '9');
261 setShowsoftwareFields(categoryId === '8');
262 setShowvarietyFields(categoryId === '6');
263 setShowsportsFields(categoryId === '7');
264 setShowdocFields(categoryId === '10');
265 setShowotherFields(categoryId === '11');
266 // 其他分类...
267 }, [categoryId]);
268
269
270
271 const handleSubmit = async (e) => {
272 //e.preventDefault();
273 if (!coverImage) {
274 alert('请选择一个 图片 文件');
275 return;
276 }
277 if (!file) {
278 alert('请选择一个 .torrent 文件');
279 return;
280 }
281
282 if (!categoryId) {
283 alert('请选择分类');
284 return;
285 }
286
287
288 const formData = new FormData();
289 formData.append('userid', userid);
290 formData.append('file', file);
291 // Add cover image if it exists
292 formData.append('coverImage', coverImage);
293 formData.append('title', title);
294 formData.append('description', description);
295 formData.append('categoryId', categoryId);
296
297
298 // 通用参数
299 if (dpi) formData.append('dpi', dpi);
300 if (caption) formData.append('caption', caption);
301 if (region) formData.append('region', region);
302 if (year) formData.append('year', year);
303 if (genre) formData.append('genre', genre);
304 if (format) formData.append('format', format);
305 if (resolution) formData.append('resolution', resolution);
306
307 // 特殊参数
308 if (codecFormat) formData.append('codecFormat', codecFormat);
309 if (platform) formData.append('platform', platform);
310 if (language) formData.append('language', language);
311 if (eventType) formData.append('eventType', eventType);
312 if (source) formData.append('source', source);
313 if (style) formData.append('style', style);
314 if (dataType) formData.append('dataType', dataType);
315 formData.append('isMainland', isMainland.toString());
316
317 try {
318 const response = await axios.post('http://localhost:8080/torrent/upload', formData, {
319 headers: { 'Content-Type': 'multipart/form-data' },
320 responseType: 'blob',
321 });
322
323 // 创建下载链接
324 const url = window.URL.createObjectURL(new Blob([response.data]));
325 const link = document.createElement('a');
326 link.href = url;
327 link.setAttribute('download', file.name);
328 document.body.appendChild(link);
329 link.click();
330 link.remove();
331
332 // 显示成功提示
333 setShowSuccess(true);
334 // 清空表单
335 setTitle('');
336 setDescription('');
337 setCategoryId('');
338 setFile(null);
339 // 清空其他字段...
340 } catch (err) {
341 console.error('上传失败', err.response?.data || err.message);
342 alert(err.response?.data || '上传失败,请检查后端是否启动');
343 }
344 };
345
346// return (
347// <div className="max-w-2xl mx-auto mt-10 p-6 bg-white shadow rounded">
348// <h2 className="text-2xl font-bold mb-6 text-orange-800 text-center border-b-2 border-orange-200 pb-3">上传种子</h2>
349// <form onSubmit={handleSubmit} className="space-y-6">
350// {/* 封面图片 - 大型上传区域 */}
351// <div className="form-group text-center">
352// <label className="upload-area text-orange-800 font-medium cursor-pointer p-8 border-2 border-dashed border-orange-300 rounded-lg hover:border-orange-400 transition-colors">
353// <svg xmlns="http://www.w3.org/2000/svg" className="mx-auto h-12 w-12 text-orange-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
354// <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12" />
355// </svg>
356// <p className="mt-2 text-sm">点击或拖拽上传封面图片</p>
357// <input
358// type="file"
359// accept="image/*"
360// onChange={(e) => setCoverImage(e.target.files[0])}
361// className="hidden"
362// id="cover-image-upload"
363// />
364// </label>
365// <input
366// type="file"
367// accept="image/*"
368// onChange={(e) => setCoverImage(e.target.files[0])}
369// className="sr-only"
370// id="cover-image-upload-real"
371// />
372// </div>
373
374// {/* 种子文件 - 大型上传区域 */}
375// <div className="form-group text-center">
376// <label className="upload-area text-orange-800 font-medium cursor-pointer p-8 border-2 border-dashed border-orange-300 rounded-lg hover:border-orange-400 transition-colors">
377// <svg xmlns="http://www.w3.org/2000/svg" className="mx-auto h-12 w-12 text-orange-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
378// <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
379// </svg>
380// <p className="mt-2 text-sm">点击或拖拽上传种子文件(.torrent)</p>
381// <input
382// type="file"
383// accept=".torrent"
384// onChange={(e) => setFile(e.target.files[0])}
385// className="hidden"
386// id="torrent-file-upload"
387// required
388// />
389// </label>
390// <input
391// type="file"
392// accept=".torrent"
393// onChange={(e) => setFile(e.target.files[0])}
394// className="sr-only"
395// id="torrent-file-upload-real"
396// required
397// />
398// </div>
399
400// {/* 标题 */}
401// <div className="form-group">
402// <label className="form-label text-orange-800 text-center">标题</label>
403// <input
404// type="text"
405// placeholder="输入种子标题"
406// value={title}
407// onChange={(e) => setTitle(e.target.value)}
408// className="form-control text-center"
409// required
410// />
411// </div>
412
413// {/* 描述 */}
414// <div className="form-group">
415// <label className="form-label text-orange-800 text-center">描述</label>
416// <textarea
417// placeholder="输入种子描述"
418// value={description}
419// onChange={(e) => setDescription(e.target.value)}
420// className="form-control text-center"
421// rows={3}
422// />
423// </div>
424
425// {/* 分类 - 美化下拉框 */}
426// <div className="form-group">
427// <label className="form-label text-orange-800 text-center">分类</label>
428// <div className="relative">
429// <select
430// value={categoryId}
431// onChange={(e) => setCategoryId(e.target.value)}
432// className="custom-select"
433// required
434// >
435// <option value="">请选择分类</option>
436// {categories.map(cat => (
437// <option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</option>
438// ))}
439// </select>
440// <div className="select-arrow">
441// <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-orange-500" viewBox="0 0 20 20" fill="currentColor">
442// <path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
443// </svg>
444// </div>
445// </div>
446// </div>
447
448// {/* 动态字段 - 电影 */}
449// {showMovieFields && (
450// <>
451// <div className="form-group">
452// <label className="form-label text-orange-800 text-center">字幕/说明</label>
453// <input
454// type="text"
455// placeholder="输入字幕/说明"
456// value={caption}
457// onChange={(e) => setCaption(e.target.value)}
458// className="form-control text-center"
459// />
460// </div>
461// <div className="form-group">
462// <label className="form-label text-orange-800 text-center">地区</label>
463// <div className="relative">
464// <select
465// value={region}
466// onChange={(e) => setRegion(e.target.value)}
467// className="custom-select"
468// >
469// <option value="">请选择地区</option>
470// {regions.map((region) => (
471// <option key={region.value} value={region.value}>
472// {region.label}
473// </option>
474// ))}
475// </select>
476// <div className="select-arrow">
477// <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-orange-500" viewBox="0 0 20 20" fill="currentColor">
478// <path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
479// </svg>
480// </div>
481// </div>
482// </div>
483// <div className="form-group">
484// <label className="form-label text-orange-800 text-center">年份</label>
485// <input
486// type="text"
487// placeholder="输入年份"
488// value={year}
489// onChange={(e) => setYear(e.target.value)}
490// className="form-control text-center"
491// />
492// </div>
493// <div className="form-group">
494// <label className="form-label text-orange-800 text-center">类型</label>
495// <div className="relative">
496// <select
497// value={genre}
498// onChange={(e) => setGenre(e.target.value)}
499// className="custom-select"
500// >
501// <option value="">请选择类型</option>
502// {genres.map((format) => (
503// <option key={format.value} value={format.value}>
504// {format.label}
505// </option>
506// ))}
507// </select>
508// <div className="select-arrow">
509// <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-orange-500" viewBox="0 0 20 20" fill="currentColor">
510// <path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
511// </svg>
512// </div>
513// </div>
514// </div>
515// <div className="form-group">
516// <label className="form-label text-orange-800 text-center">编码格式</label>
517// <div className="relative">
518// <select
519// value={codecFormat}
520// onChange={(e) => setCodecFormat(e.target.value)}
521// className="custom-select"
522// >
523// <option value="">请选择编码格式</option>
524// {codecFormats.map((format) => (
525// <option key={format.value} value={format.value}>
526// {format.label}
527// </option>
528// ))}
529// </select>
530// <div className="select-arrow">
531// <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-orange-500" viewBox="0 0 20 20" fill="currentColor">
532// <path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
533// </svg>
534// </div>
535// </div>
536// </div>
537// <div className="form-group">
538// <label className="form-label text-orange-800 text-center">分辨率</label>
539// <div className="relative">
540// <select
541// value={resolution}
542// onChange={(e) => setResolution(e.target.value)}
543// className="custom-select"
544// >
545// <option value="">请选择分辨率</option>
546// {resolutions.map((resolution) => (
547// <option key={resolution.value} value={resolution.value}>
548// {resolution.label}
549// </option>
550// ))}
551// </select>
552// <div className="select-arrow">
553// <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-orange-500" viewBox="0 0 20 20" fill="currentColor">
554// <path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
555// </svg>
556// </div>
557// </div>
558// </div>
559// </>
560// )}
561
562// {/* 动态字段 - 剧集 */}
563// {showTvFields && (
564// <>
565// <div className="form-group">
566// <label className="form-label text-orange-800">地区</label>
567// <select
568// value={region}
569// onChange={(e) => setRegion(e.target.value)}
570// className="form-control"
571// >
572// <option value="">请选择地区</option>
573// {regions.map((region) => (
574// <option key={region.value} value={region.value}>
575// {region.label}
576// </option>
577// ))}
578// </select>
579// </div>
580// <div className="form-group">
581// <label className="form-label text-orange-800">格式</label>
582// <select
583// value={format}
584// onChange={(e) => setFormat(e.target.value)}
585// className="form-control"
586// >
587// <option value="">请选择格式</option>
588// {resolutions.map((format) => (
589// <option key={format.value} value={format.value}>
590// {format.label}
591// </option>
592// ))}
593// </select>
594// </div>
595// <div className="form-group">
596// <label className="form-label text-orange-800">类型</label>
597// <select
598// value={genre}
599// onChange={(e) => setGenre(e.target.value)}
600// className="form-control"
601// >
602// <option value="">请选择类型</option>
603// {genres.map((genre) => (
604// <option key={genre.value} value={genre.value}>
605// {genre.label}
606// </option>
607// ))}
608// </select>
609// </div>
610// </>
611// )}
612
613// {/* 动态字段 - 游戏 */}
614// {showGameFields && (
615// <>
616// <div className="form-group">
617// <label className="form-label text-orange-800">平台</label>
618// <select
619// value={platform}
620// onChange={(e) => setPlatform(e.target.value)}
621// className="form-control"
622// >
623// <option value="">请选择平台</option>
624// {platforms.map((platform) => (
625// <option key={platform.value} value={platform.value}>
626// {platform.label}
627// </option>
628// ))}
629// </select>
630// </div>
631// <div className="form-group">
632// <label className="form-label text-orange-800">类型</label>
633// <select
634// value={genre}
635// onChange={(e) => setGenre(e.target.value)}
636// className="form-control"
637// >
638// <option value="">请选择类型</option>
639// {gamegenres.map((genre) => (
640// <option key={genre.value} value={genre.value}>
641// {genre.label}
642// </option>
643// ))}
644// </select>
645// </div>
646// <div className="form-group">
647// <label className="form-label text-orange-800">语言</label>
648// <select
649// value={language}
650// onChange={(e) => setLanguage(e.target.value)}
651// className="form-control"
652// >
653// <option value="">请选择语言</option>
654// {languages.map((language) => (
655// <option key={language.value} value={language.value}>
656// {language.label}
657// </option>
658// ))}
659// </select>
660// </div>
661// <div className="form-group">
662// <label className="form-label text-orange-800">数据类型</label>
663// <select
664// value={dataType}
665// onChange={(e) => setdataType(e.target.value)}
666// className="form-control"
667// >
668// <option value="">请选择数据类型</option>
669// {dataTypes.map((dataType) => (
670// <option key={dataType.value} value={dataType.value}>
671// {dataType.label}
672// </option>
673// ))}
674// </select>
675// </div>
676// </>
677// )}
678
679// {/* 动态字段 - 综艺 */}
680// {showvarietyFields && (
681// <>
682// <div className="form-group">
683// <label className="flex items-center">
684// <input
685// type="checkbox"
686// checked={isMainland}
687// onChange={(e) => setIsMainland(e.target.checked)}
688// className="mr-2"
689// />
690// 是否大陆综艺
691// </label>
692// </div>
693// <div className="form-group">
694// <label className="form-label text-orange-800">类型</label>
695// <select
696// value={style}
697// onChange={(e) => setStyle(e.target.value)}
698// className="form-control"
699// >
700// <option value="">请选择类型</option>
701// {varietygenres.map((style) => (
702// <option key={style.value} value={style.value}>
703// {style.label}
704// </option>
705// ))}
706// </select>
707// </div>
708// <div className="form-group">
709// <label className="form-label text-orange-800">格式</label>
710// <select
711// value={format}
712// onChange={(e) => setFormat(e.target.value)}
713// className="form-control"
714// >
715// <option value="">请选择格式</option>
716// {resolutions.map((format) => (
717// <option key={format.value} value={format.value}>
718// {format.label}
719// </option>
720// ))}
721// </select>
722// </div>
723// </>
724// )}
725
726// {/* 动态字段 - 动漫 */}
727// {showAnimeFields && (
728// <>
729// <div className="form-group">
730// <label className="form-label text-orange-800">类型</label>
731// <select
732// value={genre}
733// onChange={(e) => setGenre(e.target.value)}
734// className="form-control"
735// >
736// <option value="">请选择类型</option>
737// {anigenres.map((genre) => (
738// <option key={genre.value} value={genre.value}>
739// {genre.label}
740// </option>
741// ))}
742// </select>
743// </div>
744// <div className="form-group">
745// <label className="form-label text-orange-800">格式</label>
746// <select
747// value={format}
748// onChange={(e) => setFormat(e.target.value)}
749// className="form-control"
750// >
751// <option value="">请选择格式</option>
752// {animeformats.map((format) => (
753// <option key={format.value} value={format.value}>
754// {format.label}
755// </option>
756// ))}
757// </select>
758// </div>
759// <div className="form-group">
760// <label className="form-label text-orange-800">分辨率</label>
761// <select
762// value={resolution}
763// onChange={(e) => setResolution(e.target.value)}
764// className="form-control"
765// >
766// <option value="">请选择分辨率</option>
767// {resolutions.map((resolution) => (
768// <option key={resolution.value} value={resolution.value}>
769// {resolution.label}
770// </option>
771// ))}
772// </select>
773// </div>
774// </>
775// )}
776
777// {/* 动态字段 - 学习 */}
778// {showlearningFields && (
779// <>
780// <div className="form-group">
781// <label className="form-label text-orange-800">类型</label>
782// <select
783// value={genre}
784// onChange={(e) => setGenre(e.target.value)}
785// className="form-control"
786// >
787// <option value="">请选择类型</option>
788// {learninggenres.map((genre) => (
789// <option key={genre.value} value={genre.value}>
790// {genre.label}
791// </option>
792// ))}
793// </select>
794// </div>
795// <div className="form-group">
796// <label className="form-label text-orange-800">格式</label>
797// <select
798// value={format}
799// onChange={(e) => setFormat(e.target.value)}
800// className="form-control"
801// >
802// <option value="">请选择格式</option>
803// {learningformats.map((format) => (
804// <option key={format.value} value={format.value}>
805// {format.label}
806// </option>
807// ))}
808// </select>
809// </div>
810// </>
811// )}
812
813// {/* 动态字段 - 软件 */}
814// {showsoftwareFields && (
815// <>
816// <div className="form-group">
817// <label className="form-label text-orange-800">平台</label>
818// <select
819// value={platform}
820// onChange={(e) => setPlatform(e.target.value)}
821// className="form-control"
822// >
823// <option value="">请选择平台</option>
824// {softwareplatforms.map((platform) => (
825// <option key={platform.value} value={platform.value}>
826// {platform.label}
827// </option>
828// ))}
829// </select>
830// </div>
831// <div className="form-group">
832// <label className="form-label text-orange-800">类型</label>
833// <select
834// value={genre}
835// onChange={(e) => setGenre(e.target.value)}
836// className="form-control"
837// >
838// <option value="">请选择类型</option>
839// {softwaregenres.map((genre) => (
840// <option key={genre.value} value={genre.value}>
841// {genre.label}
842// </option>
843// ))}
844// </select>
845// </div>
846// <div className="form-group">
847// <label className="form-label text-orange-800">格式</label>
848// <select
849// value={format}
850// onChange={(e) => setFormat(e.target.value)}
851// className="form-control"
852// >
853// <option value="">请选择格式</option>
854// {softwareformats.map((format) => (
855// <option key={format.value} value={format.value}>
856// {format.label}
857// </option>
858// ))}
859// </select>
860// </div>
861// </>
862// )}
863
864// {/* 动态字段 - 体育 */}
865// {showsportsFields && (
866// <>
867// <div className="form-group">
868// <label className="form-label text-orange-800">类型</label>
869// <select
870// value={genre}
871// onChange={(e) => setGenre(e.target.value)}
872// className="form-control"
873// >
874// <option value="">请选择类型</option>
875// {sportsgenres.map((genre) => (
876// <option key={genre.value} value={genre.value}>
877// {genre.label}
878// </option>
879// ))}
880// </select>
881// </div>
882// <div className="form-group">
883// <label className="form-label text-orange-800">格式</label>
884// <select
885// value={format}
886// onChange={(e) => setFormat(e.target.value)}
887// className="form-control"
888// >
889// <option value="">请选择格式</option>
890// {resolutions.map((format) => (
891// <option key={format.value} value={format.value}>
892// {format.label}
893// </option>
894// ))}
895// </select>
896// </div>
897// <div className="form-group">
898// <label className="form-label text-orange-800">赛事类型</label>
899// <select
900// value={eventType}
901// onChange={(e) => setEventType(e.target.value)}
902// className="form-control"
903// >
904// <option value="">请选择赛事类型</option>
905// {eventTypes.map((eventType) => (
906// <option key={eventType.value} value={eventType.value}>
907// {eventType.label}
908// </option>
909// ))}
910// </select>
911// </div>
912// </>
913// )}
914
915// {/* 动态字段 - 纪录片 */}
916// {showdocFields && (
917// <>
918// <div className="form-group">
919// <label className="form-label text-orange-800">年份</label>
920// <input
921// type="text"
922// placeholder="如 1999, 2020"
923// value={year}
924// onChange={(e) => setYear(e.target.value)}
925// className="form-control"
926// />
927// </div>
928// <div className="form-group">
929// <label className="form-label text-orange-800">视频源</label>
930// <select
931// value={source}
932// onChange={(e) => setSource(e.target.value)}
933// className="form-control"
934// >
935// <option value="">请选择视频源</option>
936// {sourceTypes.map((source) => (
937// <option key={source.value} value={source.value}>
938// {source.label}
939// </option>
940// ))}
941// </select>
942// </div>
943// <div className="form-group">
944// <label className="form-label text-orange-800">格式</label>
945// <select
946// value={format}
947// onChange={(e) => setFormat(e.target.value)}
948// className="form-control"
949// >
950// <option value="">请选择格式</option>
951// {resolutions.map((format) => (
952// <option key={format.value} value={format.value}>
953// {format.label}
954// </option>
955// ))}
956// </select>
957// </div>
958// </>
959// )}
960
961// {/* 动态字段 - 音乐 */}
962// {showMusicFields && (
963// <>
964// <div className="form-group">
965// <label className="form-label text-orange-800">类型</label>
966// <select
967// value={genre}
968// onChange={(e) => setGenre(e.target.value)}
969// className="form-control"
970// >
971// <option value="">请选择类型</option>
972// {musicgenres.map((genre) => (
973// <option key={genre.value} value={genre.value}>
974// {genre.label}
975// </option>
976// ))}
977// </select>
978// </div>
979// <div className="form-group">
980// <label className="form-label text-orange-800">地区</label>
981// <select
982// value={region}
983// onChange={(e) => setRegion(e.target.value)}
984// className="form-control"
985// >
986// <option value="">请选择地区</option>
987// {regions.map((region) => (
988// <option key={region.value} value={region.value}>
989// {region.label}
990// </option>
991// ))}
992// </select>
993// </div>
994// <div className="form-group">
995// <label className="form-label text-orange-800">风格</label>
996// <select
997// value={style}
998// onChange={(e) => setStyle(e.target.value)}
999// className="form-control"
1000// >
1001// <option value="">请选择风格</option>
1002// {musicstyles.map((style) => (
1003// <option key={style.value} value={style.value}>
1004// {style.label}
1005// </option>
1006// ))}
1007// </select>
1008// </div>
1009// <div className="form-group">
1010// <label className="form-label text-orange-800">格式</label>
1011// <select
1012// value={format}
1013// onChange={(e) => setFormat(e.target.value)}
1014// className="form-control"
1015// >
1016// <option value="">请选择格式</option>
1017// {musicformats.map((format) => (
1018// <option key={format.value} value={format.value}>
1019// {format.label}
1020// </option>
1021// ))}
1022// </select>
1023// </div>
1024// </>
1025// )}
1026
1027// {/* 动态字段 - 其他 */}
1028// {showotherFields && (
1029// <>
1030// <div className="form-group">
1031// <label className="form-label text-orange-800">类型</label>
1032// <select
1033// value={genre}
1034// onChange={(e) => setGenre(e.target.value)}
1035// className="form-control"
1036// >
1037// <option value="">请选择类型</option>
1038// {othergenres.map((genre) => (
1039// <option key={genre.value} value={genre.value}>
1040// {genre.label}
1041// </option>
1042// ))}
1043// </select>
1044// </div>
1045// </>
1046// )}
1047
1048
1049// {/* 其他动态字段... (保持相同的美化样式) */}
1050// {/* 这里省略了其他动态字段的代码,但它们都使用相同的自定义下拉框样式 */}
1051
1052// {/* 提交按钮 - 居中 */}
1053// <div className="text-center">
1054// <button
1055// type="submit"
1056// className="submit-btn"
1057// >
1058// 上传种子
1059// </button>
1060// </div>
1061
1062// {showSuccess && (
1063// <div className="success-message text-center">
1064// 上传成功!
1065// </div>
1066// )}
1067// </form>
1068// </div>
1069// );
1070// }
1071return (
1072 <div>
1073 <Navbar style={{ width: '100%' }}/>
1074 <div className="container">
1075 <div className="card">
1076 <h2 className="title">上传种子</h2>
1077 <Form
1078 layout="vertical"
1079 onFinish={handleSubmit}
1080 className="form"
1081 >
1082 {/* 封面图片 - 自定义上传区域 */}
1083<Form.Item
1084 name="coverImage"
1085 label={<span style={{ fontSize: '19px' , fontWeight: 'bold'}}>封面图片</span>}
1086 rules={[{ required: true, message: '请上传封面图片' }]}
1087>
1088 <div
1089 className="uploadArea"
1090 onClick={() => document.getElementById('cover-image-upload').click()}
1091 >
1092 <InboxOutlined className="uploadIcon" />
1093 <p className="uploadText">点击或拖拽上传封面图片</p>
1094 <input
1095 type="file"
1096 accept="image/*"
1097 onChange={(e) => {
1098 setCoverImage(e.target.files[0]);
1099 form.setFieldsValue({ coverImage: e.target.files[0] });
1100 }}
1101 className="hiddenInput"
1102 id="cover-image-upload"
1103 />
1104 </div>
1105</Form.Item>
1106
1107{/* 种子文件 - 自定义上传区域 */}
1108<Form.Item
1109 name="torrentFile"
1110 label={<span style={{ fontSize: '19px' , fontWeight: 'bold'}}>种子文件</span>}
1111 rules={[{ required: true, message: '请上传.torrent文件' }]}
1112>
1113 <div
1114 className="uploadArea"
1115 onClick={() => document.getElementById('torrent-file-upload').click()}
1116 >
1117 <InboxOutlined className="uploadIcon" />
1118 <p className="uploadText">点击或拖拽上传种子文件(.torrent)</p>
1119 <input
1120 type="file"
1121 accept=".torrent"
1122 onChange={(e) => {
1123 setFile(e.target.files[0]);
1124 form.setFieldsValue({ torrentFile: e.target.files[0] });
1125 }}
1126 className="hiddenInput"
1127 id="torrent-file-upload"
1128 />
1129 </div>
1130</Form.Item>
1131
1132 {/* 标题 */}
1133 <Form.Item
1134 name="title"
1135 label={<span style={{ fontSize: '19px' , fontWeight: 'bold'}}>标题</span>} // 直接包裹label
1136 rules={[{ required: true, message: '请输入标题' }]}
1137 //labelCol={{ style: { fontSize: '30px !important ' } }} // ✅ 调整 Label 字体
1138 >
1139 <Input
1140 placeholder="输入种子标题"
1141 value={title}
1142 onChange={(e) => {
1143 setTitle(e.target.value);
1144 form.setFieldsValue({ title: e.target.value });
1145 }}
1146 //style={styles.input}
1147 style={{ fontSize: '19px' }} // ✅ 调整 Input 字体
1148 />
1149 </Form.Item>
1150
1151 {/* 描述 */}
1152 <Form.Item
1153 name="description"
1154 label={<span style={{ fontSize: '19px' , fontWeight: 'bold'}}>描述</span>}
1155 >
1156 <TextArea
1157 placeholder="输入种子描述"
1158 value={description}
1159 onChange={(e) => {
1160 setDescription(e.target.value);
1161 form.setFieldsValue({ description: e.target.value });
1162 }}
1163 rows={3}
1164 style={styles.textArea}
1165 />
1166 </Form.Item>
1167
1168 {/* 分类 - 美化下拉框 */}
1169 <Form.Item
1170 name="categoryId"
1171 label={<span style={{ fontSize: '19px' , fontWeight: 'bold' }}>分类</span>}
1172 rules={[{ required: true, message: '请选择分类' }]}
1173 >
1174 <Select
1175 placeholder="请选择分类"
1176 value={categoryId}
1177 onChange={(value) => {
1178 const stringValue = String(value);
1179 setCategoryId(stringValue);
1180 console.log('Selected category ID:', stringValue);
1181 form.setFieldsValue({ categoryId: value });
1182 // 触发分类变化后的逻辑
1183 setShowMovieFields(value === '1');
1184 setShowTvFields(value === '2');
1185 setShowAnimeFields(value === '4');
1186 setShowGameFields(value === '5');
1187 setShowvarietyFields(value === '6');
1188 setShowMusicFields(value === '3');
1189 setShowlearningFields(value === '9');
1190 setShowsoftwareFields(value === '8');
1191 setShowsportsFields(value === '7');
1192 setShowdocFields(value === '10');
1193 setShowotherFields(value === '11');
1194 }}
1195 style={styles.select}
1196 >
1197 <Option value="">请选择分类</Option>
1198 {categories.map(cat => (
1199 <Option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</Option>
1200 ))}
1201 </Select>
1202 </Form.Item>
1203
1204 {/* 动态字段 - 电影 */}
1205 {showMovieFields && (
1206 <>
1207 <Form.Item
1208 name="caption"
1209 label="字幕/说明"
1210 rules={[{ required: true, message: '请输入字幕/说明' }]}
1211 >
1212 <Input
1213 placeholder="输入字幕/说明"
1214 value={caption}
1215 onChange={(e) => {
1216 setCaption(e.target.value);
1217 form.setFieldsValue({ caption: e.target.value });
1218 }}
1219 className="text-center"
1220 />
1221 </Form.Item>
1222 <Form.Item
1223 name="region"
1224 label="地区"
1225 >
1226 <Select
1227 placeholder="请选择地区"
1228 value={region}
1229 onChange={(value) => {
1230 setRegion(value);
1231 form.setFieldsValue({ region: value });
1232 }}
1233 className="w-full"
1234 >
1235 <Option value="">请选择地区</Option>
1236 {regions.map((region) => (
1237 <Option key={region.value} value={region.value}>
1238 {region.label}
1239 </Option>
1240 ))}
1241 </Select>
1242 </Form.Item>
1243 <Form.Item
1244 name="year"
1245 label="年份"
1246 >
1247 <Input
1248 placeholder="输入年份"
1249 value={year}
1250 onChange={(e) => {
1251 setYear(e.target.value);
1252 form.setFieldsValue({ year: e.target.value });
1253 }}
1254 className="text-center"
1255 />
1256 </Form.Item>
1257 <Form.Item
1258 name="genre"
1259 label="类型"
1260 >
1261 <Select
1262 placeholder="请选择类型"
1263 value={genre}
1264 onChange={(value) => {
1265 setGenre(value);
1266 form.setFieldsValue({ genre: value });
1267 }}
1268 className="w-full"
1269 >
1270 <Option value="">请选择类型</Option>
1271 {genres.map((format) => (
1272 <Option key={format.value} value={format.value}>
1273 {format.label}
1274 </Option>
1275 ))}
1276 </Select>
1277 </Form.Item>
1278 <Form.Item
1279 name="codecFormat"
1280 label="编码格式"
1281 >
1282 <Select
1283 placeholder="请选择编码格式"
1284 value={codecFormat}
1285 onChange={(value) => {
1286 setCodecFormat(value);
1287 form.setFieldsValue({ codecFormat: value });
1288 }}
1289 className="w-full"
1290 >
1291 <Option value="">请选择编码格式</Option>
1292 {codecFormats.map((format) => (
1293 <Option key={format.value} value={format.value}>
1294 {format.label}
1295 </Option>
1296 ))}
1297 </Select>
1298 </Form.Item>
1299 <Form.Item
1300 name="resolution"
1301 label="分辨率"
1302 >
1303 <Select
1304 placeholder="请选择分辨率"
1305 value={resolution}
1306 onChange={(value) => {
1307 setResolution(value);
1308 form.setFieldsValue({ resolution: value });
1309 }}
1310 className="w-full"
1311 >
1312 <Option value="">请选择分辨率</Option>
1313 {resolutions.map((resolution) => (
1314 <Option key={resolution.value} value={resolution.value}>
1315 {resolution.label}
1316 </Option>
1317 ))}
1318 </Select>
1319 </Form.Item>
1320 </>
1321 )}
1322
1323 {/* 动态字段 - 剧集 */}
1324 {showTvFields && (
1325 <>
1326 <Form.Item
1327 name="region"
1328 label="地区"
1329 >
1330 <Select
1331 placeholder="请选择地区"
1332 value={region}
1333 onChange={(value) => {
1334 setRegion(value);
1335 form.setFieldsValue({ region: value });
1336 }}
1337 className="w-full"
1338 >
1339 <Option value="">请选择地区</Option>
1340 {regions.map((region) => (
1341 <Option key={region.value} value={region.value}>
1342 {region.label}
1343 </Option>
1344 ))}
1345 </Select>
1346 </Form.Item>
1347 <Form.Item
1348 name="format"
1349 label="格式"
1350 >
1351 <Select
1352 placeholder="请选择格式"
1353 value={format}
1354 onChange={(value) => {
1355 setFormat(value);
1356 form.setFieldsValue({ format: value });
1357 }}
1358 className="w-full"
1359 >
1360 <Option value="">请选择格式</Option>
1361 {resolutions.map((format) => (
1362 <Option key={format.value} value={format.value}>
1363 {format.label}
1364 </Option>
1365 ))}
1366 </Select>
1367 </Form.Item>
1368 <Form.Item
1369 name="genre"
1370 label="类型"
1371 >
1372 <Select
1373 placeholder="请选择类型"
1374 value={genre}
1375 onChange={(value) => {
1376 setGenre(value);
1377 form.setFieldsValue({ genre: value });
1378 }}
1379 className="w-full"
1380 >
1381 <Option value="">请选择类型</Option>
1382 {genres.map((genre) => (
1383 <Option key={genre.value} value={genre.value}>
1384 {genre.label}
1385 </Option>
1386 ))}
1387 </Select>
1388 </Form.Item>
1389 </>
1390 )}
1391
1392 {/* 动态字段 - 游戏 */}
1393 {showGameFields && (
1394 <>
1395 <Form.Item
1396 name="platform"
1397 label="平台"
1398 >
1399 <Select
1400 placeholder="请选择平台"
1401 value={platform}
1402 onChange={(value) => {
1403 setPlatform(value);
1404 form.setFieldsValue({ platform: value });
1405 }}
1406 className="w-full"
1407 >
1408 <Option value="">请选择平台</Option>
1409 {platforms.map((platform) => (
1410 <Option key={platform.value} value={platform.value}>
1411 {platform.label}
1412 </Option>
1413 ))}
1414 </Select>
1415 </Form.Item>
1416 <Form.Item
1417 name="genre"
1418 label="类型"
1419 >
1420 <Select
1421 placeholder="请选择类型"
1422 value={genre}
1423 onChange={(value) => {
1424 setGenre(value);
1425 form.setFieldsValue({ genre: value });
1426 }}
1427 className="w-full"
1428 >
1429 <Option value="">请选择类型</Option>
1430 {gamegenres.map((genre) => (
1431 <Option key={genre.value} value={genre.value}>
1432 {genre.label}
1433 </Option>
1434 ))}
1435 </Select>
1436 </Form.Item>
1437 <Form.Item
1438 name="language"
1439 label="语言"
1440 >
1441 <Select
1442 placeholder="请选择语言"
1443 value={language}
1444 onChange={(value) => {
1445 setLanguage(value);
1446 form.setFieldsValue({ language: value });
1447 }}
1448 className="w-full"
1449 >
1450 <Option value="">请选择语言</Option>
1451 {languages.map((language) => (
1452 <Option key={language.value} value={language.value}>
1453 {language.label}
1454 </Option>
1455 ))}
1456 </Select>
1457 </Form.Item>
1458 <Form.Item
1459 name="dataType"
1460 label="数据类型"
1461 >
1462 <Select
1463 placeholder="请选择数据类型"
1464 value={dataType}
1465 onChange={(value) => {
1466 setDataType(value);
1467 form.setFieldsValue({ dataType: value });
1468 }}
1469 className="w-full"
1470 >
1471 <Option value="">请选择数据类型</Option>
1472 {dataTypes.map((dataType) => (
1473 <Option key={dataType.value} value={dataType.value}>
1474 {dataType.label}
1475 </Option>
1476 ))}
1477 </Select>
1478 </Form.Item>
1479 </>
1480 )}
1481
1482 {/* 动态字段 - 综艺 */}
1483 {showvarietyFields && (
1484 <>
1485 <Form.Item
1486 name="isMainland"
1487 label="是否大陆综艺"
1488 valuePropName="checked"
1489 >
1490 <Switch
1491 checked={isMainland}
1492 onChange={(checked) => {
1493 setIsMainland(checked);
1494 form.setFieldsValue({ isMainland: checked });
1495 }}
1496 />
1497 </Form.Item>
1498 <Form.Item
1499 name="style"
1500 label="类型"
1501 >
1502 <Select
1503 placeholder="请选择类型"
1504 value={style}
1505 onChange={(value) => {
1506 setStyle(value);
1507 form.setFieldsValue({ style: value });
1508 }}
1509 className="w-full"
1510 >
1511 <Option value="">请选择类型</Option>
1512 {varietygenres.map((style) => (
1513 <Option key={style.value} value={style.value}>
1514 {style.label}
1515 </Option>
1516 ))}
1517 </Select>
1518 </Form.Item>
1519 <Form.Item
1520 name="format"
1521 label="格式"
1522 >
1523 <Select
1524 placeholder="请选择格式"
1525 value={format}
1526 onChange={(value) => {
1527 setFormat(value);
1528 form.setFieldsValue({ format: value });
1529 }}
1530 className="w-full"
1531 >
1532 <Option value="">请选择格式</Option>
1533 {resolutions.map((format) => (
1534 <Option key={format.value} value={format.value}>
1535 {format.label}
1536 </Option>
1537 ))}
1538 </Select>
1539 </Form.Item>
1540 </>
1541 )}
1542
1543 {/* 动态字段 - 动漫 */}
1544 {showAnimeFields && (
1545 <>
1546 <Form.Item
1547 name="genre"
1548 label="类型"
1549 >
1550 <Select
1551 placeholder="请选择类型"
1552 value={genre}
1553 onChange={(value) => {
1554 setGenre(value);
1555 form.setFieldsValue({ genre: value });
1556 }}
1557 className="w-full"
1558 >
1559 <Option value="">请选择类型</Option>
1560 {anigenres.map((genre) => (
1561 <Option key={genre.value} value={genre.value}>
1562 {genre.label}
1563 </Option>
1564 ))}
1565 </Select>
1566 </Form.Item>
1567 <Form.Item
1568 name="format"
1569 label="格式"
1570 >
1571 <Select
1572 placeholder="请选择格式"
1573 value={format}
1574 onChange={(value) => {
1575 setFormat(value);
1576 form.setFieldsValue({ format: value });
1577 }}
1578 className="w-full"
1579 >
1580 <Option value="">请选择格式</Option>
1581 {animeformats.map((format) => (
1582 <Option key={format.value} value={format.value}>
1583 {format.label}
1584 </Option>
1585 ))}
1586 </Select>
1587 </Form.Item>
1588 <Form.Item
1589 name="resolution"
1590 label="分辨率"
1591 >
1592 <Select
1593 placeholder="请选择分辨率"
1594 value={resolution}
1595 onChange={(value) => {
1596 setResolution(value);
1597 form.setFieldsValue({ resolution: value });
1598 }}
1599 className="w-full"
1600 >
1601 <Option value="">请选择分辨率</Option>
1602 {resolutions.map((resolution) => (
1603 <Option key={resolution.value} value={resolution.value}>
1604 {resolution.label}
1605 </Option>
1606 ))}
1607 </Select>
1608 </Form.Item>
1609 </>
1610 )}
1611
1612 {/* 动态字段 - 学习 */}
1613 {showlearningFields && (
1614 <>
1615 <Form.Item
1616 name="genre"
1617 label="类型"
1618 >
1619 <Select
1620 placeholder="请选择类型"
1621 value={genre}
1622 onChange={(value) => {
1623 setGenre(value);
1624 form.setFieldsValue({ genre: value });
1625 }}
1626 className="w-full"
1627 >
1628 <Option value="">请选择类型</Option>
1629 {learninggenres.map((genre) => (
1630 <Option key={genre.value} value={genre.value}>
1631 {genre.label}
1632 </Option>
1633 ))}
1634 </Select>
1635 </Form.Item>
1636 <Form.Item
1637 name="format"
1638 label="格式"
1639 >
1640 <Select
1641 placeholder="请选择格式"
1642 value={format}
1643 onChange={(value) => {
1644 setFormat(value);
1645 form.setFieldsValue({ format: value });
1646 }}
1647 className="w-full"
1648 >
1649 <Option value="">请选择格式</Option>
1650 {learningformats.map((format) => (
1651 <Option key={format.value} value={format.value}>
1652 {format.label}
1653 </Option>
1654 ))}
1655 </Select>
1656 </Form.Item>
1657 </>
1658 )}
1659
1660 {/* 动态字段 - 软件 */}
1661 {showsoftwareFields && (
1662 <>
1663 <Form.Item
1664 name="platform"
1665 label="平台"
1666 >
1667 <Select
1668 placeholder="请选择平台"
1669 value={platform}
1670 onChange={(value) => {
1671 setPlatform(value);
1672 form.setFieldsValue({ platform: value });
1673 }}
1674 className="w-full"
1675 >
1676 <Option value="">请选择平台</Option>
1677 {softwareplatforms.map((platform) => (
1678 <Option key={platform.value} value={platform.value}>
1679 {platform.label}
1680 </Option>
1681 ))}
1682 </Select>
1683 </Form.Item>
1684 <Form.Item
1685 name="genre"
1686 label="类型"
1687 >
1688 <Select
1689 placeholder="请选择类型"
1690 value={genre}
1691 onChange={(value) => {
1692 setGenre(value);
1693 form.setFieldsValue({ genre: value });
1694 }}
1695 className="w-full"
1696 >
1697 <Option value="">请选择类型</Option>
1698 {softwaregenres.map((genre) => (
1699 <Option key={genre.value} value={genre.value}>
1700 {genre.label}
1701 </Option>
1702 ))}
1703 </Select>
1704 </Form.Item>
1705 <Form.Item
1706 name="format"
1707 label="格式"
1708 >
1709 <Select
1710 placeholder="请选择格式"
1711 value={format}
1712 onChange={(value) => {
1713 setFormat(value);
1714 form.setFieldsValue({ format: value });
1715 }}
1716 className="w-full"
1717 >
1718 <Option value="">请选择格式</Option>
1719 {softwareformats.map((format) => (
1720 <Option key={format.value} value={format.value}>
1721 {format.label}
1722 </Option>
1723 ))}
1724 </Select>
1725 </Form.Item>
1726 </>
1727 )}
1728
1729 {/* 动态字段 - 体育 */}
1730 {showsportsFields && (
1731 <>
1732 <Form.Item
1733 name="genre"
1734 label="类型"
1735 >
1736 <Select
1737 placeholder="请选择类型"
1738 value={genre}
1739 onChange={(value) => {
1740 setGenre(value);
1741 form.setFieldsValue({ genre: value });
1742 }}
1743 className="w-full"
1744 >
1745 <Option value="">请选择类型</Option>
1746 {sportsgenres.map((genre) => (
1747 <Option key={genre.value} value={genre.value}>
1748 {genre.label}
1749 </Option>
1750 ))}
1751 </Select>
1752 </Form.Item>
1753 <Form.Item
1754 name="format"
1755 label="格式"
1756 >
1757 <Select
1758 placeholder="请选择格式"
1759 value={format}
1760 onChange={(value) => {
1761 setFormat(value);
1762 form.setFieldsValue({ format: value });
1763 }}
1764 className="w-full"
1765 >
1766 <Option value="">请选择格式</Option>
1767 {resolutions.map((format) => (
1768 <Option key={format.value} value={format.value}>
1769 {format.label}
1770 </Option>
1771 ))}
1772 </Select>
1773 </Form.Item>
1774 <Form.Item
1775 name="eventType"
1776 label="赛事类型"
1777 >
1778 <Select
1779 placeholder="请选择赛事类型"
1780 value={eventType}
1781 onChange={(value) => {
1782 setEventType(value);
1783 form.setFieldsValue({ eventType: value });
1784 }}
1785 className="w-full"
1786 >
1787 <Option value="">请选择赛事类型</Option>
1788 {eventTypes.map((eventType) => (
1789 <Option key={eventType.value} value={eventType.value}>
1790 {eventType.label}
1791 </Option>
1792 ))}
1793 </Select>
1794 </Form.Item>
1795 </>
1796 )}
1797
1798 {/* 动态字段 - 纪录片 */}
1799 {showdocFields && (
1800 <>
1801 <Form.Item
1802 name="year"
1803 label="年份"
1804 >
1805 <Input
1806 placeholder="如 1999, 2020"
1807 value={year}
1808 onChange={(e) => {
1809 setYear(e.target.value);
1810 form.setFieldsValue({ year: e.target.value });
1811 }}
1812 className="w-full"
1813 />
1814 </Form.Item>
1815 <Form.Item
1816 name="source"
1817 label="视频源"
1818 >
1819 <Select
1820 placeholder="请选择视频源"
1821 value={source}
1822 onChange={(value) => {
1823 setSource(value);
1824 form.setFieldsValue({ source: value });
1825 }}
1826 className="w-full"
1827 >
1828 <Option value="">请选择视频源</Option>
1829 {sourceTypes.map((source) => (
1830 <Option key={source.value} value={source.value}>
1831 {source.label}
1832 </Option>
1833 ))}
1834 </Select>
1835 </Form.Item>
1836 <Form.Item
1837 name="format"
1838 label="格式"
1839 >
1840 <Select
1841 placeholder="请选择格式"
1842 value={format}
1843 onChange={(value) => {
1844 setFormat(value);
1845 form.setFieldsValue({ format: value });
1846 }}
1847 className="w-full"
1848 >
1849 <Option value="">请选择格式</Option>
1850 {resolutions.map((format) => (
1851 <Option key={format.value} value={format.value}>
1852 {format.label}
1853 </Option>
1854 ))}
1855 </Select>
1856 </Form.Item>
1857 </>
1858 )}
1859
1860 {/* 动态字段 - 音乐 */}
1861 {showMusicFields && (
1862 <>
1863 <Form.Item
1864 name="genre"
1865 label="类型"
1866 >
1867 <Select
1868 placeholder="请选择类型"
1869 value={genre}
1870 onChange={(value) => {
1871 setGenre(value);
1872 form.setFieldsValue({ genre: value });
1873 }}
1874 className="w-full"
1875 >
1876 <Option value="">请选择类型</Option>
1877 {musicgenres.map((genre) => (
1878 <Option key={genre.value} value={genre.value}>
1879 {genre.label}
1880 </Option>
1881 ))}
1882 </Select>
1883 </Form.Item>
1884 <Form.Item
1885 name="region"
1886 label="地区"
1887 >
1888 <Select
1889 placeholder="请选择地区"
1890 value={region}
1891 onChange={(value) => {
1892 setRegion(value);
1893 form.setFieldsValue({ region: value });
1894 }}
1895 className="w-full"
1896 >
1897 <Option value="">请选择地区</Option>
1898 {regions.map((region) => (
1899 <Option key={region.value} value={region.value}>
1900 {region.label}
1901 </Option>
1902 ))}
1903 </Select>
1904 </Form.Item>
1905 <Form.Item
1906 name="style"
1907 label="风格"
1908 >
1909 <Select
1910 placeholder="请选择风格"
1911 value={style}
1912 onChange={(value) => {
1913 setStyle(value);
1914 form.setFieldsValue({ style: value });
1915 }}
1916 className="w-full"
1917 >
1918 <Option value="">请选择风格</Option>
1919 {musicstyles.map((style) => (
1920 <Option key={style.value} value={style.value}>
1921 {style.label}
1922 </Option>
1923 ))}
1924 </Select>
1925 </Form.Item>
1926 <Form.Item
1927 name="format"
1928 label="格式"
1929 >
1930 <Select
1931 placeholder="请选择格式"
1932 value={format}
1933 onChange={(value) => {
1934 setFormat(value);
1935 form.setFieldsValue({ format: value });
1936 }}
1937 className="w-full"
1938 >
1939 <Option value="">请选择格式</Option>
1940 {musicformats.map((format) => (
1941 <Option key={format.value} value={format.value}>
1942 {format.label}
1943 </Option>
1944 ))}
1945 </Select>
1946 </Form.Item>
1947 </>
1948 )}
1949
1950 {/* 动态字段 - 其他 */}
1951 {showotherFields && (
1952 <>
1953 <Form.Item
1954 name="genre"
1955 label="类型"
1956 >
1957 <Select
1958 placeholder="请选择类型"
1959 value={genre}
1960 onChange={(value) => {
1961 setGenre(value);
1962 form.setFieldsValue({ genre: value });
1963 }}
1964 className="w-full"
1965 >
1966 <Option value="">请选择类型</Option>
1967 {othergenres.map((genre) => (
1968 <Option key={genre.value} value={genre.value}>
1969 {genre.label}
1970 </Option>
1971 ))}
1972 </Select>
1973 </Form.Item>
1974 </>
1975 )}
1976 {/* 提交按钮 */}
1977 <Form.Item>
1978 <Button
1979 type="primary"
1980 htmlType="submit"
1981 className="submitButton"
1982 onMouseOver={(e) => e.target.style.backgroundColor = '#ff7f00'}
1983 onMouseOut={(e) => e.target.style.backgroundColor = '#ff8c00'}
1984 >
1985 上传种子
1986 </Button>
1987 </Form.Item>
1988
1989 {showSuccess && (
1990 <div className="successMessage">
1991 上传成功!
1992 </div>
1993 )}
1994 </Form>
1995 </div>
1996 </div>
1997 </div>
1998 );
1999}
2000
2001export default UploadTorrent;
2002