前端简单界面
Change-Id: I7df9774daf4df8d92b13e659effe426ab0b6180b
diff --git a/pt--frontend/src/components/upload.jsx b/pt--frontend/src/components/upload.jsx
new file mode 100644
index 0000000..c2cdc76
--- /dev/null
+++ b/pt--frontend/src/components/upload.jsx
@@ -0,0 +1,1461 @@
+// // import React, { useState, useEffect } from 'react';
+// // import axios from 'axios';
+
+// // function UploadTorrent() {
+// // const [title, setTitle] = useState('');
+// // const [description, setDescription] = useState('');
+// // const [categoryId, setCategoryId] = useState('');
+// // const [dpi, setDpi] = useState(''); // 可选字段
+// // const [caption, setCaption] = useState(''); // 可选字段
+// // const [file, setFile] = useState(null);
+// // const [categories, setCategories] = useState([]);
+// // const [showSuccess, setShowSuccess] = useState(false);
+
+// // useEffect(() => {
+// // axios.get('http://localhost:8080/categories')
+// // .then(res => setCategories(res.data))
+// // .catch(err => console.error('加载分类失败', err));
+// // }, []);
+
+// // const handleSubmit = async (e) => {
+// // e.preventDefault();
+// // if (!file) {
+// // alert('请选择一个 .torrent 文件');
+// // return;
+// // }
+
+// // if (!categoryId) {
+// // alert('请选择分类');
+// // return;
+// // }
+
+// // const formData = new FormData();
+// // formData.append('file', file);
+// // formData.append('title', title);
+// // formData.append('description', description);
+// // formData.append('categoryId', categoryId);
+// // if (dpi) formData.append('dpi', dpi); // 只有当 dpi 有值时才添加
+// // if (caption) formData.append('caption', caption); // 只有当 caption 有值时才添加
+
+// // try {
+// // await axios.post('http://localhost:8080/torrent/upload', formData, {
+// // headers: { 'Content-Type': 'multipart/form-data' },
+// // responseType: 'blob', // 关键:指定响应类型为 blob
+// // });
+
+// // // 创建下载链接
+// // const url = window.URL.createObjectURL(new Blob([response.data]));
+// // const link = document.createElement('a');
+// // link.href = url;
+// // link.setAttribute('download', file.name); // 使用原文件名
+// // document.body.appendChild(link);
+// // link.click();
+// // link.remove();
+// // // 清空表单
+// // setShowSuccess(true);
+// // setTitle('');
+// // setDescription('');
+// // setCategoryId('');
+// // setDpi('');
+// // setCaption('');
+// // setFile(null);
+// // } catch (err) {
+// // console.error('上传失败', err.response?.data || err.message);
+// // alert(err.response?.data || '上传失败,请检查后端是否启动');
+// // }
+// // };
+
+// // return (
+// // <div className="max-w-xl mx-auto mt-10 p-6 bg-white shadow rounded">
+// // <h2 className="text-2xl font-bold mb-4">上传种子</h2>
+// // <form onSubmit={handleSubmit} className="space-y-4">
+// // <input type="file" accept=".torrent" onChange={(e) => setFile(e.target.files[0])} />
+// // <input
+// // type="text"
+// // placeholder="标题"
+// // value={title}
+// // onChange={(e) => setTitle(e.target.value)}
+// // className="w-full p-2 border rounded"
+// // required
+// // />
+// // <textarea
+// // placeholder="描述"
+// // value={description}
+// // onChange={(e) => setDescription(e.target.value)}
+// // className="w-full p-2 border rounded"
+// // />
+// // <select
+// // value={categoryId}
+// // onChange={(e) => setCategoryId(e.target.value)}
+// // className="w-full p-2 border rounded"
+// // required
+// // >
+// // <option value="">请选择分类</option>
+// // {categories.map(cat => (
+// // <option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</option>
+// // ))}
+// // </select>
+// // <input
+// // type="text"
+// // placeholder="DPI(可选)"
+// // value={dpi}
+// // onChange={(e) => setDpi(e.target.value)}
+// // className="w-full p-2 border rounded"
+// // />
+// // <input
+// // type="text"
+// // placeholder="字幕(可选)"
+// // value={caption}
+// // onChange={(e) => setCaption(e.target.value)}
+// // className="w-full p-2 border rounded"
+// // />
+// // <button type="submit" className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
+// // 上传
+// // </button>
+// // </form>
+
+// // {showSuccess && (
+// // <div className="mt-4 p-3 bg-green-100 text-green-800 border border-green-300 rounded">
+// // 上传成功!
+// // </div>
+// // )}
+// // </div>
+// // );
+// // }
+
+// // export default UploadTorrent;
+// import React, { useState, useEffect } from 'react';;
+// import axios from 'axios';
+
+// function UploadTorrent() {
+// const [title, setTitle] = useState('');
+// const [description, setDescription] = useState('');
+// const [categoryId, setCategoryId] = useState('');
+// const [dpi, setDpi] = useState('');
+// const [caption, setCaption] = useState('');
+// const [file, setFile] = useState(null);
+// const [categories, setCategories] = useState([]);
+// const [showSuccess, setShowSuccess] = useState(false);
+
+// useEffect(() => {
+// axios.get('http://localhost:8080/categories')
+// .then(res => setCategories(res.data))
+// .catch(err => console.error('加载分类失败', err));
+// }, []);
+
+// const handleSubmit = async (e) => {
+// e.preventDefault();
+// if (!file) {
+// alert('请选择一个 .torrent 文件');
+// return;
+// }
+
+// if (!categoryId) {
+// alert('请选择分类');
+// return;
+// }
+
+// const formData = new FormData();
+// formData.append('file', file);
+// formData.append('title', title);
+// formData.append('description', description);
+// formData.append('categoryId', categoryId);
+// if (dpi) formData.append('dpi', dpi);
+// if (caption) formData.append('caption', caption);
+
+// try {
+// // 发送上传请求
+// const response = await axios.post('http://localhost:8080/torrent/upload', formData, {
+// headers: { 'Content-Type': 'multipart/form-data' },
+// responseType: 'blob', // 关键:指定响应类型为 blob
+// });
+
+// // 创建下载链接
+// const url = window.URL.createObjectURL(new Blob([response.data]));
+// const link = document.createElement('a');
+// link.href = url;
+// link.setAttribute('download', file.name); // 使用原文件名
+// document.body.appendChild(link);
+// link.click();
+// link.remove();
+
+// // 显示成功提示
+// setShowSuccess(true);
+// setTitle('');
+// setDescription('');
+// setCategoryId('');
+// setDpi('');
+// setCaption('');
+// setFile(null);
+// } catch (err) {
+// console.error('上传失败', err.response?.data || err.message);
+// alert(err.response?.data || '上传失败,请检查后端是否启动');
+// }
+// };
+
+// return (
+// <div className="max-w-xl mx-auto mt-10 p-6 bg-white shadow rounded">
+// <h2 className="text-2xl font-bold mb-4">上传种子</h2>
+// <form onSubmit={handleSubmit} className="space-y-4">
+// <input type="file" accept=".torrent" onChange={(e) => setFile(e.target.files[0])} />
+// <input
+// type="text"
+// placeholder="标题"
+// value={title}
+// onChange={(e) => setTitle(e.target.value)}
+// className="w-full p-2 border rounded"
+// required
+// />
+// <textarea
+// placeholder="描述"
+// value={description}
+// onChange={(e) => setDescription(e.target.value)}
+// className="w-full p-2 border rounded"
+// />
+// <select
+// value={categoryId}
+// onChange={(e) => setCategoryId(e.target.value)}
+// className="w-full p-2 border rounded"
+// required
+// >
+// <option value="">请选择分类</option>
+// {categories.map(cat => (
+// <option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</option>
+// ))}
+// </select>
+// <input
+// type="text"
+// placeholder="DPI(可选)"
+// value={dpi}
+// onChange={(e) => setDpi(e.target.value)}
+// className="w-full p-2 border rounded"
+// />
+// <input
+// type="text"
+// placeholder="字幕/说明(可选)"
+// value={caption}
+// onChange={(e) => setCaption(e.target.value)}
+// className="w-full p-2 border rounded"
+// />
+// <button type="submit" className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
+// 上传
+// </button>
+// </form>
+
+// {showSuccess && (
+// <div className="mt-4 p-3 bg-green-100 text-green-800 border border-green-300 rounded">
+// 上传成功!
+// </div>
+// )}
+// </div>
+// );
+// }
+
+// export default UploadTorrent;
+import React, { useState, useEffect } from 'react';
+import axios from 'axios';
+
+function UploadTorrent() {
+ const [title, setTitle] = useState('');
+ const [description, setDescription] = useState('');
+ const [categoryId, setCategoryId] = useState('');
+ const [file, setFile] = useState(null);
+ const [categories, setCategories] = useState([]);
+ const [showSuccess, setShowSuccess] = useState(false);
+
+ // 通用参数
+ const [dpi, setDpi] = useState('');
+ const [caption, setCaption] = useState('');
+ const [region, setRegion] = useState('');
+ const [year, setYear] = useState('');
+ const [genre, setGenre] = useState('');
+ const [format, setFormat] = useState('');
+ const [resolution, setResolution] = useState('');
+
+ // 特殊参数
+ const [codecFormat, setCodecFormat] = useState('');
+ const [platform, setPlatform] = useState('');
+ const [language, setLanguage] = useState('');
+ const [eventType, setEventType] = useState('');
+ const [source, setSource] = useState('');
+ const [style, setStyle] = useState('');
+ const [dataType, setdataType] = useState('');
+ const [isMainland, setIsMainland] = useState(false);
+
+ // 根据分类显示不同的表单字段
+ const [showMovieFields, setShowMovieFields] = useState(false);
+ const [showMusicFields, setShowMusicFields] = useState(false);
+ const [showGameFields, setShowGameFields] = useState(false);
+ const [showTvFields, setShowTvFields] = useState(false);
+ const [showAnimeFields, setShowAnimeFields] = useState(false);
+ const [showlearningFields, setShowlearningFields] = useState(false);
+ const [showsoftwareFields, setShowsoftwareFields] = useState(false);
+ const [showvarietyFields, setShowvarietyFields] = useState(false);
+ const [showsportsFields, setShowsportsFields] = useState(false);
+ const [showdocFields, setShowdocFields] = useState(false);
+ const [showotherFields, setShowotherFields] = useState(false);
+ // 其他分类字段...
+ // 编码格式选项
+ const codecFormats = [
+ { value: 'H.264', label: 'H.264' },
+ { value: 'H.265', label: 'H.265' },
+ { value: 'AV1', label: 'AV1' },
+ { value: 'VP9', label: 'VP9' },
+ { value: 'VC1', label: 'VC1' },
+ { value: 'X264', label: 'X264' },
+ ];
+ const regions = [
+ { value: '大陆', label: '大陆' },
+ { value: '港台', label: '港台' },
+ { value: '欧美', label: '欧美' },
+ { value: '日韩', label: '日韩' },
+ { value: '其他', label: '其他' },
+ ];
+ const genres = [
+ { value: '动作', label: '动作' },
+ { value: '喜剧', label: '喜剧' },
+ { value: '爱情', label: '爱情' },
+ { value: '科幻', label: '科幻' },
+ { value: '恐怖', label: '恐怖' },
+ { value: '动作', label: '动作' },
+ { value: '冒险', label: '冒险' },
+ { value: '历史', label: '历史' },
+ { value: '悬疑', label: '悬疑' },
+ { value: '其他', label: '其他' },
+ ];
+ const resolutions = [
+ { value: '720p', label: '720p' },
+ { value: '1080p', label: '1080p' },
+ { value: '2K', label: '2K' },
+ { value: '4K', label: '4K' },
+ { value: '8K', label: '8K' },
+ { value: '其他', label: '其他' },
+ ];
+
+
+ const eventTypes = [
+ { value: '足球', label: '足球' },
+ { value: '篮球', label: '篮球' },
+ { value: '网球', label: '网球' },
+ { value: '乒乓球', label: '乒乓球' },
+ { value: '羽毛球', label: '羽毛球' },
+ ]
+ const styles = [
+ { value: '大陆综艺', label: '大陆综艺' },
+ { value: '日韩综艺', label: '日韩综艺' },
+ { value: '欧美综艺', label: '欧美综艺' },
+ { value: '其他', label: '其他' },
+ ]
+ const platforms = [
+ { value: 'PC', label: 'PC' },
+ { value: 'PS5', label: 'PS5' },
+ { value: 'Xbox', label: 'Xbox' },
+ { value: 'Switch', label: 'Switch' },
+ { value: '手机', label: '手机' },
+ { value: '其他', label: '其他' },
+ ]
+ const gamegenres = [
+ { value: '角色扮演', label: '角色扮演' },
+ { value: '射击', label: '射击' },
+ { value: '冒险', label: '冒险' },
+ { value: '策略', label: '策略' },
+ { value: '体育', label: '体育' },
+ { value: '桌面游戏', label: '桌面游戏'},
+ { value: '其他', label: '其他' },
+ ]
+ const dataTypes = [
+ { value: '压缩包', label: '压缩包' },
+ { value: '补丁', label: '补丁' },
+ { value: '安装包', label: '安装包' },
+ { value: 'nds', label: 'nds' },
+ { value: '其他', label: '其他' },
+ ]
+ const languages = [
+ { value: '中文', label: '中文' },
+ { value: '英文', label: '英文' },
+ { value: '日文', label: '日文' },
+ { value: '其他', label: '其他' },
+ ]
+ const musicgenres = [
+ { value: '专辑', label: '专辑' },
+ { value: '单曲', label: '单曲' },
+ { value: 'EP', label: 'EP' },
+ { value: '现场', label: '现场' },
+ { value: '其他', label: '其他' },
+ ]
+ const musicstyles = [
+ { value: '流行', label: '流行' },
+ { value: '摇滚', label: '摇滚' },
+ { value: '电子', label: '电子' },
+ { value: '古典', label: '古典' },
+ { value: '爵士', label: '爵士' },
+ { value: '民谣', label: '民谣' },
+ { value: '说唱', label: '说唱' },
+ { value: '其他', label: '其他' },
+ ]
+ const musicformats = [
+ { value: 'MP3', label: 'MP3' },
+ { value: 'FLAC', label: 'FLAC' },
+ { value: 'WAV', label: 'WAV' },
+ { value: 'AAC', label: 'AAC' },
+ { value: 'OGG', label: 'OGG' },
+ { value: '其他', label: '其他' },
+ ]
+ const anigenres = [
+ { value: '新番连载', label: '新番连载' },
+ { value: '剧场版', label: '剧场版' },
+ { value: 'OVA', label: 'OVA' },
+ { value: '完结动漫', label: '完结动漫' },
+ { value: '其他', label: '其他' },
+ ]
+ const animeformats = [
+ { value: 'ZIP', label: 'ZIP' },
+ { value: 'RAR', label: 'RAR' },
+ { value: '7Z', label: '7Z' },
+ { value: 'MKV', label: 'MKV' },
+ { value: 'MP4', label: 'MP4' },
+ { value: '其他', label: '其他' },
+ ]
+ const varietygenres = [
+ { value: '真人秀', label: '真人秀' },
+ { value: '选秀', label: '选秀' },
+ { value: '访谈', label: '访谈' },
+ { value: '游戏', label: '游戏' },
+ { value: '音乐', label: '音乐' },
+ { value: '其他', label: '其他' },
+ ]
+ const sportsgenres = [
+ { value: '足球', label: '足球' },
+ { value: '篮球', label: '篮球' },
+ { value: '网球', label: '网球' },
+ { value: '乒乓球', label: '乒乓球' },
+ { value: '羽毛球', label: '羽毛球' },
+ { value: '其他', label: '其他' },
+ ]
+ const softwaregenres = [
+ { value: '系统软件', label: '系统软件' },
+ { value: '应用软件', label: '应用软件' },
+ { value: '游戏软件', label: '游戏软件' },
+ { value: '驱动程序', label: '驱动程序' },
+ { value: '办公软件', label: '办公软件' },
+ { value: '其他', label: '其他' },
+ ]
+ const softwareplatforms = [
+ { value: 'Windows', label: 'Windows' },
+ { value: 'Mac', label: 'Mac' },
+ { value: 'Linux', label: 'Linux' },
+ { value: 'Android', label: 'Android' },
+ { value: 'iOS', label: 'iOS' },
+ { value: '其他', label: '其他' },
+ ]
+ const softwareformats = [
+ { value: 'EXE', label: 'EXE' },
+ { value: 'DMG', label: 'DMG' },
+ { value: '光盘镜像', label: '光盘镜像' },
+ { value: 'APK', label: 'APK' },
+ { value: 'IPA', label: 'IPA' },
+ { value: '其他', label: '其他' },
+ ]
+ const learninggenres = [
+ { value: '计算机', label: '计算机' },
+ { value: '软件', label: '软件' },
+ { value: '人文', label: '人文' },
+ { value: '外语', label: '外语' },
+ { value: '理工类', label: '理工类' },
+ { value: '其他', label: '其他' },
+ ]
+ const learningformats = [
+ { value: 'PDF', label: 'PDF' },
+ { value: 'EPUB', label: 'EPUB' },
+ { value: '视频', label: '视频' },
+ { value: '音频', label: '音频' },
+ { value: 'PPT', label: 'PPT' },
+ { value: '其他', label: '其他' },
+ ]
+ const sourceTypes = [
+ { value: 'CCTV', label: 'CCTV' },
+ { value: '卫视', label: '卫视' },
+ { value: '国家地理', label: '国家地理' },
+ { value: 'BBC', label: 'BBC' },
+ { value: 'Discovery', label: 'Discovery' },
+ { value: '其他', label: '其他' },
+ ]
+ const othergenres = [
+ { value: '电子书', label: '电子书' },
+ { value: '视频', label: '视频' },
+ { value: 'MP3', label: 'MP3' },
+ { value: '图片', label: '图片' },
+ { value: '其他', label: '其他' },
+ ]
+ useEffect(() => {
+ axios.get('http://localhost:8080/categories')
+ .then(res => setCategories(res.data))
+ .catch(err => console.error('加载分类失败', err));
+ }, []);
+
+ // 根据选择的分类显示不同的表单字段
+ useEffect(() => {
+ setShowMovieFields(categoryId === '1');
+ setShowMusicFields(categoryId === '3');
+ setShowGameFields(categoryId === '5');
+ setShowTvFields(categoryId === '2');
+ setShowAnimeFields(categoryId === '4');
+ setShowlearningFields(categoryId === '9');
+ setShowsoftwareFields(categoryId === '8');
+ setShowvarietyFields(categoryId === '6');
+ setShowsportsFields(categoryId === '7');
+ setShowdocFields(categoryId === '10');
+ setShowotherFields(categoryId === '11');
+ // 其他分类...
+ }, [categoryId]);
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ if (!file) {
+ alert('请选择一个 .torrent 文件');
+ return;
+ }
+
+ if (!categoryId) {
+ alert('请选择分类');
+ return;
+ }
+
+ const formData = new FormData();
+ formData.append('file', file);
+ formData.append('title', title);
+ formData.append('description', description);
+ formData.append('categoryId', categoryId);
+
+ // 通用参数
+ if (dpi) formData.append('dpi', dpi);
+ if (caption) formData.append('caption', caption);
+ if (region) formData.append('region', region);
+ if (year) formData.append('year', year);
+ if (genre) formData.append('genre', genre);
+ if (format) formData.append('format', format);
+ if (resolution) formData.append('resolution', resolution);
+
+ // 特殊参数
+ if (codecFormat) formData.append('codecFormat', codecFormat);
+ if (platform) formData.append('platform', platform);
+ if (language) formData.append('language', language);
+ if (eventType) formData.append('eventType', eventType);
+ if (source) formData.append('source', source);
+ if (style) formData.append('style', style);
+ if (dataType) formData.append('dataType', dataType);
+ formData.append('isMainland', isMainland.toString());
+
+ try {
+ const response = await axios.post('http://localhost:8080/torrent/upload', formData, {
+ headers: { 'Content-Type': 'multipart/form-data' },
+ responseType: 'blob',
+ });
+
+ // 创建下载链接
+ const url = window.URL.createObjectURL(new Blob([response.data]));
+ const link = document.createElement('a');
+ link.href = url;
+ link.setAttribute('download', file.name);
+ document.body.appendChild(link);
+ link.click();
+ link.remove();
+
+ // 显示成功提示
+ setShowSuccess(true);
+ // 清空表单
+ setTitle('');
+ setDescription('');
+ setCategoryId('');
+ setFile(null);
+ // 清空其他字段...
+ } catch (err) {
+ console.error('上传失败', err.response?.data || err.message);
+ alert(err.response?.data || '上传失败,请检查后端是否启动');
+ }
+ };
+
+ return (
+ <div className="max-w-xl mx-auto mt-10 p-6 bg-white shadow rounded">
+ <h2 className="text-2xl font-bold mb-4">上传种子</h2>
+ <form onSubmit={handleSubmit} className="space-y-4">
+ <div>
+ <label className="block mb-1">种子文件 (.torrent)</label>
+ <input
+ type="file"
+ accept=".torrent"
+ onChange={(e) => setFile(e.target.files[0])}
+ className="w-full p-2 border rounded"
+ required
+ />
+ </div>
+
+ <div>
+ <label className="block mb-1">标题</label>
+ <input
+ type="text"
+ placeholder="标题"
+ value={title}
+ onChange={(e) => setTitle(e.target.value)}
+ className="w-full p-2 border rounded"
+ required
+ />
+ </div>
+
+ <div>
+ <label className="block mb-1">描述</label>
+ <textarea
+ placeholder="描述"
+ value={description}
+ onChange={(e) => setDescription(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div>
+
+ <div>
+ <label className="block mb-1">分类</label>
+ <select
+ value={categoryId}
+ onChange={(e) => setCategoryId(e.target.value)}
+ className="w-full p-2 border rounded"
+ required
+ >
+ <option value="">请选择分类</option>
+ {categories.map(cat => (
+ <option key={cat.categoryid} value={cat.categoryid}>{cat.category_name}</option>
+ ))}
+ </select>
+ </div>
+
+ {/* <div>
+ <label className="block mb-1">DPI(可选)</label>
+ <input
+ type="text"
+ placeholder="DPI"
+ value={dpi}
+ onChange={(e) => setDpi(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div>
+
+ <div>
+ <label className="block mb-1">字幕/说明(可选)</label>
+ <input
+ type="text"
+ placeholder="字幕/说明"
+ value={caption}
+ onChange={(e) => setCaption(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div> */}
+
+ {/* 电影相关字段 */}
+ {showMovieFields && (
+ <>
+ <div>
+ <label className="block mb-1">字幕/说明</label>
+ <input
+ type="text"
+ placeholder="字幕/说明"
+ value={caption}
+ onChange={(e) => setCaption(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div>
+ <div>
+ <label className="block mb-1">地区</label>
+ <select
+ value={region}
+ onChange={(e) => setRegion(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择地区</option>
+ {regions.map((regions) => (
+ <option key={regions.value} value={regions.value}>
+ {regions.label}
+ </option>
+ ))}
+ </select>
+ </div>
+ {/* <input
+ type="text"
+ placeholder="region"
+ value={region}
+ onChange={(e) => setRegion(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div> */}
+
+ <div>
+ <label className="block mb-1">年份</label>
+ <input
+ type="text"
+ placeholder="年份"
+ value={year}
+ onChange={(e) => setYear(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div>
+ <div>
+ <label className="block mb-1">类型</label>
+ {/* <input
+ type="text"
+ placeholder="类型"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {genres.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ </div>
+ {/* <div>
+ <label className="block mb-1">编码格式</label>
+ <input
+ type="text"
+ placeholder="如 H.264, H.265"
+ value={codecFormat}
+ onChange={(e) => setCodecFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div> */}
+ <div>
+ <label className="block mb-1">编码格式</label>
+ <select
+ value={codecFormat}
+ onChange={(e) => setCodecFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择编码格式</option>
+ {codecFormats.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ </div>
+ <div>
+ <label className="block mb-1">分辨率</label>
+ <select
+ value={resolution}
+ onChange={(e) => setResolution(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择分辨率</option>
+ {resolutions.map((resolution) => (
+ <option key={resolution.value} value={resolution.value}>
+ {resolution.label}
+ </option>
+ ))}
+ </select>
+{/*
+ <input
+ type="text"
+ placeholder="如 1080p, 4K"
+ value={resolution}
+ onChange={(e) => setResolution(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/*剧集相关字段 */}
+ {showTvFields && (
+ <>
+ <div>
+ <label className="block mb-1">地区</label>
+ <select
+ value={region}
+ onChange={(e) => setRegion(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择地区</option>
+ {regions.map((regions) => (
+ <option key={regions.value} value={regions.value}>
+ {regions.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 中国, 美国"
+ value={region}
+ onChange={(e) => setRegion(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {resolutions.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+{/* <input
+ type="text"
+ placeholder="如1080P, 4K"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {genres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+{/* <input
+ type="text"
+ placeholder="类型"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+
+ {/* 游戏相关字段 */}
+ {showGameFields && (
+ <>
+ <div>
+ <label className="block mb-1">平台</label>
+ <select
+ value={platform}
+ onChange={(e) => setPlatform(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择平台</option>
+ {platforms.map((platform) => (
+ <option key={platform.value} value={platform.value}>
+ {platform.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ <input
+ type="text"
+ placeholder="如 PC, PS5"
+ value={platform}
+ onChange={(e) => setPlatform(e.target.value)}
+ className="w-full p-2 border rounded"
+ />*/}
+ </div>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {gamegenres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="类型"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">语言</label>
+ <select
+ value={language}
+ onChange={(e) => setLanguage(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择语言</option>
+ {languages.map((language) => (
+ <option key={language.value} value={language.value}>
+ {language.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 中文, 英文"
+ value={language}
+ onChange={(e) => setLanguage(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">数据类型</label>
+ <select
+ value={dataType}
+ onChange={(e) => setdataType(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择数据类型</option>
+ {dataTypes.map((dataType) => (
+ <option key={dataType.value} value={dataType.value}>
+ {dataType.label}
+ </option>
+ ))}
+ </select>
+{/* <input
+ type="text"
+ placeholder="如压缩包,补丁"
+ value={dataType}
+ onChange={(e) => setdataType(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+
+ {/* 综艺相关字段 */}
+ {showvarietyFields && (
+ <>
+ <div>
+ <label className="flex items-center">
+ <input
+ type="checkbox"
+ checked={isMainland}
+ onChange={(e) => setIsMainland(e.target.checked)}
+ className="mr-2"
+ />
+ 是否大陆综艺
+ </label>
+ </div>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={style}
+ onChange={(e) => setStyle(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {varietygenres.map((style) => (
+ <option key={style.value} value={style.value}>
+ {style.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="类型"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {resolutions.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如1080P, 4K"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/* 动漫相关字段 */}
+ {showAnimeFields && (
+ <>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {anigenres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如治愈, 热血"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {animeformats.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如1080P, 4K"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">分辨率</label>
+ <select
+ value={resolution}
+ onChange={(e) => setResolution(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择分辨率</option>
+ {resolutions.map((resolution) => (
+ <option key={resolution.value} value={resolution.value}>
+ {resolution.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 1080p, 4K"
+ value={resolution}
+ onChange={(e) => setResolution(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/* 学习相关字段 */}
+ {showlearningFields && (
+ <>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {learninggenres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 课程, 讲座"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {learningformats.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如1080P, 4K"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/* 软件相关字段 */}
+ {showsoftwareFields && (
+ <>
+ <div>
+ <label className="block mb-1">平台</label>
+ <select
+ value={platform}
+ onChange={(e) => setPlatform(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择平台</option>
+ {softwareplatforms.map((platform) => (
+ <option key={platform.value} value={platform.value}>
+ {platform.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 Windows, Mac"
+ value={platform}
+ onChange={(e) => setPlatform(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {softwaregenres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 学习,办公"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {softwareformats.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 ZIP, EXE"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/* 体育相关字段 */}
+ {showsportsFields && (
+ <>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {sportsgenres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如 比赛, 训练"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {resolutions.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如1080P, 4K"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">赛事类型</label>
+ <select
+ value={eventType}
+ onChange={(e) => setEventType(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择赛事类型</option>
+ {eventTypes.map((eventType) => (
+ <option key={eventType.value} value={eventType.value}>
+ {eventType.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如足球、篮球"
+ value={eventType}
+ onChange={(e) => setEventType(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/* 纪录片相关字段 */}
+ {showdocFields && (
+ <>
+ <div>
+ <label className="block mb-1">年份</label>
+ <input
+ type="text"
+ placeholder="如 1999, 2020"
+ value={year}
+ onChange={(e) => setYear(e.target.value)}
+ className="w-full p-2 border rounded"
+ />
+ </div>
+ <div>
+ <label className="block mb-1">视频源</label>
+ <select
+ value={source}
+ onChange={(e) => setSource(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择视频源</option>
+ {sourceTypes.map((source) => (
+ <option key={source.value} value={source.value}>
+ {source.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如BlibliBili, YouTube"
+ value={source}
+ onChange={(e) => setSource(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {resolutions.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如1080P, 4K"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/*音乐相关字段 */}
+ {showMusicFields && (
+ <>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {musicgenres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+{/*
+ <input
+ type="text"
+ placeholder="如专辑、单曲"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">地区</label>
+ <select
+ value={region}
+ onChange={(e) => setRegion(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择地区</option>
+ {regions.map((regions) => (
+ <option key={regions.value} value={regions.value}>
+ {regions.label}
+ </option>
+ ))}
+ </select>
+{/* <input
+ type="text"
+ placeholder="如 中国, 美国"
+ value={region}
+ onChange={(e) => setRegion(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">风格</label>
+ <select
+ value={style}
+ onChange={(e) => setStyle(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择风格</option>
+ {musicstyles.map((style) => (
+ <option key={style.value} value={style.value}>
+ {style.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如流行、摇滚"
+ value={style}
+ onChange={(e) => setStyle(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ <div>
+ <label className="block mb-1">格式</label>
+ <select
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择格式</option>
+ {musicformats.map((format) => (
+ <option key={format.value} value={format.value}>
+ {format.label}
+ </option>
+ ))}
+ </select>
+{/* <input
+ type="text"
+ placeholder="如MP3, FLAC"
+ value={format}
+ onChange={(e) => setFormat(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+ {/* 其他分类字段 */}
+ {showotherFields && (
+ <>
+ <div>
+ <label className="block mb-1">类型</label>
+ <select
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ >
+ <option value="">请选择类型</option>
+ {othergenres.map((genre) => (
+ <option key={genre.value} value={genre.value}>
+ {genre.label}
+ </option>
+ ))}
+ </select>
+ {/* <input
+ type="text"
+ placeholder="如视频、音频"
+ value={genre}
+ onChange={(e) => setGenre(e.target.value)}
+ className="w-full p-2 border rounded"
+ /> */}
+ </div>
+ </>
+ )}
+
+ {/* 其他分类字段... */}
+ {/* 提交按钮 */}
+
+ <button
+ type="submit"
+ className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600"
+ >
+ 上传
+ </button>
+ </form>
+
+ {showSuccess && (
+ <div className="mt-4 p-3 bg-green-100 text-green-800 border border-green-300 rounded">
+ 上传成功!
+ </div>
+ )}
+ </div>
+ );
+}
+
+export default UploadTorrent;
\ No newline at end of file