midway-fatcms 0.0.1-beta.18 → 0.0.1-beta.19
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 +3 -1
- package/dist/controller/gateway/AsyncTaskController.js +3 -3
- package/dist/controller/gateway/DocGatewayController.js +1 -1
- package/dist/controller/gateway/PublicApiController.js +4 -6
- package/dist/controller/gateway/StaticController.js +25 -22
- package/dist/controller/helpers.controller.d.ts +1 -1
- package/dist/controller/manage/CrudStandardDesignApi.d.ts +1 -1
- package/dist/controller/manage/CrudStandardDesignApi.js +4 -16
- package/dist/controller/manage/DataDictManageApi.d.ts +1 -1
- package/dist/controller/manage/DeployManageApi.d.ts +1 -1
- package/dist/controller/manage/DeployManageApi.js +32 -30
- package/dist/controller/manage/MenuManageApi.js +1 -1
- package/dist/controller/manage/SuperAdminManageApi.d.ts +2 -2
- package/dist/controller/manage/SysConfigMangeApi.d.ts +1 -1
- package/dist/controller/manage/SysConfigMangeApi.js +3 -3
- package/dist/controller/manage/SystemInfoManageApi.d.ts +1 -1
- package/dist/controller/manage/SystemInfoManageApi.js +7 -1
- package/dist/controller/manage/UserAccountManageApi.d.ts +1 -1
- package/dist/controller/manage/WorkbenchMangeApi.js +1 -1
- package/dist/controller/myinfo/AuthController.js +1 -1
- package/dist/controller/render/AppRenderController.js +6 -2
- package/dist/controller/test.controller.d.ts +1 -1
- package/dist/controller/test.controller.js +4 -4
- package/dist/libs/crud-pro/models/ExecuteContext.d.ts +1 -1
- package/dist/libs/crud-pro/models/TransactionSqlServer.js +1 -1
- package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +1 -1
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +7 -6
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.d.ts +1 -1
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +2 -4
- package/dist/libs/crud-pro/services/CrudProGenSqlService.js +6 -15
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +5 -4
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +2 -2
- package/dist/libs/crud-pro/utils/MixinUtils.js +1 -1
- package/dist/libs/crud-pro/utils/ValidateUtils.js +1 -1
- package/dist/libs/utils/fatcms-request.js +2 -2
- package/dist/middleware/forbidden.middleware.js +4 -20
- package/dist/middleware/global.middleware.js +1 -4
- package/dist/models/AsyncTaskModel.d.ts +2 -1
- package/dist/models/RedisKeys.d.ts +8 -0
- package/dist/models/RedisKeys.js +11 -0
- package/dist/schedule/runSchedule.d.ts +1 -0
- package/dist/schedule/runSchedule.js +9 -6
- package/dist/service/UserSessionService.js +2 -1
- package/dist/service/VisitStatService.d.ts +1 -1
- package/dist/service/VisitStatService.js +16 -25
- package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +9 -3
- package/dist/service/asyncTask/AsyncTaskRunnerService.js +57 -21
- package/dist/service/asyncTask/AsyncTaskService.d.ts +1 -1
- package/dist/service/asyncTask/AsyncTaskService.js +3 -2
- package/package.json +1 -1
- package/src/controller/base/BaseApiController.ts +6 -6
- package/src/controller/gateway/AsyncTaskController.ts +17 -22
- package/src/controller/gateway/CrudMtdGatewayController.ts +7 -7
- package/src/controller/gateway/CrudStdGatewayController.ts +4 -4
- package/src/controller/gateway/DocGatewayController.ts +17 -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 -264
- package/src/controller/helpers.controller.ts +1 -1
- package/src/controller/home.controller.ts +0 -5
- package/src/controller/manage/AnyApiMangeApi.ts +4 -4
- package/src/controller/manage/AppLogMangeApi.ts +3 -3
- package/src/controller/manage/AppMangeApi.ts +5 -5
- package/src/controller/manage/AppPageMangeApi.ts +3 -3
- package/src/controller/manage/AppSchemaHistoryApi.ts +1 -1
- package/src/controller/manage/CrudMethodsMangeApi.ts +3 -3
- package/src/controller/manage/CrudStandardDesignApi.ts +25 -77
- package/src/controller/manage/DataDictManageApi.ts +4 -4
- package/src/controller/manage/DeployManageApi.ts +84 -91
- package/src/controller/manage/DocLibManageApi.ts +3 -3
- package/src/controller/manage/DocManageApi.ts +3 -3
- package/src/controller/manage/MenuManageApi.ts +9 -14
- package/src/controller/manage/SuperAdminManageApi.ts +2 -10
- package/src/controller/manage/SysConfigMangeApi.ts +8 -11
- package/src/controller/manage/SystemInfoManageApi.ts +11 -6
- package/src/controller/manage/UserAccountManageApi.ts +2 -2
- package/src/controller/manage/WorkbenchMangeApi.ts +6 -6
- package/src/controller/myinfo/AuthController.ts +4 -8
- package/src/controller/render/AppRenderController.ts +8 -8
- package/src/controller/test.controller.ts +17 -17
- package/src/index.ts +0 -1
- package/src/libs/crud-pro/CrudPro.ts +0 -1
- package/src/libs/crud-pro/interfaces.ts +1 -3
- package/src/libs/crud-pro/models/ExecuteContext.ts +1 -4
- package/src/libs/crud-pro/models/ExecuteContextFunc.ts +1 -2
- package/src/libs/crud-pro/models/RequestModel.ts +1 -1
- package/src/libs/crud-pro/models/ResModel.ts +7 -12
- package/src/libs/crud-pro/models/SqlCfgModel.ts +1 -1
- 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 +1 -3
- package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +36 -48
- package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +19 -38
- package/src/libs/crud-pro/services/CrudProGenSqlService.ts +15 -32
- package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +23 -27
- package/src/libs/crud-pro/services/CrudProServiceBase.ts +1 -2
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +6 -14
- 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/global-config/global-config.ts +0 -5
- package/src/libs/utils/crypto-utils.ts +2 -4
- package/src/libs/utils/errorToString.ts +3 -8
- 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 +10 -21
- package/src/models/AsyncTaskModel.ts +3 -2
- package/src/models/RedisKeys.ts +13 -0
- package/src/models/bizmodels.ts +1 -2
- package/src/schedule/runSchedule.ts +16 -11
- package/src/service/UserSessionService.ts +5 -4
- package/src/service/VisitStatService.ts +55 -71
- package/src/service/asyncTask/AsyncTaskRunnerService.ts +119 -88
- package/src/service/asyncTask/AsyncTaskService.ts +9 -9
|
@@ -16,10 +16,8 @@ const createFunc = (sqlCfg) => {
|
|
|
16
16
|
},
|
|
17
17
|
toMatchSqlColumnName: (columnName) => {
|
|
18
18
|
const arr = columnName.split(',');
|
|
19
|
-
return arr
|
|
20
|
-
|
|
21
|
-
.join(',');
|
|
22
|
-
}
|
|
19
|
+
return arr.map(s => (0, convertColumnName_1.toSqlColumnName)(s.trim(), sqlCfg)).join(',');
|
|
20
|
+
},
|
|
23
21
|
};
|
|
24
22
|
};
|
|
25
23
|
class ValueChecker {
|
|
@@ -110,9 +110,11 @@ class CrudProGenSqlService extends CrudProServiceBase_1.CrudProServiceBase {
|
|
|
110
110
|
if (!Array.isArray(uniqueColumn) || uniqueColumn.length === 0) {
|
|
111
111
|
throw new exceptions_1.CommonException(exceptions_1.Exceptions.CFG_ERROR_POSTGRES_UNIQUE_COLUMNS_NULL);
|
|
112
112
|
}
|
|
113
|
-
const unique_column = uniqueColumn
|
|
113
|
+
const unique_column = uniqueColumn
|
|
114
|
+
.map(s => {
|
|
114
115
|
return `"${s}"`;
|
|
115
|
-
})
|
|
116
|
+
})
|
|
117
|
+
.join(',');
|
|
116
118
|
return `insert into @@table ( @@asInsertKeys:data ) values( @@asInsertValues:data ) ON CONFLICT (${unique_column}) DO UPDATE set @@asUpdate:data `; // 关键字的前后,必须有空格
|
|
117
119
|
}
|
|
118
120
|
if (cfgModel.sqlDbType === keys_1.SqlDbType.sqlserver) {
|
|
@@ -121,19 +123,8 @@ class CrudProGenSqlService extends CrudProServiceBase_1.CrudProServiceBase {
|
|
|
121
123
|
throw new exceptions_1.CommonException(exceptions_1.Exceptions.CFG_UNIQUE_COLUMN_COUNT_MUST_ONE);
|
|
122
124
|
}
|
|
123
125
|
const uniqueColumnStr = uniqueColumn[0];
|
|
124
|
-
const uniqueColumnVal =
|
|
125
|
-
const sql =
|
|
126
|
-
`IF EXISTS (SELECT 1 FROM @@table WHERE [${uniqueColumnStr}] = ${uniqueColumnVal})` +
|
|
127
|
-
"BEGIN\n" +
|
|
128
|
-
" UPDATE @@table\n" +
|
|
129
|
-
" SET @@asUpdate:data\n" +
|
|
130
|
-
` WHERE [${uniqueColumnStr}] = ${uniqueColumnVal} ;\n` +
|
|
131
|
-
"END\n" +
|
|
132
|
-
"ELSE\n" +
|
|
133
|
-
"BEGIN\n" +
|
|
134
|
-
" INSERT INTO @@table ( @@asInsertKeys:data )\n" +
|
|
135
|
-
" VALUES ( @@asInsertValues:data );\n" +
|
|
136
|
-
"END";
|
|
126
|
+
const uniqueColumnVal = '@@data.' + uniqueColumnStr;
|
|
127
|
+
const sql = '' + `IF EXISTS (SELECT 1 FROM @@table WHERE [${uniqueColumnStr}] = ${uniqueColumnVal})` + 'BEGIN\n' + ' UPDATE @@table\n' + ' SET @@asUpdate:data\n' + ` WHERE [${uniqueColumnStr}] = ${uniqueColumnVal} ;\n` + 'END\n' + 'ELSE\n' + 'BEGIN\n' + ' INSERT INTO @@table ( @@asInsertKeys:data )\n' + ' VALUES ( @@asInsertValues:data );\n' + 'END';
|
|
137
128
|
return sql;
|
|
138
129
|
}
|
|
139
130
|
return 'insert into @@table ( @@asInsertKeys:data ) values( @@asInsertValues:data ) on duplicate key update @@asUpdate:data '; // 关键字的前后,必须有空格
|
|
@@ -100,8 +100,7 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase_1.CrudProServiceBase
|
|
|
100
100
|
else if (word === keys_1.KeysOfCustomSQL.SQL_ORDER_BYS) {
|
|
101
101
|
return this.generateOrderBys(reqModel, sqlCfg);
|
|
102
102
|
}
|
|
103
|
-
else if ((word.startsWith(keys_1.KeysOfCustomSQL.SQL_GET_DATA_ATTR_START) ||
|
|
104
|
-
word.startsWith(keys_1.KeysOfCustomSQL.SQL_GET_CONDITION_ATTR_START)) && word.indexOf('.') > 0) {
|
|
103
|
+
else if ((word.startsWith(keys_1.KeysOfCustomSQL.SQL_GET_DATA_ATTR_START) || word.startsWith(keys_1.KeysOfCustomSQL.SQL_GET_CONDITION_ATTR_START)) && word.indexOf('.') > 0) {
|
|
105
104
|
return this.generateGetAttr(reqModel, word); //// data.xxx, condition.xxx
|
|
106
105
|
}
|
|
107
106
|
else if (word.startsWith(keys_1.KeysOfCustomSQL.SQL_PICK_RES_AS_NUMBER) || word.startsWith(keys_1.KeysOfCustomSQL.SQL_PICK_RES_AS_STRING)) {
|
|
@@ -219,9 +218,11 @@ class CrudProOriginToExecuteSql extends CrudProServiceBase_1.CrudProServiceBase
|
|
|
219
218
|
return new SqlSegArg_1.SqlSegArg(sql);
|
|
220
219
|
}
|
|
221
220
|
generatePickResAs(req, world) {
|
|
222
|
-
return new SqlSegArg_1.SqlSegArg(' ? ', [
|
|
221
|
+
return new SqlSegArg_1.SqlSegArg(' ? ', [
|
|
222
|
+
{
|
|
223
223
|
___GENERATE_GET_RES_ATTR___: world,
|
|
224
|
-
}
|
|
224
|
+
},
|
|
225
|
+
]);
|
|
225
226
|
}
|
|
226
227
|
generateGetAttr(req, word) {
|
|
227
228
|
const attrName = MixinUtils_1.MixinUtils.removeStringPrefix(word, '@@');
|
|
@@ -43,7 +43,7 @@ class CrudProTableMetaService extends CrudProServiceBase_1.CrudProServiceBase {
|
|
|
43
43
|
const baseInfo = {
|
|
44
44
|
sqlTable: sqlCfgModel.sqlTable,
|
|
45
45
|
sqlDatabase: sqlCfgModel.sqlDatabase,
|
|
46
|
-
sqlDbType: sqlCfgModel.sqlDbType
|
|
46
|
+
sqlDbType: sqlCfgModel.sqlDbType,
|
|
47
47
|
};
|
|
48
48
|
obj.tableColumns = await this.loadTableColumnInfo(baseInfo);
|
|
49
49
|
return obj;
|
|
@@ -71,7 +71,7 @@ class CrudProTableMetaService extends CrudProServiceBase_1.CrudProServiceBase {
|
|
|
71
71
|
return fieldObj['column_name'];
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
|
-
throw new Error(
|
|
74
|
+
throw new Error('暂不支持的数据库类型:' + baseInfo.sqlDbType);
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
exports.CrudProTableMetaService = CrudProTableMetaService;
|
|
@@ -43,7 +43,7 @@ const MixinUtils = {
|
|
|
43
43
|
return !str1 && !str2;
|
|
44
44
|
},
|
|
45
45
|
startsWith(str1, str2) {
|
|
46
|
-
if (typeof str1 ===
|
|
46
|
+
if (typeof str1 === 'string' && typeof str2 === 'string') {
|
|
47
47
|
return str1.startsWith(str2);
|
|
48
48
|
}
|
|
49
49
|
return false;
|
|
@@ -147,7 +147,7 @@ function validateByCfgString(validateCfg, itemValue, errPath) {
|
|
|
147
147
|
return;
|
|
148
148
|
}
|
|
149
149
|
// 必填
|
|
150
|
-
if (
|
|
150
|
+
if ('required' === validateCfg) {
|
|
151
151
|
if (isEmpty(itemValue)) {
|
|
152
152
|
throw new exceptions_1.CommonException(exceptions_1.Exceptions.VALIDATE_ERR, "'参数校验错误,字段 " + errPath + ' 不满足校验配置:' + validateCfg);
|
|
153
153
|
}
|
|
@@ -84,7 +84,7 @@ async function isCsrfTokenValid(ctx) {
|
|
|
84
84
|
const depryptToken = await crypto_utils_1.privateAES.time_decrypt_base64_utf8(fatcmscsrftoken);
|
|
85
85
|
if (depryptToken) {
|
|
86
86
|
const num = Number(depryptToken);
|
|
87
|
-
if (num &&
|
|
87
|
+
if (num && num + 6 * 3600 * 1000 > Date.now()) {
|
|
88
88
|
return true;
|
|
89
89
|
}
|
|
90
90
|
}
|
|
@@ -98,7 +98,7 @@ exports.isCsrfTokenValid = isCsrfTokenValid;
|
|
|
98
98
|
async function assertCsrfToken(ctx) {
|
|
99
99
|
const isOK = await isCsrfTokenValid(ctx);
|
|
100
100
|
if (!isOK) {
|
|
101
|
-
throw new exceptions_1.CommonException(
|
|
101
|
+
throw new exceptions_1.CommonException('ASSERT_CSRF_TOKEN_ERROR', 'CSRF_TOKEN 验证失败');
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
exports.assertCsrfToken = assertCsrfToken;
|
|
@@ -9,24 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.ForbiddenMiddleware = void 0;
|
|
10
10
|
const core_1 = require("@midwayjs/core");
|
|
11
11
|
// 一些爬虫/漏洞分析工具会来请求这玩意。
|
|
12
|
-
const blackEqualList = [
|
|
13
|
-
|
|
14
|
-
'/backend/.env',
|
|
15
|
-
'/application.yml',
|
|
16
|
-
'/db.ini',
|
|
17
|
-
'/.well-known/security.txt',
|
|
18
|
-
];
|
|
19
|
-
const blackPrefixList = [
|
|
20
|
-
'/.aws/',
|
|
21
|
-
'/.git/',
|
|
22
|
-
'/.svn/',
|
|
23
|
-
'/.env/',
|
|
24
|
-
'/src/',
|
|
25
|
-
'/var/logs/',
|
|
26
|
-
'/var/log/',
|
|
27
|
-
'/cgi-bin/',
|
|
28
|
-
'/php-cgi/',
|
|
29
|
-
];
|
|
12
|
+
const blackEqualList = ['/config.json', '/backend/.env', '/application.yml', '/db.ini', '/.well-known/security.txt'];
|
|
13
|
+
const blackPrefixList = ['/.aws/', '/.git/', '/.svn/', '/.env/', '/src/', '/var/logs/', '/var/log/', '/cgi-bin/', '/php-cgi/'];
|
|
30
14
|
/**
|
|
31
15
|
* 针对一些路径禁止访问。避免一些爬虫抓取网站内容,实际上这里枚举的路径,本身就是不存在的。只是为了提前拦截,为了服务器性能考虑。
|
|
32
16
|
*/
|
|
@@ -55,9 +39,9 @@ let ForbiddenMiddleware = class ForbiddenMiddleware {
|
|
|
55
39
|
}
|
|
56
40
|
resolve() {
|
|
57
41
|
return async (ctx, next) => {
|
|
58
|
-
ctx.set({
|
|
42
|
+
ctx.set({ 'content-type': 'text/html; charset=utf-8' });
|
|
59
43
|
ctx.status = 404;
|
|
60
|
-
ctx.body =
|
|
44
|
+
ctx.body = '404!404!404!重要的事情说三遍!';
|
|
61
45
|
};
|
|
62
46
|
}
|
|
63
47
|
static getName() {
|
|
@@ -186,10 +186,7 @@ async function trackRequest(ctx) {
|
|
|
186
186
|
console.error('trackRequestError', e);
|
|
187
187
|
}
|
|
188
188
|
}
|
|
189
|
-
const excludePathPrefix = [
|
|
190
|
-
'/ns/static/',
|
|
191
|
-
'/ns/api/helpers'
|
|
192
|
-
];
|
|
189
|
+
const excludePathPrefix = ['/ns/static/', '/ns/api/helpers'];
|
|
193
190
|
/**
|
|
194
191
|
* 全局中间件
|
|
195
192
|
*/
|
|
@@ -31,6 +31,7 @@ export interface SysAsyncTaskEntity {
|
|
|
31
31
|
completed_at: Date | null;
|
|
32
32
|
created_user_session: string;
|
|
33
33
|
}
|
|
34
|
+
export declare type SysAsyncTaskPartial = Partial<SysAsyncTaskEntity>;
|
|
34
35
|
export declare enum SysAsyncTaskStatus {
|
|
35
36
|
PENDING = "PENDING",
|
|
36
37
|
RUNNING = "RUNNING",
|
|
@@ -56,7 +57,7 @@ export interface ISysAsyncTaskHandler {
|
|
|
56
57
|
}
|
|
57
58
|
export interface SysAsyncTaskContext {
|
|
58
59
|
task: SysAsyncTaskEntity;
|
|
59
|
-
updateTaskStatus: () => any;
|
|
60
|
+
updateTaskStatus: (sysAsyncTaskPartial: SysAsyncTaskPartial) => any;
|
|
60
61
|
}
|
|
61
62
|
export interface SysAsyncTaskHandlerConfig {
|
|
62
63
|
taskType: string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisKeys = void 0;
|
|
4
|
+
const RedisKeys = {
|
|
5
|
+
ASYNC_TASK_LOCK: "FatAsyncTaskLock",
|
|
6
|
+
ASYNC_TASK_UPDATE_TIME: "FatAsyncTaskUpdateTime",
|
|
7
|
+
USER_SESSION_PREFIX: "FatUserSession_",
|
|
8
|
+
VISIT_STAT_LOCK_PREFIX: "FatVsLock_",
|
|
9
|
+
VISIT_STAT_DATE_PREFIX: "FatVsDate_",
|
|
10
|
+
};
|
|
11
|
+
exports.RedisKeys = RedisKeys;
|
|
@@ -7,6 +7,7 @@ declare class ScheduleQueue {
|
|
|
7
7
|
setScheduleTask(serviceName: string, intervalTime: number): void;
|
|
8
8
|
removeScheduleTask(serviceName: string): void;
|
|
9
9
|
private isAlreadyTimeToExecute;
|
|
10
|
+
private runScheduleTaskOnceCheckTime;
|
|
10
11
|
private runScheduleServiceList;
|
|
11
12
|
startScheduleLoop(): Promise<void>;
|
|
12
13
|
}
|
|
@@ -36,18 +36,21 @@ class ScheduleQueue {
|
|
|
36
36
|
const lastExecuteTime = lastExecuteTimeMap[serviceName];
|
|
37
37
|
return (Date.now() - lastExecuteTime) >= intervalTime;
|
|
38
38
|
}
|
|
39
|
+
async runScheduleTaskOnceCheckTime(serviceName) {
|
|
40
|
+
// 还没有到可以执行时间
|
|
41
|
+
if (!this.isAlreadyTimeToExecute(serviceName)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
lastExecuteTimeMap[serviceName] = Date.now();
|
|
45
|
+
await runScheduleTaskOnce(serviceName);
|
|
46
|
+
}
|
|
39
47
|
async runScheduleServiceList() {
|
|
40
48
|
const serviceListKeys = this.scheduleIntervalMap.keys();
|
|
41
49
|
const serviceList = [...serviceListKeys];
|
|
42
50
|
for (let i = 0; i < serviceList.length; i++) {
|
|
43
51
|
const serviceName = serviceList[i];
|
|
44
|
-
// 还没有到可以执行时间
|
|
45
|
-
if (!this.isAlreadyTimeToExecute(serviceName)) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
lastExecuteTimeMap[serviceName] = Date.now();
|
|
49
52
|
try {
|
|
50
|
-
await
|
|
53
|
+
await this.runScheduleTaskOnceCheckTime(serviceName);
|
|
51
54
|
}
|
|
52
55
|
catch (e) {
|
|
53
56
|
anonymousContext_1.ANONYMOUS_CONTEXT.getApp().getCoreLogger().error(`runSchedule error , serviceName = ${serviceName}`, e);
|
|
@@ -14,6 +14,7 @@ const core_1 = require("@midwayjs/core");
|
|
|
14
14
|
const functions_1 = require("../libs/utils/functions");
|
|
15
15
|
const userSession_1 = require("../models/userSession");
|
|
16
16
|
const RedisCacheService_1 = require("./base/RedisCacheService");
|
|
17
|
+
const RedisKeys_1 = require("../models/RedisKeys");
|
|
17
18
|
function pickUserAvatar(avatar) {
|
|
18
19
|
if (!avatar) {
|
|
19
20
|
return null;
|
|
@@ -41,7 +42,7 @@ function pickUserAvatar(avatar) {
|
|
|
41
42
|
}
|
|
42
43
|
const SESSION_KEEP_TIME_SECOND = 3600 * 24 * 30;
|
|
43
44
|
const toCacheKey = (sessionId) => {
|
|
44
|
-
return
|
|
45
|
+
return `${RedisKeys_1.RedisKeys.USER_SESSION_PREFIX}${sessionId}`;
|
|
45
46
|
};
|
|
46
47
|
let UserSessionService = class UserSessionService {
|
|
47
48
|
async saveUserSession(sessionInfo) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Context } from '@midwayjs/koa';
|
|
2
2
|
import { IScheduleService } from '../interface';
|
|
3
|
-
import { BaseService } from
|
|
3
|
+
import { BaseService } from './base/BaseService';
|
|
4
4
|
export declare class VisitStatService extends BaseService implements IScheduleService {
|
|
5
5
|
protected ctx: Context;
|
|
6
6
|
private curdProService;
|
|
@@ -18,6 +18,7 @@ const keys_1 = require("../libs/crud-pro/models/keys");
|
|
|
18
18
|
const bizmodels_1 = require("../models/bizmodels");
|
|
19
19
|
const common_dto_1 = require("../libs/utils/common-dto");
|
|
20
20
|
const global_config_1 = require("../libs/global-config/global-config");
|
|
21
|
+
const RedisKeys_1 = require("../models/RedisKeys");
|
|
21
22
|
// 3天 的秒数
|
|
22
23
|
const EXPIRE_TIME = 3 * 24 * 60 * 60;
|
|
23
24
|
const STAT_TYPES = {
|
|
@@ -28,26 +29,26 @@ const STAT_TYPES = {
|
|
|
28
29
|
let VisitStatService = class VisitStatService extends BaseService_1.BaseService {
|
|
29
30
|
async runBySchedule() {
|
|
30
31
|
const hours = new Date().getHours();
|
|
31
|
-
this.logInfo(
|
|
32
|
+
this.logInfo('[VisitStatService] runBySchedule called, hours = ' + hours);
|
|
32
33
|
return this.flushVisitStatToDB();
|
|
33
34
|
}
|
|
34
35
|
async flushVisitStatToDB() {
|
|
35
36
|
const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
|
|
36
37
|
// 统计昨天的数据。
|
|
37
38
|
const stat_date = new Date(Date.now() - 24 * 3600 * 1000).toISOString().split('T')[0];
|
|
38
|
-
const lockKey =
|
|
39
|
+
const lockKey = `${RedisKeys_1.RedisKeys.VISIT_STAT_LOCK_PREFIX}${stat_date}`;
|
|
39
40
|
// 每天只能执行一次
|
|
40
41
|
const client = this.redisService;
|
|
41
42
|
const nxRes = await client.set(lockKey, 1, 'EX', EXPIRE_TIME, 'NX');
|
|
42
43
|
if (nxRes !== 'OK') {
|
|
43
|
-
this.logInfo(
|
|
44
|
-
return common_dto_1.CommonResult.errorRes(
|
|
44
|
+
this.logInfo('[VisitStatService] flushVisitStatToDB 每天只能执行一次 ');
|
|
45
|
+
return common_dto_1.CommonResult.errorRes('每天只能执行一次');
|
|
45
46
|
}
|
|
46
|
-
this.logInfo(
|
|
47
|
+
this.logInfo('[VisitStatService] flushVisitStatToDB start ');
|
|
47
48
|
let totalCount = 0;
|
|
48
49
|
let successCount = 0;
|
|
49
50
|
try {
|
|
50
|
-
const keys = await client.keys(
|
|
51
|
+
const keys = await client.keys(`${RedisKeys_1.RedisKeys.VISIT_STAT_DATE_PREFIX}${stat_date}::*`);
|
|
51
52
|
// `vs_${date}::${req_host}::${resource_type}::${stat_type}::${resource}`;
|
|
52
53
|
totalCount = keys.length;
|
|
53
54
|
for (const key of keys) {
|
|
@@ -59,7 +60,7 @@ let VisitStatService = class VisitStatService extends BaseService_1.BaseService
|
|
|
59
60
|
const stat_type = parts[3];
|
|
60
61
|
const stat_resource = parts[4];
|
|
61
62
|
let stat_count;
|
|
62
|
-
if (stat_type === STAT_TYPES.uv_ip || stat_type
|
|
63
|
+
if (stat_type === STAT_TYPES.uv_ip || stat_type === STAT_TYPES.uv_uid) {
|
|
63
64
|
stat_count = await client.scard(key);
|
|
64
65
|
}
|
|
65
66
|
else {
|
|
@@ -72,8 +73,8 @@ let VisitStatService = class VisitStatService extends BaseService_1.BaseService
|
|
|
72
73
|
stat_type,
|
|
73
74
|
resource_type,
|
|
74
75
|
stat_count,
|
|
75
|
-
req_host
|
|
76
|
-
}
|
|
76
|
+
req_host,
|
|
77
|
+
},
|
|
77
78
|
}, {
|
|
78
79
|
sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_INSERT,
|
|
79
80
|
sqlDatabase: SystemDbName,
|
|
@@ -94,7 +95,7 @@ let VisitStatService = class VisitStatService extends BaseService_1.BaseService
|
|
|
94
95
|
this.logError('[VisitStatService] flushVisitStatToDB', error);
|
|
95
96
|
console.log('[VisitStatService] flushVisitStatToDB', error);
|
|
96
97
|
}
|
|
97
|
-
this.logInfo(
|
|
98
|
+
this.logInfo('[VisitStatService] flushVisitStatToDB end ');
|
|
98
99
|
return common_dto_1.CommonResult.successRes({ successCount, totalCount });
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
@@ -124,34 +125,24 @@ let VisitStatService = class VisitStatService extends BaseService_1.BaseService
|
|
|
124
125
|
const client = this.redisService;
|
|
125
126
|
const ip = this.ctx.headers['x-real-ip'];
|
|
126
127
|
const userSession = this.ctx.userSession;
|
|
127
|
-
const req_host = ((_b = (_a = this.ctx) === null || _a === void 0 ? void 0 : _a.request) === null || _b === void 0 ? void 0 : _b.host) ||
|
|
128
|
+
const req_host = ((_b = (_a = this.ctx) === null || _a === void 0 ? void 0 : _a.request) === null || _b === void 0 ? void 0 : _b.host) || 'null'; // 域名
|
|
128
129
|
const date = new Date().toISOString().split('T')[0];
|
|
129
130
|
const toDateResourceKey = (stat_type) => {
|
|
130
|
-
return
|
|
131
|
+
return `${RedisKeys_1.RedisKeys.VISIT_STAT_DATE_PREFIX}${date}::${req_host}::${resource_type}::${stat_type}::${resource}`;
|
|
131
132
|
};
|
|
132
133
|
const pv_key = toDateResourceKey(STAT_TYPES.pv);
|
|
133
134
|
const uv_ip_key = toDateResourceKey(STAT_TYPES.uv_ip);
|
|
134
135
|
const uv_uid_key = toDateResourceKey(STAT_TYPES.uv_uid);
|
|
135
136
|
// 统计 PV
|
|
136
|
-
await Promise.all([
|
|
137
|
-
client.incr(pv_key),
|
|
138
|
-
client.expire(pv_key, EXPIRE_TIME)
|
|
139
|
-
]);
|
|
137
|
+
await Promise.all([client.incr(pv_key), client.expire(pv_key, EXPIRE_TIME)]);
|
|
140
138
|
// IP 访问 UV
|
|
141
|
-
await Promise.all([
|
|
142
|
-
client.sadd(uv_ip_key, `${ip}`),
|
|
143
|
-
client.expire(uv_ip_key, EXPIRE_TIME)
|
|
144
|
-
]);
|
|
139
|
+
await Promise.all([client.sadd(uv_ip_key, `${ip}`), client.expire(uv_ip_key, EXPIRE_TIME)]);
|
|
145
140
|
if (userSession && userSession.isLogin()) {
|
|
146
141
|
const accountId = userSession.getSessionInfo().accountId;
|
|
147
142
|
// 统计 UV
|
|
148
|
-
await Promise.all([
|
|
149
|
-
client.sadd(uv_uid_key, accountId),
|
|
150
|
-
client.expire(uv_uid_key, EXPIRE_TIME)
|
|
151
|
-
]);
|
|
143
|
+
await Promise.all([client.sadd(uv_uid_key, accountId), client.expire(uv_uid_key, EXPIRE_TIME)]);
|
|
152
144
|
}
|
|
153
145
|
}
|
|
154
|
-
;
|
|
155
146
|
};
|
|
156
147
|
__decorate([
|
|
157
148
|
(0, core_1.Inject)(),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context } from '@midwayjs/koa';
|
|
2
|
-
import { BaseService } from
|
|
3
|
-
import { IScheduleService } from
|
|
4
|
-
import { ISysAsyncTaskHandler, SysAsyncTaskEntity } from
|
|
2
|
+
import { BaseService } from '../../service/base/BaseService';
|
|
3
|
+
import { IScheduleService } from '../../interface';
|
|
4
|
+
import { ISysAsyncTaskHandler, SysAsyncTaskEntity } from '../../models/AsyncTaskModel';
|
|
5
5
|
declare class AsyncTaskRunner {
|
|
6
6
|
isBusy: boolean;
|
|
7
7
|
taskHandlerMap: Map<string, ISysAsyncTaskHandler>;
|
|
@@ -10,6 +10,7 @@ declare class AsyncTaskRunner {
|
|
|
10
10
|
/**
|
|
11
11
|
* 更新任务状态或任务进度
|
|
12
12
|
* @param taskElement
|
|
13
|
+
* @param updatePartials
|
|
13
14
|
* @private
|
|
14
15
|
*/
|
|
15
16
|
private updateTaskStatus;
|
|
@@ -27,5 +28,10 @@ export declare class AsyncTaskRunnerService extends BaseService implements ISche
|
|
|
27
28
|
private curdProService;
|
|
28
29
|
fetchPendingTasks(): Promise<void>;
|
|
29
30
|
runBySchedule(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* 是否存在新任务
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
private isExistNewTask;
|
|
30
36
|
}
|
|
31
37
|
export {};
|
|
@@ -19,6 +19,7 @@ const SystemTables_1 = require("../../models/SystemTables");
|
|
|
19
19
|
const keys_1 = require("../../libs/crud-pro/models/keys");
|
|
20
20
|
const errorToString_1 = require("../../libs/utils/errorToString");
|
|
21
21
|
const schedule_1 = require("../../schedule");
|
|
22
|
+
const RedisKeys_1 = require("../../models/RedisKeys");
|
|
22
23
|
class AsyncTaskRunner {
|
|
23
24
|
constructor() {
|
|
24
25
|
this.isBusy = false;
|
|
@@ -40,10 +41,13 @@ class AsyncTaskRunner {
|
|
|
40
41
|
taskElement.error_message = (0, errorToString_1.errorToString)(error);
|
|
41
42
|
}
|
|
42
43
|
try {
|
|
43
|
-
await this.updateTaskStatus(taskElement
|
|
44
|
+
await this.updateTaskStatus(taskElement, {
|
|
45
|
+
task_status: taskElement.task_status,
|
|
46
|
+
error_message: taskElement.error_message,
|
|
47
|
+
});
|
|
44
48
|
}
|
|
45
49
|
catch (error) {
|
|
46
|
-
schedule_1.ANONYMOUS_CONTEXT.getApp().getCoreLogger().error(
|
|
50
|
+
schedule_1.ANONYMOUS_CONTEXT.getApp().getCoreLogger().error('executeTaskList error', error);
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
53
|
this.isBusy = false;
|
|
@@ -54,26 +58,29 @@ class AsyncTaskRunner {
|
|
|
54
58
|
if (!taskHandler) {
|
|
55
59
|
throw new Error('TaskHandler not found , taskType = ' + taskType);
|
|
56
60
|
}
|
|
57
|
-
const updateTaskStatus = () => {
|
|
58
|
-
return this.updateTaskStatus(taskElement);
|
|
61
|
+
const updateTaskStatus = (updatePartials) => {
|
|
62
|
+
return this.updateTaskStatus(taskElement, updatePartials);
|
|
59
63
|
};
|
|
60
64
|
await taskHandler.execute({ task: taskElement, updateTaskStatus });
|
|
61
65
|
}
|
|
62
66
|
/**
|
|
63
67
|
* 更新任务状态或任务进度
|
|
64
68
|
* @param taskElement
|
|
69
|
+
* @param updatePartials
|
|
65
70
|
* @private
|
|
66
71
|
*/
|
|
67
|
-
async updateTaskStatus(taskElement) {
|
|
72
|
+
async updateTaskStatus(taskElement, updatePartials) {
|
|
73
|
+
if (!updatePartials) {
|
|
74
|
+
throw new Error('updatePartials not found');
|
|
75
|
+
}
|
|
68
76
|
return await schedule_1.ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx) => {
|
|
69
|
-
const curdProService = await ctx.requestContext.getAsync(
|
|
77
|
+
const curdProService = await ctx.requestContext.getAsync('curdProService');
|
|
70
78
|
const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
|
|
71
|
-
const { id, ...otherTaskProps } = taskElement;
|
|
72
79
|
const res = await curdProService.executeCrudByCfg({
|
|
73
80
|
condition: {
|
|
74
|
-
id: id
|
|
81
|
+
id: taskElement.id,
|
|
75
82
|
},
|
|
76
|
-
data:
|
|
83
|
+
data: updatePartials,
|
|
77
84
|
}, {
|
|
78
85
|
sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
|
|
79
86
|
sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
|
|
@@ -98,7 +105,10 @@ exports.ASYNC_TASK_RUNNER = new AsyncTaskRunner();
|
|
|
98
105
|
/**
|
|
99
106
|
* Redis锁
|
|
100
107
|
*/
|
|
101
|
-
const
|
|
108
|
+
const ASYNC_TASK_LOCK = RedisKeys_1.RedisKeys.ASYNC_TASK_LOCK;
|
|
109
|
+
const ASYNC_TASK_RUNTIME_OBJ = {
|
|
110
|
+
LAST_CHECK_ASYNC_TASK_UPDATE_TIME: 0,
|
|
111
|
+
};
|
|
102
112
|
let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.BaseService {
|
|
103
113
|
async fetchPendingTasks() {
|
|
104
114
|
const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
|
|
@@ -112,11 +122,11 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
|
|
|
112
122
|
condition: {
|
|
113
123
|
task_status: AsyncTaskModel_1.SysAsyncTaskStatus.PENDING,
|
|
114
124
|
task_type: {
|
|
115
|
-
|
|
116
|
-
}
|
|
125
|
+
$in: taskTypeList,
|
|
126
|
+
},
|
|
117
127
|
},
|
|
118
128
|
orderBy: 'id+',
|
|
119
|
-
limit: 10
|
|
129
|
+
limit: 10,
|
|
120
130
|
}, {
|
|
121
131
|
sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
|
|
122
132
|
sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_PAGE,
|
|
@@ -132,12 +142,12 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
|
|
|
132
142
|
await this.curdProService.executeCrudByCfg({
|
|
133
143
|
condition: {
|
|
134
144
|
id: {
|
|
135
|
-
|
|
136
|
-
}
|
|
145
|
+
$in: taskIds,
|
|
146
|
+
},
|
|
137
147
|
},
|
|
138
148
|
data: {
|
|
139
|
-
task_status: AsyncTaskModel_1.SysAsyncTaskStatus.RUNNING
|
|
140
|
-
}
|
|
149
|
+
task_status: AsyncTaskModel_1.SysAsyncTaskStatus.RUNNING,
|
|
150
|
+
},
|
|
141
151
|
}, {
|
|
142
152
|
sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
|
|
143
153
|
sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
|
|
@@ -146,16 +156,22 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
|
|
|
146
156
|
});
|
|
147
157
|
// 开始执行。
|
|
148
158
|
exports.ASYNC_TASK_RUNNER.executeTaskList(taskList).then(() => {
|
|
149
|
-
console.log(
|
|
159
|
+
console.log('ASYNC_TASK_RUNNER finished taskIds ==> ' + JSON.stringify(taskIds));
|
|
150
160
|
});
|
|
151
161
|
}
|
|
152
162
|
async runBySchedule() {
|
|
163
|
+
// 1. 当前很忙
|
|
153
164
|
if (exports.ASYNC_TASK_RUNNER.isBusy) {
|
|
154
165
|
return Promise.resolve();
|
|
155
166
|
}
|
|
167
|
+
// 2. 发现了新任务
|
|
168
|
+
const isExistNewTask = await this.isExistNewTask();
|
|
169
|
+
if (!isExistNewTask) {
|
|
170
|
+
return Promise.resolve();
|
|
171
|
+
}
|
|
156
172
|
// 这里的过期时间1分钟即可。fetchPendingTasks函数不可能超过一分钟。
|
|
157
173
|
// 因为这里只是从数据库中获取一批任务,放到自己的任务队列里。还没触发执行。
|
|
158
|
-
const lock = await this.redisService.set(
|
|
174
|
+
const lock = await this.redisService.set(ASYNC_TASK_LOCK, 1, 'EX', 60, 'NX');
|
|
159
175
|
if (lock !== 'OK') {
|
|
160
176
|
return Promise.resolve();
|
|
161
177
|
}
|
|
@@ -163,11 +179,31 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
|
|
|
163
179
|
await this.fetchPendingTasks();
|
|
164
180
|
}
|
|
165
181
|
catch (e) {
|
|
166
|
-
console.error(
|
|
182
|
+
console.error('fetchPendingTasks error', (0, errorToString_1.errorToString)(e));
|
|
167
183
|
}
|
|
168
|
-
await this.redisService.del(
|
|
184
|
+
await this.redisService.del(ASYNC_TASK_LOCK);
|
|
169
185
|
return Promise.resolve();
|
|
170
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* 是否存在新任务
|
|
189
|
+
* @private
|
|
190
|
+
*/
|
|
191
|
+
async isExistNewTask() {
|
|
192
|
+
// 刚启动,没有检查过。
|
|
193
|
+
if (!ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
//Redis没有任何内容
|
|
197
|
+
const updateTime = await this.redisService.get(RedisKeys_1.RedisKeys.ASYNC_TASK_UPDATE_TIME);
|
|
198
|
+
if (!updateTime) {
|
|
199
|
+
ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME = Date.now();
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
const updateTimeNumber = Number.parseInt(updateTime, 10);
|
|
203
|
+
const isExistNewTask = updateTimeNumber > ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME;
|
|
204
|
+
ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME = updateTimeNumber;
|
|
205
|
+
return isExistNewTask;
|
|
206
|
+
}
|
|
171
207
|
};
|
|
172
208
|
__decorate([
|
|
173
209
|
(0, core_1.Inject)(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Context } from '@midwayjs/koa';
|
|
2
|
-
import { BaseService } from
|
|
2
|
+
import { BaseService } from '../../service/base/BaseService';
|
|
3
3
|
export declare class AsyncTaskService extends BaseService {
|
|
4
4
|
protected ctx: Context;
|
|
5
5
|
startTask(): Promise<void>;
|
|
@@ -14,14 +14,15 @@ const core_1 = require("@midwayjs/core");
|
|
|
14
14
|
const BaseService_1 = require("../../service/base/BaseService");
|
|
15
15
|
const schedule_1 = require("../../schedule");
|
|
16
16
|
const scheduleNames_1 = require("../../schedule/scheduleNames");
|
|
17
|
+
const RedisKeys_1 = require("../../models/RedisKeys");
|
|
17
18
|
let AsyncTaskService = class AsyncTaskService extends BaseService_1.BaseService {
|
|
18
19
|
async startTask() {
|
|
20
|
+
await this.redisService.set(RedisKeys_1.RedisKeys.ASYNC_TASK_UPDATE_TIME, `${Date.now()}`);
|
|
19
21
|
(0, schedule_1.runScheduleTaskOnce)(scheduleNames_1.INNER_SCHEDULE_NAMES.asyncTaskRunnerService).then(schedule => {
|
|
20
22
|
console.log(schedule);
|
|
21
23
|
});
|
|
22
24
|
}
|
|
23
|
-
async cancelTask(id) {
|
|
24
|
-
}
|
|
25
|
+
async cancelTask(id) { }
|
|
25
26
|
};
|
|
26
27
|
__decorate([
|
|
27
28
|
(0, core_1.Inject)(),
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Controller, Inject } from '@midwayjs/core';
|
|
2
2
|
import { Context } from '@midwayjs/koa';
|
|
3
|
-
import { CurdMixService } from '
|
|
4
|
-
import { IFuncCfgModel, IRequestCfgModel, IValidatorCfgItem } from '
|
|
5
|
-
import { KeyOfCrudTypes, KeysOfSimpleSQL } from '
|
|
3
|
+
import { CurdMixService } from '@/service/curd/CurdMixService';
|
|
4
|
+
import { IFuncCfgModel, IRequestCfgModel, IValidatorCfgItem } from '@/libs/crud-pro/interfaces';
|
|
5
|
+
import { KeyOfCrudTypes, KeysOfSimpleSQL } from '@/libs/crud-pro/models/keys';
|
|
6
6
|
import { GLOBAL_STATIC_CONFIG } from '@/libs/global-config/global-config';
|
|
7
|
-
import { UserAccountService } from '
|
|
8
|
-
import { RelatedType } from '
|
|
9
|
-
import { BaseService } from '
|
|
7
|
+
import { UserAccountService } from '@/service/UserAccountService';
|
|
8
|
+
import { RelatedType } from '@/service/curd/CurdMixUtils';
|
|
9
|
+
import { BaseService } from '@/service/base/BaseService';
|
|
10
10
|
|
|
11
11
|
export interface IExecuteSimpleSqlParams {
|
|
12
12
|
updateCfg?: Record<string, IFuncCfgModel>;
|