midway-fatcms 0.0.6 → 0.0.8
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 +337 -0
- package/.qoder/skills/midway-fatcms/03-crud-sharding.md +488 -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 +500 -0
- package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
- package/README.md +9 -9
- 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/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 +23 -2
- package/dist/libs/crud-pro/CrudPro.js +53 -2
- package/dist/libs/crud-pro/interfaces.d.ts +82 -12
- package/dist/libs/crud-pro/models/CrudResult.d.ts +115 -0
- package/dist/libs/crud-pro/models/CrudResult.js +126 -0
- package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -38
- package/dist/libs/crud-pro/models/RequestModel.js +2 -99
- 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.js +1 -2
- package/dist/libs/crud-pro/utils/OrderByUtils.d.ts +70 -0
- package/dist/libs/crud-pro/utils/OrderByUtils.js +158 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +295 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.js +529 -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/ShardingConfig.d.ts +15 -2
- package/dist/libs/crud-sharding/ShardingConfig.js +2 -2
- package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +119 -274
- package/dist/libs/crud-sharding/ShardingCrudPro.js +559 -379
- package/dist/libs/crud-sharding/ShardingMerger.d.ts +12 -20
- package/dist/libs/crud-sharding/ShardingMerger.js +36 -51
- package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
- package/dist/libs/crud-sharding/ShardingResult.js +16 -0
- package/dist/libs/crud-sharding/ShardingRouter.d.ts +1 -0
- package/dist/libs/crud-sharding/ShardingRouter.js +25 -6
- 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 +4 -3
- package/dist/libs/crud-sharding/index.js +14 -2
- 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/curd/CurdMixService.d.ts +6 -4
- package/dist/service/curd/CurdMixService.js +16 -2
- package/dist/service/curd/CurdProService.d.ts +43 -27
- package/dist/service/curd/CurdProService.js +32 -33
- package/dist/service/flow/FlowConfigService.js +7 -2
- package/dist/service/flow/FlowInstanceCrudService.js +22 -19
- package/package.json +2 -1
- package/src/controller/base/BaseApiController.ts +0 -5
- package/src/controller/gateway/DocGatewayController.ts +1 -1
- 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 +62 -4
- package/src/libs/crud-pro/interfaces.ts +110 -15
- package/src/libs/crud-pro/models/CrudResult.ts +178 -0
- package/src/libs/crud-pro/models/RequestModel.ts +4 -110
- 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 +1 -2
- package/src/libs/crud-pro/utils/OrderByUtils.ts +169 -0
- package/src/libs/crud-pro-quick/CrudProQuick.ts +594 -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/ShardingConfig.ts +18 -2
- package/src/libs/crud-sharding/ShardingCrudPro.ts +689 -440
- package/src/libs/crud-sharding/ShardingMerger.ts +47 -73
- package/src/libs/crud-sharding/ShardingResult.ts +29 -0
- package/src/libs/crud-sharding/ShardingRouter.ts +27 -6
- 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 +14 -3
- 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/crudstd/CrudStdService.ts +2 -2
- package/src/service/curd/CurdMixService.ts +26 -5
- package/src/service/curd/CurdProService.ts +58 -39
- package/src/service/flow/FlowConfigService.ts +7 -2
- package/src/service/flow/FlowInstanceCrudService.ts +23 -20
- 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/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 -1001
- 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/models/StandardColumns.ts +0 -76
- package/src/service/curd/CrudProQuick.ts +0 -360
- package/src/service/curd/README.md +0 -1001
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { IOrderByItem } from '../interfaces';
|
|
2
|
+
import { MixinUtils } from './MixinUtils';
|
|
3
|
+
import { CommonException, Exceptions } from '../exceptions';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* OrderBy 解析工具类
|
|
7
|
+
*
|
|
8
|
+
* 提供统一的 orderBy 参数解析功能,支持多种格式:
|
|
9
|
+
* 1. 字符串格式(逗号分隔多个字段):
|
|
10
|
+
* - 标准 SQL 格式:'created_at DESC, amount ASC'
|
|
11
|
+
* - 简写 +/- 格式:'created_at-, amount+'('-' 表示 DESC,'+' 或省略表示 ASC)
|
|
12
|
+
* - 默认升序:'order_id'(无后缀时默认为 ASC)
|
|
13
|
+
*
|
|
14
|
+
* 2. 数组格式:
|
|
15
|
+
* - 纯对象数组:[{ fieldName: 'created_at', orderType: 'desc' }]
|
|
16
|
+
* - 混合数组(字符串+对象):['order_id+', { fieldName: 'amount', orderType: 'asc' }]
|
|
17
|
+
*
|
|
18
|
+
* SQL 注入防护:
|
|
19
|
+
* - 所有字段名必须通过 MixinUtils.isValidFieldName() 校验
|
|
20
|
+
* - 只允许 ASC/DESC 作为排序方向
|
|
21
|
+
*/
|
|
22
|
+
export class OrderByUtils {
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 解析 orderBy 参数为 IOrderByItem 数组
|
|
26
|
+
*
|
|
27
|
+
* @param orderByStr 排序参数,可以是字符串或数组
|
|
28
|
+
* @returns IOrderByItem[] 解析后的排序项数组
|
|
29
|
+
*/
|
|
30
|
+
public static parseOrderBys(orderByStr: any): IOrderByItem[] {
|
|
31
|
+
if (MixinUtils.isEmpty(orderByStr)) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 数组格式:支持字符串和对象混合
|
|
36
|
+
if (Array.isArray(orderByStr)) {
|
|
37
|
+
return orderByStr
|
|
38
|
+
.map(item => this.parseOrderByItem(item))
|
|
39
|
+
.filter((o): o is IOrderByItem => !!o);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 字符串格式:逗号分隔多个字段
|
|
43
|
+
return orderByStr
|
|
44
|
+
.split(',')
|
|
45
|
+
.map(s => s.trim())
|
|
46
|
+
.filter(s => !!s)
|
|
47
|
+
.map(item => this.parseOrderByString(item))
|
|
48
|
+
.filter((o): o is IOrderByItem => !!o);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 获取第一个排序项
|
|
53
|
+
*
|
|
54
|
+
* @param orderByStr 排序参数
|
|
55
|
+
* @returns IOrderByItem | null 第一个排序项,无则返回 null
|
|
56
|
+
*/
|
|
57
|
+
public static getFirstOrderBy(orderByStr: any): IOrderByItem | null {
|
|
58
|
+
const orderBys = this.parseOrderBys(orderByStr);
|
|
59
|
+
return orderBys.length > 0 ? orderBys[0] : null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 判断是否为 ASC 升序排序
|
|
64
|
+
*
|
|
65
|
+
* @param orderByStr 排序参数
|
|
66
|
+
* @returns true 表示 ASC,false 表示 DESC 或无排序
|
|
67
|
+
*/
|
|
68
|
+
public static isFirstOrderByAsc(orderByStr: any): boolean {
|
|
69
|
+
const first = this.getFirstOrderBy(orderByStr);
|
|
70
|
+
if (!first) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return first.orderType.toUpperCase() === 'ASC';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 判断是否为 DESC 降序排序
|
|
78
|
+
*
|
|
79
|
+
* @param orderByStr 排序参数
|
|
80
|
+
* @returns true 表示 DESC,false 表示 ASC 或无排序
|
|
81
|
+
*/
|
|
82
|
+
public static isFirstOrderByDesc(orderByStr: any): boolean {
|
|
83
|
+
const first = this.getFirstOrderBy(orderByStr);
|
|
84
|
+
if (!first) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
return first.orderType.toUpperCase() === 'DESC';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 判断排序字段是否匹配指定的时间字段
|
|
92
|
+
*
|
|
93
|
+
* 用于分表查询时校验排序字段是否为分表字段
|
|
94
|
+
*
|
|
95
|
+
* @param orderByStr 排序参数
|
|
96
|
+
* @param timeColumn 时间字段名
|
|
97
|
+
* @returns true 表示匹配,false 表示不匹配或无排序
|
|
98
|
+
*/
|
|
99
|
+
public static isOrderByTimeColumn(orderByStr: any, timeColumn: string): boolean {
|
|
100
|
+
const first = this.getFirstOrderBy(orderByStr);
|
|
101
|
+
if (!first) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return first.fieldName === timeColumn;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 解析单个排序项(数组元素)
|
|
109
|
+
*/
|
|
110
|
+
private static parseOrderByItem(item: any): IOrderByItem | null {
|
|
111
|
+
// 字符串格式:解析标准 SQL 格式或简写格式
|
|
112
|
+
if (typeof item === 'string') {
|
|
113
|
+
return this.parseOrderByString(item);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// 对象格式:提取 fieldName 和 orderType
|
|
117
|
+
const { fieldName, orderType = 'asc' } = item || {};
|
|
118
|
+
if (!fieldName) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
this.validateFieldName(fieldName, fieldName);
|
|
123
|
+
return { fieldName, orderType };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 解析字符串格式的排序项(支持标准 SQL 和简写格式)
|
|
128
|
+
*/
|
|
129
|
+
private static parseOrderByString(orderByStr: string): IOrderByItem | null {
|
|
130
|
+
let orderType = 'asc';
|
|
131
|
+
let fieldName = orderByStr;
|
|
132
|
+
|
|
133
|
+
// 检查是否为空格分隔的标准 SQL 格式(如 'created_at DESC')
|
|
134
|
+
const spaceIndex = orderByStr.lastIndexOf(' ');
|
|
135
|
+
if (spaceIndex > 0) {
|
|
136
|
+
const beforeSpace = orderByStr.substring(0, spaceIndex).trim();
|
|
137
|
+
const afterSpace = orderByStr.substring(spaceIndex + 1).trim().toUpperCase();
|
|
138
|
+
|
|
139
|
+
if (afterSpace === 'ASC' || afterSpace === 'DESC') {
|
|
140
|
+
fieldName = beforeSpace;
|
|
141
|
+
orderType = afterSpace.toLowerCase() as 'asc' | 'desc';
|
|
142
|
+
} else {
|
|
143
|
+
throw new CommonException(Exceptions.REQUEST_MODEL_PARSE_ORDER_BY_FAILED, orderByStr);
|
|
144
|
+
}
|
|
145
|
+
} else if (orderByStr.endsWith('+')) {
|
|
146
|
+
// 简写格式:+ 表示升序
|
|
147
|
+
fieldName = orderByStr.slice(0, -1);
|
|
148
|
+
orderType = 'asc';
|
|
149
|
+
} else if (orderByStr.endsWith('-')) {
|
|
150
|
+
// 简写格式:- 表示降序
|
|
151
|
+
fieldName = orderByStr.slice(0, -1);
|
|
152
|
+
orderType = 'desc';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
fieldName = fieldName.trim();
|
|
156
|
+
this.validateFieldName(fieldName, orderByStr);
|
|
157
|
+
|
|
158
|
+
return { fieldName, orderType };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* SQL 注入防护:校验字段名格式
|
|
163
|
+
*/
|
|
164
|
+
private static validateFieldName(fieldName: string, originalValue: string): void {
|
|
165
|
+
if (MixinUtils.isEmpty(fieldName) || !MixinUtils.isValidFieldName(fieldName)) {
|
|
166
|
+
throw new CommonException(Exceptions.REQUEST_MODEL_PARSE_ORDER_BY_FAILED, originalValue);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|