create-dp-koa 1.1.2 → 1.1.4
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.
- package/package.json +1 -1
- package/template/.cursor/rules/00-backend-core.skill.md +1 -1
- package/template/.cursor/rules/01-backend-skill-router.skill.md +8 -2
- package/template/.cursor/rules/10-backend-api.skill.md +8 -0
- package/template/.cursor/rules/11-backend-controller-recipes.skill.md +12 -9
- package/template/.cursor/rules/21-backend-service.skill.md +14 -0
- package/template/.cursor/rules/30-backend-validation.skill.md +1 -1
- package/template/.cursor/rules/40-backend-error-logging.skill.md +9 -5
- package/template/.cursor/rules/50-backend-bootstrap-lifecycle.skill.md +4 -4
- package/template/.cursor/rules/60-backend-router-registration.skill.md +16 -6
- package/template/.cursor/rules/70-backend-middleware.skill.md +2 -2
- package/template/.cursor/rules/80-backend-utils-and-libs.skill.md +71 -14
- package/template/.cursor/rules/85-backend-plugins.rule.md +4 -4
- package/template/.cursor/rules/90-backend-testing.skill.md +26 -0
- package/template/.cursor/rules/README.md +2 -2
- package/template/.trae/skills/11-backend-controller-recipes.skill.md +12 -9
- package/template/.trae/skills/21-backend-service.skill.md +15 -1
- package/template/.trae/skills/40-backend-error-logging.skill.md +9 -5
- package/template/.trae/skills/80-backend-utils-and-libs.skill.md +77 -8
- package/template/.trae/skills/90-backend-testing.skill.md +26 -0
- package/template/scripts/sync-template.mjs +20 -0
- package/template/src/app.ts +1 -2
- package/template/src/{framework/plugins → plugins}/registry.ts +2 -2
- package/template/src/plugins/weboffice/http/routes.ts +1 -1
- package/template/src/plugins/weboffice/index.ts +3 -3
- package/template/src/plugins/weboffice/services/webofficeCallback.service.ts +3 -4
- package/template/src/types/ctxState.ts +9 -0
- package/template/src/utils/testDataInitializer.ts +1 -1
- package/template/tsconfig.json +6 -0
- package/template/src/annotations/decorators/ConfigManagement.ts +0 -9
- package/template/src/annotations/decorators/DistributedTracing.ts +0 -9
- package/template/src/annotations/decorators/EnterprisePerformance.ts +0 -9
- package/template/src/annotations/decorators/PerformanceMonitor.ts +0 -32
- package/template/src/annotations/decorators/SecurityAudit.ts +0 -9
- package/template/src/annotations/index.ts +0 -50
- package/template/src/annotations/processors/ConfigManagementProcessor.ts +0 -369
- package/template/src/annotations/processors/DistributedTracingProcessor.ts +0 -288
- package/template/src/annotations/processors/EnterprisePerformanceProcessor.ts +0 -189
- package/template/src/annotations/processors/PerformanceMonitorProcessor.ts +0 -101
- package/template/src/annotations/processors/SecurityAuditProcessor.ts +0 -345
- package/template/src/annotations/processors/SwaggerProcessor.ts +0 -612
- package/template/src/annotations/processors/index.ts +0 -10
- package/template/src/examples/InterceptorExampleRunner.ts +0 -284
- package/template/src/examples/ServiceInterceptorExample.ts +0 -214
- package/template/src/examples/cacheExamples.ts +0 -155
- package/template/src/framework/decorator/controller.ts +0 -311
- package/template/src/framework/decorator/processor/AnnotationDecorators.ts +0 -100
- package/template/src/framework/decorator/processor/AnnotationProcessor.ts +0 -160
- package/template/src/framework/decorator/processor/AnnotationProcessorConfig.ts +0 -45
- package/template/src/framework/decorator/processor/AnnotationRegistry.ts +0 -117
- package/template/src/framework/decorator/processor/AnnotationSystemInitializer.ts +0 -95
- package/template/src/framework/decorator/processor/ProcessorManager.ts +0 -76
- package/template/src/framework/decorator/processor/processors/CustomProcessors.ts +0 -126
- package/template/src/framework/decorator/processor/processors/DefaultProcessors.ts +0 -207
- package/template/src/framework/decorator/refactored/DecoratorFactory.ts +0 -99
- package/template/src/framework/decorator/refactored/DecoratorMetadataManager.ts +0 -125
- package/template/src/framework/decorator/refactored/DecoratorValidator.ts +0 -128
- package/template/src/framework/decorator/refactored/TypeSafeDecorators.ts +0 -139
- package/template/src/framework/decorator/refactored/index.ts +0 -98
- package/template/src/framework/decorator/swagger.ts +0 -150
- package/template/src/framework/interceptors/AdvancedServiceCallInterceptor.ts +0 -375
- package/template/src/framework/interceptors/ServiceCallInterceptor.ts +0 -348
- package/template/src/framework/interceptors/index.ts +0 -19
- package/template/src/framework/plugins/types.ts +0 -15
- package/template/src/framework/types/ServiceResult.ts +0 -151
- package/template/src/framework/types/index.ts +0 -16
- package/template/src/framework/utils/CacheManager.ts +0 -430
- package/template/src/framework/utils/CacheService.ts +0 -248
- package/template/src/framework/utils/DtoValidator.ts +0 -164
- package/template/src/framework/utils/MigrationHelper.ts +0 -179
- package/template/src/framework/utils/MigrationManager.ts +0 -256
- package/template/src/framework/utils/NewRouter.ts +0 -207
- package/template/src/framework/utils/TransactionManager.ts +0 -172
- package/template/src/framework/utils/bootstrap.ts +0 -445
- package/template/src/framework/utils/cache.ts +0 -269
- package/template/src/framework/utils/databaseConfig.ts +0 -148
- package/template/src/framework/utils/db.ts +0 -39
- package/template/src/framework/utils/dbMonitor.ts +0 -106
- package/template/src/framework/utils/function.ts +0 -61
- package/template/src/framework/utils/gracefulShutdown.ts +0 -131
- package/template/src/framework/utils/logger.ts +0 -388
- package/template/src/framework/utils/metrics.ts +0 -182
- package/template/src/framework/utils/router.ts +0 -417
- package/template/src/framework/utils/swagger.ts +0 -184
- package/template/src/framework/utils/testDb.ts +0 -19
- package/template/src/framework/utils/token.ts +0 -23
- package/template/src/framework/utils/transform.ts +0 -17
- package/template/src/libs/aokEmailSender.ts +0 -42
- package/template/src/libs/captcha.ts +0 -37
- package/template/src/libs/cos.ts +0 -45
- package/template/src/libs/mCache.ts +0 -7
- package/template/src/libs/serviceValidate.ts +0 -3
- package/template/src/libs/tecentSms.ts +0 -51
- package/template/src/middlewares/a.middleware.ts +0 -6
- package/template/src/middlewares/error.middleware.ts +0 -14
- package/template/src/middlewares/logging.middleware.ts +0 -187
- package/template/src/middlewares/static.middleware.ts +0 -79
- package/template/src/middlewares/swagger.middleware.ts +0 -70
- package/template/src/middlewares/token.middleware.ts +0 -32
- package/template/src/migrations/1700000000000-InitialDatabaseStructure.ts +0 -172
- package/template/src/migrations/index.ts +0 -6
- package/template/src/repository/base/BaseRepository.ts +0 -124
- package/template/src/repository/interfaces/IBaseRepository.ts +0 -67
- package/template/src/service/base.service.ts +0 -116
|
@@ -1,284 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,214 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 缓存使用示例
|
|
3
|
-
* 展示如何使用统一的缓存管理系统
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { createCache, CacheType, getCacheStats, getCacheMemoryUsage } from '@src/framework/utils/cache';
|
|
7
|
-
|
|
8
|
-
// 示例1: 创建不同类型的缓存
|
|
9
|
-
export class CacheExamples {
|
|
10
|
-
|
|
11
|
-
// 创建用户缓存
|
|
12
|
-
private userCache = createCache('user-cache', CacheType.USER);
|
|
13
|
-
|
|
14
|
-
// 创建会话缓存
|
|
15
|
-
private sessionCache = createCache('session-cache', CacheType.SESSION);
|
|
16
|
-
|
|
17
|
-
// 创建验证码缓存
|
|
18
|
-
private captchaCache = createCache('captcha-cache', CacheType.CAPTCHA);
|
|
19
|
-
|
|
20
|
-
// 创建临时缓存
|
|
21
|
-
private tempCache = createCache('temp-cache', CacheType.TEMP);
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* 用户缓存示例
|
|
25
|
-
*/
|
|
26
|
-
async getUserInfo(userId: string) {
|
|
27
|
-
const cacheKey = `user:${userId}`;
|
|
28
|
-
|
|
29
|
-
// 尝试从缓存获取
|
|
30
|
-
let userInfo = this.userCache.get(cacheKey);
|
|
31
|
-
|
|
32
|
-
if (!userInfo) {
|
|
33
|
-
// 缓存未命中,从数据库获取
|
|
34
|
-
userInfo = await this.fetchUserFromDatabase(userId);
|
|
35
|
-
|
|
36
|
-
// 存储到缓存,30分钟过期
|
|
37
|
-
this.userCache.set(cacheKey, userInfo, 1800);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return userInfo;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* 会话缓存示例
|
|
45
|
-
*/
|
|
46
|
-
async getSession(sessionId: string) {
|
|
47
|
-
const cacheKey = `session:${sessionId}`;
|
|
48
|
-
|
|
49
|
-
let session = this.sessionCache.get(cacheKey);
|
|
50
|
-
|
|
51
|
-
if (!session) {
|
|
52
|
-
session = await this.fetchSessionFromDatabase(sessionId);
|
|
53
|
-
if (session) {
|
|
54
|
-
// 会话缓存1小时过期
|
|
55
|
-
this.sessionCache.set(cacheKey, session, 3600);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return session;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* 验证码缓存示例
|
|
64
|
-
*/
|
|
65
|
-
async storeCaptcha(token: string, code: string) {
|
|
66
|
-
const cacheKey = `captcha:${token}`;
|
|
67
|
-
|
|
68
|
-
// 验证码5分钟过期
|
|
69
|
-
this.captchaCache.set(cacheKey, code, 300);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async verifyCaptcha(token: string, inputCode: string): Promise<boolean> {
|
|
73
|
-
const cacheKey = `captcha:${token}`;
|
|
74
|
-
const storedCode = this.captchaCache.get(cacheKey);
|
|
75
|
-
|
|
76
|
-
if (!storedCode) {
|
|
77
|
-
return false; // 验证码不存在或已过期
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const isValid = storedCode === inputCode;
|
|
81
|
-
|
|
82
|
-
if (isValid) {
|
|
83
|
-
// 验证成功后删除验证码
|
|
84
|
-
this.captchaCache.del(cacheKey);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return isValid;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* 临时缓存示例(用于API限流等)
|
|
92
|
-
*/
|
|
93
|
-
async checkRateLimit(ip: string): Promise<boolean> {
|
|
94
|
-
const cacheKey = `rate_limit:${ip}`;
|
|
95
|
-
const count = this.tempCache.get(cacheKey) || 0;
|
|
96
|
-
|
|
97
|
-
if (count >= 10) { // 每分钟最多10次请求
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// 增加计数,1分钟过期
|
|
102
|
-
this.tempCache.set(cacheKey, count + 1, 60);
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* 获取缓存统计信息
|
|
108
|
-
*/
|
|
109
|
-
getCacheStatistics() {
|
|
110
|
-
return {
|
|
111
|
-
stats: getCacheStats(),
|
|
112
|
-
memory: getCacheMemoryUsage()
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// 模拟数据库查询方法
|
|
117
|
-
private async fetchUserFromDatabase(userId: string) {
|
|
118
|
-
// 模拟数据库查询
|
|
119
|
-
return { id: userId, name: `User ${userId}`, email: `${userId}@example.com` };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
private async fetchSessionFromDatabase(sessionId: string) {
|
|
123
|
-
// 模拟数据库查询
|
|
124
|
-
return { id: sessionId, userId: '123', expiresAt: new Date() };
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* 缓存配置示例
|
|
130
|
-
* 展示如何为特定场景创建自定义配置的缓存
|
|
131
|
-
*/
|
|
132
|
-
export class CustomCacheExamples {
|
|
133
|
-
|
|
134
|
-
// 创建高频率访问的缓存(更多条目,更短过期时间)
|
|
135
|
-
private highFrequencyCache = createCache('high-freq', CacheType.CONTROLLER, {
|
|
136
|
-
stdTTL: 30, // 30秒过期
|
|
137
|
-
maxKeys: 5000, // 最多5000个条目
|
|
138
|
-
checkperiod: 60 // 每分钟检查过期
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// 创建长期存储的缓存(更少条目,更长过期时间)
|
|
142
|
-
private longTermCache = createCache('long-term', CacheType.USER, {
|
|
143
|
-
stdTTL: 7200, // 2小时过期
|
|
144
|
-
maxKeys: 100, // 最多100个条目
|
|
145
|
-
checkperiod: 300 // 每5分钟检查过期
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
// 创建严格限制的缓存(用于敏感数据)
|
|
149
|
-
private strictCache = createCache('strict', CacheType.CAPTCHA, {
|
|
150
|
-
stdTTL: 60, // 1分钟过期
|
|
151
|
-
maxKeys: 50, // 最多50个条目
|
|
152
|
-
useClones: true, // 使用克隆模式,确保数据安全
|
|
153
|
-
deleteOnExpire: true // 严格删除过期数据
|
|
154
|
-
});
|
|
155
|
-
}
|