create-dp-koa 1.0.1 → 1.1.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 (74) hide show
  1. package/package.json +1 -1
  2. package/template/.cursor/commands/cheatsheet-backend-controller.md +2 -2
  3. package/template/.cursor/commands/implement-backend-api-controller.md +6 -4
  4. package/template/.cursor/rules/11-backend-controller-recipes.skill.md +89 -10
  5. package/template/.trae/skills/11-backend-controller-recipes.skill.md +91 -10
  6. package/template/docs/FRAMEWORK_V2_UPGRADE_GUIDE.md +134 -0
  7. package/template/package.json +2 -0
  8. package/template/scripts/sync-template.mjs +39 -1
  9. package/template/src/app.ts +21 -16
  10. package/template/src/controllers/demo/AnnotationDemoController.ts +1 -3
  11. package/template/src/controllers/example/EnterpriseExampleController.ts +2 -9
  12. package/template/src/controllers/example/ExampleController.ts +13 -4
  13. package/template/src/entity/index.ts +1 -15
  14. package/template/src/framework/decorator/processor/AnnotationProcessor.ts +5 -1
  15. package/template/src/routers/index.ts +1 -37
  16. package/template/src/utils/testDataInitializer.ts +2 -269
  17. package/template/test/controllers/example/ExampleController.test.ts +29 -31
  18. package/template/test/framework/annotation/AnnotationDecorators.test.ts +15 -15
  19. package/template/test/framework/annotation/AnnotationExecutor.test.ts +27 -32
  20. package/template/test/framework/annotation/AnnotationProcessor.test.ts +25 -24
  21. package/template/test/framework/annotation/CustomProcessors.test.ts +15 -25
  22. package/template/test/framework/annotation/NewRouter.test.ts +9 -7
  23. package/template/test/framework/annotation/ProcessorManager.test.ts +14 -27
  24. package/template/test/framework/databaseConfig.test.ts +2 -2
  25. package/template/test/integration/integration.test.ts +15 -72
  26. package/template/webpack.config.js +2 -0
  27. package/template/package-lock.json +0 -13240
  28. package/template/src/controllers/cacheManagement.controller.ts +0 -131
  29. package/template/src/controllers/captcha.controller.ts +0 -57
  30. package/template/src/controllers/example/NewAnnotationExampleController.ts +0 -159
  31. package/template/src/controllers/example/SwaggerExampleController.ts +0 -205
  32. package/template/src/controllers/example/TransactionExample.controller.ts +0 -336
  33. package/template/src/controllers/health.controller.ts +0 -235
  34. package/template/src/controllers/home/register.controller.ts +0 -58
  35. package/template/src/controllers/home/ytGoods.controller.ts +0 -92
  36. package/template/src/controllers/home/ytShop.controller.ts +0 -135
  37. package/template/src/controllers/home/ytUser.controller.ts +0 -89
  38. package/template/src/controllers/logManagement.controller.ts +0 -396
  39. package/template/src/controllers/public/emailSend.controller.ts +0 -65
  40. package/template/src/controllers/public/ytUserAuth.controller.ts +0 -174
  41. package/template/src/controllers/testData.controller.ts +0 -253
  42. package/template/src/dto/controller/example/NewAnnotationExampleController.dto.ts +0 -73
  43. package/template/src/dto/controller/home/emailSend.controller.dto.ts +0 -40
  44. package/template/src/dto/controller/home/register.controller.dto.ts +0 -45
  45. package/template/src/dto/controller/home/ytGoods.controller.dto.ts +0 -55
  46. package/template/src/dto/controller/home/ytShop.controller.dto.ts +0 -69
  47. package/template/src/dto/controller/home/ytUser.controller.dto.ts +0 -44
  48. package/template/src/dto/controller/public/ytUserAuth.controller.dto.ts +0 -63
  49. package/template/src/dto/goods.dto.ts +0 -212
  50. package/template/src/dto/service/ytService.dto.ts +0 -13
  51. package/template/src/dto/user.dto.ts +0 -177
  52. package/template/src/entity/columnTypes.ts +0 -13
  53. package/template/src/entity/goodsImagesUnlockKey.entity.ts +0 -33
  54. package/template/src/entity/goodsUnlocker.entity.ts +0 -34
  55. package/template/src/entity/shop.entity.ts +0 -52
  56. package/template/src/entity/shopUser.entity.ts +0 -41
  57. package/template/src/entity/ytGoods.entity.ts +0 -94
  58. package/template/src/entity/ytUser.entity.ts +0 -96
  59. package/template/src/examples/SwaggerProcessorExample.ts +0 -169
  60. package/template/src/examples/TransactionManagerDemo.ts +0 -377
  61. package/template/src/framework/utils/dynamicSwagger.ts +0 -410
  62. package/template/src/repository/UserRepository.ts +0 -122
  63. package/template/src/service/paramValidateTest.service.ts +0 -139
  64. package/template/src/service/ytGoods.service.ts +0 -42
  65. package/template/src/service/ytShop.service.ts +0 -90
  66. package/template/src/service/ytUser.service.ts +0 -451
  67. package/template/src/test/swaggerParameterTest.ts +0 -90
  68. package/template/test/controllers/controllers.test.ts +0 -173
  69. package/template/test/controllers/example/NewAnnotationExampleController.test.ts +0 -200
  70. package/template/test/framework/TransactionManagerDemo.test.ts +0 -363
  71. package/template/test/service/business.test.ts +0 -87
  72. package/template/test/service/paramValidateTest.service.test.ts +0 -184
  73. package/template/test/service/ytUser.service.test.ts +0 -566
  74. package/template/yarn.lock +0 -7354
@@ -1,377 +0,0 @@
1
- /**
2
- * TransactionManager 使用示例
3
- * 演示如何使用事务管理器处理各种数据库操作场景
4
- */
5
-
6
- import { transactionManager } from '@src/framework/utils/TransactionManager';
7
- import { logger } from '@src/framework/utils/logger';
8
- import { YtUserEntity } from '@src/entity/ytUser.entity';
9
- import { getDataSource } from '@src/framework/utils/db';
10
- import * as bcrypt from 'bcryptjs';
11
-
12
- /**
13
- * 示例 1: 基本事务使用
14
- * 创建用户并确保所有操作要么全部成功,要么全部失败
15
- */
16
- export async function example1_basicTransaction() {
17
- try {
18
- const result = await transactionManager.executeInTransaction(async (manager) => {
19
- // 在这个事务中,所有操作都会在同一个事务上下文中执行
20
-
21
- // 操作 1: 创建用户
22
- const user = new YtUserEntity();
23
- user.email = 'demo@example.com';
24
- user.telnumber = '13800138000';
25
- user.password = await bcrypt.hash('password123', 10);
26
-
27
- const savedUser = await manager.save(user);
28
-
29
- // 操作 2: 更新用户信息
30
- savedUser.email = 'updated@example.com';
31
- const updatedUser = await manager.save(savedUser);
32
-
33
- return updatedUser;
34
- });
35
-
36
- logger.info('事务执行成功:', result);
37
- return result;
38
-
39
- } catch (error) {
40
- logger.error('事务执行失败:', error as Error);
41
- throw error;
42
- }
43
- }
44
-
45
- /**
46
- * 示例 2: 使用隔离级别
47
- * 使用 SERIALIZABLE 隔离级别确保最高的数据一致性
48
- */
49
- export async function example2_transactionWithIsolationLevel() {
50
- try {
51
- const result = await transactionManager.executeInTransaction(
52
- async (manager) => {
53
- // 在 SERIALIZABLE 隔离级别下执行操作
54
- // 这会锁定相关数据,防止并发问题
55
-
56
- const users = await manager.find(YtUserEntity, {
57
- where: { email: 'demo@example.com' }
58
- });
59
-
60
- // 执行一些需要高度一致性的操作
61
- for (const user of users) {
62
- user.updateDate = new Date();
63
- await manager.save(user);
64
- }
65
-
66
- return users;
67
- },
68
- 'SERIALIZABLE' // 指定隔离级别
69
- );
70
-
71
- logger.info('隔离事务执行成功:', result);
72
- return result;
73
-
74
- } catch (error) {
75
- logger.error('隔离事务执行失败:', error as Error);
76
- throw error;
77
- }
78
- }
79
-
80
- /**
81
- * 示例 3: 只读事务
82
- * 用于优化只读操作的性能
83
- */
84
- export async function example3_readOnlyTransaction() {
85
- try {
86
- const result = await transactionManager.executeInReadOnlyTransaction(async (manager) => {
87
- // 只读事务,不会对数据产生任何修改
88
- // 适合报表查询、统计分析等操作
89
-
90
- const totalUsers = await manager.count(YtUserEntity);
91
- const activeUsers = await manager.count(YtUserEntity, {
92
- where: { status: 'normal' } as any
93
- });
94
-
95
- return {
96
- total: totalUsers,
97
- active: activeUsers,
98
- inactive: totalUsers - activeUsers
99
- };
100
- });
101
-
102
- logger.info('只读事务执行成功:', result);
103
- return result;
104
-
105
- } catch (error) {
106
- logger.error('只读事务执行失败:', error as Error);
107
- throw error;
108
- }
109
- }
110
-
111
- /**
112
- * 示例 4: 批量操作事务
113
- * 一次性处理多个操作,确保原子性
114
- */
115
- export async function example4_batchTransaction() {
116
- try {
117
- const operations = [
118
- // 操作 1: 创建用户 1
119
- async (manager: any) => {
120
- const user1 = new YtUserEntity();
121
- user1.email = 'user1@example.com';
122
- user1.telnumber = '13800138001';
123
- user1.password = await bcrypt.hash('pass123', 10);
124
- return await manager.save(user1);
125
- },
126
-
127
- // 操作 2: 创建用户 2
128
- async (manager: any) => {
129
- const user2 = new YtUserEntity();
130
- user2.email = 'user2@example.com';
131
- user2.telnumber = '13800138002';
132
- user2.password = await bcrypt.hash('pass123', 10);
133
- return await manager.save(user2);
134
- },
135
-
136
- // 操作 3: 更新用户 1
137
- async (manager: any) => {
138
- const user = await manager.findOne(YtUserEntity, {
139
- where: { email: 'user1@example.com' }
140
- });
141
- if (user) {
142
- user.updateDate = new Date();
143
- return await manager.save(user);
144
- }
145
- return null;
146
- }
147
- ];
148
-
149
- const results = await transactionManager.executeBatchTransaction(operations);
150
-
151
- logger.info('批量事务执行成功,创建了', results.length, '个操作');
152
- return results;
153
-
154
- } catch (error) {
155
- logger.error('批量事务执行失败:', error as Error);
156
- throw error;
157
- }
158
- }
159
-
160
- /**
161
- * 示例 5: 嵌套事务
162
- * 当需要在已经存在的事务中执行额外操作时使用
163
- */
164
- export async function example5_nestedTransaction() {
165
- try {
166
- // 外层事务
167
- const result = await transactionManager.executeInTransaction(async (manager) => {
168
- // 创建主用户
169
- const mainUser = new YtUserEntity();
170
- mainUser.email = 'main@example.com';
171
- mainUser.telnumber = '13800138000';
172
- mainUser.password = await bcrypt.hash('pass123', 10);
173
- const savedMainUser = await manager.save(mainUser);
174
-
175
- // 使用嵌套事务创建相关数据
176
- await transactionManager.executeNestedTransaction(async (nestedManager) => {
177
- // 这些操作会使用现有的事务(如果有)
178
- const relatedUser = new YtUserEntity();
179
- relatedUser.email = 'related@example.com';
180
- relatedUser.telnumber = '13800138001';
181
- relatedUser.password = await bcrypt.hash('pass123', 10);
182
- await nestedManager.save(relatedUser);
183
- });
184
-
185
- return savedMainUser;
186
- });
187
-
188
- logger.info('嵌套事务执行成功:', result);
189
- return result;
190
-
191
- } catch (error) {
192
- logger.error('嵌套事务执行失败:', error as Error);
193
- throw error;
194
- }
195
- }
196
-
197
- /**
198
- * 示例 6: 错误处理和回滚
199
- * 演示当事务出错时如何自动回滚
200
- */
201
- export async function example6_errorHandlingAndRollback() {
202
- try {
203
- await transactionManager.executeInTransaction(async (manager) => {
204
- // 操作 1: 创建用户
205
- const user = new YtUserEntity();
206
- user.email = 'test@example.com';
207
- user.telnumber = '13800138000';
208
- user.password = await bcrypt.hash('pass123', 10);
209
- await manager.save(user);
210
-
211
- // 操作 2: 故意引发错误(模拟业务逻辑错误)
212
- if (user.email === 'test@example.com') {
213
- throw new Error('模拟业务错误:测试用户不允许');
214
- }
215
-
216
- // 这段代码不会被执行,因为上面抛出了错误
217
- user.email = 'updated@example.com';
218
- await manager.save(user);
219
- });
220
-
221
- } catch (error) {
222
- // 所有操作都会被回滚
223
- logger.error('事务已回滚,所有更改已撤销');
224
-
225
- // 验证:检查用户是否真的被回滚了
226
- const dataSource = getDataSource();
227
- if (dataSource) {
228
- const user = await dataSource.manager.findOne(YtUserEntity, {
229
- where: { email: 'test@example.com' }
230
- });
231
-
232
- if (!user) {
233
- logger.info('✅ 回滚验证通过:用户未被创建');
234
- } else {
235
- logger.warn('❌ 回滚验证失败:用户仍然存在');
236
- }
237
- }
238
-
239
- throw error;
240
- }
241
- }
242
-
243
- /**
244
- * 示例 7: 复杂业务场景
245
- * 用户注册时需要同时创建多个相关记录
246
- */
247
- export async function example7_complexBusinessScenario(
248
- userData: any,
249
- profileData: any,
250
- preferences: any
251
- ) {
252
- try {
253
- const result = await transactionManager.executeInTransaction(async (manager) => {
254
- // 步骤 1: 创建用户
255
- const user = new YtUserEntity();
256
- user.email = userData.email;
257
- user.telnumber = userData.telnumber;
258
- user.password = userData.password;
259
- const savedUser = await manager.save(user);
260
-
261
- // 步骤 2: 创建用户配置(假设有配置表)
262
- // const profile = await manager.save(ProfileEntity, profileData);
263
-
264
- // 步骤 3: 创建用户偏好(假设有偏好表)
265
- // const preferences = await manager.save(PreferencesEntity, preferencesData);
266
-
267
- // 步骤 4: 发送欢迎通知(假设有通知表)
268
- // const notification = await manager.save(NotificationEntity, {
269
- // userId: savedUser.id,
270
- // message: '欢迎注册!'
271
- // });
272
-
273
- return {
274
- user: savedUser,
275
- // profile,
276
- // preferences
277
- };
278
- });
279
-
280
- logger.info('复杂业务场景执行成功');
281
- return result;
282
-
283
- } catch (error) {
284
- logger.error('复杂业务场景执行失败,所有更改已回滚');
285
- throw error;
286
- }
287
- }
288
-
289
- /**
290
- * 示例 8: 条件事务
291
- * 根据条件决定是否提交事务
292
- */
293
- export async function example8_conditionalTransaction(userData: any, shouldCommit: boolean) {
294
- try {
295
- const result = await transactionManager.executeInTransaction(async (manager) => {
296
- const user = new YtUserEntity();
297
- user.email = userData.email;
298
- user.telnumber = userData.telnumber;
299
- user.password = userData.password;
300
- const savedUser = await manager.save(user);
301
-
302
- // 模拟一些业务逻辑
303
- if (!shouldCommit) {
304
- // 即使在 try-catch 中不抛出错误,也可以通过返回值控制
305
- logger.warn('业务逻辑决定不提交事务');
306
- // 如果抛出自定义错误,事务会回滚
307
- throw new Error('Business logic error: 不符合提交条件');
308
- }
309
-
310
- return savedUser;
311
- });
312
-
313
- logger.info('条件事务执行成功');
314
- return result;
315
-
316
- } catch (error) {
317
- logger.error('条件事务被回滚');
318
- throw error;
319
- }
320
- }
321
-
322
- // 使用示例函数
323
- export async function runAllExamples() {
324
- console.log('=== TransactionManager 使用示例 ===\n');
325
-
326
- try {
327
- // 示例 1: 基本事务
328
- console.log('\n1. 基本事务示例');
329
- // await example1_basicTransaction();
330
-
331
- // 示例 2: 隔离级别
332
- console.log('\n2. 带隔离级别的事务示例');
333
- // await example2_transactionWithIsolationLevel();
334
-
335
- // 示例 3: 只读事务
336
- console.log('\n3. 只读事务示例');
337
- // await example3_readOnlyTransaction();
338
-
339
- // 示例 4: 批量操作
340
- console.log('\n4. 批量操作事务示例');
341
- // await example4_batchTransaction();
342
-
343
- // 示例 5: 嵌套事务
344
- console.log('\n5. 嵌套事务示例');
345
- // await example5_nestedTransaction();
346
-
347
- // 示例 6: 错误处理
348
- console.log('\n6. 错误处理和回滚示例');
349
- // await example6_errorHandlingAndRollback();
350
-
351
- // 示例 7: 复杂业务场景
352
- console.log('\n7. 复杂业务场景示例');
353
- // await example7_complexBusinessScenario({}, {}, {});
354
-
355
- // 示例 8: 条件事务
356
- console.log('\n8. 条件事务示例');
357
- // await example8_conditionalTransaction({}, true);
358
-
359
- console.log('\n=== 所有示例运行完成 ===');
360
-
361
- } catch (error) {
362
- logger.error('运行示例时发生错误:', error as Error);
363
- }
364
- }
365
-
366
- // 导出所有示例
367
- export const transactionManagerExamples = {
368
- basic: example1_basicTransaction,
369
- withIsolation: example2_transactionWithIsolationLevel,
370
- readOnly: example3_readOnlyTransaction,
371
- batch: example4_batchTransaction,
372
- nested: example5_nestedTransaction,
373
- errorHandling: example6_errorHandlingAndRollback,
374
- complex: example7_complexBusinessScenario,
375
- conditional: example8_conditionalTransaction,
376
- runAll: runAllExamples
377
- };