midway-fatcms 0.0.1-beta.2 → 0.0.1-beta.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/.eslintrc.json +12 -0
  2. package/.prettierrc.js +4 -0
  3. package/README.md +7 -0
  4. package/dist/config/config.default.js +52 -15
  5. package/dist/configuration.d.ts +1 -0
  6. package/dist/configuration.js +33 -8
  7. package/dist/controller/base/BaseApiController.d.ts +1 -1
  8. package/dist/controller/base/BaseApiController.js +9 -6
  9. package/dist/controller/gateway/AsyncTaskController.d.ts +14 -0
  10. package/dist/controller/gateway/AsyncTaskController.js +108 -0
  11. package/dist/controller/gateway/CrudMtdGatewayController.d.ts +3 -3
  12. package/dist/controller/gateway/CrudMtdGatewayController.js +9 -6
  13. package/dist/controller/gateway/DocGatewayController.js +14 -9
  14. package/dist/controller/gateway/PublicApiController.js +4 -6
  15. package/dist/controller/gateway/StaticController.d.ts +2 -0
  16. package/dist/controller/gateway/StaticController.js +59 -40
  17. package/dist/controller/helpers.controller.d.ts +1 -1
  18. package/dist/controller/home.controller.js +2 -2
  19. package/dist/controller/manage/CrudStandardDesignApi.d.ts +1 -1
  20. package/dist/controller/manage/CrudStandardDesignApi.js +78 -75
  21. package/dist/controller/manage/DataDictManageApi.d.ts +1 -1
  22. package/dist/controller/manage/DeployManageApi.d.ts +1 -1
  23. package/dist/controller/manage/DeployManageApi.js +38 -34
  24. package/dist/controller/manage/MenuManageApi.js +1 -1
  25. package/dist/controller/manage/SuperAdminManageApi.d.ts +2 -2
  26. package/dist/controller/manage/SuperAdminManageApi.js +12 -8
  27. package/dist/controller/manage/SysConfigMangeApi.d.ts +1 -1
  28. package/dist/controller/manage/SysConfigMangeApi.js +6 -4
  29. package/dist/controller/manage/SystemInfoManageApi.d.ts +1 -1
  30. package/dist/controller/manage/SystemInfoManageApi.js +7 -1
  31. package/dist/controller/manage/UserAccountManageApi.d.ts +2 -2
  32. package/dist/controller/manage/UserAccountManageApi.js +5 -0
  33. package/dist/controller/manage/WorkbenchMangeApi.js +1 -1
  34. package/dist/controller/myinfo/AuthController.d.ts +0 -4
  35. package/dist/controller/myinfo/AuthController.js +1 -54
  36. package/dist/controller/render/AppRenderController.js +10 -4
  37. package/dist/controller/test.controller.d.ts +1 -1
  38. package/dist/controller/test.controller.js +5 -5
  39. package/dist/index.d.ts +34 -4
  40. package/dist/index.js +34 -4
  41. package/dist/libs/crud-pro/CrudPro.d.ts +1 -0
  42. package/dist/libs/crud-pro/CrudPro.js +5 -0
  43. package/dist/libs/crud-pro/defaultConfigs.js +2 -0
  44. package/dist/libs/crud-pro/interfaces.d.ts +7 -1
  45. package/dist/libs/crud-pro/models/ExecuteContext.d.ts +2 -1
  46. package/dist/libs/crud-pro/models/ExecuteContextFunc.d.ts +8 -1
  47. package/dist/libs/crud-pro/models/ExecuteContextFunc.js +8 -0
  48. package/dist/libs/crud-pro/models/RequestCfgModel.d.ts +1 -1
  49. package/dist/libs/crud-pro/models/ResModel.d.ts +16 -0
  50. package/dist/libs/crud-pro/models/ResModel.js +2 -0
  51. package/dist/libs/crud-pro/models/SqlCfgModel.d.ts +1 -1
  52. package/dist/libs/crud-pro/models/TransactionSqlServer.js +1 -1
  53. package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +1 -0
  54. package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +22 -11
  55. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +10 -9
  56. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.d.ts +1 -1
  57. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +10 -12
  58. package/dist/libs/crud-pro/services/CrudProGenSqlService.js +14 -23
  59. package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +7 -6
  60. package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +2 -6
  61. package/dist/libs/crud-pro/services/CrudProServiceBase.js +3 -2
  62. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +1 -0
  63. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +31 -7
  64. package/dist/libs/crud-pro/utils/DatabaseName.js +24 -3
  65. package/dist/libs/crud-pro/utils/MixinUtils.js +1 -1
  66. package/dist/libs/crud-pro/utils/ValidateUtils.js +1 -1
  67. package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.js +2 -2
  68. package/dist/libs/global-config/global-config.d.ts +45 -0
  69. package/dist/libs/global-config/global-config.js +33 -0
  70. package/dist/libs/utils/errorToString.d.ts +2 -0
  71. package/dist/libs/utils/errorToString.js +57 -0
  72. package/dist/libs/utils/fatcms-request.js +2 -2
  73. package/dist/middleware/forbidden.middleware.js +4 -20
  74. package/dist/middleware/global.middleware.js +8 -1
  75. package/dist/models/AsyncTaskModel.d.ts +69 -0
  76. package/dist/models/AsyncTaskModel.js +26 -0
  77. package/dist/models/RedisKeys.d.ts +8 -0
  78. package/dist/models/RedisKeys.js +11 -0
  79. package/dist/models/SystemTables.d.ts +1 -3
  80. package/dist/models/SystemTables.js +2 -4
  81. package/dist/schedule/anonymousContext.d.ts +13 -0
  82. package/dist/schedule/anonymousContext.js +59 -0
  83. package/dist/schedule/index.d.ts +4 -3
  84. package/dist/schedule/index.js +8 -67
  85. package/dist/schedule/runSchedule.d.ts +15 -0
  86. package/dist/schedule/runSchedule.js +68 -0
  87. package/dist/schedule/scheduleNames.d.ts +13 -0
  88. package/dist/schedule/scheduleNames.js +17 -0
  89. package/dist/service/AuthService.js +8 -5
  90. package/dist/service/EnumInfoService.js +7 -4
  91. package/dist/service/FileCenterService.js +13 -9
  92. package/dist/service/SysConfigService.js +4 -2
  93. package/dist/service/UserAccountService.js +10 -6
  94. package/dist/service/UserSessionService.js +2 -1
  95. package/dist/service/VisitStatService.d.ts +1 -1
  96. package/dist/service/VisitStatService.js +20 -27
  97. package/dist/service/WorkbenchService.js +4 -2
  98. package/dist/service/anyapi/AnyApiService.js +4 -2
  99. package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +37 -0
  100. package/dist/service/asyncTask/AsyncTaskRunnerService.js +226 -0
  101. package/dist/service/asyncTask/AsyncTaskService.d.ts +7 -0
  102. package/dist/service/asyncTask/AsyncTaskService.js +34 -0
  103. package/dist/service/crudstd/CrudStdService.d.ts +1 -0
  104. package/dist/service/crudstd/CrudStdService.js +34 -3
  105. package/dist/service/curd/CrudProQuick.d.ts +24 -0
  106. package/dist/service/curd/CrudProQuick.js +105 -0
  107. package/dist/service/curd/CurdMixByAccountService.js +12 -6
  108. package/dist/service/curd/CurdMixByDictService.js +4 -2
  109. package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +10 -1
  110. package/dist/service/curd/CurdMixByLinkToCustomService.js +72 -24
  111. package/dist/service/curd/CurdMixBySysConfigService.js +4 -2
  112. package/dist/service/curd/CurdMixByWorkbenchService.js +4 -2
  113. package/dist/service/curd/CurdMixService.d.ts +1 -1
  114. package/dist/service/curd/CurdMixService.js +2 -2
  115. package/dist/service/curd/CurdMixUtils.d.ts +7 -0
  116. package/dist/service/curd/CurdMixUtils.js +65 -28
  117. package/dist/service/curd/CurdProService.d.ts +2 -10
  118. package/dist/service/curd/CurdProService.js +31 -146
  119. package/dist/service/curd/fixCfgModel.d.ts +3 -0
  120. package/dist/service/curd/fixCfgModel.js +107 -0
  121. package/dist/service/proxyapi/ProxyApiLoadService.js +7 -4
  122. package/dist/views/404_app.html +31 -0
  123. package/dist/views/404_workbench.html +34 -0
  124. package/dist/views/static/favicon.ico +0 -0
  125. package/package.json +9 -2
  126. package/src/config/config.default.ts +58 -27
  127. package/src/configuration.ts +42 -9
  128. package/src/controller/base/BaseApiController.ts +19 -19
  129. package/src/controller/gateway/AnyApiGatewayController.ts +1 -1
  130. package/src/controller/gateway/AsyncTaskController.ts +83 -0
  131. package/src/controller/gateway/CrudMtdGatewayController.ts +17 -13
  132. package/src/controller/gateway/CrudStdGatewayController.ts +4 -4
  133. package/src/controller/gateway/DocGatewayController.ts +25 -17
  134. package/src/controller/gateway/FileController.ts +8 -9
  135. package/src/controller/gateway/ProxyApiGatewayController.ts +4 -4
  136. package/src/controller/gateway/PublicApiController.ts +19 -22
  137. package/src/controller/gateway/StaticController.ts +234 -242
  138. package/src/controller/helpers.controller.ts +1 -1
  139. package/src/controller/home.controller.ts +8 -15
  140. package/src/controller/manage/AnyApiMangeApi.ts +9 -9
  141. package/src/controller/manage/AppLogMangeApi.ts +3 -3
  142. package/src/controller/manage/AppMangeApi.ts +5 -5
  143. package/src/controller/manage/AppPageMangeApi.ts +3 -3
  144. package/src/controller/manage/AppSchemaHistoryApi.ts +1 -1
  145. package/src/controller/manage/CrudMethodsMangeApi.ts +3 -3
  146. package/src/controller/manage/CrudStandardDesignApi.ts +106 -113
  147. package/src/controller/manage/DataDictManageApi.ts +4 -4
  148. package/src/controller/manage/DeployManageApi.ts +85 -89
  149. package/src/controller/manage/DocLibManageApi.ts +3 -3
  150. package/src/controller/manage/DocManageApi.ts +8 -8
  151. package/src/controller/manage/MenuManageApi.ts +9 -14
  152. package/src/controller/manage/SuperAdminManageApi.ts +14 -13
  153. package/src/controller/manage/SysConfigMangeApi.ts +9 -9
  154. package/src/controller/manage/SystemInfoManageApi.ts +11 -6
  155. package/src/controller/manage/UserAccountManageApi.ts +8 -2
  156. package/src/controller/manage/WorkbenchMangeApi.ts +6 -6
  157. package/src/controller/myinfo/AuthController.ts +6 -72
  158. package/src/controller/render/AppRenderController.ts +24 -21
  159. package/src/controller/test.controller.ts +18 -18
  160. package/src/index.ts +38 -4
  161. package/src/libs/crud-pro/CrudPro.ts +7 -0
  162. package/src/libs/crud-pro/defaultConfigs.ts +2 -0
  163. package/src/libs/crud-pro/interfaces.ts +10 -3
  164. package/src/libs/crud-pro/models/ExecuteContext.ts +3 -3
  165. package/src/libs/crud-pro/models/ExecuteContextFunc.ts +11 -1
  166. package/src/libs/crud-pro/models/RequestCfgModel.ts +1 -1
  167. package/src/libs/crud-pro/models/RequestModel.ts +1 -1
  168. package/src/libs/crud-pro/models/ResModel.ts +19 -0
  169. package/src/libs/crud-pro/models/SqlCfgModel.ts +2 -2
  170. package/src/libs/crud-pro/models/Transaction.ts +8 -9
  171. package/src/libs/crud-pro/models/TransactionPostgres.ts +1 -1
  172. package/src/libs/crud-pro/models/TransactionSqlServer.ts +8 -13
  173. package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +26 -19
  174. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +38 -50
  175. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +26 -45
  176. package/src/libs/crud-pro/services/CrudProGenSqlService.ts +23 -40
  177. package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +25 -29
  178. package/src/libs/crud-pro/services/CrudProServiceBase.ts +5 -9
  179. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +35 -9
  180. package/src/libs/crud-pro/utils/DatabaseName.ts +35 -15
  181. package/src/libs/crud-pro/utils/DateTimeUtils.ts +2 -2
  182. package/src/libs/crud-pro/utils/MixinUtils.ts +1 -1
  183. package/src/libs/crud-pro/utils/ValidateUtils.ts +1 -3
  184. package/src/libs/crud-pro/utils/pool/MySQLUtils.ts +1 -1
  185. package/src/libs/crud-pro/utils/pool/PostgresUtils.ts +3 -3
  186. package/src/libs/crud-pro/utils/pool/SqlServerUtils.ts +3 -3
  187. package/src/libs/crud-pro/utils/sqlConvert/convertColumnName.ts +2 -2
  188. package/src/libs/global-config/global-config.ts +78 -0
  189. package/src/libs/utils/crypto-utils.ts +2 -4
  190. package/src/libs/utils/errorToString.ts +61 -0
  191. package/src/libs/utils/fatcms-request.ts +9 -21
  192. package/src/libs/utils/ordernum-utils.ts +2 -6
  193. package/src/libs/utils/parseConfig.ts +7 -15
  194. package/src/middleware/forbidden.middleware.ts +6 -25
  195. package/src/middleware/global.middleware.ts +18 -16
  196. package/src/models/AsyncTaskModel.ts +79 -0
  197. package/src/models/RedisKeys.ts +13 -0
  198. package/src/models/SystemTables.ts +1 -4
  199. package/src/models/bizmodels.ts +1 -2
  200. package/src/schedule/anonymousContext.ts +79 -0
  201. package/src/schedule/index.ts +11 -72
  202. package/src/schedule/runSchedule.ts +83 -0
  203. package/src/schedule/scheduleNames.ts +21 -0
  204. package/src/service/AuthService.ts +13 -8
  205. package/src/service/EnumInfoService.ts +8 -3
  206. package/src/service/FileCenterService.ts +12 -6
  207. package/src/service/SysConfigService.ts +10 -6
  208. package/src/service/UserAccountService.ts +14 -4
  209. package/src/service/UserSessionService.ts +5 -4
  210. package/src/service/VisitStatService.ts +57 -70
  211. package/src/service/WorkbenchService.ts +7 -2
  212. package/src/service/anyapi/AnyApiService.ts +11 -8
  213. package/src/service/asyncTask/AsyncTaskRunnerService.ts +249 -0
  214. package/src/service/asyncTask/AsyncTaskService.ts +21 -0
  215. package/src/service/base/BaseService.ts +2 -2
  216. package/src/service/crudstd/CrudStdService.ts +43 -5
  217. package/src/service/curd/CrudProQuick.ts +137 -0
  218. package/src/service/curd/CurdMixByAccountService.ts +14 -6
  219. package/src/service/curd/CurdMixByDictService.ts +8 -2
  220. package/src/service/curd/CurdMixByLinkToCustomService.ts +101 -50
  221. package/src/service/curd/CurdMixBySysConfigService.ts +7 -2
  222. package/src/service/curd/CurdMixByWorkbenchService.ts +6 -2
  223. package/src/service/curd/CurdMixService.ts +3 -3
  224. package/src/service/curd/CurdMixUtils.ts +82 -39
  225. package/src/service/curd/CurdProService.ts +45 -189
  226. package/src/service/curd/fixCfgModel.ts +139 -0
  227. package/src/service/proxyapi/ProxyApiLoadService.ts +12 -3
  228. package/src/views/404_app.html +31 -0
  229. package/src/views/404_workbench.html +34 -0
  230. package/src/views/static/favicon.ico +0 -0
  231. package/tsconfig.json +32 -0
  232. package/dist/controller/medstatistic/MedAdminController.d.ts +0 -35
  233. package/dist/controller/medstatistic/MedAdminController.js +0 -205
  234. package/dist/controller/medstatistic/MedClientController.d.ts +0 -28
  235. package/dist/controller/medstatistic/MedClientController.js +0 -188
  236. package/dist/controller/medstatistic/MedMessageService.d.ts +0 -19
  237. package/dist/controller/medstatistic/MedMessageService.js +0 -95
  238. package/dist/controller/medstatistic/MedScoreService.d.ts +0 -21
  239. package/dist/controller/medstatistic/MedScoreService.js +0 -107
  240. package/dist/controller/medstatistic/constants.d.ts +0 -32
  241. package/dist/controller/medstatistic/constants.js +0 -43
  242. package/src/controller/medstatistic/MedAdminController.ts +0 -221
  243. package/src/controller/medstatistic/MedClientController.ts +0 -188
  244. package/src/controller/medstatistic/MedMessageService.ts +0 -89
  245. package/src/controller/medstatistic/MedScoreService.ts +0 -108
  246. package/src/controller/medstatistic/constants.ts +0 -63
@@ -1,15 +1,15 @@
1
1
  import { Middleware, IMiddleware } from '@midwayjs/core';
2
2
  import { NextFunction, Context } from '@midwayjs/koa';
3
3
  import * as _ from 'lodash';
4
- import { Transaction } from '../libs/crud-pro/models/Transaction';
5
- import { UserSessionService } from '../service/UserSessionService';
6
- import { WorkbenchService } from '../service/WorkbenchService';
7
- import { ISessionInfo, UserSessionInfo } from '../models/userSession';
8
- import { ICommonResult, CommonResult } from '../libs/utils/common-dto';
9
- import {isEnableDebug, isEnableSuperAdmin} from '../libs/utils/fatcms-request';
10
- import { ContextLogger } from '../models/contextLogger';
4
+ import { Transaction } from '@/libs/crud-pro/models/Transaction';
5
+ import { UserSessionService } from '@/service/UserSessionService';
6
+ import { WorkbenchService } from '@/service/WorkbenchService';
7
+ import { ISessionInfo, UserSessionInfo } from '@/models/userSession';
8
+ import { ICommonResult, CommonResult } from '@/libs/utils/common-dto';
9
+ import { isEnableDebug, isEnableSuperAdmin } from '@/libs/utils/fatcms-request';
10
+ import { ContextLogger } from '@/models/contextLogger';
11
11
  import { Stream } from 'node:stream';
12
- import {VisitStatService} from "../service/VisitStatService";
12
+ import { VisitStatService } from '@/service/VisitStatService';
13
13
 
14
14
  function isFunction(fun: any): boolean {
15
15
  return typeof fun === 'function';
@@ -141,8 +141,6 @@ async function getVisitStatService(ctx: Context): Promise<VisitStatService> {
141
141
  return ctx.requestContext.getAsync(VisitStatService);
142
142
  }
143
143
 
144
-
145
-
146
144
  /**
147
145
  * 检查是否是超级管理员
148
146
  * @param ctx
@@ -199,7 +197,6 @@ function handleDebugError(e: any, ctx: Context): ICommonResult {
199
197
  return res;
200
198
  }
201
199
 
202
-
203
200
  async function trackRequest(ctx: Context) {
204
201
  try {
205
202
  const visitStatService = await getVisitStatService(ctx);
@@ -209,15 +206,22 @@ async function trackRequest(ctx: Context) {
209
206
  }
210
207
  }
211
208
 
209
+ const excludePathPrefix = ['/ns/static/', '/ns/api/helpers'];
210
+
212
211
  /**
213
212
  * 全局中间件
214
213
  */
215
214
  @Middleware()
216
215
  export class GlobalMiddleware implements IMiddleware<Context, NextFunction> {
217
-
218
216
  match(ctx: Context): boolean {
219
217
  const path: string = ctx.path;
220
- return !(path.startsWith('/ns/static/'));
218
+ for (let i = 0; i < excludePathPrefix.length; i++) {
219
+ const excludePathPrefix1 = excludePathPrefix[i];
220
+ if (path.startsWith(excludePathPrefix1)) {
221
+ return false;
222
+ }
223
+ }
224
+ return true;
221
225
  }
222
226
 
223
227
  resolve() {
@@ -226,7 +230,6 @@ export class GlobalMiddleware implements IMiddleware<Context, NextFunction> {
226
230
  ctx.transaction = new Transaction();
227
231
 
228
232
  try {
229
-
230
233
  // 支持的站点
231
234
  const workbenchService = await getWorkbenchService(ctx);
232
235
  const isSupportTheHost = await workbenchService.isSupportCurrentHostForForMiddleware();
@@ -242,7 +245,7 @@ export class GlobalMiddleware implements IMiddleware<Context, NextFunction> {
242
245
  ctx.workbenchInfo = await workbenchService.getCurrentHostWorkbenchInfo();
243
246
 
244
247
  // 数据埋点
245
- await trackRequest(ctx)
248
+ await trackRequest(ctx);
246
249
 
247
250
  const res0 = await next();
248
251
 
@@ -256,7 +259,6 @@ export class GlobalMiddleware implements IMiddleware<Context, NextFunction> {
256
259
  return res0;
257
260
  }
258
261
 
259
-
260
262
  // 其他:普通的JSON数据
261
263
  let res = handleExecuteSqlContext(res0);
262
264
  res = handleNullRes(res);
@@ -0,0 +1,79 @@
1
+ export interface SysAsyncTaskEntity {
2
+ id: number;
3
+ task_uuid: string;
4
+ task_name: string;
5
+ task_description: string | null;
6
+ task_type: string;
7
+ task_status: SysAsyncTaskStatus;
8
+ input_params: any;
9
+ output_result: any | null;
10
+
11
+ input_file_path: string | null;
12
+ input_file_format: SysAsyncFileFormat | null;
13
+ input_file_size: number | null;
14
+
15
+ output_file_path: string | null;
16
+ output_file_format: SysAsyncFileFormat | null;
17
+ output_file_size: number | null;
18
+
19
+ input_total_records: number | null;
20
+ output_total_records: number | null;
21
+ processed_records: number;
22
+ progress: number;
23
+ error_message: string | null;
24
+ error_records: any | null;
25
+ created_by: string | null;
26
+ priority: number;
27
+ retry_count: number;
28
+ max_retries: number;
29
+
30
+ parent_task_id: number | null;
31
+ created_at: Date;
32
+ started_at: Date | null;
33
+ updated_at: Date;
34
+ expired_at: Date | null;
35
+ completed_at: Date | null;
36
+ created_user_session: string;
37
+ }
38
+
39
+ export type SysAsyncTaskPartial = Partial<SysAsyncTaskEntity>;
40
+
41
+ export enum SysAsyncTaskStatus {
42
+ PENDING = 'PENDING', // 等待中,还未进入排队
43
+ RUNNING = 'RUNNING', // 运行中
44
+ SUCCEEDED = 'SUCCEEDED', // 终止状态:全部成功
45
+ PART_SUCCEEDED = 'PART_SUCCEEDED',// 终止状态:部分成功
46
+ FAILED = 'FAILED', // 终止状态:失败
47
+ CANCELLED = 'CANCELLED', // 取消
48
+ PAUSED = 'PAUSED', // 暂停
49
+ }
50
+
51
+ export enum SysAsyncFileFormat {
52
+ XLSX = 'xlsx',
53
+ CSV = 'csv',
54
+ JSON = 'json',
55
+ PDF = 'pdf',
56
+ TXT = 'txt',
57
+ XML = 'xml',
58
+ ZIP = 'zip',
59
+ HTML = 'html',
60
+ PNG = 'png',
61
+ JPG = 'jpg',
62
+ }
63
+
64
+ export interface ISysAsyncTaskHandler {
65
+ execute(asyncTaskContext: SysAsyncTaskContext): Promise<void>;
66
+ }
67
+
68
+ export interface SysAsyncTaskContext {
69
+ task: SysAsyncTaskEntity;
70
+ updateTaskStatus: (sysAsyncTaskPartial: SysAsyncTaskPartial) => any;
71
+ }
72
+
73
+ export interface SysAsyncTaskHandlerConfig {
74
+ taskType: string;
75
+ handler: ISysAsyncTaskHandler;
76
+ maxRetries?: number;
77
+ priority?: number;
78
+ expireSeconds?: number;
79
+ }
@@ -0,0 +1,13 @@
1
+
2
+
3
+ const RedisKeys = {
4
+ ASYNC_TASK_LOCK : "FatAsyncTaskLock",
5
+ ASYNC_TASK_UPDATE_TIME : "FatAsyncTaskUpdateTime",
6
+ USER_SESSION_PREFIX : "FatUserSession_",
7
+ VISIT_STAT_LOCK_PREFIX : "FatVsLock_",
8
+ VISIT_STAT_DATE_PREFIX : "FatVsDate_",
9
+ }
10
+
11
+ export {
12
+ RedisKeys
13
+ }
@@ -1,5 +1,3 @@
1
- import {SqlDbType} from "../libs/crud-pro/models/keys";
2
-
3
1
  export const SystemTables = {
4
2
  sys_workbench: 'sys_workbench',
5
3
  sys_user_account: 'sys_user_account',
@@ -22,9 +20,8 @@ export const SystemTables = {
22
20
  sys_anyapi: 'sys_anyapi',
23
21
  sys_proxyapi: 'sys_proxyapi',
24
22
  sys_visit_stats: 'sys_visit_stats',
23
+ sys_async_tasks: 'sys_async_tasks',
25
24
  };
26
25
 
27
- export const SystemDbName = 'fatcms';
28
- export const SystemDbType = SqlDbType.mysql;
29
26
 
30
27
  export const SystemDevOpsWorkbench = 'devops';
@@ -85,5 +85,4 @@ export interface IVisitorExt extends IVisitor {
85
85
  accountType: string;
86
86
  }
87
87
 
88
-
89
- export const FILE_GET_TYPES = ['thumbnail','preview', 'download'];
88
+ export const FILE_GET_TYPES = ['thumbnail', 'preview', 'download'];
@@ -0,0 +1,79 @@
1
+ import * as koa from '@midwayjs/koa';
2
+ import {ContextLogger} from "@/models/contextLogger";
3
+ import {Transaction} from "@/libs/crud-pro/models/Transaction";
4
+ import {ISessionInfo, SYS_ACCOUNT_TYPE, UserSessionInfo} from "@/models/userSession";
5
+ import {IWorkbenchEntity} from "@/models/SystemEntities";
6
+
7
+
8
+ const anonymousUserInfo:ISessionInfo = {
9
+ nickName: 'anonymous_user',
10
+ avatar: '',
11
+ roleCodes: [],
12
+ functionCodes: [],
13
+ loginName: 'anonymous_user',
14
+ sessionId: '',
15
+ accountId: '',
16
+ workbenchCode: '',
17
+ accountType: SYS_ACCOUNT_TYPE,
18
+ };
19
+
20
+ const anonymousWorkbenchInfo: IWorkbenchEntity = {
21
+ id: 0,
22
+ workbench_code: 'anonymous_workbench',
23
+ workbench_name: 'anonymous_workbench',
24
+ workbench_domain: 'anonymous_workbench',
25
+ workbench_desc: 'anonymous_workbench',
26
+ html_content: 'anonymous_workbench',
27
+ status: 1,
28
+ workbench_type: 0,
29
+ };
30
+
31
+
32
+ export type RunServiceAtAnonymousContextRunner = (ctx: koa.IMidwayKoaContext)=>any;
33
+
34
+
35
+ class AnonymousContext {
36
+ private app: koa.Application;
37
+
38
+ setApp(app: koa.Application){
39
+ this.app = app;
40
+ }
41
+
42
+ getApp(){
43
+ return this.app;
44
+ }
45
+
46
+
47
+ async runServiceAtAnonymousContext( runner: RunServiceAtAnonymousContextRunner) {
48
+ const app = this.app;
49
+ const ctx: koa.IMidwayKoaContext = app.createAnonymousContext();
50
+
51
+ ctx.app = app;
52
+ ctx.contextLogger = new ContextLogger(ctx as any);
53
+ ctx.transaction = new Transaction();
54
+ ctx.userSession = new UserSessionInfo(anonymousUserInfo, true);
55
+ ctx.workbenchInfo = anonymousWorkbenchInfo;
56
+
57
+ let result: any = null;
58
+ let error: any = null;
59
+ try {
60
+ result = await runner(ctx);
61
+ } catch (e) {
62
+ error = e;
63
+ ctx.logger.error(`runServiceAtAnonymousContext error `, e);
64
+ } finally {
65
+ await ctx.transaction.releaseTx();
66
+ }
67
+ return {result: result, error: error};
68
+ }
69
+
70
+ }
71
+
72
+
73
+ const ANONYMOUS_CONTEXT = new AnonymousContext()
74
+
75
+
76
+
77
+ export {
78
+ ANONYMOUS_CONTEXT
79
+ }
@@ -1,73 +1,12 @@
1
- import * as koa from '@midwayjs/koa';
2
- import { IScheduleService } from '../interface';
3
- import { ContextLogger } from '../models/contextLogger';
4
- import { Transaction } from '../libs/crud-pro/models/Transaction';
5
- import {ISessionInfo, SYS_ACCOUNT_TYPE, UserSessionInfo} from '../models/userSession';
6
- import { IWorkbenchEntity } from '../models/SystemEntities';
7
-
8
- const scheduleUserInfo:ISessionInfo = {
9
- nickName: 'schedule_user',
10
- avatar: '',
11
- roleCodes: [],
12
- functionCodes: [],
13
- loginName: 'schedule_user',
14
- sessionId: '',
15
- accountId: '',
16
- workbenchCode: '',
17
- accountType: SYS_ACCOUNT_TYPE,
18
- };
19
-
20
- const scheduleWorkbenchInfo: IWorkbenchEntity = {
21
- id: 0,
22
- workbench_code: 'schedule_workbench',
23
- workbench_name: 'schedule_workbench',
24
- workbench_domain: 'schedule_workbench',
25
- workbench_desc: 'schedule_workbench',
26
- html_content: 'schedule_workbench',
27
- status: 1,
28
- workbench_type: 0,
29
- };
30
-
31
- async function runScheduleService(app: koa.Application, serviceName: string) {
32
- const ctx = app.createAnonymousContext();
33
-
34
- ctx.app = app;
35
- ctx.contextLogger = new ContextLogger(ctx as any);
36
- ctx.transaction = new Transaction();
37
- ctx.userSession = new UserSessionInfo(scheduleUserInfo, true);
38
- ctx.workbenchInfo = scheduleWorkbenchInfo;
39
-
40
- try {
41
- const serviceObject: IScheduleService = await ctx.requestContext.getAsync(serviceName);
42
- if (serviceObject && serviceObject.runBySchedule) {
43
- await serviceObject.runBySchedule();
44
- } else {
45
- ctx.logger.error(`runSchedule error , serviceName = ${serviceName}, 没有找到服务`);
46
- }
47
- } catch (e) {
48
- ctx.logger.error(`runSchedule error , serviceName = ${serviceName}`, e);
49
- } finally {
50
- await ctx.transaction.releaseTx();
51
- }
1
+ import {SCHEDULE_QUEUE, runScheduleTaskOnce} from './runSchedule'
2
+ import {ANONYMOUS_CONTEXT} from './anonymousContext'
3
+ import {
4
+ INNER_SCHEDULE_INTERVAL
5
+ } from './scheduleNames'
6
+
7
+ export {
8
+ INNER_SCHEDULE_INTERVAL,
9
+ ANONYMOUS_CONTEXT,
10
+ SCHEDULE_QUEUE,
11
+ runScheduleTaskOnce
52
12
  }
53
-
54
- async function runSchedule(app: koa.Application, serviceList: string[]) {
55
- for (let i = 0; i < serviceList.length; i++) {
56
- const serviceName = serviceList[i];
57
- try {
58
- await runScheduleService(app, serviceName);
59
- } catch (e) {
60
- const ctx = app.createAnonymousContext();
61
- ctx.logger.error(`runSchedule error , serviceName = ${serviceName}`, e);
62
- }
63
- }
64
- }
65
-
66
- async function startSchedule(app: koa.Application, serviceList: string[]) {
67
- await runSchedule(app, serviceList);
68
- setInterval(() => {
69
- runSchedule(app, serviceList);
70
- }, 2 * 60 * 1000);
71
- }
72
-
73
- export { startSchedule };
@@ -0,0 +1,83 @@
1
+ import * as koa from '@midwayjs/koa';
2
+ import {IScheduleService} from '@/interface';
3
+ import {ANONYMOUS_CONTEXT} from "./anonymousContext";
4
+
5
+
6
+ // 上次执行时间
7
+ const lastExecuteTimeMap = {};
8
+
9
+ const DEFAULT_SCHEDULE_INTERVAL = 2 * 60 * 1000;
10
+
11
+
12
+ async function runScheduleTaskOnce(serviceName: string) {
13
+
14
+ return await ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx: koa.IMidwayKoaContext) => {
15
+ const serviceObject: IScheduleService = await ctx.requestContext.getAsync(serviceName);
16
+ if (serviceObject && serviceObject.runBySchedule) {
17
+ await serviceObject.runBySchedule();
18
+ } else {
19
+ ctx.logger.error(`runSchedule error , serviceName = ${serviceName}, 没有找到服务`);
20
+ }
21
+ });
22
+ }
23
+
24
+
25
+ class ScheduleQueue {
26
+ private scheduleIntervalMap: Map<string, number> = new Map();
27
+
28
+ public setScheduleTask(serviceName: string, intervalTime: number) {
29
+ this.scheduleIntervalMap.set(serviceName, intervalTime);
30
+ }
31
+
32
+ public removeScheduleTask(serviceName: string) {
33
+ this.scheduleIntervalMap.delete(serviceName);
34
+ }
35
+
36
+ private isAlreadyTimeToExecute(serviceName: string): boolean {
37
+ if (!lastExecuteTimeMap[serviceName]) {
38
+ return true; // 可以执行
39
+ }
40
+ const intervalTime1 = this.scheduleIntervalMap.get(serviceName);
41
+ const intervalTime = intervalTime1 || DEFAULT_SCHEDULE_INTERVAL; // 时间间隔
42
+ const lastExecuteTime = lastExecuteTimeMap[serviceName];
43
+ return (Date.now() - lastExecuteTime) >= intervalTime;
44
+ }
45
+
46
+
47
+ private async runScheduleTaskOnceCheckTime(serviceName: string) {
48
+ // 还没有到可以执行时间
49
+ if (!this.isAlreadyTimeToExecute(serviceName)) {
50
+ return;
51
+ }
52
+ lastExecuteTimeMap[serviceName] = Date.now();
53
+ await runScheduleTaskOnce(serviceName);
54
+ }
55
+
56
+ private async runScheduleServiceList() {
57
+ const serviceListKeys = this.scheduleIntervalMap.keys();
58
+ const serviceList = [...serviceListKeys];
59
+ for (let i = 0; i < serviceList.length; i++) {
60
+ const serviceName = serviceList[i];
61
+ try {
62
+ await this.runScheduleTaskOnceCheckTime(serviceName);
63
+ } catch (e) {
64
+ ANONYMOUS_CONTEXT.getApp().getCoreLogger().error(`runSchedule error , serviceName = ${serviceName}`, e);
65
+ }
66
+ }
67
+ }
68
+
69
+
70
+ public async startScheduleLoop() {
71
+ await this.runScheduleServiceList();
72
+ setInterval(() => {
73
+ this.runScheduleServiceList();
74
+ }, 1000); // 最少1秒执行一次
75
+ }
76
+
77
+
78
+ }
79
+
80
+
81
+ const SCHEDULE_QUEUE = new ScheduleQueue();
82
+
83
+ export {SCHEDULE_QUEUE, runScheduleTaskOnce};
@@ -0,0 +1,21 @@
1
+
2
+ const INNER_SCHEDULE_INTERVAL = {
3
+ proxyApiLoadService: 2 * 60 * 1000, // 2分钟重新加载一次,
4
+ workbenchService: 60 * 1000, // 1分钟重新加载一次,
5
+ visitStatService: 10 * 60 * 1000, // 10分钟重新加载一次,
6
+ asyncTaskRunnerService: 1000, // 1s可以执行
7
+ }
8
+
9
+ const INNER_SCHEDULE_NAMES = {
10
+ proxyApiLoadService: 'proxyApiLoadService',
11
+ workbenchService: 'workbenchService',
12
+ visitStatService: "visitStatService",
13
+ asyncTaskRunnerService: "asyncTaskRunnerService",
14
+ }
15
+
16
+
17
+
18
+ export {
19
+ INNER_SCHEDULE_INTERVAL,
20
+ INNER_SCHEDULE_NAMES
21
+ }
@@ -5,12 +5,13 @@ import { CurdMixService } from './curd/CurdMixService';
5
5
  import * as md5 from 'md5';
6
6
  import { UserAccountService } from './UserAccountService';
7
7
  import { createUniqueId } from '../libs/utils/functions';
8
- import {IConsumerUserInfo, ISessionInfo, SYS_ACCOUNT_TYPE} from '../models/userSession';
9
- import {SystemDbName, SystemDbType, SystemTables} from '../models/SystemTables';
8
+ import { IConsumerUserInfo, ISessionInfo, SYS_ACCOUNT_TYPE } from '../models/userSession';
9
+ import { SystemTables } from '../models/SystemTables';
10
10
  import { UserSessionService } from './UserSessionService';
11
11
  import { CommonResult } from '../libs/utils/common-dto';
12
12
  import { isEnableSuperAdmin } from "../libs/utils/fatcms-request";
13
- import {CommonException} from "../libs/crud-pro/exceptions";
13
+ import { CommonException } from "../libs/crud-pro/exceptions";
14
+ import { GLOBAL_STATIC_CONFIG } from '@/libs/global-config/global-config';
14
15
 
15
16
  @Provide()
16
17
  export class AuthService {
@@ -94,7 +95,7 @@ export class AuthService {
94
95
  nickName: consumerUserInfo.nickName,
95
96
  avatar: consumerUserInfo.avatar,
96
97
  roleCodes: [],
97
- functionCodes:[],
98
+ functionCodes: [],
98
99
  loginName: consumerUserInfo.loginName,
99
100
  sessionId,
100
101
  accountId: consumerUserInfo.accountId,
@@ -141,7 +142,7 @@ export class AuthService {
141
142
  sessionId,
142
143
  accountId,
143
144
  workbenchCode,
144
- accountType: SYS_ACCOUNT_TYPE
145
+ accountType: SYS_ACCOUNT_TYPE,
145
146
  };
146
147
 
147
148
  await this.userSessionService.saveUserSession(sessionInfo);
@@ -203,6 +204,8 @@ export class AuthService {
203
204
  * @private
204
205
  */
205
206
  private async queryUserRoleCodeList(accountId: string): Promise<string[]> {
207
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
208
+
206
209
  const res = await this.curdMixService.executeCrudByCfg(
207
210
  {
208
211
  condition: { account_id: accountId },
@@ -212,7 +215,7 @@ export class AuthService {
212
215
  sqlTable: SystemTables.sys_perm_user_role,
213
216
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY,
214
217
  sqlDatabase: SystemDbName,
215
- sqlDdType: SystemDbType,
218
+ sqlDbType: SystemDbType,
216
219
  }
217
220
  );
218
221
  const rows = res.getResModel().rows || [];
@@ -232,6 +235,8 @@ export class AuthService {
232
235
  return [];
233
236
  }
234
237
 
238
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
239
+
235
240
  const res = await this.curdMixService.executeCrudByCfg(
236
241
  {
237
242
  condition: { role_code: { $in: roleCodeList } },
@@ -241,7 +246,7 @@ export class AuthService {
241
246
  sqlTable: SystemTables.sys_perm_role_func,
242
247
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY,
243
248
  sqlDatabase: SystemDbName,
244
- sqlDdType: SystemDbType,
249
+ sqlDbType: SystemDbType,
245
250
  }
246
251
  );
247
252
  const rows = res.getResModel().rows || [];
@@ -259,7 +264,7 @@ export class AuthService {
259
264
  const oldSessionId = sessionInfo.sessionId;
260
265
 
261
266
  const sessionId = createUniqueId();
262
- const newSessionInfo: ISessionInfo = {...sessionInfo, sessionId};
267
+ const newSessionInfo: ISessionInfo = { ...sessionInfo, sessionId };
263
268
 
264
269
  await this.userSessionService.saveUserSession(newSessionInfo);
265
270
 
@@ -3,10 +3,11 @@ import {Context} from '@midwayjs/koa';
3
3
  import {KeysOfSimpleSQL} from '../libs/crud-pro/models/keys';
4
4
  import {CurdProService} from './curd/CurdProService';
5
5
  import {RelatedType} from './curd/CurdMixUtils';
6
- import {SystemDbName, SystemDbType, SystemTables} from '../models/SystemTables';
6
+ import {SystemTables} from '../models/SystemTables';
7
7
  import {parseConfigContentToEnumInfo, IEnumInfo} from '../libs/utils/parseConfig';
8
8
  import {RedisCacheService} from "./base/RedisCacheService";
9
9
  import {CurdMixByLinkToCustomService} from "./curd/CurdMixByLinkToCustomService";
10
+ import { GLOBAL_STATIC_CONFIG } from '@/libs/global-config/global-config';
10
11
 
11
12
 
12
13
  interface IQueryEnumInfo {
@@ -88,6 +89,8 @@ export class EnumInfoService {
88
89
  }
89
90
 
90
91
  private async queryEnumInfoBySysCfgEnum(code: string): Promise<IEnumInfo[]> {
92
+ const {SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
93
+
91
94
  const res1 = await this.curdProService.executeCrudByCfg(
92
95
  {
93
96
  condition: { config_code: code },
@@ -96,7 +99,7 @@ export class EnumInfoService {
96
99
  sqlTable: SystemTables.sys_configs,
97
100
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY_ONE,
98
101
  sqlDatabase: SystemDbName,
99
- sqlDdType: SystemDbType,
102
+ sqlDbType: SystemDbType,
100
103
  }
101
104
  );
102
105
  const obj = res1.getOneObj();
@@ -109,6 +112,8 @@ export class EnumInfoService {
109
112
  }
110
113
 
111
114
  private async queryEnumInfoItemByDict(code: string): Promise<IEnumInfo[]> {
115
+ const {SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
116
+
112
117
  const res1 = await this.curdProService.executeCrudByCfg(
113
118
  {
114
119
  condition: { dict_code: code },
@@ -117,7 +122,7 @@ export class EnumInfoService {
117
122
  sqlTable: SystemTables.sys_data_dict_item,
118
123
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY,
119
124
  sqlDatabase: SystemDbName,
120
- sqlDdType: SystemDbType,
125
+ sqlDbType: SystemDbType,
121
126
  }
122
127
  );
123
128
  const obj = res1.getResRows();
@@ -10,7 +10,7 @@ import { KeysOfSimpleSQL, KeysOfValidators } from '../libs/crud-pro/models/keys'
10
10
  import { AccessType, IEntityCommonInfo, UploadCategoryType } from '../models/bizmodels';
11
11
  import { IRequestCfgModel } from '../libs/crud-pro/interfaces';
12
12
  import { BaseService } from './base/BaseService';
13
- import {SystemDbName, SystemDbType} from '../models/SystemTables';
13
+ import { GLOBAL_STATIC_CONFIG } from '@/libs/global-config/global-config';
14
14
 
15
15
  function getSuffix(s: string): string {
16
16
  if (s) {
@@ -107,12 +107,14 @@ class FileDB {
107
107
  }
108
108
 
109
109
  async getFileInfo(fileKey: string): Promise<IFileInfo> {
110
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
111
+
110
112
  const condition: any = { file_key: fileKey };
111
113
  const cfgModel: IRequestCfgModel = {
112
114
  sqlTable: 'sys_file',
113
115
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY_ONE,
114
116
  sqlDatabase: SystemDbName,
115
- sqlDdType: SystemDbType,
117
+ sqlDbType: SystemDbType,
116
118
  validateCfg: {
117
119
  'condition.file_key': [KeysOfValidators.REQUIRED, KeysOfValidators.STRING],
118
120
  },
@@ -123,11 +125,13 @@ class FileDB {
123
125
  }
124
126
 
125
127
  async saveFileInfo(fileInfo: IFileInfo) {
128
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
129
+
126
130
  const cfgModel = {
127
131
  sqlTable: 'sys_file',
128
132
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_INSERT,
129
133
  sqlDatabase: SystemDbName,
130
- sqlDdType: SystemDbType,
134
+ sqlDbType: SystemDbType,
131
135
  };
132
136
  return await this.curdMixService.executeCrudByCfg(
133
137
  {
@@ -141,21 +145,23 @@ class FileDB {
141
145
  }
142
146
 
143
147
  async saveAssetsLog(fileInfo: IFileInfo) {
148
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
144
149
  const cfgModel = {
145
150
  sqlTable: 'sys_assets_log',
146
151
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_INSERT,
147
152
  sqlDatabase: SystemDbName,
148
- sqlDdType: SystemDbType,
153
+ sqlDbType: SystemDbType,
149
154
  };
150
155
  return await this.curdMixService.executeCrudByCfg({ data: fileInfo }, cfgModel);
151
156
  }
152
157
 
153
158
  async deleteFileInfo(id: number) {
159
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
154
160
  const cfgModel: IRequestCfgModel = {
155
161
  sqlTable: 'sys_file',
156
162
  sqlSimpleName: KeysOfSimpleSQL.SIMPLE_DELETE,
157
163
  sqlDatabase: SystemDbName,
158
- sqlDdType: SystemDbType,
164
+ sqlDbType: SystemDbType,
159
165
  validateCfg: {
160
166
  'condition.id': [KeysOfValidators.REQUIRED, KeysOfValidators.NUMBER],
161
167
  },
@@ -200,7 +206,7 @@ function toUploadOriginByReferer(referer: string): string {
200
206
  return 'doc-editor';
201
207
  }
202
208
  if (pathname.startsWith('/pages/devops/file-manage')) {
203
- return 'file-manage';
209
+ return 'file-manage';
204
210
  }
205
211
  } catch (error) {
206
212
  console.error('toUploadOriginByReferer', error);