create-dp-koa 1.0.0

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 (235) hide show
  1. package/README.md +50 -0
  2. package/index.mjs +97 -0
  3. package/package.json +33 -0
  4. package/template/.env.development +9 -0
  5. package/template/.env.production +12 -0
  6. package/template/.github/workflows/ci-cd.yml +182 -0
  7. package/template/.trae/documents/controller_development_plan.md +386 -0
  8. package/template/.trae/skills/00-backend-core.skill.md +50 -0
  9. package/template/.trae/skills/01-backend-skill-router.skill.md +55 -0
  10. package/template/.trae/skills/10-backend-api.skill.md +54 -0
  11. package/template/.trae/skills/11-backend-controller-recipes.skill.md +107 -0
  12. package/template/.trae/skills/20-backend-repository.skill.md +25 -0
  13. package/template/.trae/skills/21-backend-service.skill.md +135 -0
  14. package/template/.trae/skills/25-backend-comments-and-doc.skill.md +97 -0
  15. package/template/.trae/skills/30-backend-validation.skill.md +320 -0
  16. package/template/.trae/skills/40-backend-error-logging.skill.md +21 -0
  17. package/template/.trae/skills/50-backend-bootstrap-lifecycle.skill.md +90 -0
  18. package/template/.trae/skills/60-backend-router-registration.skill.md +71 -0
  19. package/template/.trae/skills/70-backend-middleware.skill.md +98 -0
  20. package/template/.trae/skills/80-backend-utils-and-libs.skill.md +90 -0
  21. package/template/.trae/skills/85-backend-plugins.rule.md +64 -0
  22. package/template/.trae/skills/90-backend-testing.skill.md +29 -0
  23. package/template/.trae/skills/README.md +49 -0
  24. package/template/.vscode/launch.json +38 -0
  25. package/template/.vscode/settings.json +1 -0
  26. package/template/Dockerfile +36 -0
  27. package/template/README.md +229 -0
  28. package/template/docker-compose.yml +135 -0
  29. package/template/docs/API_DOCUMENTATION.md +837 -0
  30. package/template/docs/ARCHITECTURE_REFACTOR.md +109 -0
  31. package/template/docs/CACHE_MIGRATION_GUIDE.md +142 -0
  32. package/template/docs/DEPLOYMENT_GUIDE.md +1062 -0
  33. package/template/docs/DEVELOPMENT_GUIDE.md +1097 -0
  34. package/template/docs/DOCUMENTATION_CLEANUP_REPORT.md +166 -0
  35. package/template/docs/DOCUMENTATION_COMPLETION_REPORT.md +223 -0
  36. package/template/docs/DOCUMENTATION_INDEX.md +294 -0
  37. package/template/docs/DOCUMENTATION_STRUCTURE.md +221 -0
  38. package/template/docs/ENTERPRISE_ANNOTATION_SYSTEM_GUIDE.md +2069 -0
  39. package/template/docs/ENTERPRISE_DATABASE_ARCHITECTURE.md +318 -0
  40. package/template/docs/ENTERPRISE_DEPLOYMENT_GUIDE.md +547 -0
  41. package/template/docs/ENTERPRISE_ERROR_HANDLING_GUIDE.md +357 -0
  42. package/template/docs/ENTERPRISE_LOGGING_SYSTEM_GUIDE.md +494 -0
  43. package/template/docs/ENVIRONMENT_CONFIG_EXAMPLE.md +69 -0
  44. package/template/docs/FINAL_IMPLEMENTATION_SUMMARY.md +206 -0
  45. package/template/docs/HEALTH_CHECK_ROUTE_FIX.md +134 -0
  46. package/template/docs/IMPLEMENTATION_CHECKLIST.md +204 -0
  47. package/template/docs/INSTALLATION_GUIDE.md +611 -0
  48. package/template/docs/INTERCEPTOR_TESTING_REPORT.md +226 -0
  49. package/template/docs/INTERCEPTOR_TESTING_SCRIPTS.md +143 -0
  50. package/template/docs/LOGGING_OPTIMIZATION_GUIDE.md +126 -0
  51. package/template/docs/MEMORY_DATABASE_GUIDE.md +212 -0
  52. package/template/docs/NEW_ROUTER_INTEGRATION_GUIDE.md +345 -0
  53. package/template/docs/NEW_ROUTER_INTEGRATION_SUMMARY.md +259 -0
  54. package/template/docs/NEW_ROUTER_USAGE_GUIDE.md +364 -0
  55. package/template/docs/QUICK_START.md +268 -0
  56. package/template/docs/ROUTE_SLASH_COMPATIBILITY_FIX.md +191 -0
  57. package/template/docs/SERVICE_INTERCEPTOR_GUIDE.md +243 -0
  58. package/template/docs/SERVICE_LAYER_INDEX.md +205 -0
  59. package/template/docs/SERVICE_PATTERN_GUIDE.md +270 -0
  60. package/template/docs/SERVICE_RETURN_VALUE_SPECIFICATION.md +466 -0
  61. package/template/docs/SWAGGER_DEBUG_MODE_GUIDE.md +80 -0
  62. package/template/docs/SWAGGER_INTEGRATION_GUIDE.md +416 -0
  63. package/template/docs/TRANSACTION_MANAGER_USAGE.md +360 -0
  64. package/template/docs/TROUBLESHOOTING.md +869 -0
  65. package/template/env.production.example +62 -0
  66. package/template/jest.config.js +34 -0
  67. package/template/package-lock.json +13240 -0
  68. package/template/package.json +119 -0
  69. package/template/patches/typeorm+0.3.25.patch +22 -0
  70. package/template/scripts/sync-template.mjs +84 -0
  71. package/template/scripts/test-annotation-system.sh +48 -0
  72. package/template/scripts/test-core-functionality.sh +28 -0
  73. package/template/src/annotations/decorators/ConfigManagement.ts +9 -0
  74. package/template/src/annotations/decorators/DistributedTracing.ts +9 -0
  75. package/template/src/annotations/decorators/EnterprisePerformance.ts +9 -0
  76. package/template/src/annotations/decorators/PerformanceMonitor.ts +32 -0
  77. package/template/src/annotations/decorators/SecurityAudit.ts +9 -0
  78. package/template/src/annotations/index.ts +50 -0
  79. package/template/src/annotations/processors/ConfigManagementProcessor.ts +369 -0
  80. package/template/src/annotations/processors/DistributedTracingProcessor.ts +288 -0
  81. package/template/src/annotations/processors/EnterprisePerformanceProcessor.ts +189 -0
  82. package/template/src/annotations/processors/PerformanceMonitorProcessor.ts +101 -0
  83. package/template/src/annotations/processors/SecurityAuditProcessor.ts +345 -0
  84. package/template/src/annotations/processors/SwaggerProcessor.ts +612 -0
  85. package/template/src/annotations/processors/index.ts +10 -0
  86. package/template/src/app.ts +123 -0
  87. package/template/src/controllers/base.controller.ts +41 -0
  88. package/template/src/controllers/cacheManagement.controller.ts +131 -0
  89. package/template/src/controllers/captcha.controller.ts +57 -0
  90. package/template/src/controllers/demo/AnnotationDemoController.ts +118 -0
  91. package/template/src/controllers/example/EnterpriseExampleController.ts +297 -0
  92. package/template/src/controllers/example/ExampleController.ts +110 -0
  93. package/template/src/controllers/example/NewAnnotationExampleController.ts +159 -0
  94. package/template/src/controllers/example/SwaggerExampleController.ts +205 -0
  95. package/template/src/controllers/example/TransactionExample.controller.ts +336 -0
  96. package/template/src/controllers/health.controller.ts +235 -0
  97. package/template/src/controllers/home/register.controller.ts +58 -0
  98. package/template/src/controllers/home/ytGoods.controller.ts +92 -0
  99. package/template/src/controllers/home/ytShop.controller.ts +135 -0
  100. package/template/src/controllers/home/ytUser.controller.ts +89 -0
  101. package/template/src/controllers/logManagement.controller.ts +396 -0
  102. package/template/src/controllers/public/emailSend.controller.ts +65 -0
  103. package/template/src/controllers/public/ytUserAuth.controller.ts +174 -0
  104. package/template/src/controllers/testData.controller.ts +253 -0
  105. package/template/src/dto/controller/example/NewAnnotationExampleController.dto.ts +73 -0
  106. package/template/src/dto/controller/home/emailSend.controller.dto.ts +40 -0
  107. package/template/src/dto/controller/home/register.controller.dto.ts +45 -0
  108. package/template/src/dto/controller/home/ytGoods.controller.dto.ts +55 -0
  109. package/template/src/dto/controller/home/ytShop.controller.dto.ts +69 -0
  110. package/template/src/dto/controller/home/ytUser.controller.dto.ts +44 -0
  111. package/template/src/dto/controller/public/ytUserAuth.controller.dto.ts +63 -0
  112. package/template/src/dto/goods.dto.ts +212 -0
  113. package/template/src/dto/service/ytService.dto.ts +13 -0
  114. package/template/src/dto/user.dto.ts +177 -0
  115. package/template/src/entity/base.entity.ts +13 -0
  116. package/template/src/entity/columnTypes.ts +13 -0
  117. package/template/src/entity/goodsImagesUnlockKey.entity.ts +33 -0
  118. package/template/src/entity/goodsUnlocker.entity.ts +34 -0
  119. package/template/src/entity/index.ts +15 -0
  120. package/template/src/entity/shop.entity.ts +52 -0
  121. package/template/src/entity/shopUser.entity.ts +41 -0
  122. package/template/src/entity/ytGoods.entity.ts +94 -0
  123. package/template/src/entity/ytUser.entity.ts +96 -0
  124. package/template/src/examples/InterceptorExampleRunner.ts +284 -0
  125. package/template/src/examples/ServiceInterceptorExample.ts +214 -0
  126. package/template/src/examples/SwaggerProcessorExample.ts +169 -0
  127. package/template/src/examples/TransactionManagerDemo.ts +377 -0
  128. package/template/src/examples/cacheExamples.ts +155 -0
  129. package/template/src/framework/decorator/controller.ts +311 -0
  130. package/template/src/framework/decorator/processor/AnnotationDecorators.ts +100 -0
  131. package/template/src/framework/decorator/processor/AnnotationProcessor.ts +156 -0
  132. package/template/src/framework/decorator/processor/AnnotationProcessorConfig.ts +45 -0
  133. package/template/src/framework/decorator/processor/AnnotationRegistry.ts +117 -0
  134. package/template/src/framework/decorator/processor/AnnotationSystemInitializer.ts +95 -0
  135. package/template/src/framework/decorator/processor/ProcessorManager.ts +76 -0
  136. package/template/src/framework/decorator/processor/processors/CustomProcessors.ts +126 -0
  137. package/template/src/framework/decorator/processor/processors/DefaultProcessors.ts +207 -0
  138. package/template/src/framework/decorator/refactored/DecoratorFactory.ts +99 -0
  139. package/template/src/framework/decorator/refactored/DecoratorMetadataManager.ts +125 -0
  140. package/template/src/framework/decorator/refactored/DecoratorValidator.ts +128 -0
  141. package/template/src/framework/decorator/refactored/TypeSafeDecorators.ts +139 -0
  142. package/template/src/framework/decorator/refactored/index.ts +98 -0
  143. package/template/src/framework/decorator/swagger.ts +150 -0
  144. package/template/src/framework/interceptors/AdvancedServiceCallInterceptor.ts +375 -0
  145. package/template/src/framework/interceptors/ServiceCallInterceptor.ts +348 -0
  146. package/template/src/framework/interceptors/index.ts +19 -0
  147. package/template/src/framework/plugins/registry.ts +63 -0
  148. package/template/src/framework/plugins/types.ts +15 -0
  149. package/template/src/framework/types/ServiceResult.ts +151 -0
  150. package/template/src/framework/types/index.ts +16 -0
  151. package/template/src/framework/utils/CacheManager.ts +430 -0
  152. package/template/src/framework/utils/CacheService.ts +248 -0
  153. package/template/src/framework/utils/DtoValidator.ts +164 -0
  154. package/template/src/framework/utils/MigrationHelper.ts +179 -0
  155. package/template/src/framework/utils/MigrationManager.ts +256 -0
  156. package/template/src/framework/utils/NewRouter.ts +207 -0
  157. package/template/src/framework/utils/TransactionManager.ts +172 -0
  158. package/template/src/framework/utils/bootstrap.ts +445 -0
  159. package/template/src/framework/utils/cache.ts +269 -0
  160. package/template/src/framework/utils/databaseConfig.ts +148 -0
  161. package/template/src/framework/utils/db.ts +39 -0
  162. package/template/src/framework/utils/dbMonitor.ts +106 -0
  163. package/template/src/framework/utils/dynamicSwagger.ts +410 -0
  164. package/template/src/framework/utils/function.ts +61 -0
  165. package/template/src/framework/utils/gracefulShutdown.ts +131 -0
  166. package/template/src/framework/utils/logger.ts +388 -0
  167. package/template/src/framework/utils/metrics.ts +182 -0
  168. package/template/src/framework/utils/router.ts +417 -0
  169. package/template/src/framework/utils/swagger.ts +184 -0
  170. package/template/src/framework/utils/testDb.ts +19 -0
  171. package/template/src/framework/utils/token.ts +23 -0
  172. package/template/src/framework/utils/transform.ts +17 -0
  173. package/template/src/libs/aokEmailSender.ts +42 -0
  174. package/template/src/libs/captcha.ts +37 -0
  175. package/template/src/libs/cos.ts +45 -0
  176. package/template/src/libs/mCache.ts +7 -0
  177. package/template/src/libs/serviceValidate.ts +3 -0
  178. package/template/src/libs/tecentSms.ts +51 -0
  179. package/template/src/middlewares/a.middleware.ts +6 -0
  180. package/template/src/middlewares/error.middleware.ts +14 -0
  181. package/template/src/middlewares/logging.middleware.ts +187 -0
  182. package/template/src/middlewares/static.middleware.ts +79 -0
  183. package/template/src/middlewares/swagger.middleware.ts +70 -0
  184. package/template/src/middlewares/token.middleware.ts +32 -0
  185. package/template/src/migrations/1700000000000-InitialDatabaseStructure.ts +172 -0
  186. package/template/src/migrations/index.ts +6 -0
  187. package/template/src/plugins/weboffice/core/context.ts +47 -0
  188. package/template/src/plugins/weboffice/core/errors.ts +51 -0
  189. package/template/src/plugins/weboffice/core/types.ts +63 -0
  190. package/template/src/plugins/weboffice/core/utils.ts +7 -0
  191. package/template/src/plugins/weboffice/entities/index.ts +3 -0
  192. package/template/src/plugins/weboffice/entities/webofficeFile.entity.ts +28 -0
  193. package/template/src/plugins/weboffice/entities/webofficeFileVersion.entity.ts +29 -0
  194. package/template/src/plugins/weboffice/http/routes.ts +179 -0
  195. package/template/src/plugins/weboffice/index.ts +23 -0
  196. package/template/src/plugins/weboffice/services/webofficeCallback.service.ts +274 -0
  197. package/template/src/repository/UserRepository.ts +122 -0
  198. package/template/src/repository/base/BaseRepository.ts +124 -0
  199. package/template/src/repository/interfaces/IBaseRepository.ts +67 -0
  200. package/template/src/routers/index.ts +49 -0
  201. package/template/src/service/base.service.ts +116 -0
  202. package/template/src/service/paramValidateTest.service.ts +139 -0
  203. package/template/src/service/ytGoods.service.ts +42 -0
  204. package/template/src/service/ytShop.service.ts +90 -0
  205. package/template/src/service/ytUser.service.ts +451 -0
  206. package/template/src/test/swaggerParameterTest.ts +90 -0
  207. package/template/src/utils/testDataInitializer.ts +296 -0
  208. package/template/static/output.json +15203 -0
  209. package/template/test/controllers/controllers.test.ts +173 -0
  210. package/template/test/controllers/example/ExampleController.test.ts +222 -0
  211. package/template/test/controllers/example/NewAnnotationExampleController.test.ts +200 -0
  212. package/template/test/framework/TransactionManagerDemo.test.ts +363 -0
  213. package/template/test/framework/annotation/AnnotationDecorators.test.ts +222 -0
  214. package/template/test/framework/annotation/AnnotationExecutor.test.ts +246 -0
  215. package/template/test/framework/annotation/AnnotationProcessor.test.ts +179 -0
  216. package/template/test/framework/annotation/CustomProcessors.test.ts +313 -0
  217. package/template/test/framework/annotation/DefaultProcessors.test.ts +371 -0
  218. package/template/test/framework/annotation/NewRouter.test.ts +272 -0
  219. package/template/test/framework/annotation/ProcessorManager.test.ts +248 -0
  220. package/template/test/framework/annotation/setup.ts +26 -0
  221. package/template/test/framework/cache.test.ts +101 -0
  222. package/template/test/framework/databaseConfig.test.ts +142 -0
  223. package/template/test/integration/integration.test.ts +153 -0
  224. package/template/test/plugins/weboffice/http.routes.int.test.ts +61 -0
  225. package/template/test/service/business.test.ts +87 -0
  226. package/template/test/service/paramValidateTest.service.test.ts +184 -0
  227. package/template/test/service/ytUser.service.test.ts +566 -0
  228. package/template/test/setup.ts +20 -0
  229. package/template/test/setupAfterEnv.ts +14 -0
  230. package/template/test/utils/testHelpers.ts +220 -0
  231. package/template/test_output.txt +0 -0
  232. package/template/tsconfig.build.json +17 -0
  233. package/template/tsconfig.json +31 -0
  234. package/template/webpack.config.js +71 -0
  235. package/template/yarn.lock +7354 -0
@@ -0,0 +1,296 @@
1
+ import { getDataSource } from "@src/framework/utils/db";
2
+ import { logger } from "@src/framework/utils/logger";
3
+ import { YtUserEntity, YtUserTypeEnum, YtUserStatusEnum } from "@src/entity/ytUser.entity";
4
+ import { ShopEntity, ShopStatusEnum } from "@src/entity/shop.entity";
5
+ import { ShopAndUserEntity } from "@src/entity/shopUser.entity";
6
+ import { YtGoodsEntity, YtGoodsStatusEnum } from "@src/entity/ytGoods.entity";
7
+ import { GoodsImagesUnlockKeyEntity } from "@src/entity/goodsImagesUnlockKey.entity";
8
+ import * as bcrypt from 'bcryptjs';
9
+
10
+ /**
11
+ * 测试数据初始化工具
12
+ * 仅在内存数据库模式下使用
13
+ */
14
+ export class TestDataInitializer {
15
+ private static instance: TestDataInitializer;
16
+
17
+ private constructor() {}
18
+
19
+ static getInstance(): TestDataInitializer {
20
+ if (!TestDataInitializer.instance) {
21
+ TestDataInitializer.instance = new TestDataInitializer();
22
+ }
23
+ return TestDataInitializer.instance;
24
+ }
25
+
26
+ /**
27
+ * 检查是否为内存数据库模式
28
+ */
29
+ private isMemoryDatabase(): boolean {
30
+ const dataSource = getDataSource();
31
+ if (!dataSource || !dataSource.isInitialized) {
32
+ return false;
33
+ }
34
+
35
+ const driver = (dataSource as any).driver;
36
+ return driver && driver.options && driver.options.database === ':memory:';
37
+ }
38
+
39
+ /**
40
+ * 初始化测试数据
41
+ */
42
+ async initializeTestData(): Promise<void> {
43
+ if (!this.isMemoryDatabase()) {
44
+ logger.info("非内存数据库模式,跳过测试数据初始化");
45
+ return;
46
+ }
47
+
48
+ logger.info("开始初始化内存数据库测试数据...");
49
+
50
+ try {
51
+ const dataSource = getDataSource();
52
+ if (!dataSource) {
53
+ throw new Error("数据库连接未初始化");
54
+ }
55
+
56
+ // 创建测试用户
57
+ const testUsers = await this.createTestUsers(dataSource);
58
+ logger.info(`创建了 ${testUsers.length} 个测试用户`);
59
+
60
+ // 创建测试店铺
61
+ const testShops = await this.createTestShops(dataSource, testUsers);
62
+ logger.info(`创建了 ${testShops.length} 个测试店铺`);
63
+
64
+ // 创建店铺用户关联
65
+ await this.createShopUserRelations(dataSource, testUsers, testShops);
66
+ logger.info("创建了店铺用户关联");
67
+
68
+ // 创建测试商品
69
+ const testGoods = await this.createTestGoods(dataSource, testShops);
70
+ logger.info(`创建了 ${testGoods.length} 个测试商品`);
71
+
72
+ // 创建测试解锁密钥
73
+ await this.createTestUnlockKeys(dataSource, testGoods);
74
+ logger.info("创建了测试解锁密钥");
75
+
76
+ logger.info("内存数据库测试数据初始化完成");
77
+
78
+ } catch (error) {
79
+ logger.error("初始化测试数据失败:", error as Error);
80
+ throw error;
81
+ }
82
+ }
83
+
84
+ /**
85
+ * 创建测试用户
86
+ */
87
+ private async createTestUsers(dataSource: any): Promise<YtUserEntity[]> {
88
+ // 加密密码 (使用符合强度要求的密码)
89
+ const hashedPassword = await bcrypt.hash('Password123!', 10);
90
+
91
+ const users = [
92
+ {
93
+ nickName: "测试用户1",
94
+ email: "test1@example.com",
95
+ telnumber: "13800138001",
96
+ password: hashedPassword,
97
+ userType: YtUserTypeEnum.CUSTOMER,
98
+ status: YtUserStatusEnum.NORMAL,
99
+ avatar: "https://example.com/avatar1.jpg",
100
+ gender: 1,
101
+ age: 25,
102
+ constellation: "白羊座"
103
+ },
104
+ {
105
+ nickName: "测试用户2",
106
+ email: "test2@example.com",
107
+ telnumber: "13800138002",
108
+ password: hashedPassword,
109
+ userType: YtUserTypeEnum.CUSTOMER,
110
+ status: YtUserStatusEnum.NORMAL,
111
+ avatar: "https://example.com/avatar2.jpg",
112
+ gender: 2,
113
+ age: 28,
114
+ constellation: "金牛座"
115
+ },
116
+ {
117
+ nickName: "店铺管理员",
118
+ email: "admin@example.com",
119
+ telnumber: "13800138003",
120
+ password: hashedPassword,
121
+ userType: YtUserTypeEnum.SHOP,
122
+ status: YtUserStatusEnum.NORMAL,
123
+ avatar: "https://example.com/avatar3.jpg",
124
+ gender: 1,
125
+ age: 30,
126
+ constellation: "双子座"
127
+ }
128
+ ];
129
+
130
+ const userRepository = dataSource.getRepository(YtUserEntity);
131
+ const createdUsers: YtUserEntity[] = [];
132
+
133
+ for (const userData of users) {
134
+ const user = userRepository.create(userData);
135
+ const savedUser = await userRepository.save(user);
136
+ createdUsers.push(savedUser);
137
+ }
138
+
139
+ return createdUsers;
140
+ }
141
+
142
+ /**
143
+ * 创建测试店铺
144
+ */
145
+ private async createTestShops(dataSource: any, users: YtUserEntity[]): Promise<ShopEntity[]> {
146
+ const shops = [
147
+ {
148
+ name: "测试店铺1",
149
+ description: "这是一个测试店铺",
150
+ status: ShopStatusEnum.NORMAL
151
+ },
152
+ {
153
+ name: "测试店铺2",
154
+ description: "这是另一个测试店铺",
155
+ status: ShopStatusEnum.NORMAL
156
+ }
157
+ ];
158
+
159
+ const shopRepository = dataSource.getRepository(ShopEntity);
160
+ const createdShops: ShopEntity[] = [];
161
+
162
+ for (const shopData of shops) {
163
+ const shop = shopRepository.create(shopData);
164
+ const savedShop = await shopRepository.save(shop);
165
+ createdShops.push(savedShop);
166
+ }
167
+
168
+ return createdShops;
169
+ }
170
+
171
+ /**
172
+ * 创建店铺用户关联
173
+ */
174
+ private async createShopUserRelations(dataSource: any, users: YtUserEntity[], shops: ShopEntity[]): Promise<void> {
175
+ const relations = [
176
+ { userId: users[0].id, shopId: shops[0].id },
177
+ { userId: users[1].id, shopId: shops[1].id },
178
+ { userId: users[2].id, shopId: shops[0].id } // 管理员用户关联到第一个店铺
179
+ ];
180
+
181
+ const relationRepository = dataSource.getRepository(ShopAndUserEntity);
182
+
183
+ for (const relationData of relations) {
184
+ const relation = relationRepository.create(relationData);
185
+ await relationRepository.save(relation);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * 创建测试商品
191
+ */
192
+ private async createTestGoods(dataSource: any, shops: ShopEntity[]): Promise<YtGoodsEntity[]> {
193
+ const goods = [
194
+ {
195
+ name: "测试商品1",
196
+ description: "这是一个测试商品",
197
+ price: 99.99,
198
+ albums: ["https://example.com/goods1-1.jpg", "https://example.com/goods1-2.jpg"],
199
+ tags: ["电子产品", "数码", "测试"],
200
+ content: "这是测试商品1的详细描述内容",
201
+ imagesContent: ["https://example.com/content1-1.jpg", "https://example.com/content1-2.jpg"],
202
+ shopId: shops[0].id,
203
+ status: YtGoodsStatusEnum.NORMAL
204
+ },
205
+ {
206
+ name: "测试商品2",
207
+ description: "这是另一个测试商品",
208
+ price: 199.99,
209
+ albums: ["https://example.com/goods2-1.jpg"],
210
+ tags: ["服装", "时尚", "测试"],
211
+ content: "这是测试商品2的详细描述内容",
212
+ imagesContent: ["https://example.com/content2-1.jpg"],
213
+ shopId: shops[1].id,
214
+ status: YtGoodsStatusEnum.NORMAL
215
+ },
216
+ {
217
+ name: "测试商品3",
218
+ description: "第三个测试商品",
219
+ price: 299.99,
220
+ albums: ["https://example.com/goods3-1.jpg", "https://example.com/goods3-2.jpg", "https://example.com/goods3-3.jpg"],
221
+ tags: ["家居", "装饰", "测试"],
222
+ content: "这是测试商品3的详细描述内容",
223
+ imagesContent: ["https://example.com/content3-1.jpg", "https://example.com/content3-2.jpg"],
224
+ shopId: shops[0].id,
225
+ status: YtGoodsStatusEnum.NORMAL
226
+ }
227
+ ];
228
+
229
+ const goodsRepository = dataSource.getRepository(YtGoodsEntity);
230
+ const createdGoods: YtGoodsEntity[] = [];
231
+
232
+ for (const goodsData of goods) {
233
+ const goods = goodsRepository.create(goodsData);
234
+ const savedGoods = await goodsRepository.save(goods);
235
+ createdGoods.push(savedGoods);
236
+ }
237
+
238
+ return createdGoods;
239
+ }
240
+
241
+ /**
242
+ * 创建测试解锁密钥
243
+ */
244
+ private async createTestUnlockKeys(dataSource: any, goods: YtGoodsEntity[]): Promise<void> {
245
+ const unlockKeys = [
246
+ { key: "TEST_KEY_001", goodsId: goods[0].id, isUse: false },
247
+ { key: "TEST_KEY_002", goodsId: goods[0].id, isUse: false },
248
+ { key: "TEST_KEY_003", goodsId: goods[1].id, isUse: false },
249
+ { key: "USED_KEY_001", goodsId: goods[2].id, isUse: true }, // 已使用的密钥
250
+ { key: "TEST_KEY_004", goodsId: goods[2].id, isUse: false }
251
+ ];
252
+
253
+ const unlockKeyRepository = dataSource.getRepository(GoodsImagesUnlockKeyEntity);
254
+
255
+ for (const keyData of unlockKeys) {
256
+ const unlockKey = unlockKeyRepository.create(keyData);
257
+ await unlockKeyRepository.save(unlockKey);
258
+ }
259
+ }
260
+
261
+ /**
262
+ * 清空所有测试数据
263
+ */
264
+ async clearTestData(): Promise<void> {
265
+ if (!this.isMemoryDatabase()) {
266
+ logger.info("非内存数据库模式,跳过测试数据清理");
267
+ return;
268
+ }
269
+
270
+ logger.info("开始清理内存数据库测试数据...");
271
+
272
+ try {
273
+ const dataSource = getDataSource();
274
+ if (!dataSource) {
275
+ throw new Error("数据库连接未初始化");
276
+ }
277
+
278
+ // 按依赖关系顺序删除数据
279
+ await dataSource.query("DELETE FROM goods_images_unlock_key");
280
+ await dataSource.query("DELETE FROM yt_goods_unlock");
281
+ await dataSource.query("DELETE FROM yt_goods");
282
+ await dataSource.query("DELETE FROM shop_and_user");
283
+ await dataSource.query("DELETE FROM shop");
284
+ await dataSource.query("DELETE FROM yt_user");
285
+
286
+ logger.info("内存数据库测试数据清理完成");
287
+
288
+ } catch (error) {
289
+ logger.error("清理测试数据失败:", error as Error);
290
+ throw error;
291
+ }
292
+ }
293
+ }
294
+
295
+ // 导出单例实例
296
+ export const testDataInitializer = TestDataInitializer.getInstance();