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.
- package/.eslintrc.json +14 -14
- package/.prettierrc.js +4 -4
- package/README.md +406 -406
- package/dist/config/config.default.d.ts +3 -3
- package/dist/config/config.default.js +177 -177
- package/dist/config/utils.d.ts +1 -1
- package/dist/config/utils.js +23 -23
- package/dist/configuration.d.ts +7 -7
- package/dist/configuration.js +113 -113
- package/dist/controller/base/BaseApiController.d.ts +49 -49
- package/dist/controller/base/BaseApiController.js +198 -198
- package/dist/controller/gateway/AnyApiGatewayController.d.ts +13 -13
- package/dist/controller/gateway/AnyApiGatewayController.js +55 -55
- package/dist/controller/gateway/AsyncTaskController.d.ts +20 -20
- package/dist/controller/gateway/AsyncTaskController.js +181 -181
- package/dist/controller/gateway/CrudMtdGatewayController.d.ts +21 -21
- package/dist/controller/gateway/CrudMtdGatewayController.js +122 -122
- package/dist/controller/gateway/CrudStdGatewayController.d.ts +39 -39
- package/dist/controller/gateway/CrudStdGatewayController.js +149 -149
- package/dist/controller/gateway/DocGatewayController.d.ts +27 -27
- package/dist/controller/gateway/DocGatewayController.js +181 -181
- package/dist/controller/gateway/FileController.d.ts +32 -32
- package/dist/controller/gateway/FileController.js +160 -160
- package/dist/controller/gateway/FlowInstanceController.d.ts +16 -16
- package/dist/controller/gateway/FlowInstanceController.js +48 -48
- package/dist/controller/gateway/ProxyApiGatewayController.d.ts +18 -18
- package/dist/controller/gateway/ProxyApiGatewayController.js +78 -78
- package/dist/controller/gateway/PublicApiController.d.ts +33 -33
- package/dist/controller/gateway/PublicApiController.js +194 -194
- package/dist/controller/gateway/StaticController.d.ts +23 -23
- package/dist/controller/gateway/StaticController.js +280 -280
- package/dist/controller/helpers.controller.d.ts +36 -36
- package/dist/controller/helpers.controller.js +187 -187
- package/dist/controller/home.controller.d.ts +9 -9
- package/dist/controller/home.controller.js +78 -78
- package/dist/controller/manage/AnyApiMangeApi.d.ts +10 -10
- package/dist/controller/manage/AnyApiMangeApi.js +98 -98
- package/dist/controller/manage/AppLogMangeApi.d.ts +10 -10
- package/dist/controller/manage/AppLogMangeApi.js +88 -88
- package/dist/controller/manage/AppMangeApi.d.ts +12 -12
- package/dist/controller/manage/AppMangeApi.js +101 -101
- package/dist/controller/manage/AppPageMangeApi.d.ts +10 -10
- package/dist/controller/manage/AppPageMangeApi.js +87 -87
- package/dist/controller/manage/AppSchemaHistoryApi.d.ts +10 -10
- package/dist/controller/manage/AppSchemaHistoryApi.js +83 -83
- package/dist/controller/manage/CrudMethodsMangeApi.d.ts +10 -10
- package/dist/controller/manage/CrudMethodsMangeApi.js +84 -84
- package/dist/controller/manage/CrudStandardDesignApi.d.ts +46 -46
- package/dist/controller/manage/CrudStandardDesignApi.js +367 -367
- package/dist/controller/manage/DataDictManageApi.d.ts +17 -17
- package/dist/controller/manage/DataDictManageApi.js +165 -165
- package/dist/controller/manage/DeployManageApi.d.ts +21 -21
- package/dist/controller/manage/DeployManageApi.js +203 -203
- package/dist/controller/manage/DocLibManageApi.d.ts +10 -10
- package/dist/controller/manage/DocLibManageApi.js +104 -104
- package/dist/controller/manage/DocManageApi.d.ts +11 -11
- package/dist/controller/manage/DocManageApi.js +130 -130
- package/dist/controller/manage/FileManageApi.d.ts +13 -13
- package/dist/controller/manage/FileManageApi.js +77 -77
- package/dist/controller/manage/FlowConfigManageApi.d.ts +12 -12
- package/dist/controller/manage/FlowConfigManageApi.js +109 -109
- package/dist/controller/manage/LowCodeTplManageApi.d.ts +13 -13
- package/dist/controller/manage/LowCodeTplManageApi.js +86 -86
- package/dist/controller/manage/MenuManageApi.d.ts +11 -11
- package/dist/controller/manage/MenuManageApi.js +104 -104
- package/dist/controller/manage/ProxyApiMangeApi.d.ts +10 -10
- package/dist/controller/manage/ProxyApiMangeApi.js +87 -87
- package/dist/controller/manage/SuperAdminManageApi.d.ts +24 -24
- package/dist/controller/manage/SuperAdminManageApi.js +153 -153
- package/dist/controller/manage/SysConfigMangeApi.d.ts +12 -12
- package/dist/controller/manage/SysConfigMangeApi.js +133 -133
- package/dist/controller/manage/SystemInfoManageApi.d.ts +12 -12
- package/dist/controller/manage/SystemInfoManageApi.js +82 -82
- package/dist/controller/manage/UserAccountManageApi.d.ts +16 -16
- package/dist/controller/manage/UserAccountManageApi.js +153 -153
- package/dist/controller/manage/WorkbenchMangeApi.d.ts +11 -11
- package/dist/controller/manage/WorkbenchMangeApi.js +106 -106
- package/dist/controller/myinfo/AuthController.d.ts +37 -37
- package/dist/controller/myinfo/AuthController.js +157 -157
- package/dist/controller/myinfo/MyInfoController.d.ts +13 -13
- package/dist/controller/myinfo/MyInfoController.js +51 -51
- package/dist/controller/render/AppRenderController.d.ts +12 -12
- package/dist/controller/render/AppRenderController.js +93 -93
- package/dist/controller/test.controller.d.ts +8 -8
- package/dist/controller/test.controller.js +51 -51
- package/dist/filter/default.filter.d.ts +7 -7
- package/dist/filter/default.filter.js +23 -23
- package/dist/filter/notfound.filter.d.ts +5 -5
- package/dist/filter/notfound.filter.js +20 -20
- package/dist/index.d.ts +111 -111
- package/dist/index.js +129 -129
- package/dist/interface.d.ts +30 -30
- package/dist/interface.js +3 -3
- package/dist/libs/crud-pro/CrudPro.d.ts +51 -37
- package/dist/libs/crud-pro/CrudPro.js +207 -146
- package/dist/libs/crud-pro/defaultConfigs.d.ts +4 -4
- package/dist/libs/crud-pro/defaultConfigs.js +15 -15
- package/dist/libs/crud-pro/exceptions.d.ts +106 -106
- package/dist/libs/crud-pro/exceptions.js +119 -119
- package/dist/libs/crud-pro/interfaces.d.ts +195 -175
- package/dist/libs/crud-pro/interfaces.js +12 -12
- package/dist/libs/crud-pro/models/ExecuteContext.d.ts +50 -50
- package/dist/libs/crud-pro/models/ExecuteContext.js +87 -87
- package/dist/libs/crud-pro/models/ExecuteContextFunc.d.ts +38 -38
- package/dist/libs/crud-pro/models/ExecuteContextFunc.js +72 -72
- package/dist/libs/crud-pro/models/FuncContext.d.ts +18 -18
- package/dist/libs/crud-pro/models/FuncContext.js +6 -6
- package/dist/libs/crud-pro/models/RequestCfgModel.d.ts +65 -65
- package/dist/libs/crud-pro/models/RequestCfgModel.js +81 -81
- package/dist/libs/crud-pro/models/RequestModel.d.ts +25 -25
- package/dist/libs/crud-pro/models/RequestModel.js +113 -113
- package/dist/libs/crud-pro/models/ResModel.d.ts +20 -20
- package/dist/libs/crud-pro/models/ResModel.js +2 -2
- package/dist/libs/crud-pro/models/ServiceHub.d.ts +20 -20
- package/dist/libs/crud-pro/models/ServiceHub.js +2 -2
- package/dist/libs/crud-pro/models/SqlCfgModel.d.ts +23 -23
- package/dist/libs/crud-pro/models/SqlCfgModel.js +40 -40
- package/dist/libs/crud-pro/models/SqlSegArg.d.ts +6 -6
- package/dist/libs/crud-pro/models/SqlSegArg.js +12 -12
- package/dist/libs/crud-pro/models/Transaction.d.ts +50 -50
- package/dist/libs/crud-pro/models/Transaction.js +184 -184
- package/dist/libs/crud-pro/models/TransactionMySQL.d.ts +19 -19
- package/dist/libs/crud-pro/models/TransactionMySQL.js +48 -48
- package/dist/libs/crud-pro/models/TransactionPostgres.d.ts +19 -19
- package/dist/libs/crud-pro/models/TransactionPostgres.js +64 -64
- package/dist/libs/crud-pro/models/TransactionSqlServer.d.ts +9 -9
- package/dist/libs/crud-pro/models/TransactionSqlServer.js +61 -61
- package/dist/libs/crud-pro/models/keys.d.ts +111 -111
- package/dist/libs/crud-pro/models/keys.js +156 -156
- package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +11 -11
- package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +73 -73
- package/dist/libs/crud-pro/services/CrudProDataFilterService.d.ts +17 -0
- package/dist/libs/crud-pro/services/CrudProDataFilterService.js +53 -0
- package/dist/libs/crud-pro/services/CrudProExecuteFuncService.d.ts +9 -9
- package/dist/libs/crud-pro/services/CrudProExecuteFuncService.js +125 -125
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.d.ts +17 -17
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +224 -224
- package/dist/libs/crud-pro/services/CrudProFieldUpdateService.d.ts +9 -9
- package/dist/libs/crud-pro/services/CrudProFieldUpdateService.js +51 -51
- package/dist/libs/crud-pro/services/CrudProFieldValidateService.d.ts +13 -13
- package/dist/libs/crud-pro/services/CrudProFieldValidateService.js +148 -148
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.d.ts +25 -25
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +385 -385
- package/dist/libs/crud-pro/services/CrudProGenSqlService.d.ts +25 -25
- package/dist/libs/crud-pro/services/CrudProGenSqlService.js +165 -165
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.d.ts +32 -32
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +345 -339
- package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +24 -24
- package/dist/libs/crud-pro/services/CrudProServiceBase.js +88 -88
- package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +12 -9
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +167 -77
- package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +34 -32
- package/dist/libs/crud-pro/services/CurdProServiceHub.js +69 -64
- package/dist/libs/crud-pro/utils/CompareUtils.d.ts +9 -9
- package/dist/libs/crud-pro/utils/CompareUtils.js +25 -25
- package/dist/libs/crud-pro/utils/CrudMonitor.d.ts +9 -9
- package/dist/libs/crud-pro/utils/CrudMonitor.js +12 -12
- package/dist/libs/crud-pro/utils/DatabaseName.d.ts +9 -9
- package/dist/libs/crud-pro/utils/DatabaseName.js +50 -50
- package/dist/libs/crud-pro/utils/DateTimeUtils.d.ts +7 -7
- package/dist/libs/crud-pro/utils/DateTimeUtils.js +21 -21
- package/dist/libs/crud-pro/utils/MemoryRefreshCache.d.ts +19 -19
- package/dist/libs/crud-pro/utils/MemoryRefreshCache.js +47 -47
- package/dist/libs/crud-pro/utils/MessageParseUtils.d.ts +5 -5
- package/dist/libs/crud-pro/utils/MessageParseUtils.js +33 -33
- package/dist/libs/crud-pro/utils/MixinUtils.d.ts +40 -40
- package/dist/libs/crud-pro/utils/MixinUtils.js +259 -259
- package/dist/libs/crud-pro/utils/ModelUtils.d.ts +11 -11
- package/dist/libs/crud-pro/utils/ModelUtils.js +54 -54
- package/dist/libs/crud-pro/utils/MultiKeyMap.d.ts +11 -11
- package/dist/libs/crud-pro/utils/MultiKeyMap.js +63 -63
- package/dist/libs/crud-pro/utils/SqlFuncUtils.d.ts +5 -5
- package/dist/libs/crud-pro/utils/SqlFuncUtils.js +29 -29
- package/dist/libs/crud-pro/utils/TypeUtils.d.ts +40 -40
- package/dist/libs/crud-pro/utils/TypeUtils.js +166 -166
- package/dist/libs/crud-pro/utils/ValidateUtils.d.ts +3 -3
- package/dist/libs/crud-pro/utils/ValidateUtils.js +165 -165
- package/dist/libs/crud-pro/utils/pool/MySQLUtils.d.ts +3 -3
- package/dist/libs/crud-pro/utils/pool/MySQLUtils.js +19 -19
- package/dist/libs/crud-pro/utils/pool/PostgresUtils.d.ts +3 -3
- package/dist/libs/crud-pro/utils/pool/PostgresUtils.js +20 -20
- package/dist/libs/crud-pro/utils/pool/SqlServerUtils.d.ts +3 -3
- package/dist/libs/crud-pro/utils/pool/SqlServerUtils.js +20 -20
- package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.d.ts +4 -4
- package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.js +35 -35
- package/dist/libs/crud-pro/utils/sqlConvert/convertMix.js +24 -24
- package/dist/libs/crud-pro/utils/sqlConvert/convertMsSql.d.ts +2 -2
- package/dist/libs/crud-pro/utils/sqlConvert/convertMsSql.js +14 -14
- package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.d.ts +2 -2
- package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.js +14 -14
- package/dist/libs/global-config/global-config.d.ts +71 -71
- package/dist/libs/global-config/global-config.js +38 -38
- package/dist/libs/utils/AsymmetricCrypto.d.ts +76 -76
- package/dist/libs/utils/AsymmetricCrypto.js +261 -261
- package/dist/libs/utils/base64.d.ts +9 -9
- package/dist/libs/utils/base64.js +42 -42
- package/dist/libs/utils/common-dto.d.ts +18 -18
- package/dist/libs/utils/common-dto.js +40 -40
- package/dist/libs/utils/crypto-utils.d.ts +3 -3
- package/dist/libs/utils/crypto-utils.js +55 -55
- package/dist/libs/utils/errorToString.d.ts +20 -20
- package/dist/libs/utils/errorToString.js +79 -79
- package/dist/libs/utils/fatcms-request.d.ts +45 -45
- package/dist/libs/utils/fatcms-request.js +161 -161
- package/dist/libs/utils/format-url.d.ts +17 -17
- package/dist/libs/utils/format-url.js +30 -30
- package/dist/libs/utils/functions.d.ts +11 -11
- package/dist/libs/utils/functions.js +99 -99
- package/dist/libs/utils/ordernum-utils.d.ts +22 -22
- package/dist/libs/utils/ordernum-utils.js +35 -35
- package/dist/libs/utils/parseConfig.d.ts +8 -8
- package/dist/libs/utils/parseConfig.js +47 -47
- package/dist/libs/utils/parseCreateSql.d.ts +10 -10
- package/dist/libs/utils/parseCreateSql.js +87 -87
- package/dist/libs/utils/render-utils.d.ts +40 -40
- package/dist/libs/utils/render-utils.js +158 -158
- package/dist/middleware/forbidden.middleware.d.ts +74 -74
- package/dist/middleware/forbidden.middleware.js +318 -318
- package/dist/middleware/global.middleware.d.ts +40 -40
- package/dist/middleware/global.middleware.js +310 -310
- package/dist/middleware/permission.middleware.d.ts +88 -88
- package/dist/middleware/permission.middleware.js +145 -145
- package/dist/middleware/rediscache.middleware.d.ts +28 -28
- package/dist/middleware/rediscache.middleware.js +114 -114
- package/dist/middleware/redislock.middleware.d.ts +29 -29
- package/dist/middleware/redislock.middleware.js +106 -106
- package/dist/middleware/tx.middleware.d.ts +55 -55
- package/dist/middleware/tx.middleware.js +83 -83
- package/dist/models/AsyncTaskModel.d.ts +74 -74
- package/dist/models/AsyncTaskModel.js +31 -31
- package/dist/models/FlowModel.d.ts +227 -227
- package/dist/models/FlowModel.js +53 -53
- package/dist/models/RedisKeys.d.ts +15 -15
- package/dist/models/RedisKeys.js +18 -18
- package/dist/models/SystemEntities.d.ts +118 -118
- package/dist/models/SystemEntities.js +18 -18
- package/dist/models/SystemPerm.d.ts +96 -96
- package/dist/models/SystemPerm.js +101 -101
- package/dist/models/SystemTables.d.ts +25 -25
- package/dist/models/SystemTables.js +28 -28
- package/dist/models/WorkbenchInfoTools.d.ts +7 -7
- package/dist/models/WorkbenchInfoTools.js +20 -20
- package/dist/models/bizmodels.d.ts +150 -150
- package/dist/models/bizmodels.js +62 -62
- package/dist/models/contextLogger.d.ts +27 -27
- package/dist/models/contextLogger.js +119 -119
- package/dist/models/devops.d.ts +12 -12
- package/dist/models/devops.js +19 -19
- package/dist/models/userSession.d.ts +67 -67
- package/dist/models/userSession.js +179 -179
- package/dist/schedule/anonymousContext.d.ts +15 -15
- package/dist/schedule/anonymousContext.js +74 -74
- package/dist/schedule/index.d.ts +4 -4
- package/dist/schedule/index.js +10 -10
- package/dist/schedule/runSchedule.d.ts +12 -12
- package/dist/schedule/runSchedule.js +68 -68
- package/dist/schedule/scheduleNames.d.ts +15 -15
- package/dist/schedule/scheduleNames.js +19 -19
- package/dist/service/AuthService.d.ts +56 -56
- package/dist/service/AuthService.js +251 -251
- package/dist/service/EnumInfoService.d.ts +30 -30
- package/dist/service/EnumInfoService.js +97 -97
- package/dist/service/FileCenterService.d.ts +64 -64
- package/dist/service/FileCenterService.js +422 -422
- package/dist/service/SysAppService.d.ts +15 -15
- package/dist/service/SysAppService.js +108 -108
- package/dist/service/SysConfigService.d.ts +10 -10
- package/dist/service/SysConfigService.js +64 -64
- package/dist/service/SysDictDataService.d.ts +9 -9
- package/dist/service/SysDictDataService.js +72 -72
- package/dist/service/SysMenuService.d.ts +51 -51
- package/dist/service/SysMenuService.js +58 -58
- package/dist/service/UserAccountService.d.ts +23 -23
- package/dist/service/UserAccountService.js +107 -107
- package/dist/service/UserSessionService.d.ts +43 -43
- package/dist/service/UserSessionService.js +163 -163
- package/dist/service/VisitStatService.d.ts +14 -14
- package/dist/service/VisitStatService.js +161 -161
- package/dist/service/WorkbenchService.d.ts +59 -59
- package/dist/service/WorkbenchService.js +249 -249
- package/dist/service/anyapi/AnyApiSandboxService.d.ts +15 -15
- package/dist/service/anyapi/AnyApiSandboxService.js +110 -110
- package/dist/service/anyapi/AnyApiService.d.ts +27 -27
- package/dist/service/anyapi/AnyApiService.js +181 -181
- package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +50 -50
- package/dist/service/asyncTask/AsyncTaskRunnerService.js +287 -287
- package/dist/service/asyncTask/AsyncTaskService.d.ts +7 -7
- package/dist/service/asyncTask/AsyncTaskService.js +34 -34
- package/dist/service/asyncTask/handler/ExcelInfoModel.d.ts +10 -10
- package/dist/service/asyncTask/handler/ExcelInfoModel.js +2 -2
- package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.d.ts +7 -7
- package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.js +216 -216
- package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.d.ts +36 -36
- package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.js +141 -141
- package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.d.ts +46 -46
- package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.js +135 -135
- package/dist/service/base/ApiBaseService.d.ts +22 -22
- package/dist/service/base/ApiBaseService.js +60 -60
- package/dist/service/base/ApiRateLimiter.d.ts +10 -10
- package/dist/service/base/ApiRateLimiter.js +51 -51
- package/dist/service/base/BaseService.d.ts +46 -46
- package/dist/service/base/BaseService.js +131 -131
- package/dist/service/base/cache/CacheServiceFactory.d.ts +26 -26
- package/dist/service/base/cache/CacheServiceFactory.js +122 -122
- package/dist/service/base/cache/CtxCache.d.ts +18 -18
- package/dist/service/base/cache/CtxCache.js +37 -37
- package/dist/service/base/cache/DiskCache.d.ts +19 -19
- package/dist/service/base/cache/DiskCache.js +81 -81
- package/dist/service/base/cache/MemoryCache.d.ts +12 -12
- package/dist/service/base/cache/MemoryCache.js +58 -58
- package/dist/service/base/cache/NoneCache.d.ts +10 -10
- package/dist/service/base/cache/NoneCache.js +19 -19
- package/dist/service/base/cache/RedisCache.d.ts +14 -14
- package/dist/service/base/cache/RedisCache.js +31 -31
- package/dist/service/crudstd/CrudStdActionService.d.ts +17 -17
- package/dist/service/crudstd/CrudStdActionService.js +32 -32
- package/dist/service/crudstd/CrudStdConstant.d.ts +58 -58
- package/dist/service/crudstd/CrudStdConstant.js +64 -64
- package/dist/service/crudstd/CrudStdRelationService.d.ts +11 -11
- package/dist/service/crudstd/CrudStdRelationService.js +179 -179
- package/dist/service/crudstd/CrudStdService.d.ts +59 -59
- package/dist/service/crudstd/CrudStdService.js +348 -348
- package/dist/service/curd/CrudProQuick.d.ts +60 -60
- package/dist/service/curd/CrudProQuick.js +167 -167
- package/dist/service/curd/CurdMixByAccountService.d.ts +14 -14
- package/dist/service/curd/CurdMixByAccountService.js +166 -166
- package/dist/service/curd/CurdMixByDictService.d.ts +12 -12
- package/dist/service/curd/CurdMixByDictService.js +114 -114
- package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +30 -30
- package/dist/service/curd/CurdMixByLinkToCustomService.js +209 -209
- package/dist/service/curd/CurdMixBySysConfigService.d.ts +13 -13
- package/dist/service/curd/CurdMixBySysConfigService.js +116 -116
- package/dist/service/curd/CurdMixByWorkbenchService.d.ts +11 -11
- package/dist/service/curd/CurdMixByWorkbenchService.js +80 -80
- package/dist/service/curd/CurdMixService.d.ts +28 -28
- package/dist/service/curd/CurdMixService.js +100 -100
- package/dist/service/curd/CurdMixUtils.d.ts +57 -57
- package/dist/service/curd/CurdMixUtils.js +331 -331
- package/dist/service/curd/CurdProService.d.ts +32 -32
- package/dist/service/curd/CurdProService.js +215 -215
- package/dist/service/curd/fixCfgModel.d.ts +3 -3
- package/dist/service/curd/fixCfgModel.js +104 -104
- package/dist/service/curd/fixSoftDelete.d.ts +6 -6
- package/dist/service/curd/fixSoftDelete.js +43 -43
- package/dist/service/flow/FlowConfigService.d.ts +41 -41
- package/dist/service/flow/FlowConfigService.js +95 -95
- package/dist/service/flow/FlowInstanceCrudService.d.ts +35 -35
- package/dist/service/flow/FlowInstanceCrudService.js +257 -257
- package/dist/service/flow/FlowInstanceService.d.ts +88 -88
- package/dist/service/flow/FlowInstanceService.js +451 -451
- package/dist/service/proxyapi/ProxyApiLoadService.d.ts +21 -21
- package/dist/service/proxyapi/ProxyApiLoadService.js +167 -167
- package/dist/service/proxyapi/ProxyApiService.d.ts +61 -61
- package/dist/service/proxyapi/ProxyApiService.js +317 -317
- package/dist/service/proxyapi/ProxyApiUtils.d.ts +15 -15
- package/dist/service/proxyapi/ProxyApiUtils.js +34 -34
- package/dist/service/proxyapi/RouteHandler.d.ts +6 -6
- package/dist/service/proxyapi/RouteHandler.js +9 -9
- package/dist/service/proxyapi/RouteTrie.d.ts +12 -12
- package/dist/service/proxyapi/RouteTrie.js +64 -64
- package/dist/service/proxyapi/WeightedRandom.d.ts +9 -9
- package/dist/service/proxyapi/WeightedRandom.js +31 -31
- package/dist/service/proxyapi/WeightedRoundRobin.d.ts +8 -8
- package/dist/service/proxyapi/WeightedRoundRobin.js +33 -33
- package/index.d.ts +10 -10
- package/package.json +87 -87
- package/src/libs/crud-pro/CrudPro.ts +71 -0
- package/src/libs/crud-pro/interfaces.ts +22 -0
- package/src/libs/crud-pro/models/ServiceHub.ts +2 -2
- package/src/libs/crud-pro/services/CrudProDataFilterService.ts +58 -0
- package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +10 -1
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +145 -40
- package/src/libs/crud-pro/services/CurdProServiceHub.ts +10 -3
- package/src/libs/crud-pro/utils/CrudMonitor.ts +13 -13
- package/src/libs/utils/AsymmetricCrypto.ts +307 -307
- package/src/libs/utils/format-url.ts +29 -29
- package/src/libs/utils/render-utils.ts +223 -223
- package/src/models/WorkbenchInfoTools.ts +19 -19
- package/src/service/SysAppService.ts +103 -103
- package/src/service/SysDictDataService.ts +63 -63
- package/src/service/SysMenuService.ts +87 -87
- package/src/service/WorkbenchService.ts +279 -279
- package/src/service/base/cache/CacheServiceFactory.ts +135 -135
- package/src/service/base/cache/CtxCache.ts +45 -45
- package/src/service/base/cache/DiskCache.ts +90 -90
- package/src/service/base/cache/MemoryCache.ts +68 -68
- package/src/service/base/cache/NoneCache.ts +24 -24
- package/src/service/base/cache/RedisCache.ts +41 -41
- package/src/service/curd/CurdMixByAccountService.ts +177 -177
- package/src/service/curd/fixSoftDelete.ts +58 -58
- 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 };
|