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,94 @@
1
+ import { Column, Entity, Index, ManyToOne, OneToMany, JoinColumn } from "typeorm";
2
+ import { BaseEntity } from "@src/entity/base.entity";
3
+ import { ShopEntity } from "@src/entity/shop.entity";
4
+ import { YtGoodsUnlockerEntity } from "@src/entity/goodsUnlocker.entity";
5
+ import { GoodsImagesUnlockKeyEntity } from "@src/entity/goodsImagesUnlockKey.entity";
6
+
7
+
8
+ export enum YtGoodsStatusEnum {
9
+ NORMAL = "NORMAL",
10
+ FORBIDDEN = "FORBIDDEN",
11
+ CHECKING = "CHECKING",
12
+ }
13
+
14
+
15
+ @Entity({
16
+ name: "yt_goods"
17
+ })
18
+ export class YtGoodsEntity extends BaseEntity {
19
+
20
+ @Index()
21
+ @Column({ default: "" })
22
+ name: string;
23
+
24
+ @Index()
25
+ @Column({
26
+ default: 0,
27
+ type: "integer"
28
+ })
29
+ shopId: number
30
+
31
+ @Column({
32
+ type: "simple-array",
33
+ default: ""
34
+ })
35
+ albums: string[]
36
+
37
+ @Column({ default: 0 })
38
+ price: number;
39
+
40
+ @Column({
41
+ type: "simple-array",
42
+ default: ""
43
+ })
44
+ tags: string[];
45
+
46
+ @Column({
47
+ default: ""
48
+ })
49
+ description: string;
50
+
51
+
52
+ @Column({
53
+ type: "text",
54
+ default: ""
55
+ })
56
+ content: string
57
+
58
+ /**
59
+ * 商品内容中的图片,产品的照片相册
60
+ */
61
+ @Column({
62
+ type: "simple-array",
63
+ default: ""
64
+ })
65
+ imagesContent: string[]
66
+
67
+ @Column({
68
+ type: "varchar",
69
+ length: 50,
70
+ default: YtGoodsStatusEnum.NORMAL
71
+ })
72
+ status: YtGoodsStatusEnum;
73
+
74
+ // 关系定义
75
+ /**
76
+ * 商品所属的店铺
77
+ */
78
+ @ManyToOne(() => ShopEntity, shop => shop.goods)
79
+ @JoinColumn({ name: 'shopId' })
80
+ shop: ShopEntity;
81
+
82
+ /**
83
+ * 商品解锁记录
84
+ */
85
+ @OneToMany(() => YtGoodsUnlockerEntity, unlocker => unlocker.goods)
86
+ unlockRecords: YtGoodsUnlockerEntity[];
87
+
88
+ /**
89
+ * 商品图片解锁密钥
90
+ */
91
+ @OneToMany(() => GoodsImagesUnlockKeyEntity, key => key.goods)
92
+ unlockKeys: GoodsImagesUnlockKeyEntity[];
93
+
94
+ }
@@ -0,0 +1,96 @@
1
+ import { Column, Entity, OneToMany, OneToOne } from "typeorm";
2
+ import { BaseEntity } from "@src/entity/base.entity";
3
+ import { ShopAndUserEntity } from "@src/entity/shopUser.entity";
4
+ import { YtGoodsUnlockerEntity } from "@src/entity/goodsUnlocker.entity";
5
+
6
+
7
+ export enum YtUserStatusEnum {
8
+ NORMAL = "normal",
9
+ FORBIDDEN = "forbidden"
10
+ }
11
+
12
+ export enum YtUserTypeEnum {
13
+ CUSTOMER = "CUSTOMER", // 消费者
14
+ SHOP = "SHOP" // 商家
15
+ }
16
+
17
+
18
+ @Entity({
19
+ name: "yt_user"
20
+ })
21
+ export class YtUserEntity extends BaseEntity {
22
+
23
+
24
+
25
+ @Column({
26
+ default: ""
27
+ })
28
+ nickName: string
29
+
30
+ @Column({
31
+ default: ""
32
+ })
33
+ telnumber: string
34
+
35
+ @Column({
36
+ default: ""
37
+ })
38
+ email: string
39
+
40
+ @Column({
41
+ default: ""
42
+ })
43
+ password: string
44
+
45
+ @Column({
46
+ type: "varchar",
47
+ length: 50,
48
+ default: YtUserTypeEnum.CUSTOMER
49
+ })
50
+ userType: YtUserTypeEnum
51
+
52
+ @Column({
53
+ default: 0,
54
+ })
55
+ gender: number
56
+
57
+
58
+ @Column({
59
+ default: 0,
60
+ })
61
+ age: number
62
+
63
+
64
+ // 星座
65
+ @Column({
66
+ default: ""
67
+ })
68
+ constellation: string
69
+
70
+
71
+ @Column({
72
+ default: ""
73
+ })
74
+ avatar: string;
75
+
76
+ @Column({
77
+ default: YtUserStatusEnum.NORMAL,
78
+ type: "varchar",
79
+ length: 50
80
+ })
81
+ status: YtUserStatusEnum;
82
+
83
+ // 关系定义
84
+ /**
85
+ * 用户与店铺的关系(一个用户只能拥有一个店铺)
86
+ */
87
+ @OneToOne(() => ShopAndUserEntity, shopUser => shopUser.user)
88
+ shopRelation: ShopAndUserEntity;
89
+
90
+ /**
91
+ * 用户解锁的商品记录
92
+ */
93
+ @OneToMany(() => YtGoodsUnlockerEntity, unlocker => unlocker.user)
94
+ unlockedGoods: YtGoodsUnlockerEntity[];
95
+
96
+ }
@@ -0,0 +1,284 @@
1
+ /**
2
+ * 完整Service拦截器使用示例
3
+ * 展示基础拦截器和高级拦截器的使用
4
+ */
5
+
6
+ import { Injectable, Interceptor } from "dp-ioc2";
7
+ import { createServiceCallInterceptor } from '@src/framework/interceptors/ServiceCallInterceptor';
8
+ import { createAdvancedServiceCallInterceptor, InterceptorOptions } from '@src/framework/interceptors/AdvancedServiceCallInterceptor';
9
+ import { logger } from '@src/framework/utils/logger';
10
+
11
+ /**
12
+ * 用户服务示例 - 使用基础拦截器
13
+ */
14
+ @Injectable()
15
+ export class UserService {
16
+
17
+ @Interceptor(createServiceCallInterceptor())
18
+ async getUserById(id: number): Promise<{ id: number; name: string; email: string }> {
19
+ logger.info(`获取用户信息: ${id}`);
20
+
21
+ // 模拟数据库查询
22
+ await new Promise(resolve => setTimeout(resolve, 100));
23
+
24
+ return {
25
+ id,
26
+ name: `用户${id}`,
27
+ email: `user${id}@example.com`
28
+ };
29
+ }
30
+
31
+ @Interceptor(createServiceCallInterceptor())
32
+ async createUser(userData: { name: string; email: string; password: string }): Promise<{ id: number; name: string; email: string }> {
33
+ logger.info(`创建用户:`, userData);
34
+
35
+ // 模拟创建用户
36
+ await new Promise(resolve => setTimeout(resolve, 200));
37
+
38
+ const newUser = {
39
+ id: Math.floor(Math.random() * 1000),
40
+ name: userData.name,
41
+ email: userData.email
42
+ };
43
+
44
+ return newUser;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * 订单服务示例 - 使用高级拦截器
50
+ */
51
+ @Injectable()
52
+ export class OrderService {
53
+
54
+ @Interceptor(createAdvancedServiceCallInterceptor({
55
+ enablePerformanceMonitoring: true,
56
+ enableCaching: true,
57
+ enableRetry: true,
58
+ enableCircuitBreaker: true,
59
+ cacheTTL: 300000, // 5分钟
60
+ maxRetries: 3,
61
+ retryDelay: 1000,
62
+ circuitBreakerThreshold: 3,
63
+ slowCallThreshold: 500
64
+ }))
65
+ async getOrderById(orderId: number): Promise<{ id: number; status: string; amount: number }> {
66
+ logger.info(`获取订单信息: ${orderId}`);
67
+
68
+ // 模拟可能失败的外部API调用
69
+ if (Math.random() < 0.3) {
70
+ throw new Error('外部API调用失败');
71
+ }
72
+
73
+ await new Promise(resolve => setTimeout(resolve, 300));
74
+
75
+ return {
76
+ id: orderId,
77
+ status: 'completed',
78
+ amount: Math.floor(Math.random() * 1000) + 100
79
+ };
80
+ }
81
+
82
+ @Interceptor(createAdvancedServiceCallInterceptor({
83
+ enablePerformanceMonitoring: true,
84
+ enableCaching: false,
85
+ enableRetry: true,
86
+ enableCircuitBreaker: false,
87
+ maxRetries: 2,
88
+ retryDelay: 500,
89
+ slowCallThreshold: 1000
90
+ }))
91
+ async createOrder(orderData: { userId: number; items: any[]; total: number }): Promise<{ id: number; status: string }> {
92
+ logger.info(`创建订单:`, orderData);
93
+
94
+ // 模拟创建订单
95
+ await new Promise(resolve => setTimeout(resolve, 150));
96
+
97
+ return {
98
+ id: Math.floor(Math.random() * 10000),
99
+ status: 'pending'
100
+ };
101
+ }
102
+ }
103
+
104
+ /**
105
+ * 支付服务示例 - 使用高级拦截器(熔断器测试)
106
+ */
107
+ @Injectable()
108
+ export class PaymentService {
109
+
110
+ @Interceptor(createAdvancedServiceCallInterceptor({
111
+ enablePerformanceMonitoring: true,
112
+ enableCaching: false,
113
+ enableRetry: true,
114
+ enableCircuitBreaker: true,
115
+ maxRetries: 2,
116
+ retryDelay: 1000,
117
+ circuitBreakerThreshold: 2, // 低阈值,容易触发熔断
118
+ slowCallThreshold: 200
119
+ }))
120
+ async processPayment(paymentData: { orderId: number; amount: number; cardToken: string }): Promise<{ transactionId: string; status: string }> {
121
+ logger.info(`处理支付:`, paymentData);
122
+
123
+ // 模拟支付服务不稳定(70%失败率)
124
+ if (Math.random() < 0.7) {
125
+ throw new Error('支付服务暂时不可用');
126
+ }
127
+
128
+ await new Promise(resolve => setTimeout(resolve, 100));
129
+
130
+ return {
131
+ transactionId: `txn_${Date.now()}`,
132
+ status: 'success'
133
+ };
134
+ }
135
+ }
136
+
137
+ /**
138
+ * 拦截器示例运行器
139
+ */
140
+ export class InterceptorExampleRunner {
141
+
142
+ /**
143
+ * 运行基础拦截器示例
144
+ */
145
+ static async runBasicInterceptorExample() {
146
+ logger.info('=== 基础拦截器示例 ===');
147
+
148
+ const userService = new UserService();
149
+
150
+ try {
151
+ // 测试正常调用
152
+ const user = await userService.getUserById(123);
153
+ logger.info('获取用户成功:', user);
154
+
155
+ // 测试创建用户
156
+ const newUser = await userService.createUser({
157
+ name: '张三',
158
+ email: 'zhangsan@example.com',
159
+ password: 'password123'
160
+ });
161
+ logger.info('创建用户成功:', newUser);
162
+
163
+ } catch (error) {
164
+ logger.error('基础拦截器示例失败:', error as Error);
165
+ }
166
+ }
167
+
168
+ /**
169
+ * 运行高级拦截器示例
170
+ */
171
+ static async runAdvancedInterceptorExample() {
172
+ logger.info('=== 高级拦截器示例 ===');
173
+
174
+ const orderService = new OrderService();
175
+
176
+ try {
177
+ // 测试缓存和重试
178
+ logger.info('--- 测试缓存和重试 ---');
179
+ for (let i = 0; i < 3; i++) {
180
+ try {
181
+ const order = await orderService.getOrderById(456);
182
+ logger.info(`第${i + 1}次调用成功:`, order);
183
+ } catch (error) {
184
+ logger.info(`第${i + 1}次调用失败:`, (error as Error).message);
185
+ }
186
+ }
187
+
188
+ // 测试创建订单
189
+ logger.info('--- 测试创建订单 ---');
190
+ const order = await orderService.createOrder({
191
+ userId: 123,
192
+ items: [{ id: 1, quantity: 2 }],
193
+ total: 299.99
194
+ });
195
+ logger.info('创建订单成功:', order);
196
+
197
+ } catch (error) {
198
+ logger.error('高级拦截器示例失败:', error as Error);
199
+ }
200
+ }
201
+
202
+ /**
203
+ * 运行熔断器示例
204
+ */
205
+ static async runCircuitBreakerExample() {
206
+ logger.info('=== 熔断器示例 ===');
207
+
208
+ const paymentService = new PaymentService();
209
+
210
+ try {
211
+ // 连续失败调用,触发熔断器
212
+ logger.info('--- 触发熔断器 ---');
213
+ for (let i = 0; i < 5; i++) {
214
+ try {
215
+ const payment = await paymentService.processPayment({
216
+ orderId: 789,
217
+ amount: 99.99,
218
+ cardToken: 'card_token_123'
219
+ });
220
+ logger.info(`第${i + 1}次支付成功:`, payment);
221
+ } catch (error) {
222
+ logger.info(`第${i + 1}次支付失败:`, (error as Error).message);
223
+ }
224
+
225
+ // 短暂延迟
226
+ await new Promise(resolve => setTimeout(resolve, 100));
227
+ }
228
+
229
+ // 等待熔断器恢复
230
+ logger.info('--- 等待熔断器恢复 ---');
231
+ await new Promise(resolve => setTimeout(resolve, 2000));
232
+
233
+ // 尝试恢复调用
234
+ try {
235
+ const payment = await paymentService.processPayment({
236
+ orderId: 999,
237
+ amount: 199.99,
238
+ cardToken: 'card_token_456'
239
+ });
240
+ logger.info('熔断器恢复后支付成功:', payment);
241
+ } catch (error) {
242
+ logger.info('熔断器恢复后支付仍然失败:', (error as Error).message);
243
+ }
244
+
245
+ } catch (error) {
246
+ logger.error('熔断器示例失败:', error as Error);
247
+ }
248
+ }
249
+
250
+ /**
251
+ * 显示拦截器统计信息
252
+ */
253
+ static showInterceptorStats() {
254
+ logger.info('=== 拦截器统计信息 ===');
255
+
256
+ // 显示基础拦截器统计
257
+ const { serviceCallInterceptor } = require('@src/framework/interceptors/ServiceCallInterceptor');
258
+ logger.info('基础拦截器统计:');
259
+ logger.info(serviceCallInterceptor.generateReport());
260
+
261
+ // 显示高级拦截器状态
262
+ const { advancedServiceCallInterceptor } = require('@src/framework/interceptors/AdvancedServiceCallInterceptor');
263
+ logger.info('高级拦截器状态:');
264
+ logger.info(JSON.stringify(advancedServiceCallInterceptor.getStatus(), null, 2));
265
+ }
266
+
267
+ /**
268
+ * 运行所有示例
269
+ */
270
+ static async runAllExamples() {
271
+ try {
272
+ await this.runBasicInterceptorExample();
273
+ await this.runAdvancedInterceptorExample();
274
+ await this.runCircuitBreakerExample();
275
+ this.showInterceptorStats();
276
+
277
+ logger.info('=== 所有拦截器示例运行完成 ===');
278
+
279
+ } catch (error) {
280
+ logger.error('运行拦截器示例失败:', error as Error);
281
+ }
282
+ }
283
+ }
284
+
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Service调用拦截器使用示例
3
+ * 展示如何在Service中使用Interceptor注解来监控方法调用
4
+ */
5
+
6
+ import { Injectable, Interceptor } from "dp-ioc2";
7
+ import { createServiceCallInterceptor } from '@src/framework/interceptors/ServiceCallInterceptor';
8
+ import { logger } from '@src/framework/utils/logger';
9
+
10
+ /**
11
+ * 示例Service - 展示拦截器的使用
12
+ */
13
+ @Injectable()
14
+ export class ExampleService {
15
+
16
+ /**
17
+ * 示例方法1:同步方法
18
+ * 使用拦截器监控调用
19
+ */
20
+ @Interceptor(createServiceCallInterceptor())
21
+ getUserInfo(userId: number): { id: number; name: string; email: string } {
22
+ logger.info(`执行getUserInfo方法,参数: ${userId}`);
23
+
24
+ // 模拟业务逻辑
25
+ return {
26
+ id: userId,
27
+ name: `用户${userId}`,
28
+ email: `user${userId}@example.com`
29
+ };
30
+ }
31
+
32
+ /**
33
+ * 示例方法2:异步方法
34
+ * 使用拦截器监控调用
35
+ */
36
+ @Interceptor(createServiceCallInterceptor())
37
+ async createUser(userData: { name: string; email: string; password: string }): Promise<{ id: number; name: string; email: string }> {
38
+ logger.info(`执行createUser方法,参数:`, userData);
39
+
40
+ // 模拟异步业务逻辑
41
+ await new Promise(resolve => setTimeout(resolve, 100));
42
+
43
+ const newUser = {
44
+ id: Math.floor(Math.random() * 1000),
45
+ name: userData.name,
46
+ email: userData.email
47
+ };
48
+
49
+ logger.info(`创建用户成功:`, newUser);
50
+ return newUser;
51
+ }
52
+
53
+ /**
54
+ * 示例方法3:可能抛出异常的方法
55
+ * 使用拦截器监控调用
56
+ */
57
+ @Interceptor(createServiceCallInterceptor())
58
+ async deleteUser(userId: number): Promise<boolean> {
59
+ logger.info(`执行deleteUser方法,参数: ${userId}`);
60
+
61
+ // 模拟业务逻辑
62
+ if (userId <= 0) {
63
+ throw new Error('无效的用户ID');
64
+ }
65
+
66
+ // 模拟异步操作
67
+ await new Promise(resolve => setTimeout(resolve, 50));
68
+
69
+ logger.info(`删除用户成功: ${userId}`);
70
+ return true;
71
+ }
72
+
73
+ /**
74
+ * 示例方法4:复杂参数的方法
75
+ * 使用拦截器监控调用
76
+ */
77
+ @Interceptor(createServiceCallInterceptor())
78
+ async updateUser(userId: number, updateData: {
79
+ name?: string;
80
+ email?: string;
81
+ password?: string;
82
+ preferences?: any;
83
+ }): Promise<{ id: number; name: string; email: string; updated: string[] }> {
84
+ logger.info(`执行updateUser方法,参数:`, { userId, updateData });
85
+
86
+ // 模拟业务逻辑
87
+ await new Promise(resolve => setTimeout(resolve, 80));
88
+
89
+ const updatedFields = Object.keys(updateData).filter(key => updateData[key as keyof typeof updateData] !== undefined);
90
+
91
+ const result = {
92
+ id: userId,
93
+ name: updateData.name || `用户${userId}`,
94
+ email: updateData.email || `user${userId}@example.com`,
95
+ updated: updatedFields
96
+ };
97
+
98
+ logger.info(`更新用户成功:`, result);
99
+ return result;
100
+ }
101
+
102
+ /**
103
+ * 示例方法5:批量操作
104
+ * 使用拦截器监控调用
105
+ */
106
+ @Interceptor(createServiceCallInterceptor())
107
+ async batchCreateUsers(usersData: Array<{ name: string; email: string; password: string }>): Promise<Array<{ id: number; name: string; email: string }>> {
108
+ logger.info(`执行batchCreateUsers方法,参数数量: ${usersData.length}`);
109
+
110
+ const results = [];
111
+
112
+ for (let i = 0; i < usersData.length; i++) {
113
+ const userData = usersData[i];
114
+ logger.info(`处理第${i + 1}个用户:`, userData);
115
+
116
+ // 模拟异步操作
117
+ await new Promise(resolve => setTimeout(resolve, 30));
118
+
119
+ const newUser = {
120
+ id: Math.floor(Math.random() * 1000) + i * 1000,
121
+ name: userData.name,
122
+ email: userData.email
123
+ };
124
+
125
+ results.push(newUser);
126
+ }
127
+
128
+ logger.info(`批量创建用户完成,共创建${results.length}个用户`);
129
+ return results;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * 拦截器使用示例类
135
+ */
136
+ export class ServiceInterceptorExample {
137
+
138
+ /**
139
+ * 运行拦截器示例
140
+ */
141
+ static async runExample() {
142
+ try {
143
+ logger.info('=== Service调用拦截器示例开始 ===');
144
+
145
+ // 创建Service实例
146
+ const exampleService = new ExampleService();
147
+
148
+ // 测试同步方法
149
+ logger.info('\n--- 测试同步方法 ---');
150
+ const userInfo = exampleService.getUserInfo(123);
151
+ logger.info('同步方法结果:', userInfo);
152
+
153
+ // 测试异步方法
154
+ logger.info('\n--- 测试异步方法 ---');
155
+ const newUser = await exampleService.createUser({
156
+ name: '张三',
157
+ email: 'zhangsan@example.com',
158
+ password: 'password123'
159
+ });
160
+ logger.info('异步方法结果:', newUser);
161
+
162
+ // 测试异常方法
163
+ logger.info('\n--- 测试异常方法 ---');
164
+ try {
165
+ await exampleService.deleteUser(-1);
166
+ } catch (error) {
167
+ logger.info('捕获到预期的异常:', (error as Error).message);
168
+ }
169
+
170
+ // 测试正常删除
171
+ await exampleService.deleteUser(456);
172
+
173
+ // 测试复杂参数方法
174
+ logger.info('\n--- 测试复杂参数方法 ---');
175
+ const updateResult = await exampleService.updateUser(789, {
176
+ name: '李四',
177
+ email: 'lisi@example.com',
178
+ preferences: { theme: 'dark', language: 'zh-CN' }
179
+ });
180
+ logger.info('更新方法结果:', updateResult);
181
+
182
+ // 测试批量操作
183
+ logger.info('\n--- 测试批量操作方法 ---');
184
+ const batchResult = await exampleService.batchCreateUsers([
185
+ { name: '王五', email: 'wangwu@example.com', password: 'pass123' },
186
+ { name: '赵六', email: 'zhaoliu@example.com', password: 'pass456' },
187
+ { name: '钱七', email: 'qianqi@example.com', password: 'pass789' }
188
+ ]);
189
+ logger.info('批量操作结果:', batchResult);
190
+
191
+ logger.info('\n=== Service调用拦截器示例完成 ===');
192
+
193
+ } catch (error) {
194
+ logger.error('运行拦截器示例失败:', error as Error);
195
+ }
196
+ }
197
+
198
+ /**
199
+ * 显示拦截器统计信息
200
+ */
201
+ static showInterceptorStats() {
202
+ const { serviceCallInterceptor } = require('@src/framework/interceptors/ServiceCallInterceptor');
203
+
204
+ logger.info('\n=== 拦截器统计信息 ===');
205
+ logger.info(serviceCallInterceptor.generateReport());
206
+
207
+ logger.info('\n=== 最近调用历史 ===');
208
+ const history = serviceCallInterceptor.getCallHistory();
209
+ history.slice(-5).forEach((call: any, index: number) => {
210
+ logger.info(`${index + 1}. ${call.serviceName}.${call.methodName} - ${call.duration}ms - ${call.error ? '失败' : '成功'}`);
211
+ });
212
+ }
213
+ }
214
+