sa2kit 3.2.0 → 3.2.2

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 (227) hide show
  1. package/dist/CollisionBalls-DgKtscU2.d.mts +41 -0
  2. package/dist/CollisionBalls-DgKtscU2.d.ts +41 -0
  3. package/dist/ConfigService-Oga_zFRS.d.mts +262 -0
  4. package/dist/ConfigService-Oga_zFRS.d.ts +262 -0
  5. package/dist/UniversalFileService-CC4d3wkc.d.ts +139 -0
  6. package/dist/UniversalFileService-CzAE_G4V.d.mts +139 -0
  7. package/dist/boothVaultService-lKcnyA-u.d.mts +83 -0
  8. package/dist/boothVaultService-lKcnyA-u.d.ts +83 -0
  9. package/dist/business/audioDetection/index.d.mts +2 -0
  10. package/dist/business/audioDetection/index.d.ts +2 -0
  11. package/dist/business/audioDetection/index.js +1244 -0
  12. package/dist/business/audioDetection/index.js.map +1 -0
  13. package/dist/business/audioDetection/index.mjs +1227 -0
  14. package/dist/business/audioDetection/index.mjs.map +1 -0
  15. package/dist/business/calendar/index.d.mts +6 -0
  16. package/dist/business/calendar/index.d.ts +6 -0
  17. package/dist/business/calendar/index.js +7433 -0
  18. package/dist/business/calendar/index.js.map +1 -0
  19. package/dist/business/calendar/index.mjs +7257 -0
  20. package/dist/business/calendar/index.mjs.map +1 -0
  21. package/dist/business/calendar/routes/index.d.mts +191 -0
  22. package/dist/business/calendar/routes/index.d.ts +191 -0
  23. package/dist/business/calendar/routes/index.js +844 -0
  24. package/dist/business/calendar/routes/index.js.map +1 -0
  25. package/dist/business/calendar/routes/index.mjs +826 -0
  26. package/dist/business/calendar/routes/index.mjs.map +1 -0
  27. package/dist/business/festivalCard/index.d.mts +4 -0
  28. package/dist/business/festivalCard/index.d.ts +4 -0
  29. package/dist/business/festivalCard/index.js +1492 -0
  30. package/dist/business/festivalCard/index.js.map +1 -0
  31. package/dist/business/festivalCard/index.mjs +1475 -0
  32. package/dist/business/festivalCard/index.mjs.map +1 -0
  33. package/dist/business/festivalCard/routes/index.d.mts +42 -0
  34. package/dist/business/festivalCard/routes/index.d.ts +42 -0
  35. package/dist/business/festivalCard/routes/index.js +361 -0
  36. package/dist/business/festivalCard/routes/index.js.map +1 -0
  37. package/dist/business/festivalCard/routes/index.mjs +356 -0
  38. package/dist/business/festivalCard/routes/index.mjs.map +1 -0
  39. package/dist/business/festivalCard/server/index.d.mts +120 -0
  40. package/dist/business/festivalCard/server/index.d.ts +120 -0
  41. package/dist/business/festivalCard/server/index.js +272 -0
  42. package/dist/business/festivalCard/server/index.js.map +1 -0
  43. package/dist/business/festivalCard/server/index.mjs +265 -0
  44. package/dist/business/festivalCard/server/index.mjs.map +1 -0
  45. package/dist/business/index.d.mts +34 -0
  46. package/dist/business/index.d.ts +34 -0
  47. package/dist/business/index.js +29282 -0
  48. package/dist/business/index.js.map +1 -0
  49. package/dist/business/index.mjs +29237 -0
  50. package/dist/business/index.mjs.map +1 -0
  51. package/dist/business/mikuContest/ui/web/index.d.mts +2 -0
  52. package/dist/business/mikuContest/ui/web/index.d.ts +2 -0
  53. package/dist/business/mikuContest/ui/web/index.js +353 -0
  54. package/dist/business/mikuContest/ui/web/index.js.map +1 -0
  55. package/dist/business/mikuContest/ui/web/index.mjs +343 -0
  56. package/dist/business/mikuContest/ui/web/index.mjs.map +1 -0
  57. package/dist/business/mikuFireworks3D/index.d.mts +2 -0
  58. package/dist/business/mikuFireworks3D/index.d.ts +2 -0
  59. package/dist/business/mikuFireworks3D/index.js +1267 -0
  60. package/dist/business/mikuFireworks3D/index.js.map +1 -0
  61. package/dist/business/mikuFireworks3D/index.mjs +1228 -0
  62. package/dist/business/mikuFireworks3D/index.mjs.map +1 -0
  63. package/dist/business/mikuFusionGame/index.d.mts +2 -0
  64. package/dist/business/mikuFusionGame/index.d.ts +2 -0
  65. package/dist/business/mikuFusionGame/index.js +1208 -0
  66. package/dist/business/mikuFusionGame/index.js.map +1 -0
  67. package/dist/business/mikuFusionGame/index.mjs +1195 -0
  68. package/dist/business/mikuFusionGame/index.mjs.map +1 -0
  69. package/dist/business/mmd/admin/index.d.mts +487 -0
  70. package/dist/business/mmd/admin/index.d.ts +487 -0
  71. package/dist/business/mmd/admin/index.js +1058 -0
  72. package/dist/business/mmd/admin/index.js.map +1 -0
  73. package/dist/business/mmd/admin/index.mjs +1027 -0
  74. package/dist/business/mmd/admin/index.mjs.map +1 -0
  75. package/dist/business/mmd/index.d.mts +5 -0
  76. package/dist/business/mmd/index.d.ts +5 -0
  77. package/dist/business/mmd/index.js +10119 -0
  78. package/dist/business/mmd/index.js.map +1 -0
  79. package/dist/business/mmd/index.mjs +10028 -0
  80. package/dist/business/mmd/index.mjs.map +1 -0
  81. package/dist/business/mmd/server/index.d.mts +139 -0
  82. package/dist/business/mmd/server/index.d.ts +139 -0
  83. package/dist/business/mmd/server/index.js +424 -0
  84. package/dist/business/mmd/server/index.js.map +1 -0
  85. package/dist/business/mmd/server/index.mjs +404 -0
  86. package/dist/business/mmd/server/index.mjs.map +1 -0
  87. package/dist/business/music/index.d.mts +3 -0
  88. package/dist/business/music/index.d.ts +3 -0
  89. package/dist/business/music/index.js +830 -0
  90. package/dist/business/music/index.js.map +1 -0
  91. package/dist/business/music/index.mjs +809 -0
  92. package/dist/business/music/index.mjs.map +1 -0
  93. package/dist/business/music/server/index.d.mts +1 -0
  94. package/dist/business/music/server/index.d.ts +1 -0
  95. package/dist/business/music/server/index.js +194 -0
  96. package/dist/business/music/server/index.js.map +1 -0
  97. package/dist/business/music/server/index.mjs +182 -0
  98. package/dist/business/music/server/index.mjs.map +1 -0
  99. package/dist/business/navigation/index.d.mts +2 -0
  100. package/dist/business/navigation/index.d.ts +2 -0
  101. package/dist/business/navigation/index.js +453 -0
  102. package/dist/business/navigation/index.js.map +1 -0
  103. package/dist/business/navigation/index.mjs +443 -0
  104. package/dist/business/navigation/index.mjs.map +1 -0
  105. package/dist/business/portfolio/index.d.mts +3 -0
  106. package/dist/business/portfolio/index.d.ts +3 -0
  107. package/dist/business/portfolio/index.js +736 -0
  108. package/dist/business/portfolio/index.js.map +1 -0
  109. package/dist/business/portfolio/index.mjs +724 -0
  110. package/dist/business/portfolio/index.mjs.map +1 -0
  111. package/dist/business/qqbot/server/index.d.mts +167 -0
  112. package/dist/business/qqbot/server/index.d.ts +167 -0
  113. package/dist/business/qqbot/server/index.js +394 -0
  114. package/dist/business/qqbot/server/index.js.map +1 -0
  115. package/dist/business/qqbot/server/index.mjs +385 -0
  116. package/dist/business/qqbot/server/index.mjs.map +1 -0
  117. package/dist/business/qqbot/ui/web/index.d.mts +10 -0
  118. package/dist/business/qqbot/ui/web/index.d.ts +10 -0
  119. package/dist/business/qqbot/ui/web/index.js +105 -0
  120. package/dist/business/qqbot/ui/web/index.js.map +1 -0
  121. package/dist/business/qqbot/ui/web/index.mjs +99 -0
  122. package/dist/business/qqbot/ui/web/index.mjs.map +1 -0
  123. package/dist/business/screenReceiver/index.d.mts +2 -0
  124. package/dist/business/screenReceiver/index.d.ts +2 -0
  125. package/dist/business/screenReceiver/index.js +281 -0
  126. package/dist/business/screenReceiver/index.js.map +1 -0
  127. package/dist/business/screenReceiver/index.mjs +273 -0
  128. package/dist/business/screenReceiver/index.mjs.map +1 -0
  129. package/dist/business/testYourself/admin/index.d.mts +58 -0
  130. package/dist/business/testYourself/admin/index.d.ts +58 -0
  131. package/dist/business/testYourself/admin/index.js +1009 -0
  132. package/dist/business/testYourself/admin/index.js.map +1 -0
  133. package/dist/business/testYourself/admin/index.mjs +1002 -0
  134. package/dist/business/testYourself/admin/index.mjs.map +1 -0
  135. package/dist/business/testYourself/index.d.mts +6 -0
  136. package/dist/business/testYourself/index.d.ts +6 -0
  137. package/dist/business/testYourself/index.js +2551 -0
  138. package/dist/business/testYourself/index.js.map +1 -0
  139. package/dist/business/testYourself/index.mjs +2531 -0
  140. package/dist/business/testYourself/index.mjs.map +1 -0
  141. package/dist/business/testYourself/server/index.d.mts +1029 -0
  142. package/dist/business/testYourself/server/index.d.ts +1029 -0
  143. package/dist/business/testYourself/server/index.js +825 -0
  144. package/dist/business/testYourself/server/index.js.map +1 -0
  145. package/dist/business/testYourself/server/index.mjs +816 -0
  146. package/dist/business/testYourself/server/index.mjs.map +1 -0
  147. package/dist/business/vocaloidBooth/index.d.mts +2 -0
  148. package/dist/business/vocaloidBooth/index.d.ts +2 -0
  149. package/dist/business/vocaloidBooth/index.js +172 -0
  150. package/dist/business/vocaloidBooth/index.js.map +1 -0
  151. package/dist/business/vocaloidBooth/index.mjs +166 -0
  152. package/dist/business/vocaloidBooth/index.mjs.map +1 -0
  153. package/dist/business/vocaloidBooth/server/index.d.mts +111 -0
  154. package/dist/business/vocaloidBooth/server/index.d.ts +111 -0
  155. package/dist/business/vocaloidBooth/server/index.js +247 -0
  156. package/dist/business/vocaloidBooth/server/index.js.map +1 -0
  157. package/dist/business/vocaloidBooth/server/index.mjs +237 -0
  158. package/dist/business/vocaloidBooth/server/index.mjs.map +1 -0
  159. package/dist/business/vocaloidBooth/web/index.d.mts +45 -0
  160. package/dist/business/vocaloidBooth/web/index.d.ts +45 -0
  161. package/dist/business/vocaloidBooth/web/index.js +376 -0
  162. package/dist/business/vocaloidBooth/web/index.js.map +1 -0
  163. package/dist/business/vocaloidBooth/web/index.mjs +362 -0
  164. package/dist/business/vocaloidBooth/web/index.mjs.map +1 -0
  165. package/dist/common/auth/components/index.js +18 -0
  166. package/dist/common/auth/components/index.js.map +1 -1
  167. package/dist/common/auth/components/index.mjs +18 -0
  168. package/dist/common/auth/components/index.mjs.map +1 -1
  169. package/dist/common/auth/server/index.d.mts +86 -3
  170. package/dist/common/auth/server/index.d.ts +86 -3
  171. package/dist/common/auth/server/index.js +614 -1
  172. package/dist/common/auth/server/index.js.map +1 -1
  173. package/dist/common/auth/server/index.mjs +599 -3
  174. package/dist/common/auth/server/index.mjs.map +1 -1
  175. package/dist/config-BQp3qLAL.d.mts +22 -0
  176. package/dist/config-BQp3qLAL.d.ts +22 -0
  177. package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
  178. package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
  179. package/dist/festivalCardService-D60G-sgr.d.mts +13 -0
  180. package/dist/festivalCardService-DnLyJpRh.d.ts +13 -0
  181. package/dist/index-BMgdH5dL.d.mts +1716 -0
  182. package/dist/index-BO9_Do5y.d.mts +93 -0
  183. package/dist/index-BO9_Do5y.d.ts +93 -0
  184. package/dist/index-BSmd4ikf.d.ts +76 -0
  185. package/dist/index-BSwvWYp2.d.mts +2632 -0
  186. package/dist/index-Bo_fW3Tl.d.mts +105 -0
  187. package/dist/index-Bo_fW3Tl.d.ts +105 -0
  188. package/dist/index-BrKazb8M.d.mts +148 -0
  189. package/dist/index-BrKazb8M.d.ts +148 -0
  190. package/dist/index-Bzh6QE4P.d.ts +25 -0
  191. package/dist/index-C5Ic6eSR.d.mts +25 -0
  192. package/dist/index-C8i9SIxk.d.ts +2632 -0
  193. package/dist/index-C_GhVhOT.d.mts +109 -0
  194. package/dist/index-C_GhVhOT.d.ts +109 -0
  195. package/dist/index-Cb3UEpG4.d.mts +101 -0
  196. package/dist/index-CjlkUj01.d.mts +103 -0
  197. package/dist/index-CucXCBNR.d.mts +302 -0
  198. package/dist/index-CucXCBNR.d.ts +302 -0
  199. package/dist/index-DLLPTprx.d.mts +1522 -0
  200. package/dist/index-DRiZy0dv.d.mts +525 -0
  201. package/dist/index-DRiZy0dv.d.ts +525 -0
  202. package/dist/index-Dc_I2t0P.d.mts +103 -0
  203. package/dist/index-DowAHRIP.d.mts +250 -0
  204. package/dist/index-DowAHRIP.d.ts +250 -0
  205. package/dist/index-Dpq_5H2n.d.ts +103 -0
  206. package/dist/index-Ds2M_9zb.d.ts +101 -0
  207. package/dist/index-IXMAeTtN.d.ts +1716 -0
  208. package/dist/index-VFDbZxVM.d.ts +1522 -0
  209. package/dist/index-jadkp96n.d.ts +103 -0
  210. package/dist/index-r2-zE3iC.d.mts +76 -0
  211. package/dist/index.d.mts +10682 -0
  212. package/dist/index.d.ts +10682 -0
  213. package/dist/index.js +38233 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/index.mjs +37959 -0
  216. package/dist/index.mjs.map +1 -0
  217. package/dist/types-B6B210gX.d.mts +270 -0
  218. package/dist/types-B6B210gX.d.ts +270 -0
  219. package/dist/types-B7voqjjA.d.mts +51 -0
  220. package/dist/types-B7voqjjA.d.ts +51 -0
  221. package/dist/types-Bdnte5EN.d.mts +292 -0
  222. package/dist/types-C2z_QQPI.d.mts +70 -0
  223. package/dist/types-C2z_QQPI.d.ts +70 -0
  224. package/dist/types-HorDyIRv.d.mts +303 -0
  225. package/dist/types-HorDyIRv.d.ts +303 -0
  226. package/dist/types-_rFX1atk.d.ts +292 -0
  227. package/package.json +10 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/business/testYourself/server/ConfigService.ts","../../../src/business/testYourself/utils/fingerprint.ts","../../../src/business/testYourself/data/defaultResults.ts","../../../src/business/testYourself/components/TestYourself.tsx","../../../src/business/testYourself/admin/ConfigManager.tsx","../../../src/business/testYourself/admin/ConfigList.tsx","../../../src/business/testYourself/server/index.ts","../../../src/business/testYourself/server/drizzle-schema.ts","../../../src/business/testYourself/server/DatabaseConfigAdapter.ts"],"names":["ConfigService","index","useState","useEffect","getDefaultConfigService","useRef","React","useCallback","text","Star","Edit","Copy","Download","Trash2","ImageIcon","X","Plus","Save","clsx","AlertCircle","CheckCircle2","UploadIcon","RefreshCw","ExternalLink","pgTable","uuid","varchar","json","integer","boolean","timestamp","eq","sql","and","or","desc"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 测测你是什么 - 配置管理服务\n * Test Yourself - Configuration Management Service\n * \n * 服务端逻辑:配置的增删改查\n */\n\nimport type { SavedConfig, TestConfig, ConfigListItem } from '../types';\n\nexport interface ConfigServiceOptions {\n /** 存储类型 */\n storageType?: 'localStorage' | 'memory' | 'custom';\n /** 自定义存储适配器 */\n customStorage?: IConfigStorage;\n /** 是否启用缓存 */\n enableCache?: boolean;\n}\n\n/**\n * 配置存储适配器接口\n */\nexport interface IConfigStorage {\n /** 保存配置 */\n saveConfig(config: SavedConfig): Promise<void>;\n /** 获取配置 */\n getConfig(id: string): Promise<SavedConfig | null>;\n /** 获取所有配置列表 */\n getAllConfigs(): Promise<SavedConfig[]>;\n /** 删除配置 */\n deleteConfig(id: string): Promise<void>;\n /** 更新配置 */\n updateConfig(id: string, config: SavedConfig): Promise<void>;\n /** 设置默认配置 */\n setDefaultConfig(id: string): Promise<void>;\n /** 获取默认配置 */\n getDefaultConfig(): Promise<SavedConfig | null>;\n}\n\n/**\n * LocalStorage 存储适配器\n */\nclass LocalStorageAdapter implements IConfigStorage {\n private readonly STORAGE_KEY = 'test-yourself-configs';\n private readonly DEFAULT_KEY = 'test-yourself-default-config';\n\n private async getAllConfigsData(): Promise<SavedConfig[]> {\n if (typeof window === 'undefined') return [];\n \n try {\n const data = localStorage.getItem(this.STORAGE_KEY);\n return data ? JSON.parse(data) : [];\n } catch (error) {\n console.error('读取配置失败:', error);\n return [];\n }\n }\n\n private async saveAllConfigsData(configs: SavedConfig[]): Promise<void> {\n if (typeof window === 'undefined') return;\n \n try {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(configs));\n } catch (error) {\n console.error('保存配置失败:', error);\n throw error;\n }\n }\n\n async saveConfig(config: SavedConfig): Promise<void> {\n const configs = await this.getAllConfigsData();\n const existingIndex = configs.findIndex(c => c.id === config.id);\n \n if (existingIndex >= 0) {\n configs[existingIndex] = config;\n } else {\n configs.push(config);\n }\n \n await this.saveAllConfigsData(configs);\n }\n\n async getConfig(id: string): Promise<SavedConfig | null> {\n const configs = await this.getAllConfigsData();\n return configs.find(c => c.id === id) || null;\n }\n\n async getAllConfigs(): Promise<SavedConfig[]> {\n return this.getAllConfigsData();\n }\n\n async deleteConfig(id: string): Promise<void> {\n const configs = await this.getAllConfigsData();\n const filtered = configs.filter(c => c.id !== id);\n await this.saveAllConfigsData(filtered);\n }\n\n async updateConfig(id: string, config: SavedConfig): Promise<void> {\n const configs = await this.getAllConfigsData();\n const index = configs.findIndex(c => c.id === id);\n \n if (index >= 0) {\n configs[index] = { ...config, updatedAt: Date.now() };\n await this.saveAllConfigsData(configs);\n } else {\n throw new Error('配置不存在: ' + (id));\n }\n }\n\n async setDefaultConfig(id: string): Promise<void> {\n if (typeof window === 'undefined') return;\n \n const config = await this.getConfig(id);\n if (!config) {\n throw new Error('配置不存在: ' + (id));\n }\n \n // 清除其他配置的默认标记\n const configs = await this.getAllConfigsData();\n configs.forEach(c => c.isDefault = c.id === id);\n await this.saveAllConfigsData(configs);\n \n // 保存默认配置ID\n localStorage.setItem(this.DEFAULT_KEY, id);\n }\n\n async getDefaultConfig(): Promise<SavedConfig | null> {\n if (typeof window === 'undefined') return null;\n \n try {\n const defaultId = localStorage.getItem(this.DEFAULT_KEY);\n if (defaultId) {\n return await this.getConfig(defaultId);\n }\n \n // 如果没有设置默认配置,返回第一个标记为默认的配置\n const configs = await this.getAllConfigsData();\n return configs.find(c => c.isDefault) || null;\n } catch (error) {\n console.error('获取默认配置失败:', error);\n return null;\n }\n }\n}\n\n/**\n * 内存存储适配器(用于测试或SSR)\n */\nclass MemoryStorageAdapter implements IConfigStorage {\n private configs: Map<string, SavedConfig> = new Map();\n private defaultConfigId: string | null = null;\n\n async saveConfig(config: SavedConfig): Promise<void> {\n this.configs.set(config.id, config);\n }\n\n async getConfig(id: string): Promise<SavedConfig | null> {\n return this.configs.get(id) || null;\n }\n\n async getAllConfigs(): Promise<SavedConfig[]> {\n return Array.from(this.configs.values());\n }\n\n async deleteConfig(id: string): Promise<void> {\n this.configs.delete(id);\n if (this.defaultConfigId === id) {\n this.defaultConfigId = null;\n }\n }\n\n async updateConfig(id: string, config: SavedConfig): Promise<void> {\n if (!this.configs.has(id)) {\n throw new Error('配置不存在: ' + (id));\n }\n this.configs.set(id, { ...config, updatedAt: Date.now() });\n }\n\n async setDefaultConfig(id: string): Promise<void> {\n if (!this.configs.has(id)) {\n throw new Error('配置不存在: ' + (id));\n }\n \n // 清除其他配置的默认标记\n this.configs.forEach(c => c.isDefault = c.id === id);\n this.defaultConfigId = id;\n }\n\n async getDefaultConfig(): Promise<SavedConfig | null> {\n if (this.defaultConfigId) {\n return this.configs.get(this.defaultConfigId) || null;\n }\n \n // 返回第一个标记为默认的配置\n for (const config of this.configs.values()) {\n if (config.isDefault) {\n return config;\n }\n }\n \n return null;\n }\n}\n\n/**\n * 配置管理服务\n */\nexport class ConfigService {\n private storage: IConfigStorage;\n private cache: Map<string, SavedConfig> = new Map();\n private enableCache: boolean;\n\n constructor(options: ConfigServiceOptions = {}) {\n const {\n storageType = 'localStorage',\n customStorage,\n enableCache = true,\n } = options;\n\n this.enableCache = enableCache;\n\n if (customStorage) {\n this.storage = customStorage;\n } else if (storageType === 'memory') {\n this.storage = new MemoryStorageAdapter();\n } else {\n this.storage = new LocalStorageAdapter();\n }\n }\n\n /**\n * 初始化服务(如果需要)\n */\n async init(): Promise<void> {\n // 基础类不需要初始化,但子类或适配器可能需要\n }\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return 'config_' + (Date.now()) + '_' + (Math.random().toString(36).substring(2, 9));\n }\n\n /**\n * 保存配置\n */\n async saveConfig(config: SavedConfig): Promise<void> {\n await this.storage.saveConfig(config);\n\n if (config.isDefault) {\n await this.storage.setDefaultConfig(config.id);\n }\n\n if (this.enableCache) {\n this.cache.set(config.id, config);\n }\n }\n\n /**\n * 创建新配置\n */\n async createConfig(\n name: string,\n config: TestConfig,\n description?: string,\n isDefault = false\n ): Promise<SavedConfig> {\n const savedConfig: SavedConfig = {\n id: this.generateId(),\n name,\n description,\n config,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isDefault,\n };\n\n await this.storage.saveConfig(savedConfig);\n\n if (isDefault) {\n await this.storage.setDefaultConfig(savedConfig.id);\n }\n\n if (this.enableCache) {\n this.cache.set(savedConfig.id, savedConfig);\n }\n\n return savedConfig;\n }\n\n /**\n * 获取配置\n */\n async getConfig(id: string): Promise<SavedConfig | null> {\n // 先查缓存\n if (this.enableCache && this.cache.has(id)) {\n return this.cache.get(id)!;\n }\n\n const config = await this.storage.getConfig(id);\n\n if (config && this.enableCache) {\n this.cache.set(id, config);\n }\n\n return config;\n }\n\n /**\n * 获取所有配置列表\n */\n async getAllConfigs(): Promise<SavedConfig[]> {\n return await this.storage.getAllConfigs();\n }\n\n /**\n * 获取配置列表(精简版)\n */\n async getConfigList(): Promise<ConfigListItem[]> {\n const configs = await this.getAllConfigs();\n return configs.map(c => ({\n id: c.id,\n name: c.name,\n description: c.description,\n resultCount: c.config.results.length,\n createdAt: c.createdAt,\n updatedAt: c.updatedAt,\n isDefault: c.isDefault,\n }));\n }\n\n /**\n * 更新配置\n */\n async updateConfig(\n id: string,\n updates: {\n name?: string;\n description?: string;\n config?: TestConfig;\n isDefault?: boolean;\n }\n ): Promise<SavedConfig> {\n const existing = await this.getConfig(id);\n if (!existing) {\n throw new Error('配置不存在: ' + (id));\n }\n\n const updated: SavedConfig = {\n ...existing,\n ...updates,\n updatedAt: Date.now(),\n };\n\n await this.storage.updateConfig(id, updated);\n\n if (updates.isDefault) {\n await this.storage.setDefaultConfig(id);\n }\n\n if (this.enableCache) {\n this.cache.set(id, updated);\n }\n\n return updated;\n }\n\n /**\n * 删除配置\n */\n async deleteConfig(id: string): Promise<void> {\n await this.storage.deleteConfig(id);\n\n if (this.enableCache) {\n this.cache.delete(id);\n }\n }\n\n /**\n * 设置默认配置\n */\n async setDefaultConfig(id: string): Promise<void> {\n await this.storage.setDefaultConfig(id);\n\n // 清理缓存,让下次获取时重新加载\n if (this.enableCache) {\n this.cache.clear();\n }\n }\n\n /**\n * 获取默认配置\n */\n async getDefaultConfig(): Promise<SavedConfig | null> {\n return await this.storage.getDefaultConfig();\n }\n\n /**\n * 清空缓存\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * 导出配置(JSON格式)\n */\n async exportConfig(id: string): Promise<string> {\n const config = await this.getConfig(id);\n if (!config) {\n throw new Error('配置不存在: ' + (id));\n }\n return JSON.stringify(config, null, 2);\n }\n\n /**\n * 导入配置\n */\n async importConfig(jsonString: string): Promise<SavedConfig> {\n try {\n const data = JSON.parse(jsonString) as SavedConfig;\n \n // 生成新ID,避免冲突\n const newConfig: SavedConfig = {\n ...data,\n id: this.generateId(),\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isDefault: false, // 导入的配置不设为默认\n };\n\n await this.storage.saveConfig(newConfig);\n\n if (this.enableCache) {\n this.cache.set(newConfig.id, newConfig);\n }\n\n return newConfig;\n } catch (error) {\n throw new Error('导入配置失败: ' + (error));\n }\n }\n\n /**\n * 复制配置\n */\n async duplicateConfig(id: string, newName?: string): Promise<SavedConfig> {\n const original = await this.getConfig(id);\n if (!original) {\n throw new Error('配置不存在: ' + (id));\n }\n\n const duplicated: SavedConfig = {\n ...original,\n id: this.generateId(),\n name: newName || (original.name) + ' (副本)',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isDefault: false,\n };\n\n await this.storage.saveConfig(duplicated);\n\n if (this.enableCache) {\n this.cache.set(duplicated.id, duplicated);\n }\n\n return duplicated;\n }\n\n /**\n * 批量删除配置\n */\n async deleteConfigs(ids: string[]): Promise<void> {\n for (const id of ids) {\n await this.deleteConfig(id);\n }\n }\n}\n\n/**\n * 创建默认配置服务实例\n */\nexport function createConfigService(options?: ConfigServiceOptions): ConfigService {\n return new ConfigService(options);\n}\n\n/**\n * 默认配置服务实例(单例)\n */\nlet defaultServiceInstance: ConfigService | null = null;\n\nexport function getDefaultConfigService(): ConfigService {\n if (!defaultServiceInstance) {\n defaultServiceInstance = createConfigService();\n }\n return defaultServiceInstance;\n}\n\n\n","/**\n * 设备指纹生成工具\n * Device Fingerprint Generator\n */\n\nimport type { DeviceFingerprint } from '../types';\n\n/**\n * 生成Canvas指纹\n */\nfunction getCanvasFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return 'no-canvas';\n\n canvas.width = 200;\n canvas.height = 50;\n\n // 绘制文字\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(0, 0, 200, 50);\n ctx.fillStyle = '#069';\n ctx.fillText('Canvas Fingerprint 🎨', 2, 15);\n\n // 转换为数据URL\n return canvas.toDataURL();\n } catch (error) {\n return 'canvas-error';\n }\n}\n\n/**\n * 生成WebGL指纹\n */\nfunction getWebGLFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (!gl) return 'no-webgl';\n\n const glContext = gl as WebGLRenderingContext;\n const debugInfo = glContext.getExtension('WEBGL_debug_renderer_info');\n \n if (debugInfo) {\n const vendor = glContext.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = glContext.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n return (vendor) + '~' + (renderer);\n }\n\n return 'webgl-no-debug';\n } catch (error) {\n return 'webgl-error';\n }\n}\n\n/**\n * 检测可用字体\n */\nfunction getAvailableFonts(): string {\n const testFonts = [\n 'Arial', 'Verdana', 'Courier New', 'Georgia', 'Times New Roman',\n 'Comic Sans MS', 'Trebuchet MS', 'Arial Black', 'Impact',\n 'Courier', 'Helvetica', 'Monaco', 'Consolas', 'Menlo'\n ];\n \n const availableFonts: string[] = [];\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) return 'no-fonts';\n\n const baseFonts = ['monospace', 'sans-serif', 'serif'];\n const testString = 'mmmmmmmmmmlli';\n const baseWidths: { [key: string]: number } = {};\n\n // 获取基础字体宽度\n baseFonts.forEach(font => {\n ctx.font = '72px ' + (font);\n baseWidths[font] = ctx.measureText(testString).width;\n });\n\n // 测试每个字体\n testFonts.forEach(font => {\n let detected = false;\n baseFonts.forEach(baseFont => {\n ctx.font = '72px ' + (font) + ', ' + (baseFont);\n const width = ctx.measureText(testString).width;\n if (width !== baseWidths[baseFont]) {\n detected = true;\n }\n });\n if (detected) {\n availableFonts.push(font);\n }\n });\n\n return availableFonts.join(',') || 'no-custom-fonts';\n}\n\n/**\n * 获取设备指纹信息(增强版)\n */\nexport function getDeviceFingerprint(): DeviceFingerprint {\n const fingerprint: DeviceFingerprint = {\n // 基础信息\n userAgent: navigator.userAgent,\n screenResolution: (window.screen.width) + 'x' + (window.screen.height),\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n language: navigator.language,\n platform: navigator.platform,\n\n // 显示信息\n colorDepth: window.screen.colorDepth,\n devicePixelRatio: window.devicePixelRatio,\n\n // 硬件信息\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n maxTouchPoints: navigator.maxTouchPoints || 0,\n\n // Canvas和WebGL指纹\n canvasFingerprint: getCanvasFingerprint(),\n webglFingerprint: getWebGLFingerprint(),\n\n // 字体检测\n fonts: getAvailableFonts(),\n\n // 浏览器能力\n cookieEnabled: navigator.cookieEnabled,\n localStorageEnabled: (() => {\n try {\n return typeof localStorage !== 'undefined';\n } catch {\n return false;\n }\n })(),\n sessionStorageEnabled: (() => {\n try {\n return typeof sessionStorage !== 'undefined';\n } catch {\n return false;\n }\n })(),\n indexedDBEnabled: (() => {\n try {\n return typeof indexedDB !== 'undefined';\n } catch {\n return false;\n }\n })(),\n };\n\n return fingerprint;\n}\n\n/**\n * 尝试获取IP地址\n * 注意:由于浏览器安全限制,直接获取IP地址需要外部API\n */\nexport async function tryGetIPAddress(): Promise<string | null> {\n try {\n // 尝试使用公共API获取IP\n // 注意:这需要CORS支持,实际使用时可能需要配置\n const response = await fetch('https://api.ipify.org?format=json', {\n method: 'GET',\n mode: 'cors',\n });\n \n if (response.ok) {\n const data = await response.json();\n return data.ip || null;\n }\n } catch (error) {\n console.warn('无法获取IP地址:', error);\n }\n \n return null;\n}\n\n/**\n * 简单的哈希函数 (DJB2算法)\n */\nfunction simpleHash(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) + str.charCodeAt(i);\n }\n return Math.abs(hash);\n}\n\n/**\n * 生成设备唯一标识\n * @param fingerprint 设备指纹\n * @param salt 盐值\n * @returns 唯一标识哈希值\n */\nexport function generateDeviceHash(\n fingerprint: DeviceFingerprint,\n salt: string = 'test-yourself-salt-2024'\n): string {\n // 组合所有指纹信息(包含新增的特征)\n const components = [\n // 基础信息\n fingerprint.userAgent,\n fingerprint.ip || 'no-ip',\n fingerprint.screenResolution,\n fingerprint.timezone,\n fingerprint.language,\n fingerprint.platform,\n \n // 显示信息\n fingerprint.colorDepth?.toString() || '0',\n fingerprint.devicePixelRatio?.toString() || '0',\n \n // 硬件信息\n fingerprint.hardwareConcurrency?.toString() || '0',\n fingerprint.maxTouchPoints?.toString() || '0',\n \n // Canvas和WebGL指纹(这些是最独特的)\n fingerprint.canvasFingerprint || 'no-canvas',\n fingerprint.webglFingerprint || 'no-webgl',\n \n // 字体(不同设备安装的字体不同)\n fingerprint.fonts || 'no-fonts',\n \n // 浏览器能力\n fingerprint.cookieEnabled ? '1' : '0',\n fingerprint.localStorageEnabled ? '1' : '0',\n fingerprint.sessionStorageEnabled ? '1' : '0',\n fingerprint.indexedDBEnabled ? '1' : '0',\n \n // 盐值\n salt,\n ];\n\n // 拼接并生成哈希\n const combined = components.join('|');\n const hash = simpleHash(combined);\n \n return hash.toString(36); // 转换为36进制字符串\n}\n\n/**\n * 根据哈希值选择结果索引\n * @param hash 设备哈希值\n * @param totalResults 总结果数\n * @returns 结果索引 (0 到 totalResults-1)\n */\nexport function selectResultIndex(hash: string, totalResults: number): number {\n const numHash = parseInt(hash, 36);\n return numHash % totalResults;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","/**\n * 默认测试结果数据\n * Default Test Results Data\n * \n * 包含45个预设结果\n */\n\nimport type { TestResult } from '../types';\n\nexport const DEFAULT_RESULTS: TestResult[] = [\n // 动物系列 (1-15)\n {\n id: 'animal-cat',\n title: '慵懒的猫咪 🐱',\n description: '你就像一只优雅的猫,独立自主,喜欢按照自己的节奏生活。有时高冷,有时粘人,充满神秘魅力。',\n image: '🐱',\n imageType: 'emoji',\n },\n {\n id: 'animal-dog',\n title: '忠诚的狗狗 🐕',\n description: '你像一只热情的狗狗,对朋友忠诚,充满活力。总是能给周围的人带来欢乐和温暖。',\n image: '🐕',\n imageType: 'emoji',\n },\n {\n id: 'animal-panda',\n title: '可爱的熊猫 🐼',\n description: '你就像国宝熊猫一样,呆萌可爱,人见人爱。慢节奏的生活方式让你充满治愈力。',\n image: '🐼',\n imageType: 'emoji',\n },\n {\n id: 'animal-fox',\n title: '机智的狐狸 🦊',\n description: '聪明伶俐,反应敏捷。你总能用智慧解决问题,是团队中的智囊担当。',\n image: '🦊',\n imageType: 'emoji',\n },\n {\n id: 'animal-owl',\n title: '睿智的猫头鹰 🦉',\n description: '你像猫头鹰一样充满智慧,喜欢在夜深人静时思考。理性、沉稳是你的标签。',\n image: '🦉',\n imageType: 'emoji',\n },\n {\n id: 'animal-dolphin',\n title: '快乐的海豚 🐬',\n description: '活泼开朗,社交达人。你的笑容能够感染身边的每一个人。',\n image: '🐬',\n imageType: 'emoji',\n },\n {\n id: 'animal-butterfly',\n title: '自由的蝴蝶 🦋',\n description: '追求自由,热爱美好事物。你的人生充满色彩,从不被束缚。',\n image: '🦋',\n imageType: 'emoji',\n },\n {\n id: 'animal-lion',\n title: '勇敢的狮子 🦁',\n description: '天生的领导者,勇敢果断。你的气场强大,总能激励他人。',\n image: '🦁',\n imageType: 'emoji',\n },\n {\n id: 'animal-rabbit',\n title: '温柔的兔子 🐰',\n description: '心地善良,温柔体贴。你的存在就像春天的微风,让人感到温暖。',\n image: '🐰',\n imageType: 'emoji',\n },\n {\n id: 'animal-penguin',\n title: '呆萌的企鹅 🐧',\n description: '憨态可掬,认真执着。虽然看起来笨拙,但做事一丝不苟。',\n image: '🐧',\n imageType: 'emoji',\n },\n {\n id: 'animal-eagle',\n title: '翱翔的雄鹰 🦅',\n description: '目光远大,志向高远。你总是能看到别人看不到的机会。',\n image: '🦅',\n imageType: 'emoji',\n },\n {\n id: 'animal-koala',\n title: '慵懒的考拉 🐨',\n description: '佛系生活,知足常乐。你懂得享受当下,活在自己的节奏里。',\n image: '🐨',\n imageType: 'emoji',\n },\n {\n id: 'animal-sloth',\n title: '悠闲的树懒 🦥',\n description: '慢慢来,比较快。你相信急不来的事就不要急,保持自己的pace。',\n image: '🦥',\n imageType: 'emoji',\n },\n {\n id: 'animal-unicorn',\n title: '梦幻的独角兽 🦄',\n description: '充满幻想,追求完美。你的世界五彩斑斓,总有独特的想法。',\n image: '🦄',\n imageType: 'emoji',\n },\n {\n id: 'animal-dragon',\n title: '神秘的龙 🐉',\n description: '强大而神秘,充满魅力。你是传说中的存在,令人向往。',\n image: '🐉',\n imageType: 'emoji',\n },\n\n // 星球系列 (16-25)\n {\n id: 'planet-sun',\n title: '温暖的太阳 ☀️',\n description: '你就像太阳一样,是团队的能量来源,温暖着周围的每个人。',\n image: '☀️',\n imageType: 'emoji',\n },\n {\n id: 'planet-moon',\n title: '温柔的月亮 🌙',\n description: '安静而温柔,在黑暗中给人光明。你是夜晚最美的陪伴。',\n image: '🌙',\n imageType: 'emoji',\n },\n {\n id: 'planet-star',\n title: '闪耀的星星 ⭐',\n description: '虽然渺小,但始终闪耀。你用自己的方式发光发热。',\n image: '⭐',\n imageType: 'emoji',\n },\n {\n id: 'planet-earth',\n title: '包容的地球 🌍',\n description: '包容万物,生机勃勃。你有着宽广的胸怀和无限的可能。',\n image: '🌍',\n imageType: 'emoji',\n },\n {\n id: 'planet-saturn',\n title: '独特的土星 🪐',\n description: '与众不同,自成一格。你的个性就像土星环一样令人着迷。',\n image: '🪐',\n imageType: 'emoji',\n },\n {\n id: 'weather-rainbow',\n title: '绚丽的彩虹 🌈',\n description: '风雨过后见彩虹,你总能在困难后看到希望和美好。',\n image: '🌈',\n imageType: 'emoji',\n },\n {\n id: 'weather-cloud',\n title: '飘逸的云朵 ☁️',\n description: '自由自在,随风飘荡。你不被定义,永远充满可能。',\n image: '☁️',\n imageType: 'emoji',\n },\n {\n id: 'weather-lightning',\n title: '闪电 ⚡',\n description: '爆发力强,行动迅速。你的能量就像闪电一样令人震撼。',\n image: '⚡',\n imageType: 'emoji',\n },\n {\n id: 'weather-snowflake',\n title: '独特的雪花 ❄️',\n description: '世界上没有两片相同的雪花,你也是独一无二的存在。',\n image: '❄️',\n imageType: 'emoji',\n },\n {\n id: 'weather-fire',\n title: '热情的火焰 🔥',\n description: '热情似火,充满激情。你的存在能点燃周围的气氛。',\n image: '🔥',\n imageType: 'emoji',\n },\n\n // 植物系列 (26-35)\n {\n id: 'plant-tree',\n title: '坚韧的大树 🌳',\n description: '稳重可靠,根基深厚。你是大家可以依靠的存在。',\n image: '🌳',\n imageType: 'emoji',\n },\n {\n id: 'plant-flower',\n title: '美丽的花朵 🌸',\n description: '绽放自我,美丽动人。你的存在就是一道靓丽的风景。',\n image: '🌸',\n imageType: 'emoji',\n },\n {\n id: 'plant-sunflower',\n title: '向阳的向日葵 🌻',\n description: '永远向着阳光,积极向上。你的乐观感染着每个人。',\n image: '🌻',\n imageType: 'emoji',\n },\n {\n id: 'plant-rose',\n title: '优雅的玫瑰 🌹',\n description: '高贵优雅,充满魅力。虽有刺但更有美丽。',\n image: '🌹',\n imageType: 'emoji',\n },\n {\n id: 'plant-cactus',\n title: '坚强的仙人掌 🌵',\n description: '在艰难环境中依然坚强。你的韧性令人敬佩。',\n image: '🌵',\n imageType: 'emoji',\n },\n {\n id: 'plant-clover',\n title: '幸运的四叶草 🍀',\n description: '幸运的象征,总能给人带来好运和希望。',\n image: '🍀',\n imageType: 'emoji',\n },\n {\n id: 'plant-maple',\n title: '浪漫的枫叶 🍁',\n description: '浪漫而诗意,你的世界充满艺术气息。',\n image: '🍁',\n imageType: 'emoji',\n },\n {\n id: 'plant-mushroom',\n title: '神秘的蘑菇 🍄',\n description: '低调神秘,总有意想不到的惊喜。',\n image: '🍄',\n imageType: 'emoji',\n },\n {\n id: 'plant-cherry',\n title: '浪漫的樱花 🌸',\n description: '短暂而美好,你珍惜每一个瞬间的美丽。',\n image: '🌸',\n imageType: 'emoji',\n },\n {\n id: 'plant-bamboo',\n title: '坚韧的竹子 🎋',\n description: '虚心有节,愈挫愈勇。你的精神值得学习。',\n image: '🎋',\n imageType: 'emoji',\n },\n\n // 食物系列 (36-45)\n {\n id: 'food-coffee',\n title: '提神的咖啡 ☕',\n description: '你就像咖啡,是大家的能量来源,帮助他人保持活力。',\n image: '☕',\n imageType: 'emoji',\n },\n {\n id: 'food-pizza',\n title: '快乐的披萨 🍕',\n description: '人见人爱,总能带来快乐。你是聚会的灵魂。',\n image: '🍕',\n imageType: 'emoji',\n },\n {\n id: 'food-cookie',\n title: '甜蜜的饼干 🍪',\n description: '温暖甜蜜,给人comfort。你是最好的治愈系存在。',\n image: '🍪',\n imageType: 'emoji',\n },\n {\n id: 'food-icecream',\n title: '清凉的冰淇淋 🍦',\n description: '甜美可爱,在炎热时给人清凉。你总能在关键时刻出现。',\n image: '🍦',\n imageType: 'emoji',\n },\n {\n id: 'food-honey',\n title: '甜蜜的蜂蜜 🍯',\n description: '天然甜美,纯粹可爱。你的存在就是幸福的味道。',\n image: '🍯',\n imageType: 'emoji',\n },\n {\n id: 'food-sushi',\n title: '精致的寿司 🍣',\n description: '精致优雅,注重细节。你对生活有着独特的品味。',\n image: '🍣',\n imageType: 'emoji',\n },\n {\n id: 'food-cake',\n title: '甜美的蛋糕 🎂',\n description: '甜蜜美好,是庆祝的象征。你总能给人带来惊喜。',\n image: '🎂',\n imageType: 'emoji',\n },\n {\n id: 'food-donut',\n title: '可爱的甜甜圈 🍩',\n description: '圆圆满满,甜蜜可爱。你的存在让生活更美好。',\n image: '🍩',\n imageType: 'emoji',\n },\n {\n id: 'food-lollipop',\n title: '童真的棒棒糖 🍭',\n description: '保持童心,永远年轻。你的纯真令人羡慕。',\n image: '🍭',\n imageType: 'emoji',\n },\n {\n id: 'food-watermelon',\n title: '清爽的西瓜 🍉',\n description: '清爽解渴,夏日必备。你总能带来清新的感觉。',\n image: '🍉',\n imageType: 'emoji',\n },\n];\n\n// 验证数据集长度\nif (DEFAULT_RESULTS.length !== 45) {\n console.warn('结果数据集应包含45项,当前: ' + (DEFAULT_RESULTS.length));\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","/**\n * 测测你是什么 - 主组件\n * Test Yourself Game - Main Component\n */\n\n'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport type { TestYourselfProps, TestResult, TestStatus, DeviceFingerprint, TestConfig } from '../types';\nimport { \n getDeviceFingerprint, \n tryGetIPAddress, \n generateDeviceHash, \n selectResultIndex \n} from '../utils/fingerprint';\nimport { DEFAULT_RESULTS } from '../data/defaultResults';\n\nconst STORAGE_KEY = 'test-yourself-result';\n\nexport const TestYourself: React.FC<TestYourselfProps> = ({\n config: propConfig,\n configId,\n onResult,\n className = '',\n}) => {\n const [loadedConfig, setLoadedConfig] = useState<TestConfig | null>(null);\n const [configLoading, setConfigLoading] = useState(false);\n\n // 加载配置(如果提供了 configId)\n useEffect(() => {\n const loadConfig = async () => {\n if (configId) {\n setConfigLoading(true);\n try {\n // 动态导入 ConfigService\n const { getDefaultConfigService } = await import('../server/ConfigService');\n const service = getDefaultConfigService();\n const savedConfig = await service.getConfig(configId);\n if (savedConfig) {\n setLoadedConfig(savedConfig.config);\n } else {\n console.warn('配置 ' + (configId) + ' 不存在,使用默认配置');\n }\n } catch (error) {\n console.error('加载配置失败:', error);\n } finally {\n setConfigLoading(false);\n }\n }\n };\n\n loadConfig();\n }, [configId]);\n\n // 使用加载的配置或属性传入的配置\n const config = loadedConfig || propConfig || {\n gameTitle: '测测你是什么',\n gameDescription: '长按按钮,发现你的专属属性',\n results: DEFAULT_RESULTS,\n };\n\n const {\n gameTitle,\n gameDescription,\n buttonText = '长按开始测试',\n longPressDuration = 2000,\n results = DEFAULT_RESULTS,\n enableIPFetch = false,\n customSalt,\n resultStyle = 'card',\n } = config;\n\n const [status, setStatus] = useState<TestStatus>('idle');\n const [result, setResult] = useState<TestResult | null>(null);\n const [pressProgress, setPressProgress] = useState(0);\n const [ipWarning, setIpWarning] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const pressTimerRef = useRef<NodeJS.Timeout | null>(null);\n const progressIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = useRef<number>(0);\n\n // 初始化:检查localStorage和获取IP\n useEffect(() => {\n const initializeTest = async () => {\n // 等待配置加载完成\n if (configLoading) {\n return;\n }\n\n // 使用不同的 storage key(如果有 configId)\n const storageKey = configId ? (STORAGE_KEY) + '_' + (configId) : STORAGE_KEY;\n \n // 检查localStorage中是否已有结果\n const savedResult = localStorage.getItem(storageKey);\n if (savedResult) {\n try {\n const parsed = JSON.parse(savedResult);\n setResult(parsed);\n setStatus('completed');\n setIsLoading(false);\n return;\n } catch (error) {\n console.error('解析保存的结果失败:', error);\n }\n }\n\n // 如果启用IP获取,尝试获取\n if (enableIPFetch) {\n const ip = await tryGetIPAddress();\n if (!ip) {\n setIpWarning('⚠️ 无法获取IP地址,将仅使用浏览器指纹生成结果');\n }\n }\n\n setIsLoading(false);\n };\n\n initializeTest();\n }, [enableIPFetch, configLoading, configId]);\n\n // 计算并保存结果\n const calculateResult = async (): Promise<TestResult> => {\n try {\n // 获取设备指纹\n const fingerprint: DeviceFingerprint = getDeviceFingerprint();\n\n // 如果启用IP,尝试获取\n if (enableIPFetch) {\n const ip = await tryGetIPAddress();\n if (ip) {\n fingerprint.ip = ip;\n }\n }\n\n // 使用实际结果数据(如果配置的results为空,使用默认数据)\n const actualResults = results.length > 0 ? results : DEFAULT_RESULTS;\n\n // 生成唯一哈希\n const hash = generateDeviceHash(fingerprint, customSalt);\n\n // 根据哈希选择结果\n const index = selectResultIndex(hash, actualResults.length);\n const selectedResult = actualResults[index];\n\n if (!selectedResult) {\n console.error('无法获取测试结果,index:', index, 'total:', actualResults.length);\n throw new Error('无法获取测试结果');\n }\n\n console.log('计算结果成功:', selectedResult);\n\n // 保存到localStorage(使用不同的 key)\n const storageKey = configId ? (STORAGE_KEY) + '_' + (configId) : STORAGE_KEY;\n localStorage.setItem(storageKey, JSON.stringify(selectedResult));\n\n return selectedResult;\n } catch (error) {\n console.error('计算结果失败:', error);\n throw error;\n }\n };\n\n // 处理按下\n const handlePressStart = (e: React.MouseEvent | React.TouchEvent) => {\n if (status !== 'idle') return;\n\n // 阻止默认行为(防止移动端长按出现选择菜单)\n e.preventDefault();\n\n setStatus('pressing');\n startTimeRef.current = Date.now();\n\n // 设置进度更新\n progressIntervalRef.current = setInterval(() => {\n const elapsed = Date.now() - startTimeRef.current;\n const progress = Math.min((elapsed / longPressDuration) * 100, 100);\n setPressProgress(progress);\n }, 16); // ~60fps\n\n // 设置完成定时器\n pressTimerRef.current = setTimeout(async () => {\n try {\n setPressProgress(100);\n \n // 清理进度定时器\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n \n console.log('开始计算结果...');\n \n // 计算结果\n const testResult = await calculateResult();\n \n console.log('结果计算完成,更新状态:', testResult);\n \n // 先更新结果,再更新状态\n setResult(testResult);\n \n // 使用setTimeout确保状态更新\n setTimeout(() => {\n setStatus('completed');\n console.log('状态已更新为 completed');\n }, 0);\n\n // 调用回调\n if (onResult) {\n onResult(testResult);\n }\n } catch (error) {\n console.error('测试失败:', error);\n // 重置状态\n setStatus('idle');\n setPressProgress(0);\n alert('测试失败,请重试');\n }\n }, longPressDuration);\n\n // 添加全局监听器(用于PC端)\n if ('button' in e && e.button === 0) {\n // 鼠标事件\n const handleGlobalMouseUp = () => {\n handlePressEnd();\n document.removeEventListener('mouseup', handleGlobalMouseUp);\n };\n document.addEventListener('mouseup', handleGlobalMouseUp);\n }\n };\n\n // 处理松开\n const handlePressEnd = () => {\n if (status !== 'pressing') return;\n\n // 清理定时器\n if (pressTimerRef.current) {\n clearTimeout(pressTimerRef.current);\n pressTimerRef.current = null;\n }\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n\n // 重置状态\n setStatus('idle');\n setPressProgress(0);\n };\n\n // 处理鼠标离开(仅用于提示,不取消长按)\n const handleMouseLeave = (e: React.MouseEvent) => {\n // PC端:不取消长按,让用户可以移出按钮区域\n // 只要保持鼠标按下就继续\n };\n\n // 处理触摸移动(移动端)\n const handleTouchMove = (e: React.TouchEvent) => {\n // 检查手指是否移出按钮区域\n const touch = e.touches[0];\n if (!touch) return;\n \n const target = e.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n \n const isInside = \n touch.clientX >= rect.left &&\n touch.clientX <= rect.right &&\n touch.clientY >= rect.top &&\n touch.clientY <= rect.bottom;\n \n // 如果移出按钮,取消长按(移动端才取消)\n if (!isInside && status === 'pressing') {\n handlePressEnd();\n }\n };\n\n // 清理\n useEffect(() => {\n return () => {\n if (pressTimerRef.current) {\n clearTimeout(pressTimerRef.current);\n }\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n }\n };\n }, []);\n\n // 重新测试\n const handleReset = () => {\n const storageKey = configId ? (STORAGE_KEY) + '_' + (configId) : STORAGE_KEY;\n localStorage.removeItem(storageKey);\n setResult(null);\n setStatus('idle');\n setPressProgress(0);\n };\n\n // 背景容器样式\n const backgroundStyle: React.CSSProperties = {\n position: 'relative',\n minHeight: '100vh',\n overflow: 'hidden',\n background: 'linear-gradient(135deg, #f3e8ff 0%, #fce7f3 50%, #dbeafe 100%)',\n };\n\n // 装饰性光晕\n const DecorativeBackground = () => (\n <>\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(192, 132, 252, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n }} />\n <div style={{\n position: 'absolute',\n top: '50%',\n right: 0,\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(244, 114, 182, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translateX(50%)',\n pointerEvents: 'none',\n }} />\n <div style={{\n position: 'absolute',\n bottom: 0,\n left: '50%',\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(147, 197, 253, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translate(-50%, 50%)',\n pointerEvents: 'none',\n }} />\n </>\n );\n\n if (isLoading) {\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{\n position: 'relative',\n width: '64px',\n height: '64px',\n margin: '0 auto 16px',\n }}>\n <div style={{\n position: 'absolute',\n inset: 0,\n border: '4px solid #e9d5ff',\n borderRadius: '50%',\n }} />\n <div style={{\n position: 'absolute',\n inset: 0,\n border: '4px solid transparent',\n borderTopColor: '#a855f7',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }} />\n </div>\n <p style={{ fontSize: '14px', color: '#6b7280' }}>✨ 加载中</p>\n </div>\n </div>\n </div>\n );\n }\n\n // 结果展示\n if (status === 'completed' && result) {\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px',\n }}>\n <div style={{ maxWidth: '420px', width: '100%' }}>\n {/* 结果卡片 - 可爱风格 */}\n <div style={{\n position: 'relative',\n background: 'linear-gradient(135deg, #fdf2f8 0%, #faf5ff 50%, #eff6ff 100%)',\n borderRadius: '32px',\n boxShadow: '0 25px 50px -12px rgba(168, 85, 247, 0.25), 0 0 0 1px rgba(168, 85, 247, 0.1)',\n overflow: 'hidden',\n padding: '40px 32px',\n textAlign: 'center',\n }}>\n {/* 装饰性星星 */}\n <div style={{ position: 'absolute', top: '20px', left: '20px', fontSize: '24px', opacity: 0.6 }}>✨</div>\n <div style={{ position: 'absolute', top: '40px', right: '30px', fontSize: '20px', opacity: 0.5 }}>⭐</div>\n <div style={{ position: 'absolute', bottom: '30px', left: '40px', fontSize: '18px', opacity: 0.4 }}>💫</div>\n <div style={{ position: 'absolute', bottom: '50px', right: '25px', fontSize: '22px', opacity: 0.5 }}>🌟</div>\n \n {/* Emoji 展示 */}\n <div style={{ marginBottom: '24px' }}>\n <div style={{ \n display: 'inline-block',\n fontSize: '80px',\n animation: 'bounce-slow 2s ease-in-out infinite',\n filter: 'drop-shadow(0 10px 20px rgba(0,0,0,0.1))',\n }}>\n {result.imageType === 'emoji' ? result.image : '🎉'}\n </div>\n </div>\n\n {/* 标题 */}\n <h2 style={{\n fontSize: '32px',\n fontWeight: 800,\n background: 'linear-gradient(135deg, #9333ea 0%, #ec4899 100%)',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n marginBottom: '16px',\n lineHeight: 1.3,\n }}>\n {result.title}\n </h2>\n\n {/* 描述卡片 */}\n <div style={{\n background: 'rgba(255, 255, 255, 0.8)',\n borderRadius: '20px',\n padding: '20px 24px',\n marginBottom: '28px',\n boxShadow: '0 4px 15px rgba(168, 85, 247, 0.1)',\n border: '2px dashed rgba(168, 85, 247, 0.2)',\n }}>\n <p style={{\n fontSize: '16px',\n color: '#6b7280',\n lineHeight: 1.7,\n margin: 0,\n }}>\n {result.description}\n </p>\n </div>\n\n {/* 可爱装饰线 */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n marginBottom: '24px',\n }}>\n <span style={{ width: '40px', height: '3px', background: 'linear-gradient(to right, #a855f7, transparent)', borderRadius: '999px' }}></span>\n <span style={{ fontSize: '16px' }}>💕</span>\n <span style={{ width: '40px', height: '3px', background: 'linear-gradient(to left, #ec4899, transparent)', borderRadius: '999px' }}></span>\n </div>\n\n {/* 重新测试按钮 */}\n <button\n onClick={handleReset}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '14px 32px',\n fontSize: '16px',\n fontWeight: 600,\n color: 'white',\n background: 'linear-gradient(135deg, #a855f7 0%, #ec4899 100%)',\n border: 'none',\n borderRadius: '9999px',\n cursor: 'pointer',\n boxShadow: '0 10px 25px -5px rgba(168, 85, 247, 0.4)',\n transition: 'all 0.3s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05) translateY(-2px)';\n e.currentTarget.style.boxShadow = '0 15px 35px -5px rgba(168, 85, 247, 0.5)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1) translateY(0)';\n e.currentTarget.style.boxShadow = '0 10px 25px -5px rgba(168, 85, 247, 0.4)';\n }}\n >\n <span>🔄</span>\n <span>重新测试</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // 测试界面 - 时尚可爱设计\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n }}>\n <div style={{ maxWidth: '512px', width: '100%', textAlign: 'center', userSelect: 'none' }}>\n {/* 标题区域 */}\n <div style={{ marginBottom: '48px' }}>\n <div style={{ \n display: 'inline-block', \n marginBottom: '16px',\n animation: 'bounce-slow 2s ease-in-out infinite',\n }}>\n <span style={{ fontSize: '56px' }}>🎲</span>\n </div>\n <h1 style={{\n fontSize: '48px',\n fontWeight: 900,\n marginBottom: '12px',\n background: 'linear-gradient(135deg, #9333ea 0%, #ec4899 50%, #3b82f6 100%)',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n lineHeight: 1.2,\n }}>\n {gameTitle}\n </h1>\n {gameDescription && (\n <p style={{ \n fontSize: '18px', \n color: '#6b7280', \n fontWeight: 500,\n }}>\n {gameDescription}\n </p>\n )}\n </div>\n\n {/* 长按按钮区域 */}\n <div style={{ marginBottom: '24px' }}>\n {/* 主按钮 */}\n <button\n onMouseDown={handlePressStart}\n onMouseLeave={handleMouseLeave}\n onTouchStart={handlePressStart}\n onTouchEnd={handlePressEnd}\n onTouchMove={handleTouchMove}\n onTouchCancel={handlePressEnd}\n onContextMenu={(e) => e.preventDefault()}\n onDragStart={(e) => e.preventDefault()}\n style={{\n display: 'block',\n margin: '0 auto',\n width: '200px',\n height: '200px',\n borderRadius: '50%',\n border: 'none',\n fontSize: '20px',\n fontWeight: 'bold',\n cursor: 'pointer',\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n WebkitTouchCallout: 'none',\n WebkitUserSelect: 'none',\n touchAction: 'none',\n transition: 'transform 0.3s ease',\n transform: status === 'pressing' ? 'scale(0.95)' : 'scale(1)',\n background: status === 'pressing' \n ? 'linear-gradient(to top, rgb(168, 85, 247) ' + (pressProgress) + '%, rgb(236, 72, 153) ' + (pressProgress) + '%)'\n : 'linear-gradient(135deg, #4f46e5 0%, #7c3aed 25%, #db2777 50%, #f97316 75%, #059669 100%)',\n boxShadow: status === 'pressing' \n ? 'inset 0 4px 12px rgba(0,0,0,0.3), 0 0 0 4px rgba(168, 85, 247, 0.5)'\n : '0 15px 35px -10px rgba(79, 70, 229, 0.6), 0 0 0 4px rgba(255,255,255,0.8)',\n }}\n >\n {/* 按钮内容 */}\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n pointerEvents: 'none',\n }}>\n {status === 'pressing' ? (\n <>\n <span style={{ fontSize: '36px', fontWeight: 900, marginBottom: '4px' }}>{Math.round(pressProgress)}%</span>\n <span style={{ fontSize: '14px', opacity: 0.8 }}>继续按住</span>\n </>\n ) : (\n <>\n <span style={{ fontSize: '32px', marginBottom: '8px' }}>👆</span>\n <span style={{ fontSize: '16px', fontWeight: 'bold', padding: '0 16px' }}>{buttonText}</span>\n </>\n )}\n </div>\n\n {/* 内部装饰圆环 */}\n {status === 'idle' && (\n <div style={{\n position: 'absolute',\n top: '16px',\n left: '16px',\n right: '16px',\n bottom: '16px',\n border: '2px solid rgba(255,255,255,0.3)',\n borderRadius: '50%',\n }}></div>\n )}\n </button>\n\n {/* 进度条 */}\n {status === 'pressing' && (\n <div style={{\n marginTop: '16px',\n marginLeft: 'auto',\n marginRight: 'auto',\n width: '192px',\n height: '8px',\n backgroundColor: '#e5e7eb',\n borderRadius: '9999px',\n overflow: 'hidden',\n }}>\n <div style={{\n height: '100%',\n width: (pressProgress) + '%',\n background: 'linear-gradient(to right, #a855f7, #ec4899)',\n transition: 'width 0.1s ease',\n }} />\n </div>\n )}\n </div>\n\n {/* 底部提示 - 简洁可爱 */}\n <div style={{ marginTop: '24px' }}>\n {status === 'pressing' ? (\n <p style={{ \n fontSize: '18px', \n fontWeight: 500, \n color: '#9333ea',\n animation: 'pulse 2s ease-in-out infinite',\n }}>\n ✨ 正在分析中...\n </p>\n ) : (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'center', \n gap: '8px',\n }}>\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#a855f7', \n borderRadius: '50%',\n animation: 'bounce 1s infinite',\n }} />\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#ec4899', \n borderRadius: '50%',\n animation: 'bounce 1s infinite 0.1s',\n }} />\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#3b82f6', \n borderRadius: '50%',\n animation: 'bounce 1s infinite 0.2s',\n }} />\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// 添加CSS样式来支持触摸优化和动画\nconst touchOptimizationStyles = `\n @keyframes bounce-slow {\n 0%, 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-10px);\n }\n }\n \n @keyframes bounce {\n 0%, 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-4px);\n }\n }\n \n @keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n \n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n`;\n\n// 注入样式\nif (typeof document !== 'undefined' && !document.getElementById('test-yourself-styles')) {\n const style = document.createElement('style');\n style.id = 'test-yourself-styles';\n style.textContent = touchOptimizationStyles;\n document.head.appendChild(style);\n};\n\nexport default TestYourself;\n\n\n","/**\n * 测测你是什么 - 配置管理后台组件\n * Test Yourself - Configuration Manager Component\n * \n * 支持创建、编辑、管理多套测试配置\n */\n\n'use client';\n\nimport React, { useState, useCallback, useEffect } from 'react';\nimport { clsx } from 'clsx';\nimport {\n Plus,\n Trash2,\n Edit,\n Save,\n X,\n Upload as UploadIcon,\n Download,\n Copy,\n Star,\n Image as ImageIcon,\n AlertCircle,\n CheckCircle2,\n} from 'lucide-react';\n\nimport type { SavedConfig, TestConfig, TestResult } from '../types';\nimport { ConfigService } from '../server/ConfigService';\nimport { DEFAULT_RESULTS } from '../data/defaultResults';\n\nexport interface ConfigManagerProps {\n /** 配置服务实例 */\n configService: ConfigService;\n /** 配置变化回调 */\n onConfigChange?: (configs: SavedConfig[]) => void;\n /** 自定义样式 */\n className?: string;\n /** 图片上传处理函数 */\n onImageUpload?: (file: File) => Promise<string>;\n}\n\ninterface EditingResult extends TestResult {\n _tempId?: string;\n}\n\n/**\n * 配置管理器组件\n */\nexport const ConfigManager: React.FC<ConfigManagerProps> = ({\n configService,\n onConfigChange,\n className = '',\n onImageUpload,\n}) => {\n const [configs, setConfigs] = useState<SavedConfig[]>([]);\n const [selectedConfig, setSelectedConfig] = useState<SavedConfig | null>(null);\n const [isEditing, setIsEditing] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // 编辑表单状态\n const [editForm, setEditForm] = useState({\n name: '',\n description: '',\n gameTitle: '',\n gameDescription: '',\n buttonText: '长按开始测试',\n longPressDuration: 2000,\n results: [] as EditingResult[],\n });\n\n // 加载配置列表\n const loadConfigs = useCallback(async () => {\n try {\n setLoading(true);\n const allConfigs = await configService.getAllConfigs();\n setConfigs(allConfigs);\n onConfigChange?.(allConfigs);\n } catch (err: any) {\n setError('加载配置失败: ' + (err.message));\n } finally {\n setLoading(false);\n }\n }, [configService, onConfigChange]);\n\n useEffect(() => {\n loadConfigs();\n }, [loadConfigs]);\n\n // 开始创建新配置\n const handleStartCreate = () => {\n setEditForm({\n name: '新配置',\n description: '',\n gameTitle: '测测你是什么',\n gameDescription: '长按按钮,发现你的专属属性',\n buttonText: '长按开始测试',\n longPressDuration: 2000,\n results: [],\n });\n setIsCreating(true);\n setIsEditing(true);\n setSelectedConfig(null);\n };\n\n // 开始编辑配置\n const handleStartEdit = (config: SavedConfig) => {\n setEditForm({\n name: config.name,\n description: config.description || '',\n gameTitle: config.config.gameTitle,\n gameDescription: config.config.gameDescription || '',\n buttonText: config.config.buttonText || '长按开始测试',\n longPressDuration: config.config.longPressDuration || 2000,\n results: config.config.results,\n });\n setIsCreating(false);\n setIsEditing(true);\n setSelectedConfig(config);\n };\n\n // 取消编辑\n const handleCancelEdit = () => {\n setIsEditing(false);\n setIsCreating(false);\n setSelectedConfig(null);\n setError(null);\n };\n\n // 保存配置\n const handleSave = async () => {\n try {\n setError(null);\n\n // 验证\n if (!editForm.name.trim()) {\n setError('请输入配置名称');\n return;\n }\n if (!editForm.gameTitle.trim()) {\n setError('请输入游戏标题');\n return;\n }\n if (editForm.results.length === 0) {\n setError('请至少添加一个结果项');\n return;\n }\n\n const testConfig: TestConfig = {\n gameTitle: editForm.gameTitle,\n gameDescription: editForm.gameDescription,\n buttonText: editForm.buttonText,\n longPressDuration: editForm.longPressDuration,\n results: editForm.results,\n };\n\n if (isCreating) {\n await configService.createConfig(\n editForm.name,\n testConfig,\n editForm.description\n );\n setSuccess('创建配置成功!');\n } else if (selectedConfig) {\n await configService.updateConfig(selectedConfig.id, {\n name: editForm.name,\n description: editForm.description,\n config: testConfig,\n });\n setSuccess('更新配置成功!');\n }\n\n await loadConfigs();\n handleCancelEdit();\n\n // 3秒后清除成功提示\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError('保存失败: ' + (err.message));\n }\n };\n\n // 删除配置\n const handleDelete = async (id: string) => {\n if (!confirm('确定要删除这个配置吗?')) return;\n\n try {\n await configService.deleteConfig(id);\n await loadConfigs();\n setSuccess('删除成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError('删除失败: ' + (err.message));\n }\n };\n\n // 复制配置\n const handleDuplicate = async (id: string) => {\n try {\n await configService.duplicateConfig(id);\n await loadConfigs();\n setSuccess('复制成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError('复制失败: ' + (err.message));\n }\n };\n\n // 设置默认配置\n const handleSetDefault = async (id: string) => {\n try {\n await configService.setDefaultConfig(id);\n await loadConfigs();\n setSuccess('设置默认配置成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError('设置失败: ' + (err.message));\n }\n };\n\n // 导出配置\n const handleExport = async (id: string) => {\n try {\n const jsonString = await configService.exportConfig(id);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'config_' + (id) + '.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n setSuccess('导出成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError('导出失败: ' + (err.message));\n }\n };\n\n // 导入配置\n const handleImport = async () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n await configService.importConfig(text);\n await loadConfigs();\n setSuccess('导入成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError('导入失败: ' + (err.message));\n }\n };\n input.click();\n };\n\n // 添加结果项\n const handleAddResult = () => {\n const newResult: EditingResult = {\n id: 'temp_' + (Date.now()),\n _tempId: 'temp_' + (Date.now()),\n title: '新结果',\n description: '这是一个新的结果描述',\n image: '🎉',\n imageType: 'emoji',\n };\n setEditForm({\n ...editForm,\n results: [...editForm.results, newResult],\n });\n };\n\n // 删除结果项\n const handleDeleteResult = (index: number) => {\n const newResults = [...editForm.results];\n newResults.splice(index, 1);\n setEditForm({ ...editForm, results: newResults });\n };\n\n // 更新结果项\n const handleUpdateResult = (index: number, updates: Partial<TestResult>) => {\n const newResults = [...editForm.results];\n newResults[index] = { ...newResults[index], ...updates } as EditingResult;\n setEditForm({ ...editForm, results: newResults });\n };\n\n // 图片上传处理\n const handleResultImageUpload = async (index: number, file: File) => {\n try {\n if (!onImageUpload) {\n // 如果没有提供上传函数,使用 Base64\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n handleUpdateResult(index, {\n image: base64,\n imageType: 'url',\n });\n };\n reader.readAsDataURL(file);\n } else {\n // 使用提供的上传函数\n const url = await onImageUpload(file);\n handleUpdateResult(index, {\n image: url,\n imageType: 'url',\n });\n }\n } catch (err: any) {\n setError('上传图片失败: ' + (err.message));\n }\n };\n\n // 使用默认结果\n const handleUseDefaultResults = () => {\n if (confirm('确定要使用默认的45个结果吗?这将替换当前的所有结果。')) {\n setEditForm({ ...editForm, results: DEFAULT_RESULTS });\n }\n };\n\n // 渲染配置列表\n const renderConfigList = () => (\n <div className=\"space-y-4\">\n {configs.map((config) => (\n <div\n key={config.id}\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-sm p-4 border border-gray-200 dark:border-gray-700 hover:shadow-md transition-shadow\"\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {config.name}\n </h3>\n {config.isDefault && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200\">\n <Star className=\"w-3 h-3\" />\n 默认\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-2\">\n {config.description}\n </p>\n )}\n <div className=\"flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400\">\n <span>结果数: {config.config.results.length}</span>\n <span>创建: {new Date(config.createdAt).toLocaleDateString()}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => handleSetDefault(config.id)}\n disabled={config.isDefault}\n className=\"p-2 text-gray-600 hover:text-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"设为默认\"\n >\n <Star className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleStartEdit(config)}\n className=\"p-2 text-gray-600 hover:text-blue-600\"\n title=\"编辑\"\n >\n <Edit className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleDuplicate(config.id)}\n className=\"p-2 text-gray-600 hover:text-green-600\"\n title=\"复制\"\n >\n <Copy className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleExport(config.id)}\n className=\"p-2 text-gray-600 hover:text-purple-600\"\n title=\"导出\"\n >\n <Download className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleDelete(config.id)}\n className=\"p-2 text-gray-600 hover:text-red-600\"\n title=\"删除\"\n >\n <Trash2 className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n );\n\n // 渲染结果编辑器\n const renderResultEditor = (result: EditingResult, index: number) => (\n <div\n key={result._tempId || result.id}\n className=\"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 space-y-3\"\n >\n <div className=\"flex items-start justify-between\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n 结果 #{index + 1}\n </h4>\n <button\n onClick={() => handleDeleteResult(index)}\n className=\"text-red-600 hover:text-red-700\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {/* 标题 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 标题\n </label>\n <input\n type=\"text\"\n value={result.title}\n onChange={(e) => handleUpdateResult(index, { title: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: 可爱的猫咪\"\n />\n </div>\n\n {/* 图片/Emoji */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 图片/Emoji\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={result.image}\n onChange={(e) => handleUpdateResult(index, { image: e.target.value })}\n className=\"flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"🎉 或 URL\"\n />\n <label className=\"cursor-pointer inline-flex items-center justify-center px-3 py-2 bg-blue-50 dark:bg-blue-900 text-blue-600 dark:text-blue-200 rounded-lg hover:bg-blue-100 dark:hover:bg-blue-800\">\n <ImageIcon className=\"w-5 h-5\" />\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleResultImageUpload(index, file);\n }}\n />\n </label>\n </div>\n </div>\n </div>\n\n {/* 描述 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 描述\n </label>\n <textarea\n value={result.description}\n onChange={(e) => handleUpdateResult(index, { description: e.target.value })}\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"这个结果的详细描述...\"\n />\n </div>\n\n {/* 预览 */}\n {result.image && (\n <div className=\"flex items-center gap-2 p-2 bg-white dark:bg-gray-600 rounded border border-gray-200 dark:border-gray-500\">\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">预览:</span>\n {result.imageType === 'emoji' ? (\n <span className=\"text-2xl\">{result.image}</span>\n ) : (\n <img src={result.image} alt={result.title} className=\"w-8 h-8 object-cover rounded\" />\n )}\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {result.title}\n </span>\n </div>\n )}\n </div>\n );\n\n // 渲染编辑表单\n const renderEditForm = () => (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {isCreating ? '创建新配置' : '编辑配置'}\n </h2>\n <button\n onClick={handleCancelEdit}\n className=\"p-2 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200\"\n >\n <X className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* 基本信息 */}\n <div className=\"space-y-4 bg-white dark:bg-gray-800 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-gray-700\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n 基本信息\n </h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 配置名称 *\n </label>\n <input\n type=\"text\"\n value={editForm.name}\n onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 动物主题测试\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 游戏标题 *\n </label>\n <input\n type=\"text\"\n value={editForm.gameTitle}\n onChange={(e) => setEditForm({ ...editForm, gameTitle: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 测测你是什么动物\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 配置描述\n </label>\n <textarea\n value={editForm.description}\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"简要描述这个配置的用途...\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 游戏描述\n </label>\n <input\n type=\"text\"\n value={editForm.gameDescription}\n onChange={(e) => setEditForm({ ...editForm, gameDescription: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 长按按钮,发现你的专属属性\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 按钮文本\n </label>\n <input\n type=\"text\"\n value={editForm.buttonText}\n onChange={(e) => setEditForm({ ...editForm, buttonText: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 长按时间 (毫秒)\n </label>\n <input\n type=\"number\"\n value={editForm.longPressDuration}\n onChange={(e) =>\n setEditForm({ ...editForm, longPressDuration: parseInt(e.target.value) || 2000 })\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n min=\"500\"\n step=\"100\"\n />\n </div>\n </div>\n </div>\n\n {/* 结果列表 */}\n <div className=\"bg-white dark:bg-gray-800 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n 结果列表 ({editForm.results.length})\n </h3>\n <div className=\"flex gap-2\">\n <button\n onClick={handleUseDefaultResults}\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-purple-50 dark:bg-purple-900 text-purple-600 dark:text-purple-200 rounded-lg hover:bg-purple-100 dark:hover:bg-purple-800\"\n >\n 使用默认结果\n </button>\n <button\n onClick={handleAddResult}\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-blue-50 dark:bg-blue-900 text-blue-600 dark:text-blue-200 rounded-lg hover:bg-blue-100 dark:hover:bg-blue-800\"\n >\n <Plus className=\"w-4 h-4\" />\n 添加结果\n </button>\n </div>\n </div>\n\n <div className=\"space-y-3 max-h-[500px] overflow-y-auto\">\n {editForm.results.length === 0 ? (\n <div className=\"text-center py-8 text-gray-500 dark:text-gray-400\">\n <p>还没有添加任何结果</p>\n <p className=\"text-sm mt-2\">点击\"添加结果\"或\"使用默认结果\"开始</p>\n </div>\n ) : (\n editForm.results.map((result, index) => renderResultEditor(result, index))\n )}\n </div>\n </div>\n\n {/* 操作按钮 */}\n <div className=\"flex items-center justify-end gap-3\">\n <button\n onClick={handleCancelEdit}\n className=\"px-6 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 取消\n </button>\n <button\n onClick={handleSave}\n className=\"inline-flex items-center gap-2 px-6 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Save className=\"w-5 h-5\" />\n 保存配置\n </button>\n </div>\n </div>\n );\n\n if (loading) {\n return (\n <div className={clsx('p-8', className)}>\n <div className=\"text-center\">\n <div className=\"inline-block w-8 h-8 border-4 border-blue-600 border-t-transparent rounded-full animate-spin\"></div>\n <p className=\"mt-2 text-gray-600 dark:text-gray-400\">加载中...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={clsx('p-6', className)}>\n {/* 消息提示 */}\n {error && (\n <div className=\"mb-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg flex items-center gap-2 text-red-800 dark:text-red-200\">\n <AlertCircle className=\"w-5 h-5 flex-shrink-0\" />\n <span>{error}</span>\n <button onClick={() => setError(null)} className=\"ml-auto\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n )}\n\n {success && (\n <div className=\"mb-4 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg flex items-center gap-2 text-green-800 dark:text-green-200\">\n <CheckCircle2 className=\"w-5 h-5 flex-shrink-0\" />\n <span>{success}</span>\n <button onClick={() => setSuccess(null)} className=\"ml-auto\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n )}\n\n {isEditing ? (\n renderEditForm()\n ) : (\n <>\n {/* 头部操作栏 */}\n <div className=\"flex items-center justify-between mb-6\">\n <h1 className=\"text-3xl font-bold text-gray-900 dark:text-white\">配置管理</h1>\n <div className=\"flex gap-2\">\n <button\n onClick={handleImport}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n <UploadIcon className=\"w-5 h-5\" />\n 导入\n </button>\n <button\n onClick={handleStartCreate}\n className=\"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Plus className=\"w-5 h-5\" />\n 创建配置\n </button>\n </div>\n </div>\n\n {/* 配置列表 */}\n {configs.length === 0 ? (\n <div className=\"text-center py-12 bg-white dark:bg-gray-800 rounded-lg border-2 border-dashed border-gray-300 dark:border-gray-700\">\n <p className=\"text-gray-600 dark:text-gray-400 mb-4\">还没有任何配置</p>\n <button\n onClick={handleStartCreate}\n className=\"inline-flex items-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Plus className=\"w-5 h-5\" />\n 创建第一个配置\n </button>\n </div>\n ) : (\n renderConfigList()\n )}\n </>\n )}\n </div>\n );\n};\n\nexport default ConfigManager;\n\n\n\n\n\n\n\n\n\n\n","/**\n * 测测你是什么 - 配置列表组件\n * Test Yourself - Configuration List Component\n * \n * 用于展示和选择配置\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport {\n Eye,\n Edit,\n Trash2,\n Copy,\n Star,\n Download,\n RefreshCw,\n ExternalLink,\n} from 'lucide-react';\n\nimport type { ConfigListItem } from '../types';\nimport { ConfigService } from '../server/ConfigService';\n\nexport interface ConfigListProps {\n /** 配置服务实例 */\n configService: ConfigService;\n /** 选择配置回调 */\n onSelect?: (id: string) => void;\n /** 编辑配置回调 */\n onEdit?: (id: string) => void;\n /** 删除配置回调 */\n onDelete?: (id: string) => void;\n /** 是否显示操作按钮 */\n showActions?: boolean;\n /** 是否显示预览链接 */\n showPreviewLink?: boolean;\n /** 预览基础URL */\n previewBaseUrl?: string;\n /** 自定义样式 */\n className?: string;\n /** 每页显示数量 */\n pageSize?: number;\n}\n\n/**\n * 配置列表组件\n */\nexport const ConfigList: React.FC<ConfigListProps> = ({\n configService,\n onSelect,\n onEdit,\n onDelete,\n showActions = true,\n showPreviewLink = false,\n previewBaseUrl = '/test-yourself',\n className = '',\n pageSize = 10,\n}) => {\n const [configs, setConfigs] = useState<ConfigListItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [currentPage, setCurrentPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState('');\n\n // 加载配置列表\n const loadConfigs = useCallback(async () => {\n try {\n setLoading(true);\n const list = await configService.getConfigList();\n setConfigs(list);\n } catch (error) {\n console.error('加载配置列表失败:', error);\n } finally {\n setLoading(false);\n }\n }, [configService]);\n\n useEffect(() => {\n loadConfigs();\n }, [loadConfigs]);\n\n // 处理刷新\n const handleRefresh = () => {\n loadConfigs();\n };\n\n // 处理选择\n const handleSelect = (id: string) => {\n onSelect?.(id);\n };\n\n // 处理编辑\n const handleEdit = (id: string) => {\n onEdit?.(id);\n };\n\n // 处理删除\n const handleDelete = async (id: string) => {\n if (!confirm('确定要删除这个配置吗?')) return;\n \n try {\n await configService.deleteConfig(id);\n await loadConfigs();\n onDelete?.(id);\n } catch (error) {\n console.error('删除配置失败:', error);\n alert('删除失败,请重试');\n }\n };\n\n // 处理复制\n const handleDuplicate = async (id: string) => {\n try {\n await configService.duplicateConfig(id);\n await loadConfigs();\n } catch (error) {\n console.error('复制配置失败:', error);\n alert('复制失败,请重试');\n }\n };\n\n // 处理设置默认\n const handleSetDefault = async (id: string) => {\n try {\n await configService.setDefaultConfig(id);\n await loadConfigs();\n } catch (error) {\n console.error('设置默认配置失败:', error);\n alert('设置失败,请重试');\n }\n };\n\n // 处理导出\n const handleExport = async (id: string) => {\n try {\n const jsonString = await configService.exportConfig(id);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'config_' + (id) + '.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error('导出配置失败:', error);\n alert('导出失败,请重试');\n }\n };\n\n // 生成预览链接\n const getPreviewUrl = (id: string) => {\n return (previewBaseUrl) + '?configId=' + (id);\n };\n\n // 过滤配置\n const filteredConfigs = configs.filter(config => {\n if (!searchTerm) return true;\n const term = searchTerm.toLowerCase();\n return (\n config.name.toLowerCase().includes(term) ||\n config.description?.toLowerCase().includes(term)\n );\n });\n\n // 分页\n const totalPages = Math.ceil(filteredConfigs.length / pageSize);\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n const currentConfigs = filteredConfigs.slice(startIndex, endIndex);\n\n if (loading) {\n return (\n <div className={clsx('p-8', className)}>\n <div className=\"text-center\">\n <div className=\"inline-block w-8 h-8 border-4 border-blue-600 border-t-transparent rounded-full animate-spin\"></div>\n <p className=\"mt-2 text-gray-600 dark:text-gray-400\">加载中...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={className}>\n {/* 头部 */}\n <div className=\"mb-4 flex items-center justify-between gap-4\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n placeholder=\"搜索配置...\"\n value={searchTerm}\n onChange={(e) => {\n setSearchTerm(e.target.value);\n setCurrentPage(1);\n }}\n className=\"w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n />\n </div>\n <button\n onClick={handleRefresh}\n className=\"p-2 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200\"\n title=\"刷新\"\n >\n <RefreshCw className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* 配置列表 */}\n {currentConfigs.length === 0 ? (\n <div className=\"text-center py-12 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700\">\n <p className=\"text-gray-600 dark:text-gray-400\">\n {searchTerm ? '没有找到匹配的配置' : '还没有任何配置'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {currentConfigs.map((config) => (\n <div\n key={config.id}\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-sm p-4 border border-gray-200 dark:border-gray-700 hover:shadow-md transition-shadow\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n {/* 配置信息 */}\n <div\n className=\"flex-1 cursor-pointer\"\n onClick={() => handleSelect(config.id)}\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {config.name}\n </h3>\n {config.isDefault && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200\">\n <Star className=\"w-3 h-3\" />\n 默认\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-2\">\n {config.description}\n </p>\n )}\n <div className=\"flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400\">\n <span>结果数: {config.resultCount}</span>\n <span>创建: {new Date(config.createdAt).toLocaleDateString()}</span>\n {config.updatedAt !== config.createdAt && (\n <span>更新: {new Date(config.updatedAt).toLocaleDateString()}</span>\n )}\n </div>\n </div>\n\n {/* 操作按钮 */}\n {showActions && (\n <div className=\"flex items-center gap-1\">\n {showPreviewLink && (\n <a\n href={getPreviewUrl(config.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 text-gray-600 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400\"\n title=\"预览\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </a>\n )}\n <button\n onClick={() => handleSetDefault(config.id)}\n disabled={config.isDefault}\n className=\"p-2 text-gray-600 hover:text-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"设为默认\"\n >\n <Star className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleEdit(config.id)}\n className=\"p-2 text-gray-600 hover:text-blue-600\"\n title=\"编辑\"\n >\n <Edit className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDuplicate(config.id)}\n className=\"p-2 text-gray-600 hover:text-green-600\"\n title=\"复制\"\n >\n <Copy className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleExport(config.id)}\n className=\"p-2 text-gray-600 hover:text-purple-600\"\n title=\"导出\"\n >\n <Download className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDelete(config.id)}\n className=\"p-2 text-gray-600 hover:text-red-600\"\n title=\"删除\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 分页 */}\n {totalPages > 1 && (\n <div className=\"mt-4 flex items-center justify-between\">\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\n 显示 {startIndex + 1} - {Math.min(endIndex, filteredConfigs.length)} 共{' '}\n {filteredConfigs.length} 个配置\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n className=\"px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 上一页\n </button>\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">\n {currentPage} / {totalPages}\n </span>\n <button\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n disabled={currentPage === totalPages}\n className=\"px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 下一页\n </button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ConfigList;\n\n\n\n\n\n\n\n\n\n","/**\n * 测测你是什么 - 服务端逻辑入口\n * Test Yourself - Server Logic Entry\n */\n\n// ========== 配置服务 ==========\nexport {\n ConfigService,\n createConfigService,\n getDefaultConfigService,\n} from './ConfigService';\n\nexport type {\n ConfigServiceOptions,\n IConfigStorage,\n} from './ConfigService';\n\n// ========== 数据库适配器 ==========\nexport {\n DatabaseConfigAdapter,\n createDatabaseConfigAdapter,\n} from './DatabaseConfigAdapter';\n\nexport type {\n DatabaseConfigAdapterOptions,\n DrizzleDb,\n} from './DatabaseConfigAdapter';\n\n// ========== 数据库 Schema ==========\nexport {\n testYourselfConfigs,\n testYourselfConfigUsage,\n testYourselfConfigShares,\n} from './drizzle-schema';\n\nexport type {\n TestYourselfConfig,\n NewTestYourselfConfig,\n TestYourselfConfigUsage,\n NewTestYourselfConfigUsage,\n TestYourselfConfigShare,\n NewTestYourselfConfigShare,\n} from './drizzle-schema';\n","/**\n * TestYourself 模块数据库表结构定义\n * Database Schema for TestYourself Module\n * \n * 使用 Drizzle ORM 定义配置表\n */\n\nimport {\n pgTable,\n uuid,\n varchar,\n text,\n timestamp,\n boolean,\n json,\n integer,\n index,\n} from 'drizzle-orm/pg-core';\nimport type { TestConfig } from '../types';\n\n/**\n * 测试配置表 (test_yourself_configs)\n * \n * 存储所有测试配置,支持多租户、版本控制等企业级功能\n */\nexport const testYourselfConfigs = pgTable(\n 'test_yourself_configs',\n {\n // ========== 主键 ==========\n /** 配置唯一ID */\n id: uuid('id').primaryKey().defaultRandom(),\n\n // ========== 基本信息 ==========\n /** 配置名称 */\n name: varchar('name', { length: 255 }).notNull(),\n \n /** 配置描述 */\n description: text('description'),\n \n /** 配置标签(用于分类和搜索) */\n tags: json('tags').$type<string[]>().default([]),\n\n // ========== 配置数据 ==========\n /** 测试配置内容(JSON格式) */\n config: json('config').$type<TestConfig>().notNull(),\n \n /** 结果数量(冗余字段,便于查询) */\n resultCount: integer('result_count').notNull().default(0),\n\n // ========== 状态字段 ==========\n /** 是否为默认配置 */\n isDefault: boolean('is_default').notNull().default(false),\n \n /** 是否已发布(草稿/发布) */\n isPublished: boolean('is_published').notNull().default(true),\n \n /** 是否已归档 */\n isArchived: boolean('is_archived').notNull().default(false),\n \n /** 是否已删除(软删除) */\n isDeleted: boolean('is_deleted').notNull().default(false),\n\n // ========== 权限和所有权 ==========\n /** 创建者ID */\n createdBy: varchar('created_by', { length: 255 }).notNull(),\n \n /** 最后更新者ID */\n updatedBy: varchar('updated_by', { length: 255 }),\n \n /** 所属组织/租户ID(多租户支持) */\n organizationId: varchar('organization_id', { length: 255 }),\n\n // ========== 统计信息 ==========\n /** 使用次数 */\n usageCount: integer('usage_count').notNull().default(0),\n \n /** 最后使用时间 */\n lastUsedAt: timestamp('last_used_at'),\n \n /** 浏览次数 */\n viewCount: integer('view_count').notNull().default(0),\n\n // ========== 版本控制 ==========\n /** 配置版本号 */\n version: integer('version').notNull().default(1),\n \n /** 父配置ID(用于版本追踪) */\n parentId: uuid('parent_id'),\n\n // ========== 自定义字段 ==========\n /** 自定义元数据(扩展字段) */\n metadata: json('metadata').$type<Record<string, any>>(),\n \n /** 配置来源(web/api/import) */\n source: varchar('source', { length: 50 }),\n\n // ========== 时间戳 ==========\n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n \n /** 发布时间 */\n publishedAt: timestamp('published_at'),\n \n /** 归档时间 */\n archivedAt: timestamp('archived_at'),\n \n /** 删除时间 */\n deletedAt: timestamp('deleted_at'),\n },\n (table) => ({\n // ========== 索引设计 ==========\n \n /** 名称搜索索引 */\n nameIndex: index('test_configs_name_idx').on(table.name),\n \n /** 创建者索引 */\n createdByIndex: index('test_configs_created_by_idx').on(table.createdBy),\n \n /** 组织索引(多租户) */\n organizationIndex: index('test_configs_organization_idx').on(table.organizationId),\n \n /** 默认配置索引 */\n isDefaultIndex: index('test_configs_is_default_idx').on(table.isDefault),\n \n /** 发布状态索引 */\n isPublishedIndex: index('test_configs_is_published_idx').on(table.isPublished),\n \n /** 删除状态索引 */\n isDeletedIndex: index('test_configs_is_deleted_idx').on(table.isDeleted),\n \n /** 创建时间索引 */\n createdAtIndex: index('test_configs_created_at_idx').on(table.createdAt),\n \n /** 最后使用时间索引 */\n lastUsedAtIndex: index('test_configs_last_used_at_idx').on(table.lastUsedAt),\n \n /** 组合索引:组织+删除状态+发布状态 */\n orgDeletedPublishedIndex: index('test_configs_org_deleted_published_idx').on(\n table.organizationId,\n table.isDeleted,\n table.isPublished\n ),\n \n /** 组合索引:创建者+删除状态 */\n createdByDeletedIndex: index('test_configs_created_by_deleted_idx').on(\n table.createdBy,\n table.isDeleted\n ),\n })\n);\n\n/**\n * 配置使用记录表 (test_yourself_config_usage)\n * \n * 记录配置的每次使用情况,用于统计分析\n */\nexport const testYourselfConfigUsage = pgTable(\n 'test_yourself_config_usage',\n {\n /** 记录ID */\n id: uuid('id').primaryKey().defaultRandom(),\n \n /** 配置ID */\n configId: uuid('config_id')\n .references(() => testYourselfConfigs.id, { onDelete: 'cascade' })\n .notNull(),\n \n /** 用户ID */\n userId: varchar('user_id', { length: 255 }),\n \n /** 设备指纹 */\n fingerprint: text('fingerprint'),\n \n /** 测试结果ID */\n resultId: varchar('result_id', { length: 255 }),\n \n /** IP地址 */\n ipAddress: varchar('ip_address', { length: 45 }),\n \n /** User Agent */\n userAgent: text('user_agent'),\n \n /** 来源页面 */\n referer: text('referer'),\n \n /** 使用时间 */\n usedAt: timestamp('used_at').defaultNow().notNull(),\n \n /** 完成时间(毫秒) */\n completionTime: integer('completion_time'),\n \n /** 额外数据 */\n metadata: json('metadata').$type<Record<string, any>>(),\n },\n (table) => ({\n /** 配置ID索引 */\n configIndex: index('test_usage_config_idx').on(table.configId),\n \n /** 用户ID索引 */\n userIndex: index('test_usage_user_idx').on(table.userId),\n \n /** 使用时间索引 */\n usedAtIndex: index('test_usage_used_at_idx').on(table.usedAt),\n \n /** 指纹索引 */\n fingerprintIndex: index('test_usage_fingerprint_idx').on(table.fingerprint),\n })\n);\n\n/**\n * 配置分享表 (test_yourself_config_shares)\n * \n * 管理配置的公开分享功能\n */\nexport const testYourselfConfigShares = pgTable(\n 'test_yourself_config_shares',\n {\n /** 分享ID */\n id: uuid('id').primaryKey().defaultRandom(),\n \n /** 分享代码(短链接标识) */\n shareCode: varchar('share_code', { length: 20 }).notNull().unique(),\n \n /** 配置ID */\n configId: uuid('config_id')\n .references(() => testYourselfConfigs.id, { onDelete: 'cascade' })\n .notNull(),\n \n /** 分享标题 */\n title: varchar('title', { length: 255 }),\n \n /** 分享描述 */\n description: text('description'),\n \n /** 访问密码 */\n password: varchar('password', { length: 100 }),\n \n /** 最大访问次数 */\n maxAccess: integer('max_access'),\n \n /** 当前访问次数 */\n accessCount: integer('access_count').notNull().default(0),\n \n /** 是否启用 */\n isActive: boolean('is_active').notNull().default(true),\n \n /** 过期时间 */\n expiresAt: timestamp('expires_at'),\n \n /** 创建者ID */\n createdBy: varchar('created_by', { length: 255 }).notNull(),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n },\n (table) => ({\n /** 分享代码索引 */\n shareCodeIndex: index('test_shares_share_code_idx').on(table.shareCode),\n \n /** 配置ID索引 */\n configIndex: index('test_shares_config_idx').on(table.configId),\n \n /** 创建者索引 */\n createdByIndex: index('test_shares_created_by_idx').on(table.createdBy),\n \n /** 活跃状态索引 */\n isActiveIndex: index('test_shares_is_active_idx').on(table.isActive),\n })\n);\n\n// ========== 类型导出 ==========\n\nexport type TestYourselfConfig = typeof testYourselfConfigs.$inferSelect;\nexport type NewTestYourselfConfig = typeof testYourselfConfigs.$inferInsert;\n\nexport type TestYourselfConfigUsage = typeof testYourselfConfigUsage.$inferSelect;\nexport type NewTestYourselfConfigUsage = typeof testYourselfConfigUsage.$inferInsert;\n\nexport type TestYourselfConfigShare = typeof testYourselfConfigShares.$inferSelect;\nexport type NewTestYourselfConfigShare = typeof testYourselfConfigShares.$inferInsert;\n","/**\n * TestYourself 数据库配置适配器\n * Database Configuration Adapter\n * \n * 实现基于数据库的配置存储\n */\n\nimport { eq, and, desc, sql, or } from 'drizzle-orm';\nimport type { IConfigStorage } from './ConfigService';\nimport type { SavedConfig } from '../types';\nimport { testYourselfConfigs } from './drizzle-schema';\nimport type { TestYourselfConfig } from './drizzle-schema';\n\n/**\n * Drizzle 数据库连接类型\n */\nexport type DrizzleDb = any;\n\n/**\n * 数据库适配器配置\n */\nexport interface DatabaseConfigAdapterOptions {\n /** Drizzle 数据库实例 */\n db: DrizzleDb;\n /** 当前用户ID(用于创建和更新) */\n userId?: string;\n /** 组织ID(多租户支持) */\n organizationId?: string;\n /** 是否启用软删除(默认 true) */\n softDelete?: boolean;\n}\n\n/**\n * 数据库配置适配器\n * \n * 实现 IConfigStorage 接口,将配置存储在数据库中\n */\nexport class DatabaseConfigAdapter implements IConfigStorage {\n private db: DrizzleDb;\n private userId: string;\n private organizationId?: string;\n private softDelete: boolean;\n\n constructor(options: DatabaseConfigAdapterOptions) {\n this.db = options.db;\n this.userId = options.userId || 'system';\n this.organizationId = options.organizationId;\n this.softDelete = options.softDelete !== false;\n }\n\n /**\n * 设置当前用户ID\n */\n setUserId(userId: string): void {\n this.userId = userId;\n }\n\n /**\n * 设置组织ID\n */\n setOrganizationId(organizationId: string): void {\n this.organizationId = organizationId;\n }\n\n /**\n * 将数据库记录转换为 SavedConfig\n */\n private toSavedConfig(dbConfig: TestYourselfConfig): SavedConfig {\n return {\n id: dbConfig.id,\n name: dbConfig.name,\n description: dbConfig.description || undefined,\n config: dbConfig.config,\n createdAt: dbConfig.createdAt.getTime(),\n updatedAt: dbConfig.updatedAt.getTime(),\n isDefault: dbConfig.isDefault,\n };\n }\n\n /**\n * 保存配置\n */\n async saveConfig(config: SavedConfig): Promise<void> {\n try {\n // 检查是否已存在\n const existing = await this.db\n .select()\n .from(testYourselfConfigs)\n .where(eq(testYourselfConfigs.id, config.id))\n .limit(1);\n\n const resultCount = config.config.results?.length || 0;\n\n if (existing && existing.length > 0) {\n // 更新现有配置\n await this.db\n .update(testYourselfConfigs)\n .set({\n name: config.name,\n description: config.description || null,\n config: config.config,\n resultCount,\n isDefault: config.isDefault || false,\n updatedBy: this.userId,\n updatedAt: new Date(),\n version: sql`${testYourselfConfigs.version} + 1`, // 版本号递增\n })\n .where(eq(testYourselfConfigs.id, config.id));\n\n console.log('✅ [DatabaseAdapter] 配置已更新:', config.id);\n } else {\n // 插入新配置\n await this.db.insert(testYourselfConfigs).values({\n id: config.id,\n name: config.name,\n description: config.description || null,\n config: config.config,\n resultCount,\n isDefault: config.isDefault || false,\n createdBy: this.userId,\n organizationId: this.organizationId,\n createdAt: new Date(config.createdAt),\n updatedAt: new Date(config.updatedAt),\n });\n\n console.log('✅ [DatabaseAdapter] 配置已创建:', config.id);\n }\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 保存配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 获取配置\n */\n async getConfig(id: string): Promise<SavedConfig | null> {\n try {\n const conditions = [eq(testYourselfConfigs.id, id)];\n\n // 如果启用软删除,过滤已删除的记录\n if (this.softDelete) {\n conditions.push(eq(testYourselfConfigs.isDeleted, false));\n }\n\n const result = await this.db\n .select()\n .from(testYourselfConfigs)\n .where(and(...conditions))\n .limit(1);\n\n if (!result || result.length === 0) {\n return null;\n }\n\n return this.toSavedConfig(result[0]);\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 获取配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 获取所有配置列表\n */\n async getAllConfigs(): Promise<SavedConfig[]> {\n try {\n const conditions = [];\n\n // 如果启用软删除,过滤已删除的记录\n if (this.softDelete) {\n conditions.push(eq(testYourselfConfigs.isDeleted, false));\n }\n\n // 如果设置了组织ID,只查询该组织的配置\n if (this.organizationId) {\n conditions.push(\n or(\n eq(testYourselfConfigs.organizationId, this.organizationId),\n sql`${testYourselfConfigs.organizationId} IS NULL` // 包含全局配置\n )\n );\n }\n\n const result = await this.db\n .select()\n .from(testYourselfConfigs)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(testYourselfConfigs.createdAt));\n\n return result.map((config: TestYourselfConfig) => this.toSavedConfig(config));\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 获取配置列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 删除配置\n */\n async deleteConfig(id: string): Promise<void> {\n try {\n if (this.softDelete) {\n // 软删除\n await this.db\n .update(testYourselfConfigs)\n .set({\n isDeleted: true,\n deletedAt: new Date(),\n updatedBy: this.userId,\n updatedAt: new Date(),\n })\n .where(eq(testYourselfConfigs.id, id));\n\n console.log('🗑️ [DatabaseAdapter] 配置已软删除:', id);\n } else {\n // 硬删除\n await this.db\n .delete(testYourselfConfigs)\n .where(eq(testYourselfConfigs.id, id));\n\n console.log('🗑️ [DatabaseAdapter] 配置已硬删除:', id);\n }\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 删除配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 更新配置\n */\n async updateConfig(id: string, config: SavedConfig): Promise<void> {\n try {\n const resultCount = config.config.results?.length || 0;\n\n await this.db\n .update(testYourselfConfigs)\n .set({\n name: config.name,\n description: config.description || null,\n config: config.config,\n resultCount,\n isDefault: config.isDefault || false,\n updatedBy: this.userId,\n updatedAt: new Date(config.updatedAt),\n version: sql`${testYourselfConfigs.version} + 1`,\n })\n .where(eq(testYourselfConfigs.id, id));\n\n console.log('✅ [DatabaseAdapter] 配置已更新:', id);\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 更新配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 设置默认配置\n */\n async setDefaultConfig(id: string): Promise<void> {\n try {\n // 使用事务确保原子性\n await this.db.transaction(async (tx: any) => {\n // 1. 清除所有默认配置标记\n const conditions = [eq(testYourselfConfigs.isDefault, true)];\n \n if (this.organizationId) {\n conditions.push(\n eq(testYourselfConfigs.organizationId, this.organizationId)\n );\n }\n\n await tx\n .update(testYourselfConfigs)\n .set({\n isDefault: false,\n updatedBy: this.userId,\n updatedAt: new Date(),\n })\n .where(and(...conditions));\n\n // 2. 设置新的默认配置\n await tx\n .update(testYourselfConfigs)\n .set({\n isDefault: true,\n updatedBy: this.userId,\n updatedAt: new Date(),\n })\n .where(eq(testYourselfConfigs.id, id));\n });\n\n console.log('✅ [DatabaseAdapter] 默认配置已设置:', id);\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 设置默认配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 获取默认配置\n */\n async getDefaultConfig(): Promise<SavedConfig | null> {\n try {\n const conditions = [eq(testYourselfConfigs.isDefault, true)];\n\n // 如果启用软删除,过滤已删除的记录\n if (this.softDelete) {\n conditions.push(eq(testYourselfConfigs.isDeleted, false));\n }\n\n // 如果设置了组织ID,只查询该组织的配置\n if (this.organizationId) {\n conditions.push(\n eq(testYourselfConfigs.organizationId, this.organizationId)\n );\n }\n\n const result = await this.db\n .select()\n .from(testYourselfConfigs)\n .where(and(...conditions))\n .limit(1);\n\n if (!result || result.length === 0) {\n return null;\n }\n\n return this.toSavedConfig(result[0]);\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 获取默认配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 恢复已删除的配置(软删除时可用)\n */\n async restoreConfig(id: string): Promise<void> {\n if (!this.softDelete) {\n throw new Error('恢复功能仅在启用软删除时可用');\n }\n\n try {\n await this.db\n .update(testYourselfConfigs)\n .set({\n isDeleted: false,\n deletedAt: null,\n updatedBy: this.userId,\n updatedAt: new Date(),\n })\n .where(eq(testYourselfConfigs.id, id));\n\n console.log('♻️ [DatabaseAdapter] 配置已恢复:', id);\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 恢复配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 归档配置\n */\n async archiveConfig(id: string): Promise<void> {\n try {\n await this.db\n .update(testYourselfConfigs)\n .set({\n isArchived: true,\n archivedAt: new Date(),\n updatedBy: this.userId,\n updatedAt: new Date(),\n })\n .where(eq(testYourselfConfigs.id, id));\n\n console.log('📦 [DatabaseAdapter] 配置已归档:', id);\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 归档配置失败:', error);\n throw error;\n }\n }\n\n /**\n * 取消归档\n */\n async unarchiveConfig(id: string): Promise<void> {\n try {\n await this.db\n .update(testYourselfConfigs)\n .set({\n isArchived: false,\n archivedAt: null,\n updatedBy: this.userId,\n updatedAt: new Date(),\n })\n .where(eq(testYourselfConfigs.id, id));\n\n console.log('📂 [DatabaseAdapter] 配置已取消归档:', id);\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 取消归档失败:', error);\n throw error;\n }\n }\n\n /**\n * 记录使用次数\n */\n async incrementUsageCount(id: string): Promise<void> {\n try {\n await this.db\n .update(testYourselfConfigs)\n .set({\n usageCount: sql`${testYourselfConfigs.usageCount} + 1`,\n lastUsedAt: new Date(),\n })\n .where(eq(testYourselfConfigs.id, id));\n } catch (error) {\n console.error('❌ [DatabaseAdapter] 更新使用次数失败:', error);\n // 不抛出错误,避免影响主流程\n }\n }\n}\n\n/**\n * 创建数据库配置适配器\n * \n * @example\n * ```typescript\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import { createDatabaseConfigAdapter } from './DatabaseConfigAdapter';\n * \n * const db = drizzle(connection);\n * const adapter = createDatabaseConfigAdapter({\n * db,\n * userId: 'user-123',\n * organizationId: 'org-456',\n * });\n * \n * // 在 ConfigService 中使用\n * const configService = new ConfigService({\n * storageType: 'custom',\n * customStorage: adapter,\n * });\n * ```\n */\nexport function createDatabaseConfigAdapter(\n options: DatabaseConfigAdapterOptions\n): DatabaseConfigAdapter {\n return new DatabaseConfigAdapter(options);\n}\n"]}