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,99 @@
1
+ /**
2
+ * 装饰器系统重构方案
3
+ * 统一装饰器接口和实现
4
+ */
5
+
6
+ // 1. 基础装饰器接口
7
+ export interface BaseDecorator {
8
+ readonly name: string;
9
+ readonly type: 'method' | 'parameter' | 'class';
10
+ }
11
+
12
+ // 2. HTTP方法装饰器接口
13
+ export interface HttpMethodDecorator extends BaseDecorator {
14
+ readonly type: 'method';
15
+ readonly httpMethod: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'ALL';
16
+ }
17
+
18
+ // 3. 参数装饰器接口
19
+ export interface ParameterDecorator extends BaseDecorator {
20
+ readonly type: 'parameter';
21
+ readonly parameterType: 'Body' | 'Query' | 'Params' | 'Headers' | 'State';
22
+ }
23
+
24
+ // 4. 统一的装饰器工厂
25
+ export class DecoratorFactory {
26
+ /**
27
+ * 创建HTTP方法装饰器
28
+ */
29
+ static createHttpMethodDecorator(
30
+ httpMethod: HttpMethodDecorator['httpMethod'],
31
+ url?: string
32
+ ): MethodDecorator {
33
+ return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
34
+ const methodName = String(propertyKey);
35
+ const metadataKey = `$_${httpMethod}Methods`;
36
+
37
+ if (!target[metadataKey]) {
38
+ target[metadataKey] = new Set();
39
+ }
40
+
41
+ target[metadataKey].add({
42
+ methodName,
43
+ url: url ?? methodName
44
+ });
45
+
46
+ return descriptor;
47
+ };
48
+ }
49
+
50
+ /**
51
+ * 创建参数装饰器
52
+ */
53
+ static createParameterDecorator(
54
+ parameterType: ParameterDecorator['parameterType'],
55
+ validate?: any
56
+ ): (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => void {
57
+ return (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => {
58
+ const methodName = String(propertyKey);
59
+ const metadataKey = '$_MethodsParamInfo';
60
+
61
+ if (!target[metadataKey]) {
62
+ target[metadataKey] = new Map<string, ParameterInfo[]>();
63
+ }
64
+
65
+ let paramsInfo = target[metadataKey].get(methodName) ?? [];
66
+ paramsInfo[parameterIndex] = {
67
+ type: parameterType,
68
+ validate
69
+ };
70
+
71
+ target[metadataKey].set(methodName, paramsInfo);
72
+ };
73
+ }
74
+ }
75
+
76
+ // 5. 类型定义
77
+ export interface ParameterInfo {
78
+ type: ParameterDecorator['parameterType'];
79
+ validate?: any;
80
+ }
81
+
82
+ export interface MethodInfo {
83
+ methodName: string;
84
+ url: string;
85
+ }
86
+
87
+ // 6. 统一的装饰器导出
88
+ export const Get = (url?: string) => DecoratorFactory.createHttpMethodDecorator('GET', url);
89
+ export const Post = (url?: string) => DecoratorFactory.createHttpMethodDecorator('POST', url);
90
+ export const Put = (url?: string) => DecoratorFactory.createHttpMethodDecorator('PUT', url);
91
+ export const Delete = (url?: string) => DecoratorFactory.createHttpMethodDecorator('DELETE', url);
92
+ export const Patch = (url?: string) => DecoratorFactory.createHttpMethodDecorator('PATCH', url);
93
+ export const All = (url?: string) => DecoratorFactory.createHttpMethodDecorator('ALL', url);
94
+
95
+ export const Body = (validate?: any) => DecoratorFactory.createParameterDecorator('Body', validate);
96
+ export const Query = (validate?: any) => DecoratorFactory.createParameterDecorator('Query', validate);
97
+ export const Params = (validate?: any) => DecoratorFactory.createParameterDecorator('Params', validate);
98
+ export const Headers = (validate?: any) => DecoratorFactory.createParameterDecorator('Headers', validate);
99
+ export const State = (validate?: any) => DecoratorFactory.createParameterDecorator('State', validate);
@@ -0,0 +1,125 @@
1
+ /**
2
+ * 装饰器元数据管理器
3
+ * 统一管理所有装饰器的元数据
4
+ */
5
+
6
+ export class DecoratorMetadataManager {
7
+ private static readonly METADATA_KEYS = {
8
+ HTTP_METHODS: '$_HttpMethods',
9
+ PARAMETERS: '$_Parameters',
10
+ RESPONSE_CODE: '$_ResponseCode',
11
+ RESPONSE_HEADER: '$_ResponseHeader',
12
+ RESPONSE_VALIDATOR: '$_ResponseValidator',
13
+ CONTROLLER_CACHE: '$_ControllerCache',
14
+ TRANSFORM: '$_Transform',
15
+ ANNOTATIONS: '$_Annotations'
16
+ } as const;
17
+
18
+ /**
19
+ * 获取HTTP方法元数据
20
+ */
21
+ static getHttpMethods(target: any): Map<string, MethodInfo[]> {
22
+ return target[this.METADATA_KEYS.HTTP_METHODS] || new Map();
23
+ }
24
+
25
+ /**
26
+ * 设置HTTP方法元数据
27
+ */
28
+ static setHttpMethod(
29
+ target: any,
30
+ methodName: string,
31
+ httpMethod: string,
32
+ url: string
33
+ ): void {
34
+ if (!target[this.METADATA_KEYS.HTTP_METHODS]) {
35
+ target[this.METADATA_KEYS.HTTP_METHODS] = new Map();
36
+ }
37
+
38
+ const methods = target[this.METADATA_KEYS.HTTP_METHODS];
39
+ if (!methods.has(methodName)) {
40
+ methods.set(methodName, []);
41
+ }
42
+
43
+ methods.get(methodName).push({ httpMethod, url });
44
+ }
45
+
46
+ /**
47
+ * 获取参数元数据
48
+ */
49
+ static getParameters(target: any, methodName: string): ParameterInfo[] {
50
+ const params = target[this.METADATA_KEYS.PARAMETERS];
51
+ return params?.get(methodName) || [];
52
+ }
53
+
54
+ /**
55
+ * 设置参数元数据
56
+ */
57
+ static setParameter(
58
+ target: any,
59
+ methodName: string,
60
+ index: number,
61
+ parameterInfo: ParameterInfo
62
+ ): void {
63
+ if (!target[this.METADATA_KEYS.PARAMETERS]) {
64
+ target[this.METADATA_KEYS.PARAMETERS] = new Map();
65
+ }
66
+
67
+ const params = target[this.METADATA_KEYS.PARAMETERS];
68
+ if (!params.has(methodName)) {
69
+ params.set(methodName, []);
70
+ }
71
+
72
+ const methodParams = params.get(methodName);
73
+ methodParams[index] = parameterInfo;
74
+ }
75
+
76
+ /**
77
+ * 获取注解元数据
78
+ */
79
+ static getAnnotations(target: any, methodName: string): Map<string, any> {
80
+ const annotations = target[this.METADATA_KEYS.ANNOTATIONS];
81
+ return annotations?.get(methodName) || new Map();
82
+ }
83
+
84
+ /**
85
+ * 设置注解元数据
86
+ */
87
+ static setAnnotation(
88
+ target: any,
89
+ methodName: string,
90
+ processorName: string,
91
+ data: any
92
+ ): void {
93
+ if (!target[this.METADATA_KEYS.ANNOTATIONS]) {
94
+ target[this.METADATA_KEYS.ANNOTATIONS] = new Map();
95
+ }
96
+
97
+ const annotations = target[this.METADATA_KEYS.ANNOTATIONS];
98
+ if (!annotations.has(methodName)) {
99
+ annotations.set(methodName, new Map());
100
+ }
101
+
102
+ annotations.get(methodName).set(processorName, data);
103
+ }
104
+
105
+ /**
106
+ * 清理元数据
107
+ */
108
+ static clear(target: any): void {
109
+ Object.values(this.METADATA_KEYS).forEach(key => {
110
+ delete target[key];
111
+ });
112
+ }
113
+ }
114
+
115
+ export interface MethodInfo {
116
+ httpMethod: string;
117
+ url: string;
118
+ }
119
+
120
+ export interface ParameterInfo {
121
+ type: 'Body' | 'Query' | 'Params' | 'Headers' | 'State';
122
+ validate?: any;
123
+ required?: boolean;
124
+ defaultValue?: any;
125
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * 装饰器验证系统
3
+ * 提供装饰器配置的验证和错误检查
4
+ */
5
+
6
+ import { DecoratorMetadataManager } from '@src/framework/decorator/refactored/DecoratorMetadataManager';
7
+
8
+ export class DecoratorValidator {
9
+ /**
10
+ * 验证控制器装饰器配置
11
+ */
12
+ static validateController(target: any): ValidationResult {
13
+ const errors: string[] = [];
14
+ const warnings: string[] = [];
15
+
16
+ // 检查HTTP方法装饰器
17
+ const httpMethods = DecoratorMetadataManager.getHttpMethods(target);
18
+ if (httpMethods.size === 0) {
19
+ warnings.push('控制器没有定义任何HTTP方法');
20
+ }
21
+
22
+ // 检查重复的URL
23
+ const urlMap = new Map<string, string[]>();
24
+ httpMethods.forEach((methods, methodName) => {
25
+ methods.forEach(method => {
26
+ const key = `${method.httpMethod}:${method.url}`;
27
+ if (!urlMap.has(key)) {
28
+ urlMap.set(key, []);
29
+ }
30
+ urlMap.get(key)!.push(methodName);
31
+ });
32
+ });
33
+
34
+ urlMap.forEach((methods, url) => {
35
+ if (methods.length > 1) {
36
+ errors.push(`URL冲突: ${url} 被多个方法使用: ${methods.join(', ')}`);
37
+ }
38
+ });
39
+
40
+ return {
41
+ isValid: errors.length === 0,
42
+ errors,
43
+ warnings
44
+ };
45
+ }
46
+
47
+ /**
48
+ * 验证方法装饰器配置
49
+ */
50
+ static validateMethod(target: any, methodName: string): ValidationResult {
51
+ const errors: string[] = [];
52
+ const warnings: string[] = [];
53
+
54
+ // 检查参数装饰器
55
+ const parameters = DecoratorMetadataManager.getParameters(target, methodName);
56
+ const gaps = parameters.findIndex((param, index) => param === undefined);
57
+ if (gaps !== -1) {
58
+ errors.push(`方法 ${methodName} 的参数装饰器存在间隙,索引 ${gaps} 未定义`);
59
+ }
60
+
61
+ // 检查注解装饰器
62
+ const annotations = DecoratorMetadataManager.getAnnotations(target, methodName);
63
+ if (annotations.size === 0) {
64
+ warnings.push(`方法 ${methodName} 没有使用任何注解装饰器`);
65
+ }
66
+
67
+ return {
68
+ isValid: errors.length === 0,
69
+ errors,
70
+ warnings
71
+ };
72
+ }
73
+
74
+ /**
75
+ * 验证整个控制器类
76
+ */
77
+ static validateClass(target: any): ValidationResult {
78
+ const errors: string[] = [];
79
+ const warnings: string[] = [];
80
+
81
+ // 验证控制器级别
82
+ const controllerResult = this.validateController(target);
83
+ errors.push(...controllerResult.errors);
84
+ warnings.push(...controllerResult.warnings);
85
+
86
+ // 验证所有方法
87
+ const methods = Object.getOwnPropertyNames(target.prototype)
88
+ .filter(name => name !== 'constructor' && typeof target.prototype[name] === 'function');
89
+
90
+ methods.forEach(methodName => {
91
+ const methodResult = this.validateMethod(target, methodName);
92
+ errors.push(...methodResult.errors);
93
+ warnings.push(...methodResult.warnings);
94
+ });
95
+
96
+ return {
97
+ isValid: errors.length === 0,
98
+ errors,
99
+ warnings
100
+ };
101
+ }
102
+ }
103
+
104
+ export interface ValidationResult {
105
+ isValid: boolean;
106
+ errors: string[];
107
+ warnings: string[];
108
+ }
109
+
110
+ /**
111
+ * 装饰器验证装饰器
112
+ * 在类加载时自动验证装饰器配置
113
+ */
114
+ export function ValidateDecorators(): ClassDecorator {
115
+ return (target: any) => {
116
+ const result = DecoratorValidator.validateClass(target);
117
+
118
+ if (!result.isValid) {
119
+ console.error(`装饰器验证失败 - ${target.name}:`, result.errors);
120
+ }
121
+
122
+ if (result.warnings.length > 0) {
123
+ console.warn(`装饰器验证警告 - ${target.name}:`, result.warnings);
124
+ }
125
+
126
+ return target;
127
+ };
128
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * 类型安全的装饰器系统
3
+ * 提供完整的类型支持和智能提示
4
+ */
5
+
6
+ import { DecoratorMetadataManager, ParameterInfo } from '@src/framework/decorator/refactored/DecoratorMetadataManager';
7
+
8
+ // 1. 类型定义
9
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'ALL';
10
+ export type ParameterType = 'Body' | 'Query' | 'Params' | 'Headers' | 'State';
11
+
12
+ // 2. 装饰器配置接口
13
+ export interface HttpMethodConfig {
14
+ url?: string;
15
+ middleware?: any[];
16
+ }
17
+
18
+ export interface ParameterConfig {
19
+ validate?: any;
20
+ required?: boolean;
21
+ defaultValue?: any;
22
+ }
23
+
24
+ // 3. 类型安全的HTTP方法装饰器
25
+ export function createHttpMethodDecorator<T extends HttpMethod>(
26
+ method: T,
27
+ config?: HttpMethodConfig
28
+ ): MethodDecorator {
29
+ return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
30
+ const methodName = String(propertyKey);
31
+ // HTTP方法装饰器的 target 是类的构造函数
32
+ const metadataKey = `$_${method}Methods`;
33
+
34
+ if (!target[metadataKey]) {
35
+ target[metadataKey] = new Set();
36
+ }
37
+
38
+ target[metadataKey].add({
39
+ methodName,
40
+ url: config?.url ?? methodName
41
+ });
42
+
43
+ console.log(`装饰器执行: ${method} ${methodName} -> ${config?.url ?? methodName}`);
44
+
45
+ return descriptor;
46
+ };
47
+ }
48
+
49
+ // 4. 类型安全的参数装饰器
50
+ export function createParameterDecorator<T extends ParameterType>(
51
+ type: T,
52
+ config?: ParameterConfig
53
+ ): (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => void {
54
+ return (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => {
55
+ const methodName = String(propertyKey);
56
+ // 参数装饰器的 target 是类的构造函数
57
+ const metadataKey = '$_MethodsParamInfo';
58
+
59
+ if (!target[metadataKey]) {
60
+ target[metadataKey] = new Map<string, ParameterInfo[]>();
61
+ }
62
+
63
+ let paramsInfo = target[metadataKey].get(methodName) ?? [];
64
+ paramsInfo[parameterIndex] = {
65
+ type,
66
+ validate: config?.validate,
67
+ required: config?.required ?? true,
68
+ defaultValue: config?.defaultValue
69
+ };
70
+
71
+ target[metadataKey].set(methodName, paramsInfo);
72
+
73
+ console.log(`参数装饰器执行: ${type} ${methodName}[${parameterIndex}]`);
74
+ };
75
+ }
76
+
77
+ // 5. 导出的装饰器(类型安全)
78
+ export const Get = (config?: HttpMethodConfig) => createHttpMethodDecorator('GET', config);
79
+ export const Post = (config?: HttpMethodConfig) => createHttpMethodDecorator('POST', config);
80
+ export const Put = (config?: HttpMethodConfig) => createHttpMethodDecorator('PUT', config);
81
+ export const Delete = (config?: HttpMethodConfig) => createHttpMethodDecorator('DELETE', config);
82
+ export const Patch = (config?: HttpMethodConfig) => createHttpMethodDecorator('PATCH', config);
83
+ export const All = (config?: HttpMethodConfig) => createHttpMethodDecorator('ALL', config);
84
+
85
+ export const Body = (config?: ParameterConfig) => createParameterDecorator('Body', config);
86
+ export const Query = (config?: ParameterConfig) => createParameterDecorator('Query', config);
87
+ export const Params = (config?: ParameterConfig) => createParameterDecorator('Params', config);
88
+ export const Headers = (config?: ParameterConfig) => createParameterDecorator('Headers', config);
89
+ export const State = (config?: ParameterConfig) => createParameterDecorator('State', config);
90
+
91
+ // 6. 高级装饰器
92
+ export function ResponseCode(code: number = 200): MethodDecorator {
93
+ return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
94
+ const methodName = String(propertyKey);
95
+ if (!target.$_ResponseCode) {
96
+ target.$_ResponseCode = new Map<string, number>();
97
+ }
98
+ target.$_ResponseCode.set(methodName, code);
99
+ return descriptor;
100
+ };
101
+ }
102
+
103
+ export function ResponseHeader(type: string, value: any): MethodDecorator {
104
+ return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
105
+ const methodName = String(propertyKey);
106
+ if (!target.$_ResponseHeader) {
107
+ target.$_ResponseHeader = new Map<string, Map<string, any>>();
108
+ }
109
+
110
+ let headerMap = target.$_ResponseHeader.get(methodName);
111
+ if (!headerMap) {
112
+ headerMap = new Map<string, any>();
113
+ }
114
+ headerMap.set(type, value);
115
+ target.$_ResponseHeader.set(methodName, headerMap);
116
+
117
+ return descriptor;
118
+ };
119
+ }
120
+
121
+ export function ControllerCache(
122
+ cacheKeyFn: (...params: any[]) => string,
123
+ options: {
124
+ ttl: number | { max: number; min: number };
125
+ enable?: boolean;
126
+ } = { ttl: 20, enable: true }
127
+ ): MethodDecorator {
128
+ return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
129
+ const methodName = String(propertyKey);
130
+ if (!target.$_ControllerCache) {
131
+ target.$_ControllerCache = new Map<string, any>();
132
+ }
133
+ target.$_ControllerCache.set(methodName, {
134
+ cacheKeyFn,
135
+ options
136
+ });
137
+ return descriptor;
138
+ };
139
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * 统一的装饰器导出文件
3
+ * 重构后的装饰器系统入口
4
+ */
5
+
6
+ // 1. 核心装饰器
7
+ export {
8
+ Get,
9
+ Post,
10
+ Put,
11
+ Delete,
12
+ Patch,
13
+ All,
14
+ Body,
15
+ Query,
16
+ Params,
17
+ Headers,
18
+ State,
19
+ ResponseCode,
20
+ ResponseHeader,
21
+ ControllerCache
22
+ } from './TypeSafeDecorators';
23
+
24
+ // 2. 元数据管理
25
+ export { DecoratorMetadataManager } from './DecoratorMetadataManager';
26
+
27
+ // 3. 验证系统
28
+ export { DecoratorValidator, ValidateDecorators } from './DecoratorValidator';
29
+
30
+ // 4. 类型定义
31
+ export type {
32
+ HttpMethod,
33
+ ParameterType,
34
+ HttpMethodConfig,
35
+ ParameterConfig
36
+ } from './TypeSafeDecorators';
37
+
38
+ export type {
39
+ MethodInfo,
40
+ ParameterInfo
41
+ } from './DecoratorMetadataManager';
42
+
43
+ export type {
44
+ ValidationResult
45
+ } from './DecoratorValidator';
46
+
47
+ // 5. 兼容性导出(保持向后兼容)
48
+ export {
49
+ // 保持原有的导出名称
50
+ Get as GetDecorator,
51
+ Post as PostDecorator,
52
+ Put as PutDecorator,
53
+ Delete as DeleteDecorator,
54
+ Body as BodyDecorator,
55
+ Query as QueryDecorator,
56
+ Params as ParamsDecorator,
57
+ Headers as HeadersDecorator,
58
+ State as StateDecorator
59
+ } from './TypeSafeDecorators';
60
+
61
+ // 6. 工具函数
62
+ import { DecoratorMetadataManager } from '@src/framework/decorator/refactored/DecoratorMetadataManager';
63
+ import { DecoratorValidator } from '@src/framework/decorator/refactored/DecoratorValidator';
64
+
65
+ export const DecoratorUtils = {
66
+ /**
67
+ * 获取控制器的所有HTTP方法
68
+ */
69
+ getHttpMethods: (target: any) => DecoratorMetadataManager.getHttpMethods(target),
70
+
71
+ /**
72
+ * 获取方法的参数信息
73
+ */
74
+ getMethodParameters: (target: any, methodName: string) =>
75
+ DecoratorMetadataManager.getParameters(target, methodName),
76
+
77
+ /**
78
+ * 获取方法的注解信息
79
+ */
80
+ getMethodAnnotations: (target: any, methodName: string) =>
81
+ DecoratorMetadataManager.getAnnotations(target, methodName),
82
+
83
+ /**
84
+ * 验证控制器装饰器配置
85
+ */
86
+ validateController: (target: any) => DecoratorValidator.validateController(target),
87
+
88
+ /**
89
+ * 验证方法装饰器配置
90
+ */
91
+ validateMethod: (target: any, methodName: string) =>
92
+ DecoratorValidator.validateMethod(target, methodName),
93
+
94
+ /**
95
+ * 清理装饰器元数据
96
+ */
97
+ clearMetadata: (target: any) => DecoratorMetadataManager.clear(target)
98
+ };