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,6 +1,8 @@
1
1
  import { CrudProServiceBase } from './CrudProServiceBase';
2
2
  import { SqlCfgModel } from '../models/SqlCfgModel';
3
- import { ITableMeta } from '../interfaces';
3
+ import { IExecuteUnsafeQueryCtx, ITableMeta } from '../interfaces';
4
+ import { SqlDbType } from '../models/keys';
5
+ import { pickAndConvertPgRows } from '../utils/sqlConvert/convertPgType';
4
6
 
5
7
  class CrudProTableMetaCache {
6
8
  private cacheMap: Record<string, ITableMeta> = {};
@@ -42,18 +44,42 @@ class CrudProTableMetaService extends CrudProServiceBase {
42
44
  tableColumns: [],
43
45
  };
44
46
 
45
- const baseInfo = {
46
- tableName: sqlCfgModel.sqlTable,
47
- dbName: sqlCfgModel.sqlDatabase,
47
+ const baseInfo: IExecuteUnsafeQueryCtx = {
48
+ sqlTable: sqlCfgModel.sqlTable,
49
+ sqlDatabase: sqlCfgModel.sqlDatabase,
50
+ sqlDbType: sqlCfgModel.sqlDbType,
48
51
  };
49
52
 
50
- const [tableDescribe] = await this.executeUnsafeQuery(baseInfo, 'describe ' + sqlCfgModel.sqlTable);
51
- const tableDescribe2 = JSON.parse(JSON.stringify(tableDescribe));
52
- obj.tableColumns = tableDescribe2.map(fieldObj => {
53
- return fieldObj['Field'];
54
- });
53
+ obj.tableColumns = await this.loadTableColumnInfo(baseInfo);
54
+
55
55
  return obj;
56
56
  }
57
+
58
+ private async loadTableColumnInfo(baseInfo: IExecuteUnsafeQueryCtx): Promise<string[]> {
59
+ if (baseInfo.sqlDbType === SqlDbType.mysql) {
60
+ const [tableDescribe] = await this.executeUnsafeQuery(baseInfo, 'describe ' + baseInfo.sqlTable);
61
+ const tableDescribe2 = JSON.parse(JSON.stringify(tableDescribe));
62
+ return tableDescribe2.map(fieldObj => {
63
+ return fieldObj['Field'];
64
+ });
65
+ } else if (baseInfo.sqlDbType === SqlDbType.postgres) {
66
+ const schemaname = 'public';
67
+ const columnArraySql = `
68
+ SELECT
69
+ *
70
+ FROM information_schema.columns
71
+ WHERE table_schema = '${schemaname}' and table_name = '${baseInfo.sqlTable}'
72
+ ORDER BY ordinal_position;
73
+ `.trim();
74
+ const queryRes = await this.executeUnsafeQuery(baseInfo, columnArraySql);
75
+ const rows = pickAndConvertPgRows(queryRes);
76
+ return rows.map(fieldObj => {
77
+ return fieldObj['column_name'];
78
+ });
79
+ }
80
+
81
+ throw new Error('暂不支持的数据库类型:' + baseInfo.sqlDbType);
82
+ }
57
83
  }
58
84
 
59
85
  export { CrudProTableMetaService };
@@ -1,19 +1,45 @@
1
- import { SqlDbType } from '../models/keys'
1
+ import { SqlDbType } from '../models/keys';
2
2
 
3
3
  interface IDbTypeAndName {
4
- dbType: SqlDbType,
4
+ dbType: SqlDbType;
5
5
  dbName: string;
6
6
  }
7
7
 
8
- const SPLIT_CONST = "_________"
8
+ const SPLIT_CONST = '_________';
9
+
10
+ const PREFIX_MYSQL = `${SqlDbType.mysql}${SPLIT_CONST}`;
11
+ const PREFIX_POSTGRES = `${SqlDbType.postgres}${SPLIT_CONST}`;
12
+ const PREFIX_SQLSERVER = `${SqlDbType.sqlserver}${SPLIT_CONST}`;
9
13
 
10
14
  function parseDatabaseName(databaseName: string): IDbTypeAndName {
11
15
  const dbNameArr = databaseName.split(SPLIT_CONST);
16
+
17
+ if (databaseName.startsWith(PREFIX_MYSQL)) {
18
+ return {
19
+ dbType: SqlDbType.mysql,
20
+ dbName: dbNameArr[1],
21
+ };
22
+ }
23
+
24
+ if (databaseName.startsWith(PREFIX_POSTGRES)) {
25
+ return {
26
+ dbType: SqlDbType.postgres,
27
+ dbName: dbNameArr[1],
28
+ };
29
+ }
30
+
31
+ if (databaseName.startsWith(PREFIX_SQLSERVER)) {
32
+ return {
33
+ dbType: SqlDbType.sqlserver,
34
+ dbName: dbNameArr[1],
35
+ };
36
+ }
37
+
12
38
  if (dbNameArr.length === 1) {
13
39
  return {
14
40
  dbType: SqlDbType.mysql, // 默认
15
- dbName: dbNameArr[0]
16
- }
41
+ dbName: dbNameArr[0],
42
+ };
17
43
  }
18
44
 
19
45
  if (dbNameArr.length > 1) {
@@ -21,20 +47,14 @@ function parseDatabaseName(databaseName: string): IDbTypeAndName {
21
47
  const dbType = dbType0 as any;
22
48
  return {
23
49
  dbType,
24
- dbName
25
- }
50
+ dbName,
51
+ };
26
52
  }
27
53
  return null;
28
54
  }
29
55
 
30
-
31
56
  function toDatabaseNameStr(dbType: SqlDbType, dbName: string): string {
32
- return [dbType, dbName].join(SPLIT_CONST)
57
+ return [dbType, dbName].join(SPLIT_CONST);
33
58
  }
34
59
 
35
-
36
- export {
37
- SPLIT_CONST,
38
- parseDatabaseName,
39
- toDatabaseNameStr
40
- }
60
+ export { SPLIT_CONST, parseDatabaseName, toDatabaseNameStr };
@@ -9,10 +9,10 @@ const DateTimeUtils = {
9
9
  getCurrentTimeStampSecond(): number {
10
10
  return Math.floor(Date.now() / 1000);
11
11
  },
12
- getCurrentDateFormat(format:string): string {
12
+ getCurrentDateFormat(format: string): string {
13
13
  return moment(Date.now()).format(format);
14
14
  },
15
- getYesterdayDateFormat(format:string): string {
15
+ getYesterdayDateFormat(format: string): string {
16
16
  return moment(Date.now()).add(-1, 'day').format(format);
17
17
  },
18
18
  };
@@ -50,7 +50,7 @@ const MixinUtils = {
50
50
  },
51
51
 
52
52
  startsWith(str1: string, str2: string): boolean {
53
- if (typeof str1 === "string" && typeof str2 === "string") {
53
+ if (typeof str1 === 'string' && typeof str2 === 'string') {
54
54
  return str1.startsWith(str2);
55
55
  }
56
56
  return false;
@@ -143,9 +143,8 @@ function validateByCfgString(validateCfg: KeysOfValidators | string, itemValue:
143
143
  return;
144
144
  }
145
145
 
146
-
147
146
  // 必填
148
- if ("required" === validateCfg) {
147
+ if ('required' === validateCfg) {
149
148
  if (isEmpty(itemValue)) {
150
149
  throw new CommonException(Exceptions.VALIDATE_ERR, "'参数校验错误,字段 " + errPath + ' 不满足校验配置:' + validateCfg);
151
150
  }
@@ -157,7 +156,6 @@ function validateByCfgString(validateCfg: KeysOfValidators | string, itemValue:
157
156
  return;
158
157
  }
159
158
 
160
-
161
159
  // 校验失败
162
160
  if (!validateByCfgStringInner(validateCfg, itemValue)) {
163
161
  throw new CommonException(Exceptions.VALIDATE_ERR, "'参数校验错误,字段 " + errPath + ' 不满足校验配置:' + validateCfg);
@@ -1,6 +1,6 @@
1
1
  import { createPool } from 'mysql2/promise';
2
2
  import { IConnectionPool } from '../../interfaces';
3
- import {SqlDbType} from "../../models/keys";
3
+ import { SqlDbType } from '../../models/keys';
4
4
 
5
5
  const POOL_CACHE_MAP: Record<string, IConnectionPool> = {};
6
6
 
@@ -1,6 +1,6 @@
1
- import {Pool} from 'pg';
2
- import {IConnectionPool} from '../../interfaces';
3
- import {SqlDbType} from "../../models/keys";
1
+ import { Pool } from 'pg';
2
+ import { IConnectionPool } from '../../interfaces';
3
+ import { SqlDbType } from '../../models/keys';
4
4
 
5
5
  const POOL_CACHE_MAP: Record<string, IConnectionPool> = {};
6
6
 
@@ -1,6 +1,6 @@
1
- import {ConnectionPool} from 'mssql';
2
- import {IConnectionPool} from '../../interfaces';
3
- import {SqlDbType} from "../../models/keys";
1
+ import { ConnectionPool } from 'mssql';
2
+ import { IConnectionPool } from '../../interfaces';
3
+ import { SqlDbType } from '../../models/keys';
4
4
 
5
5
  const POOL_CACHE_MAP: Record<string, IConnectionPool> = {};
6
6
 
@@ -3,10 +3,10 @@ import {SqlDbType} from "../../models/keys";
3
3
 
4
4
 
5
5
  function toSqlColumnName(columnName: string, sqlCfgModel: SqlCfgModel): string {
6
- if (sqlCfgModel.sqlDdType === SqlDbType.postgres) {
6
+ if (sqlCfgModel.sqlDbType === SqlDbType.postgres) {
7
7
  return '"' + columnName + '"';
8
8
  }
9
- if (sqlCfgModel.sqlDdType === SqlDbType.sqlserver) {
9
+ if (sqlCfgModel.sqlDbType === SqlDbType.sqlserver) {
10
10
  return '[' + columnName + ']';
11
11
  }
12
12
  return '`' + columnName + '`';
@@ -0,0 +1,78 @@
1
+ import { SqlDbType } from '../crud-pro/models/keys';
2
+
3
+ interface IGlobalStaticConfig {
4
+ /**
5
+ * CrudStd: 业务系统自定义的修改cfgModel
6
+ * @param reqJson
7
+ * @param cfgModel
8
+ * @param appInfo
9
+ * @param ctx
10
+ */
11
+ bizUpdateCfgModelForCrudStd(reqJson: any, cfgModel: any, appInfo: any, ctx: any): Promise<any>;
12
+
13
+ /**
14
+ * CrudMtd: 业务系统自定义的修改cfgModel
15
+ * @param reqJson
16
+ * @param cfgModel
17
+ * @param methodInfo
18
+ * @param ctx
19
+ */
20
+ bizUpdateCfgModelForCrudMtd(reqJson: any, cfgModel: any, methodInfo: any, ctx: any): Promise<any>;
21
+
22
+ /**
23
+ * CrudPro: 业务系统自定义的修改cfgModel。这是最底层的!!全局的!!全局的!!全局的!!!
24
+ * @param reqJson
25
+ * @param cfgModel
26
+ */
27
+ bizUpdateCfgModelForCrudPro(reqJson: any, cfgModel: any): Promise<any>;
28
+
29
+ /**
30
+ * 生成用户的账号ID,业务系统可以生成类似工号的ID
31
+ * @param userSubmitData
32
+ */
33
+ generateUserAccountId(userSubmitData: any): Promise<string>;
34
+
35
+ /**
36
+ * 将业务系统表中的userId映射为fatcms的UserAccountId
37
+ * @param bizTableUserId 业余系统表中的UserId
38
+ */
39
+ toFatcmsUserAccountId(bizTableUserId: any): string;
40
+
41
+ SystemDbName: string;
42
+ SystemDbType: SqlDbType;
43
+ }
44
+
45
+ const noop = () => {
46
+ return Promise.resolve();
47
+ };
48
+
49
+ class GlobalStaticConfig {
50
+ private configObject: IGlobalStaticConfig;
51
+ constructor() {
52
+ this.configObject = {
53
+ bizUpdateCfgModelForCrudStd: noop,
54
+ bizUpdateCfgModelForCrudMtd: noop,
55
+ bizUpdateCfgModelForCrudPro: noop,
56
+ generateUserAccountId: null,
57
+ toFatcmsUserAccountId: (bizTableUserId: any) => {
58
+ return bizTableUserId;
59
+ },
60
+ SystemDbName: 'fatcms',
61
+ SystemDbType: SqlDbType.mysql,
62
+ };
63
+ }
64
+ public getConfig(): IGlobalStaticConfig {
65
+ return this.configObject as IGlobalStaticConfig;
66
+ }
67
+
68
+ public setConfig(configObject: any) {
69
+ if (!configObject || typeof configObject !== 'object') {
70
+ throw new Error('参数configObject不能为空');
71
+ }
72
+ Object.assign(this.configObject, configObject);
73
+ }
74
+ }
75
+
76
+ const GLOBAL_STATIC_CONFIG = new GlobalStaticConfig();
77
+
78
+ export { GLOBAL_STATIC_CONFIG };
@@ -15,7 +15,7 @@ function hashUtf8Hex(data: string): string {
15
15
  return hash.digest('hex');
16
16
  }
17
17
 
18
- function readSeed1() {
18
+ function readSeed1() {
19
19
  // 这个文件肯定存在
20
20
  const t = path.join(__dirname, '../../config/seed/aeskey.txt');
21
21
  return fs.readFileSync(t, 'utf-8');
@@ -29,8 +29,7 @@ function readSeed2(): string {
29
29
  return fs.readFileSync(filePath, 'utf-8');
30
30
  }
31
31
 
32
-
33
- function createAes128BySeedContent(seedContent:string){
32
+ function createAes128BySeedContent(seedContent: string) {
34
33
  const hash1 = hashUtf8Hex(seedContent.trim());
35
34
  const key = md5(hash1);
36
35
  const iv = md5(key + hash1);
@@ -46,7 +45,6 @@ function createAes128BySeedFile() {
46
45
  return createAes128BySeedContent(seed1);
47
46
  }
48
47
 
49
-
50
48
  const privateAES = createAes128BySeedFile();
51
49
 
52
50
  export { privateAES };
@@ -0,0 +1,61 @@
1
+ function errorToString(error: any): string {
2
+ // 处理非错误对象的情况
3
+ if (typeof error === 'undefined') {
4
+ return 'Error: undefined was thrown';
5
+ }
6
+
7
+ if (error === null) {
8
+ return 'Error: null was thrown';
9
+ }
10
+
11
+ // 处理原始值类型
12
+ const primitiveTypes = ['string', 'number', 'boolean', 'symbol'];
13
+ if (primitiveTypes.includes(typeof error)) {
14
+ return `Error: A primitive value was thrown\nValue: ${String(error)}`;
15
+ }
16
+
17
+ // 处理 Error 对象
18
+ if (error instanceof Error) {
19
+ const errorDetails = [];
20
+ errorDetails.push(`Error: ${error.name || 'Error'}`);
21
+ errorDetails.push(`Message: ${error.message || 'No error message'}`);
22
+
23
+ if (error.stack) {
24
+ errorDetails.push('Stack Trace:');
25
+ errorDetails.push(error.stack);
26
+ }
27
+
28
+ const extraProperties = ['code', 'fileName', 'lineNumber', 'columnNumber'];
29
+ extraProperties.forEach(prop => {
30
+ if (error[prop] !== undefined) {
31
+ errorDetails.push(`${prop}: ${error[prop]}`);
32
+ }
33
+ });
34
+
35
+ const customProps = Object.keys(error).filter(key => !['name', 'message', 'stack', ...extraProperties].includes(key));
36
+
37
+ if (customProps.length > 0) {
38
+ errorDetails.push('Custom Properties:');
39
+ customProps.forEach(prop => {
40
+ try {
41
+ const value = JSON.stringify(error[prop], null, 2) || String(error[prop]);
42
+ errorDetails.push(` ${prop}: ${value}`);
43
+ } catch (e) {
44
+ errorDetails.push(` ${prop}: [Object cannot be serialized]`);
45
+ }
46
+ });
47
+ }
48
+
49
+ return errorDetails.join('\n');
50
+ }
51
+
52
+ // 处理普通对象
53
+ try {
54
+ const objectDetails = JSON.stringify(error, null, 2);
55
+ return `Error: A plain object was thrown\nObject: ${objectDetails}`;
56
+ } catch (e) {
57
+ return `Error: An object was thrown but could not be serialized\nType: ${error.constructor?.name || 'Unknown'}`;
58
+ }
59
+ }
60
+
61
+ export { errorToString };
@@ -1,9 +1,9 @@
1
1
  import { Context } from '@midwayjs/koa';
2
2
  import * as _ from 'lodash';
3
- import {privateAES} from "./crypto-utils";
4
- import {CommonException} from "../crud-pro/exceptions";
3
+ import { privateAES } from './crypto-utils';
4
+ import { CommonException } from '../crud-pro/exceptions';
5
5
 
6
- function isEnableByHeaderKey(ctx: Context, configName: string){
6
+ function isEnableByHeaderKey(ctx: Context, configName: string) {
7
7
  const fatcmsDebug = ctx.app.getConfig(configName);
8
8
  const headerKey = _.get(fatcmsDebug, 'headerKey');
9
9
  const headerSecret = _.get(fatcmsDebug, 'headerSecret');
@@ -14,7 +14,6 @@ function isEnableByHeaderKey(ctx: Context, configName: string){
14
14
  return headers[headerKey] === headerSecret;
15
15
  }
16
16
 
17
-
18
17
  /**
19
18
  * 是否开启调试能力
20
19
  * @param ctx
@@ -23,7 +22,6 @@ export function isEnableDebug(ctx: Context): boolean {
23
22
  return isEnableByHeaderKey(ctx, 'fatcmsDebug');
24
23
  }
25
24
 
26
-
27
25
  /**
28
26
  * 是否开启SA账号。只有账号密码没有用,必须通过ModHeader插件设置如下字段
29
27
  * @param ctx
@@ -32,7 +30,6 @@ export function isEnableSuperAdmin(ctx: Context): boolean {
32
30
  return isEnableByHeaderKey(ctx, 'fatcmsSAEnable');
33
31
  }
34
32
 
35
-
36
33
  export function isLocalEnv(ctx: Context): boolean {
37
34
  // 系统内部调用。如定时任务,没有request对象。
38
35
  if (!ctx.request) {
@@ -42,8 +39,6 @@ export function isLocalEnv(ctx: Context): boolean {
42
39
  return host.startsWith('127.0.0.1') || host.startsWith('localhost:');
43
40
  }
44
41
 
45
-
46
-
47
42
  /**
48
43
  * 获取调试时专用的站点code
49
44
  * @param ctx
@@ -62,32 +57,26 @@ export function getDebugProxyTarget(ctx: Context): string {
62
57
  return headers['fatcmsdebugproxytarget'];
63
58
  }
64
59
 
65
-
66
- export function getCsrfToken(ctx: Context): string{
60
+ export function getCsrfToken(ctx: Context): string {
67
61
  const headers = _.get(ctx, 'request.headers') || {};
68
62
  return headers['fatcmscsrftoken'];
69
63
  }
70
64
 
71
-
72
65
  /**
73
66
  * 扩展的源码应用:本地开发调试时加载本地的js脚本
74
67
  * @param ctx
75
68
  */
76
- export function getExtLocalLoaderPort(ctx: Context) : string {
69
+ export function getExtLocalLoaderPort(ctx: Context): string {
77
70
  const headers = _.get(ctx, 'request.headers') || {};
78
71
  return headers['fatcmsextlocalloaderport'];
79
72
  }
80
73
 
81
-
82
-
83
74
  export async function isCsrfTokenValid(ctx: Context): Promise<boolean> {
84
-
85
75
  // 本地开发,不需要校验
86
76
  if (isLocalEnv(ctx) || isEnableDebug(ctx)) {
87
77
  return true;
88
78
  }
89
79
 
90
-
91
80
  const fatcmscsrftoken = getCsrfToken(ctx);
92
81
  if (!fatcmscsrftoken) {
93
82
  return false;
@@ -96,20 +85,19 @@ export async function isCsrfTokenValid(ctx: Context): Promise<boolean> {
96
85
  const depryptToken = await privateAES.time_decrypt_base64_utf8(fatcmscsrftoken);
97
86
  if (depryptToken) {
98
87
  const num = Number(depryptToken);
99
- if (num && ((num + 6 * 3600 * 1000) > Date.now())) {
88
+ if (num && num + 6 * 3600 * 1000 > Date.now()) {
100
89
  return true;
101
90
  }
102
91
  }
103
92
  } catch (e) {
104
- console.info('isCsrfTokenValid验证失败')
93
+ console.info('isCsrfTokenValid验证失败');
105
94
  }
106
95
  return false;
107
96
  }
108
97
 
109
-
110
98
  export async function assertCsrfToken(ctx: Context) {
111
- const isOK = await isCsrfTokenValid(ctx);
99
+ const isOK = await isCsrfTokenValid(ctx);
112
100
  if (!isOK) {
113
- throw new CommonException("ASSERT_CSRF_TOKEN_ERROR", "CSRF_TOKEN 验证失败")
101
+ throw new CommonException('ASSERT_CSRF_TOKEN_ERROR', 'CSRF_TOKEN 验证失败');
114
102
  }
115
103
  }
@@ -1,7 +1,6 @@
1
1
  import * as moment from 'moment';
2
2
 
3
-
4
- function generateOrderNumber(prefix:string = 'NO'): string {
3
+ function generateOrderNumber(prefix = 'NO'): string {
5
4
  // 获取当前时间并格式化为YYYYMMDDHHmmss
6
5
  const timestamp = moment().format('YYYYMMDDHHmmss');
7
6
 
@@ -12,7 +11,4 @@ function generateOrderNumber(prefix:string = 'NO'): string {
12
11
  return prefix + timestamp + randomDigits;
13
12
  }
14
13
 
15
-
16
- export {
17
- generateOrderNumber
18
- }
14
+ export { generateOrderNumber };
@@ -1,7 +1,5 @@
1
1
  import * as _ from 'lodash';
2
- import {parseJsonObject} from "./functions";
3
-
4
-
2
+ import { parseJsonObject } from './functions';
5
3
 
6
4
  interface IEnumInfo {
7
5
  label: string;
@@ -9,14 +7,14 @@ interface IEnumInfo {
9
7
  children?: IEnumInfo[];
10
8
  }
11
9
 
12
- function parseTreeTableToIEnumInfo(dataSource:any[]): IEnumInfo[]{
10
+ function parseTreeTableToIEnumInfo(dataSource: any[]): IEnumInfo[] {
13
11
  if (!dataSource || !Array.isArray(dataSource)) {
14
12
  return undefined;
15
13
  }
16
- return dataSource.map((item: any) => {
17
- const {key, nodeName, value, label } = item;
14
+ return dataSource.map((item: any) => {
15
+ const { key, nodeName, value, label } = item;
18
16
  const children = parseTreeTableToIEnumInfo(item.children);
19
- const enumInfo: IEnumInfo = {
17
+ const enumInfo: IEnumInfo = {
20
18
  label: label || nodeName,
21
19
  value: value || key,
22
20
  };
@@ -27,9 +25,7 @@ function parseTreeTableToIEnumInfo(dataSource:any[]): IEnumInfo[]{
27
25
  });
28
26
  }
29
27
 
30
-
31
28
  function parseConfigContentToEnumInfo(configEntity: any): IEnumInfo[] {
32
-
33
29
  const { config_content, config_type } = configEntity;
34
30
 
35
31
  const configObj = parseJsonObject(config_content);
@@ -52,11 +48,7 @@ function parseConfigContentToEnumInfo(configEntity: any): IEnumInfo[] {
52
48
  if (Array.isArray(configObj)) {
53
49
  return configObj;
54
50
  }
55
- return []
51
+ return [];
56
52
  }
57
53
 
58
-
59
- export {
60
- parseConfigContentToEnumInfo,
61
- IEnumInfo
62
- }
54
+ export { parseConfigContentToEnumInfo, IEnumInfo };
@@ -1,36 +1,18 @@
1
1
  import { Middleware, IMiddleware } from '@midwayjs/core';
2
2
  import { NextFunction, Context } from '@midwayjs/koa';
3
3
 
4
-
5
4
  // 一些爬虫/漏洞分析工具会来请求这玩意。
6
- const blackEqualList = [
7
- '/config.json',
8
- '/backend/.env',
9
- '/application.yml',
10
- '/db.ini',
11
- '/.well-known/security.txt',
12
- ];
5
+ const blackEqualList = ['/config.json', '/backend/.env', '/application.yml', '/db.ini', '/.well-known/security.txt'];
13
6
 
14
- const blackPrefixList = [
15
- '/.aws/',
16
- '/.git/',
17
- '/.svn/',
18
- '/.env/',
19
- '/src/',
20
- '/var/logs/',
21
- '/var/log/',
22
- '/cgi-bin/',
23
- '/php-cgi/',
24
- ];
7
+ const blackPrefixList = ['/.aws/', '/.git/', '/.svn/', '/.env/', '/src/', '/var/logs/', '/var/log/', '/cgi-bin/', '/php-cgi/'];
25
8
 
26
9
  /**
27
10
  * 针对一些路径禁止访问。避免一些爬虫抓取网站内容,实际上这里枚举的路径,本身就是不存在的。只是为了提前拦截,为了服务器性能考虑。
28
11
  */
29
12
  @Middleware()
30
13
  export class ForbiddenMiddleware implements IMiddleware<Context, NextFunction> {
31
-
32
14
  match(ctx: Context): boolean {
33
- const path = ctx.path ;
15
+ const path = ctx.path;
34
16
  if (path === '/') {
35
17
  return false;
36
18
  }
@@ -53,15 +35,14 @@ export class ForbiddenMiddleware implements IMiddleware<Context, NextFunction> {
53
35
  }
54
36
  }
55
37
 
56
- return !!(path.includes('/wp-includes/') || path.endsWith('.php') || path.endsWith('/.git/config'));
38
+ return !!(path.includes('/wp-includes/') || path.endsWith('.php') || path.endsWith('/.git/config'));
57
39
  }
58
40
 
59
-
60
41
  resolve() {
61
42
  return async (ctx: Context, next: NextFunction) => {
62
- ctx.set({"content-type": "text/html; charset=utf-8"});
43
+ ctx.set({ 'content-type': 'text/html; charset=utf-8' });
63
44
  ctx.status = 404;
64
- ctx.body = "404!404!404!重要的事情说三遍!"
45
+ ctx.body = '404!404!404!重要的事情说三遍!';
65
46
  };
66
47
  }
67
48