sa2kit 1.6.52 → 1.6.57
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/booking-BXtkG2ns.d.mts +386 -0
- package/dist/booking-BXtkG2ns.d.ts +386 -0
- package/dist/bookingAdminService-B2QDjSHJ.d.ts +193 -0
- package/dist/bookingAdminService-Dmg7dC6V.d.mts +193 -0
- package/dist/cart-CcZ7rQyG.d.mts +176 -0
- package/dist/cart-D3o67Q3H.d.ts +176 -0
- package/dist/chunk-53WLQ22S.js +119 -0
- package/dist/chunk-53WLQ22S.js.map +1 -0
- package/dist/{chunk-SHY424RZ.mjs → chunk-6NMIKAE7.mjs} +3 -3
- package/dist/{chunk-SHY424RZ.mjs.map → chunk-6NMIKAE7.mjs.map} +1 -1
- package/dist/chunk-ANKVXRPY.mjs +30 -0
- package/dist/chunk-ANKVXRPY.mjs.map +1 -0
- package/dist/{chunk-IZOIVYOW.js → chunk-DENROXAE.js} +2 -2
- package/dist/{chunk-IZOIVYOW.js.map → chunk-DENROXAE.js.map} +1 -1
- package/dist/chunk-HYZ5C6FY.mjs +3522 -0
- package/dist/chunk-HYZ5C6FY.mjs.map +1 -0
- package/dist/{chunk-7JN25DJB.js → chunk-IPY26RQH.js} +11 -11
- package/dist/{chunk-7JN25DJB.js.map → chunk-IPY26RQH.js.map} +1 -1
- package/dist/{chunk-GFVAIT6Y.mjs → chunk-MFG2Y6UR.mjs} +2 -2
- package/dist/{chunk-GFVAIT6Y.mjs.map → chunk-MFG2Y6UR.mjs.map} +1 -1
- package/dist/chunk-TJZDPOO7.js +34 -0
- package/dist/chunk-TJZDPOO7.js.map +1 -0
- package/dist/chunk-U7AQC2Z7.js +3542 -0
- package/dist/chunk-U7AQC2Z7.js.map +1 -0
- package/dist/chunk-UR5TU4MW.mjs +113 -0
- package/dist/chunk-UR5TU4MW.mjs.map +1 -0
- package/dist/chunk-V6BXO6ZS.mjs +6107 -0
- package/dist/chunk-V6BXO6ZS.mjs.map +1 -0
- package/dist/chunk-W2NCOORK.js +6138 -0
- package/dist/chunk-W2NCOORK.js.map +1 -0
- package/dist/showmasterpiece/db/index.d.mts +3028 -0
- package/dist/showmasterpiece/db/index.d.ts +3028 -0
- package/dist/showmasterpiece/db/index.js +179 -0
- package/dist/showmasterpiece/db/index.js.map +1 -0
- package/dist/showmasterpiece/db/index.mjs +6 -0
- package/dist/showmasterpiece/db/index.mjs.map +1 -0
- package/dist/showmasterpiece/index.d.mts +10 -1729
- package/dist/showmasterpiece/index.d.ts +10 -1729
- package/dist/showmasterpiece/index.js +435 -9654
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +9 -9628
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/logic/index.d.mts +372 -0
- package/dist/showmasterpiece/logic/index.d.ts +372 -0
- package/dist/showmasterpiece/logic/index.js +91 -0
- package/dist/showmasterpiece/logic/index.js.map +1 -0
- package/dist/showmasterpiece/logic/index.mjs +6 -0
- package/dist/showmasterpiece/logic/index.mjs.map +1 -0
- package/dist/showmasterpiece/server/index.d.mts +3 -2704
- package/dist/showmasterpiece/server/index.d.ts +3 -2704
- package/dist/showmasterpiece/server/index.js +43 -43
- package/dist/showmasterpiece/server/index.mjs +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.d.mts +86 -0
- package/dist/showmasterpiece/ui/miniapp/index.d.ts +86 -0
- package/dist/showmasterpiece/ui/miniapp/index.js +196 -0
- package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -0
- package/dist/showmasterpiece/ui/miniapp/index.mjs +183 -0
- package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -0
- package/dist/showmasterpiece/ui/web/index.d.mts +600 -0
- package/dist/showmasterpiece/ui/web/index.d.ts +600 -0
- package/dist/showmasterpiece/ui/web/index.js +131 -0
- package/dist/showmasterpiece/ui/web/index.js.map +1 -0
- package/dist/showmasterpiece/ui/web/index.mjs +14 -0
- package/dist/showmasterpiece/ui/web/index.mjs.map +1 -0
- package/dist/universalFile/server/index.js +5877 -283
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +5795 -4
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/package.json +26 -1
- package/dist/chunk-PKKIDPXE.mjs +0 -5797
- package/dist/chunk-PKKIDPXE.mjs.map +0 -1
- package/dist/chunk-TSTBLX6B.js +0 -5888
- package/dist/chunk-TSTBLX6B.js.map +0 -1
- package/dist/popupConfig-BznThU1O.d.mts +0 -330
- package/dist/popupConfig-BznThU1O.d.ts +0 -330
- package/dist/showmasterpiece/migration/index.d.mts +0 -120
- package/dist/showmasterpiece/migration/index.d.ts +0 -120
- package/dist/showmasterpiece/migration/index.js +0 -595
- package/dist/showmasterpiece/migration/index.js.map +0 -1
- package/dist/showmasterpiece/migration/index.mjs +0 -589
- package/dist/showmasterpiece/migration/index.mjs.map +0 -1
- package/dist/showmasterpiece/scripts/index.d.mts +0 -28
- package/dist/showmasterpiece/scripts/index.d.ts +0 -28
- package/dist/showmasterpiece/scripts/index.js +0 -327
- package/dist/showmasterpiece/scripts/index.js.map +0 -1
- package/dist/showmasterpiece/scripts/index.mjs +0 -325
- package/dist/showmasterpiece/scripts/index.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/showmasterpiece/migration/ArtworkMigrator.ts","../../../src/showmasterpiece/migration/runMigration.ts"],"names":["inArray","comicUniverseArtworks","and","or","isNull","eq","fileStorageProviders","uuidv4","fileFolders","comicUniverseCollections","existsSync","mkdirSync","writeFileSync","join","createHash","readFileSync","fileMetadata"],"mappings":"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","file":"index.js","sourcesContent":["// @ts-nocheck\n/**\n * ShowMasterpiece模块 - 作品图片迁移工具\n * \n * 将现有的Base64图片数据迁移到通用文件服务系统\n * \n * 主要功能:\n * - Base64图片解析和验证\n * - 上传到通用文件服务\n * - 更新数据库引用\n * - 迁移状态跟踪\n * - 回滚机制\n */\n\nimport { comicUniverseArtworks, comicUniverseCollections } from '../server';\nimport { fileMetadata, fileFolders, fileStorageProviders } from '../../universalFile/server';\nimport { eq, and, inArray, isNull, or } from 'drizzle-orm';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createHash } from 'crypto';\nimport { writeFileSync, readFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, extname, basename } from 'path';\n\n/**\n * 迁移配置接口\n */\nexport interface MigrationConfig {\n /** 批处理大小 */\n batchSize: number;\n /** 是否试运行 */\n dryRun: boolean;\n /** 是否验证文件完整性 */\n validateFiles: boolean;\n /** 是否备份原数据 */\n backupOldData: boolean;\n /** 是否强制覆盖已存在的文件 */\n forceOverwrite: boolean;\n /** 是否上传到OSS */\n enableOSSUpload: boolean;\n /** 指定画集ID(空表示全部) */\n collectionIds?: number[];\n}\n\n/**\n * 迁移统计信息\n */\nexport interface MigrationStats {\n totalArtworks: number;\n processedCount: number;\n successCount: number;\n failedCount: number;\n skippedCount: number;\n totalFileSize: number;\n processedFileSize: number;\n errors: Array<{\n artworkId: number;\n error: string;\n timestamp: Date;\n }>;\n}\n\n/**\n * 作品迁移器类\n */\nexport class ArtworkMigrator {\n private readonly db: any;\n private config: MigrationConfig;\n private stats: MigrationStats;\n private folderCache = new Map<string, any>();\n private storageProviderCache = new Map<string, any>();\n\n constructor(db: any, config: MigrationConfig) {\n this.db = db;\n this.config = config;\n this.stats = {\n totalArtworks: 0,\n processedCount: 0,\n successCount: 0,\n failedCount: 0,\n skippedCount: 0,\n totalFileSize: 0,\n processedFileSize: 0,\n errors: []\n };\n }\n\n /**\n * 开始迁移\n */\n async migrate(): Promise<MigrationStats> {\n console.log('🚀 [ArtworkMigrator] 开始作品图片迁移...');\n console.log('📋 [ArtworkMigrator] 配置:', this.config);\n\n try {\n // 1. 分析现有数据\n await this.analyzeData();\n\n // 2. 准备迁移环境\n await this.prepareMigrationEnvironment();\n\n // 3. 执行批量迁移\n await this.performBatchMigration();\n\n // 4. 生成迁移报告\n this.generateReport();\n\n return this.stats;\n } catch (error) {\n console.error('💥 [ArtworkMigrator] 迁移失败:', error);\n throw error;\n }\n }\n\n /**\n * 分析现有数据\n */\n private async analyzeData(): Promise<void> {\n console.log('🔍 [ArtworkMigrator] 分析现有数据...');\n\n const whereConditions = [];\n \n // 添加画集ID筛选\n if (this.config.collectionIds && this.config.collectionIds.length > 0) {\n whereConditions.push(inArray(comicUniverseArtworks.collectionId, this.config.collectionIds));\n }\n\n // 只处理有图片数据且尚未迁移的记录\n whereConditions.push(\n and(\n or(\n isNull(comicUniverseArtworks.fileId),\n eq(comicUniverseArtworks.migrationStatus, 'pending'),\n eq(comicUniverseArtworks.migrationStatus, 'failed')\n ),\n // 必须有image数据(兼容可能的null值)\n eq(comicUniverseArtworks.isActive, true)\n )\n );\n\n const query = this.db\n .select({\n id: comicUniverseArtworks.id,\n title: comicUniverseArtworks.title,\n image: comicUniverseArtworks.image,\n collectionId: comicUniverseArtworks.collectionId,\n migrationStatus: comicUniverseArtworks.migrationStatus\n })\n .from(comicUniverseArtworks);\n\n if (whereConditions.length > 0) {\n query.where(and(...whereConditions));\n }\n\n const artworks = await query;\n\n // 计算统计信息\n this.stats.totalArtworks = artworks.length;\n \n for (const artwork of artworks) {\n if (artwork.image && artwork.image.startsWith('data:')) {\n const base64Data = artwork.image.split(',')[1];\n if (base64Data) {\n this.stats.totalFileSize += Math.round(base64Data.length * 0.75); // Base64 to bytes\n }\n }\n }\n\n console.log('📊 [ArtworkMigrator] 数据分析结果:', {\n totalArtworks: this.stats.totalArtworks,\n totalFileSize: `${(this.stats.totalFileSize / 1024 / 1024).toFixed(2)} MB`,\n collectionFilter: this.config.collectionIds?.length || 'all'\n });\n\n if (this.stats.totalArtworks === 0) {\n console.log('ℹ️ [ArtworkMigrator] 没有需要迁移的作品');\n return;\n }\n }\n\n /**\n * 准备迁移环境\n */\n private async prepareMigrationEnvironment(): Promise<void> {\n console.log('🛠️ [ArtworkMigrator] 准备迁移环境...');\n\n // 1. 确保存储提供者存在\n await this.ensureStorageProvider();\n\n // 2. 创建模块文件夹\n await this.ensureModuleFolders();\n\n // 3. 备份原数据(如果启用)\n if (this.config.backupOldData && !this.config.dryRun) {\n await this.backupOriginalData();\n }\n }\n\n /**\n * 确保存储提供者存在\n */\n private async ensureStorageProvider(): Promise<void> {\n let provider = this.storageProviderCache.get('local-default');\n if (!provider) {\n const [existingProvider] = await this.db\n .select()\n .from(fileStorageProviders)\n .where(eq(fileStorageProviders.name, 'local-default'))\n .limit(1);\n\n if (existingProvider) {\n provider = existingProvider;\n } else if (!this.config.dryRun) {\n // 创建默认本地存储提供者\n [provider] = await this.db\n .insert(fileStorageProviders)\n .values({\n name: 'local-default',\n type: 'local',\n config: {\n basePath: './uploads',\n publicUrl: '/uploads'\n },\n isDefault: true,\n isActive: true\n })\n .returning();\n } else {\n // 试运行模式下创建模拟存储提供者\n provider = {\n id: 1,\n name: 'local-default',\n type: 'local',\n config: {\n basePath: './uploads',\n publicUrl: '/uploads'\n },\n isDefault: true,\n isActive: true,\n priority: 100,\n maxFileSize: null,\n supportedMimeTypes: null,\n createdAt: new Date(),\n updatedAt: new Date()\n };\n }\n\n if (provider) {\n this.storageProviderCache.set('local-default', provider);\n }\n }\n }\n\n /**\n * 确保模块文件夹存在\n */\n private async ensureModuleFolders(): Promise<void> {\n // 创建ShowMasterpiece根文件夹\n const rootFolderId = uuidv4();\n const rootFolderName = 'ShowMasterpiece';\n \n let rootFolder = this.folderCache.get(rootFolderName);\n if (!rootFolder) {\n const [existingFolder] = await this.db\n .select()\n .from(fileFolders)\n .where(eq(fileFolders.name, rootFolderName))\n .limit(1);\n\n if (existingFolder) {\n rootFolder = existingFolder;\n } else if (!this.config.dryRun) {\n [rootFolder] = await this.db\n .insert(fileFolders)\n .values({\n id: rootFolderId,\n name: rootFolderName,\n path: '/showmasterpiece',\n moduleId: 'showmasterpiece',\n depth: 1,\n sortOrder: 1,\n isSystem: true,\n createdBy: 'system'\n })\n .returning();\n } else {\n // 试运行模式下创建模拟文件夹对象\n rootFolder = {\n id: rootFolderId,\n name: rootFolderName,\n path: '/showmasterpiece',\n moduleId: 'showmasterpiece',\n depth: 1,\n sortOrder: 1,\n isSystem: true,\n createdBy: 'system'\n };\n }\n\n if (rootFolder) {\n this.folderCache.set(rootFolderName, rootFolder);\n }\n }\n\n // 获取需要处理的画集ID(从现有数据中获取)\n let collectionIds = this.config.collectionIds;\n if (!collectionIds) {\n const artworks = await this.db\n .select({ collectionId: comicUniverseArtworks.collectionId })\n .from(comicUniverseArtworks)\n .where(eq(comicUniverseArtworks.isActive, true));\n \n const uniqueCollectionIds = [...new Set(artworks.map(a => a.collectionId))];\n collectionIds = uniqueCollectionIds;\n }\n\n if (collectionIds && collectionIds.length > 0) {\n const collections = await this.db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title\n })\n .from(comicUniverseCollections)\n .where(inArray(comicUniverseCollections.id, collectionIds));\n\n for (const collection of collections) {\n const folderName = `Collection-${collection.id}`;\n let collectionFolder = this.folderCache.get(folderName);\n \n if (!collectionFolder) {\n if (!this.config.dryRun) {\n const folderId = uuidv4();\n [collectionFolder] = await this.db\n .insert(fileFolders)\n .values({\n id: folderId,\n name: collection.title,\n path: `/showmasterpiece/collection-${collection.id}`,\n moduleId: 'showmasterpiece',\n parentId: rootFolder?.id,\n depth: 2,\n sortOrder: collection.id,\n isSystem: false,\n createdBy: 'system'\n })\n .returning();\n } else {\n // 试运行模式下创建模拟文件夹对象\n collectionFolder = {\n id: uuidv4(),\n name: collection.title,\n path: `/showmasterpiece/collection-${collection.id}`,\n moduleId: 'showmasterpiece',\n parentId: rootFolder?.id,\n depth: 2,\n sortOrder: collection.id,\n isSystem: false,\n createdBy: 'system'\n };\n }\n\n this.folderCache.set(folderName, collectionFolder);\n }\n }\n }\n }\n\n /**\n * 备份原始数据\n */\n private async backupOriginalData(): Promise<void> {\n console.log('💾 [ArtworkMigrator] 备份原始数据...');\n \n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = `./backups/showmasterpiece/${timestamp}`;\n \n if (!existsSync(backupDir)) {\n mkdirSync(backupDir, { recursive: true });\n }\n\n // 备份作品数据\n const artworks = await this.db\n .select()\n .from(comicUniverseArtworks)\n .where(eq(comicUniverseArtworks.isActive, true));\n\n writeFileSync(\n join(backupDir, 'artworks_backup.json'),\n JSON.stringify(artworks, null, 2)\n );\n\n console.log(`✅ [ArtworkMigrator] 备份完成: ${backupDir}`);\n }\n\n /**\n * 执行批量迁移\n */\n private async performBatchMigration(): Promise<void> {\n console.log('🔄 [ArtworkMigrator] 开始批量迁移...');\n\n // 获取需要迁移的作品\n const whereConditions = [];\n \n if (this.config.collectionIds && this.config.collectionIds.length > 0) {\n whereConditions.push(inArray(comicUniverseArtworks.collectionId, this.config.collectionIds));\n }\n\n whereConditions.push(\n and(\n or(\n isNull(comicUniverseArtworks.fileId),\n eq(comicUniverseArtworks.migrationStatus, 'pending'),\n eq(comicUniverseArtworks.migrationStatus, 'failed')\n ),\n eq(comicUniverseArtworks.isActive, true)\n )\n );\n\n const query = this.db\n .select()\n .from(comicUniverseArtworks);\n\n if (whereConditions.length > 0) {\n query.where(and(...whereConditions));\n }\n\n const artworks = await query;\n\n // 分批处理\n const totalBatches = Math.ceil(artworks.length / this.config.batchSize);\n \n for (let i = 0; i < totalBatches; i++) {\n const start = i * this.config.batchSize;\n const end = Math.min(start + this.config.batchSize, artworks.length);\n const batch = artworks.slice(start, end);\n \n console.log(`📦 [ArtworkMigrator] 处理批次 ${i + 1}/${totalBatches}`);\n \n for (const artwork of batch) {\n try {\n await this.migrateArtwork(artwork);\n } catch (error) {\n console.error(`❌ [ArtworkMigrator] 迁移作品失败 ${artwork.id}:`, error);\n this.stats.errors.push({\n artworkId: artwork.id,\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date()\n });\n this.stats.failedCount++;\n }\n this.stats.processedCount++;\n }\n }\n }\n\n /**\n * 迁移单个作品\n */\n private async migrateArtwork(artwork: any): Promise<void> {\n console.log(`📄 [ArtworkMigrator] 迁移作品: ${artwork.id} - ${artwork.title}`);\n\n // 1. 检查是否已经迁移\n if (artwork.fileId && artwork.migrationStatus === 'completed' && !this.config.forceOverwrite) {\n console.log(`⏭️ [ArtworkMigrator] 作品 ${artwork.id} 已迁移,跳过`);\n this.stats.skippedCount++;\n return;\n }\n\n // 2. 验证图片数据\n if (!artwork.image || !artwork.image.startsWith('data:')) {\n console.log(`⚠️ [ArtworkMigrator] 作品 ${artwork.id} 没有有效的图片数据`);\n this.stats.skippedCount++;\n return;\n }\n\n // 3. 解析Base64图片\n const { mimeType, buffer, extension } = this.parseBase64Image(artwork.image);\n const fileSize = buffer.length;\n\n // 4. 生成文件哈希\n const md5Hash = createHash('md5').update(buffer).digest('hex');\n const sha256Hash = createHash('sha256').update(buffer).digest('hex');\n\n // 5. 获取存储提供者和文件夹\n const provider = this.storageProviderCache.get('local-default');\n if (!provider) {\n throw new Error('存储提供者未找到');\n }\n\n const folderName = `Collection-${artwork.collectionId}`;\n const folder = this.folderCache.get(folderName) || this.folderCache.get('ShowMasterpiece');\n if (!folder) {\n throw new Error('目标文件夹未找到');\n }\n\n // 6. 生成文件名和路径\n const storedName = `artwork-${artwork.id}-${Date.now()}${extension}`;\n const storagePath = `showmasterpiece/collection-${artwork.collectionId}/${storedName}`;\n const fullPath = join('./uploads', storagePath);\n\n // 7. 保存文件\n if (!this.config.dryRun) {\n const dir = fullPath.substring(0, fullPath.lastIndexOf('/'));\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(fullPath, buffer);\n }\n\n // 8. 验证文件\n if (this.config.validateFiles && !this.config.dryRun) {\n const savedBuffer = readFileSync(fullPath);\n const savedHash = createHash('md5').update(savedBuffer).digest('hex');\n if (savedHash !== md5Hash) {\n throw new Error('文件验证失败:哈希不匹配');\n }\n }\n\n // 9. 创建文件元数据记录\n let fileRecord = null;\n if (!this.config.dryRun) {\n [fileRecord] = await this.db.insert(fileMetadata).values({\n originalName: `${artwork.title}${extension}`,\n storedName,\n extension: extension.substring(1),\n mimeType,\n size: fileSize,\n md5Hash,\n sha256Hash,\n storagePath,\n storageProviderId: provider.id,\n folderId: folder.id,\n moduleId: 'showmasterpiece',\n businessId: artwork.collectionId.toString(),\n tags: ['artwork', 'masterpiece'],\n uploaderId: 'system'\n }).returning();\n }\n\n // 10. 更新作品记录\n if (!this.config.dryRun && fileRecord) {\n await this.db\n .update(comicUniverseArtworks)\n .set({\n fileId: fileRecord.id,\n migrationStatus: 'completed',\n updatedAt: new Date()\n })\n .where(eq(comicUniverseArtworks.id, artwork.id));\n }\n\n this.stats.successCount++;\n this.stats.processedFileSize += fileSize;\n\n console.log(`✅ [ArtworkMigrator] 作品 ${artwork.id} 迁移成功`);\n }\n\n /**\n * 解析Base64图片\n */\n private parseBase64Image(dataUrl: string): { mimeType: string; buffer: Buffer; extension: string } {\n const matches = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!matches) {\n throw new Error('无效的Base64图片格式');\n }\n\n const mimeType = matches[1];\n const base64Data = matches[2];\n const buffer = Buffer.from(base64Data, 'base64');\n\n // 根据MIME类型确定文件扩展名\n const extensionMap: Record<string, string> = {\n 'image/jpeg': '.jpg',\n 'image/jpg': '.jpg',\n 'image/png': '.png',\n 'image/gif': '.gif',\n 'image/webp': '.webp',\n 'image/bmp': '.bmp'\n };\n\n const extension = extensionMap[mimeType] || '.jpg';\n\n return { mimeType, buffer, extension };\n }\n\n /**\n * 生成迁移报告\n */\n private generateReport(): void {\n console.log('\\n📊 [ArtworkMigrator] 迁移完成报告:');\n console.log('='.repeat(50));\n console.log(`总作品数: ${this.stats.totalArtworks}`);\n console.log(`处理数量: ${this.stats.processedCount}`);\n console.log(`成功数量: ${this.stats.successCount}`);\n console.log(`失败数量: ${this.stats.failedCount}`);\n console.log(`跳过数量: ${this.stats.skippedCount}`);\n console.log(`总文件大小: ${(this.stats.totalFileSize / 1024 / 1024).toFixed(2)} MB`);\n console.log(`已处理大小: ${(this.stats.processedFileSize / 1024 / 1024).toFixed(2)} MB`);\n \n if (this.stats.errors.length > 0) {\n console.log('\\n❌ 错误详情:');\n this.stats.errors.forEach((error, index) => {\n console.log(`${index + 1}. 作品 ${error.artworkId}: ${error.error}`);\n });\n }\n \n const successRate = this.stats.totalArtworks > 0 \n ? ((this.stats.successCount / this.stats.totalArtworks) * 100).toFixed(2)\n : '0';\n console.log(`\\n✅ 成功率: ${successRate}%`);\n }\n\n /**\n * 回滚单个作品\n */\n async rollbackArtwork(artworkId: number): Promise<void> {\n console.log(`🔄 [ArtworkMigrator] 回滚作品: ${artworkId}`);\n\n const [artwork] = await this.db\n .select()\n .from(comicUniverseArtworks)\n .where(eq(comicUniverseArtworks.id, artworkId))\n .limit(1);\n\n if (!artwork) {\n throw new Error(`作品 ${artworkId} 不存在`);\n }\n\n if (!artwork.fileId) {\n console.log(`⚠️ [ArtworkMigrator] 作品 ${artworkId} 没有文件引用,无需回滚`);\n return;\n }\n\n // 删除文件记录和物理文件\n const [fileRecord] = await this.db\n .select()\n .from(fileMetadata)\n .where(eq(fileMetadata.id, artwork.fileId))\n .limit(1);\n\n if (fileRecord) {\n const fullPath = join('./uploads', fileRecord.storagePath);\n if (existsSync(fullPath)) {\n // 这里可以添加文件删除逻辑,但为了安全起见,暂时保留文件\n console.log(`📁 [ArtworkMigrator] 保留文件: ${fullPath}`);\n }\n\n // 删除文件元数据记录\n await this.db\n .delete(fileMetadata)\n .where(eq(fileMetadata.id, artwork.fileId));\n }\n\n // 重置作品的迁移状态\n await this.db\n .update(comicUniverseArtworks)\n .set({\n fileId: null,\n migrationStatus: 'pending',\n updatedAt: new Date()\n })\n .where(eq(comicUniverseArtworks.id, artworkId));\n\n console.log(`✅ [ArtworkMigrator] 作品 ${artworkId} 回滚完成`);\n }\n} \n","/**\n * ShowMasterpiece模块 - 作品图片迁移运行脚本\n *\n * 将Base64图片数据迁移到通用文件服务系统的逻辑封装。\n */\n\nimport { ArtworkMigrator, type MigrationConfig, type MigrationStats } from './ArtworkMigrator';\n\nexport interface ParsedMigrationArgs {\n config: MigrationConfig;\n showHelp: boolean;\n}\n\nexport function parseMigrationArguments(args: string[]): ParsedMigrationArgs {\n const config: MigrationConfig = {\n batchSize: 50,\n dryRun: false,\n validateFiles: true,\n backupOldData: true,\n forceOverwrite: false,\n enableOSSUpload: false,\n collectionIds: undefined,\n };\n\n let showHelp = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case '--help':\n case '-h':\n showHelp = true;\n break;\n\n case '--dry-run':\n config.dryRun = true;\n break;\n\n case '--batch-size': {\n const batchSize = parseInt(args[++i] || '', 10);\n if (isNaN(batchSize) || batchSize <= 0) {\n throw new Error('批大小必须是大于0的数字');\n }\n config.batchSize = batchSize;\n break;\n }\n\n case '--collection-id':\n case '--collection-ids': {\n const collectionIdsStr = args[++i];\n if (!collectionIdsStr) {\n throw new Error('请指定画集ID');\n }\n config.collectionIds = collectionIdsStr.split(',').map((id) => {\n const num = parseInt(id.trim(), 10);\n if (isNaN(num)) {\n throw new Error(`无效的画集ID: ${id}`);\n }\n return num;\n });\n break;\n }\n\n case '--no-validate':\n config.validateFiles = false;\n break;\n\n case '--validate':\n config.validateFiles = true;\n break;\n\n case '--no-backup':\n config.backupOldData = false;\n break;\n\n case '--backup':\n config.backupOldData = true;\n break;\n\n case '--force':\n config.forceOverwrite = true;\n break;\n\n case '--enable-oss':\n config.enableOSSUpload = true;\n break;\n\n default:\n throw new Error(`未知选项: ${arg}`);\n }\n }\n\n return { config, showHelp };\n}\n\nexport function getMigrationHelpText(): string {\n return `\nShowMasterpiece模块图片迁移工具\n\n用法:\n npx tsx src/modules/showmasterpiece/migration/runMigration.ts [选项]\n\n选项:\n -h, --help 显示帮助信息\n --dry-run 试运行,不实际执行迁移\n --batch-size <number> 批处理大小(默认: 50)\n --collection-id <ids> 指定画集ID,用逗号分隔(如: 1,2,3)\n --validate 验证文件完整性(默认开启)\n --no-validate 跳过文件验证\n --backup 备份原始数据(默认开启)\n --no-backup 跳过数据备份\n --force 强制覆盖已存在的文件\n --enable-oss 启用OSS上传\n\n示例:\n # 试运行,查看将要迁移的数据\n npx tsx src/modules/showmasterpiece/migration/runMigration.ts --dry-run\n\n # 迁移指定画集的作品\n npx tsx src/modules/showmasterpiece/migration/runMigration.ts --collection-id 1,2,3\n\n # 小批量测试迁移\n npx tsx src/modules/showmasterpiece/migration/runMigration.ts --batch-size 5 --dry-run\n\n # 完整迁移(包含验证和备份)\n npx tsx src/modules/showmasterpiece/migration/runMigration.ts --validate --backup\n\n # 强制覆盖已迁移的文件\n npx tsx src/modules/showmasterpiece/migration/runMigration.ts --force\n\n # 不验证文件,快速迁移\n npx tsx src/modules/showmasterpiece/migration/runMigration.ts --no-validate --no-backup\n\n注意事项:\n - 首次运行建议使用 --dry-run 进行测试\n - 迁移前会自动备份原始数据(除非使用 --no-backup)\n - 使用 --force 选项会覆盖已迁移的文件\n - 迁移过程中请保持数据库连接稳定\n`;\n}\n\nexport function validateMigrationPrerequisites(config: MigrationConfig): void {\n console.log('🔍 验证迁移前置条件...');\n\n if (!process.env.DATABASE_URL) {\n throw new Error('数据库连接URL未设置,请设置 DATABASE_URL 环境变量');\n }\n\n const nodeVersion = process.version;\n const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0] ?? '0', 10);\n if (majorVersion < 16) {\n throw new Error(`Node.js版本过低: ${nodeVersion},请使用 Node.js 16 或更高版本`);\n }\n\n if (config.dryRun) {\n console.log('🔍 当前为试运行模式,不会实际修改数据');\n }\n\n console.log('✅ 前置条件验证通过');\n}\n\nexport async function runArtworkMigration(db: any, config: MigrationConfig): Promise<MigrationStats> {\n const migrator = new ArtworkMigrator(db, config);\n return migrator.migrate();\n}\n"]}
|