midway-fatcms 0.0.1-beta.2 → 0.0.1-beta.22
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 +12 -0
- package/.prettierrc.js +4 -0
- package/README.md +7 -0
- package/dist/config/config.default.js +52 -15
- package/dist/configuration.d.ts +1 -0
- package/dist/configuration.js +33 -8
- package/dist/controller/base/BaseApiController.d.ts +1 -1
- package/dist/controller/base/BaseApiController.js +14 -6
- package/dist/controller/gateway/AsyncTaskController.d.ts +14 -0
- package/dist/controller/gateway/AsyncTaskController.js +108 -0
- package/dist/controller/gateway/CrudMtdGatewayController.d.ts +3 -3
- package/dist/controller/gateway/CrudMtdGatewayController.js +9 -6
- package/dist/controller/gateway/CrudStdGatewayController.d.ts +5 -5
- package/dist/controller/gateway/DocGatewayController.js +14 -9
- package/dist/controller/gateway/PublicApiController.js +4 -6
- package/dist/controller/gateway/StaticController.d.ts +2 -0
- package/dist/controller/gateway/StaticController.js +59 -40
- package/dist/controller/helpers.controller.d.ts +1 -1
- package/dist/controller/home.controller.js +2 -2
- package/dist/controller/manage/AnyApiMangeApi.js +2 -2
- package/dist/controller/manage/AppLogMangeApi.js +2 -2
- package/dist/controller/manage/AppMangeApi.js +2 -2
- package/dist/controller/manage/AppPageMangeApi.js +2 -2
- package/dist/controller/manage/AppSchemaHistoryApi.js +2 -2
- package/dist/controller/manage/CrudMethodsMangeApi.js +2 -2
- package/dist/controller/manage/CrudStandardDesignApi.d.ts +1 -1
- package/dist/controller/manage/CrudStandardDesignApi.js +78 -75
- package/dist/controller/manage/DataDictManageApi.d.ts +1 -1
- package/dist/controller/manage/DataDictManageApi.js +1 -1
- package/dist/controller/manage/DeployManageApi.d.ts +1 -1
- package/dist/controller/manage/DeployManageApi.js +38 -34
- package/dist/controller/manage/DocLibManageApi.js +2 -2
- package/dist/controller/manage/DocManageApi.js +2 -2
- package/dist/controller/manage/FileManageApi.js +1 -1
- package/dist/controller/manage/LowCodeTplManageApi.js +2 -2
- package/dist/controller/manage/MenuManageApi.js +2 -2
- package/dist/controller/manage/ProxyApiMangeApi.js +2 -2
- package/dist/controller/manage/SuperAdminManageApi.d.ts +2 -2
- package/dist/controller/manage/SuperAdminManageApi.js +12 -8
- package/dist/controller/manage/SysConfigMangeApi.d.ts +1 -1
- package/dist/controller/manage/SysConfigMangeApi.js +8 -6
- package/dist/controller/manage/SystemInfoManageApi.d.ts +1 -1
- package/dist/controller/manage/SystemInfoManageApi.js +7 -1
- package/dist/controller/manage/UserAccountManageApi.d.ts +2 -2
- package/dist/controller/manage/UserAccountManageApi.js +7 -2
- package/dist/controller/manage/WorkbenchMangeApi.js +3 -3
- package/dist/controller/myinfo/AuthController.d.ts +0 -4
- package/dist/controller/myinfo/AuthController.js +1 -54
- package/dist/controller/render/AppRenderController.js +10 -4
- package/dist/controller/test.controller.d.ts +1 -1
- package/dist/controller/test.controller.js +5 -5
- package/dist/index.d.ts +34 -4
- package/dist/index.js +34 -4
- package/dist/libs/crud-pro/CrudPro.d.ts +1 -0
- package/dist/libs/crud-pro/CrudPro.js +5 -0
- package/dist/libs/crud-pro/defaultConfigs.js +2 -0
- package/dist/libs/crud-pro/interfaces.d.ts +7 -1
- package/dist/libs/crud-pro/models/ExecuteContext.d.ts +2 -1
- package/dist/libs/crud-pro/models/ExecuteContextFunc.d.ts +8 -1
- package/dist/libs/crud-pro/models/ExecuteContextFunc.js +8 -0
- package/dist/libs/crud-pro/models/RequestCfgModel.d.ts +1 -1
- package/dist/libs/crud-pro/models/ResModel.d.ts +16 -0
- package/dist/libs/crud-pro/models/ResModel.js +2 -0
- package/dist/libs/crud-pro/models/SqlCfgModel.d.ts +1 -1
- package/dist/libs/crud-pro/models/TransactionSqlServer.js +1 -1
- package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +1 -0
- package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +27 -15
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +13 -17
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.d.ts +1 -1
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +10 -12
- package/dist/libs/crud-pro/services/CrudProGenSqlService.js +14 -23
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +7 -6
- package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +2 -6
- package/dist/libs/crud-pro/services/CrudProServiceBase.js +3 -2
- package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +1 -0
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +32 -7
- package/dist/libs/crud-pro/utils/DatabaseName.js +24 -3
- package/dist/libs/crud-pro/utils/MixinUtils.js +1 -1
- package/dist/libs/crud-pro/utils/ValidateUtils.js +1 -1
- package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.js +2 -2
- package/dist/libs/crud-pro/utils/sqlConvert/convertMix.d.ts +3 -0
- package/dist/libs/crud-pro/utils/sqlConvert/convertMix.js +22 -0
- package/dist/libs/global-config/global-config.d.ts +45 -0
- package/dist/libs/global-config/global-config.js +33 -0
- package/dist/libs/utils/errorToString.d.ts +2 -0
- package/dist/libs/utils/errorToString.js +57 -0
- package/dist/libs/utils/fatcms-request.js +2 -2
- package/dist/middleware/forbidden.middleware.js +4 -20
- package/dist/middleware/global.middleware.js +8 -1
- package/dist/models/AsyncTaskModel.d.ts +69 -0
- package/dist/models/AsyncTaskModel.js +26 -0
- package/dist/models/RedisKeys.d.ts +8 -0
- package/dist/models/RedisKeys.js +11 -0
- package/dist/models/SystemTables.d.ts +1 -3
- package/dist/models/SystemTables.js +2 -4
- package/dist/schedule/anonymousContext.d.ts +13 -0
- package/dist/schedule/anonymousContext.js +59 -0
- package/dist/schedule/index.d.ts +4 -3
- package/dist/schedule/index.js +8 -67
- package/dist/schedule/runSchedule.d.ts +15 -0
- package/dist/schedule/runSchedule.js +68 -0
- package/dist/schedule/scheduleNames.d.ts +13 -0
- package/dist/schedule/scheduleNames.js +17 -0
- package/dist/service/AuthService.js +8 -5
- package/dist/service/EnumInfoService.js +7 -4
- package/dist/service/FileCenterService.js +13 -9
- package/dist/service/SysConfigService.js +4 -2
- package/dist/service/UserAccountService.js +10 -6
- package/dist/service/UserSessionService.js +2 -1
- package/dist/service/VisitStatService.d.ts +1 -1
- package/dist/service/VisitStatService.js +20 -27
- package/dist/service/WorkbenchService.js +4 -2
- package/dist/service/anyapi/AnyApiService.js +4 -2
- package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +37 -0
- package/dist/service/asyncTask/AsyncTaskRunnerService.js +232 -0
- package/dist/service/asyncTask/AsyncTaskService.d.ts +7 -0
- package/dist/service/asyncTask/AsyncTaskService.js +34 -0
- package/dist/service/crudstd/CrudStdService.d.ts +2 -1
- package/dist/service/crudstd/CrudStdService.js +48 -3
- package/dist/service/curd/CrudProQuick.d.ts +24 -0
- package/dist/service/curd/CrudProQuick.js +105 -0
- package/dist/service/curd/CurdMixByAccountService.js +12 -6
- package/dist/service/curd/CurdMixByDictService.js +4 -2
- package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +10 -1
- package/dist/service/curd/CurdMixByLinkToCustomService.js +72 -24
- package/dist/service/curd/CurdMixBySysConfigService.js +4 -2
- package/dist/service/curd/CurdMixByWorkbenchService.js +4 -2
- package/dist/service/curd/CurdMixService.d.ts +1 -1
- package/dist/service/curd/CurdMixService.js +2 -2
- package/dist/service/curd/CurdMixUtils.d.ts +7 -0
- package/dist/service/curd/CurdMixUtils.js +65 -28
- package/dist/service/curd/CurdProService.d.ts +2 -10
- package/dist/service/curd/CurdProService.js +31 -146
- package/dist/service/curd/fixCfgModel.d.ts +3 -0
- package/dist/service/curd/fixCfgModel.js +107 -0
- package/dist/service/proxyapi/ProxyApiLoadService.js +7 -4
- package/dist/views/404_app.html +31 -0
- package/dist/views/404_workbench.html +34 -0
- package/dist/views/static/favicon.ico +0 -0
- package/package.json +9 -2
- package/src/config/config.default.ts +58 -27
- package/src/configuration.ts +42 -9
- package/src/controller/base/BaseApiController.ts +26 -19
- package/src/controller/gateway/AnyApiGatewayController.ts +1 -1
- package/src/controller/gateway/AsyncTaskController.ts +83 -0
- package/src/controller/gateway/CrudMtdGatewayController.ts +17 -13
- package/src/controller/gateway/CrudStdGatewayController.ts +4 -4
- package/src/controller/gateway/DocGatewayController.ts +25 -17
- package/src/controller/gateway/FileController.ts +8 -9
- package/src/controller/gateway/ProxyApiGatewayController.ts +4 -4
- package/src/controller/gateway/PublicApiController.ts +19 -22
- package/src/controller/gateway/StaticController.ts +234 -242
- package/src/controller/helpers.controller.ts +1 -1
- package/src/controller/home.controller.ts +8 -15
- package/src/controller/manage/AnyApiMangeApi.ts +11 -11
- package/src/controller/manage/AppLogMangeApi.ts +5 -5
- package/src/controller/manage/AppMangeApi.ts +7 -7
- package/src/controller/manage/AppPageMangeApi.ts +5 -5
- package/src/controller/manage/AppSchemaHistoryApi.ts +3 -3
- package/src/controller/manage/CrudMethodsMangeApi.ts +5 -5
- package/src/controller/manage/CrudStandardDesignApi.ts +106 -113
- package/src/controller/manage/DataDictManageApi.ts +5 -5
- package/src/controller/manage/DeployManageApi.ts +85 -89
- package/src/controller/manage/DocLibManageApi.ts +5 -5
- package/src/controller/manage/DocManageApi.ts +10 -10
- package/src/controller/manage/FileManageApi.ts +1 -1
- package/src/controller/manage/LowCodeTplManageApi.ts +2 -2
- package/src/controller/manage/MenuManageApi.ts +10 -15
- package/src/controller/manage/ProxyApiMangeApi.ts +2 -2
- package/src/controller/manage/SuperAdminManageApi.ts +14 -13
- package/src/controller/manage/SysConfigMangeApi.ts +11 -11
- package/src/controller/manage/SystemInfoManageApi.ts +11 -6
- package/src/controller/manage/UserAccountManageApi.ts +10 -4
- package/src/controller/manage/WorkbenchMangeApi.ts +8 -8
- package/src/controller/myinfo/AuthController.ts +6 -72
- package/src/controller/render/AppRenderController.ts +24 -21
- package/src/controller/test.controller.ts +18 -18
- package/src/index.ts +38 -4
- package/src/libs/crud-pro/CrudPro.ts +7 -0
- package/src/libs/crud-pro/defaultConfigs.ts +2 -0
- package/src/libs/crud-pro/interfaces.ts +10 -3
- package/src/libs/crud-pro/models/ExecuteContext.ts +3 -3
- package/src/libs/crud-pro/models/ExecuteContextFunc.ts +11 -1
- package/src/libs/crud-pro/models/RequestCfgModel.ts +1 -1
- package/src/libs/crud-pro/models/RequestModel.ts +1 -1
- package/src/libs/crud-pro/models/ResModel.ts +19 -0
- package/src/libs/crud-pro/models/SqlCfgModel.ts +2 -2
- package/src/libs/crud-pro/models/Transaction.ts +8 -9
- package/src/libs/crud-pro/models/TransactionPostgres.ts +1 -1
- package/src/libs/crud-pro/models/TransactionSqlServer.ts +8 -13
- package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +32 -23
- package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +38 -54
- package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +26 -45
- package/src/libs/crud-pro/services/CrudProGenSqlService.ts +23 -40
- package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +25 -29
- package/src/libs/crud-pro/services/CrudProServiceBase.ts +5 -9
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +36 -9
- package/src/libs/crud-pro/utils/DatabaseName.ts +35 -15
- package/src/libs/crud-pro/utils/DateTimeUtils.ts +2 -2
- package/src/libs/crud-pro/utils/MixinUtils.ts +1 -1
- package/src/libs/crud-pro/utils/ValidateUtils.ts +1 -3
- package/src/libs/crud-pro/utils/pool/MySQLUtils.ts +1 -1
- package/src/libs/crud-pro/utils/pool/PostgresUtils.ts +3 -3
- package/src/libs/crud-pro/utils/pool/SqlServerUtils.ts +3 -3
- package/src/libs/crud-pro/utils/sqlConvert/convertColumnName.ts +2 -2
- package/src/libs/crud-pro/utils/sqlConvert/convertMix.ts +26 -0
- package/src/libs/global-config/global-config.ts +78 -0
- package/src/libs/utils/crypto-utils.ts +2 -4
- package/src/libs/utils/errorToString.ts +61 -0
- package/src/libs/utils/fatcms-request.ts +9 -21
- package/src/libs/utils/ordernum-utils.ts +2 -6
- package/src/libs/utils/parseConfig.ts +7 -15
- package/src/middleware/forbidden.middleware.ts +6 -25
- package/src/middleware/global.middleware.ts +18 -16
- package/src/models/AsyncTaskModel.ts +79 -0
- package/src/models/RedisKeys.ts +13 -0
- package/src/models/SystemTables.ts +1 -4
- package/src/models/bizmodels.ts +1 -2
- package/src/schedule/anonymousContext.ts +79 -0
- package/src/schedule/index.ts +11 -72
- package/src/schedule/runSchedule.ts +83 -0
- package/src/schedule/scheduleNames.ts +21 -0
- package/src/service/AuthService.ts +13 -8
- package/src/service/EnumInfoService.ts +8 -3
- package/src/service/FileCenterService.ts +12 -6
- package/src/service/SysConfigService.ts +10 -6
- package/src/service/UserAccountService.ts +14 -4
- package/src/service/UserSessionService.ts +5 -4
- package/src/service/VisitStatService.ts +57 -70
- package/src/service/WorkbenchService.ts +7 -2
- package/src/service/anyapi/AnyApiService.ts +11 -8
- package/src/service/asyncTask/AsyncTaskRunnerService.ts +255 -0
- package/src/service/asyncTask/AsyncTaskService.ts +21 -0
- package/src/service/base/BaseService.ts +2 -2
- package/src/service/crudstd/CrudStdService.ts +60 -5
- package/src/service/curd/CrudProQuick.ts +137 -0
- package/src/service/curd/CurdMixByAccountService.ts +14 -6
- package/src/service/curd/CurdMixByDictService.ts +8 -2
- package/src/service/curd/CurdMixByLinkToCustomService.ts +101 -50
- package/src/service/curd/CurdMixBySysConfigService.ts +7 -2
- package/src/service/curd/CurdMixByWorkbenchService.ts +6 -2
- package/src/service/curd/CurdMixService.ts +3 -3
- package/src/service/curd/CurdMixUtils.ts +82 -39
- package/src/service/curd/CurdProService.ts +45 -189
- package/src/service/curd/fixCfgModel.ts +139 -0
- package/src/service/proxyapi/ProxyApiLoadService.ts +12 -3
- package/src/views/404_app.html +31 -0
- package/src/views/404_workbench.html +34 -0
- package/src/views/static/favicon.ico +0 -0
- package/tsconfig.json +32 -0
- package/dist/controller/medstatistic/MedAdminController.d.ts +0 -35
- package/dist/controller/medstatistic/MedAdminController.js +0 -205
- package/dist/controller/medstatistic/MedClientController.d.ts +0 -28
- package/dist/controller/medstatistic/MedClientController.js +0 -188
- package/dist/controller/medstatistic/MedMessageService.d.ts +0 -19
- package/dist/controller/medstatistic/MedMessageService.js +0 -95
- package/dist/controller/medstatistic/MedScoreService.d.ts +0 -21
- package/dist/controller/medstatistic/MedScoreService.js +0 -107
- package/dist/controller/medstatistic/constants.d.ts +0 -32
- package/dist/controller/medstatistic/constants.js +0 -43
- package/src/controller/medstatistic/MedAdminController.ts +0 -221
- package/src/controller/medstatistic/MedClientController.ts +0 -188
- package/src/controller/medstatistic/MedMessageService.ts +0 -89
- package/src/controller/medstatistic/MedScoreService.ts +0 -108
- package/src/controller/medstatistic/constants.ts +0 -63
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import {CrudProServiceBase} from './CrudProServiceBase';
|
|
2
|
-
import {SqlCfgModel} from '../models/SqlCfgModel';
|
|
3
|
-
import {MixinUtils} from '../utils/MixinUtils';
|
|
4
|
-
import {SqlSegArg} from '../models/SqlSegArg';
|
|
5
|
-
import {KeysOfCustomSQL, SqlDbType} from '../models/keys';
|
|
6
|
-
import {RequestModel} from '../models/RequestModel';
|
|
7
|
-
import {CommonException, Exceptions} from '../exceptions';
|
|
8
|
-
import {RequestCfgModel} from '../models/RequestCfgModel';
|
|
9
|
-
import {ModelUtils} from '../utils/ModelUtils';
|
|
10
|
-
import {FuncContext} from '../models/FuncContext';
|
|
11
|
-
import {TypeUtils} from '../utils/TypeUtils';
|
|
12
|
-
import {sqlFuncUtils} from '../utils/SqlFuncUtils';
|
|
13
|
-
import {toSqlColumnName, toSqlColumnNamesJoin} from '../utils/sqlConvert/convertColumnName';
|
|
14
|
-
import {CrudProGenSqlCondition} from
|
|
1
|
+
import { CrudProServiceBase } from './CrudProServiceBase';
|
|
2
|
+
import { SqlCfgModel } from '../models/SqlCfgModel';
|
|
3
|
+
import { MixinUtils } from '../utils/MixinUtils';
|
|
4
|
+
import { SqlSegArg } from '../models/SqlSegArg';
|
|
5
|
+
import { KeysOfCustomSQL, SqlDbType } from '../models/keys';
|
|
6
|
+
import { RequestModel } from '../models/RequestModel';
|
|
7
|
+
import { CommonException, Exceptions } from '../exceptions';
|
|
8
|
+
import { RequestCfgModel } from '../models/RequestCfgModel';
|
|
9
|
+
import { ModelUtils } from '../utils/ModelUtils';
|
|
10
|
+
import { FuncContext } from '../models/FuncContext';
|
|
11
|
+
import { TypeUtils } from '../utils/TypeUtils';
|
|
12
|
+
import { sqlFuncUtils } from '../utils/SqlFuncUtils';
|
|
13
|
+
import { toSqlColumnName, toSqlColumnNamesJoin } from '../utils/sqlConvert/convertColumnName';
|
|
14
|
+
import { CrudProGenSqlCondition } from './CrudProGenSqlCondition';
|
|
15
15
|
|
|
16
16
|
const KEYS_CUSTOM_PATTERN = /@@[0-9a-zA-Z:._]+/gm;
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
/**
|
|
20
19
|
* 存在任何需要排除的
|
|
21
20
|
* @param columns
|
|
@@ -52,10 +51,9 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase {
|
|
|
52
51
|
const argList = [];
|
|
53
52
|
let executeSql = originSql;
|
|
54
53
|
|
|
55
|
-
|
|
56
54
|
// 发现有需要被替换的变量。
|
|
57
55
|
if (sqlArgModelMap) {
|
|
58
|
-
|
|
56
|
+
executeSql = originSql.replace(KEYS_CUSTOM_PATTERN, word => {
|
|
59
57
|
if (!word) {
|
|
60
58
|
return '';
|
|
61
59
|
}
|
|
@@ -73,7 +71,6 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase {
|
|
|
73
71
|
});
|
|
74
72
|
}
|
|
75
73
|
|
|
76
|
-
|
|
77
74
|
sqlCfgModel.executeSqlArgs = argList;
|
|
78
75
|
sqlCfgModel.executeSql = executeSql;
|
|
79
76
|
}
|
|
@@ -115,12 +112,10 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase {
|
|
|
115
112
|
return this.generateOffsetLimit(reqCfg, sqlCfg, reqModel);
|
|
116
113
|
} else if (word === KeysOfCustomSQL.SQL_ORDER_BYS) {
|
|
117
114
|
return this.generateOrderBys(reqModel, sqlCfg);
|
|
118
|
-
} else if ((
|
|
119
|
-
word.startsWith(KeysOfCustomSQL.SQL_GET_DATA_ATTR_START) ||
|
|
120
|
-
word.startsWith(KeysOfCustomSQL.SQL_GET_CONDITION_ATTR_START)) && word.indexOf('.') > 0) {
|
|
115
|
+
} else if ((word.startsWith(KeysOfCustomSQL.SQL_GET_DATA_ATTR_START) || word.startsWith(KeysOfCustomSQL.SQL_GET_CONDITION_ATTR_START)) && word.indexOf('.') > 0) {
|
|
121
116
|
return this.generateGetAttr(reqModel, word); //// data.xxx, condition.xxx
|
|
122
117
|
} else if (word.startsWith(KeysOfCustomSQL.SQL_PICK_RES_AS_NUMBER) || word.startsWith(KeysOfCustomSQL.SQL_PICK_RES_AS_STRING)) {
|
|
123
|
-
return this.generatePickResAs(reqModel,
|
|
118
|
+
return this.generatePickResAs(reqModel, word); // @@pickResAsNumber:replies_count
|
|
124
119
|
} else if (word.startsWith(KeysOfCustomSQL.SQL_AS_UPDATE)) {
|
|
125
120
|
return this.generateDataUpdate(reqModel, sqlCfg, MixinUtils.removeStringPrefix(word, KeysOfCustomSQL.SQL_AS_UPDATE));
|
|
126
121
|
} else if (word.startsWith(KeysOfCustomSQL.SQL_AS_INSERT_KEYS)) {
|
|
@@ -200,7 +195,7 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase {
|
|
|
200
195
|
result.push(reqColumn);
|
|
201
196
|
}
|
|
202
197
|
}
|
|
203
|
-
return new SqlSegArg(toSqlColumnNamesJoin(result,sqlCfgModel));
|
|
198
|
+
return new SqlSegArg(toSqlColumnNamesJoin(result, sqlCfgModel));
|
|
204
199
|
}
|
|
205
200
|
|
|
206
201
|
/**
|
|
@@ -226,12 +221,12 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase {
|
|
|
226
221
|
const reqLimit = req.limit;
|
|
227
222
|
const limit = Math.min(maxLimit, reqLimit);
|
|
228
223
|
|
|
229
|
-
if (sqlCfg.
|
|
224
|
+
if (sqlCfg.sqlDbType === SqlDbType.postgres) {
|
|
230
225
|
return new SqlSegArg(' LIMIT ? OFFSET ? ', [limit, req.offset]);
|
|
231
226
|
}
|
|
232
227
|
|
|
233
|
-
if (sqlCfg.
|
|
234
|
-
return new SqlSegArg(' OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ', [
|
|
228
|
+
if (sqlCfg.sqlDbType === SqlDbType.sqlserver) {
|
|
229
|
+
return new SqlSegArg(' OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ', [req.offset, limit]);
|
|
235
230
|
}
|
|
236
231
|
|
|
237
232
|
return new SqlSegArg(' limit ?,? ', [req.offset, limit]);
|
|
@@ -250,11 +245,12 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase {
|
|
|
250
245
|
return new SqlSegArg(sql);
|
|
251
246
|
}
|
|
252
247
|
|
|
253
|
-
|
|
254
248
|
private generatePickResAs(req: RequestModel, world: string): SqlSegArg {
|
|
255
|
-
return new SqlSegArg(' ? ', [
|
|
249
|
+
return new SqlSegArg(' ? ', [
|
|
250
|
+
{
|
|
256
251
|
___GENERATE_GET_RES_ATTR___: world,
|
|
257
|
-
|
|
252
|
+
},
|
|
253
|
+
]);
|
|
258
254
|
}
|
|
259
255
|
|
|
260
256
|
private generateGetAttr(req: RequestModel, word: string): SqlSegArg {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _ from 'lodash';
|
|
2
2
|
import { ICurdProServiceHub } from '../models/ServiceHub';
|
|
3
|
-
import {ICrudProCfg, ILogger, IPoolConnectionClient} from '../interfaces';
|
|
3
|
+
import { ICrudProCfg, IExecuteUnsafeQueryCtx, ILogger, IPoolConnectionClient } from '../interfaces';
|
|
4
4
|
import { SqlCfgModel } from '../models/SqlCfgModel';
|
|
5
5
|
import { ExecuteContext } from '../models/ExecuteContext';
|
|
6
6
|
import { MixinUtils } from '../utils/MixinUtils';
|
|
@@ -19,11 +19,6 @@ function createBuildInExecuteFuncMap() {
|
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
interface ExecuteUnsafeQueryCtx {
|
|
23
|
-
tableName: string;
|
|
24
|
-
dbName: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
22
|
const buildInExecuteFuncMap = createBuildInExecuteFuncMap();
|
|
28
23
|
|
|
29
24
|
class CrudProServiceBase {
|
|
@@ -60,10 +55,11 @@ class CrudProServiceBase {
|
|
|
60
55
|
* @param values
|
|
61
56
|
* @protected
|
|
62
57
|
*/
|
|
63
|
-
protected async executeUnsafeQuery(obj:
|
|
58
|
+
protected async executeUnsafeQuery(obj: IExecuteUnsafeQueryCtx, sql: string, values?: any) {
|
|
64
59
|
const sqlCfgModel: any = {
|
|
65
|
-
sqlTable: obj.
|
|
66
|
-
sqlDatabase: obj.
|
|
60
|
+
sqlTable: obj.sqlTable,
|
|
61
|
+
sqlDatabase: obj.sqlDatabase,
|
|
62
|
+
sqlDbType: obj.sqlDbType,
|
|
67
63
|
columns: [],
|
|
68
64
|
columnsRelation: [],
|
|
69
65
|
maxLimit: DEFAULT_MAX_LIMIT,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { CrudProServiceBase } from './CrudProServiceBase';
|
|
2
2
|
import { SqlCfgModel } from '../models/SqlCfgModel';
|
|
3
|
-
import { ITableMeta } from '../interfaces';
|
|
3
|
+
import { IExecuteUnsafeQueryCtx, ITableMeta } from '../interfaces';
|
|
4
|
+
import { SqlDbType } from '../models/keys';
|
|
5
|
+
import { pickAndConvertRowsByMix } from '../utils/sqlConvert/convertMix';
|
|
4
6
|
|
|
5
7
|
class CrudProTableMetaCache {
|
|
6
8
|
private cacheMap: Record<string, ITableMeta> = {};
|
|
@@ -42,18 +44,43 @@ class CrudProTableMetaService extends CrudProServiceBase {
|
|
|
42
44
|
tableColumns: [],
|
|
43
45
|
};
|
|
44
46
|
|
|
45
|
-
const baseInfo = {
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
const baseInfo: IExecuteUnsafeQueryCtx = {
|
|
48
|
+
sqlTable: sqlCfgModel.sqlTable,
|
|
49
|
+
sqlDatabase: sqlCfgModel.sqlDatabase,
|
|
50
|
+
sqlDbType: sqlCfgModel.sqlDbType,
|
|
48
51
|
};
|
|
49
52
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
obj.tableColumns = tableDescribe2.map(fieldObj => {
|
|
53
|
-
return fieldObj['Field'];
|
|
54
|
-
});
|
|
53
|
+
obj.tableColumns = await this.loadTableColumnInfo(baseInfo);
|
|
54
|
+
|
|
55
55
|
return obj;
|
|
56
56
|
}
|
|
57
|
+
|
|
58
|
+
private async loadTableColumnInfo(baseInfo: IExecuteUnsafeQueryCtx): Promise<string[]> {
|
|
59
|
+
if (baseInfo.sqlDbType === SqlDbType.mysql) {
|
|
60
|
+
const queryRes = await this.executeUnsafeQuery(baseInfo, 'describe ' + baseInfo.sqlTable);
|
|
61
|
+
const tableDescribe = pickAndConvertRowsByMix(queryRes, baseInfo.sqlDbType);
|
|
62
|
+
const tableDescribe2 = JSON.parse(JSON.stringify(tableDescribe));
|
|
63
|
+
return tableDescribe2.map(fieldObj => {
|
|
64
|
+
return fieldObj['Field'];
|
|
65
|
+
});
|
|
66
|
+
} else if (baseInfo.sqlDbType === SqlDbType.postgres) {
|
|
67
|
+
const schemaname = 'public';
|
|
68
|
+
const columnArraySql = `
|
|
69
|
+
SELECT
|
|
70
|
+
*
|
|
71
|
+
FROM information_schema.columns
|
|
72
|
+
WHERE table_schema = '${schemaname}' and table_name = '${baseInfo.sqlTable}'
|
|
73
|
+
ORDER BY ordinal_position;
|
|
74
|
+
`.trim();
|
|
75
|
+
const queryRes = await this.executeUnsafeQuery(baseInfo, columnArraySql);
|
|
76
|
+
const tableDescribe = pickAndConvertRowsByMix(queryRes, baseInfo.sqlDbType);
|
|
77
|
+
return tableDescribe.map(fieldObj => {
|
|
78
|
+
return fieldObj['column_name'];
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
throw new Error('暂不支持的数据库类型:' + baseInfo.sqlDbType);
|
|
83
|
+
}
|
|
57
84
|
}
|
|
58
85
|
|
|
59
86
|
export { CrudProTableMetaService };
|
|
@@ -1,19 +1,45 @@
|
|
|
1
|
-
import { SqlDbType } from '../models/keys'
|
|
1
|
+
import { SqlDbType } from '../models/keys';
|
|
2
2
|
|
|
3
3
|
interface IDbTypeAndName {
|
|
4
|
-
dbType: SqlDbType
|
|
4
|
+
dbType: SqlDbType;
|
|
5
5
|
dbName: string;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
const SPLIT_CONST =
|
|
8
|
+
const SPLIT_CONST = '_________';
|
|
9
|
+
|
|
10
|
+
const PREFIX_MYSQL = `${SqlDbType.mysql}${SPLIT_CONST}`;
|
|
11
|
+
const PREFIX_POSTGRES = `${SqlDbType.postgres}${SPLIT_CONST}`;
|
|
12
|
+
const PREFIX_SQLSERVER = `${SqlDbType.sqlserver}${SPLIT_CONST}`;
|
|
9
13
|
|
|
10
14
|
function parseDatabaseName(databaseName: string): IDbTypeAndName {
|
|
11
15
|
const dbNameArr = databaseName.split(SPLIT_CONST);
|
|
16
|
+
|
|
17
|
+
if (databaseName.startsWith(PREFIX_MYSQL)) {
|
|
18
|
+
return {
|
|
19
|
+
dbType: SqlDbType.mysql,
|
|
20
|
+
dbName: dbNameArr[1],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (databaseName.startsWith(PREFIX_POSTGRES)) {
|
|
25
|
+
return {
|
|
26
|
+
dbType: SqlDbType.postgres,
|
|
27
|
+
dbName: dbNameArr[1],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (databaseName.startsWith(PREFIX_SQLSERVER)) {
|
|
32
|
+
return {
|
|
33
|
+
dbType: SqlDbType.sqlserver,
|
|
34
|
+
dbName: dbNameArr[1],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
12
38
|
if (dbNameArr.length === 1) {
|
|
13
39
|
return {
|
|
14
40
|
dbType: SqlDbType.mysql, // 默认
|
|
15
|
-
dbName: dbNameArr[0]
|
|
16
|
-
}
|
|
41
|
+
dbName: dbNameArr[0],
|
|
42
|
+
};
|
|
17
43
|
}
|
|
18
44
|
|
|
19
45
|
if (dbNameArr.length > 1) {
|
|
@@ -21,20 +47,14 @@ function parseDatabaseName(databaseName: string): IDbTypeAndName {
|
|
|
21
47
|
const dbType = dbType0 as any;
|
|
22
48
|
return {
|
|
23
49
|
dbType,
|
|
24
|
-
dbName
|
|
25
|
-
}
|
|
50
|
+
dbName,
|
|
51
|
+
};
|
|
26
52
|
}
|
|
27
53
|
return null;
|
|
28
54
|
}
|
|
29
55
|
|
|
30
|
-
|
|
31
56
|
function toDatabaseNameStr(dbType: SqlDbType, dbName: string): string {
|
|
32
|
-
return [dbType, dbName].join(SPLIT_CONST)
|
|
57
|
+
return [dbType, dbName].join(SPLIT_CONST);
|
|
33
58
|
}
|
|
34
59
|
|
|
35
|
-
|
|
36
|
-
export {
|
|
37
|
-
SPLIT_CONST,
|
|
38
|
-
parseDatabaseName,
|
|
39
|
-
toDatabaseNameStr
|
|
40
|
-
}
|
|
60
|
+
export { SPLIT_CONST, parseDatabaseName, toDatabaseNameStr };
|
|
@@ -9,10 +9,10 @@ const DateTimeUtils = {
|
|
|
9
9
|
getCurrentTimeStampSecond(): number {
|
|
10
10
|
return Math.floor(Date.now() / 1000);
|
|
11
11
|
},
|
|
12
|
-
getCurrentDateFormat(format:string): string {
|
|
12
|
+
getCurrentDateFormat(format: string): string {
|
|
13
13
|
return moment(Date.now()).format(format);
|
|
14
14
|
},
|
|
15
|
-
getYesterdayDateFormat(format:string): string {
|
|
15
|
+
getYesterdayDateFormat(format: string): string {
|
|
16
16
|
return moment(Date.now()).add(-1, 'day').format(format);
|
|
17
17
|
},
|
|
18
18
|
};
|
|
@@ -50,7 +50,7 @@ const MixinUtils = {
|
|
|
50
50
|
},
|
|
51
51
|
|
|
52
52
|
startsWith(str1: string, str2: string): boolean {
|
|
53
|
-
if (typeof str1 ===
|
|
53
|
+
if (typeof str1 === 'string' && typeof str2 === 'string') {
|
|
54
54
|
return str1.startsWith(str2);
|
|
55
55
|
}
|
|
56
56
|
return false;
|
|
@@ -143,9 +143,8 @@ function validateByCfgString(validateCfg: KeysOfValidators | string, itemValue:
|
|
|
143
143
|
return;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
|
|
147
146
|
// 必填
|
|
148
|
-
if (
|
|
147
|
+
if ('required' === validateCfg) {
|
|
149
148
|
if (isEmpty(itemValue)) {
|
|
150
149
|
throw new CommonException(Exceptions.VALIDATE_ERR, "'参数校验错误,字段 " + errPath + ' 不满足校验配置:' + validateCfg);
|
|
151
150
|
}
|
|
@@ -157,7 +156,6 @@ function validateByCfgString(validateCfg: KeysOfValidators | string, itemValue:
|
|
|
157
156
|
return;
|
|
158
157
|
}
|
|
159
158
|
|
|
160
|
-
|
|
161
159
|
// 校验失败
|
|
162
160
|
if (!validateByCfgStringInner(validateCfg, itemValue)) {
|
|
163
161
|
throw new CommonException(Exceptions.VALIDATE_ERR, "'参数校验错误,字段 " + errPath + ' 不满足校验配置:' + validateCfg);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {Pool} from 'pg';
|
|
2
|
-
import {IConnectionPool} from '../../interfaces';
|
|
3
|
-
import {SqlDbType} from
|
|
1
|
+
import { Pool } from 'pg';
|
|
2
|
+
import { IConnectionPool } from '../../interfaces';
|
|
3
|
+
import { SqlDbType } from '../../models/keys';
|
|
4
4
|
|
|
5
5
|
const POOL_CACHE_MAP: Record<string, IConnectionPool> = {};
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {ConnectionPool} from 'mssql';
|
|
2
|
-
import {IConnectionPool} from '../../interfaces';
|
|
3
|
-
import {SqlDbType} from
|
|
1
|
+
import { ConnectionPool } from 'mssql';
|
|
2
|
+
import { IConnectionPool } from '../../interfaces';
|
|
3
|
+
import { SqlDbType } from '../../models/keys';
|
|
4
4
|
|
|
5
5
|
const POOL_CACHE_MAP: Record<string, IConnectionPool> = {};
|
|
6
6
|
|
|
@@ -3,10 +3,10 @@ import {SqlDbType} from "../../models/keys";
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
function toSqlColumnName(columnName: string, sqlCfgModel: SqlCfgModel): string {
|
|
6
|
-
if (sqlCfgModel.
|
|
6
|
+
if (sqlCfgModel.sqlDbType === SqlDbType.postgres) {
|
|
7
7
|
return '"' + columnName + '"';
|
|
8
8
|
}
|
|
9
|
-
if (sqlCfgModel.
|
|
9
|
+
if (sqlCfgModel.sqlDbType === SqlDbType.sqlserver) {
|
|
10
10
|
return '[' + columnName + ']';
|
|
11
11
|
}
|
|
12
12
|
return '`' + columnName + '`';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SqlDbType } from "../../models/keys";
|
|
2
|
+
import { pickAndConvertPgRows } from "./convertPgType";
|
|
3
|
+
import * as _ from 'lodash'
|
|
4
|
+
|
|
5
|
+
function pickAndConvertRowsByMix(connectionQueryRes: any, sqlDbType: SqlDbType): any[] | any {
|
|
6
|
+
if (!connectionQueryRes) {
|
|
7
|
+
throw new Error('[pickAndConvertRowsByMix] error, connectionQueryRes is null ')
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (sqlDbType === SqlDbType.postgres) {
|
|
11
|
+
return pickAndConvertPgRows(connectionQueryRes);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (sqlDbType === SqlDbType.mysql) {
|
|
15
|
+
return connectionQueryRes[0];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (sqlDbType === SqlDbType.sqlserver) {
|
|
19
|
+
return _.get(connectionQueryRes, 'recordsets[0]') || [];
|
|
20
|
+
}
|
|
21
|
+
throw new Error('[pickAndConvertRowsByMix] error sqlDbType, sqlDbType = ' + sqlDbType)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
pickAndConvertRowsByMix
|
|
26
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { SqlDbType } from '../crud-pro/models/keys';
|
|
2
|
+
|
|
3
|
+
interface IGlobalStaticConfig {
|
|
4
|
+
/**
|
|
5
|
+
* CrudStd: 业务系统自定义的修改cfgModel
|
|
6
|
+
* @param reqJson
|
|
7
|
+
* @param cfgModel
|
|
8
|
+
* @param appInfo
|
|
9
|
+
* @param ctx
|
|
10
|
+
*/
|
|
11
|
+
bizUpdateCfgModelForCrudStd(reqJson: any, cfgModel: any, appInfo: any, ctx: any): Promise<any>;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* CrudMtd: 业务系统自定义的修改cfgModel
|
|
15
|
+
* @param reqJson
|
|
16
|
+
* @param cfgModel
|
|
17
|
+
* @param methodInfo
|
|
18
|
+
* @param ctx
|
|
19
|
+
*/
|
|
20
|
+
bizUpdateCfgModelForCrudMtd(reqJson: any, cfgModel: any, methodInfo: any, ctx: any): Promise<any>;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* CrudPro: 业务系统自定义的修改cfgModel。这是最底层的!!全局的!!全局的!!全局的!!!
|
|
24
|
+
* @param reqJson
|
|
25
|
+
* @param cfgModel
|
|
26
|
+
*/
|
|
27
|
+
bizUpdateCfgModelForCrudPro(reqJson: any, cfgModel: any): Promise<any>;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 生成用户的账号ID,业务系统可以生成类似工号的ID
|
|
31
|
+
* @param userSubmitData
|
|
32
|
+
*/
|
|
33
|
+
generateUserAccountId(userSubmitData: any): Promise<string>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 将业务系统表中的userId映射为fatcms的UserAccountId
|
|
37
|
+
* @param bizTableUserId 业余系统表中的UserId
|
|
38
|
+
*/
|
|
39
|
+
toFatcmsUserAccountId(bizTableUserId: any): string;
|
|
40
|
+
|
|
41
|
+
SystemDbName: string;
|
|
42
|
+
SystemDbType: SqlDbType;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const noop = () => {
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
class GlobalStaticConfig {
|
|
50
|
+
private configObject: IGlobalStaticConfig;
|
|
51
|
+
constructor() {
|
|
52
|
+
this.configObject = {
|
|
53
|
+
bizUpdateCfgModelForCrudStd: noop,
|
|
54
|
+
bizUpdateCfgModelForCrudMtd: noop,
|
|
55
|
+
bizUpdateCfgModelForCrudPro: noop,
|
|
56
|
+
generateUserAccountId: null,
|
|
57
|
+
toFatcmsUserAccountId: (bizTableUserId: any) => {
|
|
58
|
+
return bizTableUserId;
|
|
59
|
+
},
|
|
60
|
+
SystemDbName: 'fatcms',
|
|
61
|
+
SystemDbType: SqlDbType.mysql,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
public getConfig(): IGlobalStaticConfig {
|
|
65
|
+
return this.configObject as IGlobalStaticConfig;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public setConfig(configObject: any) {
|
|
69
|
+
if (!configObject || typeof configObject !== 'object') {
|
|
70
|
+
throw new Error('参数configObject不能为空');
|
|
71
|
+
}
|
|
72
|
+
Object.assign(this.configObject, configObject);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const GLOBAL_STATIC_CONFIG = new GlobalStaticConfig();
|
|
77
|
+
|
|
78
|
+
export { GLOBAL_STATIC_CONFIG };
|
|
@@ -15,7 +15,7 @@ function hashUtf8Hex(data: string): string {
|
|
|
15
15
|
return hash.digest('hex');
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
function readSeed1()
|
|
18
|
+
function readSeed1() {
|
|
19
19
|
// 这个文件肯定存在
|
|
20
20
|
const t = path.join(__dirname, '../../config/seed/aeskey.txt');
|
|
21
21
|
return fs.readFileSync(t, 'utf-8');
|
|
@@ -29,8 +29,7 @@ function readSeed2(): string {
|
|
|
29
29
|
return fs.readFileSync(filePath, 'utf-8');
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
function createAes128BySeedContent(seedContent:string){
|
|
32
|
+
function createAes128BySeedContent(seedContent: string) {
|
|
34
33
|
const hash1 = hashUtf8Hex(seedContent.trim());
|
|
35
34
|
const key = md5(hash1);
|
|
36
35
|
const iv = md5(key + hash1);
|
|
@@ -46,7 +45,6 @@ function createAes128BySeedFile() {
|
|
|
46
45
|
return createAes128BySeedContent(seed1);
|
|
47
46
|
}
|
|
48
47
|
|
|
49
|
-
|
|
50
48
|
const privateAES = createAes128BySeedFile();
|
|
51
49
|
|
|
52
50
|
export { privateAES };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
function errorToString(error: any): string {
|
|
2
|
+
// 处理非错误对象的情况
|
|
3
|
+
if (typeof error === 'undefined') {
|
|
4
|
+
return 'Error: undefined was thrown';
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
if (error === null) {
|
|
8
|
+
return 'Error: null was thrown';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// 处理原始值类型
|
|
12
|
+
const primitiveTypes = ['string', 'number', 'boolean', 'symbol'];
|
|
13
|
+
if (primitiveTypes.includes(typeof error)) {
|
|
14
|
+
return `Error: A primitive value was thrown\nValue: ${String(error)}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// 处理 Error 对象
|
|
18
|
+
if (error instanceof Error) {
|
|
19
|
+
const errorDetails = [];
|
|
20
|
+
errorDetails.push(`Error: ${error.name || 'Error'}`);
|
|
21
|
+
errorDetails.push(`Message: ${error.message || 'No error message'}`);
|
|
22
|
+
|
|
23
|
+
if (error.stack) {
|
|
24
|
+
errorDetails.push('Stack Trace:');
|
|
25
|
+
errorDetails.push(error.stack);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const extraProperties = ['code', 'fileName', 'lineNumber', 'columnNumber'];
|
|
29
|
+
extraProperties.forEach(prop => {
|
|
30
|
+
if (error[prop] !== undefined) {
|
|
31
|
+
errorDetails.push(`${prop}: ${error[prop]}`);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const customProps = Object.keys(error).filter(key => !['name', 'message', 'stack', ...extraProperties].includes(key));
|
|
36
|
+
|
|
37
|
+
if (customProps.length > 0) {
|
|
38
|
+
errorDetails.push('Custom Properties:');
|
|
39
|
+
customProps.forEach(prop => {
|
|
40
|
+
try {
|
|
41
|
+
const value = JSON.stringify(error[prop], null, 2) || String(error[prop]);
|
|
42
|
+
errorDetails.push(` ${prop}: ${value}`);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
errorDetails.push(` ${prop}: [Object cannot be serialized]`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return errorDetails.join('\n');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 处理普通对象
|
|
53
|
+
try {
|
|
54
|
+
const objectDetails = JSON.stringify(error, null, 2);
|
|
55
|
+
return `Error: A plain object was thrown\nObject: ${objectDetails}`;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
return `Error: An object was thrown but could not be serialized\nType: ${error.constructor?.name || 'Unknown'}`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { errorToString };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Context } from '@midwayjs/koa';
|
|
2
2
|
import * as _ from 'lodash';
|
|
3
|
-
import {privateAES} from
|
|
4
|
-
import {CommonException} from
|
|
3
|
+
import { privateAES } from './crypto-utils';
|
|
4
|
+
import { CommonException } from '../crud-pro/exceptions';
|
|
5
5
|
|
|
6
|
-
function isEnableByHeaderKey(ctx: Context, configName: string){
|
|
6
|
+
function isEnableByHeaderKey(ctx: Context, configName: string) {
|
|
7
7
|
const fatcmsDebug = ctx.app.getConfig(configName);
|
|
8
8
|
const headerKey = _.get(fatcmsDebug, 'headerKey');
|
|
9
9
|
const headerSecret = _.get(fatcmsDebug, 'headerSecret');
|
|
@@ -14,7 +14,6 @@ function isEnableByHeaderKey(ctx: Context, configName: string){
|
|
|
14
14
|
return headers[headerKey] === headerSecret;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
18
17
|
/**
|
|
19
18
|
* 是否开启调试能力
|
|
20
19
|
* @param ctx
|
|
@@ -23,7 +22,6 @@ export function isEnableDebug(ctx: Context): boolean {
|
|
|
23
22
|
return isEnableByHeaderKey(ctx, 'fatcmsDebug');
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
|
|
27
25
|
/**
|
|
28
26
|
* 是否开启SA账号。只有账号密码没有用,必须通过ModHeader插件设置如下字段
|
|
29
27
|
* @param ctx
|
|
@@ -32,7 +30,6 @@ export function isEnableSuperAdmin(ctx: Context): boolean {
|
|
|
32
30
|
return isEnableByHeaderKey(ctx, 'fatcmsSAEnable');
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
|
|
36
33
|
export function isLocalEnv(ctx: Context): boolean {
|
|
37
34
|
// 系统内部调用。如定时任务,没有request对象。
|
|
38
35
|
if (!ctx.request) {
|
|
@@ -42,8 +39,6 @@ export function isLocalEnv(ctx: Context): boolean {
|
|
|
42
39
|
return host.startsWith('127.0.0.1') || host.startsWith('localhost:');
|
|
43
40
|
}
|
|
44
41
|
|
|
45
|
-
|
|
46
|
-
|
|
47
42
|
/**
|
|
48
43
|
* 获取调试时专用的站点code
|
|
49
44
|
* @param ctx
|
|
@@ -62,32 +57,26 @@ export function getDebugProxyTarget(ctx: Context): string {
|
|
|
62
57
|
return headers['fatcmsdebugproxytarget'];
|
|
63
58
|
}
|
|
64
59
|
|
|
65
|
-
|
|
66
|
-
export function getCsrfToken(ctx: Context): string{
|
|
60
|
+
export function getCsrfToken(ctx: Context): string {
|
|
67
61
|
const headers = _.get(ctx, 'request.headers') || {};
|
|
68
62
|
return headers['fatcmscsrftoken'];
|
|
69
63
|
}
|
|
70
64
|
|
|
71
|
-
|
|
72
65
|
/**
|
|
73
66
|
* 扩展的源码应用:本地开发调试时加载本地的js脚本
|
|
74
67
|
* @param ctx
|
|
75
68
|
*/
|
|
76
|
-
export function getExtLocalLoaderPort(ctx: Context)
|
|
69
|
+
export function getExtLocalLoaderPort(ctx: Context): string {
|
|
77
70
|
const headers = _.get(ctx, 'request.headers') || {};
|
|
78
71
|
return headers['fatcmsextlocalloaderport'];
|
|
79
72
|
}
|
|
80
73
|
|
|
81
|
-
|
|
82
|
-
|
|
83
74
|
export async function isCsrfTokenValid(ctx: Context): Promise<boolean> {
|
|
84
|
-
|
|
85
75
|
// 本地开发,不需要校验
|
|
86
76
|
if (isLocalEnv(ctx) || isEnableDebug(ctx)) {
|
|
87
77
|
return true;
|
|
88
78
|
}
|
|
89
79
|
|
|
90
|
-
|
|
91
80
|
const fatcmscsrftoken = getCsrfToken(ctx);
|
|
92
81
|
if (!fatcmscsrftoken) {
|
|
93
82
|
return false;
|
|
@@ -96,20 +85,19 @@ export async function isCsrfTokenValid(ctx: Context): Promise<boolean> {
|
|
|
96
85
|
const depryptToken = await privateAES.time_decrypt_base64_utf8(fatcmscsrftoken);
|
|
97
86
|
if (depryptToken) {
|
|
98
87
|
const num = Number(depryptToken);
|
|
99
|
-
if (num &&
|
|
88
|
+
if (num && num + 6 * 3600 * 1000 > Date.now()) {
|
|
100
89
|
return true;
|
|
101
90
|
}
|
|
102
91
|
}
|
|
103
92
|
} catch (e) {
|
|
104
|
-
console.info('isCsrfTokenValid验证失败')
|
|
93
|
+
console.info('isCsrfTokenValid验证失败');
|
|
105
94
|
}
|
|
106
95
|
return false;
|
|
107
96
|
}
|
|
108
97
|
|
|
109
|
-
|
|
110
98
|
export async function assertCsrfToken(ctx: Context) {
|
|
111
|
-
const isOK =
|
|
99
|
+
const isOK = await isCsrfTokenValid(ctx);
|
|
112
100
|
if (!isOK) {
|
|
113
|
-
throw new CommonException(
|
|
101
|
+
throw new CommonException('ASSERT_CSRF_TOKEN_ERROR', 'CSRF_TOKEN 验证失败');
|
|
114
102
|
}
|
|
115
103
|
}
|