midway-fatcms 0.0.1-beta.56 → 0.0.1-beta.57
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/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.d.ts +1 -1
- package/dist/libs/crud-pro/utils/sqlConvert/convertMix.d.ts +1 -1
- package/dist/libs/crud-pro/utils/sqlConvert/convertMsSql.d.ts +1 -1
- package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.d.ts +1 -1
- package/dist/libs/utils/base64.d.ts +5 -5
- package/dist/libs/utils/base64.js +5 -5
- package/dist/libs/utils/render-utils.js +12 -14
- package/dist/schedule/runSchedule.js +1 -1
- package/dist/schedule/scheduleNames.js +2 -2
- package/dist/service/UserSessionService.js +1 -1
- package/dist/service/asyncTask/AsyncTaskRunnerService.js +3 -3
- package/dist/service/crudstd/CrudStdService.d.ts +1 -0
- package/dist/service/crudstd/CrudStdService.js +34 -1
- package/dist/service/curd/CurdProService.js +2 -2
- package/package.json +1 -1
- package/src/controller/gateway/AnyApiGatewayController.ts +33 -1
- package/src/controller/gateway/PublicApiController.ts +1 -1
- package/src/controller/gateway/StaticController.ts +2 -2
- package/src/libs/crud-pro/models/Transaction.ts +3 -5
- package/src/libs/crud-pro/services/CrudProServiceBase.ts +0 -1
- package/src/libs/crud-pro/utils/sqlConvert/convertColumnName.ts +3 -8
- package/src/libs/crud-pro/utils/sqlConvert/convertMix.ts +17 -19
- package/src/libs/crud-pro/utils/sqlConvert/convertMsSql.ts +4 -6
- package/src/libs/crud-pro/utils/sqlConvert/convertPgSql.ts +4 -6
- package/src/libs/crud-pro/utils/sqlConvert/convertPgType.ts +1 -3
- package/src/libs/global-config/global-config.ts +5 -6
- package/src/libs/utils/base64.ts +32 -39
- package/src/libs/utils/render-utils.ts +25 -34
- package/src/models/SystemEntities.ts +1 -3
- package/src/models/SystemPerm.ts +10 -11
- package/src/models/SystemTables.ts +0 -1
- package/src/models/bizmodels.ts +2 -4
- package/src/schedule/index.ts +4 -11
- package/src/schedule/runSchedule.ts +4 -12
- package/src/schedule/scheduleNames.ts +5 -11
- package/src/service/AuthService.ts +2 -3
- package/src/service/UserSessionService.ts +20 -24
- package/src/service/asyncTask/AsyncTaskRunnerService.ts +3 -9
- package/src/service/asyncTask/handler/ExportExcelByStdCrudHandler.ts +0 -1
- package/src/service/base/BaseService.ts +4 -9
- package/src/service/base/RedisCacheService.ts +7 -10
- package/src/service/crudstd/CrudStdService.ts +52 -10
- package/src/service/curd/CrudProQuick.ts +12 -14
- package/src/service/curd/CurdMixUtils.ts +0 -2
- package/src/service/curd/CurdProService.ts +2 -2
- package/src/service/proxyapi/ProxyApiLoadService.ts +1 -5
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import * as _ from 'lodash';
|
|
2
2
|
import * as moment from 'moment';
|
|
3
|
-
import {Context} from '@midwayjs/koa';
|
|
4
|
-
import {parseJsonObject} from
|
|
5
|
-
import {getExtLocalLoaderPort} from
|
|
6
|
-
import {TypeUtils} from
|
|
3
|
+
import { Context } from '@midwayjs/koa';
|
|
4
|
+
import { parseJsonObject } from './functions';
|
|
5
|
+
import { getExtLocalLoaderPort } from './fatcms-request';
|
|
6
|
+
import { TypeUtils } from '../crud-pro/utils/TypeUtils';
|
|
7
7
|
|
|
8
8
|
// const demo = {"schema":[
|
|
9
9
|
// {"title":"资源配置","name":"fileList","type":"array","properties":{"fileUrl":{"label":"文件URL","component":"Input","xProps":{"hasClear":true},"width":500}}}],
|
|
10
10
|
// "data":{"fileList":[{"settingKey":"n1iqmu8qnc_1","fileUrl":"aa"},{"settingKey":"n1iqmu8rml_2","fileUrl":"aa"}]
|
|
11
11
|
// }}
|
|
12
12
|
|
|
13
|
-
|
|
14
13
|
interface IFileElement {
|
|
15
14
|
fileUrl: string;
|
|
16
15
|
fileType?: string;
|
|
@@ -26,7 +25,7 @@ interface IRenderUtilsProps {
|
|
|
26
25
|
fatcmscsrftoken: string;
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
function parseCookie(cookieStr:string)
|
|
28
|
+
function parseCookie(cookieStr: string): any {
|
|
30
29
|
const cookies = {};
|
|
31
30
|
|
|
32
31
|
if (!cookieStr) {
|
|
@@ -64,7 +63,6 @@ function parseCookie(cookieStr:string) : any {
|
|
|
64
63
|
return cookies;
|
|
65
64
|
}
|
|
66
65
|
|
|
67
|
-
|
|
68
66
|
class RenderUtils {
|
|
69
67
|
private readonly ctx: Context;
|
|
70
68
|
private readonly fileList: IFileElement[];
|
|
@@ -82,16 +80,20 @@ class RenderUtils {
|
|
|
82
80
|
const packageAssets = parseJsonObject(props.package_assets) || {};
|
|
83
81
|
const fileList = _.get(packageAssets, 'data.fileList');
|
|
84
82
|
if (Array.isArray(fileList)) {
|
|
85
|
-
this.fileList = fileList.filter(
|
|
83
|
+
this.fileList = fileList.filter(f => {
|
|
86
84
|
return f && f.fileUrl && typeof f.fileUrl === 'string' && f.fileUrl.length > 5; // 至少五个字符。
|
|
87
85
|
});
|
|
88
86
|
} else {
|
|
89
87
|
this.fileList = [];
|
|
90
88
|
const time = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
91
|
-
console.info(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
console.info(
|
|
90
|
+
time +
|
|
91
|
+
' 解析fileList为空==>' +
|
|
92
|
+
JSON.stringify({
|
|
93
|
+
workbench_code: this.workbenchInfo?.workbench_code,
|
|
94
|
+
app_code: this.appInfo?.app_code,
|
|
95
|
+
})
|
|
96
|
+
);
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
99
|
|
|
@@ -104,22 +106,18 @@ class RenderUtils {
|
|
|
104
106
|
}
|
|
105
107
|
|
|
106
108
|
renderWorkbenchInfo() {
|
|
107
|
-
const infoPick = _.pick(this.workbenchInfo, [
|
|
108
|
-
'id', 'workbench_code', 'workbench_name', 'workbench_domain', 'workbench_desc', 'config_type', 'config_content'
|
|
109
|
-
]);
|
|
109
|
+
const infoPick = _.pick(this.workbenchInfo, ['id', 'workbench_code', 'workbench_name', 'workbench_domain', 'workbench_desc', 'config_type', 'config_content']);
|
|
110
110
|
return `<script>window.__workbench_info = ${JSON.stringify(infoPick)}</script>`;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
renderAppInfo() {
|
|
114
|
-
const infoPick = _.pick(this.appInfo, [
|
|
115
|
-
'id', 'app_code', 'app_name', 'app_type', 'app_desc', 'config_type', 'config_content'
|
|
116
|
-
]);
|
|
114
|
+
const infoPick = _.pick(this.appInfo, ['id', 'app_code', 'app_name', 'app_type', 'app_desc', 'config_type', 'config_content']);
|
|
117
115
|
return `<script>window.__app_info = ${JSON.stringify(infoPick)}</script>`;
|
|
118
116
|
}
|
|
119
117
|
|
|
120
118
|
renderCookieInfo(keys: string) {
|
|
121
119
|
try {
|
|
122
|
-
const cookies = parseCookie(this.ctx.headers?.cookie)
|
|
120
|
+
const cookies = parseCookie(this.ctx.headers?.cookie);
|
|
123
121
|
const cookieObj = {};
|
|
124
122
|
if (typeof keys === 'string') {
|
|
125
123
|
const keyArr = keys.split(',');
|
|
@@ -132,53 +130,46 @@ class RenderUtils {
|
|
|
132
130
|
} catch (e) {
|
|
133
131
|
return `<script>window.__cookie_info_error = ${e}; </script>`;
|
|
134
132
|
}
|
|
135
|
-
|
|
136
133
|
}
|
|
137
134
|
|
|
138
|
-
|
|
139
135
|
renderJsAssets() {
|
|
140
|
-
const fileList = this.fileList.filter(
|
|
136
|
+
const fileList = this.fileList.filter(s => {
|
|
141
137
|
return s.fileType === 'js' || s.fileUrl.endsWith('.js');
|
|
142
138
|
});
|
|
143
139
|
const arr = fileList.map(f => {
|
|
144
140
|
if (f.isModule) {
|
|
145
|
-
return `<script type="module" crossorigin src="${f.fileUrl}" ></script
|
|
141
|
+
return `<script type="module" crossorigin src="${f.fileUrl}" ></script>`;
|
|
146
142
|
}
|
|
147
|
-
return `<script src="${f.fileUrl}" ></script
|
|
143
|
+
return `<script src="${f.fileUrl}" ></script>`;
|
|
148
144
|
});
|
|
149
145
|
return arr.join('\n');
|
|
150
146
|
}
|
|
151
147
|
|
|
152
148
|
renderCssAssets() {
|
|
153
|
-
const fileList = this.fileList.filter(
|
|
149
|
+
const fileList = this.fileList.filter(s => {
|
|
154
150
|
return s.fileType === 'css' || s.fileUrl.endsWith('.css');
|
|
155
151
|
});
|
|
156
152
|
const fileUrlList = fileList.map(f => {
|
|
157
153
|
return f.fileUrl;
|
|
158
154
|
});
|
|
159
155
|
|
|
160
|
-
const arr = fileUrlList.map(
|
|
156
|
+
const arr = fileUrlList.map(url => {
|
|
161
157
|
return `<link href="${url}" rel="stylesheet" />`;
|
|
162
158
|
});
|
|
163
159
|
return arr.join('\n');
|
|
164
160
|
}
|
|
165
161
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
renderExtLocalLoaderPortByDevHeader(){
|
|
162
|
+
renderExtLocalLoaderPortByDevHeader() {
|
|
169
163
|
const loaderPort = getExtLocalLoaderPort(this.ctx);
|
|
170
164
|
if (loaderPort && TypeUtils.isNumeric(loaderPort)) {
|
|
171
165
|
return `<script>window.__local_loader_port_from_dev_header = ${loaderPort}</script>`;
|
|
172
166
|
}
|
|
173
167
|
return '';
|
|
174
168
|
}
|
|
175
|
-
|
|
176
169
|
}
|
|
177
170
|
|
|
178
171
|
function createRenderUtils(props: IRenderUtilsProps) {
|
|
179
|
-
return new RenderUtils(props)
|
|
172
|
+
return new RenderUtils(props);
|
|
180
173
|
}
|
|
181
174
|
|
|
182
|
-
export {
|
|
183
|
-
createRenderUtils
|
|
184
|
-
}
|
|
175
|
+
export { createRenderUtils };
|
|
@@ -75,14 +75,12 @@ export interface IUpstreamInfo {
|
|
|
75
75
|
balanceStrategy: string;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
|
|
79
78
|
export enum ProxyUserContextEnum {
|
|
80
|
-
NO_PASS = 0
|
|
79
|
+
NO_PASS = 0,
|
|
81
80
|
BASIC_INFO = 1,
|
|
82
81
|
SESSION_INFO = 2,
|
|
83
82
|
}
|
|
84
83
|
|
|
85
|
-
|
|
86
84
|
export interface IProxyApiEntity extends IApiBaseEntity {
|
|
87
85
|
proxy_name: string; // 配置编码。2025-09-09 新增
|
|
88
86
|
proxy_code: string; // 配置编码。2025-09-09 新增
|
package/src/models/SystemPerm.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
/**
|
|
3
2
|
* 系统内置功能点
|
|
4
3
|
*/
|
|
@@ -73,17 +72,17 @@ export const SystemFuncCodeNameMap = {
|
|
|
73
72
|
WorkbenchMangeWrite: '【devops】工作台配置_编辑',
|
|
74
73
|
SystemInfoManageApiWrite: '【devops】系统信息_编辑',
|
|
75
74
|
|
|
76
|
-
RoleManageRead
|
|
77
|
-
RoleManageWrite
|
|
78
|
-
FuncManageRead
|
|
79
|
-
FuncManageWrite
|
|
80
|
-
RoleFuncManageRead
|
|
81
|
-
RoleFuncManageWrite
|
|
82
|
-
AccountRoleManageRead
|
|
83
|
-
AccountRoleManageWrite
|
|
75
|
+
RoleManageRead: '【devops】角色管理_查看', // role
|
|
76
|
+
RoleManageWrite: '【devops】角色管理_编辑',
|
|
77
|
+
FuncManageRead: '【devops】功能点管理_查看', // func
|
|
78
|
+
FuncManageWrite: '【devops】功能点管理_编辑',
|
|
79
|
+
RoleFuncManageRead: '【devops】角色功能点关联_查看', //role-func
|
|
80
|
+
RoleFuncManageWrite: '【devops】角色功能点关联_编辑',
|
|
81
|
+
AccountRoleManageRead: '【devops】账户角色关联_查看', // account-role
|
|
82
|
+
AccountRoleManageWrite: '【devops】账户角色关联_编辑',
|
|
84
83
|
|
|
85
|
-
MenuMangeRead
|
|
86
|
-
MenuMangeWrite
|
|
84
|
+
MenuMangeRead: '【devops】菜单管理_查看',
|
|
85
|
+
MenuMangeWrite: '【devops】菜单管理_查看',
|
|
87
86
|
};
|
|
88
87
|
|
|
89
88
|
/**
|
package/src/models/bizmodels.ts
CHANGED
|
@@ -90,7 +90,6 @@ export interface IVisitorExt extends IVisitor {
|
|
|
90
90
|
|
|
91
91
|
export const FILE_GET_TYPES = ['thumbnail', 'preview', 'download'];
|
|
92
92
|
|
|
93
|
-
|
|
94
93
|
/**
|
|
95
94
|
* fat-design中的TablePro组件的查询参数
|
|
96
95
|
*/
|
|
@@ -101,7 +100,6 @@ export interface ITableProQueryParams {
|
|
|
101
100
|
orderBy: string | any;
|
|
102
101
|
}
|
|
103
102
|
|
|
104
|
-
|
|
105
103
|
export enum StdCrudExportInputParamsAppType {
|
|
106
104
|
STD_CRUD = 'STD_CRUD',
|
|
107
105
|
INNER_HTTP = 'INNER_HTTP',
|
|
@@ -116,8 +114,8 @@ export interface IStdCrudExportInputParams {
|
|
|
116
114
|
innerHttpUrl?: string; // INNER_HTTP导出需要。
|
|
117
115
|
columns?: any[]; // INNER_HTTP导出需要。
|
|
118
116
|
lastQueryParams: ITableProQueryParams; // 公共
|
|
119
|
-
selectedRowKeys: string[] | number
|
|
117
|
+
selectedRowKeys: string[] | number[]; // 公共
|
|
120
118
|
headers: any; // 公共
|
|
121
119
|
primaryKey: any; // 公共
|
|
122
120
|
pageSize: number; // 公共
|
|
123
|
-
}
|
|
121
|
+
}
|
package/src/schedule/index.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import {SCHEDULE_QUEUE, runScheduleTaskOnce} from './runSchedule'
|
|
2
|
-
import {ANONYMOUS_CONTEXT} from './anonymousContext'
|
|
3
|
-
import {
|
|
4
|
-
INNER_SCHEDULE_INTERVAL
|
|
5
|
-
} from './scheduleNames'
|
|
1
|
+
import { SCHEDULE_QUEUE, runScheduleTaskOnce } from './runSchedule';
|
|
2
|
+
import { ANONYMOUS_CONTEXT } from './anonymousContext';
|
|
3
|
+
import { INNER_SCHEDULE_INTERVAL } from './scheduleNames';
|
|
6
4
|
|
|
7
|
-
export {
|
|
8
|
-
INNER_SCHEDULE_INTERVAL,
|
|
9
|
-
ANONYMOUS_CONTEXT,
|
|
10
|
-
SCHEDULE_QUEUE,
|
|
11
|
-
runScheduleTaskOnce
|
|
12
|
-
}
|
|
5
|
+
export { INNER_SCHEDULE_INTERVAL, ANONYMOUS_CONTEXT, SCHEDULE_QUEUE, runScheduleTaskOnce };
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import * as koa from '@midwayjs/koa';
|
|
2
|
-
import {IScheduleService} from '@/interface';
|
|
3
|
-
import {ANONYMOUS_CONTEXT} from
|
|
4
|
-
|
|
2
|
+
import { IScheduleService } from '@/interface';
|
|
3
|
+
import { ANONYMOUS_CONTEXT } from './anonymousContext';
|
|
5
4
|
|
|
6
5
|
// 上次执行时间
|
|
7
6
|
const lastExecuteTimeMap = {};
|
|
8
7
|
|
|
9
8
|
const DEFAULT_SCHEDULE_INTERVAL = 2 * 60 * 1000;
|
|
10
9
|
|
|
11
|
-
|
|
12
10
|
async function runScheduleTaskOnce(serviceName: string) {
|
|
13
11
|
return await ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx: koa.IMidwayKoaContext) => {
|
|
14
12
|
const serviceObject: IScheduleService = await ctx.requestContext.getAsync(serviceName);
|
|
@@ -20,7 +18,6 @@ async function runScheduleTaskOnce(serviceName: string) {
|
|
|
20
18
|
});
|
|
21
19
|
}
|
|
22
20
|
|
|
23
|
-
|
|
24
21
|
class ScheduleQueue {
|
|
25
22
|
private scheduleIntervalMap: Map<string, number> = new Map();
|
|
26
23
|
|
|
@@ -39,10 +36,9 @@ class ScheduleQueue {
|
|
|
39
36
|
const intervalTime1 = this.scheduleIntervalMap.get(serviceName);
|
|
40
37
|
const intervalTime = intervalTime1 || DEFAULT_SCHEDULE_INTERVAL; // 时间间隔
|
|
41
38
|
const lastExecuteTime = lastExecuteTimeMap[serviceName];
|
|
42
|
-
return
|
|
39
|
+
return Date.now() - lastExecuteTime >= intervalTime;
|
|
43
40
|
}
|
|
44
41
|
|
|
45
|
-
|
|
46
42
|
private async runScheduleTaskOnceCheckTime(serviceName: string) {
|
|
47
43
|
// 还没有到可以执行时间
|
|
48
44
|
if (!this.isAlreadyTimeToExecute(serviceName)) {
|
|
@@ -65,18 +61,14 @@ class ScheduleQueue {
|
|
|
65
61
|
}
|
|
66
62
|
}
|
|
67
63
|
|
|
68
|
-
|
|
69
64
|
public async startScheduleLoop() {
|
|
70
65
|
await this.runScheduleServiceList();
|
|
71
66
|
setInterval(() => {
|
|
72
67
|
this.runScheduleServiceList();
|
|
73
68
|
}, 1000); // 最少1秒执行一次
|
|
74
69
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
70
|
}
|
|
78
71
|
|
|
79
|
-
|
|
80
72
|
const SCHEDULE_QUEUE = new ScheduleQueue();
|
|
81
73
|
|
|
82
|
-
export {SCHEDULE_QUEUE, runScheduleTaskOnce};
|
|
74
|
+
export { SCHEDULE_QUEUE, runScheduleTaskOnce };
|
|
@@ -1,21 +1,15 @@
|
|
|
1
|
-
|
|
2
1
|
const INNER_SCHEDULE_INTERVAL = {
|
|
3
2
|
proxyApiLoadService: 2 * 60 * 1000, // 2分钟重新加载一次,
|
|
4
3
|
workbenchService: 60 * 1000, // 1分钟重新加载一次,
|
|
5
4
|
visitStatService: 10 * 60 * 1000, // 10分钟重新加载一次,
|
|
6
5
|
asyncTaskRunnerService: 1000, // 1s可以执行
|
|
7
|
-
}
|
|
6
|
+
};
|
|
8
7
|
|
|
9
8
|
const INNER_SCHEDULE_NAMES = {
|
|
10
9
|
proxyApiLoadService: 'proxyApiLoadService',
|
|
11
10
|
workbenchService: 'workbenchService',
|
|
12
|
-
visitStatService:
|
|
13
|
-
asyncTaskRunnerService:
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
visitStatService: 'visitStatService',
|
|
12
|
+
asyncTaskRunnerService: 'asyncTaskRunnerService',
|
|
13
|
+
};
|
|
17
14
|
|
|
18
|
-
export {
|
|
19
|
-
INNER_SCHEDULE_INTERVAL,
|
|
20
|
-
INNER_SCHEDULE_NAMES
|
|
21
|
-
}
|
|
15
|
+
export { INNER_SCHEDULE_INTERVAL, INNER_SCHEDULE_NAMES };
|
|
@@ -87,7 +87,7 @@ export class AuthService {
|
|
|
87
87
|
* @param consumerUserInfo
|
|
88
88
|
* @param loadRoleCodes
|
|
89
89
|
*/
|
|
90
|
-
public async createUserSessionForConsumer(consumerUserInfo: IConsumerUserInfo, loadRoleCodes?: boolean
|
|
90
|
+
public async createUserSessionForConsumer(consumerUserInfo: IConsumerUserInfo, loadRoleCodes?: boolean) {
|
|
91
91
|
const sessionId = createUniqueId();
|
|
92
92
|
|
|
93
93
|
const accountId = consumerUserInfo.accountId;
|
|
@@ -95,12 +95,11 @@ export class AuthService {
|
|
|
95
95
|
let roleCodes = [];
|
|
96
96
|
let functionCodes = [];
|
|
97
97
|
|
|
98
|
-
if(loadRoleCodes === true) {
|
|
98
|
+
if (loadRoleCodes === true) {
|
|
99
99
|
roleCodes = await this.queryUserRoleCodeList(accountId);
|
|
100
100
|
functionCodes = await this.queryFunctionCodeList(roleCodes);
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
|
|
104
103
|
const sessionInfo: ISessionInfo = {
|
|
105
104
|
nickName: consumerUserInfo.nickName,
|
|
106
105
|
avatar: consumerUserInfo.avatar,
|
|
@@ -57,13 +57,12 @@ export class UserSessionService {
|
|
|
57
57
|
@Config('fatcmsUserSessionKeepTimeSecond')
|
|
58
58
|
private fatcmsUserSessionKeepTimeSecond: number;
|
|
59
59
|
|
|
60
|
-
|
|
61
60
|
/**
|
|
62
61
|
* 获取用户会话保持时间: 单位秒
|
|
63
|
-
* @returns
|
|
62
|
+
* @returns
|
|
64
63
|
*/
|
|
65
64
|
private getSessionKeepTimeSecond(): number {
|
|
66
|
-
if(typeof this.fatcmsUserSessionKeepTimeSecond === 'number' && this.fatcmsUserSessionKeepTimeSecond > 0) {
|
|
65
|
+
if (typeof this.fatcmsUserSessionKeepTimeSecond === 'number' && this.fatcmsUserSessionKeepTimeSecond > 0) {
|
|
67
66
|
return this.fatcmsUserSessionKeepTimeSecond;
|
|
68
67
|
}
|
|
69
68
|
return SESSION_KEEP_TIME_SECOND;
|
|
@@ -72,7 +71,7 @@ export class UserSessionService {
|
|
|
72
71
|
/**
|
|
73
72
|
* 保存用户会话信息。
|
|
74
73
|
* 用户登录后,在业务的项目中,可以调用此函数,更新bizExt字段
|
|
75
|
-
* @param sessionInfo
|
|
74
|
+
* @param sessionInfo
|
|
76
75
|
*/
|
|
77
76
|
public async saveUserSession(sessionInfo: ISessionInfo) {
|
|
78
77
|
sessionInfo.avatar = pickUserAvatar(sessionInfo.avatar);
|
|
@@ -89,11 +88,10 @@ export class UserSessionService {
|
|
|
89
88
|
return await this.redisCacheService.removeItem(toCacheKey(sessionId));
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
|
|
93
91
|
/**
|
|
94
92
|
* 获取用户会话信息
|
|
95
|
-
* @param sessionId
|
|
96
|
-
* @returns
|
|
93
|
+
* @param sessionId
|
|
94
|
+
* @returns
|
|
97
95
|
*/
|
|
98
96
|
private async getCurrentUserSessionForMiddleware1(sessionId: string): Promise<ISessionInfo> {
|
|
99
97
|
if (!sessionId) {
|
|
@@ -102,10 +100,9 @@ export class UserSessionService {
|
|
|
102
100
|
return await this.redisCacheService.getJsonObject(toCacheKey(sessionId));
|
|
103
101
|
}
|
|
104
102
|
|
|
105
|
-
|
|
106
103
|
/**
|
|
107
104
|
* 从异步任务队列中获取当时用户的Session信息
|
|
108
|
-
* @param asyncTaskId
|
|
105
|
+
* @param asyncTaskId
|
|
109
106
|
*/
|
|
110
107
|
private async getCurrentUserSessionByAsyncTaskId(asyncTaskId: string): Promise<ISessionInfo> {
|
|
111
108
|
const taskSessionCacheKey = `${RedisKeys.USER_SESSION_ASYNC_TASK_ID_PREFIX}${asyncTaskId}`;
|
|
@@ -113,24 +110,27 @@ export class UserSessionService {
|
|
|
113
110
|
const loadSessionInfo = async (): Promise<ISessionInfo> => {
|
|
114
111
|
const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
|
|
115
112
|
|
|
116
|
-
const asyncTaskRes = await this.curdProService.executeCrudByCfg(
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
113
|
+
const asyncTaskRes = await this.curdProService.executeCrudByCfg(
|
|
114
|
+
{
|
|
115
|
+
columns: ['id', 'created_user_session'],
|
|
116
|
+
condition: {
|
|
117
|
+
id: asyncTaskId,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY_ONE,
|
|
122
|
+
sqlTable: SystemTables.sys_async_tasks,
|
|
123
|
+
sqlDatabase: SystemDbName,
|
|
124
|
+
sqlDbType: SystemDbType,
|
|
120
125
|
}
|
|
121
|
-
|
|
122
|
-
sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY_ONE,
|
|
123
|
-
sqlTable: SystemTables.sys_async_tasks,
|
|
124
|
-
sqlDatabase: SystemDbName,
|
|
125
|
-
sqlDbType: SystemDbType,
|
|
126
|
-
});
|
|
126
|
+
);
|
|
127
127
|
|
|
128
128
|
const asyncTaskObj = asyncTaskRes.getOneObj();
|
|
129
129
|
if (!asyncTaskObj) {
|
|
130
130
|
return null;
|
|
131
131
|
}
|
|
132
132
|
return parseJsonObject(asyncTaskObj.created_user_session);
|
|
133
|
-
}
|
|
133
|
+
};
|
|
134
134
|
|
|
135
135
|
let sessionInfo1 = await this.redisCacheService.getJsonObject(taskSessionCacheKey);
|
|
136
136
|
if (!sessionInfo1) {
|
|
@@ -140,12 +140,10 @@ export class UserSessionService {
|
|
|
140
140
|
return sessionInfo1;
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
|
|
144
143
|
/**
|
|
145
144
|
* 专门给中间件点调用的
|
|
146
145
|
*/
|
|
147
146
|
public async getCurrentUserSessionForMiddleware(): Promise<ISessionInfo> {
|
|
148
|
-
|
|
149
147
|
// 先从Header中获取:异步任务队列的任务ID
|
|
150
148
|
const asyncTaskId = this.ctx.headers[HEADER_KEY_RUN_BY_ASYNC_TASK_ID];
|
|
151
149
|
if (asyncTaskId && typeof asyncTaskId === 'string') {
|
|
@@ -156,6 +154,4 @@ export class UserSessionService {
|
|
|
156
154
|
const sessionId = cookies.get(SESSION_ID_KEY, sessionCookieCfg);
|
|
157
155
|
return this.getCurrentUserSessionForMiddleware1(sessionId);
|
|
158
156
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
157
|
}
|
|
@@ -152,7 +152,6 @@ export class AsyncTaskRunnerService extends BaseService implements IScheduleServ
|
|
|
152
152
|
@Inject()
|
|
153
153
|
private curdProService: CurdProService;
|
|
154
154
|
|
|
155
|
-
|
|
156
155
|
/**
|
|
157
156
|
* 定时任务执行
|
|
158
157
|
*/
|
|
@@ -161,7 +160,6 @@ export class AsyncTaskRunnerService extends BaseService implements IScheduleServ
|
|
|
161
160
|
await this.runByScheduleForTimeoutTasks();
|
|
162
161
|
}
|
|
163
162
|
|
|
164
|
-
|
|
165
163
|
/**
|
|
166
164
|
* 更新超时的任务状态
|
|
167
165
|
* @returns
|
|
@@ -175,19 +173,19 @@ export class AsyncTaskRunnerService extends BaseService implements IScheduleServ
|
|
|
175
173
|
return Promise.resolve();
|
|
176
174
|
}
|
|
177
175
|
|
|
178
|
-
const timeoutTime = moment().subtract(24, 'hours').format(
|
|
176
|
+
const timeoutTime = moment().subtract(24, 'hours').format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
179
177
|
await this.curdProService.executeCrudByCfg(
|
|
180
178
|
{
|
|
181
179
|
condition: {
|
|
182
180
|
task_status: SysAsyncTaskStatus.RUNNING, // 虽然状态是RUNNING,但是已经超过24小时没有进展了。
|
|
183
181
|
updated_at: {
|
|
184
182
|
$lt: timeoutTime,
|
|
185
|
-
}
|
|
183
|
+
},
|
|
186
184
|
},
|
|
187
185
|
data: {
|
|
188
186
|
task_status: SysAsyncTaskStatus.FAILED,
|
|
189
187
|
error_message: '任务超时',
|
|
190
|
-
}
|
|
188
|
+
},
|
|
191
189
|
},
|
|
192
190
|
{
|
|
193
191
|
sqlTable: SystemTables.sys_async_tasks,
|
|
@@ -198,14 +196,11 @@ export class AsyncTaskRunnerService extends BaseService implements IScheduleServ
|
|
|
198
196
|
);
|
|
199
197
|
}
|
|
200
198
|
|
|
201
|
-
|
|
202
|
-
|
|
203
199
|
/**
|
|
204
200
|
* 检查是否有新任务。如果有,就从数据库中获取一批任务,放到自己的任务队列里。
|
|
205
201
|
* @returns
|
|
206
202
|
*/
|
|
207
203
|
private async runByScheduleForPendingTasks() {
|
|
208
|
-
|
|
209
204
|
// 1. 当前很忙
|
|
210
205
|
if (ASYNC_TASK_RUNNER.isBusy) {
|
|
211
206
|
return Promise.resolve();
|
|
@@ -295,7 +290,6 @@ export class AsyncTaskRunnerService extends BaseService implements IScheduleServ
|
|
|
295
290
|
await ASYNC_TASK_RUNNER.executeTaskList(taskList).then(() => {
|
|
296
291
|
console.log('[AsyncTaskRunnerService] ASYNC_TASK_RUNNER finished taskIds ==> ' + JSON.stringify(taskIds));
|
|
297
292
|
});
|
|
298
|
-
|
|
299
293
|
}
|
|
300
294
|
|
|
301
295
|
/**
|
|
@@ -8,7 +8,6 @@ import { KeysOfSimpleSQL } from '@/libs/crud-pro/models/keys';
|
|
|
8
8
|
import { ExecuteContext } from '@/libs/crud-pro/models/ExecuteContext';
|
|
9
9
|
import { GLOBAL_STATIC_CONFIG } from '@/libs/global-config/global-config';
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
function pickData(a: any, key: string) {
|
|
13
12
|
if (a && typeof a.getResModel === 'function') {
|
|
14
13
|
const s = a.getResModel();
|
|
@@ -6,7 +6,6 @@ import * as koa from '@midwayjs/koa';
|
|
|
6
6
|
import { consoleLogger, ContextLogger, ILoggerContext } from '@/models/contextLogger';
|
|
7
7
|
import { isEnableDebug, isLocalEnv } from '@/libs/utils/fatcms-request';
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
@Provide()
|
|
11
10
|
export class BaseService {
|
|
12
11
|
@Inject()
|
|
@@ -21,11 +20,10 @@ export class BaseService {
|
|
|
21
20
|
@Inject()
|
|
22
21
|
protected ossServiceFactory: OSSServiceFactory;
|
|
23
22
|
|
|
24
|
-
|
|
25
23
|
/**
|
|
26
24
|
* 请求级别的内存缓存
|
|
27
|
-
* @param key
|
|
28
|
-
* @returns
|
|
25
|
+
* @param key
|
|
26
|
+
* @returns
|
|
29
27
|
*/
|
|
30
28
|
protected getFromCtxCache(key: string): any {
|
|
31
29
|
if (!this.ctx.ctxCacheMap) {
|
|
@@ -34,11 +32,10 @@ export class BaseService {
|
|
|
34
32
|
return this.ctx.ctxCacheMap[key];
|
|
35
33
|
}
|
|
36
34
|
|
|
37
|
-
|
|
38
35
|
/**
|
|
39
36
|
* 请求级别的内存缓存
|
|
40
|
-
* @param key
|
|
41
|
-
* @param obj
|
|
37
|
+
* @param key
|
|
38
|
+
* @param obj
|
|
42
39
|
*/
|
|
43
40
|
protected setToCtxCache(key: string, obj: any): void {
|
|
44
41
|
if (!this.ctx.ctxCacheMap) {
|
|
@@ -47,7 +44,6 @@ export class BaseService {
|
|
|
47
44
|
this.ctx.ctxCacheMap[key] = obj;
|
|
48
45
|
}
|
|
49
46
|
|
|
50
|
-
|
|
51
47
|
/**
|
|
52
48
|
* 用户自己上传的文件,使用私有的bucket。
|
|
53
49
|
* @protected
|
|
@@ -64,7 +60,6 @@ export class BaseService {
|
|
|
64
60
|
return this.ossServiceFactory.get<OSSService>('publicBucket');
|
|
65
61
|
}
|
|
66
62
|
|
|
67
|
-
|
|
68
63
|
protected getContextLogger(): ILoggerContext {
|
|
69
64
|
return this.ctx.contextLogger || consoleLogger;
|
|
70
65
|
}
|
|
@@ -3,8 +3,7 @@ import { Context } from '@midwayjs/koa';
|
|
|
3
3
|
import { RedisService } from '@midwayjs/redis';
|
|
4
4
|
import { OSSServiceFactory } from '@midwayjs/oss';
|
|
5
5
|
import * as koa from '@midwayjs/koa';
|
|
6
|
-
import {parseJsonObject} from
|
|
7
|
-
|
|
6
|
+
import { parseJsonObject } from '../../libs/utils/functions';
|
|
8
7
|
|
|
9
8
|
@Provide()
|
|
10
9
|
export class RedisCacheService {
|
|
@@ -20,26 +19,24 @@ export class RedisCacheService {
|
|
|
20
19
|
@Inject()
|
|
21
20
|
protected ossServiceFactory: OSSServiceFactory;
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
async getJsonObject(key: string): Promise<any> {
|
|
22
|
+
async getJsonObject(key: string): Promise<any> {
|
|
25
23
|
const str = await this.redisService.get(key);
|
|
26
|
-
return parseJsonObject(str)
|
|
24
|
+
return parseJsonObject(str);
|
|
27
25
|
}
|
|
28
26
|
|
|
29
27
|
/**
|
|
30
28
|
* 设置缓存对象
|
|
31
|
-
* @param key
|
|
32
|
-
* @param obj
|
|
29
|
+
* @param key
|
|
30
|
+
* @param obj
|
|
33
31
|
* @param expireSecond 过期时间,单位秒
|
|
34
|
-
* @returns
|
|
32
|
+
* @returns
|
|
35
33
|
*/
|
|
36
34
|
async setJsonObject(key: string, obj: any, expireSecond: number): Promise<any> {
|
|
37
35
|
const str = JSON.stringify(obj);
|
|
38
36
|
return this.redisService.set(key, str, 'EX', expireSecond);
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
async removeItem(key: string): Promise<any>
|
|
39
|
+
async removeItem(key: string): Promise<any> {
|
|
42
40
|
return await this.redisService.del(key);
|
|
43
41
|
}
|
|
44
|
-
|
|
45
42
|
}
|