sa2kit 1.6.57 → 1.6.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AliyunOSSProvider-KSYW2IOG.js +15 -0
- package/dist/{AliyunOSSProvider-2FARPAQD.js.map → AliyunOSSProvider-KSYW2IOG.js.map} +1 -1
- package/dist/AliyunOSSProvider-TBK3G7YK.mjs +6 -0
- package/dist/{AliyunOSSProvider-UMVGVBDJ.mjs.map → AliyunOSSProvider-TBK3G7YK.mjs.map} +1 -1
- package/dist/LocalStorageProvider-2DGYRQAB.mjs +6 -0
- package/dist/{LocalStorageProvider-PYOHETJV.mjs.map → LocalStorageProvider-2DGYRQAB.mjs.map} +1 -1
- package/dist/LocalStorageProvider-SSRW3ZJW.js +15 -0
- package/dist/{LocalStorageProvider-JQF5WK5H.js.map → LocalStorageProvider-SSRW3ZJW.js.map} +1 -1
- package/dist/UniversalFileService-336GFY6N.mjs +6 -0
- package/dist/{UniversalFileService-TNYKO6JN.mjs.map → UniversalFileService-336GFY6N.mjs.map} +1 -1
- package/dist/UniversalFileService-J6ET6KZK.js +15 -0
- package/dist/{UniversalFileService-RBV6EN5J.js.map → UniversalFileService-J6ET6KZK.js.map} +1 -1
- package/dist/calendar/index.js +11 -11
- package/dist/calendar/index.mjs +4 -4
- package/dist/chunk-25OFOKNF.js +171 -0
- package/dist/chunk-25OFOKNF.js.map +1 -0
- package/dist/chunk-3DXPQ4YV.mjs +165 -0
- package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
- package/dist/{chunk-4VJQZSPU.mjs → chunk-3NHAT7D4.mjs} +3 -4
- package/dist/chunk-3NHAT7D4.mjs.map +1 -0
- package/dist/{chunk-3JW4X3AC.mjs → chunk-622Y6LTH.mjs} +3 -3
- package/dist/{chunk-3JW4X3AC.mjs.map → chunk-622Y6LTH.mjs.map} +1 -1
- package/dist/{chunk-HYZ5C6FY.mjs → chunk-7CMGQX3S.mjs} +1199 -1995
- package/dist/chunk-7CMGQX3S.mjs.map +1 -0
- package/dist/chunk-CIVO4R6N.mjs +37 -0
- package/dist/chunk-CIVO4R6N.mjs.map +1 -0
- package/dist/{chunk-6BJ76BYC.mjs → chunk-EGJPS7OL.mjs} +3 -3
- package/dist/{chunk-6BJ76BYC.mjs.map → chunk-EGJPS7OL.mjs.map} +1 -1
- package/dist/{chunk-UR5TU4MW.mjs → chunk-FVDPGX6A.mjs} +3 -3
- package/dist/{chunk-UR5TU4MW.mjs.map → chunk-FVDPGX6A.mjs.map} +1 -1
- package/dist/chunk-HDMIOOZY.mjs +546 -0
- package/dist/chunk-HDMIOOZY.mjs.map +1 -0
- package/dist/{chunk-MZKATHB7.js → chunk-HHVDOIPV.js} +4 -4
- package/dist/{chunk-MZKATHB7.js.map → chunk-HHVDOIPV.js.map} +1 -1
- package/dist/chunk-HJ6MH7J7.js +552 -0
- package/dist/chunk-HJ6MH7J7.js.map +1 -0
- package/dist/chunk-KH6RQ4J5.js +28 -0
- package/dist/chunk-KH6RQ4J5.js.map +1 -0
- package/dist/{chunk-53WLQ22S.js → chunk-LJGJPAQ4.js} +6 -6
- package/dist/{chunk-53WLQ22S.js.map → chunk-LJGJPAQ4.js.map} +1 -1
- package/dist/{chunk-35CXIK5Y.js → chunk-NCOXT7SK.js} +11 -11
- package/dist/{chunk-35CXIK5Y.js.map → chunk-NCOXT7SK.js.map} +1 -1
- package/dist/chunk-NZZZUMMX.mjs +784 -0
- package/dist/chunk-NZZZUMMX.mjs.map +1 -0
- package/dist/{chunk-OBIPI4GU.mjs → chunk-OFYBMMWT.mjs} +4 -4
- package/dist/{chunk-OBIPI4GU.mjs.map → chunk-OFYBMMWT.mjs.map} +1 -1
- package/dist/chunk-Q5EDCKQA.js +336 -0
- package/dist/chunk-Q5EDCKQA.js.map +1 -0
- package/dist/{chunk-U7AQC2Z7.js → chunk-SKCMZYSQ.js} +1203 -2001
- package/dist/chunk-SKCMZYSQ.js.map +1 -0
- package/dist/{chunk-6NMIKAE7.mjs → chunk-SNBILYSH.mjs} +5 -5
- package/dist/{chunk-6NMIKAE7.mjs.map → chunk-SNBILYSH.mjs.map} +1 -1
- package/dist/{chunk-IPY26RQH.js → chunk-UVHPCLP6.js} +5 -5
- package/dist/{chunk-IPY26RQH.js.map → chunk-UVHPCLP6.js.map} +1 -1
- package/dist/{chunk-V6BXO6ZS.mjs → chunk-UZB4IO3T.mjs} +835 -38
- package/dist/chunk-UZB4IO3T.mjs.map +1 -0
- package/dist/{chunk-W2NCOORK.js → chunk-WK3HTUID.js} +951 -145
- package/dist/chunk-WK3HTUID.js.map +1 -0
- package/dist/chunk-YMS6BPXS.js +807 -0
- package/dist/chunk-YMS6BPXS.js.map +1 -0
- package/dist/chunk-YOTQG4NP.mjs +314 -0
- package/dist/chunk-YOTQG4NP.mjs.map +1 -0
- package/dist/chunk-ZGVB35L2.mjs +25 -0
- package/dist/chunk-ZGVB35L2.mjs.map +1 -0
- package/dist/chunk-ZRAW3HXA.js +43 -0
- package/dist/chunk-ZRAW3HXA.js.map +1 -0
- package/dist/{chunk-4XXIBWCO.js → chunk-ZRWED7Q6.js} +66 -66
- package/dist/{chunk-4XXIBWCO.js.map → chunk-ZRWED7Q6.js.map} +1 -1
- package/dist/{chunk-DVENFCQY.js → chunk-ZWQJSZEY.js} +4 -5
- package/dist/chunk-ZWQJSZEY.js.map +1 -0
- package/dist/components/index.js +104 -104
- package/dist/components/index.mjs +4 -4
- package/dist/index.js +146 -148
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -11
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +7 -7
- package/dist/logger/index.mjs +1 -4
- package/dist/mikuFusionGame/index.js +4 -4
- package/dist/mikuFusionGame/index.mjs +3 -3
- package/dist/portfolio/index.js +10 -10
- package/dist/portfolio/index.mjs +5 -5
- package/dist/showmasterpiece/db/index.js +42 -42
- package/dist/showmasterpiece/db/index.mjs +1 -1
- package/dist/showmasterpiece/index.js +143 -144
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +7 -9
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/logic/index.d.mts +10 -1
- package/dist/showmasterpiece/logic/index.d.ts +10 -1
- package/dist/showmasterpiece/logic/index.js +19 -19
- package/dist/showmasterpiece/logic/index.mjs +2 -2
- package/dist/showmasterpiece/server/index.js +42 -42
- package/dist/showmasterpiece/server/index.mjs +1 -1
- package/dist/showmasterpiece/ui/web/index.js +34 -34
- package/dist/showmasterpiece/ui/web/index.mjs +6 -6
- package/dist/universalExport/server/index.js +2 -4
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +1 -3
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.js +6 -9
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +1 -5
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.js +31 -64
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +7 -42
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/dist/utils/index.js +11 -11
- package/dist/utils/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/AliyunOSSProvider-2FARPAQD.js +0 -15
- package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +0 -9
- package/dist/LocalStorageProvider-JQF5WK5H.js +0 -15
- package/dist/LocalStorageProvider-PYOHETJV.mjs +0 -9
- package/dist/UniversalFileService-RBV6EN5J.js +0 -15
- package/dist/UniversalFileService-TNYKO6JN.mjs +0 -9
- package/dist/chunk-4NFOSCM6.js +0 -34
- package/dist/chunk-4NFOSCM6.js.map +0 -1
- package/dist/chunk-4VJQZSPU.mjs.map +0 -1
- package/dist/chunk-6AHYPPUP.js +0 -344
- package/dist/chunk-6AHYPPUP.js.map +0 -1
- package/dist/chunk-76V7EKBX.mjs +0 -796
- package/dist/chunk-76V7EKBX.mjs.map +0 -1
- package/dist/chunk-ACLOJXXE.js +0 -195
- package/dist/chunk-ACLOJXXE.js.map +0 -1
- package/dist/chunk-AEXPAH7Z.mjs +0 -32
- package/dist/chunk-AEXPAH7Z.mjs.map +0 -1
- package/dist/chunk-CFGX3EKK.js +0 -560
- package/dist/chunk-CFGX3EKK.js.map +0 -1
- package/dist/chunk-D2HXMGXS.js +0 -46
- package/dist/chunk-D2HXMGXS.js.map +0 -1
- package/dist/chunk-DVENFCQY.js.map +0 -1
- package/dist/chunk-HYZ5C6FY.mjs.map +0 -1
- package/dist/chunk-K7WNCB4V.mjs +0 -554
- package/dist/chunk-K7WNCB4V.mjs.map +0 -1
- package/dist/chunk-L4ZYBFB2.mjs +0 -44
- package/dist/chunk-L4ZYBFB2.mjs.map +0 -1
- package/dist/chunk-M4HGHTIC.js +0 -820
- package/dist/chunk-M4HGHTIC.js.map +0 -1
- package/dist/chunk-PXWDQFWV.mjs +0 -192
- package/dist/chunk-PXWDQFWV.mjs.map +0 -1
- package/dist/chunk-U7AQC2Z7.js.map +0 -1
- package/dist/chunk-V6BXO6ZS.mjs.map +0 -1
- package/dist/chunk-VTGPHE4Z.mjs +0 -322
- package/dist/chunk-VTGPHE4Z.mjs.map +0 -1
- package/dist/chunk-W2NCOORK.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/universalFile/index.ts","../../src/universalFile/constants.ts","../../src/universalFile/utils.ts","../../src/universalFile/client.ts","../../src/universalFile/components/FileUploader.tsx","../../src/universalFile/components/UniversalFileManager.tsx","../../src/universalFile/components/FolderManager.tsx","../../src/universalFile/components/FileShareModal.tsx"],"names":["React","validateFile","error","formatFileSize","useState","useCallback","clsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 通用文件服务模块统一导出\n */\n\n// 导出所有类型\nexport type * from './types';\n\n// 导出异常类\nexport {\n FileServiceError,\n FileUploadError,\n FileProcessingError,\n StorageProviderError,\n CDNProviderError,\n} from './types';\n\n// 导出客户端\nexport { UniversalFileClient, universalFileClient, createFileClient } from './client';\nexport type { UniversalFileClientConfig } from './client';\n\n// 导出常量\nexport * from './constants';\n\n// 导出工具函数\nexport * from './utils';\n\n// 导出 UI 组件(Tailwind CSS)\nexport * from './components';\n","/**\n * 通用文件服务常量定义\n */\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_FILE_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_FILE_NAME = '@qhr123/sa2kit/universalFile';\n\n// ============= 文件大小限制 =============\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大图片大小(字节) - 10MB */\nexport const DEFAULT_MAX_IMAGE_SIZE = 10 * 1024 * 1024;\n\n/** 默认最大视频大小(字节) - 500MB */\nexport const DEFAULT_MAX_VIDEO_SIZE = 500 * 1024 * 1024;\n\n/** 默认最大音频大小(字节) - 50MB */\nexport const DEFAULT_MAX_AUDIO_SIZE = 50 * 1024 * 1024;\n\n/** 默认最大文档大小(字节) - 20MB */\nexport const DEFAULT_MAX_DOCUMENT_SIZE = 20 * 1024 * 1024;\n\n// ============= MIME类型 =============\n\n/** 图片MIME类型 */\nexport const IMAGE_MIME_TYPES = [\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n];\n\n/** 视频MIME类型 */\nexport const VIDEO_MIME_TYPES = [\n 'video/mp4',\n 'video/mpeg',\n 'video/quicktime',\n 'video/x-msvideo',\n 'video/webm',\n];\n\n/** 音频MIME类型 */\nexport const AUDIO_MIME_TYPES = ['audio/mpeg', 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/aac'];\n\n/** 文档MIME类型 */\nexport const DOCUMENT_MIME_TYPES = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/plain',\n];\n\n/** 所有支持的MIME类型 */\nexport const ALL_SUPPORTED_MIME_TYPES = [\n ...IMAGE_MIME_TYPES,\n ...VIDEO_MIME_TYPES,\n ...AUDIO_MIME_TYPES,\n ...DOCUMENT_MIME_TYPES,\n];\n\n// ============= 文件扩展名 =============\n\n/** 图片扩展名 */\nexport const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'];\n\n/** 视频扩展名 */\nexport const VIDEO_EXTENSIONS = ['.mp4', '.mpeg', '.mov', '.avi', '.webm'];\n\n/** 音频扩展名 */\nexport const AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.aac'];\n\n/** 文档扩展名 */\nexport const DOCUMENT_EXTENSIONS = [\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n];\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-file';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 上传文件 */\n UPLOAD: (API_BASE_PATH) + '/upload',\n /** 获取文件URL */\n GET_URL: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId) + '/url',\n /** 获取文件元数据 */\n GET_METADATA: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId),\n /** 删除文件 */\n DELETE: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId),\n /** 查询文件列表 */\n QUERY: (API_BASE_PATH) + '/files',\n /** 批量删除 */\n BATCH_DELETE: (API_BASE_PATH) + '/files/batch-delete',\n /** 获取上传进度 */\n GET_PROGRESS: (fileId: string) => (API_BASE_PATH) + '/upload/' + (fileId) + '/progress',\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 文件上传错误 */\n FILE_UPLOAD_ERROR: 'FILE_UPLOAD_ERROR',\n /** 文件大小超限 */\n FILE_SIZE_EXCEEDED: 'FILE_SIZE_EXCEEDED',\n /** 文件类型不支持 */\n FILE_TYPE_NOT_SUPPORTED: 'FILE_TYPE_NOT_SUPPORTED',\n /** 文件不存在 */\n FILE_NOT_FOUND: 'FILE_NOT_FOUND',\n /** 文件处理错误 */\n FILE_PROCESSING_ERROR: 'FILE_PROCESSING_ERROR',\n /** 存储提供者错误 */\n STORAGE_PROVIDER_ERROR: 'STORAGE_PROVIDER_ERROR',\n /** CDN提供者错误 */\n CDN_PROVIDER_ERROR: 'CDN_PROVIDER_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 权限不足 */\n FORBIDDEN: 'FORBIDDEN',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n\n// ============= 默认配置 =============\n\n/** 默认分页大小 */\nexport const DEFAULT_PAGE_SIZE = 20;\n\n/** 默认请求超时时间(毫秒) - 30秒 */\nexport const DEFAULT_REQUEST_TIMEOUT = 30000;\n\n/** 默认上传超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_UPLOAD_TIMEOUT = 300000;\n\n/** 默认分片上传大小(字节) - 5MB */\nexport const DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;\n","/**\n * 通用文件服务工具函数\n */\n\nimport {\n IMAGE_MIME_TYPES,\n VIDEO_MIME_TYPES,\n AUDIO_MIME_TYPES,\n DOCUMENT_MIME_TYPES,\n} from './constants';\n\n// ============= 文件大小处理 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return ((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + (units[i]);\n}\n\n/**\n * 解析文件大小字符串\n */\nexport function parseFileSize(sizeStr: string): number {\n const match = sizeStr.match(/^(\\d+(?:\\.\\d+)?)\\s*([KMGT]?B)$/i);\n if (!match || !match[1] || !match[2]) return 0;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n\n const units: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n };\n\n return value * (units[unit] || 1);\n}\n\n// ============= MIME类型处理 =============\n\n/**\n * 获取文件扩展名\n */\nexport function getFileExtension(fileName: string): string {\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot === -1) return '';\n return fileName.substring(lastDot).toLowerCase();\n}\n\n/**\n * 根据文件名获取MIME类型\n */\nexport function getMimeTypeFromFileName(fileName: string): string {\n const ext = getFileExtension(fileName);\n\n const mimeMap: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n };\n\n return mimeMap[ext] || 'application/octet-stream';\n}\n\n/**\n * 检查MIME类型是否支持\n */\nexport function isMimeTypeSupported(mimeType: string, allowedTypes?: string[]): boolean {\n if (allowedTypes && allowedTypes.length > 0) {\n return allowedTypes.includes(mimeType);\n }\n\n return (\n IMAGE_MIME_TYPES.includes(mimeType) ||\n VIDEO_MIME_TYPES.includes(mimeType) ||\n AUDIO_MIME_TYPES.includes(mimeType) ||\n DOCUMENT_MIME_TYPES.includes(mimeType)\n );\n}\n\n/**\n * 判断是否为图片类型\n */\nexport function isImageFile(mimeType: string): boolean {\n return IMAGE_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为视频类型\n */\nexport function isVideoFile(mimeType: string): boolean {\n return VIDEO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为音频类型\n */\nexport function isAudioFile(mimeType: string): boolean {\n return AUDIO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为文档类型\n */\nexport function isDocumentFile(mimeType: string): boolean {\n return DOCUMENT_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 获取文件类型类别\n */\nexport function getFileCategory(\n mimeType: string\n): 'image' | 'video' | 'audio' | 'document' | 'other' {\n if (isImageFile(mimeType)) return 'image';\n if (isVideoFile(mimeType)) return 'video';\n if (isAudioFile(mimeType)) return 'audio';\n if (isDocumentFile(mimeType)) return 'document';\n return 'other';\n}\n\n// ============= 文件名处理 =============\n\n/**\n * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n // 检查是否以点开头\n if (fileName.startsWith('.')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName\n .replace(/[<>:\"|?*\\/\\\\]/g, '_')\n .replace(/^\\.+/, '')\n .substring(0, 255);\n}\n\n/**\n * 生成唯一文件名\n */\nexport function generateUniqueFileName(originalName: string, fileId: string): string {\n const ext = getFileExtension(originalName);\n return (fileId) + (ext);\n}\n\n// ============= 存储路径处理 =============\n\n/**\n * 生成存储路径\n */\nexport function generateStoragePath(\n moduleId: string,\n fileName: string,\n options?: {\n businessId?: string;\n useDate?: boolean;\n customPrefix?: string;\n }\n): string {\n const parts: string[] = [];\n\n // 添加自定义前缀\n if (options?.customPrefix) {\n parts.push(options.customPrefix);\n }\n\n // 添加模块标识\n parts.push(moduleId);\n\n // 添加业务标识\n if (options?.businessId) {\n parts.push(options.businessId);\n }\n\n // 添加日期路径\n if (options?.useDate !== false) {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n parts.push(String(year), month, day);\n }\n\n // 添加文件名\n parts.push(fileName);\n\n return parts.join('/');\n}\n\n/**\n * 解析存储路径\n */\nexport function parseStoragePath(path: string): {\n moduleId?: string;\n businessId?: string;\n year?: string;\n month?: string;\n day?: string;\n fileName: string;\n} {\n const parts = path.split('/');\n const fileName = parts[parts.length - 1] || '';\n\n return {\n moduleId: parts[0] || undefined,\n businessId: parts.length > 5 ? parts[1] : undefined,\n year: parts.length > 3 ? parts[parts.length - 4] : undefined,\n month: parts.length > 2 ? parts[parts.length - 3] : undefined,\n day: parts.length > 1 ? parts[parts.length - 2] : undefined,\n fileName,\n };\n}\n\n// ============= 文件验证 =============\n\n/**\n * 验证文件大小\n */\nexport function validateFileSize(file: File, maxSize: number): { valid: boolean; error?: string } {\n if (file.size > maxSize) {\n return {\n valid: false,\n error: '文件大小超过限制: ' + (formatFileSize(file.size)) + ' > ' + (formatFileSize(maxSize)),\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件类型\n */\nexport function validateFileType(\n file: File,\n allowedTypes?: string[]\n): { valid: boolean; error?: string } {\n const mimeType = file.type || getMimeTypeFromFileName(file.name);\n\n if (!isMimeTypeSupported(mimeType, allowedTypes)) {\n return {\n valid: false,\n error: '不支持的文件类型: ' + (mimeType),\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件\n */\nexport function validateFile(\n file: File,\n options?: {\n maxSize?: number;\n allowedTypes?: string[];\n }\n): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证文件名\n if (!validateFileName(file.name)) {\n errors.push('文件名包含非法字符或长度不合法');\n }\n\n // 验证文件大小\n if (options?.maxSize) {\n const sizeResult = validateFileSize(file, options.maxSize);\n if (!sizeResult.valid && sizeResult.error) {\n errors.push(sizeResult.error);\n }\n }\n\n // 验证文件类型\n if (options?.allowedTypes) {\n const typeResult = validateFileType(file, options.allowedTypes);\n if (!typeResult.valid && typeResult.error) {\n errors.push(typeResult.error);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= URL处理 =============\n\n/**\n * 构建查询字符串\n */\nexport function buildQueryString(params: Record<string, any>): string {\n const searchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((v) => searchParams.append(key, String(v)));\n } else {\n searchParams.append(key, String(value));\n }\n }\n });\n\n const queryString = searchParams.toString();\n return queryString ? '?' + (queryString) : '';\n}\n\n/**\n * 解析URL查询参数\n */\nexport function parseQueryString(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n const urlObj = new URL(url, window.location.origin);\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\n// ============= 进度计算 =============\n\n/**\n * 计算上传进度\n */\nexport function calculateProgress(uploadedBytes: number, totalBytes: number): number {\n if (totalBytes === 0) return 0;\n return Math.min(Math.round((uploadedBytes / totalBytes) * 100), 100);\n}\n\n/**\n * 计算上传速度\n */\nexport function calculateSpeed(uploadedBytes: number, elapsedTime: number): number {\n if (elapsedTime === 0) return 0;\n return uploadedBytes / (elapsedTime / 1000); // 字节/秒\n}\n\n/**\n * 计算剩余时间\n */\nexport function calculateRemainingTime(\n uploadedBytes: number,\n totalBytes: number,\n speed: number\n): number {\n if (speed === 0) return 0;\n const remainingBytes = totalBytes - uploadedBytes;\n return Math.round(remainingBytes / speed); // 秒\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建文件错误对象\n */\nexport function createFileError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n\n return '未知错误';\n}\n\n// ============= 文件读取 =============\n\n/**\n * 读取文件为Base64\n */\nexport function readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result as string;\n // 移除Data URL前缀\n const base64 = result.split(',')[1] || '';\n resolve(base64);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 读取文件为ArrayBuffer\n */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as ArrayBuffer);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsArrayBuffer(file);\n });\n}\n\n/**\n * 读取文件为文本\n */\nexport function readFileAsText(file: File, encoding: string = 'UTF-8'): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsText(file, encoding);\n });\n}\n","/**\n * 通用文件服务客户端SDK\n *\n * 提供文件上传、下载、查询等功能的客户端接口\n */\n\nimport type {\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n} from './types';\nimport {\n API_ENDPOINTS,\n ERROR_CODES,\n DEFAULT_REQUEST_TIMEOUT,\n DEFAULT_UPLOAD_TIMEOUT,\n} from './constants';\nimport { createFileError, formatErrorMessage, buildQueryString } from './utils';\n\n// ============= 配置类型 =============\n\nexport interface UniversalFileClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 上传超时时间(毫秒) */\n uploadTimeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用文件服务客户端\n */\nexport class UniversalFileClient {\n private config: Required<UniversalFileClientConfig>;\n\n constructor(config: UniversalFileClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || DEFAULT_REQUEST_TIMEOUT,\n uploadTimeout: config.uploadTimeout || DEFAULT_UPLOAD_TIMEOUT,\n headers: config.headers || {},\n };\n }\n\n // ============= 文件上传API =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.UPLOAD);\n const startTime = Date.now();\n\n // 创建FormData\n const formData = new FormData();\n formData.append('file', fileInfo.file);\n formData.append('moduleId', fileInfo.moduleId);\n\n if (fileInfo.businessId) {\n formData.append('businessId', fileInfo.businessId);\n }\n\n if (fileInfo.permission) {\n formData.append('permission', fileInfo.permission);\n }\n\n if (fileInfo.customPath) {\n formData.append('customPath', fileInfo.customPath);\n }\n\n if (fileInfo.metadata) {\n formData.append('metadata', JSON.stringify(fileInfo.metadata));\n }\n\n if (fileInfo.needsProcessing !== undefined) {\n formData.append('needsProcessing', String(fileInfo.needsProcessing));\n }\n\n if (fileInfo.processingOptions) {\n formData.append('processingOptions', JSON.stringify(fileInfo.processingOptions));\n }\n\n try {\n console.log('📤 [UniversalFileClient] 开始上传文件:', {\n url,\n fileName: fileInfo.file.name,\n fileSize: fileInfo.file.size,\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n });\n\n // 创建XMLHttpRequest以支持上传进度\n return await new Promise<FileMetadata>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n \n // 重要:启用 credentials 以携带 cookie\n xhr.withCredentials = true;\n\n // 监听上传进度\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable && onProgress) {\n const elapsedTime = Date.now() - startTime;\n const speed = event.loaded / (elapsedTime / 1000);\n const remainingBytes = event.total - event.loaded;\n const remainingTime = speed > 0 ? remainingBytes / speed : 0;\n\n const progress: UploadProgress = {\n fileId: '', // 暂时为空,上传完成后会有\n status: 'uploading',\n progress: Math.round((event.loaded / event.total) * 100),\n uploadedBytes: event.loaded,\n totalBytes: event.total,\n speed,\n remainingTime,\n };\n\n onProgress(progress);\n }\n });\n\n // 监听上传完成\n xhr.addEventListener('load', () => {\n console.log('📥 [UniversalFileClient] 上传响应:', {\n status: xhr.status,\n statusText: xhr.statusText,\n responseLength: xhr.responseText?.length,\n });\n \n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n console.log('✅ [UniversalFileClient] 解析响应成功:', response);\n \n // 支持多种响应格式\n const fileData = response.file || response.data || response;\n const fileMetadata = this.transformFileMetadataFromAPI(fileData);\n\n if (onProgress) {\n onProgress({\n fileId: fileMetadata.id,\n status: 'completed',\n progress: 100,\n uploadedBytes: fileInfo.file.size,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n });\n }\n\n resolve(fileMetadata);\n } catch (error) {\n console.error('❌ [UniversalFileClient] 解析响应失败:', error, xhr.responseText);\n reject(new Error('解析响应失败'));\n }\n } else {\n console.error('❌ [UniversalFileClient] 上传失败:', xhr.status, xhr.statusText, xhr.responseText);\n reject(new Error('上传失败: ' + (xhr.statusText)));\n }\n });\n\n // 监听错误\n xhr.addEventListener('error', (event) => {\n console.error('❌ [UniversalFileClient] 网络错误:', event);\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '网络错误',\n });\n }\n reject(new Error('上传失败: 网络错误'));\n });\n\n // 监听超时\n xhr.addEventListener('timeout', () => {\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '上传超时',\n });\n }\n reject(new Error('上传超时'));\n });\n\n // 配置请求\n xhr.open('POST', url);\n xhr.timeout = this.config.uploadTimeout;\n\n // 设置请求头\n Object.entries(this.config.headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n\n // 发送请求\n xhr.send(formData);\n });\n } catch (error) {\n throw createFileError(\n ERROR_CODES.FILE_UPLOAD_ERROR,\n '文件上传失败: ' + (formatErrorMessage(error)),\n { fileInfo, originalError: error }\n );\n }\n }\n\n // ============= 文件查询API =============\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, expiresIn?: number): Promise<string> {\n const url = this.config.baseUrl + API_ENDPOINTS.GET_URL(fileId) + (expiresIn ? `?expiresIn=${expiresIn}` : '');\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取文件URL失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.url;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取文件URL失败: ' + (formatErrorMessage(error)),\n { fileId, expiresIn, originalError: error }\n );\n }\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_METADATA(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error('获取文件元数据失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformFileMetadataFromAPI(data.file);\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取文件元数据失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n const queryString = buildQueryString({\n moduleId: options.moduleId,\n businessId: options.businessId,\n uploaderId: options.uploaderId,\n mimeType: options.mimeType,\n minSize: options.minSize,\n maxSize: options.maxSize,\n startTime: options.startTime?.toISOString(),\n endTime: options.endTime?.toISOString(),\n keyword: options.keyword,\n tags: options.tags,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n });\n\n const url = (this.config.baseUrl) + (API_ENDPOINTS.QUERY) + (queryString);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n console.error('❌ [UniversalFileClient] 查询文件列表失败:', response.status, response.statusText);\n throw new Error('查询文件列表失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n console.log('📥 [UniversalFileClient] 查询文件列表响应:', {\n itemsCount: data.items?.length,\n total: data.total,\n page: data.page,\n });\n \n // 防御性检查\n if (!data.items || !Array.isArray(data.items)) {\n console.error('❌ [UniversalFileClient] 响应格式错误: items 不是数组', data);\n return {\n items: [],\n total: 0,\n page: 1,\n pageSize: 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n \n return {\n items: data.items.map((item: any) => this.transformFileMetadataFromAPI(item)),\n total: data.total,\n page: data.page,\n pageSize: data.pageSize,\n totalPages: data.totalPages,\n hasNext: data.hasNext,\n hasPrev: data.hasPrev,\n };\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '查询文件列表失败: ' + (formatErrorMessage(error)),\n { options, originalError: error }\n );\n }\n }\n\n // ============= 文件删除API =============\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string): Promise<void> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.DELETE(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error('删除文件失败: ' + (response.statusText));\n }\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '删除文件失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[]): Promise<BatchOperationResult> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.BATCH_DELETE);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ fileIds }),\n });\n\n if (!response.ok) {\n throw new Error('批量删除文件失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.result;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '批量删除文件失败: ' + (formatErrorMessage(error)),\n { fileIds, originalError: error }\n );\n }\n }\n\n // ============= 上传进度API =============\n\n /**\n * 获取上传进度\n */\n async getUploadProgress(fileId: string): Promise<UploadProgress> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_PROGRESS(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取上传进度失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.progress;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取上传进度失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n credentials: 'include', // 携带 cookie 用于授权\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createFileError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的文件元数据\n */\n private transformFileMetadataFromAPI(apiData: any): FileMetadata {\n return {\n id: apiData.id,\n originalName: apiData.originalName,\n storageName: apiData.storageName || apiData.storedName,\n size: apiData.size,\n mimeType: apiData.mimeType,\n extension: apiData.extension,\n hash: apiData.hash || apiData.md5Hash || apiData.sha256Hash,\n uploadTime: new Date(apiData.uploadTime),\n permission: apiData.permission || 'public',\n uploaderId: apiData.uploaderId,\n moduleId: apiData.moduleId,\n businessId: apiData.businessId,\n storageProvider: apiData.storageProvider || 'local',\n storagePath: apiData.storagePath,\n cdnUrl: apiData.cdnUrl,\n accessCount: apiData.accessCount,\n lastAccessTime: apiData.lastAccessTime ? new Date(apiData.lastAccessTime) : undefined,\n expiresAt: apiData.expiresAt ? new Date(apiData.expiresAt) : undefined,\n metadata: apiData.metadata,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalFileClient = new UniversalFileClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createFileClient(config?: UniversalFileClientConfig): UniversalFileClient {\n return new UniversalFileClient(config);\n}\n","/**\n * 通用文件上传组件\n * Universal File Uploader Component\n *\n * 支持拖拽上传、进度显示、多文件上传等功能\n * 使用 Tailwind CSS 样式,支持暗色模式\n */\n\n'use client';\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport {\n Upload,\n X,\n FileText,\n Image,\n Film,\n Music,\n AlertCircle,\n CheckCircle2,\n Loader2,\n} from 'lucide-react';\n\nimport type {\n FileMetadata,\n UploadProgress,\n UploadFileInfo,\n ProcessingOptions,\n} from '../types';\nimport type { UniversalFileService } from '../server/UniversalFileService';\n\n// ============= 类型定义 =============\n\nexport interface FileUploaderProps {\n /** 文件服务实例 */\n fileService: UniversalFileService;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 允许的文件类型 */\n acceptedTypes?: string[];\n /** 最大文件大小(MB) */\n maxFileSize?: number;\n /** 最大文件数量 */\n maxFiles?: number;\n /** 是否支持多文件上传 */\n multiple?: boolean;\n /** 是否启用文件处理 */\n enableProcessing?: boolean;\n /** 默认处理选项 */\n defaultProcessingOptions?: ProcessingOptions;\n /** 上传成功回调 */\n onUploadSuccess?: (files: FileMetadata[]) => void;\n /** 上传失败回调 */\n onUploadError?: (error: string) => void;\n /** 上传进度回调 */\n onProgress?: (progress: UploadProgress[]) => void;\n /** 自定义样式类名 */\n className?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 显示模式 */\n mode?: 'compact' | 'normal' | 'detailed';\n}\n\nexport interface UploadingFile {\n id: string;\n file: File;\n progress: UploadProgress;\n metadata?: FileMetadata;\n error?: string;\n}\n\n// ============= 主组件 =============\n\nexport const FileUploader: React.FC<FileUploaderProps> = ({\n fileService,\n moduleId,\n businessId,\n acceptedTypes = [],\n maxFileSize = 100, // 100MB\n maxFiles = 10,\n multiple = true,\n enableProcessing = false,\n defaultProcessingOptions,\n onUploadSuccess,\n onUploadError,\n onProgress,\n className = '',\n disabled = false,\n mode = 'normal',\n}) => {\n // ============= 状态管理 =============\n\n const [uploadingFiles, setUploadingFiles] = useState<UploadingFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const [completedFiles, setCompletedFiles] = useState<FileMetadata[]>([]);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // ============= 文件类型图标 =============\n\n const getFileIcon = (mimeType: string) => {\n if (mimeType.startsWith('image/')) return <Image className=\"w-5 h-5\" />;\n if (mimeType.startsWith('video/')) return <Film className=\"w-5 h-5\" />;\n if (mimeType.startsWith('audio/')) return <Music className=\"w-5 h-5\" />;\n return <FileText className=\"w-5 h-5\" />;\n };\n\n // ============= 文件验证 =============\n\n const validateFile = (file: File): string | null => {\n // 检查文件大小\n if (file.size > maxFileSize * 1024 * 1024) {\n return '文件大小不能超过 ' + (maxFileSize) + 'MB';\n }\n\n // 检查文件类型\n if (acceptedTypes.length > 0 && !acceptedTypes.includes(file.type)) {\n return '不支持的文件类型: ' + (file.type);\n }\n\n return null;\n };\n\n // ============= 文件上传逻辑 =============\n\n const uploadFile = useCallback(\n async (file: File): Promise<void> => {\n const fileId = 'upload_' + (Date.now()) + '_' + (Math.random().toString(36).substr(2, 9));\n\n // 验证文件\n const error = validateFile(file);\n if (error) {\n onUploadError?.(error);\n return;\n }\n\n // 初始化上传进度\n const initialProgress: UploadProgress = {\n fileId,\n status: 'pending',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: file.size,\n speed: 0,\n remainingTime: 0,\n };\n\n const uploadingFile: UploadingFile = {\n id: fileId,\n file,\n progress: initialProgress,\n };\n\n setUploadingFiles((prev) => [...prev, uploadingFile]);\n\n try {\n // 构建上传文件信息\n const uploadInfo: UploadFileInfo = {\n file,\n moduleId,\n businessId,\n permission: 'public',\n needsProcessing: enableProcessing,\n processingOptions: defaultProcessingOptions,\n };\n\n // 开始上传\n const result = await fileService.uploadFile(\n uploadInfo,\n undefined, // 使用默认存储类型\n (progress) => {\n setUploadingFiles((prev) =>\n prev.map((f) => (f.id === fileId ? { ...f, progress } : f))\n );\n\n // 调用外部进度回调\n const allProgress = uploadingFiles.map((f) => f.progress);\n onProgress?.(allProgress);\n }\n );\n\n // 上传成功,result直接是FileMetadata\n setUploadingFiles((prev) => prev.filter((f) => f.id !== fileId));\n setCompletedFiles((prev) => [...prev, result]);\n onUploadSuccess?.([result]);\n } catch (error) {\n console.error('文件上传失败:', error);\n\n const errorMessage = error instanceof Error ? error.message : '上传失败';\n\n setUploadingFiles((prev) =>\n prev.map((f) => (f.id === fileId ? { ...f, error: errorMessage } : f))\n );\n\n onUploadError?.(errorMessage);\n }\n },\n [\n fileService,\n moduleId,\n businessId,\n enableProcessing,\n defaultProcessingOptions,\n maxFileSize,\n acceptedTypes,\n onUploadSuccess,\n onUploadError,\n onProgress,\n uploadingFiles,\n ]\n );\n\n // ============= 文件选择处理 =============\n\n const handleFileSelect = useCallback(\n (files: FileList | File[]) => {\n const fileArray = Array.from(files);\n\n // 检查文件数量限制\n if (completedFiles.length + uploadingFiles.length + fileArray.length > maxFiles) {\n onUploadError?.('最多只能上传 ' + (maxFiles) + ' 个文件');\n return;\n }\n\n // 逐个上传文件\n fileArray.forEach(uploadFile);\n },\n [completedFiles.length, uploadingFiles.length, maxFiles, onUploadError, uploadFile]\n );\n\n // ============= 事件处理 =============\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (files && files.length > 0) {\n handleFileSelect(files);\n }\n // 清空input值,允许重复选择同一文件\n event.target.value = '';\n };\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(true);\n };\n\n const handleDragLeave = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n };\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n\n const files = event.dataTransfer.files;\n if (files.length > 0) {\n handleFileSelect(files);\n }\n };\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n };\n\n const removeUploadingFile = (fileId: string) => {\n setUploadingFiles((prev) => prev.filter((f) => f.id !== fileId));\n };\n\n const removeCompletedFile = (fileId: string) => {\n setCompletedFiles((prev) => prev.filter((f) => f.id !== fileId));\n };\n\n // ============= 渲染辅助函数 =============\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n const formatProgress = (progress: UploadProgress): string => {\n switch (progress.status) {\n case 'pending':\n return '准备中...';\n case 'uploading':\n return '上传中 ' + (progress.progress.toFixed(1)) + '%';\n case 'processing':\n return '处理中...';\n case 'completed':\n return '完成';\n case 'failed':\n return '失败';\n default:\n return '未知状态';\n }\n };\n\n // ============= 样式计算 =============\n\n const containerClasses = clsx(\n 'border-2 border-dashed rounded-lg transition-all duration-200',\n isDragOver\n ? 'border-blue-400 bg-blue-50 dark:bg-blue-900/20'\n : 'border-gray-300 dark:border-gray-600',\n disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-blue-400 cursor-pointer',\n className\n );\n\n const uploadAreaClasses = clsx(\n 'p-6 text-center',\n mode === 'compact' ? 'p-4' : mode === 'detailed' ? 'p-8' : 'p-6'\n );\n\n // ============= 渲染 =============\n\n return (\n <div className=\"w-full space-y-4\">\n {/* 文件上传区域 */}\n <div\n className={containerClasses}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n >\n <div className={uploadAreaClasses}>\n <Upload\n className={clsx('mx-auto mb-4 text-gray-400', mode === 'compact' ? 'w-8 h-8 mb-2' : 'w-12 h-12')}\n />\n\n {mode === 'compact' ? (\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">点击上传或拖拽文件到这里</p>\n ) : (\n <>\n <h3 className=\"text-lg font-semibold text-gray-700 dark:text-gray-300 mb-2\">\n 上传文件\n </h3>\n <p className=\"text-gray-600 dark:text-gray-400 mb-2\">点击选择文件或拖拽文件到这里</p>\n {mode === 'detailed' && (\n <div className=\"text-sm text-gray-500 space-y-1\">\n {acceptedTypes.length > 0 && <p>支持格式: {acceptedTypes.join(', ')}</p>}\n <p>\n 最大大小: {maxFileSize}MB | 最多文件: {maxFiles}个\n </p>\n </div>\n )}\n </>\n )}\n </div>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n accept={acceptedTypes.join(',')}\n onChange={handleInputChange}\n className=\"hidden\"\n disabled={disabled}\n />\n </div>\n\n {/* 上传进度列表 */}\n {uploadingFiles.length > 0 && (\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n 上传中 ({uploadingFiles.length})\n </h4>\n\n {uploadingFiles.map((uploadingFile) => (\n <div\n key={uploadingFile.id}\n className=\"flex items-center space-x-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg\"\n >\n {/* 文件图标 */}\n <div className=\"flex-shrink-0\">\n {uploadingFile.progress.status === 'failed' ? (\n <AlertCircle className=\"w-5 h-5 text-red-500\" />\n ) : uploadingFile.progress.status === 'completed' ? (\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\n ) : (\n <Loader2 className=\"w-5 h-5 text-blue-500 animate-spin\" />\n )}\n </div>\n\n {/* 文件信息 */}\n <div className=\"flex-grow min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\n {uploadingFile.file.name}\n </p>\n <span className=\"text-xs text-gray-500\">\n {formatFileSize(uploadingFile.file.size)}\n </span>\n </div>\n\n {uploadingFile.error ? (\n <p className=\"text-xs text-red-500\">{uploadingFile.error}</p>\n ) : (\n <>\n <div className=\"w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2 mb-1\">\n <div\n className=\"bg-blue-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: (uploadingFile.progress.progress) + '%' }}\n />\n </div>\n <p className=\"text-xs text-gray-500\">\n {formatProgress(uploadingFile.progress)}\n </p>\n </>\n )}\n </div>\n\n {/* 移除按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n removeUploadingFile(uploadingFile.id);\n }}\n className=\"flex-shrink-0 p-1 text-gray-400 hover:text-red-500 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* 已完成文件列表 */}\n {completedFiles.length > 0 && (\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n 已完成 ({completedFiles.length})\n </h4>\n\n {completedFiles.map((file) => (\n <div\n key={file.id}\n className=\"flex items-center space-x-3 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\"\n >\n {/* 文件图标 */}\n <div className=\"flex-shrink-0\">{getFileIcon(file.mimeType)}</div>\n\n {/* 文件信息 */}\n <div className=\"flex-grow min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\n {file.originalName}\n </p>\n <span className=\"text-xs text-gray-500\">{formatFileSize(file.size)}</span>\n </div>\n <p className=\"text-xs text-green-600 dark:text-green-400\">\n 上传成功 • {new Date(file.uploadTime).toLocaleTimeString()}\n </p>\n </div>\n\n {/* 移除按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n removeCompletedFile(file.id);\n }}\n className=\"flex-shrink-0 p-1 text-gray-400 hover:text-red-500 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* 统计信息 */}\n {mode === 'detailed' && (completedFiles.length > 0 || uploadingFiles.length > 0) && (\n <div className=\"flex justify-between items-center text-sm text-gray-500 pt-2 border-t border-gray-200 dark:border-gray-700\">\n <span>总计: {completedFiles.length + uploadingFiles.length} 文件</span>\n <span>\n 大小:{' '}\n {formatFileSize(\n [\n ...completedFiles.map((f) => f.size),\n ...uploadingFiles.map((f) => f.file.size),\n ].reduce((total, size) => total + size, 0)\n )}\n </span>\n </div>\n )}\n </div>\n );\n};\n\nexport default FileUploader;\n\n","/**\n * 通用文件管理组件\n * 支持文件列表、预览、批量操作、搜索筛选等功能\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport { FileMetadata, FileQueryOptions, PaginatedResult, ProcessorType } from '../types';\nimport { clsx } from 'clsx';\n\n// 文件管理相关类型定义\nexport interface FileManagerProps {\n /** 模块ID,限制显示特定模块的文件 */\n moduleId?: string;\n /** 业务ID,限制显示特定业务的文件 */\n businessId?: string;\n /** 显示模式 */\n mode?: 'grid' | 'list' | 'table';\n /** 是否允许上传 */\n allowUpload?: boolean;\n /** 是否允许下载 */\n allowDownload?: boolean;\n /** 是否允许删除 */\n allowDelete?: boolean;\n /** 是否允许批量操作 */\n allowBatch?: boolean;\n /** 是否显示预览 */\n showPreview?: boolean;\n /** 是否显示搜索 */\n showSearch?: boolean;\n /** 是否显示筛选器 */\n showFilters?: boolean;\n /** 每页显示数量 */\n pageSize?: number;\n /** 自定义操作按钮 */\n customActions?: Array<{\n key: string;\n label: string;\n icon?: string;\n onClick: (files: FileMetadata[]) => void;\n disabled?: (files: FileMetadata[]) => boolean;\n }>;\n /** 文件选择回调 */\n onFileSelect?: (files: FileMetadata[]) => void;\n /** 上传完成回调 */\n onUploadComplete?: (files: FileMetadata[]) => void;\n}\n\nexport interface FileManagerState {\n files: FileMetadata[];\n selectedFiles: Set<string>;\n loading: boolean;\n uploading: boolean;\n error: string | null;\n searchQuery: string;\n filters: {\n mimeType: string;\n dateRange: { start: Date | null; end: Date | null };\n sizeRange: { min: number; max: number };\n };\n sortBy: keyof FileMetadata;\n sortOrder: 'asc' | 'desc';\n pagination: {\n page: number;\n pageSize: number;\n total: number;\n totalPages: number;\n };\n previewFile: FileMetadata | null;\n showUploadModal: boolean;\n}\n\nconst MIME_TYPE_CATEGORIES = {\n 'image': ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'],\n 'video': ['video/mp4', 'video/avi', 'video/mov', 'video/webm'],\n 'audio': ['audio/mp3', 'audio/wav', 'audio/ogg', 'audio/aac'],\n 'document': ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n 'archive': ['application/zip', 'application/x-rar-compressed', 'application/x-7z-compressed']\n};\n\nexport const UniversalFileManager: React.FC<FileManagerProps> = ({\n moduleId,\n businessId,\n mode = 'grid',\n allowUpload = true,\n allowDownload = true,\n allowDelete = false,\n allowBatch = true,\n showPreview = true,\n showSearch = true,\n showFilters = true,\n pageSize = 20,\n customActions = [],\n onFileSelect,\n onUploadComplete\n}) => {\n const [state, setState] = useState<FileManagerState>({\n files: [],\n selectedFiles: new Set(),\n loading: false,\n uploading: false,\n error: null,\n searchQuery: '',\n filters: {\n mimeType: '',\n dateRange: { start: null, end: null },\n sizeRange: { min: 0, max: Number.MAX_SAFE_INTEGER }\n },\n sortBy: 'uploadTime',\n sortOrder: 'desc',\n pagination: {\n page: 1,\n pageSize,\n total: 0,\n totalPages: 0\n },\n previewFile: null,\n showUploadModal: false\n });\n\n // 加载文件列表\n const loadFiles = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n\n try {\n const queryOptions: FileQueryOptions = {\n moduleId,\n businessId,\n page: state.pagination.page,\n pageSize: state.pagination.pageSize,\n sortBy: state.sortBy,\n sortOrder: state.sortOrder\n };\n\n // 添加搜索查询\n if (state.searchQuery) {\n // 这里应该调用文件服务的搜索API\n // queryOptions.search = state.searchQuery;\n }\n\n // 添加筛选条件\n if (state.filters.mimeType) {\n queryOptions.mimeType = state.filters.mimeType;\n }\n if (state.filters.dateRange.start) {\n queryOptions.startTime = state.filters.dateRange.start;\n }\n if (state.filters.dateRange.end) {\n queryOptions.endTime = state.filters.dateRange.end;\n }\n\n // 这里应该调用实际的文件服务API\n // const result = await fileService.queryFiles(queryOptions);\n \n // 模拟API调用\n const mockResult: PaginatedResult<FileMetadata> = {\n items: [],\n total: 0,\n page: queryOptions.page || 1,\n pageSize: queryOptions.pageSize || 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false\n };\n\n setState(prev => ({\n ...prev,\n files: mockResult.items,\n pagination: {\n page: mockResult.page,\n pageSize: mockResult.pageSize,\n total: mockResult.total,\n totalPages: mockResult.totalPages\n },\n loading: false\n }));\n\n } catch (error) {\n console.error('加载文件列表失败:', error);\n setState(prev => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : '加载文件列表失败'\n }));\n }\n }, [moduleId, businessId, state.searchQuery, state.filters, state.sortBy, state.sortOrder, state.pagination.page, state.pagination.pageSize]);\n\n // 初始加载\n useEffect(() => {\n loadFiles();\n }, [loadFiles]);\n\n // 文件选择处理\n const handleFileSelect = useCallback((fileId: string, selected: boolean) => {\n setState(prev => {\n const newSelectedFiles = new Set(prev.selectedFiles);\n if (selected) {\n newSelectedFiles.add(fileId);\n } else {\n newSelectedFiles.delete(fileId);\n }\n\n const selectedFileList = prev.files.filter(file => newSelectedFiles.has(file.id));\n \n if (onFileSelect) {\n onFileSelect(selectedFileList);\n }\n\n return {\n ...prev,\n selectedFiles: newSelectedFiles\n };\n });\n }, [onFileSelect, state.files]);\n\n // 全选/取消全选\n const handleSelectAll = useCallback((selected: boolean) => {\n setState(prev => {\n const newSelectedFiles = selected \n ? new Set(prev.files.map(file => file.id))\n : new Set<string>();\n\n const selectedFileList = selected ? prev.files : [];\n \n if (onFileSelect) {\n onFileSelect(selectedFileList);\n }\n\n return {\n ...prev,\n selectedFiles: newSelectedFiles\n };\n });\n }, [onFileSelect, state.files]);\n\n // 删除文件\n const handleDeleteFiles = useCallback(async (fileIds: string[]) => {\n if (!window.confirm('确定要删除选中的 ' + (fileIds.length) + ' 个文件吗?')) {\n return;\n }\n\n setState(prev => ({ ...prev, loading: true }));\n\n try {\n // 这里应该调用实际的删除API\n // await fileService.deleteFiles(fileIds);\n \n console.log('删除文件:', fileIds);\n \n // 重新加载文件列表\n await loadFiles();\n \n setState(prev => ({\n ...prev,\n selectedFiles: new Set(),\n loading: false\n }));\n\n } catch (error) {\n console.error('删除文件失败:', error);\n setState(prev => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : '删除文件失败'\n }));\n }\n }, [loadFiles]);\n\n // 下载文件\n const handleDownloadFile = useCallback(async (file: FileMetadata) => {\n try {\n // 这里应该调用实际的下载API\n // const downloadUrl = await fileService.getDownloadUrl(file.id);\n // window.open(downloadUrl, '_blank');\n \n console.log('下载文件:', file.originalName);\n \n } catch (error) {\n console.error('下载文件失败:', error);\n setState(prev => ({\n ...prev,\n error: error instanceof Error ? error.message : '下载文件失败'\n }));\n }\n }, []);\n\n // 预览文件\n const handlePreviewFile = useCallback((file: FileMetadata) => {\n setState(prev => ({\n ...prev,\n previewFile: file\n }));\n }, []);\n\n // 关闭预览\n const handleClosePreview = useCallback(() => {\n setState(prev => ({\n ...prev,\n previewFile: null\n }));\n }, []);\n\n // 搜索处理\n const handleSearch = useCallback((query: string) => {\n setState(prev => ({\n ...prev,\n searchQuery: query,\n pagination: { ...prev.pagination, page: 1 }\n }));\n }, []);\n\n // 筛选处理\n const handleFilterChange = useCallback((filterType: string, value: any) => {\n setState(prev => ({\n ...prev,\n filters: {\n ...prev.filters,\n [filterType]: value\n },\n pagination: { ...prev.pagination, page: 1 }\n }));\n }, []);\n\n // 排序处理\n const handleSort = useCallback((field: keyof FileMetadata) => {\n setState(prev => ({\n ...prev,\n sortBy: field,\n sortOrder: prev.sortBy === field && prev.sortOrder === 'asc' ? 'desc' : 'asc',\n pagination: { ...prev.pagination, page: 1 }\n }));\n }, []);\n\n // 分页处理\n const handlePageChange = useCallback((page: number) => {\n setState(prev => ({\n ...prev,\n pagination: { ...prev.pagination, page }\n }));\n }, []);\n\n // 格式化文件大小\n const formatFileSize = useCallback((bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }, []);\n\n // 获取文件类型图标\n const getFileTypeIcon = useCallback((mimeType: string): string => {\n if (mimeType.startsWith('image/')) return '🖼️';\n if (mimeType.startsWith('video/')) return '🎬';\n if (mimeType.startsWith('audio/')) return '🎵';\n if (mimeType.includes('pdf')) return '📄';\n if (mimeType.includes('word')) return '📝';\n if (mimeType.includes('excel')) return '📊';\n if (mimeType.includes('powerpoint')) return '📊';\n if (mimeType.includes('zip') || mimeType.includes('rar')) return '📦';\n return '📁';\n }, []);\n\n // 获取文件类型标签\n const getFileTypeLabel = useCallback((mimeType: string): string => {\n for (const [category, types] of Object.entries(MIME_TYPE_CATEGORIES)) {\n if (types.some(type => mimeType.includes(type))) {\n return category;\n }\n }\n return 'other';\n }, []);\n\n // 判断文件是否可预览\n const isPreviewable = useCallback((file: FileMetadata): boolean => {\n return file.mimeType.startsWith('image/') || \n file.mimeType.startsWith('video/') || \n file.mimeType.startsWith('audio/') ||\n file.mimeType.includes('pdf');\n }, []);\n\n // 渲染文件项\n const renderFileItem = useCallback((file: FileMetadata) => {\n const isSelected = state.selectedFiles.has(file.id);\n const typeIcon = getFileTypeIcon(file.mimeType);\n const typeLabel = getFileTypeLabel(file.mimeType);\n \n return (\n <div\n key={file.id}\n className={clsx('relative border rounded-lg p-4 cursor-pointer transition-all duration-200 hover:shadow-md', isSelected ? 'border-blue-500 bg-blue-50' : 'border-gray-200 hover:border-gray-300')}\n onClick={() => handleFileSelect(file.id, !isSelected)}\n >\n {/* 选择复选框 */}\n {allowBatch && (\n <div className=\"absolute top-2 left-2\">\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => {\n e.stopPropagation();\n handleFileSelect(file.id, e.target.checked);\n }}\n className=\"w-4 h-4 text-blue-600 rounded border-gray-300 focus:ring-blue-500\"\n />\n </div>\n )}\n\n {/* 文件图标和信息 */}\n <div className=\"flex flex-col items-center space-y-2\">\n <div className=\"text-4xl\">{typeIcon}</div>\n \n <div className=\"text-center w-full\">\n <h3 className=\"font-medium text-sm text-gray-900 truncate\" title={file.originalName}>\n {file.originalName}\n </h3>\n <p className=\"text-xs text-gray-500 mt-1\">\n {formatFileSize(file.size)}\n </p>\n <p className=\"text-xs text-blue-600 capitalize\">\n {typeLabel}\n </p>\n <p className=\"text-xs text-gray-400\">\n {new Date(file.uploadTime).toLocaleDateString()}\n </p>\n </div>\n </div>\n\n {/* 操作按钮 */}\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <div className=\"flex space-x-1\">\n {showPreview && isPreviewable(file) && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handlePreviewFile(file);\n }}\n className=\"p-1 text-gray-600 hover:text-blue-600 hover:bg-white rounded\"\n title=\"预览\"\n >\n 👁️\n </button>\n )}\n \n {allowDownload && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadFile(file);\n }}\n className=\"p-1 text-gray-600 hover:text-green-600 hover:bg-white rounded\"\n title=\"下载\"\n >\n ⬇️\n </button>\n )}\n \n {allowDelete && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteFiles([file.id]);\n }}\n className=\"p-1 text-gray-600 hover:text-red-600 hover:bg-white rounded\"\n title=\"删除\"\n >\n 🗑️\n </button>\n )}\n </div>\n </div>\n </div>\n );\n }, [\n state.selectedFiles,\n allowBatch,\n allowDownload,\n allowDelete,\n showPreview,\n handleFileSelect,\n handlePreviewFile,\n handleDownloadFile,\n handleDeleteFiles,\n getFileTypeIcon,\n getFileTypeLabel,\n formatFileSize,\n isPreviewable\n ]);\n\n // 渲染搜索栏\n const renderSearchBar = () => {\n if (!showSearch) return null;\n\n return (\n <div className=\"mb-6\">\n <div className=\"relative\">\n <input\n type=\"text\"\n placeholder=\"搜索文件名...\"\n value={state.searchQuery}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <span className=\"text-gray-400\">🔍</span>\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染筛选器\n const renderFilters = () => {\n if (!showFilters) return null;\n\n return (\n <div className=\"mb-6 p-4 bg-gray-50 rounded-lg\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-3\">筛选器</h3>\n \n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {/* 文件类型筛选 */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n 文件类型\n </label>\n <select\n value={state.filters.mimeType}\n onChange={(e) => handleFilterChange('mimeType', e.target.value)}\n className=\"w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"\">全部</option>\n <option value=\"image/\">图片</option>\n <option value=\"video/\">视频</option>\n <option value=\"audio/\">音频</option>\n <option value=\"application/pdf\">PDF</option>\n <option value=\"application/\">文档</option>\n </select>\n </div>\n\n {/* 日期范围筛选 */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n 上传时间\n </label>\n <div className=\"flex space-x-2\">\n <input\n type=\"date\"\n value={state.filters.dateRange.start?.toISOString().split('T')[0] || ''}\n onChange={(e) => handleFilterChange('dateRange', {\n ...state.filters.dateRange,\n start: e.target.value ? new Date(e.target.value) : null\n })}\n className=\"flex-1 px-2 py-1 text-xs border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n />\n <input\n type=\"date\"\n value={state.filters.dateRange.end?.toISOString().split('T')[0] || ''}\n onChange={(e) => handleFilterChange('dateRange', {\n ...state.filters.dateRange,\n end: e.target.value ? new Date(e.target.value) : null\n })}\n className=\"flex-1 px-2 py-1 text-xs border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n\n {/* 清除筛选器 */}\n <div className=\"flex items-end\">\n <button\n onClick={() => setState(prev => ({\n ...prev,\n filters: {\n mimeType: '',\n dateRange: { start: null, end: null },\n sizeRange: { min: 0, max: Number.MAX_SAFE_INTEGER }\n }\n }))}\n className=\"px-3 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\"\n >\n 清除筛选\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染工具栏\n const renderToolbar = () => {\n const selectedCount = state.selectedFiles.size;\n const hasSelection = selectedCount > 0;\n\n return (\n <div className=\"flex items-center justify-between mb-6\">\n <div className=\"flex items-center space-x-4\">\n {/* 全选按钮 */}\n {allowBatch && state.files.length > 0 && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={selectedCount === state.files.length && state.files.length > 0}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"w-4 h-4 text-blue-600 rounded border-gray-300 focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">\n 全选 ({selectedCount}/{state.files.length})\n </span>\n </label>\n )}\n\n {/* 批量操作按钮 */}\n {hasSelection && (\n <div className=\"flex items-center space-x-2\">\n {allowDelete && (\n <button\n onClick={() => handleDeleteFiles(Array.from(state.selectedFiles))}\n className=\"px-3 py-1 text-sm text-red-600 border border-red-300 rounded hover:bg-red-50\"\n >\n 删除选中 ({selectedCount})\n </button>\n )}\n\n {/* 自定义操作 */}\n {customActions.map(action => {\n const selectedFileList = state.files.filter(file => state.selectedFiles.has(file.id));\n const isDisabled = action.disabled?.(selectedFileList) || false;\n \n return (\n <button\n key={action.key}\n onClick={() => action.onClick(selectedFileList)}\n disabled={isDisabled}\n className={clsx('px-3 py-1 text-sm border rounded', isDisabled\n ? 'text-gray-400 border-gray-200 cursor-not-allowed'\n : 'text-blue-600 border-blue-300 hover:bg-blue-50')}\n >\n {action.icon && <span className=\"mr-1\">{action.icon}</span>}\n {action.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center space-x-4\">\n {/* 排序选择 */}\n <select\n value={(state.sortBy) + '-' + (state.sortOrder)}\n onChange={(e) => {\n const [sortBy, sortOrder] = e.target.value.split('-') as [keyof FileMetadata, 'asc' | 'desc'];\n setState(prev => ({ ...prev, sortBy, sortOrder }));\n }}\n className=\"px-3 py-1 text-sm border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"uploadTime-desc\">最新上传</option>\n <option value=\"uploadTime-asc\">最早上传</option>\n <option value=\"originalName-asc\">文件名 A-Z</option>\n <option value=\"originalName-desc\">文件名 Z-A</option>\n <option value=\"size-desc\">文件大小 大-小</option>\n <option value=\"size-asc\">文件大小 小-大</option>\n </select>\n\n {/* 上传按钮 */}\n {allowUpload && (\n <button\n onClick={() => setState(prev => ({ ...prev, showUploadModal: true }))}\n className=\"px-4 py-2 text-sm text-white bg-blue-600 rounded hover:bg-blue-700 focus:ring-2 focus:ring-blue-500\"\n >\n ⬆️ 上传文件\n </button>\n )}\n </div>\n </div>\n );\n };\n\n // 渲染分页\n const renderPagination = () => {\n if (state.pagination.totalPages <= 1) return null;\n\n const { page, totalPages } = state.pagination;\n const pages = [];\n \n // 计算显示的页码范围\n const startPage = Math.max(1, page - 2);\n const endPage = Math.min(totalPages, page + 2);\n\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n\n return (\n <div className=\"flex items-center justify-between mt-6\">\n <div className=\"text-sm text-gray-700\">\n 显示第 {(page - 1) * state.pagination.pageSize + 1} - {Math.min(page * state.pagination.pageSize, state.pagination.total)} 项,\n 共 {state.pagination.total} 项\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => handlePageChange(page - 1)}\n disabled={page <= 1}\n className=\"px-3 py-1 text-sm border rounded disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50\"\n >\n 上一页\n </button>\n\n {pages.map(pageNum => (\n <button\n key={pageNum}\n onClick={() => handlePageChange(pageNum)}\n className={clsx('px-3 py-1 text-sm border rounded', pageNum === page\n ? 'bg-blue-600 text-white border-blue-600'\n : 'hover:bg-gray-50')}\n >\n {pageNum}\n </button>\n ))}\n\n <button\n onClick={() => handlePageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"px-3 py-1 text-sm border rounded disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50\"\n >\n 下一页\n </button>\n </div>\n </div>\n );\n };\n\n return (\n <div className=\"w-full\">\n {/* 错误提示 */}\n {state.error && (\n <div className=\"mb-4 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-800\">{state.error}</p>\n <button\n onClick={() => setState(prev => ({ ...prev, error: null }))}\n className=\"mt-2 text-red-600 hover:text-red-800\"\n >\n 关闭\n </button>\n </div>\n )}\n\n {/* 搜索栏 */}\n {renderSearchBar()}\n\n {/* 筛选器 */}\n {renderFilters()}\n\n {/* 工具栏 */}\n {renderToolbar()}\n\n {/* 文件列表 */}\n <div className=\"min-h-96\">\n {state.loading ? (\n <div className=\"flex items-center justify-center h-32\">\n <div className=\"text-gray-500\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-2\"></div>\n <p>加载中...</p>\n </div>\n </div>\n ) : state.files.length === 0 ? (\n <div className=\"flex items-center justify-center h-32\">\n <div className=\"text-center text-gray-500\">\n <p className=\"text-4xl mb-2\">📁</p>\n <p>暂无文件</p>\n {allowUpload && (\n <button\n onClick={() => setState(prev => ({ ...prev, showUploadModal: true }))}\n className=\"mt-2 text-blue-600 hover:text-blue-800\"\n >\n 点击上传第一个文件\n </button>\n )}\n </div>\n </div>\n ) : (\n <div className={clsx('grid gap-4', mode === 'grid' \n ? 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6'\n : 'grid-cols-1')}>\n {state.files.map(renderFileItem)}\n </div>\n )}\n </div>\n\n {/* 分页 */}\n {renderPagination()}\n\n {/* 文件预览模态框 */}\n {state.previewFile && showPreview && (\n <FilePreviewModal\n file={state.previewFile}\n onClose={handleClosePreview}\n />\n )}\n\n {/* 上传模态框 */}\n {state.showUploadModal && allowUpload && (\n <UploadModal\n moduleId={moduleId}\n businessId={businessId}\n onClose={() => setState(prev => ({ ...prev, showUploadModal: false }))}\n onUploadComplete={(files) => {\n setState(prev => ({ ...prev, showUploadModal: false }));\n if (onUploadComplete) {\n onUploadComplete(files);\n }\n loadFiles(); // 重新加载文件列表\n }}\n />\n )}\n </div>\n );\n};\n\n// 文件预览模态框组件\nexport interface FilePreviewModalProps {\n file: FileMetadata;\n onClose: () => void;\n}\n\nconst FilePreviewModal: React.FC<FilePreviewModalProps> = ({ file, onClose }) => {\n const renderPreviewContent = () => {\n if (file.mimeType.startsWith('image/')) {\n return (\n <img\n src={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n alt={file.originalName}\n className=\"max-w-full max-h-full object-contain\"\n />\n );\n }\n\n if (file.mimeType.startsWith('video/')) {\n return (\n <video\n src={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n controls\n className=\"max-w-full max-h-full\"\n >\n 您的浏览器不支持视频播放\n </video>\n );\n }\n\n if (file.mimeType.startsWith('audio/')) {\n return (\n <div className=\"flex flex-col items-center space-y-4\">\n <div className=\"text-6xl\">🎵</div>\n <audio\n src={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n controls\n className=\"w-full max-w-md\"\n >\n 您的浏览器不支持音频播放\n </audio>\n </div>\n );\n }\n\n if (file.mimeType.includes('pdf')) {\n return (\n <iframe\n src={(file.cdnUrl || '/api/files/'+ (file.id) + '/download') + '#toolbar=0'}\n className=\"w-full h-full min-h-96\"\n title={file.originalName}\n />\n );\n }\n\n return (\n <div className=\"flex flex-col items-center justify-center h-64 text-gray-500\">\n <div className=\"text-4xl mb-4\">📄</div>\n <p>此文件类型暂不支持预览</p>\n <a\n href={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n download={file.originalName}\n className=\"mt-4 px-4 py-2 text-blue-600 border border-blue-300 rounded hover:bg-blue-50\"\n >\n 下载文件\n </a>\n </div>\n );\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50\">\n <div className=\"bg-white rounded-lg max-w-4xl max-h-[90vh] overflow-hidden flex flex-col\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <h2 className=\"text-lg font-medium truncate\" title={file.originalName}>\n {file.originalName}\n </h2>\n <button\n onClick={onClose}\n className=\"p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100\"\n >\n ✕\n </button>\n </div>\n\n {/* 预览内容 */}\n <div className=\"flex-1 p-4 overflow-auto flex items-center justify-center\">\n {renderPreviewContent()}\n </div>\n\n {/* 底部信息 */}\n <div className=\"p-4 border-t bg-gray-50 text-sm text-gray-600\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <span className=\"font-medium\">文件大小:</span>\n {(file.size / 1024 / 1024).toFixed(2)} MB\n </div>\n <div>\n <span className=\"font-medium\">上传时间:</span>\n {new Date(file.uploadTime).toLocaleString()}\n </div>\n <div>\n <span className=\"font-medium\">文件类型:</span>\n {file.mimeType}\n </div>\n <div>\n <span className=\"font-medium\">访问次数:</span>\n {file.accessCount}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// 上传模态框组件\nexport interface UploadModalProps {\n moduleId?: string;\n businessId?: string;\n onClose: () => void;\n onUploadComplete: (files: FileMetadata[]) => void;\n}\n\nconst UploadModal: React.FC<UploadModalProps> = ({\n moduleId,\n businessId,\n onClose,\n onUploadComplete\n}) => {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50\">\n <div className=\"bg-white rounded-lg max-w-2xl w-full max-h-[80vh] overflow-hidden\">\n <div className=\"flex items-center justify-between p-4 border-b\">\n <h2 className=\"text-lg font-medium\">上传文件</h2>\n <button\n onClick={onClose}\n className=\"p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"p-6\">\n <p className=\"text-gray-600 mb-4\">\n 这里将集成UniversalFileUploader组件\n </p>\n \n {/* 这里应该集成 UniversalFileUploader 组件 */}\n <div className=\"border-2 border-dashed border-gray-300 rounded-lg p-8 text-center text-gray-500\">\n <div className=\"text-4xl mb-4\">📁</div>\n <p>拖拽文件到此处或点击选择文件</p>\n <input\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n // 模拟上传完成\n console.log('选择文件:', e.target.files);\n onUploadComplete([]);\n }}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default UniversalFileManager; ","/**\n * 文件夹管理组件\n * 支持创建、重命名、删除文件夹,以及文件夹树形结构显示\n */\n\n'use client';\n\nimport React, { useState, useCallback, useMemo } from 'react';\nimport { FileMetadata } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface FolderNode {\n /** 文件夹ID */\n id: string;\n /** 文件夹名称 */\n name: string;\n /** 父文件夹ID */\n parentId?: string;\n /** 子文件夹 */\n children: FolderNode[];\n /** 文件数量 */\n fileCount: number;\n /** 总大小 */\n totalSize: number;\n /** 创建时间 */\n createdAt: Date;\n /** 更新时间 */\n updatedAt: Date;\n /** 是否展开 */\n expanded?: boolean;\n}\n\nexport interface FolderManagerProps {\n /** 当前文件夹ID */\n currentFolderId?: string;\n /** 文件夹树数据 */\n folderTree: FolderNode[];\n /** 是否显示文件数量 */\n showFileCount?: boolean;\n /** 是否显示文件大小 */\n showSize?: boolean;\n /** 是否允许创建文件夹 */\n allowCreate?: boolean;\n /** 是否允许重命名 */\n allowRename?: boolean;\n /** 是否允许删除 */\n allowDelete?: boolean;\n /** 是否允许拖拽 */\n allowDrag?: boolean;\n /** 文件夹选择回调 */\n onFolderSelect?: (folderId: string) => void;\n /** 文件夹创建回调 */\n onFolderCreate?: (parentId: string | undefined, name: string) => Promise<FolderNode>;\n /** 文件夹重命名回调 */\n onFolderRename?: (folderId: string, newName: string) => Promise<void>;\n /** 文件夹删除回调 */\n onFolderDelete?: (folderId: string) => Promise<void>;\n /** 文件移动回调 */\n onFileMove?: (fileIds: string[], targetFolderId: string) => Promise<void>;\n}\n\ninterface FolderManagerState {\n expandedFolders: Set<string>;\n editingFolder: string | null;\n editingName: string;\n creatingFolder: string | null; // 正在创建子文件夹的父文件夹ID\n newFolderName: string;\n dragOverFolder: string | null;\n contextMenu: {\n folderId: string;\n x: number;\n y: number;\n } | null;\n}\n\nconst FolderManager: React.FC<FolderManagerProps> = ({\n currentFolderId,\n folderTree,\n showFileCount = true,\n showSize = true,\n allowCreate = true,\n allowRename = true,\n allowDelete = true,\n allowDrag = false,\n onFolderSelect,\n onFolderCreate,\n onFolderRename,\n onFolderDelete,\n onFileMove\n}) => {\n const [state, setState] = useState<FolderManagerState>({\n expandedFolders: new Set(currentFolderId ? [currentFolderId] : []),\n editingFolder: null,\n editingName: '',\n creatingFolder: null,\n newFolderName: '',\n dragOverFolder: null,\n contextMenu: null\n });\n\n // 切换文件夹展开状态\n const toggleFolder = useCallback((folderId: string) => {\n setState(prev => {\n const newExpanded = new Set(prev.expandedFolders);\n if (newExpanded.has(folderId)) {\n newExpanded.delete(folderId);\n } else {\n newExpanded.add(folderId);\n }\n return { ...prev, expandedFolders: newExpanded };\n });\n }, []);\n\n // 选择文件夹\n const selectFolder = useCallback((folderId: string) => {\n if (onFolderSelect) {\n onFolderSelect(folderId);\n }\n }, [onFolderSelect]);\n\n // 开始创建文件夹\n const startCreateFolder = useCallback((parentId?: string) => {\n setState(prev => ({\n ...prev,\n creatingFolder: parentId || null,\n newFolderName: '新建文件夹',\n contextMenu: null\n }));\n }, []);\n\n // 确认创建文件夹\n const confirmCreateFolder = useCallback(async () => {\n if (!state.newFolderName.trim() || !onFolderCreate) return;\n\n try {\n await onFolderCreate(state.creatingFolder || undefined, state.newFolderName.trim());\n setState(prev => ({\n ...prev,\n creatingFolder: null,\n newFolderName: ''\n }));\n } catch (error) {\n console.error('创建文件夹失败:', error);\n }\n }, [state.creatingFolder, state.newFolderName, onFolderCreate]);\n\n // 取消创建文件夹\n const cancelCreateFolder = useCallback(() => {\n setState(prev => ({\n ...prev,\n creatingFolder: null,\n newFolderName: ''\n }));\n }, []);\n\n // 开始重命名文件夹\n const startRenameFolder = useCallback((folderId: string, currentName: string) => {\n setState(prev => ({\n ...prev,\n editingFolder: folderId,\n editingName: currentName,\n contextMenu: null\n }));\n }, []);\n\n // 确认重命名文件夹\n const confirmRenameFolder = useCallback(async () => {\n if (!state.editingFolder || !state.editingName.trim() || !onFolderRename) return;\n\n try {\n await onFolderRename(state.editingFolder, state.editingName.trim());\n setState(prev => ({\n ...prev,\n editingFolder: null,\n editingName: ''\n }));\n } catch (error) {\n console.error('重命名文件夹失败:', error);\n }\n }, [state.editingFolder, state.editingName, onFolderRename]);\n\n // 取消重命名文件夹\n const cancelRenameFolder = useCallback(() => {\n setState(prev => ({\n ...prev,\n editingFolder: null,\n editingName: ''\n }));\n }, []);\n\n // 删除文件夹\n const deleteFolder = useCallback(async (folderId: string, folderName: string) => {\n if (!window.confirm('确定要删除文件夹\"' + (folderName) + '\"吗?此操作将删除文件夹内的所有文件。')) {\n return;\n }\n\n if (!onFolderDelete) return;\n\n try {\n await onFolderDelete(folderId);\n setState(prev => ({ ...prev, contextMenu: null }));\n } catch (error) {\n console.error('删除文件夹失败:', error);\n }\n }, [onFolderDelete]);\n\n // 右键菜单处理\n const handleContextMenu = useCallback((e: React.MouseEvent, folderId: string) => {\n e.preventDefault();\n setState(prev => ({\n ...prev,\n contextMenu: {\n folderId,\n x: e.clientX,\n y: e.clientY\n }\n }));\n }, []);\n\n // 关闭右键菜单\n const closeContextMenu = useCallback(() => {\n setState(prev => ({ ...prev, contextMenu: null }));\n }, []);\n\n // 拖拽处理\n const handleDragOver = useCallback((e: React.DragEvent, folderId: string) => {\n if (!allowDrag) return;\n e.preventDefault();\n setState(prev => ({ ...prev, dragOverFolder: folderId }));\n }, [allowDrag]);\n\n const handleDragLeave = useCallback(() => {\n setState(prev => ({ ...prev, dragOverFolder: null }));\n }, []);\n\n const handleDrop = useCallback(async (e: React.DragEvent, folderId: string) => {\n if (!allowDrag || !onFileMove) return;\n \n e.preventDefault();\n setState(prev => ({ ...prev, dragOverFolder: null }));\n\n try {\n const fileIds = JSON.parse(e.dataTransfer.getData('application/json'));\n await onFileMove(fileIds, folderId);\n } catch (error) {\n console.error('移动文件失败:', error);\n }\n }, [allowDrag, onFileMove]);\n\n // 格式化文件大小\n const formatSize = useCallback((bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }, []);\n\n // 渲染文件夹节点\n const renderFolderNode = useCallback((folder: FolderNode, level: number = 0) => {\n const isExpanded = state.expandedFolders.has(folder.id);\n const isSelected = currentFolderId === folder.id;\n const isEditing = state.editingFolder === folder.id;\n const isDragOver = state.dragOverFolder === folder.id;\n\n return (\n <div key={folder.id} className=\"select-none\">\n {/* 文件夹项 */}\n <div\n className={clsx('flex items-center py-1 px-2 rounded-md cursor-pointer transition-colors', isSelected \n ? 'bg-blue-100 text-blue-800' \n : isDragOver\n ? 'bg-green-100'\n : 'hover:bg-gray-100')}\n style={{ paddingLeft: (level * 16 + 8) + 'px' }}\n onClick={() => selectFolder(folder.id)}\n onContextMenu={(e) => handleContextMenu(e, folder.id)}\n onDragOver={allowDrag ? (e) => handleDragOver(e, folder.id) : undefined}\n onDragLeave={allowDrag ? handleDragLeave : undefined}\n onDrop={allowDrag ? (e) => handleDrop(e, folder.id) : undefined}\n >\n {/* 展开图标 */}\n {folder.children.length > 0 && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleFolder(folder.id);\n }}\n className=\"mr-1 p-1 hover:bg-gray-200 rounded\"\n >\n <span className={clsx('text-xs transition-transform', isExpanded ? 'rotate-90' : '')}>\n ▶\n </span>\n </button>\n )}\n\n {/* 文件夹图标 */}\n <span className=\"mr-2 text-yellow-600\">\n {isExpanded ? '📂' : '📁'}\n </span>\n\n {/* 文件夹名称 */}\n <div className=\"flex-1 flex items-center justify-between\">\n {isEditing ? (\n <input\n type=\"text\"\n value={state.editingName}\n onChange={(e) => setState(prev => ({ ...prev, editingName: e.target.value }))}\n onBlur={confirmRenameFolder}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n confirmRenameFolder();\n } else if (e.key === 'Escape') {\n cancelRenameFolder();\n }\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500\"\n autoFocus\n />\n ) : (\n <span className=\"text-sm truncate\">{folder.name}</span>\n )}\n\n {/* 文件信息 */}\n <div className=\"flex items-center space-x-2 text-xs text-gray-500 ml-2\">\n {showFileCount && (\n <span>{folder.fileCount} 项</span>\n )}\n {showSize && folder.totalSize > 0 && (\n <span>{formatSize(folder.totalSize)}</span>\n )}\n </div>\n </div>\n </div>\n\n {/* 创建新文件夹输入框 */}\n {state.creatingFolder === folder.id && (\n <div\n className=\"flex items-center py-1 px-2 ml-4\"\n style={{ paddingLeft: ((level + 1) * 16 + 8) + 'px' }}\n >\n <span className=\"mr-2 text-yellow-600\">📁</span>\n <input\n type=\"text\"\n value={state.newFolderName}\n onChange={(e) => setState(prev => ({ ...prev, newFolderName: e.target.value }))}\n onBlur={confirmCreateFolder}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n confirmCreateFolder();\n } else if (e.key === 'Escape') {\n cancelCreateFolder();\n }\n }}\n className=\"flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500\"\n autoFocus\n />\n </div>\n )}\n\n {/* 子文件夹 */}\n {isExpanded && folder.children.map(child => \n renderFolderNode(child, level + 1)\n )}\n </div>\n );\n }, [\n state.expandedFolders,\n state.editingFolder,\n state.editingName,\n state.creatingFolder,\n state.newFolderName,\n state.dragOverFolder,\n currentFolderId,\n allowDrag,\n showFileCount,\n showSize,\n selectFolder,\n toggleFolder,\n handleContextMenu,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n confirmRenameFolder,\n cancelRenameFolder,\n confirmCreateFolder,\n cancelCreateFolder,\n formatSize\n ]);\n\n // 渲染右键菜单\n const renderContextMenu = () => {\n if (!state.contextMenu) return null;\n\n const folder = findFolderById(folderTree, state.contextMenu.folderId);\n if (!folder) return null;\n\n return (\n <div\n className=\"fixed bg-white border border-gray-200 rounded-md shadow-lg z-[50] py-1\"\n style={{\n left: state.contextMenu.x,\n top: state.contextMenu.y\n }}\n onClick={closeContextMenu}\n >\n {allowCreate && (\n <button\n onClick={() => startCreateFolder(folder.id)}\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-gray-100 flex items-center\"\n >\n <span className=\"mr-2\">📁</span>\n 新建子文件夹\n </button>\n )}\n \n {allowRename && (\n <button\n onClick={() => startRenameFolder(folder.id, folder.name)}\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-gray-100 flex items-center\"\n >\n <span className=\"mr-2\">✏️</span>\n 重命名\n </button>\n )}\n \n {allowDelete && (\n <button\n onClick={() => deleteFolder(folder.id, folder.name)}\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-gray-100 text-red-600 flex items-center\"\n >\n <span className=\"mr-2\">🗑️</span>\n 删除文件夹\n </button>\n )}\n </div>\n );\n };\n\n // 根据ID查找文件夹\n const findFolderById = (folders: FolderNode[], id: string): FolderNode | null => {\n for (const folder of folders) {\n if (folder.id === id) return folder;\n const found = findFolderById(folder.children, id);\n if (found) return found;\n }\n return null;\n };\n\n // 点击外部关闭菜单\n React.useEffect(() => {\n if (!state.contextMenu) return;\n\n const handleClickOutside = () => {\n closeContextMenu();\n };\n\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n }, [state.contextMenu, closeContextMenu]);\n\n return (\n <div className=\"relative\">\n {/* 工具栏 */}\n <div className=\"flex items-center justify-between p-2 border-b bg-gray-50\">\n <h3 className=\"text-sm font-medium text-gray-700\">文件夹</h3>\n {allowCreate && (\n <button\n onClick={() => startCreateFolder()}\n className=\"px-2 py-1 text-xs text-blue-600 border border-blue-300 rounded hover:bg-blue-50\"\n title=\"新建文件夹\"\n >\n ➕\n </button>\n )}\n </div>\n\n {/* 文件夹树 */}\n <div className=\"p-2 max-h-96 overflow-y-auto\">\n {folderTree.length === 0 ? (\n <div className=\"text-center text-gray-500 py-8\">\n <div className=\"text-2xl mb-2\">📁</div>\n <p className=\"text-sm\">暂无文件夹</p>\n {allowCreate && (\n <button\n onClick={() => startCreateFolder()}\n className=\"mt-2 text-blue-600 hover:text-blue-800 text-sm\"\n >\n 创建第一个文件夹\n </button>\n )}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {folderTree.map(folder => renderFolderNode(folder))}\n </div>\n )}\n\n {/* 根目录创建文件夹 */}\n {state.creatingFolder === null && (\n <div className=\"flex items-center py-1 px-2\">\n <span className=\"mr-2 text-yellow-600\">📁</span>\n <input\n type=\"text\"\n value={state.newFolderName}\n onChange={(e) => setState(prev => ({ ...prev, newFolderName: e.target.value }))}\n onBlur={confirmCreateFolder}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n confirmCreateFolder();\n } else if (e.key === 'Escape') {\n cancelCreateFolder();\n }\n }}\n className=\"flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500\"\n autoFocus\n />\n </div>\n )}\n </div>\n\n {/* 右键菜单 */}\n {renderContextMenu()}\n </div>\n );\n};\n\nexport default FolderManager; ","/**\n * 文件分享模态框组件\n * 支持生成分享链接、设置访问权限、过期时间等\n */\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { FileMetadata } from '../types';\n\nexport interface FileShareModalProps {\n /** 要分享的文件 */\n files: FileMetadata[];\n /** 关闭回调 */\n onClose: () => void;\n /** 分享成功回调 */\n onShareSuccess?: (shareInfo: ShareInfo) => void;\n}\n\nexport interface ShareInfo {\n /** 分享链接 */\n shareUrl: string;\n /** 访问密码 */\n password?: string;\n /** 过期时间 */\n expiresAt?: Date;\n /** 访问权限 */\n permission: 'view' | 'download';\n /** 分享代码 */\n shareCode: string;\n}\n\ninterface ShareOptions {\n /** 过期时间类型 */\n expireType: 'never' | '1hour' | '1day' | '7days' | '30days' | 'custom';\n /** 自定义过期时间 */\n customExpireTime?: Date;\n /** 是否需要密码 */\n requirePassword: boolean;\n /** 访问密码 */\n password: string;\n /** 访问权限 */\n permission: 'view' | 'download';\n /** 允许的下载次数 */\n downloadLimit?: number;\n}\n\nconst FileShareModal: React.FC<FileShareModalProps> = ({\n files,\n onClose,\n onShareSuccess\n}) => {\n const [shareOptions, setShareOptions] = useState<ShareOptions>({\n expireType: '7days',\n requirePassword: false,\n password: '',\n permission: 'view',\n downloadLimit: undefined\n });\n\n const [loading, setLoading] = useState(false);\n const [shareInfo, setShareInfo] = useState<ShareInfo | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // 生成随机密码\n const generatePassword = useCallback(() => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let password = '';\n for (let i = 0; i < 6; i++) {\n password += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n setShareOptions(prev => ({ ...prev, password }));\n }, []);\n\n // 计算过期时间\n const getExpiresAt = useCallback((): Date | undefined => {\n const now = new Date();\n switch (shareOptions.expireType) {\n case 'never':\n return undefined;\n case '1hour':\n return new Date(now.getTime() + 60 * 60 * 1000);\n case '1day':\n return new Date(now.getTime() + 24 * 60 * 60 * 1000);\n case '7days':\n return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);\n case '30days':\n return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n case 'custom':\n return shareOptions.customExpireTime;\n default:\n return undefined;\n }\n }, [shareOptions.expireType, shareOptions.customExpireTime]);\n\n // 创建分享\n const handleCreateShare = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const expiresAt = getExpiresAt();\n \n // 这里应该调用实际的分享API\n // const shareResult = await fileService.createShare({\n // fileIds: files.map(f => f.id),\n // password: shareOptions.requirePassword ? shareOptions.password : undefined,\n // expiresAt,\n // permission: shareOptions.permission,\n // downloadLimit: shareOptions.downloadLimit\n // });\n\n // 模拟API调用\n const mockShareInfo: ShareInfo = {\n shareUrl: (window.location.origin) + '/share/' + (generateShareCode()),\n password: shareOptions.requirePassword ? shareOptions.password : undefined,\n expiresAt,\n permission: shareOptions.permission,\n shareCode: generateShareCode()\n };\n\n setShareInfo(mockShareInfo);\n \n if (onShareSuccess) {\n onShareSuccess(mockShareInfo);\n }\n\n } catch (error) {\n console.error('创建分享失败:', error);\n setError(error instanceof Error ? error.message : '创建分享失败');\n } finally {\n setLoading(false);\n }\n }, [files, shareOptions, getExpiresAt, onShareSuccess]);\n\n // 生成分享代码\n const generateShareCode = useCallback(() => {\n return Math.random().toString(36).substring(2, 10).toUpperCase();\n }, []);\n\n // 复制到剪贴板\n const copyToClipboard = useCallback(async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n // 这里可以显示复制成功提示\n console.log('复制成功');\n } catch (error) {\n console.error('复制失败:', error);\n // 备用方案\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n }\n }, []);\n\n // 格式化文件列表\n const formatFileList = useCallback(() => {\n if (files.length === 0) return '0 个文件';\n if (files.length === 1 && files[0]) {\n return files[0].originalName;\n }\n return (files.length) + ' 个文件';\n }, [files]);\n\n // 渲染分享设置\n const renderShareSettings = () => {\n if (shareInfo) return null;\n\n return (\n <div className=\"space-y-6\">\n {/* 文件信息 */}\n <div className=\"bg-gray-50 p-4 rounded-lg\">\n <h3 className=\"font-medium text-gray-900 mb-2\">要分享的文件</h3>\n <div className=\"space-y-2\">\n {files.map(file => (\n <div key={file.id} className=\"flex items-center justify-between text-sm\">\n <span className=\"text-gray-700 truncate\">{file.originalName}</span>\n <span className=\"text-gray-500 text-xs\">\n {(file.size / 1024 / 1024).toFixed(2)} MB\n </span>\n </div>\n ))}\n </div>\n </div>\n\n {/* 过期时间设置 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 过期时间\n </label>\n <select\n value={shareOptions.expireType}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n expireType: e.target.value as ShareOptions['expireType']\n }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"never\">永不过期</option>\n <option value=\"1hour\">1小时后</option>\n <option value=\"1day\">1天后</option>\n <option value=\"7days\">7天后</option>\n <option value=\"30days\">30天后</option>\n <option value=\"custom\">自定义时间</option>\n </select>\n\n {shareOptions.expireType === 'custom' && (\n <div className=\"mt-2\">\n <input\n type=\"datetime-local\"\n value={shareOptions.customExpireTime?.toISOString().slice(0, 16) || ''}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n customExpireTime: e.target.value ? new Date(e.target.value) : undefined\n }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n min={new Date().toISOString().slice(0, 16)}\n />\n </div>\n )}\n </div>\n\n {/* 访问权限 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 访问权限\n </label>\n <div className=\"space-y-2\">\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"permission\"\n value=\"view\"\n checked={shareOptions.permission === 'view'}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n permission: e.target.value as 'view' | 'download'\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm\">仅预览(不允许下载)</span>\n </label>\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"permission\"\n value=\"download\"\n checked={shareOptions.permission === 'download'}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n permission: e.target.value as 'view' | 'download'\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm\">允许下载</span>\n </label>\n </div>\n </div>\n\n {/* 访问密码 */}\n <div>\n <label className=\"flex items-center mb-2\">\n <input\n type=\"checkbox\"\n checked={shareOptions.requirePassword}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n requirePassword: e.target.checked,\n password: e.target.checked ? prev.password : ''\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm font-medium text-gray-700\">设置访问密码</span>\n </label>\n\n {shareOptions.requirePassword && (\n <div className=\"flex space-x-2\">\n <input\n type=\"text\"\n value={shareOptions.password}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n password: e.target.value\n }))}\n placeholder=\"输入访问密码\"\n className=\"flex-1 px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n maxLength={20}\n />\n <button\n type=\"button\"\n onClick={generatePassword}\n className=\"px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 随机生成\n </button>\n </div>\n )}\n </div>\n\n {/* 下载次数限制 */}\n {shareOptions.permission === 'download' && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 下载次数限制\n </label>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={shareOptions.downloadLimit !== undefined}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n downloadLimit: e.target.checked ? 10 : undefined\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm text-gray-700\">限制下载次数</span>\n {shareOptions.downloadLimit !== undefined && (\n <input\n type=\"number\"\n value={shareOptions.downloadLimit}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n downloadLimit: parseInt(e.target.value) || 1\n }))}\n min={1}\n max={1000}\n className=\"w-20 px-2 py-1 text-sm border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n />\n )}\n </div>\n </div>\n )}\n </div>\n );\n };\n\n // 渲染分享结果\n const renderShareResult = () => {\n if (!shareInfo) return null;\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <div className=\"text-4xl mb-4\">✅</div>\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">\n 分享链接已创建\n </h3>\n <p className=\"text-sm text-gray-600\">\n {formatFileList()} 已成功创建分享链接\n </p>\n </div>\n\n {/* 分享链接 */}\n <div className=\"bg-gray-50 p-4 rounded-lg\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 分享链接\n </label>\n <div className=\"flex space-x-2\">\n <input\n type=\"text\"\n value={shareInfo.shareUrl}\n readOnly\n className=\"flex-1 px-3 py-2 text-sm bg-white border border-gray-300 rounded-md\"\n />\n <button\n onClick={() => copyToClipboard(shareInfo.shareUrl)}\n className=\"px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 复制链接\n </button>\n </div>\n </div>\n\n {/* 访问密码 */}\n {shareInfo.password && (\n <div className=\"bg-yellow-50 p-4 rounded-lg\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 访问密码\n </label>\n <div className=\"flex space-x-2\">\n <input\n type=\"text\"\n value={shareInfo.password}\n readOnly\n className=\"flex-1 px-3 py-2 text-sm bg-white border border-gray-300 rounded-md\"\n />\n <button\n onClick={() => copyToClipboard(shareInfo.password!)}\n className=\"px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 复制密码\n </button>\n </div>\n <p className=\"text-xs text-yellow-800 mt-2\">\n ⚠️ 请妥善保管访问密码,访问者需要此密码才能查看文件\n </p>\n </div>\n )}\n\n {/* 分享信息 */}\n <div className=\"bg-blue-50 p-4 rounded-lg\">\n <h4 className=\"text-sm font-medium text-blue-900 mb-2\">分享信息</h4>\n <div className=\"space-y-1 text-sm text-blue-800\">\n <div>\n <span className=\"font-medium\">权限:</span>\n {shareInfo.permission === 'view' ? '仅预览' : '允许下载'}\n </div>\n {shareInfo.expiresAt && (\n <div>\n <span className=\"font-medium\">过期时间:</span>\n {shareInfo.expiresAt.toLocaleString()}\n </div>\n )}\n <div>\n <span className=\"font-medium\">分享代码:</span>\n {shareInfo.shareCode}\n </div>\n </div>\n </div>\n\n {/* 复制完整信息 */}\n <div className=\"flex space-x-2\">\n <button\n onClick={() => {\n const shareText = [\n '文件分享:' + (formatFileList()),\n '链接:' + (shareInfo.shareUrl),\n shareInfo.password ? '密码:' + (shareInfo.password) : '',\n shareInfo.expiresAt ? '过期时间:' + (shareInfo.expiresAt.toLocaleString()) : '永不过期'\n ].filter(Boolean).join('\\n');\n \n copyToClipboard(shareText);\n }}\n className=\"flex-1 px-4 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 📋 复制完整信息\n </button>\n <button\n onClick={() => {\n // 生成二维码或其他分享方式\n console.log('其他分享方式');\n }}\n className=\"px-4 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\"\n >\n 🔗 其他分享方式\n </button>\n </div>\n </div>\n );\n };\n\n return (\n <div className=\"fixed inset-0 z-[50] flex items-center justify-center bg-black bg-opacity-50\">\n <div className=\"bg-white rounded-lg max-w-md w-full max-h-[90vh] overflow-hidden\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <h2 className=\"text-lg font-medium\">\n {shareInfo ? '分享成功' : '创建分享链接'}\n </h2>\n <button\n onClick={onClose}\n className=\"p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100\"\n >\n ✕\n </button>\n </div>\n\n {/* 内容 */}\n <div className=\"p-6 max-h-[calc(90vh-120px)] overflow-y-auto\">\n {/* 错误提示 */}\n {error && (\n <div className=\"mb-4 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-800 text-sm\">{error}</p>\n </div>\n )}\n\n {renderShareSettings()}\n {renderShareResult()}\n </div>\n\n {/* 底部按钮 */}\n {!shareInfo && (\n <div className=\"flex items-center justify-end space-x-2 p-4 border-t bg-gray-50\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\"\n >\n 取消\n </button>\n <button\n onClick={handleCreateShare}\n disabled={loading || (shareOptions.requirePassword && !shareOptions.password)}\n className=\"px-4 py-2 text-sm text-white bg-blue-600 rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading ? (\n <span className=\"flex items-center\">\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2\"></div>\n 创建中...\n </span>\n ) : (\n '创建分享链接'\n )}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FileShareModal; "]}
|
|
1
|
+
{"version":3,"sources":["../../src/universalFile/constants.ts","../../src/universalFile/utils.ts","../../src/universalFile/client.ts","../../src/universalFile/components/FileUploader.tsx","../../src/universalFile/components/UniversalFileManager.tsx","../../src/universalFile/components/FolderManager.tsx","../../src/universalFile/components/FileShareModal.tsx"],"names":["React","validateFile","error","formatFileSize","useState","useCallback","clsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 通用文件服务常量定义\n */\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_FILE_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_FILE_NAME = '@qhr123/sa2kit/universalFile';\n\n// ============= 文件大小限制 =============\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大图片大小(字节) - 10MB */\nexport const DEFAULT_MAX_IMAGE_SIZE = 10 * 1024 * 1024;\n\n/** 默认最大视频大小(字节) - 500MB */\nexport const DEFAULT_MAX_VIDEO_SIZE = 500 * 1024 * 1024;\n\n/** 默认最大音频大小(字节) - 50MB */\nexport const DEFAULT_MAX_AUDIO_SIZE = 50 * 1024 * 1024;\n\n/** 默认最大文档大小(字节) - 20MB */\nexport const DEFAULT_MAX_DOCUMENT_SIZE = 20 * 1024 * 1024;\n\n// ============= MIME类型 =============\n\n/** 图片MIME类型 */\nexport const IMAGE_MIME_TYPES = [\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n];\n\n/** 视频MIME类型 */\nexport const VIDEO_MIME_TYPES = [\n 'video/mp4',\n 'video/mpeg',\n 'video/quicktime',\n 'video/x-msvideo',\n 'video/webm',\n];\n\n/** 音频MIME类型 */\nexport const AUDIO_MIME_TYPES = ['audio/mpeg', 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/aac'];\n\n/** 文档MIME类型 */\nexport const DOCUMENT_MIME_TYPES = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/plain',\n];\n\n/** 所有支持的MIME类型 */\nexport const ALL_SUPPORTED_MIME_TYPES = [\n ...IMAGE_MIME_TYPES,\n ...VIDEO_MIME_TYPES,\n ...AUDIO_MIME_TYPES,\n ...DOCUMENT_MIME_TYPES,\n];\n\n// ============= 文件扩展名 =============\n\n/** 图片扩展名 */\nexport const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'];\n\n/** 视频扩展名 */\nexport const VIDEO_EXTENSIONS = ['.mp4', '.mpeg', '.mov', '.avi', '.webm'];\n\n/** 音频扩展名 */\nexport const AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.aac'];\n\n/** 文档扩展名 */\nexport const DOCUMENT_EXTENSIONS = [\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n];\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-file';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 上传文件 */\n UPLOAD: (API_BASE_PATH) + '/upload',\n /** 获取文件URL */\n GET_URL: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId) + '/url',\n /** 获取文件元数据 */\n GET_METADATA: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId),\n /** 删除文件 */\n DELETE: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId),\n /** 查询文件列表 */\n QUERY: (API_BASE_PATH) + '/files',\n /** 批量删除 */\n BATCH_DELETE: (API_BASE_PATH) + '/files/batch-delete',\n /** 获取上传进度 */\n GET_PROGRESS: (fileId: string) => (API_BASE_PATH) + '/upload/' + (fileId) + '/progress',\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 文件上传错误 */\n FILE_UPLOAD_ERROR: 'FILE_UPLOAD_ERROR',\n /** 文件大小超限 */\n FILE_SIZE_EXCEEDED: 'FILE_SIZE_EXCEEDED',\n /** 文件类型不支持 */\n FILE_TYPE_NOT_SUPPORTED: 'FILE_TYPE_NOT_SUPPORTED',\n /** 文件不存在 */\n FILE_NOT_FOUND: 'FILE_NOT_FOUND',\n /** 文件处理错误 */\n FILE_PROCESSING_ERROR: 'FILE_PROCESSING_ERROR',\n /** 存储提供者错误 */\n STORAGE_PROVIDER_ERROR: 'STORAGE_PROVIDER_ERROR',\n /** CDN提供者错误 */\n CDN_PROVIDER_ERROR: 'CDN_PROVIDER_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 权限不足 */\n FORBIDDEN: 'FORBIDDEN',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n\n// ============= 默认配置 =============\n\n/** 默认分页大小 */\nexport const DEFAULT_PAGE_SIZE = 20;\n\n/** 默认请求超时时间(毫秒) - 30秒 */\nexport const DEFAULT_REQUEST_TIMEOUT = 30000;\n\n/** 默认上传超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_UPLOAD_TIMEOUT = 300000;\n\n/** 默认分片上传大小(字节) - 5MB */\nexport const DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;\n","/**\n * 通用文件服务工具函数\n */\n\nimport {\n IMAGE_MIME_TYPES,\n VIDEO_MIME_TYPES,\n AUDIO_MIME_TYPES,\n DOCUMENT_MIME_TYPES,\n} from './constants';\n\n// ============= 文件大小处理 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return ((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + (units[i]);\n}\n\n/**\n * 解析文件大小字符串\n */\nexport function parseFileSize(sizeStr: string): number {\n const match = sizeStr.match(/^(\\d+(?:\\.\\d+)?)\\s*([KMGT]?B)$/i);\n if (!match || !match[1] || !match[2]) return 0;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n\n const units: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n };\n\n return value * (units[unit] || 1);\n}\n\n// ============= MIME类型处理 =============\n\n/**\n * 获取文件扩展名\n */\nexport function getFileExtension(fileName: string): string {\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot === -1) return '';\n return fileName.substring(lastDot).toLowerCase();\n}\n\n/**\n * 根据文件名获取MIME类型\n */\nexport function getMimeTypeFromFileName(fileName: string): string {\n const ext = getFileExtension(fileName);\n\n const mimeMap: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n };\n\n return mimeMap[ext] || 'application/octet-stream';\n}\n\n/**\n * 检查MIME类型是否支持\n */\nexport function isMimeTypeSupported(mimeType: string, allowedTypes?: string[]): boolean {\n if (allowedTypes && allowedTypes.length > 0) {\n return allowedTypes.includes(mimeType);\n }\n\n return (\n IMAGE_MIME_TYPES.includes(mimeType) ||\n VIDEO_MIME_TYPES.includes(mimeType) ||\n AUDIO_MIME_TYPES.includes(mimeType) ||\n DOCUMENT_MIME_TYPES.includes(mimeType)\n );\n}\n\n/**\n * 判断是否为图片类型\n */\nexport function isImageFile(mimeType: string): boolean {\n return IMAGE_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为视频类型\n */\nexport function isVideoFile(mimeType: string): boolean {\n return VIDEO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为音频类型\n */\nexport function isAudioFile(mimeType: string): boolean {\n return AUDIO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为文档类型\n */\nexport function isDocumentFile(mimeType: string): boolean {\n return DOCUMENT_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 获取文件类型类别\n */\nexport function getFileCategory(\n mimeType: string\n): 'image' | 'video' | 'audio' | 'document' | 'other' {\n if (isImageFile(mimeType)) return 'image';\n if (isVideoFile(mimeType)) return 'video';\n if (isAudioFile(mimeType)) return 'audio';\n if (isDocumentFile(mimeType)) return 'document';\n return 'other';\n}\n\n// ============= 文件名处理 =============\n\n/**\n * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n // 检查是否以点开头\n if (fileName.startsWith('.')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName\n .replace(/[<>:\"|?*\\/\\\\]/g, '_')\n .replace(/^\\.+/, '')\n .substring(0, 255);\n}\n\n/**\n * 生成唯一文件名\n */\nexport function generateUniqueFileName(originalName: string, fileId: string): string {\n const ext = getFileExtension(originalName);\n return (fileId) + (ext);\n}\n\n// ============= 存储路径处理 =============\n\n/**\n * 生成存储路径\n */\nexport function generateStoragePath(\n moduleId: string,\n fileName: string,\n options?: {\n businessId?: string;\n useDate?: boolean;\n customPrefix?: string;\n }\n): string {\n const parts: string[] = [];\n\n // 添加自定义前缀\n if (options?.customPrefix) {\n parts.push(options.customPrefix);\n }\n\n // 添加模块标识\n parts.push(moduleId);\n\n // 添加业务标识\n if (options?.businessId) {\n parts.push(options.businessId);\n }\n\n // 添加日期路径\n if (options?.useDate !== false) {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n parts.push(String(year), month, day);\n }\n\n // 添加文件名\n parts.push(fileName);\n\n return parts.join('/');\n}\n\n/**\n * 解析存储路径\n */\nexport function parseStoragePath(path: string): {\n moduleId?: string;\n businessId?: string;\n year?: string;\n month?: string;\n day?: string;\n fileName: string;\n} {\n const parts = path.split('/');\n const fileName = parts[parts.length - 1] || '';\n\n return {\n moduleId: parts[0] || undefined,\n businessId: parts.length > 5 ? parts[1] : undefined,\n year: parts.length > 3 ? parts[parts.length - 4] : undefined,\n month: parts.length > 2 ? parts[parts.length - 3] : undefined,\n day: parts.length > 1 ? parts[parts.length - 2] : undefined,\n fileName,\n };\n}\n\n// ============= 文件验证 =============\n\n/**\n * 验证文件大小\n */\nexport function validateFileSize(file: File, maxSize: number): { valid: boolean; error?: string } {\n if (file.size > maxSize) {\n return {\n valid: false,\n error: '文件大小超过限制: ' + (formatFileSize(file.size)) + ' > ' + (formatFileSize(maxSize)),\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件类型\n */\nexport function validateFileType(\n file: File,\n allowedTypes?: string[]\n): { valid: boolean; error?: string } {\n const mimeType = file.type || getMimeTypeFromFileName(file.name);\n\n if (!isMimeTypeSupported(mimeType, allowedTypes)) {\n return {\n valid: false,\n error: '不支持的文件类型: ' + (mimeType),\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件\n */\nexport function validateFile(\n file: File,\n options?: {\n maxSize?: number;\n allowedTypes?: string[];\n }\n): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证文件名\n if (!validateFileName(file.name)) {\n errors.push('文件名包含非法字符或长度不合法');\n }\n\n // 验证文件大小\n if (options?.maxSize) {\n const sizeResult = validateFileSize(file, options.maxSize);\n if (!sizeResult.valid && sizeResult.error) {\n errors.push(sizeResult.error);\n }\n }\n\n // 验证文件类型\n if (options?.allowedTypes) {\n const typeResult = validateFileType(file, options.allowedTypes);\n if (!typeResult.valid && typeResult.error) {\n errors.push(typeResult.error);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= URL处理 =============\n\n/**\n * 构建查询字符串\n */\nexport function buildQueryString(params: Record<string, any>): string {\n const searchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((v) => searchParams.append(key, String(v)));\n } else {\n searchParams.append(key, String(value));\n }\n }\n });\n\n const queryString = searchParams.toString();\n return queryString ? '?' + (queryString) : '';\n}\n\n/**\n * 解析URL查询参数\n */\nexport function parseQueryString(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n const urlObj = new URL(url, window.location.origin);\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\n// ============= 进度计算 =============\n\n/**\n * 计算上传进度\n */\nexport function calculateProgress(uploadedBytes: number, totalBytes: number): number {\n if (totalBytes === 0) return 0;\n return Math.min(Math.round((uploadedBytes / totalBytes) * 100), 100);\n}\n\n/**\n * 计算上传速度\n */\nexport function calculateSpeed(uploadedBytes: number, elapsedTime: number): number {\n if (elapsedTime === 0) return 0;\n return uploadedBytes / (elapsedTime / 1000); // 字节/秒\n}\n\n/**\n * 计算剩余时间\n */\nexport function calculateRemainingTime(\n uploadedBytes: number,\n totalBytes: number,\n speed: number\n): number {\n if (speed === 0) return 0;\n const remainingBytes = totalBytes - uploadedBytes;\n return Math.round(remainingBytes / speed); // 秒\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建文件错误对象\n */\nexport function createFileError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n\n return '未知错误';\n}\n\n// ============= 文件读取 =============\n\n/**\n * 读取文件为Base64\n */\nexport function readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result as string;\n // 移除Data URL前缀\n const base64 = result.split(',')[1] || '';\n resolve(base64);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 读取文件为ArrayBuffer\n */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as ArrayBuffer);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsArrayBuffer(file);\n });\n}\n\n/**\n * 读取文件为文本\n */\nexport function readFileAsText(file: File, encoding: string = 'UTF-8'): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsText(file, encoding);\n });\n}\n","/**\n * 通用文件服务客户端SDK\n *\n * 提供文件上传、下载、查询等功能的客户端接口\n */\n\nimport type {\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n} from './types';\nimport {\n API_ENDPOINTS,\n ERROR_CODES,\n DEFAULT_REQUEST_TIMEOUT,\n DEFAULT_UPLOAD_TIMEOUT,\n} from './constants';\nimport { createFileError, formatErrorMessage, buildQueryString } from './utils';\n\n// ============= 配置类型 =============\n\nexport interface UniversalFileClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 上传超时时间(毫秒) */\n uploadTimeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用文件服务客户端\n */\nexport class UniversalFileClient {\n private config: Required<UniversalFileClientConfig>;\n\n constructor(config: UniversalFileClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || DEFAULT_REQUEST_TIMEOUT,\n uploadTimeout: config.uploadTimeout || DEFAULT_UPLOAD_TIMEOUT,\n headers: config.headers || {},\n };\n }\n\n // ============= 文件上传API =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.UPLOAD);\n const startTime = Date.now();\n\n // 创建FormData\n const formData = new FormData();\n formData.append('file', fileInfo.file);\n formData.append('moduleId', fileInfo.moduleId);\n\n if (fileInfo.businessId) {\n formData.append('businessId', fileInfo.businessId);\n }\n\n if (fileInfo.permission) {\n formData.append('permission', fileInfo.permission);\n }\n\n if (fileInfo.customPath) {\n formData.append('customPath', fileInfo.customPath);\n }\n\n if (fileInfo.metadata) {\n formData.append('metadata', JSON.stringify(fileInfo.metadata));\n }\n\n if (fileInfo.needsProcessing !== undefined) {\n formData.append('needsProcessing', String(fileInfo.needsProcessing));\n }\n\n if (fileInfo.processingOptions) {\n formData.append('processingOptions', JSON.stringify(fileInfo.processingOptions));\n }\n\n try {\n console.log('📤 [UniversalFileClient] 开始上传文件:', {\n url,\n fileName: fileInfo.file.name,\n fileSize: fileInfo.file.size,\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n });\n\n // 创建XMLHttpRequest以支持上传进度\n return await new Promise<FileMetadata>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n \n // 重要:启用 credentials 以携带 cookie\n xhr.withCredentials = true;\n\n // 监听上传进度\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable && onProgress) {\n const elapsedTime = Date.now() - startTime;\n const speed = event.loaded / (elapsedTime / 1000);\n const remainingBytes = event.total - event.loaded;\n const remainingTime = speed > 0 ? remainingBytes / speed : 0;\n\n const progress: UploadProgress = {\n fileId: '', // 暂时为空,上传完成后会有\n status: 'uploading',\n progress: Math.round((event.loaded / event.total) * 100),\n uploadedBytes: event.loaded,\n totalBytes: event.total,\n speed,\n remainingTime,\n };\n\n onProgress(progress);\n }\n });\n\n // 监听上传完成\n xhr.addEventListener('load', () => {\n console.log('📥 [UniversalFileClient] 上传响应:', {\n status: xhr.status,\n statusText: xhr.statusText,\n responseLength: xhr.responseText?.length,\n });\n \n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n console.log('✅ [UniversalFileClient] 解析响应成功:', response);\n \n // 支持多种响应格式\n const fileData = response.file || response.data || response;\n const fileMetadata = this.transformFileMetadataFromAPI(fileData);\n\n if (onProgress) {\n onProgress({\n fileId: fileMetadata.id,\n status: 'completed',\n progress: 100,\n uploadedBytes: fileInfo.file.size,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n });\n }\n\n resolve(fileMetadata);\n } catch (error) {\n console.error('❌ [UniversalFileClient] 解析响应失败:', error, xhr.responseText);\n reject(new Error('解析响应失败'));\n }\n } else {\n console.error('❌ [UniversalFileClient] 上传失败:', xhr.status, xhr.statusText, xhr.responseText);\n reject(new Error('上传失败: ' + (xhr.statusText)));\n }\n });\n\n // 监听错误\n xhr.addEventListener('error', (event) => {\n console.error('❌ [UniversalFileClient] 网络错误:', event);\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '网络错误',\n });\n }\n reject(new Error('上传失败: 网络错误'));\n });\n\n // 监听超时\n xhr.addEventListener('timeout', () => {\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '上传超时',\n });\n }\n reject(new Error('上传超时'));\n });\n\n // 配置请求\n xhr.open('POST', url);\n xhr.timeout = this.config.uploadTimeout;\n\n // 设置请求头\n Object.entries(this.config.headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n\n // 发送请求\n xhr.send(formData);\n });\n } catch (error) {\n throw createFileError(\n ERROR_CODES.FILE_UPLOAD_ERROR,\n '文件上传失败: ' + (formatErrorMessage(error)),\n { fileInfo, originalError: error }\n );\n }\n }\n\n // ============= 文件查询API =============\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, expiresIn?: number): Promise<string> {\n const url = this.config.baseUrl + API_ENDPOINTS.GET_URL(fileId) + (expiresIn ? `?expiresIn=${expiresIn}` : '');\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取文件URL失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.url;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取文件URL失败: ' + (formatErrorMessage(error)),\n { fileId, expiresIn, originalError: error }\n );\n }\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_METADATA(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error('获取文件元数据失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformFileMetadataFromAPI(data.file);\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取文件元数据失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n const queryString = buildQueryString({\n moduleId: options.moduleId,\n businessId: options.businessId,\n uploaderId: options.uploaderId,\n mimeType: options.mimeType,\n minSize: options.minSize,\n maxSize: options.maxSize,\n startTime: options.startTime?.toISOString(),\n endTime: options.endTime?.toISOString(),\n keyword: options.keyword,\n tags: options.tags,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n });\n\n const url = (this.config.baseUrl) + (API_ENDPOINTS.QUERY) + (queryString);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n console.error('❌ [UniversalFileClient] 查询文件列表失败:', response.status, response.statusText);\n throw new Error('查询文件列表失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n console.log('📥 [UniversalFileClient] 查询文件列表响应:', {\n itemsCount: data.items?.length,\n total: data.total,\n page: data.page,\n });\n \n // 防御性检查\n if (!data.items || !Array.isArray(data.items)) {\n console.error('❌ [UniversalFileClient] 响应格式错误: items 不是数组', data);\n return {\n items: [],\n total: 0,\n page: 1,\n pageSize: 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n \n return {\n items: data.items.map((item: any) => this.transformFileMetadataFromAPI(item)),\n total: data.total,\n page: data.page,\n pageSize: data.pageSize,\n totalPages: data.totalPages,\n hasNext: data.hasNext,\n hasPrev: data.hasPrev,\n };\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '查询文件列表失败: ' + (formatErrorMessage(error)),\n { options, originalError: error }\n );\n }\n }\n\n // ============= 文件删除API =============\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string): Promise<void> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.DELETE(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error('删除文件失败: ' + (response.statusText));\n }\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '删除文件失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[]): Promise<BatchOperationResult> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.BATCH_DELETE);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ fileIds }),\n });\n\n if (!response.ok) {\n throw new Error('批量删除文件失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.result;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '批量删除文件失败: ' + (formatErrorMessage(error)),\n { fileIds, originalError: error }\n );\n }\n }\n\n // ============= 上传进度API =============\n\n /**\n * 获取上传进度\n */\n async getUploadProgress(fileId: string): Promise<UploadProgress> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_PROGRESS(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取上传进度失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.progress;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取上传进度失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n credentials: 'include', // 携带 cookie 用于授权\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createFileError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的文件元数据\n */\n private transformFileMetadataFromAPI(apiData: any): FileMetadata {\n return {\n id: apiData.id,\n originalName: apiData.originalName,\n storageName: apiData.storageName || apiData.storedName,\n size: apiData.size,\n mimeType: apiData.mimeType,\n extension: apiData.extension,\n hash: apiData.hash || apiData.md5Hash || apiData.sha256Hash,\n uploadTime: new Date(apiData.uploadTime),\n permission: apiData.permission || 'public',\n uploaderId: apiData.uploaderId,\n moduleId: apiData.moduleId,\n businessId: apiData.businessId,\n storageProvider: apiData.storageProvider || 'local',\n storagePath: apiData.storagePath,\n cdnUrl: apiData.cdnUrl,\n accessCount: apiData.accessCount,\n lastAccessTime: apiData.lastAccessTime ? new Date(apiData.lastAccessTime) : undefined,\n expiresAt: apiData.expiresAt ? new Date(apiData.expiresAt) : undefined,\n metadata: apiData.metadata,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalFileClient = new UniversalFileClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createFileClient(config?: UniversalFileClientConfig): UniversalFileClient {\n return new UniversalFileClient(config);\n}\n","/**\n * 通用文件上传组件\n * Universal File Uploader Component\n *\n * 支持拖拽上传、进度显示、多文件上传等功能\n * 使用 Tailwind CSS 样式,支持暗色模式\n */\n\n'use client';\n\nimport React, { useState, useRef, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport {\n Upload,\n X,\n FileText,\n Image,\n Film,\n Music,\n AlertCircle,\n CheckCircle2,\n Loader2,\n} from 'lucide-react';\n\nimport type {\n FileMetadata,\n UploadProgress,\n UploadFileInfo,\n ProcessingOptions,\n} from '../types';\nimport type { UniversalFileService } from '../server/UniversalFileService';\n\n// ============= 类型定义 =============\n\nexport interface FileUploaderProps {\n /** 文件服务实例 */\n fileService: UniversalFileService;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 允许的文件类型 */\n acceptedTypes?: string[];\n /** 最大文件大小(MB) */\n maxFileSize?: number;\n /** 最大文件数量 */\n maxFiles?: number;\n /** 是否支持多文件上传 */\n multiple?: boolean;\n /** 是否启用文件处理 */\n enableProcessing?: boolean;\n /** 默认处理选项 */\n defaultProcessingOptions?: ProcessingOptions;\n /** 上传成功回调 */\n onUploadSuccess?: (files: FileMetadata[]) => void;\n /** 上传失败回调 */\n onUploadError?: (error: string) => void;\n /** 上传进度回调 */\n onProgress?: (progress: UploadProgress[]) => void;\n /** 自定义样式类名 */\n className?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 显示模式 */\n mode?: 'compact' | 'normal' | 'detailed';\n}\n\nexport interface UploadingFile {\n id: string;\n file: File;\n progress: UploadProgress;\n metadata?: FileMetadata;\n error?: string;\n}\n\n// ============= 主组件 =============\n\nexport const FileUploader: React.FC<FileUploaderProps> = ({\n fileService,\n moduleId,\n businessId,\n acceptedTypes = [],\n maxFileSize = 100, // 100MB\n maxFiles = 10,\n multiple = true,\n enableProcessing = false,\n defaultProcessingOptions,\n onUploadSuccess,\n onUploadError,\n onProgress,\n className = '',\n disabled = false,\n mode = 'normal',\n}) => {\n // ============= 状态管理 =============\n\n const [uploadingFiles, setUploadingFiles] = useState<UploadingFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const [completedFiles, setCompletedFiles] = useState<FileMetadata[]>([]);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // ============= 文件类型图标 =============\n\n const getFileIcon = (mimeType: string) => {\n if (mimeType.startsWith('image/')) return <Image className=\"w-5 h-5\" />;\n if (mimeType.startsWith('video/')) return <Film className=\"w-5 h-5\" />;\n if (mimeType.startsWith('audio/')) return <Music className=\"w-5 h-5\" />;\n return <FileText className=\"w-5 h-5\" />;\n };\n\n // ============= 文件验证 =============\n\n const validateFile = (file: File): string | null => {\n // 检查文件大小\n if (file.size > maxFileSize * 1024 * 1024) {\n return '文件大小不能超过 ' + (maxFileSize) + 'MB';\n }\n\n // 检查文件类型\n if (acceptedTypes.length > 0 && !acceptedTypes.includes(file.type)) {\n return '不支持的文件类型: ' + (file.type);\n }\n\n return null;\n };\n\n // ============= 文件上传逻辑 =============\n\n const uploadFile = useCallback(\n async (file: File): Promise<void> => {\n const fileId = 'upload_' + (Date.now()) + '_' + (Math.random().toString(36).substr(2, 9));\n\n // 验证文件\n const error = validateFile(file);\n if (error) {\n onUploadError?.(error);\n return;\n }\n\n // 初始化上传进度\n const initialProgress: UploadProgress = {\n fileId,\n status: 'pending',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: file.size,\n speed: 0,\n remainingTime: 0,\n };\n\n const uploadingFile: UploadingFile = {\n id: fileId,\n file,\n progress: initialProgress,\n };\n\n setUploadingFiles((prev) => [...prev, uploadingFile]);\n\n try {\n // 构建上传文件信息\n const uploadInfo: UploadFileInfo = {\n file,\n moduleId,\n businessId,\n permission: 'public',\n needsProcessing: enableProcessing,\n processingOptions: defaultProcessingOptions,\n };\n\n // 开始上传\n const result = await fileService.uploadFile(\n uploadInfo,\n undefined, // 使用默认存储类型\n (progress) => {\n setUploadingFiles((prev) =>\n prev.map((f) => (f.id === fileId ? { ...f, progress } : f))\n );\n\n // 调用外部进度回调\n const allProgress = uploadingFiles.map((f) => f.progress);\n onProgress?.(allProgress);\n }\n );\n\n // 上传成功,result直接是FileMetadata\n setUploadingFiles((prev) => prev.filter((f) => f.id !== fileId));\n setCompletedFiles((prev) => [...prev, result]);\n onUploadSuccess?.([result]);\n } catch (error) {\n console.error('文件上传失败:', error);\n\n const errorMessage = error instanceof Error ? error.message : '上传失败';\n\n setUploadingFiles((prev) =>\n prev.map((f) => (f.id === fileId ? { ...f, error: errorMessage } : f))\n );\n\n onUploadError?.(errorMessage);\n }\n },\n [\n fileService,\n moduleId,\n businessId,\n enableProcessing,\n defaultProcessingOptions,\n maxFileSize,\n acceptedTypes,\n onUploadSuccess,\n onUploadError,\n onProgress,\n uploadingFiles,\n ]\n );\n\n // ============= 文件选择处理 =============\n\n const handleFileSelect = useCallback(\n (files: FileList | File[]) => {\n const fileArray = Array.from(files);\n\n // 检查文件数量限制\n if (completedFiles.length + uploadingFiles.length + fileArray.length > maxFiles) {\n onUploadError?.('最多只能上传 ' + (maxFiles) + ' 个文件');\n return;\n }\n\n // 逐个上传文件\n fileArray.forEach(uploadFile);\n },\n [completedFiles.length, uploadingFiles.length, maxFiles, onUploadError, uploadFile]\n );\n\n // ============= 事件处理 =============\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (files && files.length > 0) {\n handleFileSelect(files);\n }\n // 清空input值,允许重复选择同一文件\n event.target.value = '';\n };\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(true);\n };\n\n const handleDragLeave = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n };\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n\n const files = event.dataTransfer.files;\n if (files.length > 0) {\n handleFileSelect(files);\n }\n };\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n };\n\n const removeUploadingFile = (fileId: string) => {\n setUploadingFiles((prev) => prev.filter((f) => f.id !== fileId));\n };\n\n const removeCompletedFile = (fileId: string) => {\n setCompletedFiles((prev) => prev.filter((f) => f.id !== fileId));\n };\n\n // ============= 渲染辅助函数 =============\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n const formatProgress = (progress: UploadProgress): string => {\n switch (progress.status) {\n case 'pending':\n return '准备中...';\n case 'uploading':\n return '上传中 ' + (progress.progress.toFixed(1)) + '%';\n case 'processing':\n return '处理中...';\n case 'completed':\n return '完成';\n case 'failed':\n return '失败';\n default:\n return '未知状态';\n }\n };\n\n // ============= 样式计算 =============\n\n const containerClasses = clsx(\n 'border-2 border-dashed rounded-lg transition-all duration-200',\n isDragOver\n ? 'border-blue-400 bg-blue-50 dark:bg-blue-900/20'\n : 'border-gray-300 dark:border-gray-600',\n disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-blue-400 cursor-pointer',\n className\n );\n\n const uploadAreaClasses = clsx(\n 'p-6 text-center',\n mode === 'compact' ? 'p-4' : mode === 'detailed' ? 'p-8' : 'p-6'\n );\n\n // ============= 渲染 =============\n\n return (\n <div className=\"w-full space-y-4\">\n {/* 文件上传区域 */}\n <div\n className={containerClasses}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n >\n <div className={uploadAreaClasses}>\n <Upload\n className={clsx('mx-auto mb-4 text-gray-400', mode === 'compact' ? 'w-8 h-8 mb-2' : 'w-12 h-12')}\n />\n\n {mode === 'compact' ? (\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">点击上传或拖拽文件到这里</p>\n ) : (\n <>\n <h3 className=\"text-lg font-semibold text-gray-700 dark:text-gray-300 mb-2\">\n 上传文件\n </h3>\n <p className=\"text-gray-600 dark:text-gray-400 mb-2\">点击选择文件或拖拽文件到这里</p>\n {mode === 'detailed' && (\n <div className=\"text-sm text-gray-500 space-y-1\">\n {acceptedTypes.length > 0 && <p>支持格式: {acceptedTypes.join(', ')}</p>}\n <p>\n 最大大小: {maxFileSize}MB | 最多文件: {maxFiles}个\n </p>\n </div>\n )}\n </>\n )}\n </div>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n accept={acceptedTypes.join(',')}\n onChange={handleInputChange}\n className=\"hidden\"\n disabled={disabled}\n />\n </div>\n\n {/* 上传进度列表 */}\n {uploadingFiles.length > 0 && (\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n 上传中 ({uploadingFiles.length})\n </h4>\n\n {uploadingFiles.map((uploadingFile) => (\n <div\n key={uploadingFile.id}\n className=\"flex items-center space-x-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg\"\n >\n {/* 文件图标 */}\n <div className=\"flex-shrink-0\">\n {uploadingFile.progress.status === 'failed' ? (\n <AlertCircle className=\"w-5 h-5 text-red-500\" />\n ) : uploadingFile.progress.status === 'completed' ? (\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\n ) : (\n <Loader2 className=\"w-5 h-5 text-blue-500 animate-spin\" />\n )}\n </div>\n\n {/* 文件信息 */}\n <div className=\"flex-grow min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\n {uploadingFile.file.name}\n </p>\n <span className=\"text-xs text-gray-500\">\n {formatFileSize(uploadingFile.file.size)}\n </span>\n </div>\n\n {uploadingFile.error ? (\n <p className=\"text-xs text-red-500\">{uploadingFile.error}</p>\n ) : (\n <>\n <div className=\"w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2 mb-1\">\n <div\n className=\"bg-blue-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: (uploadingFile.progress.progress) + '%' }}\n />\n </div>\n <p className=\"text-xs text-gray-500\">\n {formatProgress(uploadingFile.progress)}\n </p>\n </>\n )}\n </div>\n\n {/* 移除按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n removeUploadingFile(uploadingFile.id);\n }}\n className=\"flex-shrink-0 p-1 text-gray-400 hover:text-red-500 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* 已完成文件列表 */}\n {completedFiles.length > 0 && (\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n 已完成 ({completedFiles.length})\n </h4>\n\n {completedFiles.map((file) => (\n <div\n key={file.id}\n className=\"flex items-center space-x-3 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\"\n >\n {/* 文件图标 */}\n <div className=\"flex-shrink-0\">{getFileIcon(file.mimeType)}</div>\n\n {/* 文件信息 */}\n <div className=\"flex-grow min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\n {file.originalName}\n </p>\n <span className=\"text-xs text-gray-500\">{formatFileSize(file.size)}</span>\n </div>\n <p className=\"text-xs text-green-600 dark:text-green-400\">\n 上传成功 • {new Date(file.uploadTime).toLocaleTimeString()}\n </p>\n </div>\n\n {/* 移除按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n removeCompletedFile(file.id);\n }}\n className=\"flex-shrink-0 p-1 text-gray-400 hover:text-red-500 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* 统计信息 */}\n {mode === 'detailed' && (completedFiles.length > 0 || uploadingFiles.length > 0) && (\n <div className=\"flex justify-between items-center text-sm text-gray-500 pt-2 border-t border-gray-200 dark:border-gray-700\">\n <span>总计: {completedFiles.length + uploadingFiles.length} 文件</span>\n <span>\n 大小:{' '}\n {formatFileSize(\n [\n ...completedFiles.map((f) => f.size),\n ...uploadingFiles.map((f) => f.file.size),\n ].reduce((total, size) => total + size, 0)\n )}\n </span>\n </div>\n )}\n </div>\n );\n};\n\nexport default FileUploader;\n\n","/**\n * 通用文件管理组件\n * 支持文件列表、预览、批量操作、搜索筛选等功能\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport { FileMetadata, FileQueryOptions, PaginatedResult, ProcessorType } from '../types';\nimport { clsx } from 'clsx';\n\n// 文件管理相关类型定义\nexport interface FileManagerProps {\n /** 模块ID,限制显示特定模块的文件 */\n moduleId?: string;\n /** 业务ID,限制显示特定业务的文件 */\n businessId?: string;\n /** 显示模式 */\n mode?: 'grid' | 'list' | 'table';\n /** 是否允许上传 */\n allowUpload?: boolean;\n /** 是否允许下载 */\n allowDownload?: boolean;\n /** 是否允许删除 */\n allowDelete?: boolean;\n /** 是否允许批量操作 */\n allowBatch?: boolean;\n /** 是否显示预览 */\n showPreview?: boolean;\n /** 是否显示搜索 */\n showSearch?: boolean;\n /** 是否显示筛选器 */\n showFilters?: boolean;\n /** 每页显示数量 */\n pageSize?: number;\n /** 自定义操作按钮 */\n customActions?: Array<{\n key: string;\n label: string;\n icon?: string;\n onClick: (files: FileMetadata[]) => void;\n disabled?: (files: FileMetadata[]) => boolean;\n }>;\n /** 文件选择回调 */\n onFileSelect?: (files: FileMetadata[]) => void;\n /** 上传完成回调 */\n onUploadComplete?: (files: FileMetadata[]) => void;\n}\n\nexport interface FileManagerState {\n files: FileMetadata[];\n selectedFiles: Set<string>;\n loading: boolean;\n uploading: boolean;\n error: string | null;\n searchQuery: string;\n filters: {\n mimeType: string;\n dateRange: { start: Date | null; end: Date | null };\n sizeRange: { min: number; max: number };\n };\n sortBy: keyof FileMetadata;\n sortOrder: 'asc' | 'desc';\n pagination: {\n page: number;\n pageSize: number;\n total: number;\n totalPages: number;\n };\n previewFile: FileMetadata | null;\n showUploadModal: boolean;\n}\n\nconst MIME_TYPE_CATEGORIES = {\n 'image': ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'],\n 'video': ['video/mp4', 'video/avi', 'video/mov', 'video/webm'],\n 'audio': ['audio/mp3', 'audio/wav', 'audio/ogg', 'audio/aac'],\n 'document': ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n 'archive': ['application/zip', 'application/x-rar-compressed', 'application/x-7z-compressed']\n};\n\nexport const UniversalFileManager: React.FC<FileManagerProps> = ({\n moduleId,\n businessId,\n mode = 'grid',\n allowUpload = true,\n allowDownload = true,\n allowDelete = false,\n allowBatch = true,\n showPreview = true,\n showSearch = true,\n showFilters = true,\n pageSize = 20,\n customActions = [],\n onFileSelect,\n onUploadComplete\n}) => {\n const [state, setState] = useState<FileManagerState>({\n files: [],\n selectedFiles: new Set(),\n loading: false,\n uploading: false,\n error: null,\n searchQuery: '',\n filters: {\n mimeType: '',\n dateRange: { start: null, end: null },\n sizeRange: { min: 0, max: Number.MAX_SAFE_INTEGER }\n },\n sortBy: 'uploadTime',\n sortOrder: 'desc',\n pagination: {\n page: 1,\n pageSize,\n total: 0,\n totalPages: 0\n },\n previewFile: null,\n showUploadModal: false\n });\n\n // 加载文件列表\n const loadFiles = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n\n try {\n const queryOptions: FileQueryOptions = {\n moduleId,\n businessId,\n page: state.pagination.page,\n pageSize: state.pagination.pageSize,\n sortBy: state.sortBy,\n sortOrder: state.sortOrder\n };\n\n // 添加搜索查询\n if (state.searchQuery) {\n // 这里应该调用文件服务的搜索API\n // queryOptions.search = state.searchQuery;\n }\n\n // 添加筛选条件\n if (state.filters.mimeType) {\n queryOptions.mimeType = state.filters.mimeType;\n }\n if (state.filters.dateRange.start) {\n queryOptions.startTime = state.filters.dateRange.start;\n }\n if (state.filters.dateRange.end) {\n queryOptions.endTime = state.filters.dateRange.end;\n }\n\n // 这里应该调用实际的文件服务API\n // const result = await fileService.queryFiles(queryOptions);\n \n // 模拟API调用\n const mockResult: PaginatedResult<FileMetadata> = {\n items: [],\n total: 0,\n page: queryOptions.page || 1,\n pageSize: queryOptions.pageSize || 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false\n };\n\n setState(prev => ({\n ...prev,\n files: mockResult.items,\n pagination: {\n page: mockResult.page,\n pageSize: mockResult.pageSize,\n total: mockResult.total,\n totalPages: mockResult.totalPages\n },\n loading: false\n }));\n\n } catch (error) {\n console.error('加载文件列表失败:', error);\n setState(prev => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : '加载文件列表失败'\n }));\n }\n }, [moduleId, businessId, state.searchQuery, state.filters, state.sortBy, state.sortOrder, state.pagination.page, state.pagination.pageSize]);\n\n // 初始加载\n useEffect(() => {\n loadFiles();\n }, [loadFiles]);\n\n // 文件选择处理\n const handleFileSelect = useCallback((fileId: string, selected: boolean) => {\n setState(prev => {\n const newSelectedFiles = new Set(prev.selectedFiles);\n if (selected) {\n newSelectedFiles.add(fileId);\n } else {\n newSelectedFiles.delete(fileId);\n }\n\n const selectedFileList = prev.files.filter(file => newSelectedFiles.has(file.id));\n \n if (onFileSelect) {\n onFileSelect(selectedFileList);\n }\n\n return {\n ...prev,\n selectedFiles: newSelectedFiles\n };\n });\n }, [onFileSelect, state.files]);\n\n // 全选/取消全选\n const handleSelectAll = useCallback((selected: boolean) => {\n setState(prev => {\n const newSelectedFiles = selected \n ? new Set(prev.files.map(file => file.id))\n : new Set<string>();\n\n const selectedFileList = selected ? prev.files : [];\n \n if (onFileSelect) {\n onFileSelect(selectedFileList);\n }\n\n return {\n ...prev,\n selectedFiles: newSelectedFiles\n };\n });\n }, [onFileSelect, state.files]);\n\n // 删除文件\n const handleDeleteFiles = useCallback(async (fileIds: string[]) => {\n if (!window.confirm('确定要删除选中的 ' + (fileIds.length) + ' 个文件吗?')) {\n return;\n }\n\n setState(prev => ({ ...prev, loading: true }));\n\n try {\n // 这里应该调用实际的删除API\n // await fileService.deleteFiles(fileIds);\n \n console.log('删除文件:', fileIds);\n \n // 重新加载文件列表\n await loadFiles();\n \n setState(prev => ({\n ...prev,\n selectedFiles: new Set(),\n loading: false\n }));\n\n } catch (error) {\n console.error('删除文件失败:', error);\n setState(prev => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : '删除文件失败'\n }));\n }\n }, [loadFiles]);\n\n // 下载文件\n const handleDownloadFile = useCallback(async (file: FileMetadata) => {\n try {\n // 这里应该调用实际的下载API\n // const downloadUrl = await fileService.getDownloadUrl(file.id);\n // window.open(downloadUrl, '_blank');\n \n console.log('下载文件:', file.originalName);\n \n } catch (error) {\n console.error('下载文件失败:', error);\n setState(prev => ({\n ...prev,\n error: error instanceof Error ? error.message : '下载文件失败'\n }));\n }\n }, []);\n\n // 预览文件\n const handlePreviewFile = useCallback((file: FileMetadata) => {\n setState(prev => ({\n ...prev,\n previewFile: file\n }));\n }, []);\n\n // 关闭预览\n const handleClosePreview = useCallback(() => {\n setState(prev => ({\n ...prev,\n previewFile: null\n }));\n }, []);\n\n // 搜索处理\n const handleSearch = useCallback((query: string) => {\n setState(prev => ({\n ...prev,\n searchQuery: query,\n pagination: { ...prev.pagination, page: 1 }\n }));\n }, []);\n\n // 筛选处理\n const handleFilterChange = useCallback((filterType: string, value: any) => {\n setState(prev => ({\n ...prev,\n filters: {\n ...prev.filters,\n [filterType]: value\n },\n pagination: { ...prev.pagination, page: 1 }\n }));\n }, []);\n\n // 排序处理\n const handleSort = useCallback((field: keyof FileMetadata) => {\n setState(prev => ({\n ...prev,\n sortBy: field,\n sortOrder: prev.sortBy === field && prev.sortOrder === 'asc' ? 'desc' : 'asc',\n pagination: { ...prev.pagination, page: 1 }\n }));\n }, []);\n\n // 分页处理\n const handlePageChange = useCallback((page: number) => {\n setState(prev => ({\n ...prev,\n pagination: { ...prev.pagination, page }\n }));\n }, []);\n\n // 格式化文件大小\n const formatFileSize = useCallback((bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }, []);\n\n // 获取文件类型图标\n const getFileTypeIcon = useCallback((mimeType: string): string => {\n if (mimeType.startsWith('image/')) return '🖼️';\n if (mimeType.startsWith('video/')) return '🎬';\n if (mimeType.startsWith('audio/')) return '🎵';\n if (mimeType.includes('pdf')) return '📄';\n if (mimeType.includes('word')) return '📝';\n if (mimeType.includes('excel')) return '📊';\n if (mimeType.includes('powerpoint')) return '📊';\n if (mimeType.includes('zip') || mimeType.includes('rar')) return '📦';\n return '📁';\n }, []);\n\n // 获取文件类型标签\n const getFileTypeLabel = useCallback((mimeType: string): string => {\n for (const [category, types] of Object.entries(MIME_TYPE_CATEGORIES)) {\n if (types.some(type => mimeType.includes(type))) {\n return category;\n }\n }\n return 'other';\n }, []);\n\n // 判断文件是否可预览\n const isPreviewable = useCallback((file: FileMetadata): boolean => {\n return file.mimeType.startsWith('image/') || \n file.mimeType.startsWith('video/') || \n file.mimeType.startsWith('audio/') ||\n file.mimeType.includes('pdf');\n }, []);\n\n // 渲染文件项\n const renderFileItem = useCallback((file: FileMetadata) => {\n const isSelected = state.selectedFiles.has(file.id);\n const typeIcon = getFileTypeIcon(file.mimeType);\n const typeLabel = getFileTypeLabel(file.mimeType);\n \n return (\n <div\n key={file.id}\n className={clsx('relative border rounded-lg p-4 cursor-pointer transition-all duration-200 hover:shadow-md', isSelected ? 'border-blue-500 bg-blue-50' : 'border-gray-200 hover:border-gray-300')}\n onClick={() => handleFileSelect(file.id, !isSelected)}\n >\n {/* 选择复选框 */}\n {allowBatch && (\n <div className=\"absolute top-2 left-2\">\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => {\n e.stopPropagation();\n handleFileSelect(file.id, e.target.checked);\n }}\n className=\"w-4 h-4 text-blue-600 rounded border-gray-300 focus:ring-blue-500\"\n />\n </div>\n )}\n\n {/* 文件图标和信息 */}\n <div className=\"flex flex-col items-center space-y-2\">\n <div className=\"text-4xl\">{typeIcon}</div>\n \n <div className=\"text-center w-full\">\n <h3 className=\"font-medium text-sm text-gray-900 truncate\" title={file.originalName}>\n {file.originalName}\n </h3>\n <p className=\"text-xs text-gray-500 mt-1\">\n {formatFileSize(file.size)}\n </p>\n <p className=\"text-xs text-blue-600 capitalize\">\n {typeLabel}\n </p>\n <p className=\"text-xs text-gray-400\">\n {new Date(file.uploadTime).toLocaleDateString()}\n </p>\n </div>\n </div>\n\n {/* 操作按钮 */}\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <div className=\"flex space-x-1\">\n {showPreview && isPreviewable(file) && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handlePreviewFile(file);\n }}\n className=\"p-1 text-gray-600 hover:text-blue-600 hover:bg-white rounded\"\n title=\"预览\"\n >\n 👁️\n </button>\n )}\n \n {allowDownload && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadFile(file);\n }}\n className=\"p-1 text-gray-600 hover:text-green-600 hover:bg-white rounded\"\n title=\"下载\"\n >\n ⬇️\n </button>\n )}\n \n {allowDelete && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteFiles([file.id]);\n }}\n className=\"p-1 text-gray-600 hover:text-red-600 hover:bg-white rounded\"\n title=\"删除\"\n >\n 🗑️\n </button>\n )}\n </div>\n </div>\n </div>\n );\n }, [\n state.selectedFiles,\n allowBatch,\n allowDownload,\n allowDelete,\n showPreview,\n handleFileSelect,\n handlePreviewFile,\n handleDownloadFile,\n handleDeleteFiles,\n getFileTypeIcon,\n getFileTypeLabel,\n formatFileSize,\n isPreviewable\n ]);\n\n // 渲染搜索栏\n const renderSearchBar = () => {\n if (!showSearch) return null;\n\n return (\n <div className=\"mb-6\">\n <div className=\"relative\">\n <input\n type=\"text\"\n placeholder=\"搜索文件名...\"\n value={state.searchQuery}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <span className=\"text-gray-400\">🔍</span>\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染筛选器\n const renderFilters = () => {\n if (!showFilters) return null;\n\n return (\n <div className=\"mb-6 p-4 bg-gray-50 rounded-lg\">\n <h3 className=\"text-sm font-medium text-gray-700 mb-3\">筛选器</h3>\n \n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {/* 文件类型筛选 */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n 文件类型\n </label>\n <select\n value={state.filters.mimeType}\n onChange={(e) => handleFilterChange('mimeType', e.target.value)}\n className=\"w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"\">全部</option>\n <option value=\"image/\">图片</option>\n <option value=\"video/\">视频</option>\n <option value=\"audio/\">音频</option>\n <option value=\"application/pdf\">PDF</option>\n <option value=\"application/\">文档</option>\n </select>\n </div>\n\n {/* 日期范围筛选 */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n 上传时间\n </label>\n <div className=\"flex space-x-2\">\n <input\n type=\"date\"\n value={state.filters.dateRange.start?.toISOString().split('T')[0] || ''}\n onChange={(e) => handleFilterChange('dateRange', {\n ...state.filters.dateRange,\n start: e.target.value ? new Date(e.target.value) : null\n })}\n className=\"flex-1 px-2 py-1 text-xs border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n />\n <input\n type=\"date\"\n value={state.filters.dateRange.end?.toISOString().split('T')[0] || ''}\n onChange={(e) => handleFilterChange('dateRange', {\n ...state.filters.dateRange,\n end: e.target.value ? new Date(e.target.value) : null\n })}\n className=\"flex-1 px-2 py-1 text-xs border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n\n {/* 清除筛选器 */}\n <div className=\"flex items-end\">\n <button\n onClick={() => setState(prev => ({\n ...prev,\n filters: {\n mimeType: '',\n dateRange: { start: null, end: null },\n sizeRange: { min: 0, max: Number.MAX_SAFE_INTEGER }\n }\n }))}\n className=\"px-3 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\"\n >\n 清除筛选\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染工具栏\n const renderToolbar = () => {\n const selectedCount = state.selectedFiles.size;\n const hasSelection = selectedCount > 0;\n\n return (\n <div className=\"flex items-center justify-between mb-6\">\n <div className=\"flex items-center space-x-4\">\n {/* 全选按钮 */}\n {allowBatch && state.files.length > 0 && (\n <label className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={selectedCount === state.files.length && state.files.length > 0}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"w-4 h-4 text-blue-600 rounded border-gray-300 focus:ring-blue-500\"\n />\n <span className=\"text-sm text-gray-700\">\n 全选 ({selectedCount}/{state.files.length})\n </span>\n </label>\n )}\n\n {/* 批量操作按钮 */}\n {hasSelection && (\n <div className=\"flex items-center space-x-2\">\n {allowDelete && (\n <button\n onClick={() => handleDeleteFiles(Array.from(state.selectedFiles))}\n className=\"px-3 py-1 text-sm text-red-600 border border-red-300 rounded hover:bg-red-50\"\n >\n 删除选中 ({selectedCount})\n </button>\n )}\n\n {/* 自定义操作 */}\n {customActions.map(action => {\n const selectedFileList = state.files.filter(file => state.selectedFiles.has(file.id));\n const isDisabled = action.disabled?.(selectedFileList) || false;\n \n return (\n <button\n key={action.key}\n onClick={() => action.onClick(selectedFileList)}\n disabled={isDisabled}\n className={clsx('px-3 py-1 text-sm border rounded', isDisabled\n ? 'text-gray-400 border-gray-200 cursor-not-allowed'\n : 'text-blue-600 border-blue-300 hover:bg-blue-50')}\n >\n {action.icon && <span className=\"mr-1\">{action.icon}</span>}\n {action.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center space-x-4\">\n {/* 排序选择 */}\n <select\n value={(state.sortBy) + '-' + (state.sortOrder)}\n onChange={(e) => {\n const [sortBy, sortOrder] = e.target.value.split('-') as [keyof FileMetadata, 'asc' | 'desc'];\n setState(prev => ({ ...prev, sortBy, sortOrder }));\n }}\n className=\"px-3 py-1 text-sm border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"uploadTime-desc\">最新上传</option>\n <option value=\"uploadTime-asc\">最早上传</option>\n <option value=\"originalName-asc\">文件名 A-Z</option>\n <option value=\"originalName-desc\">文件名 Z-A</option>\n <option value=\"size-desc\">文件大小 大-小</option>\n <option value=\"size-asc\">文件大小 小-大</option>\n </select>\n\n {/* 上传按钮 */}\n {allowUpload && (\n <button\n onClick={() => setState(prev => ({ ...prev, showUploadModal: true }))}\n className=\"px-4 py-2 text-sm text-white bg-blue-600 rounded hover:bg-blue-700 focus:ring-2 focus:ring-blue-500\"\n >\n ⬆️ 上传文件\n </button>\n )}\n </div>\n </div>\n );\n };\n\n // 渲染分页\n const renderPagination = () => {\n if (state.pagination.totalPages <= 1) return null;\n\n const { page, totalPages } = state.pagination;\n const pages = [];\n \n // 计算显示的页码范围\n const startPage = Math.max(1, page - 2);\n const endPage = Math.min(totalPages, page + 2);\n\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n\n return (\n <div className=\"flex items-center justify-between mt-6\">\n <div className=\"text-sm text-gray-700\">\n 显示第 {(page - 1) * state.pagination.pageSize + 1} - {Math.min(page * state.pagination.pageSize, state.pagination.total)} 项,\n 共 {state.pagination.total} 项\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => handlePageChange(page - 1)}\n disabled={page <= 1}\n className=\"px-3 py-1 text-sm border rounded disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50\"\n >\n 上一页\n </button>\n\n {pages.map(pageNum => (\n <button\n key={pageNum}\n onClick={() => handlePageChange(pageNum)}\n className={clsx('px-3 py-1 text-sm border rounded', pageNum === page\n ? 'bg-blue-600 text-white border-blue-600'\n : 'hover:bg-gray-50')}\n >\n {pageNum}\n </button>\n ))}\n\n <button\n onClick={() => handlePageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"px-3 py-1 text-sm border rounded disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50\"\n >\n 下一页\n </button>\n </div>\n </div>\n );\n };\n\n return (\n <div className=\"w-full\">\n {/* 错误提示 */}\n {state.error && (\n <div className=\"mb-4 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-800\">{state.error}</p>\n <button\n onClick={() => setState(prev => ({ ...prev, error: null }))}\n className=\"mt-2 text-red-600 hover:text-red-800\"\n >\n 关闭\n </button>\n </div>\n )}\n\n {/* 搜索栏 */}\n {renderSearchBar()}\n\n {/* 筛选器 */}\n {renderFilters()}\n\n {/* 工具栏 */}\n {renderToolbar()}\n\n {/* 文件列表 */}\n <div className=\"min-h-96\">\n {state.loading ? (\n <div className=\"flex items-center justify-center h-32\">\n <div className=\"text-gray-500\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-2\"></div>\n <p>加载中...</p>\n </div>\n </div>\n ) : state.files.length === 0 ? (\n <div className=\"flex items-center justify-center h-32\">\n <div className=\"text-center text-gray-500\">\n <p className=\"text-4xl mb-2\">📁</p>\n <p>暂无文件</p>\n {allowUpload && (\n <button\n onClick={() => setState(prev => ({ ...prev, showUploadModal: true }))}\n className=\"mt-2 text-blue-600 hover:text-blue-800\"\n >\n 点击上传第一个文件\n </button>\n )}\n </div>\n </div>\n ) : (\n <div className={clsx('grid gap-4', mode === 'grid' \n ? 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6'\n : 'grid-cols-1')}>\n {state.files.map(renderFileItem)}\n </div>\n )}\n </div>\n\n {/* 分页 */}\n {renderPagination()}\n\n {/* 文件预览模态框 */}\n {state.previewFile && showPreview && (\n <FilePreviewModal\n file={state.previewFile}\n onClose={handleClosePreview}\n />\n )}\n\n {/* 上传模态框 */}\n {state.showUploadModal && allowUpload && (\n <UploadModal\n moduleId={moduleId}\n businessId={businessId}\n onClose={() => setState(prev => ({ ...prev, showUploadModal: false }))}\n onUploadComplete={(files) => {\n setState(prev => ({ ...prev, showUploadModal: false }));\n if (onUploadComplete) {\n onUploadComplete(files);\n }\n loadFiles(); // 重新加载文件列表\n }}\n />\n )}\n </div>\n );\n};\n\n// 文件预览模态框组件\nexport interface FilePreviewModalProps {\n file: FileMetadata;\n onClose: () => void;\n}\n\nconst FilePreviewModal: React.FC<FilePreviewModalProps> = ({ file, onClose }) => {\n const renderPreviewContent = () => {\n if (file.mimeType.startsWith('image/')) {\n return (\n <img\n src={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n alt={file.originalName}\n className=\"max-w-full max-h-full object-contain\"\n />\n );\n }\n\n if (file.mimeType.startsWith('video/')) {\n return (\n <video\n src={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n controls\n className=\"max-w-full max-h-full\"\n >\n 您的浏览器不支持视频播放\n </video>\n );\n }\n\n if (file.mimeType.startsWith('audio/')) {\n return (\n <div className=\"flex flex-col items-center space-y-4\">\n <div className=\"text-6xl\">🎵</div>\n <audio\n src={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n controls\n className=\"w-full max-w-md\"\n >\n 您的浏览器不支持音频播放\n </audio>\n </div>\n );\n }\n\n if (file.mimeType.includes('pdf')) {\n return (\n <iframe\n src={(file.cdnUrl || '/api/files/'+ (file.id) + '/download') + '#toolbar=0'}\n className=\"w-full h-full min-h-96\"\n title={file.originalName}\n />\n );\n }\n\n return (\n <div className=\"flex flex-col items-center justify-center h-64 text-gray-500\">\n <div className=\"text-4xl mb-4\">📄</div>\n <p>此文件类型暂不支持预览</p>\n <a\n href={file.cdnUrl || '/api/files/' + (file.id) + '/download'}\n download={file.originalName}\n className=\"mt-4 px-4 py-2 text-blue-600 border border-blue-300 rounded hover:bg-blue-50\"\n >\n 下载文件\n </a>\n </div>\n );\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50\">\n <div className=\"bg-white rounded-lg max-w-4xl max-h-[90vh] overflow-hidden flex flex-col\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <h2 className=\"text-lg font-medium truncate\" title={file.originalName}>\n {file.originalName}\n </h2>\n <button\n onClick={onClose}\n className=\"p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100\"\n >\n ✕\n </button>\n </div>\n\n {/* 预览内容 */}\n <div className=\"flex-1 p-4 overflow-auto flex items-center justify-center\">\n {renderPreviewContent()}\n </div>\n\n {/* 底部信息 */}\n <div className=\"p-4 border-t bg-gray-50 text-sm text-gray-600\">\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <span className=\"font-medium\">文件大小:</span>\n {(file.size / 1024 / 1024).toFixed(2)} MB\n </div>\n <div>\n <span className=\"font-medium\">上传时间:</span>\n {new Date(file.uploadTime).toLocaleString()}\n </div>\n <div>\n <span className=\"font-medium\">文件类型:</span>\n {file.mimeType}\n </div>\n <div>\n <span className=\"font-medium\">访问次数:</span>\n {file.accessCount}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// 上传模态框组件\nexport interface UploadModalProps {\n moduleId?: string;\n businessId?: string;\n onClose: () => void;\n onUploadComplete: (files: FileMetadata[]) => void;\n}\n\nconst UploadModal: React.FC<UploadModalProps> = ({\n moduleId,\n businessId,\n onClose,\n onUploadComplete\n}) => {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50\">\n <div className=\"bg-white rounded-lg max-w-2xl w-full max-h-[80vh] overflow-hidden\">\n <div className=\"flex items-center justify-between p-4 border-b\">\n <h2 className=\"text-lg font-medium\">上传文件</h2>\n <button\n onClick={onClose}\n className=\"p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"p-6\">\n <p className=\"text-gray-600 mb-4\">\n 这里将集成UniversalFileUploader组件\n </p>\n \n {/* 这里应该集成 UniversalFileUploader 组件 */}\n <div className=\"border-2 border-dashed border-gray-300 rounded-lg p-8 text-center text-gray-500\">\n <div className=\"text-4xl mb-4\">📁</div>\n <p>拖拽文件到此处或点击选择文件</p>\n <input\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n // 模拟上传完成\n console.log('选择文件:', e.target.files);\n onUploadComplete([]);\n }}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default UniversalFileManager; ","/**\n * 文件夹管理组件\n * 支持创建、重命名、删除文件夹,以及文件夹树形结构显示\n */\n\n'use client';\n\nimport React, { useState, useCallback, useMemo } from 'react';\nimport { FileMetadata } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface FolderNode {\n /** 文件夹ID */\n id: string;\n /** 文件夹名称 */\n name: string;\n /** 父文件夹ID */\n parentId?: string;\n /** 子文件夹 */\n children: FolderNode[];\n /** 文件数量 */\n fileCount: number;\n /** 总大小 */\n totalSize: number;\n /** 创建时间 */\n createdAt: Date;\n /** 更新时间 */\n updatedAt: Date;\n /** 是否展开 */\n expanded?: boolean;\n}\n\nexport interface FolderManagerProps {\n /** 当前文件夹ID */\n currentFolderId?: string;\n /** 文件夹树数据 */\n folderTree: FolderNode[];\n /** 是否显示文件数量 */\n showFileCount?: boolean;\n /** 是否显示文件大小 */\n showSize?: boolean;\n /** 是否允许创建文件夹 */\n allowCreate?: boolean;\n /** 是否允许重命名 */\n allowRename?: boolean;\n /** 是否允许删除 */\n allowDelete?: boolean;\n /** 是否允许拖拽 */\n allowDrag?: boolean;\n /** 文件夹选择回调 */\n onFolderSelect?: (folderId: string) => void;\n /** 文件夹创建回调 */\n onFolderCreate?: (parentId: string | undefined, name: string) => Promise<FolderNode>;\n /** 文件夹重命名回调 */\n onFolderRename?: (folderId: string, newName: string) => Promise<void>;\n /** 文件夹删除回调 */\n onFolderDelete?: (folderId: string) => Promise<void>;\n /** 文件移动回调 */\n onFileMove?: (fileIds: string[], targetFolderId: string) => Promise<void>;\n}\n\ninterface FolderManagerState {\n expandedFolders: Set<string>;\n editingFolder: string | null;\n editingName: string;\n creatingFolder: string | null; // 正在创建子文件夹的父文件夹ID\n newFolderName: string;\n dragOverFolder: string | null;\n contextMenu: {\n folderId: string;\n x: number;\n y: number;\n } | null;\n}\n\nconst FolderManager: React.FC<FolderManagerProps> = ({\n currentFolderId,\n folderTree,\n showFileCount = true,\n showSize = true,\n allowCreate = true,\n allowRename = true,\n allowDelete = true,\n allowDrag = false,\n onFolderSelect,\n onFolderCreate,\n onFolderRename,\n onFolderDelete,\n onFileMove\n}) => {\n const [state, setState] = useState<FolderManagerState>({\n expandedFolders: new Set(currentFolderId ? [currentFolderId] : []),\n editingFolder: null,\n editingName: '',\n creatingFolder: null,\n newFolderName: '',\n dragOverFolder: null,\n contextMenu: null\n });\n\n // 切换文件夹展开状态\n const toggleFolder = useCallback((folderId: string) => {\n setState(prev => {\n const newExpanded = new Set(prev.expandedFolders);\n if (newExpanded.has(folderId)) {\n newExpanded.delete(folderId);\n } else {\n newExpanded.add(folderId);\n }\n return { ...prev, expandedFolders: newExpanded };\n });\n }, []);\n\n // 选择文件夹\n const selectFolder = useCallback((folderId: string) => {\n if (onFolderSelect) {\n onFolderSelect(folderId);\n }\n }, [onFolderSelect]);\n\n // 开始创建文件夹\n const startCreateFolder = useCallback((parentId?: string) => {\n setState(prev => ({\n ...prev,\n creatingFolder: parentId || null,\n newFolderName: '新建文件夹',\n contextMenu: null\n }));\n }, []);\n\n // 确认创建文件夹\n const confirmCreateFolder = useCallback(async () => {\n if (!state.newFolderName.trim() || !onFolderCreate) return;\n\n try {\n await onFolderCreate(state.creatingFolder || undefined, state.newFolderName.trim());\n setState(prev => ({\n ...prev,\n creatingFolder: null,\n newFolderName: ''\n }));\n } catch (error) {\n console.error('创建文件夹失败:', error);\n }\n }, [state.creatingFolder, state.newFolderName, onFolderCreate]);\n\n // 取消创建文件夹\n const cancelCreateFolder = useCallback(() => {\n setState(prev => ({\n ...prev,\n creatingFolder: null,\n newFolderName: ''\n }));\n }, []);\n\n // 开始重命名文件夹\n const startRenameFolder = useCallback((folderId: string, currentName: string) => {\n setState(prev => ({\n ...prev,\n editingFolder: folderId,\n editingName: currentName,\n contextMenu: null\n }));\n }, []);\n\n // 确认重命名文件夹\n const confirmRenameFolder = useCallback(async () => {\n if (!state.editingFolder || !state.editingName.trim() || !onFolderRename) return;\n\n try {\n await onFolderRename(state.editingFolder, state.editingName.trim());\n setState(prev => ({\n ...prev,\n editingFolder: null,\n editingName: ''\n }));\n } catch (error) {\n console.error('重命名文件夹失败:', error);\n }\n }, [state.editingFolder, state.editingName, onFolderRename]);\n\n // 取消重命名文件夹\n const cancelRenameFolder = useCallback(() => {\n setState(prev => ({\n ...prev,\n editingFolder: null,\n editingName: ''\n }));\n }, []);\n\n // 删除文件夹\n const deleteFolder = useCallback(async (folderId: string, folderName: string) => {\n if (!window.confirm('确定要删除文件夹\"' + (folderName) + '\"吗?此操作将删除文件夹内的所有文件。')) {\n return;\n }\n\n if (!onFolderDelete) return;\n\n try {\n await onFolderDelete(folderId);\n setState(prev => ({ ...prev, contextMenu: null }));\n } catch (error) {\n console.error('删除文件夹失败:', error);\n }\n }, [onFolderDelete]);\n\n // 右键菜单处理\n const handleContextMenu = useCallback((e: React.MouseEvent, folderId: string) => {\n e.preventDefault();\n setState(prev => ({\n ...prev,\n contextMenu: {\n folderId,\n x: e.clientX,\n y: e.clientY\n }\n }));\n }, []);\n\n // 关闭右键菜单\n const closeContextMenu = useCallback(() => {\n setState(prev => ({ ...prev, contextMenu: null }));\n }, []);\n\n // 拖拽处理\n const handleDragOver = useCallback((e: React.DragEvent, folderId: string) => {\n if (!allowDrag) return;\n e.preventDefault();\n setState(prev => ({ ...prev, dragOverFolder: folderId }));\n }, [allowDrag]);\n\n const handleDragLeave = useCallback(() => {\n setState(prev => ({ ...prev, dragOverFolder: null }));\n }, []);\n\n const handleDrop = useCallback(async (e: React.DragEvent, folderId: string) => {\n if (!allowDrag || !onFileMove) return;\n \n e.preventDefault();\n setState(prev => ({ ...prev, dragOverFolder: null }));\n\n try {\n const fileIds = JSON.parse(e.dataTransfer.getData('application/json'));\n await onFileMove(fileIds, folderId);\n } catch (error) {\n console.error('移动文件失败:', error);\n }\n }, [allowDrag, onFileMove]);\n\n // 格式化文件大小\n const formatSize = useCallback((bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }, []);\n\n // 渲染文件夹节点\n const renderFolderNode = useCallback((folder: FolderNode, level: number = 0) => {\n const isExpanded = state.expandedFolders.has(folder.id);\n const isSelected = currentFolderId === folder.id;\n const isEditing = state.editingFolder === folder.id;\n const isDragOver = state.dragOverFolder === folder.id;\n\n return (\n <div key={folder.id} className=\"select-none\">\n {/* 文件夹项 */}\n <div\n className={clsx('flex items-center py-1 px-2 rounded-md cursor-pointer transition-colors', isSelected \n ? 'bg-blue-100 text-blue-800' \n : isDragOver\n ? 'bg-green-100'\n : 'hover:bg-gray-100')}\n style={{ paddingLeft: (level * 16 + 8) + 'px' }}\n onClick={() => selectFolder(folder.id)}\n onContextMenu={(e) => handleContextMenu(e, folder.id)}\n onDragOver={allowDrag ? (e) => handleDragOver(e, folder.id) : undefined}\n onDragLeave={allowDrag ? handleDragLeave : undefined}\n onDrop={allowDrag ? (e) => handleDrop(e, folder.id) : undefined}\n >\n {/* 展开图标 */}\n {folder.children.length > 0 && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleFolder(folder.id);\n }}\n className=\"mr-1 p-1 hover:bg-gray-200 rounded\"\n >\n <span className={clsx('text-xs transition-transform', isExpanded ? 'rotate-90' : '')}>\n ▶\n </span>\n </button>\n )}\n\n {/* 文件夹图标 */}\n <span className=\"mr-2 text-yellow-600\">\n {isExpanded ? '📂' : '📁'}\n </span>\n\n {/* 文件夹名称 */}\n <div className=\"flex-1 flex items-center justify-between\">\n {isEditing ? (\n <input\n type=\"text\"\n value={state.editingName}\n onChange={(e) => setState(prev => ({ ...prev, editingName: e.target.value }))}\n onBlur={confirmRenameFolder}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n confirmRenameFolder();\n } else if (e.key === 'Escape') {\n cancelRenameFolder();\n }\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500\"\n autoFocus\n />\n ) : (\n <span className=\"text-sm truncate\">{folder.name}</span>\n )}\n\n {/* 文件信息 */}\n <div className=\"flex items-center space-x-2 text-xs text-gray-500 ml-2\">\n {showFileCount && (\n <span>{folder.fileCount} 项</span>\n )}\n {showSize && folder.totalSize > 0 && (\n <span>{formatSize(folder.totalSize)}</span>\n )}\n </div>\n </div>\n </div>\n\n {/* 创建新文件夹输入框 */}\n {state.creatingFolder === folder.id && (\n <div\n className=\"flex items-center py-1 px-2 ml-4\"\n style={{ paddingLeft: ((level + 1) * 16 + 8) + 'px' }}\n >\n <span className=\"mr-2 text-yellow-600\">📁</span>\n <input\n type=\"text\"\n value={state.newFolderName}\n onChange={(e) => setState(prev => ({ ...prev, newFolderName: e.target.value }))}\n onBlur={confirmCreateFolder}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n confirmCreateFolder();\n } else if (e.key === 'Escape') {\n cancelCreateFolder();\n }\n }}\n className=\"flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500\"\n autoFocus\n />\n </div>\n )}\n\n {/* 子文件夹 */}\n {isExpanded && folder.children.map(child => \n renderFolderNode(child, level + 1)\n )}\n </div>\n );\n }, [\n state.expandedFolders,\n state.editingFolder,\n state.editingName,\n state.creatingFolder,\n state.newFolderName,\n state.dragOverFolder,\n currentFolderId,\n allowDrag,\n showFileCount,\n showSize,\n selectFolder,\n toggleFolder,\n handleContextMenu,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n confirmRenameFolder,\n cancelRenameFolder,\n confirmCreateFolder,\n cancelCreateFolder,\n formatSize\n ]);\n\n // 渲染右键菜单\n const renderContextMenu = () => {\n if (!state.contextMenu) return null;\n\n const folder = findFolderById(folderTree, state.contextMenu.folderId);\n if (!folder) return null;\n\n return (\n <div\n className=\"fixed bg-white border border-gray-200 rounded-md shadow-lg z-[50] py-1\"\n style={{\n left: state.contextMenu.x,\n top: state.contextMenu.y\n }}\n onClick={closeContextMenu}\n >\n {allowCreate && (\n <button\n onClick={() => startCreateFolder(folder.id)}\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-gray-100 flex items-center\"\n >\n <span className=\"mr-2\">📁</span>\n 新建子文件夹\n </button>\n )}\n \n {allowRename && (\n <button\n onClick={() => startRenameFolder(folder.id, folder.name)}\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-gray-100 flex items-center\"\n >\n <span className=\"mr-2\">✏️</span>\n 重命名\n </button>\n )}\n \n {allowDelete && (\n <button\n onClick={() => deleteFolder(folder.id, folder.name)}\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-gray-100 text-red-600 flex items-center\"\n >\n <span className=\"mr-2\">🗑️</span>\n 删除文件夹\n </button>\n )}\n </div>\n );\n };\n\n // 根据ID查找文件夹\n const findFolderById = (folders: FolderNode[], id: string): FolderNode | null => {\n for (const folder of folders) {\n if (folder.id === id) return folder;\n const found = findFolderById(folder.children, id);\n if (found) return found;\n }\n return null;\n };\n\n // 点击外部关闭菜单\n React.useEffect(() => {\n if (!state.contextMenu) return;\n\n const handleClickOutside = () => {\n closeContextMenu();\n };\n\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n }, [state.contextMenu, closeContextMenu]);\n\n return (\n <div className=\"relative\">\n {/* 工具栏 */}\n <div className=\"flex items-center justify-between p-2 border-b bg-gray-50\">\n <h3 className=\"text-sm font-medium text-gray-700\">文件夹</h3>\n {allowCreate && (\n <button\n onClick={() => startCreateFolder()}\n className=\"px-2 py-1 text-xs text-blue-600 border border-blue-300 rounded hover:bg-blue-50\"\n title=\"新建文件夹\"\n >\n ➕\n </button>\n )}\n </div>\n\n {/* 文件夹树 */}\n <div className=\"p-2 max-h-96 overflow-y-auto\">\n {folderTree.length === 0 ? (\n <div className=\"text-center text-gray-500 py-8\">\n <div className=\"text-2xl mb-2\">📁</div>\n <p className=\"text-sm\">暂无文件夹</p>\n {allowCreate && (\n <button\n onClick={() => startCreateFolder()}\n className=\"mt-2 text-blue-600 hover:text-blue-800 text-sm\"\n >\n 创建第一个文件夹\n </button>\n )}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {folderTree.map(folder => renderFolderNode(folder))}\n </div>\n )}\n\n {/* 根目录创建文件夹 */}\n {state.creatingFolder === null && (\n <div className=\"flex items-center py-1 px-2\">\n <span className=\"mr-2 text-yellow-600\">📁</span>\n <input\n type=\"text\"\n value={state.newFolderName}\n onChange={(e) => setState(prev => ({ ...prev, newFolderName: e.target.value }))}\n onBlur={confirmCreateFolder}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n confirmCreateFolder();\n } else if (e.key === 'Escape') {\n cancelCreateFolder();\n }\n }}\n className=\"flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500\"\n autoFocus\n />\n </div>\n )}\n </div>\n\n {/* 右键菜单 */}\n {renderContextMenu()}\n </div>\n );\n};\n\nexport default FolderManager; ","/**\n * 文件分享模态框组件\n * 支持生成分享链接、设置访问权限、过期时间等\n */\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { FileMetadata } from '../types';\n\nexport interface FileShareModalProps {\n /** 要分享的文件 */\n files: FileMetadata[];\n /** 关闭回调 */\n onClose: () => void;\n /** 分享成功回调 */\n onShareSuccess?: (shareInfo: ShareInfo) => void;\n}\n\nexport interface ShareInfo {\n /** 分享链接 */\n shareUrl: string;\n /** 访问密码 */\n password?: string;\n /** 过期时间 */\n expiresAt?: Date;\n /** 访问权限 */\n permission: 'view' | 'download';\n /** 分享代码 */\n shareCode: string;\n}\n\ninterface ShareOptions {\n /** 过期时间类型 */\n expireType: 'never' | '1hour' | '1day' | '7days' | '30days' | 'custom';\n /** 自定义过期时间 */\n customExpireTime?: Date;\n /** 是否需要密码 */\n requirePassword: boolean;\n /** 访问密码 */\n password: string;\n /** 访问权限 */\n permission: 'view' | 'download';\n /** 允许的下载次数 */\n downloadLimit?: number;\n}\n\nconst FileShareModal: React.FC<FileShareModalProps> = ({\n files,\n onClose,\n onShareSuccess\n}) => {\n const [shareOptions, setShareOptions] = useState<ShareOptions>({\n expireType: '7days',\n requirePassword: false,\n password: '',\n permission: 'view',\n downloadLimit: undefined\n });\n\n const [loading, setLoading] = useState(false);\n const [shareInfo, setShareInfo] = useState<ShareInfo | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // 生成随机密码\n const generatePassword = useCallback(() => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let password = '';\n for (let i = 0; i < 6; i++) {\n password += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n setShareOptions(prev => ({ ...prev, password }));\n }, []);\n\n // 计算过期时间\n const getExpiresAt = useCallback((): Date | undefined => {\n const now = new Date();\n switch (shareOptions.expireType) {\n case 'never':\n return undefined;\n case '1hour':\n return new Date(now.getTime() + 60 * 60 * 1000);\n case '1day':\n return new Date(now.getTime() + 24 * 60 * 60 * 1000);\n case '7days':\n return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);\n case '30days':\n return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n case 'custom':\n return shareOptions.customExpireTime;\n default:\n return undefined;\n }\n }, [shareOptions.expireType, shareOptions.customExpireTime]);\n\n // 创建分享\n const handleCreateShare = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const expiresAt = getExpiresAt();\n \n // 这里应该调用实际的分享API\n // const shareResult = await fileService.createShare({\n // fileIds: files.map(f => f.id),\n // password: shareOptions.requirePassword ? shareOptions.password : undefined,\n // expiresAt,\n // permission: shareOptions.permission,\n // downloadLimit: shareOptions.downloadLimit\n // });\n\n // 模拟API调用\n const mockShareInfo: ShareInfo = {\n shareUrl: (window.location.origin) + '/share/' + (generateShareCode()),\n password: shareOptions.requirePassword ? shareOptions.password : undefined,\n expiresAt,\n permission: shareOptions.permission,\n shareCode: generateShareCode()\n };\n\n setShareInfo(mockShareInfo);\n \n if (onShareSuccess) {\n onShareSuccess(mockShareInfo);\n }\n\n } catch (error) {\n console.error('创建分享失败:', error);\n setError(error instanceof Error ? error.message : '创建分享失败');\n } finally {\n setLoading(false);\n }\n }, [files, shareOptions, getExpiresAt, onShareSuccess]);\n\n // 生成分享代码\n const generateShareCode = useCallback(() => {\n return Math.random().toString(36).substring(2, 10).toUpperCase();\n }, []);\n\n // 复制到剪贴板\n const copyToClipboard = useCallback(async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n // 这里可以显示复制成功提示\n console.log('复制成功');\n } catch (error) {\n console.error('复制失败:', error);\n // 备用方案\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n }\n }, []);\n\n // 格式化文件列表\n const formatFileList = useCallback(() => {\n if (files.length === 0) return '0 个文件';\n if (files.length === 1 && files[0]) {\n return files[0].originalName;\n }\n return (files.length) + ' 个文件';\n }, [files]);\n\n // 渲染分享设置\n const renderShareSettings = () => {\n if (shareInfo) return null;\n\n return (\n <div className=\"space-y-6\">\n {/* 文件信息 */}\n <div className=\"bg-gray-50 p-4 rounded-lg\">\n <h3 className=\"font-medium text-gray-900 mb-2\">要分享的文件</h3>\n <div className=\"space-y-2\">\n {files.map(file => (\n <div key={file.id} className=\"flex items-center justify-between text-sm\">\n <span className=\"text-gray-700 truncate\">{file.originalName}</span>\n <span className=\"text-gray-500 text-xs\">\n {(file.size / 1024 / 1024).toFixed(2)} MB\n </span>\n </div>\n ))}\n </div>\n </div>\n\n {/* 过期时间设置 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 过期时间\n </label>\n <select\n value={shareOptions.expireType}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n expireType: e.target.value as ShareOptions['expireType']\n }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"never\">永不过期</option>\n <option value=\"1hour\">1小时后</option>\n <option value=\"1day\">1天后</option>\n <option value=\"7days\">7天后</option>\n <option value=\"30days\">30天后</option>\n <option value=\"custom\">自定义时间</option>\n </select>\n\n {shareOptions.expireType === 'custom' && (\n <div className=\"mt-2\">\n <input\n type=\"datetime-local\"\n value={shareOptions.customExpireTime?.toISOString().slice(0, 16) || ''}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n customExpireTime: e.target.value ? new Date(e.target.value) : undefined\n }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n min={new Date().toISOString().slice(0, 16)}\n />\n </div>\n )}\n </div>\n\n {/* 访问权限 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 访问权限\n </label>\n <div className=\"space-y-2\">\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"permission\"\n value=\"view\"\n checked={shareOptions.permission === 'view'}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n permission: e.target.value as 'view' | 'download'\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm\">仅预览(不允许下载)</span>\n </label>\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"permission\"\n value=\"download\"\n checked={shareOptions.permission === 'download'}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n permission: e.target.value as 'view' | 'download'\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm\">允许下载</span>\n </label>\n </div>\n </div>\n\n {/* 访问密码 */}\n <div>\n <label className=\"flex items-center mb-2\">\n <input\n type=\"checkbox\"\n checked={shareOptions.requirePassword}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n requirePassword: e.target.checked,\n password: e.target.checked ? prev.password : ''\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm font-medium text-gray-700\">设置访问密码</span>\n </label>\n\n {shareOptions.requirePassword && (\n <div className=\"flex space-x-2\">\n <input\n type=\"text\"\n value={shareOptions.password}\n onChange={(e) => setShareOptions(prev => ({ \n ...prev, \n password: e.target.value\n }))}\n placeholder=\"输入访问密码\"\n className=\"flex-1 px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500\"\n maxLength={20}\n />\n <button\n type=\"button\"\n onClick={generatePassword}\n className=\"px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 随机生成\n </button>\n </div>\n )}\n </div>\n\n {/* 下载次数限制 */}\n {shareOptions.permission === 'download' && (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 下载次数限制\n </label>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n checked={shareOptions.downloadLimit !== undefined}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n downloadLimit: e.target.checked ? 10 : undefined\n }))}\n className=\"mr-2\"\n />\n <span className=\"text-sm text-gray-700\">限制下载次数</span>\n {shareOptions.downloadLimit !== undefined && (\n <input\n type=\"number\"\n value={shareOptions.downloadLimit}\n onChange={(e) => setShareOptions(prev => ({\n ...prev,\n downloadLimit: parseInt(e.target.value) || 1\n }))}\n min={1}\n max={1000}\n className=\"w-20 px-2 py-1 text-sm border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500\"\n />\n )}\n </div>\n </div>\n )}\n </div>\n );\n };\n\n // 渲染分享结果\n const renderShareResult = () => {\n if (!shareInfo) return null;\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <div className=\"text-4xl mb-4\">✅</div>\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">\n 分享链接已创建\n </h3>\n <p className=\"text-sm text-gray-600\">\n {formatFileList()} 已成功创建分享链接\n </p>\n </div>\n\n {/* 分享链接 */}\n <div className=\"bg-gray-50 p-4 rounded-lg\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 分享链接\n </label>\n <div className=\"flex space-x-2\">\n <input\n type=\"text\"\n value={shareInfo.shareUrl}\n readOnly\n className=\"flex-1 px-3 py-2 text-sm bg-white border border-gray-300 rounded-md\"\n />\n <button\n onClick={() => copyToClipboard(shareInfo.shareUrl)}\n className=\"px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 复制链接\n </button>\n </div>\n </div>\n\n {/* 访问密码 */}\n {shareInfo.password && (\n <div className=\"bg-yellow-50 p-4 rounded-lg\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 访问密码\n </label>\n <div className=\"flex space-x-2\">\n <input\n type=\"text\"\n value={shareInfo.password}\n readOnly\n className=\"flex-1 px-3 py-2 text-sm bg-white border border-gray-300 rounded-md\"\n />\n <button\n onClick={() => copyToClipboard(shareInfo.password!)}\n className=\"px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 复制密码\n </button>\n </div>\n <p className=\"text-xs text-yellow-800 mt-2\">\n ⚠️ 请妥善保管访问密码,访问者需要此密码才能查看文件\n </p>\n </div>\n )}\n\n {/* 分享信息 */}\n <div className=\"bg-blue-50 p-4 rounded-lg\">\n <h4 className=\"text-sm font-medium text-blue-900 mb-2\">分享信息</h4>\n <div className=\"space-y-1 text-sm text-blue-800\">\n <div>\n <span className=\"font-medium\">权限:</span>\n {shareInfo.permission === 'view' ? '仅预览' : '允许下载'}\n </div>\n {shareInfo.expiresAt && (\n <div>\n <span className=\"font-medium\">过期时间:</span>\n {shareInfo.expiresAt.toLocaleString()}\n </div>\n )}\n <div>\n <span className=\"font-medium\">分享代码:</span>\n {shareInfo.shareCode}\n </div>\n </div>\n </div>\n\n {/* 复制完整信息 */}\n <div className=\"flex space-x-2\">\n <button\n onClick={() => {\n const shareText = [\n '文件分享:' + (formatFileList()),\n '链接:' + (shareInfo.shareUrl),\n shareInfo.password ? '密码:' + (shareInfo.password) : '',\n shareInfo.expiresAt ? '过期时间:' + (shareInfo.expiresAt.toLocaleString()) : '永不过期'\n ].filter(Boolean).join('\\n');\n \n copyToClipboard(shareText);\n }}\n className=\"flex-1 px-4 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50\"\n >\n 📋 复制完整信息\n </button>\n <button\n onClick={() => {\n // 生成二维码或其他分享方式\n console.log('其他分享方式');\n }}\n className=\"px-4 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\"\n >\n 🔗 其他分享方式\n </button>\n </div>\n </div>\n );\n };\n\n return (\n <div className=\"fixed inset-0 z-[50] flex items-center justify-center bg-black bg-opacity-50\">\n <div className=\"bg-white rounded-lg max-w-md w-full max-h-[90vh] overflow-hidden\">\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <h2 className=\"text-lg font-medium\">\n {shareInfo ? '分享成功' : '创建分享链接'}\n </h2>\n <button\n onClick={onClose}\n className=\"p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100\"\n >\n ✕\n </button>\n </div>\n\n {/* 内容 */}\n <div className=\"p-6 max-h-[calc(90vh-120px)] overflow-y-auto\">\n {/* 错误提示 */}\n {error && (\n <div className=\"mb-4 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-800 text-sm\">{error}</p>\n </div>\n )}\n\n {renderShareSettings()}\n {renderShareResult()}\n </div>\n\n {/* 底部按钮 */}\n {!shareInfo && (\n <div className=\"flex items-center justify-end space-x-2 p-4 border-t bg-gray-50\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50\"\n >\n 取消\n </button>\n <button\n onClick={handleCreateShare}\n disabled={loading || (shareOptions.requirePassword && !shareOptions.password)}\n className=\"px-4 py-2 text-sm text-white bg-blue-600 rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading ? (\n <span className=\"flex items-center\">\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2\"></div>\n 创建中...\n </span>\n ) : (\n '创建分享链接'\n )}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FileShareModal; "]}
|