'use client' import React, { useState, useEffect, useCallback } from 'react' interface VersionInfo { version: string download_url: string checksum: string } export default function UploadPage() { const [currentVersion, setCurrentVersion] = useState(null) const [newVersion, setNewVersion] = useState('') const [versionFile, setVersionFile] = useState(null) const [versionFileHash, setVersionFileHash] = useState('') const [isUploading, setIsUploading] = useState(false) const [uploadError, setUploadError] = useState('') const [uploadSuccess, setUploadSuccess] = useState(false) const canUploadVersion = newVersion && versionFile && !isUploading // 计算文件 SHA-256 const calculateSha256 = async (file: File): Promise => { const buffer = await file.arrayBuffer() const hashBuffer = await crypto.subtle.digest('SHA-256', buffer) const hashArray = Array.from(new Uint8Array(hashBuffer)) return hashArray.map(b => b.toString(16).padStart(2, '0')).join('') } // 获取当前版本信息 const fetchCurrentVersion = useCallback(async () => { try { const response = await fetch('/api/api/version') if (response.ok) { const data: VersionInfo = await response.json() setCurrentVersion(data) } } catch (err) { console.error('获取版本信息失败:', err) } }, []) // 处理版本文件选择 const handleVersionFileChange = async (event: React.ChangeEvent) => { const input = event.target if (input.files && input.files[0]) { const file = input.files[0] setVersionFile(file) setVersionFileHash(await calculateSha256(file)) } } // 清除表单 const resetForm = () => { setNewVersion('') setVersionFile(null) setVersionFileHash('') setUploadError('') } // 上传新版本 const uploadVersion = async () => { if (!versionFile || !newVersion) return setIsUploading(true) setUploadError('') setUploadSuccess(false) const formData = new FormData() formData.append('file', versionFile) formData.append('version', newVersion) try { const response = await fetch('/api/upload/version', { method: 'POST', body: formData }) if (!response.ok) { throw new Error('Upload failed') } await fetchCurrentVersion() setUploadSuccess(true) resetForm() setTimeout(() => { setUploadSuccess(false) }, 3000) } catch (err) { console.error('上传失败:', err) setUploadError('上传失败,请重试') } finally { setIsUploading(false) } } useEffect(() => { fetchCurrentVersion() }, [fetchCurrentVersion]) return (

软件版本管理

{/* 当前版本信息卡片 */}

当前版本信息

{currentVersion ? (
版本号: {currentVersion.version}
校验和: {currentVersion.checksum}
) : (
暂无版本信息
)}
{/* 上传新版本表单 */}

上传新版本

{/* 版本号输入 */}
setNewVersion(e.target.value)} type="text" className="w-full px-4 py-2 border rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition" placeholder="例如: 1.0.0" />
{/* 文件上传 */}

{versionFile?.name || '未选择文件'}

{versionFileHash && (

SHA-256 校验和:

{versionFileHash}

)}
{/* 错误提示 */} {uploadError && (
{uploadError}
)} {/* 成功提示 */} {uploadSuccess && (
上传成功!
)} {/* 提交按钮 */}
) }