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,253 @@
1
+ import { Get, Post } from '@src/framework/decorator/controller';
2
+ import { Body } from '@src/framework/decorator/controller';
3
+ import { BaseController } from '@src/controllers/base.controller';
4
+ import { testDataInitializer } from '@src/utils/testDataInitializer';
5
+ import { getDataSource } from '@src/framework/utils/db';
6
+ import { logger } from '@src/framework/utils/logger';
7
+
8
+ export class TestDataController extends BaseController {
9
+
10
+ /**
11
+ * 检查是否为内存数据库模式
12
+ */
13
+ private isMemoryDatabase(): boolean {
14
+ const dataSource = getDataSource();
15
+ if (!dataSource || !dataSource.isInitialized) {
16
+ return false;
17
+ }
18
+
19
+ const driver = (dataSource as any).driver;
20
+ return driver && driver.options && driver.options.database === ':memory:';
21
+ }
22
+
23
+ /**
24
+ * 获取测试数据状态
25
+ */
26
+ @Get('/test-data/status')
27
+ async getTestDataStatus() {
28
+ if (!this.isMemoryDatabase()) {
29
+ return this.fail(400, '当前不是内存数据库模式');
30
+ }
31
+
32
+ try {
33
+ const dataSource = getDataSource();
34
+ if (!dataSource) {
35
+ return this.fail(500, '数据库连接未初始化');
36
+ }
37
+
38
+ // 统计各表的数据量
39
+ const userCount = await dataSource.query("SELECT COUNT(*) as count FROM yt_user");
40
+ const shopCount = await dataSource.query("SELECT COUNT(*) as count FROM shop");
41
+ const goodsCount = await dataSource.query("SELECT COUNT(*) as count FROM yt_goods");
42
+ const unlockKeyCount = await dataSource.query("SELECT COUNT(*) as count FROM goods_images_unlock_key");
43
+ const shopUserCount = await dataSource.query("SELECT COUNT(*) as count FROM shop_user");
44
+
45
+ return this.success({
46
+ isMemoryDatabase: true,
47
+ dataCounts: {
48
+ users: userCount[0]?.count || 0,
49
+ shops: shopCount[0]?.count || 0,
50
+ goods: goodsCount[0]?.count || 0,
51
+ unlockKeys: unlockKeyCount[0]?.count || 0,
52
+ shopUsers: shopUserCount[0]?.count || 0
53
+ },
54
+ timestamp: new Date().toISOString()
55
+ });
56
+ } catch (error) {
57
+ logger.error('获取测试数据状态失败:', error as Error);
58
+ return this.fail(500, `获取测试数据状态失败: ${error instanceof Error ? error.message : '未知错误'}`);
59
+ }
60
+ }
61
+
62
+ /**
63
+ * 初始化测试数据
64
+ */
65
+ @Post('/test-data/init')
66
+ async initTestData() {
67
+ if (!this.isMemoryDatabase()) {
68
+ return this.fail(400, '当前不是内存数据库模式');
69
+ }
70
+
71
+ try {
72
+ await testDataInitializer.initializeTestData();
73
+ logger.info('手动初始化测试数据完成');
74
+
75
+ return this.success({
76
+ message: '测试数据初始化完成',
77
+ timestamp: new Date().toISOString()
78
+ });
79
+ } catch (error) {
80
+ logger.error('初始化测试数据失败:', error as Error);
81
+ return this.fail(500, `初始化测试数据失败: ${error instanceof Error ? error.message : '未知错误'}`);
82
+ }
83
+ }
84
+
85
+ /**
86
+ * 清空测试数据
87
+ */
88
+ @Post('/test-data/clear')
89
+ async clearTestData() {
90
+ if (!this.isMemoryDatabase()) {
91
+ return this.fail(400, '当前不是内存数据库模式');
92
+ }
93
+
94
+ try {
95
+ await testDataInitializer.clearTestData();
96
+ logger.info('手动清空测试数据完成');
97
+
98
+ return this.success({
99
+ message: '测试数据已清空',
100
+ timestamp: new Date().toISOString()
101
+ });
102
+ } catch (error) {
103
+ logger.error('清空测试数据失败:', error as Error);
104
+ return this.fail(500, `清空测试数据失败: ${error instanceof Error ? error.message : '未知错误'}`);
105
+ }
106
+ }
107
+
108
+ /**
109
+ * 重新初始化测试数据(先清空再初始化)
110
+ */
111
+ @Post('/test-data/reset')
112
+ async resetTestData() {
113
+ if (!this.isMemoryDatabase()) {
114
+ return this.fail(400, '当前不是内存数据库模式');
115
+ }
116
+
117
+ try {
118
+ await testDataInitializer.clearTestData();
119
+ await testDataInitializer.initializeTestData();
120
+ logger.info('手动重置测试数据完成');
121
+
122
+ return this.success({
123
+ message: '测试数据已重置',
124
+ timestamp: new Date().toISOString()
125
+ });
126
+ } catch (error) {
127
+ logger.error('重置测试数据失败:', error as Error);
128
+ return this.fail(500, `重置测试数据失败: ${error instanceof Error ? error.message : '未知错误'}`);
129
+ }
130
+ }
131
+
132
+ /**
133
+ * 获取测试用户信息(用于测试API)
134
+ */
135
+ @Get('/test-data/users')
136
+ async getTestUsers() {
137
+ if (!this.isMemoryDatabase()) {
138
+ return this.fail(400, '当前不是内存数据库模式');
139
+ }
140
+
141
+ try {
142
+ const dataSource = getDataSource();
143
+ if (!dataSource) {
144
+ return this.fail(500, '数据库连接未初始化');
145
+ }
146
+
147
+ const users = await dataSource.query(`
148
+ SELECT
149
+ u.id,
150
+ u.nickName,
151
+ u.email,
152
+ u.telnumber,
153
+ u.userType,
154
+ u.status,
155
+ u.avatar,
156
+ u.gender,
157
+ u.age,
158
+ u.constellation
159
+ FROM yt_user u
160
+ ORDER BY u.id
161
+ `);
162
+
163
+ return this.success({
164
+ users,
165
+ count: users.length,
166
+ timestamp: new Date().toISOString()
167
+ });
168
+ } catch (error) {
169
+ logger.error('获取测试用户失败:', error as Error);
170
+ return this.fail(500, `获取测试用户失败: ${error instanceof Error ? error.message : '未知错误'}`);
171
+ }
172
+ }
173
+
174
+ /**
175
+ * 获取测试店铺信息
176
+ */
177
+ @Get('/test-data/shops')
178
+ async getTestShops() {
179
+ if (!this.isMemoryDatabase()) {
180
+ return this.fail(400, '当前不是内存数据库模式');
181
+ }
182
+
183
+ try {
184
+ const dataSource = getDataSource();
185
+ if (!dataSource) {
186
+ return this.fail(500, '数据库连接未初始化');
187
+ }
188
+
189
+ const shops = await dataSource.query(`
190
+ SELECT
191
+ s.id,
192
+ s.name,
193
+ s.description,
194
+ s.status,
195
+ u.nickName as ownerName,
196
+ u.email as ownerEmail
197
+ FROM shop s
198
+ LEFT JOIN shop_user su ON s.id = su.shopId
199
+ LEFT JOIN yt_user u ON su.userId = u.id
200
+ ORDER BY s.id
201
+ `);
202
+
203
+ return this.success({
204
+ shops,
205
+ count: shops.length,
206
+ timestamp: new Date().toISOString()
207
+ });
208
+ } catch (error) {
209
+ logger.error('获取测试店铺失败:', error as Error);
210
+ return this.fail(500, `获取测试店铺失败: ${error instanceof Error ? error.message : '未知错误'}`);
211
+ }
212
+ }
213
+
214
+ /**
215
+ * 获取测试商品信息
216
+ */
217
+ @Get('/test-data/goods')
218
+ async getTestGoods() {
219
+ if (!this.isMemoryDatabase()) {
220
+ return this.fail(400, '当前不是内存数据库模式');
221
+ }
222
+
223
+ try {
224
+ const dataSource = getDataSource();
225
+ if (!dataSource) {
226
+ return this.fail(500, '数据库连接未初始化');
227
+ }
228
+
229
+ const goods = await dataSource.query(`
230
+ SELECT
231
+ g.id,
232
+ g.name,
233
+ g.description,
234
+ g.price,
235
+ g.albums,
236
+ g.status,
237
+ s.name as shopName
238
+ FROM yt_goods g
239
+ LEFT JOIN shop s ON g.shopId = s.id
240
+ ORDER BY g.id
241
+ `);
242
+
243
+ return this.success({
244
+ goods,
245
+ count: goods.length,
246
+ timestamp: new Date().toISOString()
247
+ });
248
+ } catch (error) {
249
+ logger.error('获取测试商品失败:', error as Error);
250
+ return this.fail(500, `获取测试商品失败: ${error instanceof Error ? error.message : '未知错误'}`);
251
+ }
252
+ }
253
+ }
@@ -0,0 +1,73 @@
1
+ import { IsString, IsOptional, IsNumber, IsEmail, MinLength, MaxLength } from 'class-validator';
2
+
3
+ /**
4
+ * 示例查询参数 DTO
5
+ */
6
+ export class ExampleQueryDto {
7
+ @IsOptional()
8
+ @IsString()
9
+ id?: string;
10
+
11
+ @IsOptional()
12
+ @IsString()
13
+ @MinLength(1)
14
+ @MaxLength(50)
15
+ name?: string;
16
+
17
+ @IsOptional()
18
+ @IsString()
19
+ category?: string;
20
+
21
+ @IsOptional()
22
+ @IsNumber()
23
+ page?: number;
24
+
25
+ @IsOptional()
26
+ @IsNumber()
27
+ limit?: number;
28
+ }
29
+
30
+ /**
31
+ * 示例请求体 DTO
32
+ */
33
+ export class ExampleBodyDto {
34
+ @IsString()
35
+ @MinLength(1)
36
+ @MaxLength(100)
37
+ name: string;
38
+
39
+ @IsString()
40
+ @MinLength(1)
41
+ @MaxLength(500)
42
+ value: string;
43
+
44
+ @IsOptional()
45
+ @IsEmail()
46
+ email?: string;
47
+
48
+ @IsOptional()
49
+ @IsNumber()
50
+ age?: number;
51
+
52
+ @IsOptional()
53
+ @IsString()
54
+ description?: string;
55
+ }
56
+
57
+ /**
58
+ * 示例响应 DTO
59
+ */
60
+ export class ExampleResponseDto {
61
+ @IsString()
62
+ message: string;
63
+
64
+ @IsOptional()
65
+ data?: any;
66
+
67
+ @IsOptional()
68
+ timestamp?: string;
69
+
70
+ @IsOptional()
71
+ @IsNumber()
72
+ code?: number;
73
+ }
@@ -0,0 +1,40 @@
1
+ import { Transform } from "@src/framework/decorator/controller";
2
+ import { Trim } from "@src/framework/utils/transform";
3
+ import { IsEmail, IsNumber, IsString, Length } from "class-validator";
4
+
5
+ /**
6
+ * 发送邮件请求参数
7
+ */
8
+ export class SendEmailDto {
9
+
10
+ @IsString({
11
+ message: "邮箱必须是字符串"
12
+ })
13
+ @Transform((val) => {
14
+ const str = String(val);
15
+ return Trim(str);
16
+ })
17
+ @IsEmail({}, {
18
+ message: "请输入有效的邮箱"
19
+ })
20
+ email: string;
21
+
22
+ }
23
+
24
+ /**
25
+ * 发送邮件响应参数
26
+ */
27
+ export class SendEmailResponseDto {
28
+
29
+
30
+ @Length(1, 256, {
31
+ message: "token长度必须在1-256之间"
32
+ })
33
+ @IsString({
34
+ message: "响应token必须是字符串"
35
+ })
36
+ vcodeToken: string;
37
+
38
+ @IsNumber()
39
+ expire: number
40
+ }
@@ -0,0 +1,45 @@
1
+ import { IsEmail, IsString, Length } from "class-validator";
2
+ import { Transform } from "@src/framework/decorator/controller";
3
+ import { Trim } from "@src/framework/utils/transform";
4
+
5
+ export class YtUserRegisterDto {
6
+
7
+ @IsString({
8
+ message: "邮箱必须是字符串"
9
+ })
10
+ @Transform((val) => {
11
+ const str = String(val);
12
+ return Trim(str);
13
+ })
14
+ @IsEmail({}, {
15
+ message: "请输入有效的邮箱"
16
+ })
17
+ email: string;
18
+
19
+
20
+ @Transform((val) => {
21
+ const str = String(val);
22
+ return Trim(str);
23
+ })
24
+ @Length(6, 12, {
25
+ message: "密码长度为6-12"
26
+ })
27
+ @IsString()
28
+ password: string
29
+
30
+ /**
31
+ * 短信验证码
32
+ */
33
+ @Length(4, 6)
34
+ @IsString()
35
+ @Transform(Trim)
36
+ vcode: string
37
+
38
+ /**
39
+ * 短信验证码的token
40
+ */
41
+ @IsString()
42
+ @Transform(Trim)
43
+ vcodeToken: string
44
+ }
45
+
@@ -0,0 +1,55 @@
1
+ import { Transform } from "@src/framework/decorator/controller";
2
+ import { IsArray, IsNumber, IsString } from "class-validator";
3
+
4
+ export class GetGoodsInfoDto {
5
+
6
+ @IsNumber()
7
+ @Transform(id => Number(id))
8
+ id: number;
9
+ }
10
+
11
+ export class GetGoodsInfoResultDto {
12
+
13
+ @IsNumber()
14
+ id: number
15
+
16
+ @IsString()
17
+ name: string
18
+
19
+ @IsArray()
20
+ albums: string[]
21
+
22
+ @IsNumber()
23
+ price: number
24
+
25
+ @IsString()
26
+ description: string
27
+
28
+ @IsString()
29
+ content: string;
30
+
31
+ @IsArray()
32
+ imagesContent: string[]
33
+
34
+ @IsArray()
35
+ tags: string[]
36
+
37
+ }
38
+
39
+ export class GetGoodsUnlockInfoDto {
40
+
41
+ @IsNumber()
42
+ @Transform(id => Number(id))
43
+ goodsId: number
44
+ }
45
+
46
+ export class UnlockGoodsImageDto {
47
+
48
+ @IsString()
49
+ key: string
50
+
51
+ @IsNumber()
52
+ @Transform(id => Number(id))
53
+ goodsId: number
54
+ }
55
+ // export class GetGoodsUnlockInfoResponseDto {}
@@ -0,0 +1,69 @@
1
+ import { ShopStatusEnum } from "@src/entity/shop.entity";
2
+ import { Transform } from "@src/framework/decorator/controller";
3
+ import { IsArray, IsNumber, IsString } from "class-validator";
4
+
5
+ export class GetShopInfoByIdQueryDto {
6
+
7
+ @Transform((value) => Number(value))
8
+ @IsNumber()
9
+ id: number
10
+ }
11
+
12
+ export class GetShopInfoByIdResultDto {
13
+
14
+ @IsNumber()
15
+ id: number;
16
+
17
+ @IsString()
18
+ name: string;
19
+
20
+ @IsString()
21
+ description: string;
22
+
23
+ @IsNumber()
24
+ userId: number
25
+
26
+ @IsString()
27
+ status: ShopStatusEnum
28
+ }
29
+
30
+ export class GetShopGoodsListQueryDto {
31
+
32
+ @Transform((value) => Number(value))
33
+ @IsNumber()
34
+ id: number;
35
+
36
+ @Transform((value) => Number(value))
37
+ @IsNumber()
38
+ page: number;
39
+
40
+ @Transform((value) => Number(value))
41
+ @IsNumber()
42
+ pageSize: number;
43
+
44
+ }
45
+
46
+
47
+ export class GetShopGoodsListResultDto {
48
+ @IsNumber()
49
+ id: number;
50
+
51
+ @IsString()
52
+ name: string;
53
+
54
+ @IsString()
55
+ description: string;
56
+
57
+ @IsNumber()
58
+ price: number;
59
+
60
+ @IsArray({})
61
+ albums: string[];
62
+ }
63
+
64
+ export class GetShopUserInfoDto {
65
+
66
+ @Transform((value) => Number(value))
67
+ @IsNumber()
68
+ shopId: number;
69
+ }
@@ -0,0 +1,44 @@
1
+ import { YtUserStatusEnum, YtUserTypeEnum } from "@src/entity/ytUser.entity";
2
+ import { Transform } from "@src/framework/decorator/controller";
3
+ import { IsEmail, IsNumber, isString, IsString, ValidateIf } from "class-validator";
4
+ import { Column } from "typeorm";
5
+
6
+ export class GetUserInfoResponseDto {
7
+
8
+ @IsNumber()
9
+ id: number
10
+
11
+ @IsString()
12
+ @ValidateIf(o => o.nickName)
13
+ nickName: string
14
+
15
+ @IsEmail()
16
+ @IsString()
17
+ email: string
18
+
19
+ @IsString()
20
+ avatar: string
21
+
22
+ @IsNumber()
23
+ gender: number
24
+
25
+ @IsString()
26
+ constellation: string
27
+
28
+ @IsNumber()
29
+ age: number
30
+
31
+ @IsString()
32
+ status: YtUserStatusEnum
33
+
34
+ @IsString()
35
+ type: YtUserTypeEnum
36
+ }
37
+
38
+ export class getUserInfoByIdDto {
39
+
40
+ @Transform((v)=>Number(v))
41
+ @IsNumber()
42
+ id:number
43
+
44
+ }
@@ -0,0 +1,63 @@
1
+ import { Transform } from "@src/framework/decorator/controller";
2
+ import { Trim } from "@src/framework/utils/transform";
3
+ import { IsEmail, IsNumber, IsString, Length } from "class-validator";
4
+
5
+ export class YtUserLoginDto {
6
+
7
+ @IsString({
8
+ message: "邮箱必须是字符串"
9
+ })
10
+ @Transform((val) => {
11
+ const str = String(val);
12
+ return Trim(str);
13
+ })
14
+ @IsEmail({}, {
15
+ message: "请输入有效的邮箱"
16
+ })
17
+ email: string;
18
+
19
+
20
+ @Transform((val) => {
21
+ const str = String(val);
22
+ return Trim(str);
23
+ })
24
+ @IsString()
25
+ vcode: string;
26
+
27
+ @IsString()
28
+ vcodeToken: string;
29
+ }
30
+
31
+
32
+ export class YtUserLoginAutoDto {
33
+
34
+ @Transform((val) => {
35
+ const str = String(val);
36
+ return Trim(str);
37
+ })
38
+ @IsString()
39
+ vcode: string;
40
+
41
+ @IsString()
42
+ vcodeToken: string;
43
+ }
44
+
45
+ export class GetYtUserBasicInfoDto {
46
+ @IsNumber()
47
+ @Transform(id => Number(id))
48
+ id: number;
49
+ }
50
+
51
+ export class GetYtUserBasicInfoResponseDto {
52
+
53
+ @IsNumber()
54
+ id: number
55
+
56
+ @IsString()
57
+ name: string
58
+
59
+ @IsString()
60
+ avatar: string
61
+
62
+
63
+ }