midway-fatcms 0.0.3 → 0.0.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.
Files changed (391) hide show
  1. package/.eslintrc.json +14 -14
  2. package/.prettierrc.js +4 -4
  3. package/README.md +406 -406
  4. package/dist/config/config.default.d.ts +3 -3
  5. package/dist/config/config.default.js +177 -177
  6. package/dist/config/utils.d.ts +1 -1
  7. package/dist/config/utils.js +23 -23
  8. package/dist/configuration.d.ts +7 -7
  9. package/dist/configuration.js +113 -113
  10. package/dist/controller/base/BaseApiController.d.ts +49 -49
  11. package/dist/controller/base/BaseApiController.js +198 -198
  12. package/dist/controller/gateway/AnyApiGatewayController.d.ts +13 -13
  13. package/dist/controller/gateway/AnyApiGatewayController.js +55 -55
  14. package/dist/controller/gateway/AsyncTaskController.d.ts +20 -20
  15. package/dist/controller/gateway/AsyncTaskController.js +181 -181
  16. package/dist/controller/gateway/CrudMtdGatewayController.d.ts +21 -21
  17. package/dist/controller/gateway/CrudMtdGatewayController.js +122 -122
  18. package/dist/controller/gateway/CrudStdGatewayController.d.ts +39 -39
  19. package/dist/controller/gateway/CrudStdGatewayController.js +149 -149
  20. package/dist/controller/gateway/DocGatewayController.d.ts +27 -27
  21. package/dist/controller/gateway/DocGatewayController.js +181 -181
  22. package/dist/controller/gateway/FileController.d.ts +32 -32
  23. package/dist/controller/gateway/FileController.js +160 -160
  24. package/dist/controller/gateway/FlowInstanceController.d.ts +16 -16
  25. package/dist/controller/gateway/FlowInstanceController.js +48 -48
  26. package/dist/controller/gateway/ProxyApiGatewayController.d.ts +18 -18
  27. package/dist/controller/gateway/ProxyApiGatewayController.js +78 -78
  28. package/dist/controller/gateway/PublicApiController.d.ts +33 -33
  29. package/dist/controller/gateway/PublicApiController.js +194 -194
  30. package/dist/controller/gateway/StaticController.d.ts +23 -23
  31. package/dist/controller/gateway/StaticController.js +280 -280
  32. package/dist/controller/helpers.controller.d.ts +36 -36
  33. package/dist/controller/helpers.controller.js +187 -187
  34. package/dist/controller/home.controller.d.ts +9 -9
  35. package/dist/controller/home.controller.js +78 -78
  36. package/dist/controller/manage/AnyApiMangeApi.d.ts +10 -10
  37. package/dist/controller/manage/AnyApiMangeApi.js +98 -98
  38. package/dist/controller/manage/AppLogMangeApi.d.ts +10 -10
  39. package/dist/controller/manage/AppLogMangeApi.js +88 -88
  40. package/dist/controller/manage/AppMangeApi.d.ts +12 -12
  41. package/dist/controller/manage/AppMangeApi.js +101 -101
  42. package/dist/controller/manage/AppPageMangeApi.d.ts +10 -10
  43. package/dist/controller/manage/AppPageMangeApi.js +87 -87
  44. package/dist/controller/manage/AppSchemaHistoryApi.d.ts +10 -10
  45. package/dist/controller/manage/AppSchemaHistoryApi.js +83 -83
  46. package/dist/controller/manage/CrudMethodsMangeApi.d.ts +10 -10
  47. package/dist/controller/manage/CrudMethodsMangeApi.js +84 -84
  48. package/dist/controller/manage/CrudStandardDesignApi.d.ts +46 -46
  49. package/dist/controller/manage/CrudStandardDesignApi.js +367 -367
  50. package/dist/controller/manage/DataDictManageApi.d.ts +17 -17
  51. package/dist/controller/manage/DataDictManageApi.js +165 -165
  52. package/dist/controller/manage/DeployManageApi.d.ts +21 -21
  53. package/dist/controller/manage/DeployManageApi.js +203 -203
  54. package/dist/controller/manage/DocLibManageApi.d.ts +10 -10
  55. package/dist/controller/manage/DocLibManageApi.js +104 -104
  56. package/dist/controller/manage/DocManageApi.d.ts +11 -11
  57. package/dist/controller/manage/DocManageApi.js +130 -130
  58. package/dist/controller/manage/FileManageApi.d.ts +13 -13
  59. package/dist/controller/manage/FileManageApi.js +77 -77
  60. package/dist/controller/manage/FlowConfigManageApi.d.ts +12 -12
  61. package/dist/controller/manage/FlowConfigManageApi.js +109 -109
  62. package/dist/controller/manage/LowCodeTplManageApi.d.ts +13 -13
  63. package/dist/controller/manage/LowCodeTplManageApi.js +86 -86
  64. package/dist/controller/manage/MenuManageApi.d.ts +11 -11
  65. package/dist/controller/manage/MenuManageApi.js +104 -104
  66. package/dist/controller/manage/ProxyApiMangeApi.d.ts +10 -10
  67. package/dist/controller/manage/ProxyApiMangeApi.js +87 -87
  68. package/dist/controller/manage/SuperAdminManageApi.d.ts +24 -24
  69. package/dist/controller/manage/SuperAdminManageApi.js +153 -153
  70. package/dist/controller/manage/SysConfigMangeApi.d.ts +12 -12
  71. package/dist/controller/manage/SysConfigMangeApi.js +133 -133
  72. package/dist/controller/manage/SystemInfoManageApi.d.ts +12 -12
  73. package/dist/controller/manage/SystemInfoManageApi.js +82 -82
  74. package/dist/controller/manage/UserAccountManageApi.d.ts +16 -16
  75. package/dist/controller/manage/UserAccountManageApi.js +153 -153
  76. package/dist/controller/manage/WorkbenchMangeApi.d.ts +11 -11
  77. package/dist/controller/manage/WorkbenchMangeApi.js +106 -106
  78. package/dist/controller/myinfo/AuthController.d.ts +37 -37
  79. package/dist/controller/myinfo/AuthController.js +157 -157
  80. package/dist/controller/myinfo/MyInfoController.d.ts +13 -13
  81. package/dist/controller/myinfo/MyInfoController.js +51 -51
  82. package/dist/controller/render/AppRenderController.d.ts +12 -12
  83. package/dist/controller/render/AppRenderController.js +93 -93
  84. package/dist/controller/test.controller.d.ts +8 -8
  85. package/dist/controller/test.controller.js +51 -51
  86. package/dist/filter/default.filter.d.ts +7 -7
  87. package/dist/filter/default.filter.js +23 -23
  88. package/dist/filter/notfound.filter.d.ts +5 -5
  89. package/dist/filter/notfound.filter.js +20 -20
  90. package/dist/index.d.ts +111 -111
  91. package/dist/index.js +129 -129
  92. package/dist/interface.d.ts +30 -30
  93. package/dist/interface.js +3 -3
  94. package/dist/libs/crud-pro/CrudPro.d.ts +51 -37
  95. package/dist/libs/crud-pro/CrudPro.js +207 -146
  96. package/dist/libs/crud-pro/defaultConfigs.d.ts +4 -4
  97. package/dist/libs/crud-pro/defaultConfigs.js +15 -15
  98. package/dist/libs/crud-pro/exceptions.d.ts +106 -106
  99. package/dist/libs/crud-pro/exceptions.js +119 -119
  100. package/dist/libs/crud-pro/interfaces.d.ts +195 -175
  101. package/dist/libs/crud-pro/interfaces.js +12 -12
  102. package/dist/libs/crud-pro/models/ExecuteContext.d.ts +50 -50
  103. package/dist/libs/crud-pro/models/ExecuteContext.js +87 -87
  104. package/dist/libs/crud-pro/models/ExecuteContextFunc.d.ts +38 -38
  105. package/dist/libs/crud-pro/models/ExecuteContextFunc.js +72 -72
  106. package/dist/libs/crud-pro/models/FuncContext.d.ts +18 -18
  107. package/dist/libs/crud-pro/models/FuncContext.js +6 -6
  108. package/dist/libs/crud-pro/models/RequestCfgModel.d.ts +65 -65
  109. package/dist/libs/crud-pro/models/RequestCfgModel.js +81 -81
  110. package/dist/libs/crud-pro/models/RequestModel.d.ts +25 -25
  111. package/dist/libs/crud-pro/models/RequestModel.js +113 -113
  112. package/dist/libs/crud-pro/models/ResModel.d.ts +20 -20
  113. package/dist/libs/crud-pro/models/ResModel.js +2 -2
  114. package/dist/libs/crud-pro/models/ServiceHub.d.ts +20 -20
  115. package/dist/libs/crud-pro/models/ServiceHub.js +2 -2
  116. package/dist/libs/crud-pro/models/SqlCfgModel.d.ts +23 -23
  117. package/dist/libs/crud-pro/models/SqlCfgModel.js +40 -40
  118. package/dist/libs/crud-pro/models/SqlSegArg.d.ts +6 -6
  119. package/dist/libs/crud-pro/models/SqlSegArg.js +12 -12
  120. package/dist/libs/crud-pro/models/Transaction.d.ts +50 -50
  121. package/dist/libs/crud-pro/models/Transaction.js +184 -184
  122. package/dist/libs/crud-pro/models/TransactionMySQL.d.ts +19 -19
  123. package/dist/libs/crud-pro/models/TransactionMySQL.js +48 -48
  124. package/dist/libs/crud-pro/models/TransactionPostgres.d.ts +19 -19
  125. package/dist/libs/crud-pro/models/TransactionPostgres.js +64 -64
  126. package/dist/libs/crud-pro/models/TransactionSqlServer.d.ts +9 -9
  127. package/dist/libs/crud-pro/models/TransactionSqlServer.js +61 -61
  128. package/dist/libs/crud-pro/models/keys.d.ts +111 -111
  129. package/dist/libs/crud-pro/models/keys.js +156 -156
  130. package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +11 -11
  131. package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +73 -73
  132. package/dist/libs/crud-pro/services/CrudProDataFilterService.d.ts +17 -0
  133. package/dist/libs/crud-pro/services/CrudProDataFilterService.js +53 -0
  134. package/dist/libs/crud-pro/services/CrudProExecuteFuncService.d.ts +9 -9
  135. package/dist/libs/crud-pro/services/CrudProExecuteFuncService.js +125 -125
  136. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.d.ts +17 -17
  137. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +224 -224
  138. package/dist/libs/crud-pro/services/CrudProFieldUpdateService.d.ts +9 -9
  139. package/dist/libs/crud-pro/services/CrudProFieldUpdateService.js +51 -51
  140. package/dist/libs/crud-pro/services/CrudProFieldValidateService.d.ts +13 -13
  141. package/dist/libs/crud-pro/services/CrudProFieldValidateService.js +148 -148
  142. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.d.ts +25 -25
  143. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +385 -385
  144. package/dist/libs/crud-pro/services/CrudProGenSqlService.d.ts +25 -25
  145. package/dist/libs/crud-pro/services/CrudProGenSqlService.js +165 -165
  146. package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.d.ts +32 -32
  147. package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +345 -339
  148. package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +24 -24
  149. package/dist/libs/crud-pro/services/CrudProServiceBase.js +88 -88
  150. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +12 -9
  151. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +167 -77
  152. package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +34 -32
  153. package/dist/libs/crud-pro/services/CurdProServiceHub.js +69 -64
  154. package/dist/libs/crud-pro/utils/CompareUtils.d.ts +9 -9
  155. package/dist/libs/crud-pro/utils/CompareUtils.js +25 -25
  156. package/dist/libs/crud-pro/utils/CrudMonitor.d.ts +9 -9
  157. package/dist/libs/crud-pro/utils/CrudMonitor.js +12 -12
  158. package/dist/libs/crud-pro/utils/DatabaseName.d.ts +9 -9
  159. package/dist/libs/crud-pro/utils/DatabaseName.js +50 -50
  160. package/dist/libs/crud-pro/utils/DateTimeUtils.d.ts +7 -7
  161. package/dist/libs/crud-pro/utils/DateTimeUtils.js +21 -21
  162. package/dist/libs/crud-pro/utils/MemoryRefreshCache.d.ts +19 -19
  163. package/dist/libs/crud-pro/utils/MemoryRefreshCache.js +47 -47
  164. package/dist/libs/crud-pro/utils/MessageParseUtils.d.ts +5 -5
  165. package/dist/libs/crud-pro/utils/MessageParseUtils.js +33 -33
  166. package/dist/libs/crud-pro/utils/MixinUtils.d.ts +40 -40
  167. package/dist/libs/crud-pro/utils/MixinUtils.js +259 -259
  168. package/dist/libs/crud-pro/utils/ModelUtils.d.ts +11 -11
  169. package/dist/libs/crud-pro/utils/ModelUtils.js +54 -54
  170. package/dist/libs/crud-pro/utils/MultiKeyMap.d.ts +11 -11
  171. package/dist/libs/crud-pro/utils/MultiKeyMap.js +63 -63
  172. package/dist/libs/crud-pro/utils/SqlFuncUtils.d.ts +5 -5
  173. package/dist/libs/crud-pro/utils/SqlFuncUtils.js +29 -29
  174. package/dist/libs/crud-pro/utils/TypeUtils.d.ts +40 -40
  175. package/dist/libs/crud-pro/utils/TypeUtils.js +166 -166
  176. package/dist/libs/crud-pro/utils/ValidateUtils.d.ts +3 -3
  177. package/dist/libs/crud-pro/utils/ValidateUtils.js +165 -165
  178. package/dist/libs/crud-pro/utils/pool/MySQLUtils.d.ts +3 -3
  179. package/dist/libs/crud-pro/utils/pool/MySQLUtils.js +19 -19
  180. package/dist/libs/crud-pro/utils/pool/PostgresUtils.d.ts +3 -3
  181. package/dist/libs/crud-pro/utils/pool/PostgresUtils.js +20 -20
  182. package/dist/libs/crud-pro/utils/pool/SqlServerUtils.d.ts +3 -3
  183. package/dist/libs/crud-pro/utils/pool/SqlServerUtils.js +20 -20
  184. package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.d.ts +4 -4
  185. package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.js +35 -35
  186. package/dist/libs/crud-pro/utils/sqlConvert/convertMix.js +24 -24
  187. package/dist/libs/crud-pro/utils/sqlConvert/convertMsSql.d.ts +2 -2
  188. package/dist/libs/crud-pro/utils/sqlConvert/convertMsSql.js +14 -14
  189. package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.d.ts +2 -2
  190. package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.js +14 -14
  191. package/dist/libs/global-config/global-config.d.ts +71 -71
  192. package/dist/libs/global-config/global-config.js +38 -38
  193. package/dist/libs/utils/AsymmetricCrypto.d.ts +76 -76
  194. package/dist/libs/utils/AsymmetricCrypto.js +261 -261
  195. package/dist/libs/utils/base64.d.ts +9 -9
  196. package/dist/libs/utils/base64.js +42 -42
  197. package/dist/libs/utils/common-dto.d.ts +18 -18
  198. package/dist/libs/utils/common-dto.js +40 -40
  199. package/dist/libs/utils/crypto-utils.d.ts +3 -3
  200. package/dist/libs/utils/crypto-utils.js +55 -55
  201. package/dist/libs/utils/errorToString.d.ts +20 -20
  202. package/dist/libs/utils/errorToString.js +79 -79
  203. package/dist/libs/utils/fatcms-request.d.ts +45 -45
  204. package/dist/libs/utils/fatcms-request.js +161 -161
  205. package/dist/libs/utils/format-url.d.ts +17 -17
  206. package/dist/libs/utils/format-url.js +30 -30
  207. package/dist/libs/utils/functions.d.ts +11 -11
  208. package/dist/libs/utils/functions.js +99 -99
  209. package/dist/libs/utils/ordernum-utils.d.ts +22 -22
  210. package/dist/libs/utils/ordernum-utils.js +35 -35
  211. package/dist/libs/utils/parseConfig.d.ts +8 -8
  212. package/dist/libs/utils/parseConfig.js +47 -47
  213. package/dist/libs/utils/parseCreateSql.d.ts +10 -10
  214. package/dist/libs/utils/parseCreateSql.js +87 -87
  215. package/dist/libs/utils/render-utils.d.ts +40 -40
  216. package/dist/libs/utils/render-utils.js +158 -158
  217. package/dist/middleware/forbidden.middleware.d.ts +74 -74
  218. package/dist/middleware/forbidden.middleware.js +318 -318
  219. package/dist/middleware/global.middleware.d.ts +40 -40
  220. package/dist/middleware/global.middleware.js +310 -310
  221. package/dist/middleware/permission.middleware.d.ts +88 -88
  222. package/dist/middleware/permission.middleware.js +145 -145
  223. package/dist/middleware/rediscache.middleware.d.ts +28 -28
  224. package/dist/middleware/rediscache.middleware.js +114 -114
  225. package/dist/middleware/redislock.middleware.d.ts +29 -29
  226. package/dist/middleware/redislock.middleware.js +106 -106
  227. package/dist/middleware/tx.middleware.d.ts +55 -55
  228. package/dist/middleware/tx.middleware.js +83 -83
  229. package/dist/models/AsyncTaskModel.d.ts +74 -74
  230. package/dist/models/AsyncTaskModel.js +31 -31
  231. package/dist/models/FlowModel.d.ts +227 -227
  232. package/dist/models/FlowModel.js +53 -53
  233. package/dist/models/RedisKeys.d.ts +15 -15
  234. package/dist/models/RedisKeys.js +18 -18
  235. package/dist/models/SystemEntities.d.ts +118 -118
  236. package/dist/models/SystemEntities.js +18 -18
  237. package/dist/models/SystemPerm.d.ts +96 -96
  238. package/dist/models/SystemPerm.js +101 -101
  239. package/dist/models/SystemTables.d.ts +25 -25
  240. package/dist/models/SystemTables.js +28 -28
  241. package/dist/models/WorkbenchInfoTools.d.ts +7 -7
  242. package/dist/models/WorkbenchInfoTools.js +20 -20
  243. package/dist/models/bizmodels.d.ts +150 -150
  244. package/dist/models/bizmodels.js +62 -62
  245. package/dist/models/contextLogger.d.ts +27 -27
  246. package/dist/models/contextLogger.js +119 -119
  247. package/dist/models/devops.d.ts +12 -12
  248. package/dist/models/devops.js +19 -19
  249. package/dist/models/userSession.d.ts +67 -67
  250. package/dist/models/userSession.js +179 -179
  251. package/dist/schedule/anonymousContext.d.ts +15 -15
  252. package/dist/schedule/anonymousContext.js +74 -74
  253. package/dist/schedule/index.d.ts +4 -4
  254. package/dist/schedule/index.js +10 -10
  255. package/dist/schedule/runSchedule.d.ts +12 -12
  256. package/dist/schedule/runSchedule.js +68 -68
  257. package/dist/schedule/scheduleNames.d.ts +15 -15
  258. package/dist/schedule/scheduleNames.js +19 -19
  259. package/dist/service/AuthService.d.ts +56 -56
  260. package/dist/service/AuthService.js +251 -251
  261. package/dist/service/EnumInfoService.d.ts +30 -30
  262. package/dist/service/EnumInfoService.js +97 -97
  263. package/dist/service/FileCenterService.d.ts +64 -64
  264. package/dist/service/FileCenterService.js +422 -422
  265. package/dist/service/SysAppService.d.ts +15 -15
  266. package/dist/service/SysAppService.js +108 -108
  267. package/dist/service/SysConfigService.d.ts +10 -10
  268. package/dist/service/SysConfigService.js +64 -64
  269. package/dist/service/SysDictDataService.d.ts +9 -9
  270. package/dist/service/SysDictDataService.js +72 -72
  271. package/dist/service/SysMenuService.d.ts +51 -51
  272. package/dist/service/SysMenuService.js +58 -58
  273. package/dist/service/UserAccountService.d.ts +23 -23
  274. package/dist/service/UserAccountService.js +107 -107
  275. package/dist/service/UserSessionService.d.ts +43 -43
  276. package/dist/service/UserSessionService.js +163 -163
  277. package/dist/service/VisitStatService.d.ts +14 -14
  278. package/dist/service/VisitStatService.js +161 -161
  279. package/dist/service/WorkbenchService.d.ts +59 -59
  280. package/dist/service/WorkbenchService.js +249 -249
  281. package/dist/service/anyapi/AnyApiSandboxService.d.ts +15 -15
  282. package/dist/service/anyapi/AnyApiSandboxService.js +110 -110
  283. package/dist/service/anyapi/AnyApiService.d.ts +27 -27
  284. package/dist/service/anyapi/AnyApiService.js +181 -181
  285. package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +50 -50
  286. package/dist/service/asyncTask/AsyncTaskRunnerService.js +287 -287
  287. package/dist/service/asyncTask/AsyncTaskService.d.ts +7 -7
  288. package/dist/service/asyncTask/AsyncTaskService.js +34 -34
  289. package/dist/service/asyncTask/handler/ExcelInfoModel.d.ts +10 -10
  290. package/dist/service/asyncTask/handler/ExcelInfoModel.js +2 -2
  291. package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.d.ts +7 -7
  292. package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.js +216 -216
  293. package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.d.ts +36 -36
  294. package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.js +141 -141
  295. package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.d.ts +46 -46
  296. package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.js +135 -135
  297. package/dist/service/base/ApiBaseService.d.ts +22 -22
  298. package/dist/service/base/ApiBaseService.js +60 -60
  299. package/dist/service/base/ApiRateLimiter.d.ts +10 -10
  300. package/dist/service/base/ApiRateLimiter.js +51 -51
  301. package/dist/service/base/BaseService.d.ts +46 -46
  302. package/dist/service/base/BaseService.js +131 -131
  303. package/dist/service/base/cache/CacheServiceFactory.d.ts +26 -26
  304. package/dist/service/base/cache/CacheServiceFactory.js +122 -122
  305. package/dist/service/base/cache/CtxCache.d.ts +18 -18
  306. package/dist/service/base/cache/CtxCache.js +37 -37
  307. package/dist/service/base/cache/DiskCache.d.ts +19 -19
  308. package/dist/service/base/cache/DiskCache.js +81 -81
  309. package/dist/service/base/cache/MemoryCache.d.ts +12 -12
  310. package/dist/service/base/cache/MemoryCache.js +58 -58
  311. package/dist/service/base/cache/NoneCache.d.ts +10 -10
  312. package/dist/service/base/cache/NoneCache.js +19 -19
  313. package/dist/service/base/cache/RedisCache.d.ts +14 -14
  314. package/dist/service/base/cache/RedisCache.js +31 -31
  315. package/dist/service/crudstd/CrudStdActionService.d.ts +17 -17
  316. package/dist/service/crudstd/CrudStdActionService.js +32 -32
  317. package/dist/service/crudstd/CrudStdConstant.d.ts +58 -58
  318. package/dist/service/crudstd/CrudStdConstant.js +64 -64
  319. package/dist/service/crudstd/CrudStdRelationService.d.ts +11 -11
  320. package/dist/service/crudstd/CrudStdRelationService.js +179 -179
  321. package/dist/service/crudstd/CrudStdService.d.ts +59 -59
  322. package/dist/service/crudstd/CrudStdService.js +348 -348
  323. package/dist/service/curd/CrudProQuick.d.ts +60 -60
  324. package/dist/service/curd/CrudProQuick.js +167 -167
  325. package/dist/service/curd/CurdMixByAccountService.d.ts +14 -14
  326. package/dist/service/curd/CurdMixByAccountService.js +166 -166
  327. package/dist/service/curd/CurdMixByDictService.d.ts +12 -12
  328. package/dist/service/curd/CurdMixByDictService.js +114 -114
  329. package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +30 -30
  330. package/dist/service/curd/CurdMixByLinkToCustomService.js +209 -209
  331. package/dist/service/curd/CurdMixBySysConfigService.d.ts +13 -13
  332. package/dist/service/curd/CurdMixBySysConfigService.js +116 -116
  333. package/dist/service/curd/CurdMixByWorkbenchService.d.ts +11 -11
  334. package/dist/service/curd/CurdMixByWorkbenchService.js +80 -80
  335. package/dist/service/curd/CurdMixService.d.ts +28 -28
  336. package/dist/service/curd/CurdMixService.js +100 -100
  337. package/dist/service/curd/CurdMixUtils.d.ts +57 -57
  338. package/dist/service/curd/CurdMixUtils.js +331 -331
  339. package/dist/service/curd/CurdProService.d.ts +32 -32
  340. package/dist/service/curd/CurdProService.js +215 -215
  341. package/dist/service/curd/fixCfgModel.d.ts +3 -3
  342. package/dist/service/curd/fixCfgModel.js +104 -104
  343. package/dist/service/curd/fixSoftDelete.d.ts +6 -6
  344. package/dist/service/curd/fixSoftDelete.js +43 -43
  345. package/dist/service/flow/FlowConfigService.d.ts +41 -41
  346. package/dist/service/flow/FlowConfigService.js +95 -95
  347. package/dist/service/flow/FlowInstanceCrudService.d.ts +35 -35
  348. package/dist/service/flow/FlowInstanceCrudService.js +257 -257
  349. package/dist/service/flow/FlowInstanceService.d.ts +88 -88
  350. package/dist/service/flow/FlowInstanceService.js +451 -451
  351. package/dist/service/proxyapi/ProxyApiLoadService.d.ts +21 -21
  352. package/dist/service/proxyapi/ProxyApiLoadService.js +167 -167
  353. package/dist/service/proxyapi/ProxyApiService.d.ts +61 -61
  354. package/dist/service/proxyapi/ProxyApiService.js +317 -317
  355. package/dist/service/proxyapi/ProxyApiUtils.d.ts +15 -15
  356. package/dist/service/proxyapi/ProxyApiUtils.js +34 -34
  357. package/dist/service/proxyapi/RouteHandler.d.ts +6 -6
  358. package/dist/service/proxyapi/RouteHandler.js +9 -9
  359. package/dist/service/proxyapi/RouteTrie.d.ts +12 -12
  360. package/dist/service/proxyapi/RouteTrie.js +64 -64
  361. package/dist/service/proxyapi/WeightedRandom.d.ts +9 -9
  362. package/dist/service/proxyapi/WeightedRandom.js +31 -31
  363. package/dist/service/proxyapi/WeightedRoundRobin.d.ts +8 -8
  364. package/dist/service/proxyapi/WeightedRoundRobin.js +33 -33
  365. package/index.d.ts +10 -10
  366. package/package.json +87 -87
  367. package/src/libs/crud-pro/CrudPro.ts +71 -0
  368. package/src/libs/crud-pro/interfaces.ts +22 -0
  369. package/src/libs/crud-pro/models/ServiceHub.ts +2 -2
  370. package/src/libs/crud-pro/services/CrudProDataFilterService.ts +58 -0
  371. package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +10 -1
  372. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +145 -40
  373. package/src/libs/crud-pro/services/CurdProServiceHub.ts +10 -3
  374. package/src/libs/crud-pro/utils/CrudMonitor.ts +13 -13
  375. package/src/libs/utils/AsymmetricCrypto.ts +307 -307
  376. package/src/libs/utils/format-url.ts +29 -29
  377. package/src/libs/utils/render-utils.ts +223 -223
  378. package/src/models/WorkbenchInfoTools.ts +19 -19
  379. package/src/service/SysAppService.ts +103 -103
  380. package/src/service/SysDictDataService.ts +63 -63
  381. package/src/service/SysMenuService.ts +87 -87
  382. package/src/service/WorkbenchService.ts +279 -279
  383. package/src/service/base/cache/CacheServiceFactory.ts +135 -135
  384. package/src/service/base/cache/CtxCache.ts +45 -45
  385. package/src/service/base/cache/DiskCache.ts +90 -90
  386. package/src/service/base/cache/MemoryCache.ts +68 -68
  387. package/src/service/base/cache/NoneCache.ts +24 -24
  388. package/src/service/base/cache/RedisCache.ts +41 -41
  389. package/src/service/curd/CurdMixByAccountService.ts +177 -177
  390. package/src/service/curd/fixSoftDelete.ts +58 -58
  391. package/tsconfig.json +32 -32
@@ -1,114 +1,114 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.redisCache = void 0;
4
- const redis_1 = require("@midwayjs/redis");
5
- const _ = require("lodash");
6
- const md5 = require("md5");
7
- const RedisKeys_1 = require("../models/RedisKeys");
8
- const exceptions_1 = require("../libs/crud-pro/exceptions");
9
- const getRedisService = async (ctx) => {
10
- const service = await ctx.requestContext.getAsync(redis_1.RedisService);
11
- if (!service) {
12
- return await ctx.requestContext.getAsync('redisService');
13
- }
14
- return service;
15
- };
16
- const createError = () => {
17
- return new exceptions_1.CommonException('redis_cache_middleware_error_config', 'redisCache中间件的第一个参数必须是一个字符串数组, 并且以“query.”或“body.”开头');
18
- };
19
- const checkCacheKeyConfigList = (cacheKeyConfigList) => {
20
- if (!Array.isArray(cacheKeyConfigList)) {
21
- throw createError();
22
- }
23
- for (let i = 0; i < cacheKeyConfigList.length; i++) {
24
- const cacheKeyConfig = cacheKeyConfigList[i];
25
- if (typeof cacheKeyConfig !== 'string') {
26
- throw createError();
27
- }
28
- if (!cacheKeyConfig.startsWith('query.') && !cacheKeyConfig.startsWith('body.')) {
29
- throw createError();
30
- }
31
- }
32
- };
33
- // {middleware:[redisCache(['query.id', 'body.id'])]}
34
- const toCacheKey = (ctx, cacheKeyConfigList) => {
35
- checkCacheKeyConfigList(cacheKeyConfigList);
36
- const path = ctx.path;
37
- const query = ctx.query || {};
38
- const body = ctx.request.body || {};
39
- const newCtx = { path, query, body };
40
- // 至少要根据path缓存
41
- const cacheKeyConfigList2 = ['path', ...cacheKeyConfigList];
42
- const strArray = cacheKeyConfigList2.map((key) => {
43
- const value = _.get(newCtx, key);
44
- return { key, value };
45
- });
46
- const strArrayStr = JSON.stringify(strArray);
47
- const strMd5 = md5(strArrayStr);
48
- return RedisKeys_1.RedisKeys.REDIS_LOCK_MIDDILEWARE + strMd5;
49
- };
50
- function toCacheDataString(resData) {
51
- return JSON.stringify(resData);
52
- }
53
- function parseCacheData(cacheData) {
54
- try {
55
- return JSON.parse(cacheData);
56
- }
57
- catch (e) {
58
- return null;
59
- }
60
- }
61
- /**
62
- * Redis缓存中间件
63
- *
64
- * 应用场景:
65
- * 1. 高频查询接口:用户列表、商品详情等读多写少的接口
66
- * 2. 计算密集型接口:统计报表、数据聚合等耗时计算结果
67
- * 3. 外部API调用:第三方接口响应数据缓存,减少调用次数和费用
68
- * 4. 数据库压力缓解:热点数据缓存,降低数据库查询压力
69
- *
70
- * 使用示例:
71
- * ```typescript
72
- * @Get('/product-detail', { middleware: [redisCache(['query.productId'], 300)] }) // 商品详情缓存5分钟
73
- * async getProductDetail(@Query() query: any) {
74
- * // 业务逻辑:查询商品详情
75
- * }
76
- *
77
- * @Post('/report', { middleware: [redisCache(['body.dateRange', 'body.type'], 1800)] }) // 报表数据缓存30分钟
78
- * async generateReport(@Body() body: any) {
79
- * // 业务逻辑:生成统计报表
80
- * }
81
- * ```
82
- *
83
- * @param cacheKeyConfigList 缓存键配置,如 ['query.id', 'body.type']
84
- * @param cacheTimeSecond 缓存时长(秒),默认60秒,范围1-3600秒
85
- */
86
- function redisCache(cacheKeyConfigList, cacheTimeSecond) {
87
- return async (ctx, next) => {
88
- const redisService = await getRedisService(ctx);
89
- // 生成唯一缓存键(基于path + 指定参数)
90
- const cacheKey = toCacheKey(ctx, cacheKeyConfigList);
91
- let cacheTime = typeof cacheTimeSecond === 'number' ? cacheTimeSecond : 60; // 默认缓存1分钟
92
- cacheTime = Math.max(cacheTime, 1); // 至少缓存1秒
93
- cacheTime = Math.min(cacheTime, 60 * 60); // 最长缓存1小时
94
- // 尝试从缓存获取数据
95
- const cacheData = await redisService.get(cacheKey);
96
- if (cacheData) {
97
- // 命中缓存,直接返回
98
- return parseCacheData(cacheData);
99
- }
100
- // 缓存未命中,执行业务逻辑
101
- try {
102
- const resData = await next();
103
- const resDataStr = toCacheDataString(resData);
104
- // 将结果写入缓存
105
- await redisService.set(cacheKey, resDataStr, 'EX', cacheTime);
106
- return resData;
107
- }
108
- catch (e) {
109
- console.error('redisCache', e);
110
- throw e; // 重新抛出异常,让上层处理
111
- }
112
- };
113
- }
114
- exports.redisCache = redisCache;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redisCache = void 0;
4
+ const redis_1 = require("@midwayjs/redis");
5
+ const _ = require("lodash");
6
+ const md5 = require("md5");
7
+ const RedisKeys_1 = require("../models/RedisKeys");
8
+ const exceptions_1 = require("../libs/crud-pro/exceptions");
9
+ const getRedisService = async (ctx) => {
10
+ const service = await ctx.requestContext.getAsync(redis_1.RedisService);
11
+ if (!service) {
12
+ return await ctx.requestContext.getAsync('redisService');
13
+ }
14
+ return service;
15
+ };
16
+ const createError = () => {
17
+ return new exceptions_1.CommonException('redis_cache_middleware_error_config', 'redisCache中间件的第一个参数必须是一个字符串数组, 并且以“query.”或“body.”开头');
18
+ };
19
+ const checkCacheKeyConfigList = (cacheKeyConfigList) => {
20
+ if (!Array.isArray(cacheKeyConfigList)) {
21
+ throw createError();
22
+ }
23
+ for (let i = 0; i < cacheKeyConfigList.length; i++) {
24
+ const cacheKeyConfig = cacheKeyConfigList[i];
25
+ if (typeof cacheKeyConfig !== 'string') {
26
+ throw createError();
27
+ }
28
+ if (!cacheKeyConfig.startsWith('query.') && !cacheKeyConfig.startsWith('body.')) {
29
+ throw createError();
30
+ }
31
+ }
32
+ };
33
+ // {middleware:[redisCache(['query.id', 'body.id'])]}
34
+ const toCacheKey = (ctx, cacheKeyConfigList) => {
35
+ checkCacheKeyConfigList(cacheKeyConfigList);
36
+ const path = ctx.path;
37
+ const query = ctx.query || {};
38
+ const body = ctx.request.body || {};
39
+ const newCtx = { path, query, body };
40
+ // 至少要根据path缓存
41
+ const cacheKeyConfigList2 = ['path', ...cacheKeyConfigList];
42
+ const strArray = cacheKeyConfigList2.map((key) => {
43
+ const value = _.get(newCtx, key);
44
+ return { key, value };
45
+ });
46
+ const strArrayStr = JSON.stringify(strArray);
47
+ const strMd5 = md5(strArrayStr);
48
+ return RedisKeys_1.RedisKeys.REDIS_LOCK_MIDDILEWARE + strMd5;
49
+ };
50
+ function toCacheDataString(resData) {
51
+ return JSON.stringify(resData);
52
+ }
53
+ function parseCacheData(cacheData) {
54
+ try {
55
+ return JSON.parse(cacheData);
56
+ }
57
+ catch (e) {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Redis缓存中间件
63
+ *
64
+ * 应用场景:
65
+ * 1. 高频查询接口:用户列表、商品详情等读多写少的接口
66
+ * 2. 计算密集型接口:统计报表、数据聚合等耗时计算结果
67
+ * 3. 外部API调用:第三方接口响应数据缓存,减少调用次数和费用
68
+ * 4. 数据库压力缓解:热点数据缓存,降低数据库查询压力
69
+ *
70
+ * 使用示例:
71
+ * ```typescript
72
+ * @Get('/product-detail', { middleware: [redisCache(['query.productId'], 300)] }) // 商品详情缓存5分钟
73
+ * async getProductDetail(@Query() query: any) {
74
+ * // 业务逻辑:查询商品详情
75
+ * }
76
+ *
77
+ * @Post('/report', { middleware: [redisCache(['body.dateRange', 'body.type'], 1800)] }) // 报表数据缓存30分钟
78
+ * async generateReport(@Body() body: any) {
79
+ * // 业务逻辑:生成统计报表
80
+ * }
81
+ * ```
82
+ *
83
+ * @param cacheKeyConfigList 缓存键配置,如 ['query.id', 'body.type']
84
+ * @param cacheTimeSecond 缓存时长(秒),默认60秒,范围1-3600秒
85
+ */
86
+ function redisCache(cacheKeyConfigList, cacheTimeSecond) {
87
+ return async (ctx, next) => {
88
+ const redisService = await getRedisService(ctx);
89
+ // 生成唯一缓存键(基于path + 指定参数)
90
+ const cacheKey = toCacheKey(ctx, cacheKeyConfigList);
91
+ let cacheTime = typeof cacheTimeSecond === 'number' ? cacheTimeSecond : 60; // 默认缓存1分钟
92
+ cacheTime = Math.max(cacheTime, 1); // 至少缓存1秒
93
+ cacheTime = Math.min(cacheTime, 60 * 60); // 最长缓存1小时
94
+ // 尝试从缓存获取数据
95
+ const cacheData = await redisService.get(cacheKey);
96
+ if (cacheData) {
97
+ // 命中缓存,直接返回
98
+ return parseCacheData(cacheData);
99
+ }
100
+ // 缓存未命中,执行业务逻辑
101
+ try {
102
+ const resData = await next();
103
+ const resDataStr = toCacheDataString(resData);
104
+ // 将结果写入缓存
105
+ await redisService.set(cacheKey, resDataStr, 'EX', cacheTime);
106
+ return resData;
107
+ }
108
+ catch (e) {
109
+ console.error('redisCache', e);
110
+ throw e; // 重新抛出异常,让上层处理
111
+ }
112
+ };
113
+ }
114
+ exports.redisCache = redisCache;
@@ -1,29 +1,29 @@
1
- import { Context, NextFunction } from '@midwayjs/koa';
2
- /**
3
- * Redis分布式锁中间件
4
- *
5
- * 应用场景:
6
- * 1. 防止重复提交:用户短时间内多次点击提交按钮
7
- * 2. 防止并发冲突:同一用户同时发起多个相同请求
8
- * 3. 资源竞争保护:多个请求同时操作同一资源(如订单、库存)
9
- * 4. 导出任务控制:防止用户重复触发耗时的导出任务
10
- *
11
- * 使用示例:
12
- * ```typescript
13
- * @Post('/submit-order', { middleware: [redisLock(['body.orderId'], 30)] }) // 根据orderId锁定30秒
14
- * async submitOrder(@Body() body: any) {
15
- * // 业务逻辑:处理订单
16
- * }
17
- *
18
- *
19
- * @Post('/createApp', { middleware: [redisLock(['query.userId'], 60)] }) // 根据userId锁定60秒
20
- * async exportData(@Query() query: any) {
21
- * // 业务逻辑:导出数据
22
- * }
23
- * ```
24
- *
25
- * @param lockKeyConfigList 锁定的键配置,如 ['query.id', 'body.userId']
26
- * @param maxLockTimeSecond 锁定时长(秒),默认60秒,范围1-300秒
27
- */
28
- declare function redisLock(lockKeyConfigList: string[], maxLockTimeSecond?: number): (ctx: Context, next: NextFunction) => Promise<any>;
29
- export { redisLock };
1
+ import { Context, NextFunction } from '@midwayjs/koa';
2
+ /**
3
+ * Redis分布式锁中间件
4
+ *
5
+ * 应用场景:
6
+ * 1. 防止重复提交:用户短时间内多次点击提交按钮
7
+ * 2. 防止并发冲突:同一用户同时发起多个相同请求
8
+ * 3. 资源竞争保护:多个请求同时操作同一资源(如订单、库存)
9
+ * 4. 导出任务控制:防止用户重复触发耗时的导出任务
10
+ *
11
+ * 使用示例:
12
+ * ```typescript
13
+ * @Post('/submit-order', { middleware: [redisLock(['body.orderId'], 30)] }) // 根据orderId锁定30秒
14
+ * async submitOrder(@Body() body: any) {
15
+ * // 业务逻辑:处理订单
16
+ * }
17
+ *
18
+ *
19
+ * @Post('/createApp', { middleware: [redisLock(['query.userId'], 60)] }) // 根据userId锁定60秒
20
+ * async exportData(@Query() query: any) {
21
+ * // 业务逻辑:导出数据
22
+ * }
23
+ * ```
24
+ *
25
+ * @param lockKeyConfigList 锁定的键配置,如 ['query.id', 'body.userId']
26
+ * @param maxLockTimeSecond 锁定时长(秒),默认60秒,范围1-300秒
27
+ */
28
+ declare function redisLock(lockKeyConfigList: string[], maxLockTimeSecond?: number): (ctx: Context, next: NextFunction) => Promise<any>;
29
+ export { redisLock };
@@ -1,106 +1,106 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.redisLock = void 0;
4
- const redis_1 = require("@midwayjs/redis");
5
- const _ = require("lodash");
6
- const md5 = require("md5");
7
- const RedisKeys_1 = require("../models/RedisKeys");
8
- const exceptions_1 = require("../libs/crud-pro/exceptions");
9
- const getRedisService = async (ctx) => {
10
- const service = await ctx.requestContext.getAsync(redis_1.RedisService);
11
- if (!service) {
12
- return await ctx.requestContext.getAsync('redisService');
13
- }
14
- return service;
15
- };
16
- const createError = () => {
17
- return new exceptions_1.CommonException('redis_lock_middleware_error_config', 'redisLock中间件的第一个参数必须是一个字符串数组, 并且以“query.”或“body.”开头');
18
- };
19
- const checkLockKeyConfigList = (lockKeyConfigList) => {
20
- if (!Array.isArray(lockKeyConfigList)) {
21
- throw createError();
22
- }
23
- for (let i = 0; i < lockKeyConfigList.length; i++) {
24
- const lockKeyConfig = lockKeyConfigList[i];
25
- if (typeof lockKeyConfig !== 'string') {
26
- throw createError();
27
- }
28
- if (!lockKeyConfig.startsWith('query.') && !lockKeyConfig.startsWith('body.')) {
29
- throw createError();
30
- }
31
- }
32
- };
33
- // {middleware:[redisLock(['query.id', 'body.id'])]}
34
- const toLockKey = (ctx, lockKeyConfigList) => {
35
- checkLockKeyConfigList(lockKeyConfigList);
36
- const path = ctx.path;
37
- const query = ctx.query || {};
38
- const body = ctx.request.body || {};
39
- const newCtx = { path, query, body };
40
- // 至少要根据path锁
41
- const lockKeyConfigList2 = ['path', ...lockKeyConfigList];
42
- const strArray = lockKeyConfigList2.map((key) => {
43
- const value = _.get(newCtx, key);
44
- return { key, value };
45
- });
46
- const strArrayStr = JSON.stringify(strArray);
47
- const strMd5 = md5(strArrayStr);
48
- return RedisKeys_1.RedisKeys.REDIS_LOCK_MIDDILEWARE + strMd5;
49
- };
50
- /**
51
- * Redis分布式锁中间件
52
- *
53
- * 应用场景:
54
- * 1. 防止重复提交:用户短时间内多次点击提交按钮
55
- * 2. 防止并发冲突:同一用户同时发起多个相同请求
56
- * 3. 资源竞争保护:多个请求同时操作同一资源(如订单、库存)
57
- * 4. 导出任务控制:防止用户重复触发耗时的导出任务
58
- *
59
- * 使用示例:
60
- * ```typescript
61
- * @Post('/submit-order', { middleware: [redisLock(['body.orderId'], 30)] }) // 根据orderId锁定30秒
62
- * async submitOrder(@Body() body: any) {
63
- * // 业务逻辑:处理订单
64
- * }
65
- *
66
- *
67
- * @Post('/createApp', { middleware: [redisLock(['query.userId'], 60)] }) // 根据userId锁定60秒
68
- * async exportData(@Query() query: any) {
69
- * // 业务逻辑:导出数据
70
- * }
71
- * ```
72
- *
73
- * @param lockKeyConfigList 锁定的键配置,如 ['query.id', 'body.userId']
74
- * @param maxLockTimeSecond 锁定时长(秒),默认60秒,范围1-300秒
75
- */
76
- function redisLock(lockKeyConfigList, maxLockTimeSecond) {
77
- return async (ctx, next) => {
78
- const redisService = await getRedisService(ctx);
79
- // 生成唯一锁键(基于path + 指定参数)
80
- const lockKey = toLockKey(ctx, lockKeyConfigList);
81
- let lockTime = typeof maxLockTimeSecond === 'number' ? maxLockTimeSecond : 60; // 默认锁住1分钟(失败的情况)
82
- lockTime = Math.max(lockTime, 1); // 至少锁一秒 (失败的情况)
83
- lockTime = Math.min(lockTime, 5 * 60); // 最长锁 5分钟(失败的情况)
84
- // 尝试获取锁(SET key value EX seconds NX)
85
- // NX:只在键不存在时设置,实现互斥
86
- // EX:设置过期时间,防止死锁
87
- const lock = await redisService.set(lockKey, 1, 'EX', lockTime, 'NX');
88
- if (lock !== 'OK') {
89
- // 获取锁失败,说明有其他请求正在处理
90
- return {
91
- success: false,
92
- message: '您请求的接口当前正在处理中,请稍后再试',
93
- code: 'redis_lock_middleware_error_locked',
94
- };
95
- }
96
- // 执行业务逻辑
97
- try {
98
- return await next();
99
- }
100
- finally {
101
- // 无论成功失败,业务逻辑执行完毕,都立即释放锁
102
- await redisService.del(lockKey);
103
- }
104
- };
105
- }
106
- exports.redisLock = redisLock;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redisLock = void 0;
4
+ const redis_1 = require("@midwayjs/redis");
5
+ const _ = require("lodash");
6
+ const md5 = require("md5");
7
+ const RedisKeys_1 = require("../models/RedisKeys");
8
+ const exceptions_1 = require("../libs/crud-pro/exceptions");
9
+ const getRedisService = async (ctx) => {
10
+ const service = await ctx.requestContext.getAsync(redis_1.RedisService);
11
+ if (!service) {
12
+ return await ctx.requestContext.getAsync('redisService');
13
+ }
14
+ return service;
15
+ };
16
+ const createError = () => {
17
+ return new exceptions_1.CommonException('redis_lock_middleware_error_config', 'redisLock中间件的第一个参数必须是一个字符串数组, 并且以“query.”或“body.”开头');
18
+ };
19
+ const checkLockKeyConfigList = (lockKeyConfigList) => {
20
+ if (!Array.isArray(lockKeyConfigList)) {
21
+ throw createError();
22
+ }
23
+ for (let i = 0; i < lockKeyConfigList.length; i++) {
24
+ const lockKeyConfig = lockKeyConfigList[i];
25
+ if (typeof lockKeyConfig !== 'string') {
26
+ throw createError();
27
+ }
28
+ if (!lockKeyConfig.startsWith('query.') && !lockKeyConfig.startsWith('body.')) {
29
+ throw createError();
30
+ }
31
+ }
32
+ };
33
+ // {middleware:[redisLock(['query.id', 'body.id'])]}
34
+ const toLockKey = (ctx, lockKeyConfigList) => {
35
+ checkLockKeyConfigList(lockKeyConfigList);
36
+ const path = ctx.path;
37
+ const query = ctx.query || {};
38
+ const body = ctx.request.body || {};
39
+ const newCtx = { path, query, body };
40
+ // 至少要根据path锁
41
+ const lockKeyConfigList2 = ['path', ...lockKeyConfigList];
42
+ const strArray = lockKeyConfigList2.map((key) => {
43
+ const value = _.get(newCtx, key);
44
+ return { key, value };
45
+ });
46
+ const strArrayStr = JSON.stringify(strArray);
47
+ const strMd5 = md5(strArrayStr);
48
+ return RedisKeys_1.RedisKeys.REDIS_LOCK_MIDDILEWARE + strMd5;
49
+ };
50
+ /**
51
+ * Redis分布式锁中间件
52
+ *
53
+ * 应用场景:
54
+ * 1. 防止重复提交:用户短时间内多次点击提交按钮
55
+ * 2. 防止并发冲突:同一用户同时发起多个相同请求
56
+ * 3. 资源竞争保护:多个请求同时操作同一资源(如订单、库存)
57
+ * 4. 导出任务控制:防止用户重复触发耗时的导出任务
58
+ *
59
+ * 使用示例:
60
+ * ```typescript
61
+ * @Post('/submit-order', { middleware: [redisLock(['body.orderId'], 30)] }) // 根据orderId锁定30秒
62
+ * async submitOrder(@Body() body: any) {
63
+ * // 业务逻辑:处理订单
64
+ * }
65
+ *
66
+ *
67
+ * @Post('/createApp', { middleware: [redisLock(['query.userId'], 60)] }) // 根据userId锁定60秒
68
+ * async exportData(@Query() query: any) {
69
+ * // 业务逻辑:导出数据
70
+ * }
71
+ * ```
72
+ *
73
+ * @param lockKeyConfigList 锁定的键配置,如 ['query.id', 'body.userId']
74
+ * @param maxLockTimeSecond 锁定时长(秒),默认60秒,范围1-300秒
75
+ */
76
+ function redisLock(lockKeyConfigList, maxLockTimeSecond) {
77
+ return async (ctx, next) => {
78
+ const redisService = await getRedisService(ctx);
79
+ // 生成唯一锁键(基于path + 指定参数)
80
+ const lockKey = toLockKey(ctx, lockKeyConfigList);
81
+ let lockTime = typeof maxLockTimeSecond === 'number' ? maxLockTimeSecond : 60; // 默认锁住1分钟(失败的情况)
82
+ lockTime = Math.max(lockTime, 1); // 至少锁一秒 (失败的情况)
83
+ lockTime = Math.min(lockTime, 5 * 60); // 最长锁 5分钟(失败的情况)
84
+ // 尝试获取锁(SET key value EX seconds NX)
85
+ // NX:只在键不存在时设置,实现互斥
86
+ // EX:设置过期时间,防止死锁
87
+ const lock = await redisService.set(lockKey, 1, 'EX', lockTime, 'NX');
88
+ if (lock !== 'OK') {
89
+ // 获取锁失败,说明有其他请求正在处理
90
+ return {
91
+ success: false,
92
+ message: '您请求的接口当前正在处理中,请稍后再试',
93
+ code: 'redis_lock_middleware_error_locked',
94
+ };
95
+ }
96
+ // 执行业务逻辑
97
+ try {
98
+ return await next();
99
+ }
100
+ finally {
101
+ // 无论成功失败,业务逻辑执行完毕,都立即释放锁
102
+ await redisService.del(lockKey);
103
+ }
104
+ };
105
+ }
106
+ exports.redisLock = redisLock;
@@ -1,55 +1,55 @@
1
- import { NextFunction, Context } from '@midwayjs/koa';
2
- /**
3
- * 事务中间件 - 数据库事务自动管理
4
- *
5
- * 核心职责:
6
- * 1. 自动开启事务:请求开始时自动调用 beginTx() 开启数据库事务
7
- * 2. 自动提交事务:请求成功完成后自动调用 commitTx() 提交所有变更
8
- * 3. 自动回滚事务:请求异常时自动调用 rollbackTx() 回滚所有变更
9
- * 4. 自动释放连接:无论成功或失败都调用 releaseTx() 释放数据库连接
10
- *
11
- * 应用场景:
12
- * 1. 订单处理:创建订单 + 扣减库存 + 生成物流单,任一步骤失败全部回滚
13
- * 2. 资金转账:扣款账户减少 + 收款账户增加,保证两步同时成功或同时失败
14
- * 3. 批量操作:导入100条数据,要么全部成功,要么全部不导入(避免脏数据)
15
- * 4. 状态关联更新:更新订单状态 + 更新用户积分 + 更新商品销量,保证数据一致性
16
- * 5. 工作流审批:审批通过 + 更新流程状态 + 发送通知,确保流程完整性
17
- *
18
- * 使用方式:
19
- * 在 Controller 方法的 middleware 配置中使用:
20
- *
21
- * @example
22
- * ```typescript
23
- * import { Controller, Post, Inject } from '@midwayjs/core';
24
- * import { startTransaction } from '../middleware/tx.middleware';
25
- *
26
- * @Controller('/api/order')
27
- * export class OrderController {
28
- * @Inject()
29
- * orderService: OrderService;
30
- *
31
- * @Post('/create', { middleware: [startTransaction()] }) // 在路由配置中使用
32
- * async createOrder(@Body() dto: CreateOrderDto) {
33
- * // 1. 创建订单记录
34
- * const order = await this.orderService.create(dto);
35
- *
36
- * // 2. 扣减商品库存
37
- * await this.productService.decreaseStock(dto.productId, dto.quantity);
38
- *
39
- * // 3. 生成支付单
40
- * await this.paymentService.createPayment(order.id, dto.amount);
41
- *
42
- * // 如果任何一步失败,以上所有操作都会自动回滚
43
- * return order;
44
- * }
45
- * }
46
- * ```
47
- *
48
- * 注意事项:
49
- * - 事务中的所有数据库操作必须使用同一个 ctx.transaction 实例
50
- * - 避免在事务中执行长时间操作(如HTTP请求、文件IO),会长时间占用数据库连接
51
- * - 事务嵌套需要特别注意,确保内层事务与外层事务共享同一连接
52
- * - 异常会被捕获、记录日志并重新抛出,由全局中间件统一处理
53
- */
54
- declare function startTransaction(): (ctx: Context, next: NextFunction) => Promise<any>;
55
- export { startTransaction };
1
+ import { NextFunction, Context } from '@midwayjs/koa';
2
+ /**
3
+ * 事务中间件 - 数据库事务自动管理
4
+ *
5
+ * 核心职责:
6
+ * 1. 自动开启事务:请求开始时自动调用 beginTx() 开启数据库事务
7
+ * 2. 自动提交事务:请求成功完成后自动调用 commitTx() 提交所有变更
8
+ * 3. 自动回滚事务:请求异常时自动调用 rollbackTx() 回滚所有变更
9
+ * 4. 自动释放连接:无论成功或失败都调用 releaseTx() 释放数据库连接
10
+ *
11
+ * 应用场景:
12
+ * 1. 订单处理:创建订单 + 扣减库存 + 生成物流单,任一步骤失败全部回滚
13
+ * 2. 资金转账:扣款账户减少 + 收款账户增加,保证两步同时成功或同时失败
14
+ * 3. 批量操作:导入100条数据,要么全部成功,要么全部不导入(避免脏数据)
15
+ * 4. 状态关联更新:更新订单状态 + 更新用户积分 + 更新商品销量,保证数据一致性
16
+ * 5. 工作流审批:审批通过 + 更新流程状态 + 发送通知,确保流程完整性
17
+ *
18
+ * 使用方式:
19
+ * 在 Controller 方法的 middleware 配置中使用:
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { Controller, Post, Inject } from '@midwayjs/core';
24
+ * import { startTransaction } from '../middleware/tx.middleware';
25
+ *
26
+ * @Controller('/api/order')
27
+ * export class OrderController {
28
+ * @Inject()
29
+ * orderService: OrderService;
30
+ *
31
+ * @Post('/create', { middleware: [startTransaction()] }) // 在路由配置中使用
32
+ * async createOrder(@Body() dto: CreateOrderDto) {
33
+ * // 1. 创建订单记录
34
+ * const order = await this.orderService.create(dto);
35
+ *
36
+ * // 2. 扣减商品库存
37
+ * await this.productService.decreaseStock(dto.productId, dto.quantity);
38
+ *
39
+ * // 3. 生成支付单
40
+ * await this.paymentService.createPayment(order.id, dto.amount);
41
+ *
42
+ * // 如果任何一步失败,以上所有操作都会自动回滚
43
+ * return order;
44
+ * }
45
+ * }
46
+ * ```
47
+ *
48
+ * 注意事项:
49
+ * - 事务中的所有数据库操作必须使用同一个 ctx.transaction 实例
50
+ * - 避免在事务中执行长时间操作(如HTTP请求、文件IO),会长时间占用数据库连接
51
+ * - 事务嵌套需要特别注意,确保内层事务与外层事务共享同一连接
52
+ * - 异常会被捕获、记录日志并重新抛出,由全局中间件统一处理
53
+ */
54
+ declare function startTransaction(): (ctx: Context, next: NextFunction) => Promise<any>;
55
+ export { startTransaction };