sa2kit 1.6.52 → 1.6.58

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.
Files changed (195) hide show
  1. package/dist/AliyunOSSProvider-KSYW2IOG.js +15 -0
  2. package/dist/{AliyunOSSProvider-2FARPAQD.js.map → AliyunOSSProvider-KSYW2IOG.js.map} +1 -1
  3. package/dist/AliyunOSSProvider-TBK3G7YK.mjs +6 -0
  4. package/dist/{AliyunOSSProvider-UMVGVBDJ.mjs.map → AliyunOSSProvider-TBK3G7YK.mjs.map} +1 -1
  5. package/dist/LocalStorageProvider-2DGYRQAB.mjs +6 -0
  6. package/dist/{LocalStorageProvider-PYOHETJV.mjs.map → LocalStorageProvider-2DGYRQAB.mjs.map} +1 -1
  7. package/dist/LocalStorageProvider-SSRW3ZJW.js +15 -0
  8. package/dist/{LocalStorageProvider-JQF5WK5H.js.map → LocalStorageProvider-SSRW3ZJW.js.map} +1 -1
  9. package/dist/UniversalFileService-336GFY6N.mjs +6 -0
  10. package/dist/{UniversalFileService-TNYKO6JN.mjs.map → UniversalFileService-336GFY6N.mjs.map} +1 -1
  11. package/dist/UniversalFileService-J6ET6KZK.js +15 -0
  12. package/dist/{UniversalFileService-RBV6EN5J.js.map → UniversalFileService-J6ET6KZK.js.map} +1 -1
  13. package/dist/booking-BXtkG2ns.d.mts +386 -0
  14. package/dist/booking-BXtkG2ns.d.ts +386 -0
  15. package/dist/bookingAdminService-B2QDjSHJ.d.ts +193 -0
  16. package/dist/bookingAdminService-Dmg7dC6V.d.mts +193 -0
  17. package/dist/calendar/index.js +11 -11
  18. package/dist/calendar/index.mjs +4 -4
  19. package/dist/cart-CcZ7rQyG.d.mts +176 -0
  20. package/dist/cart-D3o67Q3H.d.ts +176 -0
  21. package/dist/chunk-25OFOKNF.js +171 -0
  22. package/dist/chunk-25OFOKNF.js.map +1 -0
  23. package/dist/chunk-3DXPQ4YV.mjs +165 -0
  24. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  25. package/dist/{chunk-4VJQZSPU.mjs → chunk-3NHAT7D4.mjs} +3 -4
  26. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  27. package/dist/{chunk-3JW4X3AC.mjs → chunk-622Y6LTH.mjs} +3 -3
  28. package/dist/{chunk-3JW4X3AC.mjs.map → chunk-622Y6LTH.mjs.map} +1 -1
  29. package/dist/chunk-ANKVXRPY.mjs +30 -0
  30. package/dist/chunk-ANKVXRPY.mjs.map +1 -0
  31. package/dist/chunk-CIVO4R6N.mjs +37 -0
  32. package/dist/chunk-CIVO4R6N.mjs.map +1 -0
  33. package/dist/{chunk-IZOIVYOW.js → chunk-DENROXAE.js} +2 -2
  34. package/dist/{chunk-IZOIVYOW.js.map → chunk-DENROXAE.js.map} +1 -1
  35. package/dist/{chunk-6BJ76BYC.mjs → chunk-EGJPS7OL.mjs} +3 -3
  36. package/dist/{chunk-6BJ76BYC.mjs.map → chunk-EGJPS7OL.mjs.map} +1 -1
  37. package/dist/chunk-EKIOJEJK.js +2719 -0
  38. package/dist/chunk-EKIOJEJK.js.map +1 -0
  39. package/dist/chunk-EOWTOG7Y.js +119 -0
  40. package/dist/chunk-EOWTOG7Y.js.map +1 -0
  41. package/dist/chunk-HDMIOOZY.mjs +546 -0
  42. package/dist/chunk-HDMIOOZY.mjs.map +1 -0
  43. package/dist/{chunk-MZKATHB7.js → chunk-HHVDOIPV.js} +4 -4
  44. package/dist/{chunk-MZKATHB7.js.map → chunk-HHVDOIPV.js.map} +1 -1
  45. package/dist/chunk-HJ6MH7J7.js +552 -0
  46. package/dist/chunk-HJ6MH7J7.js.map +1 -0
  47. package/dist/chunk-KH6RQ4J5.js +28 -0
  48. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  49. package/dist/{chunk-GFVAIT6Y.mjs → chunk-MFG2Y6UR.mjs} +2 -2
  50. package/dist/{chunk-GFVAIT6Y.mjs.map → chunk-MFG2Y6UR.mjs.map} +1 -1
  51. package/dist/{chunk-35CXIK5Y.js → chunk-NCOXT7SK.js} +11 -11
  52. package/dist/{chunk-35CXIK5Y.js.map → chunk-NCOXT7SK.js.map} +1 -1
  53. package/dist/chunk-NZZZUMMX.mjs +784 -0
  54. package/dist/chunk-NZZZUMMX.mjs.map +1 -0
  55. package/dist/{chunk-OBIPI4GU.mjs → chunk-OFYBMMWT.mjs} +4 -4
  56. package/dist/{chunk-OBIPI4GU.mjs.map → chunk-OFYBMMWT.mjs.map} +1 -1
  57. package/dist/chunk-PVLLRDUT.js +6944 -0
  58. package/dist/chunk-PVLLRDUT.js.map +1 -0
  59. package/dist/chunk-Q5EDCKQA.js +336 -0
  60. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  61. package/dist/{chunk-SHY424RZ.mjs → chunk-SNBILYSH.mjs} +6 -6
  62. package/dist/{chunk-SHY424RZ.mjs.map → chunk-SNBILYSH.mjs.map} +1 -1
  63. package/dist/chunk-TJZDPOO7.js +34 -0
  64. package/dist/chunk-TJZDPOO7.js.map +1 -0
  65. package/dist/{chunk-7JN25DJB.js → chunk-UVHPCLP6.js} +14 -14
  66. package/dist/{chunk-7JN25DJB.js.map → chunk-UVHPCLP6.js.map} +1 -1
  67. package/dist/chunk-WGD2NBVR.mjs +6904 -0
  68. package/dist/chunk-WGD2NBVR.mjs.map +1 -0
  69. package/dist/chunk-WS3QZYBI.mjs +2701 -0
  70. package/dist/chunk-WS3QZYBI.mjs.map +1 -0
  71. package/dist/chunk-XLR6QUDR.mjs +113 -0
  72. package/dist/chunk-XLR6QUDR.mjs.map +1 -0
  73. package/dist/chunk-YMS6BPXS.js +807 -0
  74. package/dist/chunk-YMS6BPXS.js.map +1 -0
  75. package/dist/chunk-YOTQG4NP.mjs +314 -0
  76. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  77. package/dist/chunk-ZGVB35L2.mjs +25 -0
  78. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  79. package/dist/chunk-ZRAW3HXA.js +43 -0
  80. package/dist/chunk-ZRAW3HXA.js.map +1 -0
  81. package/dist/{chunk-4XXIBWCO.js → chunk-ZRWED7Q6.js} +66 -66
  82. package/dist/{chunk-4XXIBWCO.js.map → chunk-ZRWED7Q6.js.map} +1 -1
  83. package/dist/{chunk-DVENFCQY.js → chunk-ZWQJSZEY.js} +4 -5
  84. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  85. package/dist/components/index.js +104 -104
  86. package/dist/components/index.mjs +4 -4
  87. package/dist/index.js +146 -148
  88. package/dist/index.js.map +1 -1
  89. package/dist/index.mjs +8 -11
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/logger/index.js +7 -7
  92. package/dist/logger/index.mjs +1 -4
  93. package/dist/mikuFusionGame/index.js +4 -4
  94. package/dist/mikuFusionGame/index.mjs +3 -3
  95. package/dist/portfolio/index.js +10 -10
  96. package/dist/portfolio/index.mjs +5 -5
  97. package/dist/showmasterpiece/db/index.d.mts +3028 -0
  98. package/dist/showmasterpiece/db/index.d.ts +3028 -0
  99. package/dist/showmasterpiece/db/index.js +179 -0
  100. package/dist/showmasterpiece/db/index.js.map +1 -0
  101. package/dist/showmasterpiece/db/index.mjs +6 -0
  102. package/dist/showmasterpiece/db/index.mjs.map +1 -0
  103. package/dist/showmasterpiece/index.d.mts +10 -1729
  104. package/dist/showmasterpiece/index.d.ts +10 -1729
  105. package/dist/showmasterpiece/index.js +439 -9659
  106. package/dist/showmasterpiece/index.js.map +1 -1
  107. package/dist/showmasterpiece/index.mjs +12 -9633
  108. package/dist/showmasterpiece/index.mjs.map +1 -1
  109. package/dist/showmasterpiece/logic/index.d.mts +372 -0
  110. package/dist/showmasterpiece/logic/index.d.ts +372 -0
  111. package/dist/showmasterpiece/logic/index.js +91 -0
  112. package/dist/showmasterpiece/logic/index.js.map +1 -0
  113. package/dist/showmasterpiece/logic/index.mjs +6 -0
  114. package/dist/showmasterpiece/logic/index.mjs.map +1 -0
  115. package/dist/showmasterpiece/server/index.d.mts +3 -2704
  116. package/dist/showmasterpiece/server/index.d.ts +3 -2704
  117. package/dist/showmasterpiece/server/index.js +43 -43
  118. package/dist/showmasterpiece/server/index.mjs +2 -2
  119. package/dist/showmasterpiece/ui/miniapp/index.d.mts +86 -0
  120. package/dist/showmasterpiece/ui/miniapp/index.d.ts +86 -0
  121. package/dist/showmasterpiece/ui/miniapp/index.js +196 -0
  122. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -0
  123. package/dist/showmasterpiece/ui/miniapp/index.mjs +183 -0
  124. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -0
  125. package/dist/showmasterpiece/ui/web/index.d.mts +600 -0
  126. package/dist/showmasterpiece/ui/web/index.d.ts +600 -0
  127. package/dist/showmasterpiece/ui/web/index.js +131 -0
  128. package/dist/showmasterpiece/ui/web/index.js.map +1 -0
  129. package/dist/showmasterpiece/ui/web/index.mjs +14 -0
  130. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -0
  131. package/dist/universalExport/server/index.js +2 -4
  132. package/dist/universalExport/server/index.js.map +1 -1
  133. package/dist/universalExport/server/index.mjs +1 -3
  134. package/dist/universalExport/server/index.mjs.map +1 -1
  135. package/dist/universalFile/index.js +6 -9
  136. package/dist/universalFile/index.js.map +1 -1
  137. package/dist/universalFile/index.mjs +1 -5
  138. package/dist/universalFile/index.mjs.map +1 -1
  139. package/dist/universalFile/server/index.js +5852 -291
  140. package/dist/universalFile/server/index.js.map +1 -1
  141. package/dist/universalFile/server/index.mjs +5764 -8
  142. package/dist/universalFile/server/index.mjs.map +1 -1
  143. package/dist/utils/index.js +11 -11
  144. package/dist/utils/index.mjs +2 -2
  145. package/package.json +26 -1
  146. package/dist/AliyunOSSProvider-2FARPAQD.js +0 -15
  147. package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +0 -9
  148. package/dist/LocalStorageProvider-JQF5WK5H.js +0 -15
  149. package/dist/LocalStorageProvider-PYOHETJV.mjs +0 -9
  150. package/dist/UniversalFileService-RBV6EN5J.js +0 -15
  151. package/dist/UniversalFileService-TNYKO6JN.mjs +0 -9
  152. package/dist/chunk-4NFOSCM6.js +0 -34
  153. package/dist/chunk-4NFOSCM6.js.map +0 -1
  154. package/dist/chunk-4VJQZSPU.mjs.map +0 -1
  155. package/dist/chunk-6AHYPPUP.js +0 -344
  156. package/dist/chunk-6AHYPPUP.js.map +0 -1
  157. package/dist/chunk-76V7EKBX.mjs +0 -796
  158. package/dist/chunk-76V7EKBX.mjs.map +0 -1
  159. package/dist/chunk-ACLOJXXE.js +0 -195
  160. package/dist/chunk-ACLOJXXE.js.map +0 -1
  161. package/dist/chunk-AEXPAH7Z.mjs +0 -32
  162. package/dist/chunk-AEXPAH7Z.mjs.map +0 -1
  163. package/dist/chunk-CFGX3EKK.js +0 -560
  164. package/dist/chunk-CFGX3EKK.js.map +0 -1
  165. package/dist/chunk-D2HXMGXS.js +0 -46
  166. package/dist/chunk-D2HXMGXS.js.map +0 -1
  167. package/dist/chunk-DVENFCQY.js.map +0 -1
  168. package/dist/chunk-K7WNCB4V.mjs +0 -554
  169. package/dist/chunk-K7WNCB4V.mjs.map +0 -1
  170. package/dist/chunk-L4ZYBFB2.mjs +0 -44
  171. package/dist/chunk-L4ZYBFB2.mjs.map +0 -1
  172. package/dist/chunk-M4HGHTIC.js +0 -820
  173. package/dist/chunk-M4HGHTIC.js.map +0 -1
  174. package/dist/chunk-PKKIDPXE.mjs +0 -5797
  175. package/dist/chunk-PKKIDPXE.mjs.map +0 -1
  176. package/dist/chunk-PXWDQFWV.mjs +0 -192
  177. package/dist/chunk-PXWDQFWV.mjs.map +0 -1
  178. package/dist/chunk-TSTBLX6B.js +0 -5888
  179. package/dist/chunk-TSTBLX6B.js.map +0 -1
  180. package/dist/chunk-VTGPHE4Z.mjs +0 -322
  181. package/dist/chunk-VTGPHE4Z.mjs.map +0 -1
  182. package/dist/popupConfig-BznThU1O.d.mts +0 -330
  183. package/dist/popupConfig-BznThU1O.d.ts +0 -330
  184. package/dist/showmasterpiece/migration/index.d.mts +0 -120
  185. package/dist/showmasterpiece/migration/index.d.ts +0 -120
  186. package/dist/showmasterpiece/migration/index.js +0 -595
  187. package/dist/showmasterpiece/migration/index.js.map +0 -1
  188. package/dist/showmasterpiece/migration/index.mjs +0 -589
  189. package/dist/showmasterpiece/migration/index.mjs.map +0 -1
  190. package/dist/showmasterpiece/scripts/index.d.mts +0 -28
  191. package/dist/showmasterpiece/scripts/index.d.ts +0 -28
  192. package/dist/showmasterpiece/scripts/index.js +0 -327
  193. package/dist/showmasterpiece/scripts/index.js.map +0 -1
  194. package/dist/showmasterpiece/scripts/index.mjs +0 -325
  195. 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":["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"]}
@@ -1,28 +0,0 @@
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 };
@@ -1,28 +0,0 @@
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 };
@@ -1,327 +0,0 @@
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
@@ -1 +0,0 @@
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"]}