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,231 @@
|
|
|
1
|
+
# 快速入门
|
|
2
|
+
|
|
3
|
+
## 安装
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install midway-fatcms
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## 服务注入
|
|
10
|
+
|
|
11
|
+
midway-fatcms 提供两个核心服务:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Provide, Inject } from '@midwayjs/core';
|
|
15
|
+
import { CurdMixService, CurdProService } from 'midway-fatcms';
|
|
16
|
+
|
|
17
|
+
@Provide()
|
|
18
|
+
export class MyService {
|
|
19
|
+
@Inject()
|
|
20
|
+
curdMixService: CurdMixService; // 协调层(带关联填充)
|
|
21
|
+
|
|
22
|
+
@Inject()
|
|
23
|
+
curdProService: CurdProService; // 核心层
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 数据库类型
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { SqlDbType } from 'midway-fatcms';
|
|
31
|
+
|
|
32
|
+
// 支持三种数据库
|
|
33
|
+
SqlDbType.mysql // MySQL
|
|
34
|
+
SqlDbType.postgres // PostgreSQL
|
|
35
|
+
SqlDbType.sqlserver // SQL Server
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 三种使用方式
|
|
39
|
+
|
|
40
|
+
### 方式一:CrudProQuick(推荐入门)
|
|
41
|
+
|
|
42
|
+
适用于单表 CRUD 操作:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
const quick = this.curdProService.getQuickCrud({
|
|
46
|
+
sqlDatabase: 'mydb',
|
|
47
|
+
sqlDbType: SqlDbType.mysql,
|
|
48
|
+
sqlTable: 't_user',
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// 查询列表
|
|
52
|
+
const result = await quick.findList({ condition: { status: 1 } });
|
|
53
|
+
console.log(result.rows, result.count);
|
|
54
|
+
|
|
55
|
+
// 分页查询
|
|
56
|
+
const page = await quick.findPage({
|
|
57
|
+
condition: { status: 1 },
|
|
58
|
+
pageNo: 1,
|
|
59
|
+
pageSize: 10,
|
|
60
|
+
orderBy: 'created_at DESC',
|
|
61
|
+
});
|
|
62
|
+
console.log(page.rows, page.totalCount);
|
|
63
|
+
|
|
64
|
+
// 插入
|
|
65
|
+
const insertResult = await quick.insert({
|
|
66
|
+
data: { name: '张三', age: 20 },
|
|
67
|
+
});
|
|
68
|
+
console.log(insertResult.insertId);
|
|
69
|
+
|
|
70
|
+
// 更新
|
|
71
|
+
await quick.update({
|
|
72
|
+
condition: { id: 1 },
|
|
73
|
+
data: { age: 21 },
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// 删除
|
|
77
|
+
await quick.delete({ condition: { id: 1 } });
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 方式二:ShardingCrudPro(分表场景)
|
|
81
|
+
|
|
82
|
+
适用于按时间、哈希分表的场景:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { ShardingType } from 'midway-fatcms';
|
|
86
|
+
|
|
87
|
+
const sharding = this.curdProService.getShardingCrud({
|
|
88
|
+
sqlDatabase: 'mydb',
|
|
89
|
+
sqlDbType: SqlDbType.mysql,
|
|
90
|
+
shardingConfig: {
|
|
91
|
+
type: ShardingType.MONTH, // 按月分表
|
|
92
|
+
baseTable: 't_order', // 基础表名
|
|
93
|
+
timeColumn: 'created_at', // 时间字段
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// 插入(自动路由到 t_order_202401)
|
|
98
|
+
await sharding.insert({
|
|
99
|
+
data: { order_id: '001', created_at: '2024-01-15' },
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// 分页查询(自动合并多表结果)
|
|
103
|
+
const page = await sharding.findPage({
|
|
104
|
+
condition: { status: 'paid' },
|
|
105
|
+
pageNo: 1,
|
|
106
|
+
pageSize: 10,
|
|
107
|
+
orderBy: 'created_at DESC', // 时间分表必须传
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 方式三:CurdMixService(关联填充)
|
|
112
|
+
|
|
113
|
+
适用于需要字典翻译、用户信息填充的场景:
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
const cfgModel = {
|
|
117
|
+
method: 'order.list',
|
|
118
|
+
sqlTable: 't_order',
|
|
119
|
+
sqlSimpleName: 'SIMPLE_QUERY_PAGE',
|
|
120
|
+
columnsRelation: [
|
|
121
|
+
// 订单状态字典翻译
|
|
122
|
+
{
|
|
123
|
+
relatedType: 'dict',
|
|
124
|
+
relatedCode: 'OrderStatusEnum',
|
|
125
|
+
sourceColumn: 'status',
|
|
126
|
+
targetColumns: [{ from: 'label', to: 'status_text' }],
|
|
127
|
+
},
|
|
128
|
+
// 创建者信息填充
|
|
129
|
+
{
|
|
130
|
+
relatedType: 'accountBasic',
|
|
131
|
+
sourceColumn: 'created_by',
|
|
132
|
+
targetColumns: [], // 使用默认映射
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const ctx = await this.curdMixService.executeCrudByCfg(
|
|
138
|
+
{ condition: {}, pageNo: 1, pageSize: 10, orderBy: 'created_at DESC' },
|
|
139
|
+
cfgModel
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
const { rows } = ctx.getResModelForQueryPage();
|
|
143
|
+
// rows 自动包含 status_text、created_by_nickname 等字段
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 常用配置
|
|
147
|
+
|
|
148
|
+
### 软删除
|
|
149
|
+
|
|
150
|
+
启用后,DELETE 操作会转为 UPDATE:
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
quick.setBaseCfgModel({
|
|
154
|
+
enableSoftDelete: true,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// 实际执行:UPDATE t_user SET deleted_at=?, deleted_by=? WHERE id=1
|
|
158
|
+
await quick.delete({ condition: { id: 1 } });
|
|
159
|
+
|
|
160
|
+
// 查询时自动追加 deleted_at = 0
|
|
161
|
+
const users = await quick.findList({ condition: { status: 1 } });
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 标准字段自动填充
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
quick.setBaseCfgModel({
|
|
168
|
+
enableStandardUpdateCfg: true,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// INSERT 自动填充:created_by, created_at, created_nickname 等
|
|
172
|
+
await quick.insert({ data: { name: '张三' } });
|
|
173
|
+
|
|
174
|
+
// UPDATE 自动填充:modified_by, modified_at 等
|
|
175
|
+
await quick.update({ condition: { id: 1 }, data: { age: 21 } });
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 条件查询示例
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// 简单条件
|
|
182
|
+
{ status: 'active' }
|
|
183
|
+
|
|
184
|
+
// 比较操作
|
|
185
|
+
{ age: { $gt: 18, $lt: 60 } }
|
|
186
|
+
{ score: { $gte: 60 } }
|
|
187
|
+
|
|
188
|
+
// 范围操作
|
|
189
|
+
{ id: { $in: [1, 2, 3] } }
|
|
190
|
+
{ amount: { $range: [100, 500] } }
|
|
191
|
+
|
|
192
|
+
// 模糊查询
|
|
193
|
+
{ name: { $like: '张%' } } // 前缀匹配
|
|
194
|
+
{ name: { $likeInclude: '张三' } } // 包含匹配
|
|
195
|
+
|
|
196
|
+
// NULL 判断
|
|
197
|
+
{ deleted_at: { $null: true } }
|
|
198
|
+
{ phone: { $notNull: true } }
|
|
199
|
+
|
|
200
|
+
// 逻辑组合
|
|
201
|
+
{
|
|
202
|
+
$and: [
|
|
203
|
+
{ status: 'active' },
|
|
204
|
+
{ $or: [{ level: 'vip' }, { amount: { $gte: 1000 } }] }
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 排序语法
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// 字符串格式
|
|
213
|
+
orderBy: 'created_at DESC'
|
|
214
|
+
orderBy: 'created_at DESC, amount ASC'
|
|
215
|
+
|
|
216
|
+
// 简写格式(+ 升序,- 降序)
|
|
217
|
+
orderBy: 'created_at-'
|
|
218
|
+
orderBy: 'age+,created_at-'
|
|
219
|
+
|
|
220
|
+
// 数组格式
|
|
221
|
+
orderBy: [
|
|
222
|
+
{ fieldName: 'created_at', orderType: 'DESC' },
|
|
223
|
+
{ fieldName: 'amount', orderType: 'ASC' },
|
|
224
|
+
]
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## 下一步
|
|
228
|
+
|
|
229
|
+
- [CrudProQuick 单表操作](./02-crud-quick.md) - 完整 API 参考
|
|
230
|
+
- [ShardingCrudPro 分表操作](./03-crud-sharding.md) - 分表路由详解
|
|
231
|
+
- [条件操作符大全](./04-condition-operators.md) - 所有支持的查询条件
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# CrudProQuick 单表操作
|
|
2
|
+
|
|
3
|
+
CrudProQuick 是在 CrudPro 之上封装的便捷操作层,提供简洁的 API 进行单表 CRUD 操作。
|
|
4
|
+
|
|
5
|
+
## 获取实例
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
const quick = this.curdProService.getQuickCrud({
|
|
9
|
+
sqlDatabase: 'mydb', // 数据库名(必填)
|
|
10
|
+
sqlDbType: SqlDbType.mysql, // 数据库类型(必填)
|
|
11
|
+
sqlTable: 't_user', // 表名(可选,调用时传入)
|
|
12
|
+
});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## API 总览
|
|
16
|
+
|
|
17
|
+
### 查询方法
|
|
18
|
+
|
|
19
|
+
| 方法 | 返回类型 | 说明 |
|
|
20
|
+
|------|----------|------|
|
|
21
|
+
| `findOne(req, table?)` | `CrudQueryOneResult<T>` | 查询单条(无顺序保证) |
|
|
22
|
+
| `findUniqueOne(req, table?)` | `CrudQueryOneResult<T>` | 唯一查询(多条报错) |
|
|
23
|
+
| `findList(req, table?)` | `CrudQueryListResult<T>` | 列表查询 |
|
|
24
|
+
| `findPage(req, table?)` | `CrudQueryPageResult<T>` | 分页查询 |
|
|
25
|
+
| `isExist(req, table?)` | `CrudExistResult` | 存在性判断 |
|
|
26
|
+
| `findCount(req, table?)` | `CrudCountResult` | 统计总数 |
|
|
27
|
+
| `findOneById(id, table?)` | `CrudQueryOneResult<T>` | 根据主键 ID 查询单条(多条报错) |
|
|
28
|
+
| `findListByIds(ids, table?)` | `CrudQueryListResult<T>` | 根据主键 ID 列表查询多条 |
|
|
29
|
+
|
|
30
|
+
### 写入方法
|
|
31
|
+
|
|
32
|
+
| 方法 | 返回类型 | 说明 |
|
|
33
|
+
|------|----------|------|
|
|
34
|
+
| `insert(req, table?)` | `CrudWriteResult` | 插入单条 |
|
|
35
|
+
| `batchInsert(req, table?)` | `CrudWriteResult` | 批量插入 |
|
|
36
|
+
| `update(req, table?)` | `CrudWriteResult` | 更新 |
|
|
37
|
+
| `delete(req, table?)` | `CrudWriteResult` | 删除 |
|
|
38
|
+
| `restore(req, table?)` | `CrudWriteResult` | 恢复软删除记录(重置 deleted_at/deleted_by) |
|
|
39
|
+
| `insertOrUpdate(req, table?)` | `CrudUpsertResult` | 先查再插/更 |
|
|
40
|
+
| `insertOnDuplicateUpdate(req, uniqueCols?, table?)` | `CrudWriteResult` | 原生 upsert |
|
|
41
|
+
|
|
42
|
+
### SQL 方法
|
|
43
|
+
|
|
44
|
+
| 方法 | 返回类型 | 说明 |
|
|
45
|
+
|------|----------|------|
|
|
46
|
+
| `executeSQL(sql, args?)` | `ExecuteSQLResult` | 框架封装 SQL |
|
|
47
|
+
| `executeNativeSQL<T>(sql, args?)` | `ExecuteSQLResult<T>` | 原生 SQL |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 查询方法详解
|
|
52
|
+
|
|
53
|
+
### findOne - 查询单条
|
|
54
|
+
|
|
55
|
+
返回第一条匹配记录,不保证顺序:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
const result = await quick.findOne({
|
|
59
|
+
condition: { status: 'active' },
|
|
60
|
+
orderBy: 'created_at DESC',
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
if (result.found) {
|
|
64
|
+
console.log(result.row);
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### findUniqueOne - 唯一查询
|
|
69
|
+
|
|
70
|
+
期望结果为 0 条或 1 条,多条时报错:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
const result = await quick.findUniqueOne({
|
|
74
|
+
condition: { email: 'user@example.com' },
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
if (result.found) {
|
|
78
|
+
console.log(result.row);
|
|
79
|
+
}
|
|
80
|
+
// 多条时抛出异常
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### findList - 列表查询
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
const result = await quick.findList({
|
|
87
|
+
condition: { status: 'active' },
|
|
88
|
+
orderBy: 'created_at DESC',
|
|
89
|
+
columns: ['id', 'name', 'email'],
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
console.log(result.rows, result.count);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### findPage - 分页查询
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
const page = await quick.findPage({
|
|
99
|
+
condition: { status: 'active' },
|
|
100
|
+
pageNo: 1,
|
|
101
|
+
pageSize: 20,
|
|
102
|
+
orderBy: 'created_at DESC',
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
console.log(page.rows, page.totalCount);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### isExist - 存在性判断
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
const result = await quick.isExist({
|
|
112
|
+
condition: { email: 'user@example.com' },
|
|
113
|
+
});
|
|
114
|
+
console.log(result.exists); // true / false
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### findCount - 统计总数
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const result = await quick.findCount({
|
|
121
|
+
condition: { status: 'active' },
|
|
122
|
+
});
|
|
123
|
+
console.log(result.count);
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### findOneById - 根据主键 ID 查询单条
|
|
127
|
+
|
|
128
|
+
等价于 `findUniqueOne({ condition: { id } })`,但更简洁。如果查询到多条记录会抛出异常。
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// 根据 ID 查询单条
|
|
132
|
+
const result = await quick.findOneById(1);
|
|
133
|
+
if (result.found) {
|
|
134
|
+
console.log(result.row);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 字符串 ID
|
|
138
|
+
const result = await quick.findOneById('ORD001', 't_order');
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### findListByIds - 根据主键 ID 列表查询多条
|
|
142
|
+
|
|
143
|
+
等价于 `findList({ condition: { id: { $in: ids } } })`,但更简洁。
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// 根据 ID 列表查询
|
|
147
|
+
const result = await quick.findListByIds([1, 2, 3]);
|
|
148
|
+
console.log(result.rows, result.count);
|
|
149
|
+
|
|
150
|
+
// 字符串 ID 列表
|
|
151
|
+
const result = await quick.findListByIds(['ORD001', 'ORD002'], 't_order');
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 写入方法详解
|
|
157
|
+
|
|
158
|
+
### insert - 插入单条
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
const result = await quick.insert({
|
|
162
|
+
data: { name: '张三', email: 'test@example.com', age: 25 },
|
|
163
|
+
});
|
|
164
|
+
console.log(result.insertId, result.affectedRows);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### batchInsert - 批量插入
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
const result = await quick.batchInsert({
|
|
171
|
+
data: [
|
|
172
|
+
{ name: '张三', age: 25 },
|
|
173
|
+
{ name: '李四', age: 30 },
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
console.log(result.affectedRows);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### update - 更新
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
const result = await quick.update({
|
|
183
|
+
condition: { id: 1 },
|
|
184
|
+
data: { name: '张三更新', age: 26 },
|
|
185
|
+
});
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### delete - 删除
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
const result = await quick.delete({
|
|
192
|
+
condition: { id: 1 },
|
|
193
|
+
});
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### restore - 恢复软删除
|
|
197
|
+
|
|
198
|
+
恢复已软删除的记录,将 `deleted_at` 重置为 0,`deleted_by` 重置为空字符串。需要启用软删除(`setBaseCfgModel({ enableSoftDelete: true })`)。
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
// 恢复指定 ID 的记录
|
|
202
|
+
await quick.restore({ condition: { id: 1 } });
|
|
203
|
+
|
|
204
|
+
// 恢复多条记录(使用 $in 操作符)
|
|
205
|
+
await quick.restore({ condition: { id: { $in: [1, 2, 3] } } });
|
|
206
|
+
|
|
207
|
+
// 按条件批量恢复记录
|
|
208
|
+
await quick.restore({ condition: { status: 'deleted' } });
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### insertOrUpdate - 先查再插/更
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
const result = await quick.insertOrUpdate({
|
|
215
|
+
condition: { email: 'test@example.com' },
|
|
216
|
+
data: { email: 'test@example.com', name: '用户' },
|
|
217
|
+
});
|
|
218
|
+
console.log(result.isExist ? '更新' : '插入');
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### insertOnDuplicateUpdate - 原生 Upsert
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
const result = await quick.insertOnDuplicateUpdate(
|
|
225
|
+
{ data: { id: 1, name: '用户' } },
|
|
226
|
+
['id'] // 唯一列,PostgreSQL/SQL Server 必填
|
|
227
|
+
);
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## SQL 方法详解
|
|
233
|
+
|
|
234
|
+
### executeNativeSQL - 原生 SQL
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
const users = await quick.executeNativeSQL<{ id: number; name: string }[]>(
|
|
238
|
+
'SELECT id, name FROM t_user WHERE age > ?',
|
|
239
|
+
[18]
|
|
240
|
+
);
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 配置方法
|
|
246
|
+
|
|
247
|
+
### setBaseCfgModel
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
quick.setBaseCfgModel({
|
|
251
|
+
enableSoftDelete: true, // 启用软删除(delete 设置 deleted_at/deleted_by,而非物理删除)
|
|
252
|
+
enableStandardUpdateCfg: true,
|
|
253
|
+
maxLimit: 10000,
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
启用软删除后,`delete` 操作会设置 `deleted_at`(当前时间戳)和 `deleted_by`(当前用户 ID),查询时自动过滤已删除记录。可通过 `restore` 方法恢复。
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 软删除
|
|
262
|
+
|
|
263
|
+
启用软删除后,数据不会被物理删除,而是标记删除状态:
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
const quick = this.curdProService.getQuickCrud({
|
|
267
|
+
sqlDatabase: 'mydb',
|
|
268
|
+
sqlDbType: SqlDbType.mysql,
|
|
269
|
+
sqlTable: 't_user',
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// 启用软删除
|
|
273
|
+
quick.setBaseCfgModel({ enableSoftDelete: true });
|
|
274
|
+
|
|
275
|
+
// 软删除(设置 deleted_at 和 deleted_by)
|
|
276
|
+
await quick.delete({ condition: { id: 1 } });
|
|
277
|
+
|
|
278
|
+
// 恢复软删除记录
|
|
279
|
+
await quick.restore({ condition: { id: 1 } });
|
|
280
|
+
|
|
281
|
+
// 查询时自动过滤 deleted_at != 0 的记录
|
|
282
|
+
const result = await quick.findList({ condition: { status: 'active' } });
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 返回类型
|
|
288
|
+
|
|
289
|
+
```typescript
|
|
290
|
+
// 写操作结果
|
|
291
|
+
interface CrudWriteResult {
|
|
292
|
+
affectedRows: number;
|
|
293
|
+
insertId?: string | number;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// 单条查询结果
|
|
297
|
+
interface CrudQueryOneResult<T> {
|
|
298
|
+
row: T | null;
|
|
299
|
+
found: boolean;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// 列表查询结果
|
|
303
|
+
interface CrudQueryListResult<T> {
|
|
304
|
+
rows: T[];
|
|
305
|
+
count: number;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// 分页查询结果
|
|
309
|
+
interface CrudQueryPageResult<T> {
|
|
310
|
+
rows: T[];
|
|
311
|
+
totalCount: number;
|
|
312
|
+
count: number;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// 存在性结果
|
|
316
|
+
interface CrudExistResult {
|
|
317
|
+
exists: boolean;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// 计数结果
|
|
321
|
+
interface CrudCountResult {
|
|
322
|
+
count: number;
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 实例复用
|
|
329
|
+
|
|
330
|
+
CrudProQuick **可以安全复用**:
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
const quick = this.curdProService.getQuickCrud({...});
|
|
334
|
+
await quick.findList({ condition: {...} });
|
|
335
|
+
await quick.insert({ data: {...} });
|
|
336
|
+
// 复用 OK!
|
|
337
|
+
```
|