blob: c2cdc76d10acceca107433668dd7ac4f46fe0026 [file] [log] [blame]
刘嘉昕9cdeca22025-06-03 16:54:30 +08001// // import React, { useState, useEffect } from 'react';
2// // import axios from 'axios';
3
4// // function UploadTorrent() {
5// // const [title, setTitle] = useState('');
6// // const [description, setDescription] = useState('');
7// // const [categoryId, setCategoryId] = useState('');
8// // const [dpi, setDpi] = useState(''); // 可选字段
9// // const [caption, setCaption] = useState(''); // 可选字段
10// // const [file, setFile] = useState(null);
11// // const [categories, setCategories] = useState([]);
12// // const [showSuccess, setShowSuccess] = useState(false);
13
14// // useEffect(() => {
15// // axios.get('http://localhost:8080/categories')
16// // .then(res => setCategories(res.data))
17// // .catch(err => console.error('加载分类失败', err));
18// // }, []);
19
20// // const handleSubmit = async (e) => {
21// // e.preventDefault();
22// // if (!file) {
23// // alert('请选择一个 .torrent 文件');
24// // return;
25// // }
26
27// // if (!categoryId) {
28// // alert('请选择分类');
29// // return;
30// // }
31
32// // const formData = new FormData();
33// // formData.append('file', file);
34// // formData.append('title', title);
35// // formData.append('description', description);
36// // formData.append('categoryId', categoryId);
37// // if (dpi) formData.append('dpi', dpi); // 只有当 dpi 有值时才添加
38// // if (caption) formData.append('caption', caption); // 只有当 caption 有值时才添加
39
40// // try {
41// // await axios.post('http://localhost:8080/torrent/upload', formData, {
42// // headers: { 'Content-Type': 'multipart/form-data' },
43// // responseType: 'blob', // 关键:指定响应类型为 blob
44// // });
45
46// // // 创建下载链接
47// // const url = window.URL.createObjectURL(new Blob([response.data]));
48// // const link = document.createElement('a');
49// // link.href = url;
50// // link.setAttribute('download', file.name); // 使用原文件名
51// // document.body.appendChild(link);
52// // link.click();
53// // link.remove();
54// // // 清空表单
55// // setShowSuccess(true);
56// // setTitle('');
57// // setDescription('');
58// // setCategoryId('');
59// // setDpi('');
60// // setCaption('');
61// // setFile(null);
62// // } catch (err) {
63// // console.error('上传失败', err.response?.data || err.message);
64// // alert(err.response?.data || '上传失败,请检查后端是否启动');
65// // }
66// // };
67
68// // return (
69// // <div className="max-w-xl mx-auto mt-10 p-6 bg-white shadow rounded">
70// // <h2 className="text-2xl font-bold mb-4">上传种子</h2>
71// // <form onSubmit={handleSubmit} className="space-y-4">
72// // <input type="file" accept=".torrent" onChange={(e) => setFile(e.target.files[0])} />
73// // <input
74// // type="text"
75// // placeholder="标题"
76// // value={title}
77// // onChange={(e) => setTitle(e.target.value)}
78// // className="w-full p-2 border rounded"
79// // required
80// // />
81// // <textarea
82// // placeholder="描述"
83// // value={description}
84// // onChange={(e) => setDescription(e.target.value)}
85// // className="w-full p-2 border rounded"
86// // />
87// // <select
88// // value={categoryId}
89// // onChange={(e) => setCategoryId(e.target.value)}
90// // className="w-full p-2 border rounded"
91// // required
92// // >
93// // <option value="">请选择分类</option>
94// // {categories.map(cat => (
95// // <option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</option>
96// // ))}
97// // </select>
98// // <input
99// // type="text"
100// // placeholder="DPI(可选)"
101// // value={dpi}
102// // onChange={(e) => setDpi(e.target.value)}
103// // className="w-full p-2 border rounded"
104// // />
105// // <input
106// // type="text"
107// // placeholder="字幕(可选)"
108// // value={caption}
109// // onChange={(e) => setCaption(e.target.value)}
110// // className="w-full p-2 border rounded"
111// // />
112// // <button type="submit" className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
113// // 上传
114// // </button>
115// // </form>
116
117// // {showSuccess && (
118// // <div className="mt-4 p-3 bg-green-100 text-green-800 border border-green-300 rounded">
119// // 上传成功!
120// // </div>
121// // )}
122// // </div>
123// // );
124// // }
125
126// // export default UploadTorrent;
127// import React, { useState, useEffect } from 'react';;
128// import axios from 'axios';
129
130// function UploadTorrent() {
131// const [title, setTitle] = useState('');
132// const [description, setDescription] = useState('');
133// const [categoryId, setCategoryId] = useState('');
134// const [dpi, setDpi] = useState('');
135// const [caption, setCaption] = useState('');
136// const [file, setFile] = useState(null);
137// const [categories, setCategories] = useState([]);
138// const [showSuccess, setShowSuccess] = useState(false);
139
140// useEffect(() => {
141// axios.get('http://localhost:8080/categories')
142// .then(res => setCategories(res.data))
143// .catch(err => console.error('加载分类失败', err));
144// }, []);
145
146// const handleSubmit = async (e) => {
147// e.preventDefault();
148// if (!file) {
149// alert('请选择一个 .torrent 文件');
150// return;
151// }
152
153// if (!categoryId) {
154// alert('请选择分类');
155// return;
156// }
157
158// const formData = new FormData();
159// formData.append('file', file);
160// formData.append('title', title);
161// formData.append('description', description);
162// formData.append('categoryId', categoryId);
163// if (dpi) formData.append('dpi', dpi);
164// if (caption) formData.append('caption', caption);
165
166// try {
167// // 发送上传请求
168// const response = await axios.post('http://localhost:8080/torrent/upload', formData, {
169// headers: { 'Content-Type': 'multipart/form-data' },
170// responseType: 'blob', // 关键:指定响应类型为 blob
171// });
172
173// // 创建下载链接
174// const url = window.URL.createObjectURL(new Blob([response.data]));
175// const link = document.createElement('a');
176// link.href = url;
177// link.setAttribute('download', file.name); // 使用原文件名
178// document.body.appendChild(link);
179// link.click();
180// link.remove();
181
182// // 显示成功提示
183// setShowSuccess(true);
184// setTitle('');
185// setDescription('');
186// setCategoryId('');
187// setDpi('');
188// setCaption('');
189// setFile(null);
190// } catch (err) {
191// console.error('上传失败', err.response?.data || err.message);
192// alert(err.response?.data || '上传失败,请检查后端是否启动');
193// }
194// };
195
196// return (
197// <div className="max-w-xl mx-auto mt-10 p-6 bg-white shadow rounded">
198// <h2 className="text-2xl font-bold mb-4">上传种子</h2>
199// <form onSubmit={handleSubmit} className="space-y-4">
200// <input type="file" accept=".torrent" onChange={(e) => setFile(e.target.files[0])} />
201// <input
202// type="text"
203// placeholder="标题"
204// value={title}
205// onChange={(e) => setTitle(e.target.value)}
206// className="w-full p-2 border rounded"
207// required
208// />
209// <textarea
210// placeholder="描述"
211// value={description}
212// onChange={(e) => setDescription(e.target.value)}
213// className="w-full p-2 border rounded"
214// />
215// <select
216// value={categoryId}
217// onChange={(e) => setCategoryId(e.target.value)}
218// className="w-full p-2 border rounded"
219// required
220// >
221// <option value="">请选择分类</option>
222// {categories.map(cat => (
223// <option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</option>
224// ))}
225// </select>
226// <input
227// type="text"
228// placeholder="DPI(可选)"
229// value={dpi}
230// onChange={(e) => setDpi(e.target.value)}
231// className="w-full p-2 border rounded"
232// />
233// <input
234// type="text"
235// placeholder="字幕/说明(可选)"
236// value={caption}
237// onChange={(e) => setCaption(e.target.value)}
238// className="w-full p-2 border rounded"
239// />
240// <button type="submit" className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
241// 上传
242// </button>
243// </form>
244
245// {showSuccess && (
246// <div className="mt-4 p-3 bg-green-100 text-green-800 border border-green-300 rounded">
247// 上传成功!
248// </div>
249// )}
250// </div>
251// );
252// }
253
254// export default UploadTorrent;
255import React, { useState, useEffect } from 'react';
256import axios from 'axios';
257
258function UploadTorrent() {
259 const [title, setTitle] = useState('');
260 const [description, setDescription] = useState('');
261 const [categoryId, setCategoryId] = useState('');
262 const [file, setFile] = useState(null);
263 const [categories, setCategories] = useState([]);
264 const [showSuccess, setShowSuccess] = useState(false);
265
266 // 通用参数
267 const [dpi, setDpi] = useState('');
268 const [caption, setCaption] = useState('');
269 const [region, setRegion] = useState('');
270 const [year, setYear] = useState('');
271 const [genre, setGenre] = useState('');
272 const [format, setFormat] = useState('');
273 const [resolution, setResolution] = useState('');
274
275 // 特殊参数
276 const [codecFormat, setCodecFormat] = useState('');
277 const [platform, setPlatform] = useState('');
278 const [language, setLanguage] = useState('');
279 const [eventType, setEventType] = useState('');
280 const [source, setSource] = useState('');
281 const [style, setStyle] = useState('');
282 const [dataType, setdataType] = useState('');
283 const [isMainland, setIsMainland] = useState(false);
284
285 // 根据分类显示不同的表单字段
286 const [showMovieFields, setShowMovieFields] = useState(false);
287 const [showMusicFields, setShowMusicFields] = useState(false);
288 const [showGameFields, setShowGameFields] = useState(false);
289 const [showTvFields, setShowTvFields] = useState(false);
290 const [showAnimeFields, setShowAnimeFields] = useState(false);
291 const [showlearningFields, setShowlearningFields] = useState(false);
292 const [showsoftwareFields, setShowsoftwareFields] = useState(false);
293 const [showvarietyFields, setShowvarietyFields] = useState(false);
294 const [showsportsFields, setShowsportsFields] = useState(false);
295 const [showdocFields, setShowdocFields] = useState(false);
296 const [showotherFields, setShowotherFields] = useState(false);
297 // 其他分类字段...
298 // 编码格式选项
299 const codecFormats = [
300 { value: 'H.264', label: 'H.264' },
301 { value: 'H.265', label: 'H.265' },
302 { value: 'AV1', label: 'AV1' },
303 { value: 'VP9', label: 'VP9' },
304 { value: 'VC1', label: 'VC1' },
305 { value: 'X264', label: 'X264' },
306 ];
307 const regions = [
308 { value: '大陆', label: '大陆' },
309 { value: '港台', label: '港台' },
310 { value: '欧美', label: '欧美' },
311 { value: '日韩', label: '日韩' },
312 { value: '其他', label: '其他' },
313 ];
314 const genres = [
315 { value: '动作', label: '动作' },
316 { value: '喜剧', label: '喜剧' },
317 { value: '爱情', label: '爱情' },
318 { value: '科幻', label: '科幻' },
319 { value: '恐怖', label: '恐怖' },
320 { value: '动作', label: '动作' },
321 { value: '冒险', label: '冒险' },
322 { value: '历史', label: '历史' },
323 { value: '悬疑', label: '悬疑' },
324 { value: '其他', label: '其他' },
325 ];
326 const resolutions = [
327 { value: '720p', label: '720p' },
328 { value: '1080p', label: '1080p' },
329 { value: '2K', label: '2K' },
330 { value: '4K', label: '4K' },
331 { value: '8K', label: '8K' },
332 { value: '其他', label: '其他' },
333 ];
334
335
336 const eventTypes = [
337 { value: '足球', label: '足球' },
338 { value: '篮球', label: '篮球' },
339 { value: '网球', label: '网球' },
340 { value: '乒乓球', label: '乒乓球' },
341 { value: '羽毛球', label: '羽毛球' },
342 ]
343 const styles = [
344 { value: '大陆综艺', label: '大陆综艺' },
345 { value: '日韩综艺', label: '日韩综艺' },
346 { value: '欧美综艺', label: '欧美综艺' },
347 { value: '其他', label: '其他' },
348 ]
349 const platforms = [
350 { value: 'PC', label: 'PC' },
351 { value: 'PS5', label: 'PS5' },
352 { value: 'Xbox', label: 'Xbox' },
353 { value: 'Switch', label: 'Switch' },
354 { value: '手机', label: '手机' },
355 { value: '其他', label: '其他' },
356 ]
357 const gamegenres = [
358 { value: '角色扮演', label: '角色扮演' },
359 { value: '射击', label: '射击' },
360 { value: '冒险', label: '冒险' },
361 { value: '策略', label: '策略' },
362 { value: '体育', label: '体育' },
363 { value: '桌面游戏', label: '桌面游戏'},
364 { value: '其他', label: '其他' },
365 ]
366 const dataTypes = [
367 { value: '压缩包', label: '压缩包' },
368 { value: '补丁', label: '补丁' },
369 { value: '安装包', label: '安装包' },
370 { value: 'nds', label: 'nds' },
371 { value: '其他', label: '其他' },
372 ]
373 const languages = [
374 { value: '中文', label: '中文' },
375 { value: '英文', label: '英文' },
376 { value: '日文', label: '日文' },
377 { value: '其他', label: '其他' },
378 ]
379 const musicgenres = [
380 { value: '专辑', label: '专辑' },
381 { value: '单曲', label: '单曲' },
382 { value: 'EP', label: 'EP' },
383 { value: '现场', label: '现场' },
384 { value: '其他', label: '其他' },
385 ]
386 const musicstyles = [
387 { value: '流行', label: '流行' },
388 { value: '摇滚', label: '摇滚' },
389 { value: '电子', label: '电子' },
390 { value: '古典', label: '古典' },
391 { value: '爵士', label: '爵士' },
392 { value: '民谣', label: '民谣' },
393 { value: '说唱', label: '说唱' },
394 { value: '其他', label: '其他' },
395 ]
396 const musicformats = [
397 { value: 'MP3', label: 'MP3' },
398 { value: 'FLAC', label: 'FLAC' },
399 { value: 'WAV', label: 'WAV' },
400 { value: 'AAC', label: 'AAC' },
401 { value: 'OGG', label: 'OGG' },
402 { value: '其他', label: '其他' },
403 ]
404 const anigenres = [
405 { value: '新番连载', label: '新番连载' },
406 { value: '剧场版', label: '剧场版' },
407 { value: 'OVA', label: 'OVA' },
408 { value: '完结动漫', label: '完结动漫' },
409 { value: '其他', label: '其他' },
410 ]
411 const animeformats = [
412 { value: 'ZIP', label: 'ZIP' },
413 { value: 'RAR', label: 'RAR' },
414 { value: '7Z', label: '7Z' },
415 { value: 'MKV', label: 'MKV' },
416 { value: 'MP4', label: 'MP4' },
417 { value: '其他', label: '其他' },
418 ]
419 const varietygenres = [
420 { value: '真人秀', label: '真人秀' },
421 { value: '选秀', label: '选秀' },
422 { value: '访谈', label: '访谈' },
423 { value: '游戏', label: '游戏' },
424 { value: '音乐', label: '音乐' },
425 { value: '其他', label: '其他' },
426 ]
427 const sportsgenres = [
428 { value: '足球', label: '足球' },
429 { value: '篮球', label: '篮球' },
430 { value: '网球', label: '网球' },
431 { value: '乒乓球', label: '乒乓球' },
432 { value: '羽毛球', label: '羽毛球' },
433 { value: '其他', label: '其他' },
434 ]
435 const softwaregenres = [
436 { value: '系统软件', label: '系统软件' },
437 { value: '应用软件', label: '应用软件' },
438 { value: '游戏软件', label: '游戏软件' },
439 { value: '驱动程序', label: '驱动程序' },
440 { value: '办公软件', label: '办公软件' },
441 { value: '其他', label: '其他' },
442 ]
443 const softwareplatforms = [
444 { value: 'Windows', label: 'Windows' },
445 { value: 'Mac', label: 'Mac' },
446 { value: 'Linux', label: 'Linux' },
447 { value: 'Android', label: 'Android' },
448 { value: 'iOS', label: 'iOS' },
449 { value: '其他', label: '其他' },
450 ]
451 const softwareformats = [
452 { value: 'EXE', label: 'EXE' },
453 { value: 'DMG', label: 'DMG' },
454 { value: '光盘镜像', label: '光盘镜像' },
455 { value: 'APK', label: 'APK' },
456 { value: 'IPA', label: 'IPA' },
457 { value: '其他', label: '其他' },
458 ]
459 const learninggenres = [
460 { value: '计算机', label: '计算机' },
461 { value: '软件', label: '软件' },
462 { value: '人文', label: '人文' },
463 { value: '外语', label: '外语' },
464 { value: '理工类', label: '理工类' },
465 { value: '其他', label: '其他' },
466 ]
467 const learningformats = [
468 { value: 'PDF', label: 'PDF' },
469 { value: 'EPUB', label: 'EPUB' },
470 { value: '视频', label: '视频' },
471 { value: '音频', label: '音频' },
472 { value: 'PPT', label: 'PPT' },
473 { value: '其他', label: '其他' },
474 ]
475 const sourceTypes = [
476 { value: 'CCTV', label: 'CCTV' },
477 { value: '卫视', label: '卫视' },
478 { value: '国家地理', label: '国家地理' },
479 { value: 'BBC', label: 'BBC' },
480 { value: 'Discovery', label: 'Discovery' },
481 { value: '其他', label: '其他' },
482 ]
483 const othergenres = [
484 { value: '电子书', label: '电子书' },
485 { value: '视频', label: '视频' },
486 { value: 'MP3', label: 'MP3' },
487 { value: '图片', label: '图片' },
488 { value: '其他', label: '其他' },
489 ]
490 useEffect(() => {
491 axios.get('http://localhost:8080/categories')
492 .then(res => setCategories(res.data))
493 .catch(err => console.error('加载分类失败', err));
494 }, []);
495
496 // 根据选择的分类显示不同的表单字段
497 useEffect(() => {
498 setShowMovieFields(categoryId === '1');
499 setShowMusicFields(categoryId === '3');
500 setShowGameFields(categoryId === '5');
501 setShowTvFields(categoryId === '2');
502 setShowAnimeFields(categoryId === '4');
503 setShowlearningFields(categoryId === '9');
504 setShowsoftwareFields(categoryId === '8');
505 setShowvarietyFields(categoryId === '6');
506 setShowsportsFields(categoryId === '7');
507 setShowdocFields(categoryId === '10');
508 setShowotherFields(categoryId === '11');
509 // 其他分类...
510 }, [categoryId]);
511
512 const handleSubmit = async (e) => {
513 e.preventDefault();
514 if (!file) {
515 alert('请选择一个 .torrent 文件');
516 return;
517 }
518
519 if (!categoryId) {
520 alert('请选择分类');
521 return;
522 }
523
524 const formData = new FormData();
525 formData.append('file', file);
526 formData.append('title', title);
527 formData.append('description', description);
528 formData.append('categoryId', categoryId);
529
530 // 通用参数
531 if (dpi) formData.append('dpi', dpi);
532 if (caption) formData.append('caption', caption);
533 if (region) formData.append('region', region);
534 if (year) formData.append('year', year);
535 if (genre) formData.append('genre', genre);
536 if (format) formData.append('format', format);
537 if (resolution) formData.append('resolution', resolution);
538
539 // 特殊参数
540 if (codecFormat) formData.append('codecFormat', codecFormat);
541 if (platform) formData.append('platform', platform);
542 if (language) formData.append('language', language);
543 if (eventType) formData.append('eventType', eventType);
544 if (source) formData.append('source', source);
545 if (style) formData.append('style', style);
546 if (dataType) formData.append('dataType', dataType);
547 formData.append('isMainland', isMainland.toString());
548
549 try {
550 const response = await axios.post('http://localhost:8080/torrent/upload', formData, {
551 headers: { 'Content-Type': 'multipart/form-data' },
552 responseType: 'blob',
553 });
554
555 // 创建下载链接
556 const url = window.URL.createObjectURL(new Blob([response.data]));
557 const link = document.createElement('a');
558 link.href = url;
559 link.setAttribute('download', file.name);
560 document.body.appendChild(link);
561 link.click();
562 link.remove();
563
564 // 显示成功提示
565 setShowSuccess(true);
566 // 清空表单
567 setTitle('');
568 setDescription('');
569 setCategoryId('');
570 setFile(null);
571 // 清空其他字段...
572 } catch (err) {
573 console.error('上传失败', err.response?.data || err.message);
574 alert(err.response?.data || '上传失败,请检查后端是否启动');
575 }
576 };
577
578 return (
579 <div className="max-w-xl mx-auto mt-10 p-6 bg-white shadow rounded">
580 <h2 className="text-2xl font-bold mb-4">上传种子</h2>
581 <form onSubmit={handleSubmit} className="space-y-4">
582 <div>
583 <label className="block mb-1">种子文件 (.torrent)</label>
584 <input
585 type="file"
586 accept=".torrent"
587 onChange={(e) => setFile(e.target.files[0])}
588 className="w-full p-2 border rounded"
589 required
590 />
591 </div>
592
593 <div>
594 <label className="block mb-1">标题</label>
595 <input
596 type="text"
597 placeholder="标题"
598 value={title}
599 onChange={(e) => setTitle(e.target.value)}
600 className="w-full p-2 border rounded"
601 required
602 />
603 </div>
604
605 <div>
606 <label className="block mb-1">描述</label>
607 <textarea
608 placeholder="描述"
609 value={description}
610 onChange={(e) => setDescription(e.target.value)}
611 className="w-full p-2 border rounded"
612 />
613 </div>
614
615 <div>
616 <label className="block mb-1">分类</label>
617 <select
618 value={categoryId}
619 onChange={(e) => setCategoryId(e.target.value)}
620 className="w-full p-2 border rounded"
621 required
622 >
623 <option value="">请选择分类</option>
624 {categories.map(cat => (
625 <option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</option>
626 ))}
627 </select>
628 </div>
629
630 {/* <div>
631 <label className="block mb-1">DPI(可选)</label>
632 <input
633 type="text"
634 placeholder="DPI"
635 value={dpi}
636 onChange={(e) => setDpi(e.target.value)}
637 className="w-full p-2 border rounded"
638 />
639 </div>
640
641 <div>
642 <label className="block mb-1">字幕/说明(可选)</label>
643 <input
644 type="text"
645 placeholder="字幕/说明"
646 value={caption}
647 onChange={(e) => setCaption(e.target.value)}
648 className="w-full p-2 border rounded"
649 />
650 </div> */}
651
652 {/* 电影相关字段 */}
653 {showMovieFields && (
654 <>
655 <div>
656 <label className="block mb-1">字幕/说明</label>
657 <input
658 type="text"
659 placeholder="字幕/说明"
660 value={caption}
661 onChange={(e) => setCaption(e.target.value)}
662 className="w-full p-2 border rounded"
663 />
664 </div>
665 <div>
666 <label className="block mb-1">地区</label>
667 <select
668 value={region}
669 onChange={(e) => setRegion(e.target.value)}
670 className="w-full p-2 border rounded"
671 >
672 <option value="">请选择地区</option>
673 {regions.map((regions) => (
674 <option key={regions.value} value={regions.value}>
675 {regions.label}
676 </option>
677 ))}
678 </select>
679 </div>
680 {/* <input
681 type="text"
682 placeholder="region"
683 value={region}
684 onChange={(e) => setRegion(e.target.value)}
685 className="w-full p-2 border rounded"
686 />
687 </div> */}
688
689 <div>
690 <label className="block mb-1">年份</label>
691 <input
692 type="text"
693 placeholder="年份"
694 value={year}
695 onChange={(e) => setYear(e.target.value)}
696 className="w-full p-2 border rounded"
697 />
698 </div>
699 <div>
700 <label className="block mb-1">类型</label>
701 {/* <input
702 type="text"
703 placeholder="类型"
704 value={genre}
705 onChange={(e) => setGenre(e.target.value)}
706 className="w-full p-2 border rounded"
707 /> */}
708 <select
709 value={genre}
710 onChange={(e) => setGenre(e.target.value)}
711 className="w-full p-2 border rounded"
712 >
713 <option value="">请选择类型</option>
714 {genres.map((format) => (
715 <option key={format.value} value={format.value}>
716 {format.label}
717 </option>
718 ))}
719 </select>
720 </div>
721 {/* <div>
722 <label className="block mb-1">编码格式</label>
723 <input
724 type="text"
725 placeholder="如 H.264, H.265"
726 value={codecFormat}
727 onChange={(e) => setCodecFormat(e.target.value)}
728 className="w-full p-2 border rounded"
729 />
730 </div> */}
731 <div>
732 <label className="block mb-1">编码格式</label>
733 <select
734 value={codecFormat}
735 onChange={(e) => setCodecFormat(e.target.value)}
736 className="w-full p-2 border rounded"
737 >
738 <option value="">请选择编码格式</option>
739 {codecFormats.map((format) => (
740 <option key={format.value} value={format.value}>
741 {format.label}
742 </option>
743 ))}
744 </select>
745 </div>
746 <div>
747 <label className="block mb-1">分辨率</label>
748 <select
749 value={resolution}
750 onChange={(e) => setResolution(e.target.value)}
751 className="w-full p-2 border rounded"
752 >
753 <option value="">请选择分辨率</option>
754 {resolutions.map((resolution) => (
755 <option key={resolution.value} value={resolution.value}>
756 {resolution.label}
757 </option>
758 ))}
759 </select>
760{/*
761 <input
762 type="text"
763 placeholder="如 1080p, 4K"
764 value={resolution}
765 onChange={(e) => setResolution(e.target.value)}
766 className="w-full p-2 border rounded"
767 /> */}
768 </div>
769 </>
770 )}
771 {/*剧集相关字段 */}
772 {showTvFields && (
773 <>
774 <div>
775 <label className="block mb-1">地区</label>
776 <select
777 value={region}
778 onChange={(e) => setRegion(e.target.value)}
779 className="w-full p-2 border rounded"
780 >
781 <option value="">请选择地区</option>
782 {regions.map((regions) => (
783 <option key={regions.value} value={regions.value}>
784 {regions.label}
785 </option>
786 ))}
787 </select>
788 {/* <input
789 type="text"
790 placeholder="如 中国, 美国"
791 value={region}
792 onChange={(e) => setRegion(e.target.value)}
793 className="w-full p-2 border rounded"
794 /> */}
795 </div>
796 <div>
797 <label className="block mb-1">格式</label>
798 <select
799 value={format}
800 onChange={(e) => setFormat(e.target.value)}
801 className="w-full p-2 border rounded"
802 >
803 <option value="">请选择格式</option>
804 {resolutions.map((format) => (
805 <option key={format.value} value={format.value}>
806 {format.label}
807 </option>
808 ))}
809 </select>
810{/* <input
811 type="text"
812 placeholder="如1080P, 4K"
813 value={format}
814 onChange={(e) => setFormat(e.target.value)}
815 className="w-full p-2 border rounded"
816 /> */}
817 </div>
818 <div>
819 <label className="block mb-1">类型</label>
820 <select
821 value={genre}
822 onChange={(e) => setGenre(e.target.value)}
823 className="w-full p-2 border rounded"
824 >
825 <option value="">请选择类型</option>
826 {genres.map((genre) => (
827 <option key={genre.value} value={genre.value}>
828 {genre.label}
829 </option>
830 ))}
831 </select>
832{/* <input
833 type="text"
834 placeholder="类型"
835 value={genre}
836 onChange={(e) => setGenre(e.target.value)}
837 className="w-full p-2 border rounded"
838 /> */}
839 </div>
840 </>
841 )}
842
843 {/* 游戏相关字段 */}
844 {showGameFields && (
845 <>
846 <div>
847 <label className="block mb-1">平台</label>
848 <select
849 value={platform}
850 onChange={(e) => setPlatform(e.target.value)}
851 className="w-full p-2 border rounded"
852 >
853 <option value="">请选择平台</option>
854 {platforms.map((platform) => (
855 <option key={platform.value} value={platform.value}>
856 {platform.label}
857 </option>
858 ))}
859 </select>
860 {/* <input
861 <input
862 type="text"
863 placeholder="如 PC, PS5"
864 value={platform}
865 onChange={(e) => setPlatform(e.target.value)}
866 className="w-full p-2 border rounded"
867 />*/}
868 </div>
869 <div>
870 <label className="block mb-1">类型</label>
871 <select
872 value={genre}
873 onChange={(e) => setGenre(e.target.value)}
874 className="w-full p-2 border rounded"
875 >
876 <option value="">请选择类型</option>
877 {gamegenres.map((genre) => (
878 <option key={genre.value} value={genre.value}>
879 {genre.label}
880 </option>
881 ))}
882 </select>
883 {/* <input
884 type="text"
885 placeholder="类型"
886 value={genre}
887 onChange={(e) => setGenre(e.target.value)}
888 className="w-full p-2 border rounded"
889 /> */}
890 </div>
891 <div>
892 <label className="block mb-1">语言</label>
893 <select
894 value={language}
895 onChange={(e) => setLanguage(e.target.value)}
896 className="w-full p-2 border rounded"
897 >
898 <option value="">请选择语言</option>
899 {languages.map((language) => (
900 <option key={language.value} value={language.value}>
901 {language.label}
902 </option>
903 ))}
904 </select>
905 {/* <input
906 type="text"
907 placeholder="如 中文, 英文"
908 value={language}
909 onChange={(e) => setLanguage(e.target.value)}
910 className="w-full p-2 border rounded"
911 /> */}
912 </div>
913 <div>
914 <label className="block mb-1">数据类型</label>
915 <select
916 value={dataType}
917 onChange={(e) => setdataType(e.target.value)}
918 className="w-full p-2 border rounded"
919 >
920 <option value="">请选择数据类型</option>
921 {dataTypes.map((dataType) => (
922 <option key={dataType.value} value={dataType.value}>
923 {dataType.label}
924 </option>
925 ))}
926 </select>
927{/* <input
928 type="text"
929 placeholder="如压缩包,补丁"
930 value={dataType}
931 onChange={(e) => setdataType(e.target.value)}
932 className="w-full p-2 border rounded"
933 /> */}
934 </div>
935 </>
936 )}
937
938 {/* 综艺相关字段 */}
939 {showvarietyFields && (
940 <>
941 <div>
942 <label className="flex items-center">
943 <input
944 type="checkbox"
945 checked={isMainland}
946 onChange={(e) => setIsMainland(e.target.checked)}
947 className="mr-2"
948 />
949 是否大陆综艺
950 </label>
951 </div>
952 <div>
953 <label className="block mb-1">类型</label>
954 <select
955 value={style}
956 onChange={(e) => setStyle(e.target.value)}
957 className="w-full p-2 border rounded"
958 >
959 <option value="">请选择类型</option>
960 {varietygenres.map((style) => (
961 <option key={style.value} value={style.value}>
962 {style.label}
963 </option>
964 ))}
965 </select>
966 {/* <input
967 type="text"
968 placeholder="类型"
969 value={genre}
970 onChange={(e) => setGenre(e.target.value)}
971 className="w-full p-2 border rounded"
972 /> */}
973 </div>
974 <div>
975 <label className="block mb-1">格式</label>
976 <select
977 value={format}
978 onChange={(e) => setFormat(e.target.value)}
979 className="w-full p-2 border rounded"
980 >
981 <option value="">请选择格式</option>
982 {resolutions.map((format) => (
983 <option key={format.value} value={format.value}>
984 {format.label}
985 </option>
986 ))}
987 </select>
988 {/* <input
989 type="text"
990 placeholder="如1080P, 4K"
991 value={format}
992 onChange={(e) => setFormat(e.target.value)}
993 className="w-full p-2 border rounded"
994 /> */}
995 </div>
996 </>
997 )}
998 {/* 动漫相关字段 */}
999 {showAnimeFields && (
1000 <>
1001 <div>
1002 <label className="block mb-1">类型</label>
1003 <select
1004 value={genre}
1005 onChange={(e) => setGenre(e.target.value)}
1006 className="w-full p-2 border rounded"
1007 >
1008 <option value="">请选择类型</option>
1009 {anigenres.map((genre) => (
1010 <option key={genre.value} value={genre.value}>
1011 {genre.label}
1012 </option>
1013 ))}
1014 </select>
1015 {/* <input
1016 type="text"
1017 placeholder="如治愈, 热血"
1018 value={genre}
1019 onChange={(e) => setGenre(e.target.value)}
1020 className="w-full p-2 border rounded"
1021 /> */}
1022 </div>
1023 <div>
1024 <label className="block mb-1">格式</label>
1025 <select
1026 value={format}
1027 onChange={(e) => setFormat(e.target.value)}
1028 className="w-full p-2 border rounded"
1029 >
1030 <option value="">请选择格式</option>
1031 {animeformats.map((format) => (
1032 <option key={format.value} value={format.value}>
1033 {format.label}
1034 </option>
1035 ))}
1036 </select>
1037 {/* <input
1038 type="text"
1039 placeholder="如1080P, 4K"
1040 value={format}
1041 onChange={(e) => setFormat(e.target.value)}
1042 className="w-full p-2 border rounded"
1043 /> */}
1044 </div>
1045 <div>
1046 <label className="block mb-1">分辨率</label>
1047 <select
1048 value={resolution}
1049 onChange={(e) => setResolution(e.target.value)}
1050 className="w-full p-2 border rounded"
1051 >
1052 <option value="">请选择分辨率</option>
1053 {resolutions.map((resolution) => (
1054 <option key={resolution.value} value={resolution.value}>
1055 {resolution.label}
1056 </option>
1057 ))}
1058 </select>
1059 {/* <input
1060 type="text"
1061 placeholder="如 1080p, 4K"
1062 value={resolution}
1063 onChange={(e) => setResolution(e.target.value)}
1064 className="w-full p-2 border rounded"
1065 /> */}
1066 </div>
1067 </>
1068 )}
1069 {/* 学习相关字段 */}
1070 {showlearningFields && (
1071 <>
1072 <div>
1073 <label className="block mb-1">类型</label>
1074 <select
1075 value={genre}
1076 onChange={(e) => setGenre(e.target.value)}
1077 className="w-full p-2 border rounded"
1078 >
1079 <option value="">请选择类型</option>
1080 {learninggenres.map((genre) => (
1081 <option key={genre.value} value={genre.value}>
1082 {genre.label}
1083 </option>
1084 ))}
1085 </select>
1086 {/* <input
1087 type="text"
1088 placeholder="如 课程, 讲座"
1089 value={genre}
1090 onChange={(e) => setGenre(e.target.value)}
1091 className="w-full p-2 border rounded"
1092 /> */}
1093 </div>
1094 <div>
1095 <label className="block mb-1">格式</label>
1096 <select
1097 value={format}
1098 onChange={(e) => setFormat(e.target.value)}
1099 className="w-full p-2 border rounded"
1100 >
1101 <option value="">请选择格式</option>
1102 {learningformats.map((format) => (
1103 <option key={format.value} value={format.value}>
1104 {format.label}
1105 </option>
1106 ))}
1107 </select>
1108 {/* <input
1109 type="text"
1110 placeholder="如1080P, 4K"
1111 value={format}
1112 onChange={(e) => setFormat(e.target.value)}
1113 className="w-full p-2 border rounded"
1114 /> */}
1115 </div>
1116 </>
1117 )}
1118 {/* 软件相关字段 */}
1119 {showsoftwareFields && (
1120 <>
1121 <div>
1122 <label className="block mb-1">平台</label>
1123 <select
1124 value={platform}
1125 onChange={(e) => setPlatform(e.target.value)}
1126 className="w-full p-2 border rounded"
1127 >
1128 <option value="">请选择平台</option>
1129 {softwareplatforms.map((platform) => (
1130 <option key={platform.value} value={platform.value}>
1131 {platform.label}
1132 </option>
1133 ))}
1134 </select>
1135 {/* <input
1136 type="text"
1137 placeholder="如 Windows, Mac"
1138 value={platform}
1139 onChange={(e) => setPlatform(e.target.value)}
1140 className="w-full p-2 border rounded"
1141 /> */}
1142 </div>
1143 <div>
1144 <label className="block mb-1">类型</label>
1145 <select
1146 value={genre}
1147 onChange={(e) => setGenre(e.target.value)}
1148 className="w-full p-2 border rounded"
1149 >
1150 <option value="">请选择类型</option>
1151 {softwaregenres.map((genre) => (
1152 <option key={genre.value} value={genre.value}>
1153 {genre.label}
1154 </option>
1155 ))}
1156 </select>
1157 {/* <input
1158 type="text"
1159 placeholder="如 学习,办公"
1160 value={genre}
1161 onChange={(e) => setGenre(e.target.value)}
1162 className="w-full p-2 border rounded"
1163 /> */}
1164 </div>
1165 <div>
1166 <label className="block mb-1">格式</label>
1167 <select
1168 value={format}
1169 onChange={(e) => setFormat(e.target.value)}
1170 className="w-full p-2 border rounded"
1171 >
1172 <option value="">请选择格式</option>
1173 {softwareformats.map((format) => (
1174 <option key={format.value} value={format.value}>
1175 {format.label}
1176 </option>
1177 ))}
1178 </select>
1179 {/* <input
1180 type="text"
1181 placeholder="如 ZIP, EXE"
1182 value={format}
1183 onChange={(e) => setFormat(e.target.value)}
1184 className="w-full p-2 border rounded"
1185 /> */}
1186 </div>
1187 </>
1188 )}
1189 {/* 体育相关字段 */}
1190 {showsportsFields && (
1191 <>
1192 <div>
1193 <label className="block mb-1">类型</label>
1194 <select
1195 value={genre}
1196 onChange={(e) => setGenre(e.target.value)}
1197 className="w-full p-2 border rounded"
1198 >
1199 <option value="">请选择类型</option>
1200 {sportsgenres.map((genre) => (
1201 <option key={genre.value} value={genre.value}>
1202 {genre.label}
1203 </option>
1204 ))}
1205 </select>
1206 {/* <input
1207 type="text"
1208 placeholder="如 比赛, 训练"
1209 value={genre}
1210 onChange={(e) => setGenre(e.target.value)}
1211 className="w-full p-2 border rounded"
1212 /> */}
1213 </div>
1214 <div>
1215 <label className="block mb-1">格式</label>
1216 <select
1217 value={format}
1218 onChange={(e) => setFormat(e.target.value)}
1219 className="w-full p-2 border rounded"
1220 >
1221 <option value="">请选择格式</option>
1222 {resolutions.map((format) => (
1223 <option key={format.value} value={format.value}>
1224 {format.label}
1225 </option>
1226 ))}
1227 </select>
1228 {/* <input
1229 type="text"
1230 placeholder="如1080P, 4K"
1231 value={format}
1232 onChange={(e) => setFormat(e.target.value)}
1233 className="w-full p-2 border rounded"
1234 /> */}
1235 </div>
1236 <div>
1237 <label className="block mb-1">赛事类型</label>
1238 <select
1239 value={eventType}
1240 onChange={(e) => setEventType(e.target.value)}
1241 className="w-full p-2 border rounded"
1242 >
1243 <option value="">请选择赛事类型</option>
1244 {eventTypes.map((eventType) => (
1245 <option key={eventType.value} value={eventType.value}>
1246 {eventType.label}
1247 </option>
1248 ))}
1249 </select>
1250 {/* <input
1251 type="text"
1252 placeholder="如足球、篮球"
1253 value={eventType}
1254 onChange={(e) => setEventType(e.target.value)}
1255 className="w-full p-2 border rounded"
1256 /> */}
1257 </div>
1258 </>
1259 )}
1260 {/* 纪录片相关字段 */}
1261 {showdocFields && (
1262 <>
1263 <div>
1264 <label className="block mb-1">年份</label>
1265 <input
1266 type="text"
1267 placeholder="如 1999, 2020"
1268 value={year}
1269 onChange={(e) => setYear(e.target.value)}
1270 className="w-full p-2 border rounded"
1271 />
1272 </div>
1273 <div>
1274 <label className="block mb-1">视频源</label>
1275 <select
1276 value={source}
1277 onChange={(e) => setSource(e.target.value)}
1278 className="w-full p-2 border rounded"
1279 >
1280 <option value="">请选择视频源</option>
1281 {sourceTypes.map((source) => (
1282 <option key={source.value} value={source.value}>
1283 {source.label}
1284 </option>
1285 ))}
1286 </select>
1287 {/* <input
1288 type="text"
1289 placeholder="如BlibliBili, YouTube"
1290 value={source}
1291 onChange={(e) => setSource(e.target.value)}
1292 className="w-full p-2 border rounded"
1293 /> */}
1294 </div>
1295 <div>
1296 <label className="block mb-1">格式</label>
1297 <select
1298 value={format}
1299 onChange={(e) => setFormat(e.target.value)}
1300 className="w-full p-2 border rounded"
1301 >
1302 <option value="">请选择格式</option>
1303 {resolutions.map((format) => (
1304 <option key={format.value} value={format.value}>
1305 {format.label}
1306 </option>
1307 ))}
1308 </select>
1309 {/* <input
1310 type="text"
1311 placeholder="如1080P, 4K"
1312 value={format}
1313 onChange={(e) => setFormat(e.target.value)}
1314 className="w-full p-2 border rounded"
1315 /> */}
1316 </div>
1317 </>
1318 )}
1319 {/*音乐相关字段 */}
1320 {showMusicFields && (
1321 <>
1322 <div>
1323 <label className="block mb-1">类型</label>
1324 <select
1325 value={genre}
1326 onChange={(e) => setGenre(e.target.value)}
1327 className="w-full p-2 border rounded"
1328 >
1329 <option value="">请选择类型</option>
1330 {musicgenres.map((genre) => (
1331 <option key={genre.value} value={genre.value}>
1332 {genre.label}
1333 </option>
1334 ))}
1335 </select>
1336{/*
1337 <input
1338 type="text"
1339 placeholder="如专辑、单曲"
1340 value={genre}
1341 onChange={(e) => setGenre(e.target.value)}
1342 className="w-full p-2 border rounded"
1343 /> */}
1344 </div>
1345 <div>
1346 <label className="block mb-1">地区</label>
1347 <select
1348 value={region}
1349 onChange={(e) => setRegion(e.target.value)}
1350 className="w-full p-2 border rounded"
1351 >
1352 <option value="">请选择地区</option>
1353 {regions.map((regions) => (
1354 <option key={regions.value} value={regions.value}>
1355 {regions.label}
1356 </option>
1357 ))}
1358 </select>
1359{/* <input
1360 type="text"
1361 placeholder="如 中国, 美国"
1362 value={region}
1363 onChange={(e) => setRegion(e.target.value)}
1364 className="w-full p-2 border rounded"
1365 /> */}
1366 </div>
1367 <div>
1368 <label className="block mb-1">风格</label>
1369 <select
1370 value={style}
1371 onChange={(e) => setStyle(e.target.value)}
1372 className="w-full p-2 border rounded"
1373 >
1374 <option value="">请选择风格</option>
1375 {musicstyles.map((style) => (
1376 <option key={style.value} value={style.value}>
1377 {style.label}
1378 </option>
1379 ))}
1380 </select>
1381 {/* <input
1382 type="text"
1383 placeholder="如流行、摇滚"
1384 value={style}
1385 onChange={(e) => setStyle(e.target.value)}
1386 className="w-full p-2 border rounded"
1387 /> */}
1388 </div>
1389 <div>
1390 <label className="block mb-1">格式</label>
1391 <select
1392 value={format}
1393 onChange={(e) => setFormat(e.target.value)}
1394 className="w-full p-2 border rounded"
1395 >
1396 <option value="">请选择格式</option>
1397 {musicformats.map((format) => (
1398 <option key={format.value} value={format.value}>
1399 {format.label}
1400 </option>
1401 ))}
1402 </select>
1403{/* <input
1404 type="text"
1405 placeholder="如MP3, FLAC"
1406 value={format}
1407 onChange={(e) => setFormat(e.target.value)}
1408 className="w-full p-2 border rounded"
1409 /> */}
1410 </div>
1411 </>
1412 )}
1413 {/* 其他分类字段 */}
1414 {showotherFields && (
1415 <>
1416 <div>
1417 <label className="block mb-1">类型</label>
1418 <select
1419 value={genre}
1420 onChange={(e) => setGenre(e.target.value)}
1421 className="w-full p-2 border rounded"
1422 >
1423 <option value="">请选择类型</option>
1424 {othergenres.map((genre) => (
1425 <option key={genre.value} value={genre.value}>
1426 {genre.label}
1427 </option>
1428 ))}
1429 </select>
1430 {/* <input
1431 type="text"
1432 placeholder="如视频、音频"
1433 value={genre}
1434 onChange={(e) => setGenre(e.target.value)}
1435 className="w-full p-2 border rounded"
1436 /> */}
1437 </div>
1438 </>
1439 )}
1440
1441 {/* 其他分类字段... */}
1442 {/* 提交按钮 */}
1443
1444 <button
1445 type="submit"
1446 className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600"
1447 >
1448 上传
1449 </button>
1450 </form>
1451
1452 {showSuccess && (
1453 <div className="mt-4 p-3 bg-green-100 text-green-800 border border-green-300 rounded">
1454 上传成功!
1455 </div>
1456 )}
1457 </div>
1458 );
1459}
1460
1461export default UploadTorrent;