midway-fatcms 0.0.7 → 0.0.9
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/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
- package/.qoder/skills/midway-fatcms/02-crud-quick.md +375 -0
- package/.qoder/skills/midway-fatcms/03-crud-sharding.md +489 -0
- package/.qoder/skills/midway-fatcms/04-condition-operators.md +93 -0
- package/.qoder/skills/midway-fatcms/05-configuration.md +290 -0
- package/.qoder/skills/midway-fatcms/06-builtin-functions.md +241 -0
- package/.qoder/skills/midway-fatcms/07-examples.md +504 -0
- package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
- package/README.md +9 -9
- package/dist/configuration.d.ts +10 -0
- package/dist/configuration.js +26 -0
- package/dist/controller/base/BaseApiController.d.ts +1 -2
- package/dist/controller/base/BaseApiController.js +0 -4
- package/dist/controller/gateway/DocGatewayController.js +1 -1
- package/dist/controller/helpers.controller.d.ts +6 -0
- package/dist/controller/helpers.controller.js +19 -0
- package/dist/controller/manage/FlowConfigManageApi.js +4 -2
- package/dist/controller/manage/SysConfigMangeApi.js +6 -1
- package/dist/controller/manage/UserAccountManageApi.js +7 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/libs/crud-pro/CrudPro.d.ts +51 -3
- package/dist/libs/crud-pro/CrudPro.js +111 -4
- package/dist/libs/crud-pro/exceptions.d.ts +7 -0
- package/dist/libs/crud-pro/exceptions.js +7 -0
- package/dist/libs/crud-pro/interfaces.d.ts +83 -12
- package/dist/libs/crud-pro/models/CrudResult.d.ts +116 -0
- package/dist/libs/crud-pro/models/CrudResult.js +126 -0
- package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -2
- package/dist/libs/crud-pro/models/ServiceHub.d.ts +2 -0
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +70 -2
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +205 -13
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
- package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +36 -0
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +97 -4
- package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +2 -0
- package/dist/libs/crud-pro/services/CurdProServiceHub.js +6 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +382 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.js +689 -0
- package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
- package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
- package/dist/libs/crud-pro-quick/index.d.ts +36 -0
- package/dist/libs/crud-pro-quick/index.js +49 -0
- package/dist/libs/crud-pro-quick/models.d.ts +33 -0
- package/dist/libs/crud-pro-quick/models.js +2 -0
- package/dist/libs/crud-sharding/ShardingBase.d.ts +78 -0
- package/dist/libs/crud-sharding/ShardingBase.js +179 -0
- package/dist/libs/crud-sharding/ShardingByCustomCrud.d.ts +35 -0
- package/dist/libs/crud-sharding/ShardingByCustomCrud.js +297 -0
- package/dist/libs/crud-sharding/ShardingByHashCrud.d.ts +38 -0
- package/dist/libs/crud-sharding/ShardingByHashCrud.js +86 -0
- package/dist/libs/crud-sharding/ShardingByKeyCrud.d.ts +39 -0
- package/dist/libs/crud-sharding/ShardingByKeyCrud.js +74 -0
- package/dist/libs/crud-sharding/ShardingByTimeCrud.d.ts +66 -0
- package/dist/libs/crud-sharding/ShardingByTimeCrud.js +524 -0
- package/dist/libs/crud-sharding/ShardingConfig.d.ts +25 -10
- package/dist/libs/crud-sharding/ShardingConfig.js +5 -5
- package/dist/libs/crud-sharding/ShardingMerger.d.ts +10 -18
- package/dist/libs/crud-sharding/ShardingMerger.js +27 -44
- package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
- package/dist/libs/crud-sharding/ShardingResult.js +16 -0
- package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
- package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
- package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
- package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
- package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
- package/dist/libs/crud-sharding/index.d.ts +13 -15
- package/dist/libs/crud-sharding/index.js +33 -17
- package/dist/models/RedisKeys.d.ts +1 -0
- package/dist/models/RedisKeys.js +1 -0
- package/dist/models/bizmodels.d.ts +2 -6
- package/dist/service/SysAppService.d.ts +2 -2
- package/dist/service/SysAppService.js +16 -5
- package/dist/service/SysConfigService.d.ts +1 -1
- package/dist/service/SysConfigService.js +7 -2
- package/dist/service/SysDictDataService.js +14 -4
- package/dist/service/SysMenuService.js +7 -2
- package/dist/service/TableMetaCacheRedisSubscriber.d.ts +31 -0
- package/dist/service/TableMetaCacheRedisSubscriber.js +98 -0
- package/dist/service/curd/CurdMixService.d.ts +6 -4
- package/dist/service/curd/CurdMixService.js +16 -2
- package/dist/service/curd/CurdProService.d.ts +149 -29
- package/dist/service/curd/CurdProService.js +157 -38
- package/dist/service/flow/FlowConfigService.js +7 -2
- package/dist/service/flow/FlowInstanceCrudService.js +22 -19
- package/package.json +1 -1
- package/src/configuration.ts +27 -0
- package/src/controller/base/BaseApiController.ts +0 -5
- package/src/controller/gateway/DocGatewayController.ts +1 -1
- package/src/controller/helpers.controller.ts +15 -0
- package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
- package/src/controller/manage/FlowConfigManageApi.ts +4 -2
- package/src/controller/manage/SysConfigMangeApi.ts +6 -1
- package/src/controller/manage/UserAccountManageApi.ts +7 -2
- package/src/index.ts +2 -2
- package/src/libs/crud-pro/CrudPro.ts +134 -7
- package/src/libs/crud-pro/exceptions.ts +8 -0
- package/src/libs/crud-pro/interfaces.ts +111 -15
- package/src/libs/crud-pro/models/CrudResult.ts +178 -0
- package/src/libs/crud-pro/models/RequestModel.ts +2 -2
- package/src/libs/crud-pro/models/ServiceHub.ts +4 -0
- package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +238 -15
- package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
- package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +110 -3
- package/src/libs/crud-pro/services/CurdProServiceHub.ts +8 -0
- package/src/libs/crud-pro-quick/CrudProQuick.ts +782 -0
- package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
- package/src/libs/crud-pro-quick/index.ts +52 -0
- package/src/libs/crud-pro-quick/models.ts +35 -0
- package/src/libs/crud-sharding/ShardingBase.ts +256 -0
- package/src/libs/crud-sharding/ShardingByCustomCrud.ts +329 -0
- package/src/libs/crud-sharding/ShardingByHashCrud.ts +111 -0
- package/src/libs/crud-sharding/ShardingByKeyCrud.ts +97 -0
- package/src/libs/crud-sharding/ShardingByTimeCrud.ts +628 -0
- package/src/libs/crud-sharding/ShardingConfig.ts +28 -10
- package/src/libs/crud-sharding/ShardingMerger.ts +35 -63
- package/src/libs/crud-sharding/ShardingResult.ts +29 -0
- package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
- package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
- package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
- package/src/libs/crud-sharding/index.ts +30 -16
- package/src/models/RedisKeys.ts +1 -0
- package/src/models/bizmodels.ts +4 -7
- package/src/service/SysAppService.ts +18 -7
- package/src/service/SysConfigService.ts +8 -3
- package/src/service/SysDictDataService.ts +14 -4
- package/src/service/SysMenuService.ts +7 -2
- package/src/service/TableMetaCacheRedisSubscriber.ts +105 -0
- package/src/service/crudstd/CrudStdService.ts +2 -2
- package/src/service/curd/CurdMixService.ts +26 -5
- package/src/service/curd/CurdProService.ts +186 -45
- package/src/service/flow/FlowConfigService.ts +7 -2
- package/src/service/flow/FlowInstanceCrudService.ts +23 -20
- package/.qoder/skills/midway-fatcms-crud/SKILL.md +0 -375
- package/.qoder/skills/midway-fatcms-crud/examples.md +0 -990
- package/.qoder/skills/midway-fatcms-crud/reference.md +0 -568
- package/dist/libs/crud-pro/README.md +0 -809
- package/dist/libs/crud-pro/README_FUNC.md +0 -193
- package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
- package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +0 -363
- package/dist/libs/crud-sharding/ShardingCrudPro.js +0 -675
- package/dist/libs/crud-sharding/ShardingRouter.d.ts +0 -69
- package/dist/libs/crud-sharding/ShardingRouter.js +0 -377
- package/dist/models/StandardColumns.d.ts +0 -71
- package/dist/models/StandardColumns.js +0 -28
- package/dist/service/curd/CrudProQuick.d.ts +0 -190
- package/dist/service/curd/CrudProQuick.js +0 -319
- package/dist/service/curd/README.md +0 -1100
- package/dist/service/curd/fixSoftDelete.d.ts +0 -20
- package/src/libs/crud-pro/README.md +0 -809
- package/src/libs/crud-pro/README_FUNC.md +0 -193
- package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
- package/src/libs/crud-sharding/ShardingCrudPro.ts +0 -835
- package/src/libs/crud-sharding/ShardingRouter.ts +0 -512
- package/src/models/StandardColumns.ts +0 -76
- package/src/service/curd/CrudProQuick.ts +0 -360
- package/src/service/curd/README.md +0 -1100
|
@@ -39,6 +39,24 @@ class CrudProTableMetaCache {
|
|
|
39
39
|
expiredTime: Date.now() + cacheTime,
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 清空所有缓存
|
|
45
|
+
*/
|
|
46
|
+
public clearAll(): void {
|
|
47
|
+
this.cacheMap = {};
|
|
48
|
+
this.tableInfoCacheMap = {};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 获取缓存统计信息
|
|
53
|
+
*/
|
|
54
|
+
public getCacheStats(): { metaCacheCount: number; tableInfoCacheCount: number } {
|
|
55
|
+
return {
|
|
56
|
+
metaCacheCount: Object.keys(this.cacheMap).length,
|
|
57
|
+
tableInfoCacheCount: Object.keys(this.tableInfoCacheMap).length,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
42
60
|
}
|
|
43
61
|
|
|
44
62
|
const metaCache = new CrudProTableMetaCache();
|
|
@@ -53,6 +71,40 @@ class CrudProTableMetaService extends CrudProServiceBase {
|
|
|
53
71
|
return obj;
|
|
54
72
|
}
|
|
55
73
|
|
|
74
|
+
/**
|
|
75
|
+
* 清空所有表元数据缓存
|
|
76
|
+
*
|
|
77
|
+
* 清空后,下次请求会自动从数据库重新加载。
|
|
78
|
+
* 适用于定时刷新或手动触发缓存失效的场景。
|
|
79
|
+
*/
|
|
80
|
+
public clearAllCache(): void {
|
|
81
|
+
metaCache.clearAll();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 获取缓存统计信息
|
|
86
|
+
*/
|
|
87
|
+
public getCacheStats(): { metaCacheCount: number; tableInfoCacheCount: number } {
|
|
88
|
+
return metaCache.getCacheStats();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 获取表的主键列名列表
|
|
93
|
+
*
|
|
94
|
+
* 复用 getTableMeta 的缓存机制,从 columnDetails 中筛选 isPrimaryKey 的列,
|
|
95
|
+
* 避免重复查询数据库。
|
|
96
|
+
*
|
|
97
|
+
* @param query 表元数据查询参数
|
|
98
|
+
* @returns 主键列名数组
|
|
99
|
+
*/
|
|
100
|
+
public async getPrimaryKeyColumns(query: ITableMetaQuery): Promise<string[]> {
|
|
101
|
+
const meta = await this.getTableMeta(query);
|
|
102
|
+
const pks = (meta.columnDetails || [])
|
|
103
|
+
.filter(col => col.isPrimaryKey)
|
|
104
|
+
.map(col => col.name);
|
|
105
|
+
return pks;
|
|
106
|
+
}
|
|
107
|
+
|
|
56
108
|
// ============ 获取表和视图信息(带类型) ============
|
|
57
109
|
|
|
58
110
|
|
|
@@ -84,8 +136,7 @@ class CrudProTableMetaService extends CrudProServiceBase {
|
|
|
84
136
|
|
|
85
137
|
// 3. 更新缓存
|
|
86
138
|
if (!skipCache || refreshCache) {
|
|
87
|
-
|
|
88
|
-
metaCache.setTableInfos(cacheKey, result, tableMetaCacheTime || 3600000);
|
|
139
|
+
metaCache.setTableInfos(cacheKey, result, 1000 * 3600 * 24 * 365);
|
|
89
140
|
}
|
|
90
141
|
|
|
91
142
|
return result;
|
|
@@ -245,12 +296,16 @@ class CrudProTableMetaService extends CrudProServiceBase {
|
|
|
245
296
|
// 获取字段注释
|
|
246
297
|
const commentMap = await this.loadPostgreSQLColumnComments(baseInfo, schemaname);
|
|
247
298
|
|
|
299
|
+
// 获取主键列
|
|
300
|
+
const pkSet = await this.loadPostgreSQLPrimaryKeys(baseInfo, schemaname);
|
|
301
|
+
|
|
248
302
|
return columnArray.map((columnObj: any) => {
|
|
249
303
|
const { column_name, data_type, is_nullable, column_default, character_maximum_length } = columnObj;
|
|
250
304
|
return {
|
|
251
305
|
name: column_name,
|
|
252
306
|
type: data_type,
|
|
253
307
|
isNullable: is_nullable === 'YES',
|
|
308
|
+
isPrimaryKey: pkSet.has(column_name),
|
|
254
309
|
defaultValue: column_default,
|
|
255
310
|
maxLength: character_maximum_length,
|
|
256
311
|
comment: commentMap[column_name],
|
|
@@ -288,6 +343,27 @@ class CrudProTableMetaService extends CrudProServiceBase {
|
|
|
288
343
|
return map;
|
|
289
344
|
}
|
|
290
345
|
|
|
346
|
+
private async loadPostgreSQLPrimaryKeys(
|
|
347
|
+
baseInfo: IExecuteUnsafeQueryCtx,
|
|
348
|
+
schemaname: string
|
|
349
|
+
): Promise<Set<string>> {
|
|
350
|
+
const pkSql = `
|
|
351
|
+
SELECT a.attname
|
|
352
|
+
FROM pg_index i
|
|
353
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
|
354
|
+
JOIN pg_class c ON c.oid = i.indrelid
|
|
355
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
356
|
+
WHERE n.nspname = '${schemaname}'
|
|
357
|
+
AND c.relname = '${baseInfo.sqlTable}'
|
|
358
|
+
AND i.indisprimary
|
|
359
|
+
ORDER BY array_position(i.indkey, a.attnum);
|
|
360
|
+
`.trim();
|
|
361
|
+
|
|
362
|
+
const queryRes = await this.executeUnsafeQuery(baseInfo, pkSql);
|
|
363
|
+
const pkRows = queryRes.rows || [];
|
|
364
|
+
return new Set(pkRows.map((row: any) => row.attname));
|
|
365
|
+
}
|
|
366
|
+
|
|
291
367
|
private async loadSQLServerColumnDetails(baseInfo: IExecuteUnsafeQueryCtx): Promise<ITableColumn[]> {
|
|
292
368
|
const columnArraySql = `
|
|
293
369
|
SELECT
|
|
@@ -311,19 +387,50 @@ class CrudProTableMetaService extends CrudProServiceBase {
|
|
|
311
387
|
const queryRes = await this.executeUnsafeQuery(baseInfo, columnArraySql);
|
|
312
388
|
const columnArray = queryRes.rows || [];
|
|
313
389
|
|
|
390
|
+
// 获取主键列
|
|
391
|
+
const pkSet = await this.loadSQLServerPrimaryKeys(baseInfo);
|
|
392
|
+
|
|
314
393
|
return columnArray.map((columnObj: any) => {
|
|
315
394
|
const { column_name, data_type, is_nullable, column_default, column_comment, max_length, is_identity } = columnObj;
|
|
316
395
|
return {
|
|
317
396
|
name: column_name,
|
|
318
397
|
type: data_type,
|
|
319
398
|
isNullable: is_nullable,
|
|
399
|
+
isPrimaryKey: pkSet.has(column_name),
|
|
320
400
|
defaultValue: column_default,
|
|
321
401
|
comment: column_comment,
|
|
322
402
|
maxLength: max_length,
|
|
323
|
-
|
|
403
|
+
isIdentity: is_identity,
|
|
324
404
|
};
|
|
325
405
|
});
|
|
326
406
|
}
|
|
407
|
+
|
|
408
|
+
private async loadSQLServerPrimaryKeys(baseInfo: IExecuteUnsafeQueryCtx): Promise<Set<string>> {
|
|
409
|
+
const pkSql = `
|
|
410
|
+
SELECT COL_NAME(ic.object_id, ic.column_id) AS column_name
|
|
411
|
+
FROM sys.indexes i
|
|
412
|
+
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
413
|
+
WHERE i.object_id = OBJECT_ID('${baseInfo.sqlTable}')
|
|
414
|
+
AND i.is_primary_key = 1
|
|
415
|
+
ORDER BY ic.key_ordinal;
|
|
416
|
+
`.trim();
|
|
417
|
+
|
|
418
|
+
const queryRes = await this.executeUnsafeQuery(baseInfo, pkSql);
|
|
419
|
+
const pkRows = queryRes.rows || [];
|
|
420
|
+
return new Set(pkRows.map((row: any) => row.column_name));
|
|
421
|
+
}
|
|
327
422
|
}
|
|
328
423
|
|
|
329
424
|
export { CrudProTableMetaService };
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* 清空所有表元数据缓存(独立函数,无需实例化 Service 即可调用)
|
|
428
|
+
*
|
|
429
|
+
* 适用于定时任务等无法通过 Service 实例访问的场景。
|
|
430
|
+
* 清空后,下次请求会自动从数据库重新加载(懒加载刷新)。
|
|
431
|
+
*/
|
|
432
|
+
export function clearTableMetaCache(): { metaCacheCount: number; tableInfoCacheCount: number } {
|
|
433
|
+
const stats = metaCache.getCacheStats();
|
|
434
|
+
metaCache.clearAll();
|
|
435
|
+
return stats;
|
|
436
|
+
}
|
|
@@ -98,6 +98,10 @@ class CurdProServiceHub implements ICurdProServiceHub {
|
|
|
98
98
|
return await this.tableMetaService.getTableMeta(query);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
+
async getPrimaryKeyColumns(query: ITableMetaQuery): Promise<string[]> {
|
|
102
|
+
return await this.tableMetaService.getPrimaryKeyColumns(query);
|
|
103
|
+
}
|
|
104
|
+
|
|
101
105
|
async getAllTableInfos(query: ITableNamesQuery, options?: ITableNamesOptions): Promise<ITableListResult> {
|
|
102
106
|
return await this.tableMetaService.getAllTableInfos(query, options);
|
|
103
107
|
}
|
|
@@ -109,6 +113,10 @@ class CurdProServiceHub implements ICurdProServiceHub {
|
|
|
109
113
|
async convertDataTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void> {
|
|
110
114
|
return await this.dataTypeConvertService.convertDataTypeByTableMeta(reqModel, cfgModel);
|
|
111
115
|
}
|
|
116
|
+
|
|
117
|
+
async convertConditionTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void> {
|
|
118
|
+
return await this.dataTypeConvertService.convertConditionTypeByTableMeta(reqModel, cfgModel);
|
|
119
|
+
}
|
|
112
120
|
}
|
|
113
121
|
|
|
114
122
|
export { CurdProServiceHub };
|