From 0e8bb566b5f0354c29095e54ffbb4de38cf48a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AC=94=E8=AE=B0=E6=9C=AC=E9=87=8C=E7=9A=84=E6=B0=B8?= =?UTF-8?q?=E5=B9=B3?= Date: Tue, 15 Jul 2025 15:21:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=AC=E6=AC=A1=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=85=E5=AE=B9=E5=A6=82=E4=B8=8B=20?= =?UTF-8?q?=E6=94=B9=E9=80=A0=E4=B8=8B=E8=A7=86=E9=A2=91=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkebao/src/components/UploadVideo.tsx | 94 ++++++++++++++++++++++ nkebao/src/pages/content/materials/New.tsx | 21 ++--- 2 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 nkebao/src/components/UploadVideo.tsx diff --git a/nkebao/src/components/UploadVideo.tsx b/nkebao/src/components/UploadVideo.tsx new file mode 100644 index 00000000..c2cec4e8 --- /dev/null +++ b/nkebao/src/components/UploadVideo.tsx @@ -0,0 +1,94 @@ +import React, { useRef } from 'react'; +import { Button } from 'tdesign-mobile-react'; +import { X } from 'lucide-react'; +import { uploadImage } from '@/api/upload'; + +interface UploadVideoProps { + value?: string; + onChange?: (url: string) => void; + accept?: string; + disabled?: boolean; +} + +const VIDEO_BOX_CLASS = + 'relative flex items-center justify-center w-full aspect-[16/9] rounded-2xl border-2 border-dashed border-blue-300 bg-gray-50 overflow-hidden'; + +const UploadVideo: React.FC = ({ + value, + onChange, + accept = 'video/mp4,video/webm,video/ogg,video/quicktime,video/x-msvideo,video/x-ms-wmv,video/x-flv,video/x-matroska', + disabled, +}) => { + const inputRef = useRef(null); + + // 选择文件并上传 + const handleFileChange = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + try { + const url = await uploadImage(file); + onChange?.(url); + } catch (err: any) { + alert(err?.message || '上传失败'); + } finally { + if (inputRef.current) inputRef.current.value = ''; + } + }; + + // 触发文件选择 + const handleClick = () => { + if (!disabled) inputRef.current?.click(); + }; + + // 删除视频 + const handleDelete = () => { + onChange?.(''); + }; + + return ( +
+ {!value ? ( +
+ + +
+ ) : ( +
+
+ )} +
+ ); +}; + +export default UploadVideo; \ No newline at end of file diff --git a/nkebao/src/pages/content/materials/New.tsx b/nkebao/src/pages/content/materials/New.tsx index 760da842..57f4c84d 100644 --- a/nkebao/src/pages/content/materials/New.tsx +++ b/nkebao/src/pages/content/materials/New.tsx @@ -14,6 +14,7 @@ import { Upload } from 'tdesign-mobile-react'; import type { UploadFile as TDesignUploadFile } from 'tdesign-mobile-react/es/upload/type'; import { uploadImage } from '@/api/upload'; import UploadImage from '@/components/UploadImage'; +import UploadVideo from '@/components/UploadVideo'; export default function NewMaterial() { const navigate = useNavigate(); @@ -161,7 +162,7 @@ export default function NewMaterial() {