sa2kit 1.6.43 → 1.6.45
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-2FARPAQD.js +15 -0
- package/dist/{AliyunOSSProvider-HCNGDJL7.js.map → AliyunOSSProvider-2FARPAQD.js.map} +1 -1
- package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +9 -0
- package/dist/{AliyunOSSProvider-4W47OFEK.mjs.map → AliyunOSSProvider-UMVGVBDJ.mjs.map} +1 -1
- package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
- package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
- package/dist/ConfigService-QR67WYNK.mjs +4 -0
- package/dist/{ConfigService-V6ZK273Z.mjs.map → ConfigService-QR67WYNK.mjs.map} +1 -1
- package/dist/{ConfigService-3DIC6C3Q.js → ConfigService-UYC6ZTCM.js} +3 -3
- package/dist/{ConfigService-3DIC6C3Q.js.map → ConfigService-UYC6ZTCM.js.map} +1 -1
- package/dist/GenericOrderManager-e4WizpNf.d.mts +28 -0
- package/dist/GenericOrderManager-e4WizpNf.d.ts +28 -0
- package/dist/LocalStorageProvider-JQF5WK5H.js +15 -0
- package/dist/{LocalStorageProvider-PP7MA5OT.js.map → LocalStorageProvider-JQF5WK5H.js.map} +1 -1
- package/dist/LocalStorageProvider-PYOHETJV.mjs +9 -0
- package/dist/{LocalStorageProvider-3RVPCQB3.mjs.map → LocalStorageProvider-PYOHETJV.mjs.map} +1 -1
- package/dist/PMXParser-RLBDO7YK.mjs +4 -0
- package/dist/{PMXParser-RNVQL76A.mjs.map → PMXParser-RLBDO7YK.mjs.map} +1 -1
- package/dist/{PMXParser-2VTA737I.js → PMXParser-XHNO2KNI.js} +3 -3
- package/dist/{PMXParser-2VTA737I.js.map → PMXParser-XHNO2KNI.js.map} +1 -1
- package/dist/UniversalFileService-RBV6EN5J.js +15 -0
- package/dist/UniversalFileService-RBV6EN5J.js.map +1 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs +9 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs.map +1 -0
- package/dist/analytics/index.js +1 -1
- package/dist/analytics/index.mjs +1 -1
- package/dist/analytics/server/index.js +1 -1
- package/dist/analytics/server/index.mjs +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.mjs +1 -1
- package/dist/audioDetection/index.js +1 -1
- package/dist/audioDetection/index.mjs +1 -1
- package/dist/auth/client/index.js +1 -1
- package/dist/auth/client/index.mjs +1 -1
- package/dist/auth/components/index.js +1 -1
- package/dist/auth/components/index.mjs +1 -1
- package/dist/auth/hooks/index.js +1 -1
- package/dist/auth/hooks/index.mjs +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.mjs +1 -1
- package/dist/auth/middleware/index.js +1 -1
- package/dist/auth/middleware/index.mjs +1 -1
- package/dist/auth/routes/index.js +1 -1
- package/dist/auth/routes/index.mjs +1 -1
- package/dist/auth/schema/index.js +1 -1
- package/dist/auth/schema/index.mjs +1 -1
- package/dist/auth/services/index.js +1 -1
- package/dist/auth/services/index.mjs +1 -1
- package/dist/calendar/index.js +12 -12
- package/dist/calendar/index.mjs +5 -5
- package/dist/calendar/routes/index.js +1 -1
- package/dist/calendar/routes/index.mjs +1 -1
- package/dist/calendar/server.js +1 -1
- package/dist/calendar/server.mjs +1 -1
- package/dist/chunk-2PS5PIXV.mjs +443 -0
- package/dist/chunk-2PS5PIXV.mjs.map +1 -0
- package/dist/chunk-35CXIK5Y.js +277 -0
- package/dist/chunk-35CXIK5Y.js.map +1 -0
- package/dist/{chunk-GMIUSZXC.mjs → chunk-3JW4X3AC.mjs} +3 -3
- package/dist/{chunk-GMIUSZXC.mjs.map → chunk-3JW4X3AC.mjs.map} +1 -1
- package/dist/chunk-3M6T5KVD.js +453 -0
- package/dist/chunk-3M6T5KVD.js.map +1 -0
- package/dist/chunk-3TNR6IMC.js +168 -0
- package/dist/chunk-3TNR6IMC.js.map +1 -0
- package/dist/chunk-4NFOSCM6.js +34 -0
- package/dist/chunk-4NFOSCM6.js.map +1 -0
- package/dist/{chunk-3NHAT7D4.mjs → chunk-4VJQZSPU.mjs} +4 -3
- package/dist/chunk-4VJQZSPU.mjs.map +1 -0
- package/dist/{chunk-SCDDMIF6.js → chunk-4XXIBWCO.js} +66 -66
- package/dist/{chunk-SCDDMIF6.js.map → chunk-4XXIBWCO.js.map} +1 -1
- package/dist/chunk-6AHYPPUP.js +344 -0
- package/dist/chunk-6AHYPPUP.js.map +1 -0
- package/dist/{chunk-EGJPS7OL.mjs → chunk-6BJ76BYC.mjs} +3 -3
- package/dist/{chunk-EGJPS7OL.mjs.map → chunk-6BJ76BYC.mjs.map} +1 -1
- package/dist/chunk-76V7EKBX.mjs +796 -0
- package/dist/chunk-76V7EKBX.mjs.map +1 -0
- package/dist/chunk-ACLOJXXE.js +195 -0
- package/dist/chunk-ACLOJXXE.js.map +1 -0
- package/dist/chunk-AEXPAH7Z.mjs +32 -0
- package/dist/chunk-AEXPAH7Z.mjs.map +1 -0
- package/dist/chunk-CFGX3EKK.js +560 -0
- package/dist/chunk-CFGX3EKK.js.map +1 -0
- package/dist/{chunk-435LATLS.mjs → chunk-CX5GPCCO.mjs} +3 -4
- package/dist/chunk-CX5GPCCO.mjs.map +1 -0
- package/dist/chunk-D2HXMGXS.js +46 -0
- package/dist/chunk-D2HXMGXS.js.map +1 -0
- package/dist/chunk-DM2GUVUH.js +1201 -0
- package/dist/chunk-DM2GUVUH.js.map +1 -0
- package/dist/{chunk-ZWQJSZEY.js → chunk-DVENFCQY.js} +5 -4
- package/dist/chunk-DVENFCQY.js.map +1 -0
- package/dist/chunk-EONPKLEJ.mjs +163 -0
- package/dist/chunk-EONPKLEJ.mjs.map +1 -0
- package/dist/{chunk-L47ZOYHL.js → chunk-EUIXQPPU.js} +4 -4
- package/dist/{chunk-L47ZOYHL.js.map → chunk-EUIXQPPU.js.map} +1 -1
- package/dist/{chunk-33YOJBQB.js → chunk-JOSNXSA6.js} +3 -4
- package/dist/chunk-JOSNXSA6.js.map +1 -0
- package/dist/chunk-K7WNCB4V.mjs +554 -0
- package/dist/chunk-K7WNCB4V.mjs.map +1 -0
- package/dist/chunk-L4ZYBFB2.mjs +44 -0
- package/dist/chunk-L4ZYBFB2.mjs.map +1 -0
- package/dist/chunk-M4HGHTIC.js +820 -0
- package/dist/chunk-M4HGHTIC.js.map +1 -0
- package/dist/{chunk-HHVDOIPV.js → chunk-MZKATHB7.js} +4 -4
- package/dist/{chunk-HHVDOIPV.js.map → chunk-MZKATHB7.js.map} +1 -1
- package/dist/{chunk-UKT3PLON.mjs → chunk-NXQVTAOP.mjs} +3 -3
- package/dist/{chunk-UKT3PLON.mjs.map → chunk-NXQVTAOP.mjs.map} +1 -1
- package/dist/chunk-OBIPI4GU.mjs +266 -0
- package/dist/chunk-OBIPI4GU.mjs.map +1 -0
- package/dist/chunk-PAX4S7QM.mjs +94 -0
- package/dist/chunk-PAX4S7QM.mjs.map +1 -0
- package/dist/chunk-PXWDQFWV.mjs +192 -0
- package/dist/chunk-PXWDQFWV.mjs.map +1 -0
- package/dist/chunk-QROLPPXP.mjs +5797 -0
- package/dist/chunk-QROLPPXP.mjs.map +1 -0
- package/dist/chunk-TGNUEULF.mjs +1158 -0
- package/dist/chunk-TGNUEULF.mjs.map +1 -0
- package/dist/chunk-VBQFVXOW.mjs +2772 -0
- package/dist/chunk-VBQFVXOW.mjs.map +1 -0
- package/dist/chunk-VLZ5N6XZ.js +5888 -0
- package/dist/chunk-VLZ5N6XZ.js.map +1 -0
- package/dist/chunk-VTGPHE4Z.mjs +322 -0
- package/dist/chunk-VTGPHE4Z.mjs.map +1 -0
- package/dist/chunk-WMJKH4XE.mjs +30 -0
- package/dist/{chunk-BJTO5JO5.mjs.map → chunk-WMJKH4XE.mjs.map} +1 -1
- package/dist/chunk-XYQMAF7H.js +96 -0
- package/dist/chunk-XYQMAF7H.js.map +1 -0
- package/dist/chunk-Z3G3IXEF.js +2814 -0
- package/dist/chunk-Z3G3IXEF.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +35 -0
- package/dist/{chunk-DGUM43GV.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/components/index.d.mts +378 -0
- package/dist/components/index.d.ts +378 -0
- package/dist/components/index.js +414 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +9 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/config/index.mjs +1 -1
- package/dist/config/server/index.js +1 -1
- package/dist/config/server/index.mjs +1 -1
- package/dist/fileService-O3W6YXCI.mjs +4 -0
- package/dist/fileService-O3W6YXCI.mjs.map +1 -0
- package/dist/fileService-YUDIYOAS.js +13 -0
- package/dist/fileService-YUDIYOAS.js.map +1 -0
- package/dist/i18n/index.js +7 -7
- package/dist/i18n/index.mjs +1 -1
- package/dist/imageCrop/index.js +1 -1
- package/dist/imageCrop/index.mjs +1 -1
- package/dist/index.d.mts +9 -580
- package/dist/index.d.ts +9 -580
- package/dist/index.js +313 -972
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +104 -790
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +8 -8
- package/dist/logger/index.mjs +5 -2
- package/dist/mikuFireworks3D/index.js +17 -17
- package/dist/mikuFireworks3D/index.mjs +2 -2
- package/dist/mikuFireworks3D/server/index.js +1 -1
- package/dist/mikuFireworks3D/server/index.mjs +1 -1
- package/dist/mikuFusionGame/index.js +5 -5
- package/dist/mikuFusionGame/index.mjs +4 -4
- package/dist/mmd/admin/index.js +1 -1
- package/dist/mmd/admin/index.mjs +1 -1
- package/dist/mmd/index.js +2 -2
- package/dist/mmd/index.mjs +2 -2
- package/dist/mmd/server/index.js +1 -1
- package/dist/mmd/server/index.mjs +1 -1
- package/dist/music/index.js +1 -1
- package/dist/music/index.mjs +1 -1
- package/dist/music/server/index.js +1 -1
- package/dist/music/server/index.mjs +1 -1
- package/dist/navigation/index.d.mts +93 -0
- package/dist/navigation/index.d.ts +93 -0
- package/dist/navigation/index.js +29 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/index.mjs +4 -0
- package/dist/navigation/index.mjs.map +1 -0
- package/dist/popupConfig-BznThU1O.d.mts +330 -0
- package/dist/popupConfig-BznThU1O.d.ts +330 -0
- package/dist/portfolio/index.d.mts +57 -0
- package/dist/portfolio/index.d.ts +57 -0
- package/dist/portfolio/index.js +35 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/portfolio/index.mjs +10 -0
- package/dist/portfolio/index.mjs.map +1 -0
- package/dist/request/index.js +1 -1
- package/dist/request/index.mjs +1 -1
- package/dist/showmasterpiece/index.d.mts +2524 -0
- package/dist/showmasterpiece/index.d.ts +2524 -0
- package/dist/showmasterpiece/index.js +9681 -0
- package/dist/showmasterpiece/index.js.map +1 -0
- package/dist/showmasterpiece/index.mjs +9631 -0
- package/dist/showmasterpiece/index.mjs.map +1 -0
- package/dist/showmasterpiece/migration/index.d.mts +120 -0
- package/dist/showmasterpiece/migration/index.d.ts +120 -0
- package/dist/showmasterpiece/migration/index.js +595 -0
- package/dist/showmasterpiece/migration/index.js.map +1 -0
- package/dist/showmasterpiece/migration/index.mjs +589 -0
- package/dist/showmasterpiece/migration/index.mjs.map +1 -0
- package/dist/showmasterpiece/scripts/index.d.mts +28 -0
- package/dist/showmasterpiece/scripts/index.d.ts +28 -0
- package/dist/showmasterpiece/scripts/index.js +327 -0
- package/dist/showmasterpiece/scripts/index.js.map +1 -0
- package/dist/showmasterpiece/scripts/index.mjs +325 -0
- package/dist/showmasterpiece/scripts/index.mjs.map +1 -0
- package/dist/showmasterpiece/server/index.d.mts +2698 -0
- package/dist/showmasterpiece/server/index.d.ts +2698 -0
- package/dist/showmasterpiece/server/index.js +179 -0
- package/dist/showmasterpiece/server/index.js.map +1 -0
- package/dist/showmasterpiece/server/index.mjs +6 -0
- package/dist/showmasterpiece/server/index.mjs.map +1 -0
- package/dist/storage/index.js +8 -8
- package/dist/storage/index.mjs +2 -2
- package/dist/testYourself/admin/index.js +1 -1
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +2 -2
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/server/index.js +1 -1
- package/dist/testYourself/server/index.mjs +1 -1
- package/dist/universalExport/index.js +154 -1195
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +2 -1157
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.js +5 -3
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +4 -2
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.js +10 -7
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +6 -2
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.d.mts +592 -265
- package/dist/universalFile/server/index.d.ts +592 -265
- package/dist/universalFile/server/index.js +298 -5637
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +8 -5559
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/dist/utils/index.js +12 -12
- package/dist/utils/index.mjs +3 -3
- package/package.json +36 -1
- package/dist/AliyunOSSProvider-4W47OFEK.mjs +0 -6
- package/dist/AliyunOSSProvider-HCNGDJL7.js +0 -15
- package/dist/ConfigService-V6ZK273Z.mjs +0 -4
- package/dist/LocalStorageProvider-3RVPCQB3.mjs +0 -6
- package/dist/LocalStorageProvider-PP7MA5OT.js +0 -15
- package/dist/PMXParser-RNVQL76A.mjs +0 -4
- package/dist/chunk-25OFOKNF.js +0 -171
- package/dist/chunk-25OFOKNF.js.map +0 -1
- package/dist/chunk-33YOJBQB.js.map +0 -1
- package/dist/chunk-3DXPQ4YV.mjs +0 -165
- package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
- package/dist/chunk-3NHAT7D4.mjs.map +0 -1
- package/dist/chunk-435LATLS.mjs.map +0 -1
- package/dist/chunk-BJTO5JO5.mjs +0 -10
- package/dist/chunk-CIVO4R6N.mjs +0 -37
- package/dist/chunk-CIVO4R6N.mjs.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -12
- package/dist/chunk-HDMIOOZY.mjs +0 -546
- package/dist/chunk-HDMIOOZY.mjs.map +0 -1
- package/dist/chunk-HJ6MH7J7.js +0 -552
- package/dist/chunk-HJ6MH7J7.js.map +0 -1
- package/dist/chunk-KH6RQ4J5.js +0 -28
- package/dist/chunk-KH6RQ4J5.js.map +0 -1
- package/dist/chunk-Q5EDCKQA.js +0 -336
- package/dist/chunk-Q5EDCKQA.js.map +0 -1
- package/dist/chunk-YOTQG4NP.mjs +0 -314
- package/dist/chunk-YOTQG4NP.mjs.map +0 -1
- package/dist/chunk-ZGVB35L2.mjs +0 -25
- package/dist/chunk-ZGVB35L2.mjs.map +0 -1
- package/dist/chunk-ZRAW3HXA.js +0 -43
- package/dist/chunk-ZRAW3HXA.js.map +0 -1
- package/dist/chunk-ZWQJSZEY.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/showmasterpiece/migration/ArtworkMigrator.ts","../../../src/showmasterpiece/migration/runMigration.ts"],"names":["uuidv4"],"mappings":"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","file":"index.mjs","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"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShowMasterpiece 配置迁移脚本
|
|
3
|
+
*
|
|
4
|
+
* 将公共配置管理器中的 OSS 及相关配置复制到 showmasterpiece 独立配置中
|
|
5
|
+
*/
|
|
6
|
+
interface ConfigDbServiceLike {
|
|
7
|
+
getAllConfigItems(): Promise<any[]>;
|
|
8
|
+
}
|
|
9
|
+
interface ShowmasterConfigServiceLike {
|
|
10
|
+
getCategoryByName(name: string): Promise<any | null>;
|
|
11
|
+
createCategory(payload: any): Promise<any>;
|
|
12
|
+
getAllCategories(): Promise<any[]>;
|
|
13
|
+
getConfigItemByKey(key: string, environment?: string): Promise<any | null>;
|
|
14
|
+
updateConfigItem(id: number | string, payload: any): Promise<any>;
|
|
15
|
+
createConfigItem(payload: any): Promise<any>;
|
|
16
|
+
}
|
|
17
|
+
interface MigrateConfigOptions {
|
|
18
|
+
dryRun?: boolean;
|
|
19
|
+
environment?: 'development' | 'production';
|
|
20
|
+
overwrite?: boolean;
|
|
21
|
+
}
|
|
22
|
+
interface MigrationServices {
|
|
23
|
+
configDbService: ConfigDbServiceLike;
|
|
24
|
+
showmasterConfigService: ShowmasterConfigServiceLike;
|
|
25
|
+
}
|
|
26
|
+
declare function migrateConfigToShowmasterpiece(services: MigrationServices, options?: MigrateConfigOptions): Promise<any>;
|
|
27
|
+
|
|
28
|
+
export { type ConfigDbServiceLike, type MigrateConfigOptions, type MigrationServices, type ShowmasterConfigServiceLike, migrateConfigToShowmasterpiece };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShowMasterpiece 配置迁移脚本
|
|
3
|
+
*
|
|
4
|
+
* 将公共配置管理器中的 OSS 及相关配置复制到 showmasterpiece 独立配置中
|
|
5
|
+
*/
|
|
6
|
+
interface ConfigDbServiceLike {
|
|
7
|
+
getAllConfigItems(): Promise<any[]>;
|
|
8
|
+
}
|
|
9
|
+
interface ShowmasterConfigServiceLike {
|
|
10
|
+
getCategoryByName(name: string): Promise<any | null>;
|
|
11
|
+
createCategory(payload: any): Promise<any>;
|
|
12
|
+
getAllCategories(): Promise<any[]>;
|
|
13
|
+
getConfigItemByKey(key: string, environment?: string): Promise<any | null>;
|
|
14
|
+
updateConfigItem(id: number | string, payload: any): Promise<any>;
|
|
15
|
+
createConfigItem(payload: any): Promise<any>;
|
|
16
|
+
}
|
|
17
|
+
interface MigrateConfigOptions {
|
|
18
|
+
dryRun?: boolean;
|
|
19
|
+
environment?: 'development' | 'production';
|
|
20
|
+
overwrite?: boolean;
|
|
21
|
+
}
|
|
22
|
+
interface MigrationServices {
|
|
23
|
+
configDbService: ConfigDbServiceLike;
|
|
24
|
+
showmasterConfigService: ShowmasterConfigServiceLike;
|
|
25
|
+
}
|
|
26
|
+
declare function migrateConfigToShowmasterpiece(services: MigrationServices, options?: MigrateConfigOptions): Promise<any>;
|
|
27
|
+
|
|
28
|
+
export { type ConfigDbServiceLike, type MigrateConfigOptions, type MigrationServices, type ShowmasterConfigServiceLike, migrateConfigToShowmasterpiece };
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('../../chunk-Z6ZWNWWR.js');
|
|
4
|
+
var fs = require('fs');
|
|
5
|
+
|
|
6
|
+
var CONFIG_MIGRATION_MAP = {
|
|
7
|
+
// OSS 配置
|
|
8
|
+
ALIYUN_OSS_REGION: {
|
|
9
|
+
displayName: "OSS\u533A\u57DF",
|
|
10
|
+
description: "\u963F\u91CC\u4E91OSS\u5B58\u50A8\u533A\u57DF",
|
|
11
|
+
type: "string",
|
|
12
|
+
isRequired: true,
|
|
13
|
+
isSensitive: false,
|
|
14
|
+
category: "oss"
|
|
15
|
+
},
|
|
16
|
+
ALIYUN_OSS_BUCKET: {
|
|
17
|
+
displayName: "OSS\u5B58\u50A8\u6876",
|
|
18
|
+
description: "\u963F\u91CC\u4E91OSS\u5B58\u50A8\u6876\u540D\u79F0",
|
|
19
|
+
type: "string",
|
|
20
|
+
isRequired: true,
|
|
21
|
+
isSensitive: false,
|
|
22
|
+
category: "oss"
|
|
23
|
+
},
|
|
24
|
+
ALIYUN_OSS_ACCESS_KEY_ID: {
|
|
25
|
+
displayName: "AccessKey ID",
|
|
26
|
+
description: "\u963F\u91CC\u4E91AccessKey ID",
|
|
27
|
+
type: "string",
|
|
28
|
+
isRequired: true,
|
|
29
|
+
isSensitive: true,
|
|
30
|
+
category: "oss"
|
|
31
|
+
},
|
|
32
|
+
ALIYUN_OSS_ACCESS_KEY_SECRET: {
|
|
33
|
+
displayName: "AccessKey Secret",
|
|
34
|
+
description: "\u963F\u91CC\u4E91AccessKey Secret",
|
|
35
|
+
type: "password",
|
|
36
|
+
isRequired: true,
|
|
37
|
+
isSensitive: true,
|
|
38
|
+
category: "oss"
|
|
39
|
+
},
|
|
40
|
+
ALIYUN_OSS_CUSTOM_DOMAIN: {
|
|
41
|
+
displayName: "\u81EA\u5B9A\u4E49\u57DF\u540D",
|
|
42
|
+
description: "OSS\u81EA\u5B9A\u4E49\u57DF\u540D\uFF08\u53EF\u9009\uFF09",
|
|
43
|
+
type: "string",
|
|
44
|
+
isRequired: false,
|
|
45
|
+
isSensitive: false,
|
|
46
|
+
category: "oss"
|
|
47
|
+
},
|
|
48
|
+
ALIYUN_OSS_SECURE: {
|
|
49
|
+
displayName: "\u4F7F\u7528HTTPS",
|
|
50
|
+
description: "\u662F\u5426\u4F7F\u7528HTTPS\u8FDE\u63A5",
|
|
51
|
+
type: "boolean",
|
|
52
|
+
isRequired: false,
|
|
53
|
+
isSensitive: false,
|
|
54
|
+
category: "oss"
|
|
55
|
+
},
|
|
56
|
+
ALIYUN_OSS_INTERNAL: {
|
|
57
|
+
displayName: "\u5185\u7F51\u8BBF\u95EE",
|
|
58
|
+
description: "\u662F\u5426\u4F7F\u7528\u5185\u7F51\u8BBF\u95EE",
|
|
59
|
+
type: "boolean",
|
|
60
|
+
isRequired: false,
|
|
61
|
+
isSensitive: false,
|
|
62
|
+
category: "oss"
|
|
63
|
+
},
|
|
64
|
+
// CDN 配置(可选)
|
|
65
|
+
ALIYUN_CDN_DOMAIN: {
|
|
66
|
+
displayName: "CDN\u57DF\u540D",
|
|
67
|
+
description: "\u963F\u91CC\u4E91CDN\u52A0\u901F\u57DF\u540D",
|
|
68
|
+
type: "string",
|
|
69
|
+
isRequired: false,
|
|
70
|
+
isSensitive: false,
|
|
71
|
+
category: "cdn"
|
|
72
|
+
},
|
|
73
|
+
ALIYUN_CDN_ACCESS_KEY_ID: {
|
|
74
|
+
displayName: "CDN AccessKey ID",
|
|
75
|
+
description: "\u963F\u91CC\u4E91CDN AccessKey ID",
|
|
76
|
+
type: "string",
|
|
77
|
+
isRequired: false,
|
|
78
|
+
isSensitive: true,
|
|
79
|
+
category: "cdn"
|
|
80
|
+
},
|
|
81
|
+
ALIYUN_CDN_ACCESS_KEY_SECRET: {
|
|
82
|
+
displayName: "CDN AccessKey Secret",
|
|
83
|
+
description: "\u963F\u91CC\u4E91CDN AccessKey Secret",
|
|
84
|
+
type: "password",
|
|
85
|
+
isRequired: false,
|
|
86
|
+
isSensitive: true,
|
|
87
|
+
category: "cdn"
|
|
88
|
+
},
|
|
89
|
+
// 文件服务相关配置
|
|
90
|
+
MAX_FILE_SIZE: {
|
|
91
|
+
displayName: "\u6700\u5927\u6587\u4EF6\u5927\u5C0F",
|
|
92
|
+
description: "\u5141\u8BB8\u4E0A\u4F20\u7684\u6700\u5927\u6587\u4EF6\u5927\u5C0F\uFF08\u5B57\u8282\uFF09",
|
|
93
|
+
type: "number",
|
|
94
|
+
isRequired: false,
|
|
95
|
+
isSensitive: false,
|
|
96
|
+
category: "file"
|
|
97
|
+
},
|
|
98
|
+
FILE_STORAGE_PATH: {
|
|
99
|
+
displayName: "\u672C\u5730\u5B58\u50A8\u8DEF\u5F84",
|
|
100
|
+
description: "\u672C\u5730\u6587\u4EF6\u5B58\u50A8\u8DEF\u5F84",
|
|
101
|
+
type: "string",
|
|
102
|
+
isRequired: false,
|
|
103
|
+
isSensitive: false,
|
|
104
|
+
category: "file"
|
|
105
|
+
},
|
|
106
|
+
FILE_BASE_URL: {
|
|
107
|
+
displayName: "\u6587\u4EF6\u57FA\u7840URL",
|
|
108
|
+
description: "\u6587\u4EF6\u8BBF\u95EE\u57FA\u7840URL",
|
|
109
|
+
type: "string",
|
|
110
|
+
isRequired: false,
|
|
111
|
+
isSensitive: false,
|
|
112
|
+
category: "file"
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
var NON_MIGRATED_CONFIGS = {
|
|
116
|
+
DATABASE_URL: "\u6570\u636E\u5E93\u8FDE\u63A5\u5B57\u7B26\u4E32 - \u5EFA\u8BAE\u7531\u5E73\u53F0\u7EDF\u4E00\u7BA1\u7406",
|
|
117
|
+
DATABASE_POOL_SIZE: "\u6570\u636E\u5E93\u8FDE\u63A5\u6C60\u914D\u7F6E - \u5EFA\u8BAE\u7531\u5E73\u53F0\u7EDF\u4E00\u7BA1\u7406",
|
|
118
|
+
DATABASE_TIMEOUT: "\u6570\u636E\u5E93\u8D85\u65F6\u914D\u7F6E - \u5EFA\u8BAE\u7531\u5E73\u53F0\u7EDF\u4E00\u7BA1\u7406",
|
|
119
|
+
DATABASE_SSL_MODE: "\u6570\u636E\u5E93SSL\u914D\u7F6E - \u5EFA\u8BAE\u7531\u5E73\u53F0\u7EDF\u4E00\u7BA1\u7406",
|
|
120
|
+
NODE_ENV: "\u8FD0\u884C\u73AF\u5883\u6807\u8BC6 - \u7531\u90E8\u7F72\u73AF\u5883\u51B3\u5B9A",
|
|
121
|
+
NEXTAUTH_SECRET: "NextAuth\u5BC6\u94A5 - \u5EFA\u8BAE\u7531\u5E73\u53F0\u7EDF\u4E00\u7BA1\u7406",
|
|
122
|
+
NEXTAUTH_URL: "NextAuth\u56DE\u8C03URL - \u5EFA\u8BAE\u7531\u5E73\u53F0\u7EDF\u4E00\u7BA1\u7406",
|
|
123
|
+
QINIU_ACCESS_KEY: "\u4E03\u725B\u4E91\u914D\u7F6E - ShowMasterpiece\u6A21\u5757\u4E0D\u4F7F\u7528",
|
|
124
|
+
QINIU_SECRET_KEY: "\u4E03\u725B\u4E91\u914D\u7F6E - ShowMasterpiece\u6A21\u5757\u4E0D\u4F7F\u7528",
|
|
125
|
+
QINIU_BUCKET_NAME: "\u4E03\u725B\u4E91\u914D\u7F6E - ShowMasterpiece\u6A21\u5757\u4E0D\u4F7F\u7528",
|
|
126
|
+
QINIU_DOMAIN: "\u4E03\u725B\u4E91\u914D\u7F6E - ShowMasterpiece\u6A21\u5757\u4E0D\u4F7F\u7528",
|
|
127
|
+
OPENAI_API_KEY: "OpenAI\u914D\u7F6E - \u4E0D\u5C5E\u4E8E\u6587\u4EF6\u5B58\u50A8\u8303\u7574",
|
|
128
|
+
REDIS_URL: "Redis\u914D\u7F6E - \u5EFA\u8BAE\u7531\u5E73\u53F0\u7EDF\u4E00\u7BA1\u7406",
|
|
129
|
+
"EMAIL_*": "\u90AE\u4EF6\u670D\u52A1\u914D\u7F6E - \u4E0D\u5C5E\u4E8E\u6587\u4EF6\u5B58\u50A8\u8303\u7574"
|
|
130
|
+
};
|
|
131
|
+
async function migrateConfigToShowmasterpiece(services, options = {}) {
|
|
132
|
+
const { configDbService, showmasterConfigService } = services;
|
|
133
|
+
const { dryRun = false, environment = "development", overwrite = false } = options;
|
|
134
|
+
console.log("\u{1F680} [\u914D\u7F6E\u8FC1\u79FB] \u5F00\u59CB\u8FC1\u79FB\u516C\u5171\u914D\u7F6E\u5230ShowMasterpiece\u72EC\u7ACB\u914D\u7F6E...");
|
|
135
|
+
console.log(`\u{1F4CB} [\u914D\u7F6E\u8FC1\u79FB] \u9009\u9879: \u9884\u6F14=${dryRun}, \u73AF\u5883=${environment}, \u8986\u76D6=${overwrite}`);
|
|
136
|
+
const migrationResult = {
|
|
137
|
+
categories: 0,
|
|
138
|
+
migrated: 0,
|
|
139
|
+
skipped: 0,
|
|
140
|
+
errors: [],
|
|
141
|
+
migratedConfigs: [],
|
|
142
|
+
skippedConfigs: [],
|
|
143
|
+
nonMigratableConfigs: Object.keys(NON_MIGRATED_CONFIGS)
|
|
144
|
+
};
|
|
145
|
+
console.log("\u{1F4E6} [\u914D\u7F6E\u8FC1\u79FB] \u521B\u5EFA\u914D\u7F6E\u5206\u7C7B...");
|
|
146
|
+
const categories = [
|
|
147
|
+
{
|
|
148
|
+
name: "oss",
|
|
149
|
+
displayName: "\u963F\u91CC\u4E91OSS\u914D\u7F6E",
|
|
150
|
+
description: "ShowMasterpiece\u6A21\u5757\u4E13\u7528\u7684\u963F\u91CC\u4E91\u5BF9\u8C61\u5B58\u50A8\u670D\u52A1\u914D\u7F6E",
|
|
151
|
+
icon: "fas fa-cloud",
|
|
152
|
+
sortOrder: 1
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: "cdn",
|
|
156
|
+
displayName: "\u963F\u91CC\u4E91CDN\u914D\u7F6E",
|
|
157
|
+
description: "ShowMasterpiece\u6A21\u5757\u4E13\u7528\u7684\u963F\u91CC\u4E91\u5185\u5BB9\u5206\u53D1\u7F51\u7EDC\u914D\u7F6E",
|
|
158
|
+
icon: "fas fa-globe",
|
|
159
|
+
sortOrder: 2
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: "file",
|
|
163
|
+
displayName: "\u6587\u4EF6\u670D\u52A1\u914D\u7F6E",
|
|
164
|
+
description: "ShowMasterpiece\u6A21\u5757\u7684\u6587\u4EF6\u5B58\u50A8\u548C\u5904\u7406\u914D\u7F6E",
|
|
165
|
+
icon: "fas fa-file",
|
|
166
|
+
sortOrder: 3
|
|
167
|
+
}
|
|
168
|
+
];
|
|
169
|
+
for (const category of categories) {
|
|
170
|
+
if (!dryRun) {
|
|
171
|
+
try {
|
|
172
|
+
const existingCategory = await showmasterConfigService.getCategoryByName(category.name);
|
|
173
|
+
if (!existingCategory) {
|
|
174
|
+
await showmasterConfigService.createCategory({
|
|
175
|
+
...category,
|
|
176
|
+
isActive: true
|
|
177
|
+
});
|
|
178
|
+
migrationResult.categories++;
|
|
179
|
+
console.log(`\u2705 [\u914D\u7F6E\u8FC1\u79FB] \u521B\u5EFA\u5206\u7C7B: ${category.displayName}`);
|
|
180
|
+
} else {
|
|
181
|
+
console.log(`\u2139\uFE0F [\u914D\u7F6E\u8FC1\u79FB] \u5206\u7C7B\u5DF2\u5B58\u5728: ${category.displayName}`);
|
|
182
|
+
}
|
|
183
|
+
} catch (error) {
|
|
184
|
+
console.error(`\u274C [\u914D\u7F6E\u8FC1\u79FB] \u521B\u5EFA\u5206\u7C7B\u5931\u8D25: ${category.displayName}`, error);
|
|
185
|
+
migrationResult.errors.push(`\u521B\u5EFA\u5206\u7C7B\u5931\u8D25: ${category.displayName}`);
|
|
186
|
+
}
|
|
187
|
+
} else {
|
|
188
|
+
console.log(`\u{1F50D} [\u914D\u7F6E\u8FC1\u79FB] \u9884\u6F14: \u5C06\u521B\u5EFA\u5206\u7C7B ${category.displayName}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
console.log("\u{1F4CB} [\u914D\u7F6E\u8FC1\u79FB] \u83B7\u53D6\u516C\u5171\u914D\u7F6E\u9879...");
|
|
192
|
+
const publicConfigItems = await configDbService.getAllConfigItems();
|
|
193
|
+
const categoryMap = /* @__PURE__ */ new Map();
|
|
194
|
+
if (!dryRun) {
|
|
195
|
+
const allCategories = await showmasterConfigService.getAllCategories();
|
|
196
|
+
for (const cat of allCategories) {
|
|
197
|
+
categoryMap.set(cat.name, cat);
|
|
198
|
+
}
|
|
199
|
+
} else {
|
|
200
|
+
categoryMap.set("oss", { id: "mock-oss-id", name: "oss", displayName: "\u963F\u91CC\u4E91OSS\u914D\u7F6E" });
|
|
201
|
+
categoryMap.set("cdn", { id: "mock-cdn-id", name: "cdn", displayName: "\u963F\u91CC\u4E91CDN\u914D\u7F6E" });
|
|
202
|
+
categoryMap.set("file", { id: "mock-file-id", name: "file", displayName: "\u6587\u4EF6\u670D\u52A1\u914D\u7F6E" });
|
|
203
|
+
}
|
|
204
|
+
console.log("\u{1F504} [\u914D\u7F6E\u8FC1\u79FB] \u5F00\u59CB\u8FC1\u79FB\u914D\u7F6E\u9879...");
|
|
205
|
+
for (const [configKey, migrationInfo] of Object.entries(CONFIG_MIGRATION_MAP)) {
|
|
206
|
+
try {
|
|
207
|
+
const publicConfigItem = publicConfigItems.find((item) => item.key === configKey);
|
|
208
|
+
if (!publicConfigItem) {
|
|
209
|
+
console.log(`\u26A0\uFE0F [\u914D\u7F6E\u8FC1\u79FB] \u516C\u5171\u914D\u7F6E\u4E2D\u672A\u627E\u5230: ${configKey}`);
|
|
210
|
+
migrationResult.skippedConfigs.push(`${configKey} (\u516C\u5171\u914D\u7F6E\u4E2D\u4E0D\u5B58\u5728)`);
|
|
211
|
+
migrationResult.skipped++;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const existingConfig = !dryRun ? await showmasterConfigService.getConfigItemByKey(configKey, environment) : null;
|
|
215
|
+
if (existingConfig && !overwrite) {
|
|
216
|
+
console.log(`\u2139\uFE0F [\u914D\u7F6E\u8FC1\u79FB] \u914D\u7F6E\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${configKey}`);
|
|
217
|
+
migrationResult.skippedConfigs.push(`${configKey} (\u5DF2\u5B58\u5728)`);
|
|
218
|
+
migrationResult.skipped++;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const category = categoryMap.get(migrationInfo.category);
|
|
222
|
+
if (!category) {
|
|
223
|
+
console.error(`\u274C [\u914D\u7F6E\u8FC1\u79FB] \u5206\u7C7B\u4E0D\u5B58\u5728: ${migrationInfo.category} for ${configKey}`);
|
|
224
|
+
migrationResult.errors.push(`\u5206\u7C7B\u4E0D\u5B58\u5728: ${migrationInfo.category}`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (!dryRun) {
|
|
228
|
+
const configData = {
|
|
229
|
+
categoryId: category.id,
|
|
230
|
+
key: configKey,
|
|
231
|
+
displayName: migrationInfo.displayName,
|
|
232
|
+
description: migrationInfo.description,
|
|
233
|
+
value: publicConfigItem.value || publicConfigItem.defaultValue || "",
|
|
234
|
+
defaultValue: publicConfigItem.defaultValue || "",
|
|
235
|
+
type: migrationInfo.type,
|
|
236
|
+
isRequired: migrationInfo.isRequired,
|
|
237
|
+
isSensitive: migrationInfo.isSensitive,
|
|
238
|
+
environment,
|
|
239
|
+
sortOrder: migrationResult.migrated + 1,
|
|
240
|
+
isActive: true
|
|
241
|
+
};
|
|
242
|
+
if (existingConfig && overwrite) {
|
|
243
|
+
await showmasterConfigService.updateConfigItem(existingConfig.id, {
|
|
244
|
+
...configData,
|
|
245
|
+
value: publicConfigItem.value || existingConfig.value
|
|
246
|
+
});
|
|
247
|
+
console.log(
|
|
248
|
+
`\u{1F504} [\u914D\u7F6E\u8FC1\u79FB] \u66F4\u65B0\u914D\u7F6E: ${configKey} = ${publicConfigItem.value ? "***" : "(empty)"}`
|
|
249
|
+
);
|
|
250
|
+
} else {
|
|
251
|
+
await showmasterConfigService.createConfigItem(configData);
|
|
252
|
+
console.log(`\u2705 [\u914D\u7F6E\u8FC1\u79FB] \u8FC1\u79FB\u914D\u7F6E: ${configKey} = ${publicConfigItem.value ? "***" : "(empty)"}`);
|
|
253
|
+
}
|
|
254
|
+
migrationResult.migratedConfigs.push(configKey);
|
|
255
|
+
migrationResult.migrated++;
|
|
256
|
+
} else {
|
|
257
|
+
console.log(
|
|
258
|
+
`\u{1F50D} [\u914D\u7F6E\u8FC1\u79FB] \u9884\u6F14: \u5C06\u8FC1\u79FB ${configKey} = ${publicConfigItem.value ? "***" : "(empty)"}`
|
|
259
|
+
);
|
|
260
|
+
migrationResult.migratedConfigs.push(configKey);
|
|
261
|
+
}
|
|
262
|
+
} catch (error) {
|
|
263
|
+
console.error(`\u274C [\u914D\u7F6E\u8FC1\u79FB] \u8FC1\u79FB\u914D\u7F6E\u5931\u8D25: ${configKey}`, error);
|
|
264
|
+
migrationResult.errors.push(`\u8FC1\u79FB\u914D\u7F6E\u5931\u8D25: ${configKey} - ${error}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
console.log("\n\u{1F4CA} [\u914D\u7F6E\u8FC1\u79FB] \u8FC1\u79FB\u5B8C\u6210\uFF01\u751F\u6210\u62A5\u544A...\n");
|
|
268
|
+
const report = `
|
|
269
|
+
# ShowMasterpiece \u914D\u7F6E\u8FC1\u79FB\u62A5\u544A
|
|
270
|
+
|
|
271
|
+
## \u8FC1\u79FB\u6982\u8981
|
|
272
|
+
- **\u8FC1\u79FB\u6A21\u5F0F**: ${dryRun ? "\u9884\u6F14\u6A21\u5F0F" : "\u5B9E\u9645\u8FC1\u79FB"}
|
|
273
|
+
- **\u76EE\u6807\u73AF\u5883**: ${environment}
|
|
274
|
+
- **\u8986\u76D6\u6A21\u5F0F**: ${overwrite ? "\u542F\u7528" : "\u7981\u7528"}
|
|
275
|
+
- **\u6267\u884C\u65F6\u95F4**: ${(/* @__PURE__ */ new Date()).toLocaleString()}
|
|
276
|
+
|
|
277
|
+
## \u8FC1\u79FB\u7EDF\u8BA1
|
|
278
|
+
- **\u521B\u5EFA\u5206\u7C7B**: ${migrationResult.categories} \u4E2A
|
|
279
|
+
- **\u6210\u529F\u8FC1\u79FB**: ${migrationResult.migrated} \u4E2A\u914D\u7F6E\u9879
|
|
280
|
+
- **\u8DF3\u8FC7\u9879\u76EE**: ${migrationResult.skipped} \u4E2A\u914D\u7F6E\u9879
|
|
281
|
+
- **\u9519\u8BEF\u6570\u91CF**: ${migrationResult.errors.length} \u4E2A
|
|
282
|
+
|
|
283
|
+
## \u5DF2\u8FC1\u79FB\u7684\u914D\u7F6E\u9879
|
|
284
|
+
${migrationResult.migratedConfigs.length > 0 ? migrationResult.migratedConfigs.map(
|
|
285
|
+
(key) => `- \u2705 ${key}: ${CONFIG_MIGRATION_MAP[key]?.displayName}`
|
|
286
|
+
).join("\n") : "- \u65E0"}
|
|
287
|
+
|
|
288
|
+
## \u8DF3\u8FC7\u7684\u914D\u7F6E\u9879
|
|
289
|
+
${migrationResult.skippedConfigs.length > 0 ? migrationResult.skippedConfigs.map((item) => `- \u23ED\uFE0F ${item}`).join("\n") : "- \u65E0"}
|
|
290
|
+
|
|
291
|
+
## \u4E0D\u53EF\u8FC1\u79FB\u7684\u914D\u7F6E\u9879 (\u9700\u8981\u4EBA\u5DE5\u5904\u7406)
|
|
292
|
+
${Object.entries(NON_MIGRATED_CONFIGS).map(([key, reason]) => `- \u26A0\uFE0F ${key}: ${reason}`).join("\n")}
|
|
293
|
+
|
|
294
|
+
## \u9519\u8BEF\u5217\u8868
|
|
295
|
+
${migrationResult.errors.length > 0 ? migrationResult.errors.map((error) => `- \u274C ${error}`).join("\n") : "- \u65E0\u9519\u8BEF"}
|
|
296
|
+
|
|
297
|
+
## \u540E\u7EED\u6B65\u9AA4
|
|
298
|
+
|
|
299
|
+
### 1. \u9A8C\u8BC1\u8FC1\u79FB\u7ED3\u679C
|
|
300
|
+
\u8BBF\u95EE ShowMasterpiece \u914D\u7F6E\u9875\u9762\u9A8C\u8BC1\u914D\u7F6E\u662F\u5426\u6B63\u786E\u8FC1\u79FB\uFF1A
|
|
301
|
+
\`\`\`
|
|
302
|
+
http://localhost:3000/testField/ShowMasterPieces/config
|
|
303
|
+
\`\`\`
|
|
304
|
+
|
|
305
|
+
### 2. \u6D4B\u8BD5\u6587\u4EF6\u4E0A\u4F20\u529F\u80FD
|
|
306
|
+
\u5C1D\u8BD5\u5728 ShowMasterpiece \u4E2D\u4E0A\u4F20\u56FE\u7247\uFF0C\u9A8C\u8BC1 OSS \u914D\u7F6E\u662F\u5426\u6B63\u5E38\u5DE5\u4F5C\u3002
|
|
307
|
+
|
|
308
|
+
### 3. \u5904\u7406\u654F\u611F\u914D\u7F6E
|
|
309
|
+
\u4EE5\u4E0B\u654F\u611F\u914D\u7F6E\u9879\u9700\u8981\u4EBA\u5DE5\u586B\u5165\u5B9E\u9645\u503C\uFF1A
|
|
310
|
+
${migrationResult.migratedConfigs.filter((key) => CONFIG_MIGRATION_MAP[key]?.isSensitive).map((key) => `- ${key}: ${CONFIG_MIGRATION_MAP[key]?.displayName}`).join("\n")}
|
|
311
|
+
|
|
312
|
+
### 4. \u6E05\u7406\u65E7\u914D\u7F6E\uFF08\u53EF\u9009\uFF09
|
|
313
|
+
\u8FC1\u79FB\u6210\u529F\u540E\uFF0C\u53EF\u4EE5\u8003\u8651\u5728\u516C\u5171\u914D\u7F6E\u7BA1\u7406\u5668\u4E2D\u7981\u7528\u6216\u5220\u9664\u5DF2\u8FC1\u79FB\u7684\u914D\u7F6E\u9879\uFF0C\u907F\u514D\u914D\u7F6E\u51B2\u7A81\u3002
|
|
314
|
+
|
|
315
|
+
### 5. \u66F4\u65B0\u6587\u6863
|
|
316
|
+
\u66F4\u65B0\u9879\u76EE\u6587\u6863\uFF0C\u8BF4\u660E ShowMasterpiece \u6A21\u5757\u73B0\u5728\u4F7F\u7528\u72EC\u7ACB\u914D\u7F6E\u3002
|
|
317
|
+
`;
|
|
318
|
+
const reportPath = `showmasterpiece-config-migration-report-${environment}-${Date.now()}.md`;
|
|
319
|
+
fs.writeFileSync(reportPath, report);
|
|
320
|
+
console.log(report);
|
|
321
|
+
console.log(`\u{1F4C4} [\u914D\u7F6E\u8FC1\u79FB] \u8BE6\u7EC6\u62A5\u544A\u5DF2\u4FDD\u5B58\u5230: ${reportPath}`);
|
|
322
|
+
return migrationResult;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
exports.migrateConfigToShowmasterpiece = migrateConfigToShowmasterpiece;
|
|
326
|
+
//# sourceMappingURL=index.js.map
|
|
327
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/showmasterpiece/scripts/migrateConfig.ts"],"names":["writeFileSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ShowMasterpiece 配置迁移脚本\n *\n * 将公共配置管理器中的 OSS 及相关配置复制到 showmasterpiece 独立配置中\n */\n\nimport { writeFileSync } from 'fs';\n\nexport interface ConfigDbServiceLike {\n getAllConfigItems(): Promise<any[]>;\n}\n\nexport interface ShowmasterConfigServiceLike {\n getCategoryByName(name: string): Promise<any | null>;\n createCategory(payload: any): Promise<any>;\n getAllCategories(): Promise<any[]>;\n getConfigItemByKey(key: string, environment?: string): Promise<any | null>;\n updateConfigItem(id: number | string, payload: any): Promise<any>;\n createConfigItem(payload: any): Promise<any>;\n}\n\nexport interface MigrateConfigOptions {\n dryRun?: boolean;\n environment?: 'development' | 'production';\n overwrite?: boolean;\n}\n\nexport interface MigrationServices {\n configDbService: ConfigDbServiceLike;\n showmasterConfigService: ShowmasterConfigServiceLike;\n}\n\n/**\n * 需要迁移的配置项映射\n */\nconst CONFIG_MIGRATION_MAP = {\n // OSS 配置\n ALIYUN_OSS_REGION: {\n displayName: 'OSS区域',\n description: '阿里云OSS存储区域',\n type: 'string',\n isRequired: true,\n isSensitive: false,\n category: 'oss',\n },\n ALIYUN_OSS_BUCKET: {\n displayName: 'OSS存储桶',\n description: '阿里云OSS存储桶名称',\n type: 'string',\n isRequired: true,\n isSensitive: false,\n category: 'oss',\n },\n ALIYUN_OSS_ACCESS_KEY_ID: {\n displayName: 'AccessKey ID',\n description: '阿里云AccessKey ID',\n type: 'string',\n isRequired: true,\n isSensitive: true,\n category: 'oss',\n },\n ALIYUN_OSS_ACCESS_KEY_SECRET: {\n displayName: 'AccessKey Secret',\n description: '阿里云AccessKey Secret',\n type: 'password',\n isRequired: true,\n isSensitive: true,\n category: 'oss',\n },\n ALIYUN_OSS_CUSTOM_DOMAIN: {\n displayName: '自定义域名',\n description: 'OSS自定义域名(可选)',\n type: 'string',\n isRequired: false,\n isSensitive: false,\n category: 'oss',\n },\n ALIYUN_OSS_SECURE: {\n displayName: '使用HTTPS',\n description: '是否使用HTTPS连接',\n type: 'boolean',\n isRequired: false,\n isSensitive: false,\n category: 'oss',\n },\n ALIYUN_OSS_INTERNAL: {\n displayName: '内网访问',\n description: '是否使用内网访问',\n type: 'boolean',\n isRequired: false,\n isSensitive: false,\n category: 'oss',\n },\n\n // CDN 配置(可选)\n ALIYUN_CDN_DOMAIN: {\n displayName: 'CDN域名',\n description: '阿里云CDN加速域名',\n type: 'string',\n isRequired: false,\n isSensitive: false,\n category: 'cdn',\n },\n ALIYUN_CDN_ACCESS_KEY_ID: {\n displayName: 'CDN AccessKey ID',\n description: '阿里云CDN AccessKey ID',\n type: 'string',\n isRequired: false,\n isSensitive: true,\n category: 'cdn',\n },\n ALIYUN_CDN_ACCESS_KEY_SECRET: {\n displayName: 'CDN AccessKey Secret',\n description: '阿里云CDN AccessKey Secret',\n type: 'password',\n isRequired: false,\n isSensitive: true,\n category: 'cdn',\n },\n\n // 文件服务相关配置\n MAX_FILE_SIZE: {\n displayName: '最大文件大小',\n description: '允许上传的最大文件大小(字节)',\n type: 'number',\n isRequired: false,\n isSensitive: false,\n category: 'file',\n },\n FILE_STORAGE_PATH: {\n displayName: '本地存储路径',\n description: '本地文件存储路径',\n type: 'string',\n isRequired: false,\n isSensitive: false,\n category: 'file',\n },\n FILE_BASE_URL: {\n displayName: '文件基础URL',\n description: '文件访问基础URL',\n type: 'string',\n isRequired: false,\n isSensitive: false,\n category: 'file',\n },\n} as const;\n\n/**\n * 不迁移的配置项(将在报告中列出)\n */\nconst NON_MIGRATED_CONFIGS = {\n DATABASE_URL: '数据库连接字符串 - 建议由平台统一管理',\n DATABASE_POOL_SIZE: '数据库连接池配置 - 建议由平台统一管理',\n DATABASE_TIMEOUT: '数据库超时配置 - 建议由平台统一管理',\n DATABASE_SSL_MODE: '数据库SSL配置 - 建议由平台统一管理',\n\n NODE_ENV: '运行环境标识 - 由部署环境决定',\n NEXTAUTH_SECRET: 'NextAuth密钥 - 建议由平台统一管理',\n NEXTAUTH_URL: 'NextAuth回调URL - 建议由平台统一管理',\n\n QINIU_ACCESS_KEY: '七牛云配置 - ShowMasterpiece模块不使用',\n QINIU_SECRET_KEY: '七牛云配置 - ShowMasterpiece模块不使用',\n QINIU_BUCKET_NAME: '七牛云配置 - ShowMasterpiece模块不使用',\n QINIU_DOMAIN: '七牛云配置 - ShowMasterpiece模块不使用',\n\n OPENAI_API_KEY: 'OpenAI配置 - 不属于文件存储范畴',\n REDIS_URL: 'Redis配置 - 建议由平台统一管理',\n 'EMAIL_*': '邮件服务配置 - 不属于文件存储范畴',\n} as const;\n\nexport async function migrateConfigToShowmasterpiece(\n services: MigrationServices,\n options: MigrateConfigOptions = {},\n): Promise<any> {\n const { configDbService, showmasterConfigService } = services;\n const { dryRun = false, environment = 'development', overwrite = false } = options;\n\n console.log('🚀 [配置迁移] 开始迁移公共配置到ShowMasterpiece独立配置...');\n console.log(`📋 [配置迁移] 选项: 预演=${dryRun}, 环境=${environment}, 覆盖=${overwrite}`);\n\n const migrationResult = {\n categories: 0,\n migrated: 0,\n skipped: 0,\n errors: [] as string[],\n migratedConfigs: [] as string[],\n skippedConfigs: [] as string[],\n nonMigratableConfigs: Object.keys(NON_MIGRATED_CONFIGS),\n };\n\n // 1. 创建配置分类\n console.log('📦 [配置迁移] 创建配置分类...');\n const categories = [\n {\n name: 'oss',\n displayName: '阿里云OSS配置',\n description: 'ShowMasterpiece模块专用的阿里云对象存储服务配置',\n icon: 'fas fa-cloud',\n sortOrder: 1,\n },\n {\n name: 'cdn',\n displayName: '阿里云CDN配置',\n description: 'ShowMasterpiece模块专用的阿里云内容分发网络配置',\n icon: 'fas fa-globe',\n sortOrder: 2,\n },\n {\n name: 'file',\n displayName: '文件服务配置',\n description: 'ShowMasterpiece模块的文件存储和处理配置',\n icon: 'fas fa-file',\n sortOrder: 3,\n },\n ];\n\n for (const category of categories) {\n if (!dryRun) {\n try {\n const existingCategory = await showmasterConfigService.getCategoryByName(category.name);\n if (!existingCategory) {\n await showmasterConfigService.createCategory({\n ...category,\n isActive: true,\n });\n migrationResult.categories++;\n console.log(`✅ [配置迁移] 创建分类: ${category.displayName}`);\n } else {\n console.log(`ℹ️ [配置迁移] 分类已存在: ${category.displayName}`);\n }\n } catch (error) {\n console.error(`❌ [配置迁移] 创建分类失败: ${category.displayName}`, error);\n migrationResult.errors.push(`创建分类失败: ${category.displayName}`);\n }\n } else {\n console.log(`🔍 [配置迁移] 预演: 将创建分类 ${category.displayName}`);\n }\n }\n\n // 2. 获取公共配置项\n console.log('📋 [配置迁移] 获取公共配置项...');\n const publicConfigItems = await configDbService.getAllConfigItems();\n\n // 3. 获取所有分类的映射\n const categoryMap = new Map<string, any>();\n if (!dryRun) {\n const allCategories = await showmasterConfigService.getAllCategories();\n for (const cat of allCategories) {\n categoryMap.set(cat.name, cat);\n }\n } else {\n categoryMap.set('oss', { id: 'mock-oss-id', name: 'oss', displayName: '阿里云OSS配置' });\n categoryMap.set('cdn', { id: 'mock-cdn-id', name: 'cdn', displayName: '阿里云CDN配置' });\n categoryMap.set('file', { id: 'mock-file-id', name: 'file', displayName: '文件服务配置' });\n }\n\n // 4. 迁移配置项\n console.log('🔄 [配置迁移] 开始迁移配置项...');\n for (const [configKey, migrationInfo] of Object.entries(CONFIG_MIGRATION_MAP)) {\n try {\n const publicConfigItem = publicConfigItems.find((item) => item.key === configKey);\n\n if (!publicConfigItem) {\n console.log(`⚠️ [配置迁移] 公共配置中未找到: ${configKey}`);\n migrationResult.skippedConfigs.push(`${configKey} (公共配置中不存在)`);\n migrationResult.skipped++;\n continue;\n }\n\n const existingConfig = !dryRun\n ? await showmasterConfigService.getConfigItemByKey(configKey, environment)\n : null;\n\n if (existingConfig && !overwrite) {\n console.log(`ℹ️ [配置迁移] 配置已存在,跳过: ${configKey}`);\n migrationResult.skippedConfigs.push(`${configKey} (已存在)`);\n migrationResult.skipped++;\n continue;\n }\n\n const category = categoryMap.get(migrationInfo.category);\n if (!category) {\n console.error(`❌ [配置迁移] 分类不存在: ${migrationInfo.category} for ${configKey}`);\n migrationResult.errors.push(`分类不存在: ${migrationInfo.category}`);\n continue;\n }\n\n if (!dryRun) {\n const configData = {\n categoryId: category.id,\n key: configKey,\n displayName: migrationInfo.displayName,\n description: migrationInfo.description,\n value: publicConfigItem.value || publicConfigItem.defaultValue || '',\n defaultValue: publicConfigItem.defaultValue || '',\n type: migrationInfo.type,\n isRequired: migrationInfo.isRequired,\n isSensitive: migrationInfo.isSensitive,\n environment,\n sortOrder: migrationResult.migrated + 1,\n isActive: true,\n };\n\n if (existingConfig && overwrite) {\n await showmasterConfigService.updateConfigItem(existingConfig.id, {\n ...configData,\n value: publicConfigItem.value || existingConfig.value,\n });\n console.log(\n `🔄 [配置迁移] 更新配置: ${configKey} = ${publicConfigItem.value ? '***' : '(empty)'}`,\n );\n } else {\n await showmasterConfigService.createConfigItem(configData);\n console.log(`✅ [配置迁移] 迁移配置: ${configKey} = ${publicConfigItem.value ? '***' : '(empty)'}`);\n }\n\n migrationResult.migratedConfigs.push(configKey);\n migrationResult.migrated++;\n } else {\n console.log(\n `🔍 [配置迁移] 预演: 将迁移 ${configKey} = ${publicConfigItem.value ? '***' : '(empty)'}`,\n );\n migrationResult.migratedConfigs.push(configKey);\n }\n } catch (error) {\n console.error(`❌ [配置迁移] 迁移配置失败: ${configKey}`, error);\n migrationResult.errors.push(`迁移配置失败: ${configKey} - ${error}`);\n }\n }\n\n // 5. 生成迁移报告\n console.log('\\n📊 [配置迁移] 迁移完成!生成报告...\\n');\n\n const report = `\n# ShowMasterpiece 配置迁移报告\n\n## 迁移概要\n- **迁移模式**: ${dryRun ? '预演模式' : '实际迁移'}\n- **目标环境**: ${environment}\n- **覆盖模式**: ${overwrite ? '启用' : '禁用'}\n- **执行时间**: ${new Date().toLocaleString()}\n\n## 迁移统计\n- **创建分类**: ${migrationResult.categories} 个\n- **成功迁移**: ${migrationResult.migrated} 个配置项\n- **跳过项目**: ${migrationResult.skipped} 个配置项\n- **错误数量**: ${migrationResult.errors.length} 个\n\n## 已迁移的配置项\n${\n migrationResult.migratedConfigs.length > 0\n ? migrationResult.migratedConfigs\n .map(\n (key) =>\n `- ✅ ${key}: ${CONFIG_MIGRATION_MAP[key as keyof typeof CONFIG_MIGRATION_MAP]?.displayName}`,\n )\n .join('\\n')\n : '- 无'\n}\n\n## 跳过的配置项\n${\n migrationResult.skippedConfigs.length > 0\n ? migrationResult.skippedConfigs.map((item) => `- ⏭️ ${item}`).join('\\n')\n : '- 无'\n}\n\n## 不可迁移的配置项 (需要人工处理)\n${Object.entries(NON_MIGRATED_CONFIGS)\n .map(([key, reason]) => `- ⚠️ ${key}: ${reason}`)\n .join('\\n')}\n\n## 错误列表\n${\n migrationResult.errors.length > 0\n ? migrationResult.errors.map((error) => `- ❌ ${error}`).join('\\n')\n : '- 无错误'\n}\n\n## 后续步骤\n\n### 1. 验证迁移结果\n访问 ShowMasterpiece 配置页面验证配置是否正确迁移:\n\\`\\`\\`\nhttp://localhost:3000/testField/ShowMasterPieces/config\n\\`\\`\\`\n\n### 2. 测试文件上传功能\n尝试在 ShowMasterpiece 中上传图片,验证 OSS 配置是否正常工作。\n\n### 3. 处理敏感配置\n以下敏感配置项需要人工填入实际值:\n${migrationResult.migratedConfigs\n .filter((key) => CONFIG_MIGRATION_MAP[key as keyof typeof CONFIG_MIGRATION_MAP]?.isSensitive)\n .map((key) => `- ${key}: ${CONFIG_MIGRATION_MAP[key as keyof typeof CONFIG_MIGRATION_MAP]?.displayName}`)\n .join('\\n')}\n\n### 4. 清理旧配置(可选)\n迁移成功后,可以考虑在公共配置管理器中禁用或删除已迁移的配置项,避免配置冲突。\n\n### 5. 更新文档\n更新项目文档,说明 ShowMasterpiece 模块现在使用独立配置。\n`;\n\n const reportPath = `showmasterpiece-config-migration-report-${environment}-${Date.now()}.md`;\n writeFileSync(reportPath, report);\n\n console.log(report);\n console.log(`📄 [配置迁移] 详细报告已保存到: ${reportPath}`);\n\n return migrationResult;\n}\n"]}
|