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.
Files changed (121) hide show
  1. package/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
  2. package/.qoder/skills/midway-fatcms/02-crud-quick.md +337 -0
  3. package/.qoder/skills/midway-fatcms/03-crud-sharding.md +488 -0
  4. package/.qoder/skills/midway-fatcms/04-condition-operators.md +93 -0
  5. package/.qoder/skills/midway-fatcms/05-configuration.md +290 -0
  6. package/.qoder/skills/midway-fatcms/06-builtin-functions.md +241 -0
  7. package/.qoder/skills/midway-fatcms/07-examples.md +500 -0
  8. package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
  9. package/README.md +9 -9
  10. package/dist/controller/base/BaseApiController.d.ts +1 -2
  11. package/dist/controller/base/BaseApiController.js +0 -4
  12. package/dist/controller/gateway/DocGatewayController.js +1 -1
  13. package/dist/controller/manage/FlowConfigManageApi.js +4 -2
  14. package/dist/controller/manage/SysConfigMangeApi.js +6 -1
  15. package/dist/controller/manage/UserAccountManageApi.js +7 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +2 -2
  18. package/dist/libs/crud-pro/CrudPro.d.ts +23 -2
  19. package/dist/libs/crud-pro/CrudPro.js +53 -2
  20. package/dist/libs/crud-pro/interfaces.d.ts +82 -12
  21. package/dist/libs/crud-pro/models/CrudResult.d.ts +115 -0
  22. package/dist/libs/crud-pro/models/CrudResult.js +126 -0
  23. package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -38
  24. package/dist/libs/crud-pro/models/RequestModel.js +2 -99
  25. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
  26. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
  27. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +1 -2
  28. package/dist/libs/crud-pro/utils/OrderByUtils.d.ts +70 -0
  29. package/dist/libs/crud-pro/utils/OrderByUtils.js +158 -0
  30. package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +295 -0
  31. package/dist/libs/crud-pro-quick/CrudProQuick.js +529 -0
  32. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
  33. package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
  34. package/dist/libs/crud-pro-quick/index.d.ts +36 -0
  35. package/dist/libs/crud-pro-quick/index.js +49 -0
  36. package/dist/libs/crud-pro-quick/models.d.ts +33 -0
  37. package/dist/libs/crud-pro-quick/models.js +2 -0
  38. package/dist/libs/crud-sharding/ShardingConfig.d.ts +15 -2
  39. package/dist/libs/crud-sharding/ShardingConfig.js +2 -2
  40. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +119 -274
  41. package/dist/libs/crud-sharding/ShardingCrudPro.js +559 -379
  42. package/dist/libs/crud-sharding/ShardingMerger.d.ts +12 -20
  43. package/dist/libs/crud-sharding/ShardingMerger.js +36 -51
  44. package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
  45. package/dist/libs/crud-sharding/ShardingResult.js +16 -0
  46. package/dist/libs/crud-sharding/ShardingRouter.d.ts +1 -0
  47. package/dist/libs/crud-sharding/ShardingRouter.js +25 -6
  48. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
  49. package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
  50. package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
  51. package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
  52. package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  53. package/dist/libs/crud-sharding/index.d.ts +4 -3
  54. package/dist/libs/crud-sharding/index.js +14 -2
  55. package/dist/models/bizmodels.d.ts +2 -6
  56. package/dist/service/SysAppService.d.ts +2 -2
  57. package/dist/service/SysAppService.js +16 -5
  58. package/dist/service/SysConfigService.d.ts +1 -1
  59. package/dist/service/SysConfigService.js +7 -2
  60. package/dist/service/SysDictDataService.js +14 -4
  61. package/dist/service/SysMenuService.js +7 -2
  62. package/dist/service/curd/CurdMixService.d.ts +6 -4
  63. package/dist/service/curd/CurdMixService.js +16 -2
  64. package/dist/service/curd/CurdProService.d.ts +43 -27
  65. package/dist/service/curd/CurdProService.js +32 -33
  66. package/dist/service/flow/FlowConfigService.js +7 -2
  67. package/dist/service/flow/FlowInstanceCrudService.js +22 -19
  68. package/package.json +2 -1
  69. package/src/controller/base/BaseApiController.ts +0 -5
  70. package/src/controller/gateway/DocGatewayController.ts +1 -1
  71. package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
  72. package/src/controller/manage/FlowConfigManageApi.ts +4 -2
  73. package/src/controller/manage/SysConfigMangeApi.ts +6 -1
  74. package/src/controller/manage/UserAccountManageApi.ts +7 -2
  75. package/src/index.ts +2 -2
  76. package/src/libs/crud-pro/CrudPro.ts +62 -4
  77. package/src/libs/crud-pro/interfaces.ts +110 -15
  78. package/src/libs/crud-pro/models/CrudResult.ts +178 -0
  79. package/src/libs/crud-pro/models/RequestModel.ts +4 -110
  80. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
  81. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
  82. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +1 -2
  83. package/src/libs/crud-pro/utils/OrderByUtils.ts +169 -0
  84. package/src/libs/crud-pro-quick/CrudProQuick.ts +594 -0
  85. package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
  86. package/src/libs/crud-pro-quick/index.ts +52 -0
  87. package/src/libs/crud-pro-quick/models.ts +35 -0
  88. package/src/libs/crud-sharding/ShardingConfig.ts +18 -2
  89. package/src/libs/crud-sharding/ShardingCrudPro.ts +689 -440
  90. package/src/libs/crud-sharding/ShardingMerger.ts +47 -73
  91. package/src/libs/crud-sharding/ShardingResult.ts +29 -0
  92. package/src/libs/crud-sharding/ShardingRouter.ts +27 -6
  93. package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
  94. package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
  95. package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  96. package/src/libs/crud-sharding/index.ts +14 -3
  97. package/src/models/bizmodels.ts +4 -7
  98. package/src/service/SysAppService.ts +18 -7
  99. package/src/service/SysConfigService.ts +8 -3
  100. package/src/service/SysDictDataService.ts +14 -4
  101. package/src/service/SysMenuService.ts +7 -2
  102. package/src/service/crudstd/CrudStdService.ts +2 -2
  103. package/src/service/curd/CurdMixService.ts +26 -5
  104. package/src/service/curd/CurdProService.ts +58 -39
  105. package/src/service/flow/FlowConfigService.ts +7 -2
  106. package/src/service/flow/FlowInstanceCrudService.ts +23 -20
  107. package/dist/libs/crud-pro/README.md +0 -809
  108. package/dist/libs/crud-pro/README_FUNC.md +0 -193
  109. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  110. package/dist/models/StandardColumns.d.ts +0 -71
  111. package/dist/models/StandardColumns.js +0 -28
  112. package/dist/service/curd/CrudProQuick.d.ts +0 -190
  113. package/dist/service/curd/CrudProQuick.js +0 -319
  114. package/dist/service/curd/README.md +0 -1001
  115. package/dist/service/curd/fixSoftDelete.d.ts +0 -20
  116. package/src/libs/crud-pro/README.md +0 -809
  117. package/src/libs/crud-pro/README_FUNC.md +0 -193
  118. package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  119. package/src/models/StandardColumns.ts +0 -76
  120. package/src/service/curd/CrudProQuick.ts +0 -360
  121. package/src/service/curd/README.md +0 -1001
@@ -0,0 +1,500 @@
1
+ # 完整示例集
2
+
3
+ ## 基础查询
4
+
5
+ ```typescript
6
+ const quick = this.curdProService.getQuickCrud({
7
+ sqlDatabase: 'mydb',
8
+ sqlDbType: SqlDbType.mysql,
9
+ sqlTable: 't_order',
10
+ });
11
+
12
+ // 列表查询
13
+ const list = await quick.findList({
14
+ condition: { status: 'paid' },
15
+ orderBy: 'created_at DESC',
16
+ });
17
+
18
+ // 指定列查询
19
+ const list2 = await quick.findList({
20
+ condition: { status: 'paid' },
21
+ columns: ['id', 'order_no', 'amount'],
22
+ orderBy: 'created_at DESC',
23
+ });
24
+
25
+ // 分页查询
26
+ const page = await quick.findPage({
27
+ condition: { status: 'paid' },
28
+ pageNo: 1,
29
+ pageSize: 20,
30
+ orderBy: 'created_at DESC',
31
+ });
32
+ console.log(page.rows, page.totalCount);
33
+
34
+ // 查询单条(不保证唯一性)
35
+ const order = await quick.findOne({
36
+ condition: { order_no: 'ORD001' },
37
+ });
38
+
39
+ // 唯一查询(多条时报错,推荐用于唯一索引)
40
+ const order2 = await quick.findUniqueOne({
41
+ condition: { order_no: 'ORD001' },
42
+ });
43
+
44
+ // 根据主键 ID 查询单条(内部使用 findUniqueOne)
45
+ const order3 = await quick.findOneById(1);
46
+ const order4 = await quick.findOneById('ORD001'); // 字符串 ID
47
+
48
+ // 根据主键 ID 列表查询多条
49
+ const orders = await quick.findListByIds([1, 2, 3]);
50
+ const orders2 = await quick.findListByIds(['ORD001', 'ORD002']);
51
+
52
+ // 存在性判断
53
+ const exists = await quick.isExist({
54
+ condition: { email: 'test@example.com' },
55
+ });
56
+
57
+ // 统计总数
58
+ const count = await quick.findCount({
59
+ condition: { status: 'paid' },
60
+ });
61
+ console.log(count.count);
62
+ ```
63
+
64
+ ## 条件查询
65
+
66
+ ```typescript
67
+ // 比较操作
68
+ const adults = await quick.findList({
69
+ condition: { age: { $gt: 18, $lt: 60 } },
70
+ orderBy: 'age ASC',
71
+ });
72
+
73
+ // 大于等于 / 小于等于
74
+ const recentOrders = await quick.findList({
75
+ condition: {
76
+ created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-12-31 23:59:59' },
77
+ },
78
+ orderBy: 'created_at DESC',
79
+ });
80
+
81
+ // 不等于
82
+ const activeUsers = await quick.findList({
83
+ condition: { status: { $ne: 'deleted' } },
84
+ orderBy: 'id ASC',
85
+ });
86
+
87
+ // IN 查询
88
+ const selectedOrders = await quick.findList({
89
+ condition: { id: { $in: [1, 2, 3, 4, 5] } },
90
+ orderBy: 'id ASC',
91
+ });
92
+
93
+ // NOT IN 查询
94
+ const otherTypes = await quick.findList({
95
+ condition: { type: { $nin: ['test', 'demo'] } },
96
+ orderBy: 'id ASC',
97
+ });
98
+
99
+ // 范围查询(BETWEEN ... AND)
100
+ const midRange = await quick.findList({
101
+ condition: { amount: { $range: [100, 500] } },
102
+ orderBy: 'amount DESC',
103
+ });
104
+
105
+ // 前缀匹配(LIKE '张%')
106
+ const zhangUsers = await quick.findList({
107
+ condition: { name: { $like: '张' } },
108
+ orderBy: 'name ASC',
109
+ });
110
+
111
+ // 包含匹配(LIKE '%张三%')
112
+ const containsName = await quick.findList({
113
+ condition: { name: { $likeInclude: '张三' } },
114
+ orderBy: 'name ASC',
115
+ });
116
+
117
+ // NULL 判断
118
+ const noPhone = await quick.findList({
119
+ condition: { phone: { $null: true } },
120
+ orderBy: 'id ASC',
121
+ });
122
+ const hasPhone = await quick.findList({
123
+ condition: { phone: { $notNull: true } },
124
+ orderBy: 'id ASC',
125
+ });
126
+
127
+ // 逻辑或(OR)
128
+ const pendingOrPaid = await quick.findList({
129
+ condition: {
130
+ $or: [{ status: 'pending' }, { status: 'paid' }],
131
+ },
132
+ orderBy: 'created_at DESC',
133
+ });
134
+
135
+ // 逻辑与(AND)+ 嵌套 OR
136
+ const complexCondition = await quick.findList({
137
+ condition: {
138
+ $and: [
139
+ { department: 'tech' },
140
+ { $or: [{ level: 'senior' }, { years: { $gte: 5 } }] },
141
+ ],
142
+ },
143
+ orderBy: 'years DESC',
144
+ });
145
+
146
+ // 多条件组合
147
+ const results = await quick.findList({
148
+ condition: {
149
+ status: 'active',
150
+ age: { $gte: 18 },
151
+ city: { $in: ['北京', '上海', '深圳'] },
152
+ phone: { $notNull: true },
153
+ },
154
+ orderBy: 'created_at DESC',
155
+ columns: ['id', 'name', 'age', 'city'],
156
+ });
157
+ ```
158
+
159
+ ## 写入操作
160
+
161
+ ```typescript
162
+ // 插入单条
163
+ const result = await quick.insert({
164
+ data: { order_no: 'ORD001', amount: 199.99, status: 'pending' },
165
+ });
166
+ console.log(result.insertId, result.affectedRows);
167
+
168
+ // 批量插入
169
+ const batchResult = await quick.batchInsert({
170
+ data: [
171
+ { order_no: '001', amount: 100 },
172
+ { order_no: '002', amount: 200 },
173
+ { order_no: '003', amount: 300 },
174
+ ],
175
+ });
176
+ console.log(batchResult.affectedRows);
177
+
178
+ // 更新
179
+ await quick.update({
180
+ condition: { id: 1 },
181
+ data: { status: 'completed', amount: 299.99 },
182
+ });
183
+
184
+ // 删除
185
+ await quick.delete({ condition: { id: 1 } });
186
+
187
+ // 先查再插/更(insertOrUpdate)
188
+ const upsertResult = await quick.insertOrUpdate({
189
+ condition: { email: 'test@example.com' },
190
+ data: { email: 'test@example.com', name: '用户', age: 25 },
191
+ });
192
+ console.log(upsertResult.isExist ? '已更新' : '已插入');
193
+
194
+ // 原生 upsert(单条 SQL 完成)
195
+ await quick.insertOnDuplicateUpdate(
196
+ { data: { id: 1, name: '用户', age: 25 } },
197
+ ['id'] // 唯一列,PostgreSQL/SQL Server 必填
198
+ );
199
+ ```
200
+
201
+ ## 软删除与恢复
202
+
203
+ ```typescript
204
+ quick.setBaseCfgModel({
205
+ enableSoftDelete: true,
206
+ });
207
+
208
+ // 软删除(实际执行 UPDATE ... SET deleted_at=时间戳, deleted_by=用户ID)
209
+ await quick.delete({ condition: { id: 1 } });
210
+
211
+ // 查询时自动过滤 deleted_at != 0 的记录
212
+ const activeUsers = await quick.findList({
213
+ condition: { status: 'active' },
214
+ });
215
+
216
+ // 恢复软删除的记录(重置 deleted_at=0, deleted_by='')
217
+ await quick.restore({ condition: { id: 1 } });
218
+
219
+ // 批量恢复
220
+ await quick.restore({ condition: { id: { $in: [1, 2, 3] } } });
221
+
222
+ // 按条件批量恢复
223
+ await quick.restore({ condition: { status: 'deleted' } });
224
+ ```
225
+
226
+ ## 标准字段自动填充
227
+
228
+ ```typescript
229
+ quick.setBaseCfgModel({
230
+ enableStandardUpdateCfg: true,
231
+ });
232
+
233
+ // INSERT 自动填充:created_by, created_at, created_nickname 等
234
+ await quick.insert({ data: { name: '张三', age: 20 } });
235
+
236
+ // UPDATE 自动填充:modified_by, modified_at 等
237
+ await quick.update({
238
+ condition: { id: 1 },
239
+ data: { age: 21 },
240
+ });
241
+ ```
242
+
243
+ ## 分表操作 - 时间分表
244
+
245
+ ```typescript
246
+ import { ShardingType } from 'midway-fatcms';
247
+
248
+ // ============ 按月分表 ============
249
+ const sharding = this.curdProService.getShardingCrud({
250
+ sqlDatabase: 'mydb',
251
+ sqlDbType: SqlDbType.mysql,
252
+ shardingConfig: {
253
+ type: ShardingType.MONTH,
254
+ baseTable: 't_order',
255
+ timeColumn: 'created_at',
256
+ autoCreateTable: true,
257
+ },
258
+ });
259
+ sharding.setBaseCfg({
260
+ sqlDatabase: 'mydb',
261
+ sqlDbType: SqlDbType.mysql,
262
+ });
263
+
264
+ // 插入(自动路由到 t_order_202401)
265
+ await sharding.insert({
266
+ data: { order_id: '001', amount: 100, created_at: '2024-01-15' },
267
+ });
268
+
269
+ // 批量插入(自动按月分组并行写入)
270
+ const batchResult = await sharding.batchInsert({
271
+ data: [
272
+ { order_id: '001', created_at: '2024-01-15' },
273
+ { order_id: '002', created_at: '2024-02-10' },
274
+ { order_id: '003', created_at: '2024-03-05' },
275
+ ],
276
+ });
277
+ console.log(batchResult.totalAffected, batchResult.tableCount);
278
+
279
+ // 更新(condition 必须包含 timeColumn)
280
+ await sharding.update({
281
+ condition: { order_id: '001', created_at: '2024-01-15' },
282
+ data: { status: 'shipped' },
283
+ });
284
+
285
+ // 删除(condition 必须包含 timeColumn)
286
+ await sharding.delete({
287
+ condition: { order_id: '001', created_at: '2024-01-15' },
288
+ });
289
+
290
+ // 分页查询(必须传 orderBy,时间分表必须是 timeColumn DESC/ASC)
291
+ const page = await sharding.findPage({
292
+ condition: {
293
+ status: 'paid',
294
+ created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-03-31 23:59:59' },
295
+ },
296
+ pageNo: 1,
297
+ pageSize: 10,
298
+ orderBy: 'created_at DESC',
299
+ });
300
+
301
+ // 列表查询(跨分表自动合并)
302
+ const list = await sharding.findList({
303
+ condition: {
304
+ created_at: { $gte: '2024-01-01 00:00:00', $lte: '2024-06-30 23:59:59' },
305
+ },
306
+ orderBy: 'created_at DESC',
307
+ });
308
+
309
+ // 无时间条件查询(自动查最近 N 张表,默认 MONTH=3)
310
+ const recentOrders = await sharding.findList({
311
+ condition: { status: 'paid' },
312
+ orderBy: 'created_at DESC',
313
+ });
314
+
315
+ // ============ 按年分表 ============
316
+ const yearlySharding = this.curdProService.getShardingCrud({
317
+ sqlDatabase: 'mydb',
318
+ sqlDbType: SqlDbType.mysql,
319
+ shardingConfig: {
320
+ type: ShardingType.YEAR,
321
+ baseTable: 't_log',
322
+ timeColumn: 'log_date',
323
+ recentTableCount: 5, // 查询最近5年
324
+ },
325
+ });
326
+
327
+ // ============ 按日分表 ============
328
+ const dailySharding = this.curdProService.getShardingCrud({
329
+ sqlDatabase: 'mydb',
330
+ sqlDbType: SqlDbType.mysql,
331
+ shardingConfig: {
332
+ type: ShardingType.DAY,
333
+ baseTable: 't_access_log',
334
+ timeColumn: 'access_time',
335
+ recentTableCount: 30, // 查询最近30天
336
+ },
337
+ });
338
+ ```
339
+
340
+ ## 分表操作 - 哈希分表
341
+
342
+ ```typescript
343
+ const hashSharding = this.curdProService.getShardingCrud({
344
+ sqlDatabase: 'mydb',
345
+ sqlDbType: SqlDbType.mysql,
346
+ shardingConfig: {
347
+ type: ShardingType.HASH,
348
+ baseTable: 't_user',
349
+ shardingColumn: 'user_id',
350
+ tableCount: 16, // t_user_01 ~ t_user_16
351
+ },
352
+ });
353
+ hashSharding.setBaseCfg({
354
+ sqlDatabase: 'mydb',
355
+ sqlDbType: SqlDbType.mysql,
356
+ });
357
+
358
+ // 插入(根据 user_id 哈希路由到对应分表)
359
+ await hashSharding.insert({
360
+ data: { user_id: 10001, name: '张三' },
361
+ });
362
+
363
+ // 查询单个用户(根据 user_id 确定分表)
364
+ const user = await hashSharding.findOne({
365
+ condition: { user_id: 10001 },
366
+ });
367
+
368
+ // 全表扫描(无 user_id 时扫描所有分表,必须传 orderBy)
369
+ const allActiveUsers = await hashSharding.findList({
370
+ condition: { status: 'active' },
371
+ orderBy: 'user_id ASC',
372
+ });
373
+ ```
374
+
375
+ ## 分表 + 软删除
376
+
377
+ ```typescript
378
+ const sharding = this.curdProService
379
+ .getShardingCrud({
380
+ sqlDatabase: 'mydb',
381
+ sqlDbType: SqlDbType.mysql,
382
+ shardingConfig: {
383
+ type: ShardingType.MONTH,
384
+ baseTable: 't_order',
385
+ timeColumn: 'created_at',
386
+ },
387
+ })
388
+ .setBaseCfg({
389
+ sqlDatabase: 'mydb',
390
+ sqlDbType: SqlDbType.mysql,
391
+ enableSoftDelete: true,
392
+ });
393
+
394
+ // 软删除
395
+ await sharding.delete({
396
+ condition: { order_id: '001', created_at: '2024-03-15' },
397
+ });
398
+
399
+ // 恢复软删除
400
+ await sharding.restore({
401
+ condition: { order_id: '001', created_at: '2024-03-15' },
402
+ });
403
+ ```
404
+
405
+ ## 原生 SQL
406
+
407
+ ```typescript
408
+ const quick = this.curdProService.getQuickCrud({
409
+ sqlDatabase: 'mydb',
410
+ sqlDbType: SqlDbType.mysql,
411
+ sqlTable: 't_order',
412
+ });
413
+
414
+ // 框架封装 SQL(参数绑定,更安全)
415
+ const result = await quick.executeSQL(
416
+ 'SELECT COUNT(*) as cnt FROM t_order WHERE status = ?',
417
+ ['completed']
418
+ );
419
+
420
+ // 原生 SQL(直接执行,支持泛型)
421
+ const stats = await quick.executeNativeSQL<{ cnt: number }>(
422
+ 'SELECT COUNT(*) as cnt FROM t_order WHERE status = ?',
423
+ ['completed']
424
+ );
425
+ ```
426
+
427
+ ## 链式配置
428
+
429
+ ```typescript
430
+ // CrudProQuick 链式配置
431
+ const quick = this.curdProService.getQuickCrud({
432
+ sqlDatabase: 'mydb',
433
+ sqlDbType: SqlDbType.mysql,
434
+ sqlTable: 't_user',
435
+ });
436
+ quick.setBaseCfgModel({
437
+ enableSoftDelete: true,
438
+ enableStandardUpdateCfg: true,
439
+ maxLimit: 5000,
440
+ });
441
+
442
+ // ShardingCrudPro 链式配置
443
+ const sharding = this.curdProService
444
+ .getShardingCrud({
445
+ sqlDatabase: 'mydb',
446
+ sqlDbType: SqlDbType.mysql,
447
+ shardingConfig: {
448
+ type: ShardingType.MONTH,
449
+ baseTable: 't_order',
450
+ timeColumn: 'created_at',
451
+ autoCreateTable: true,
452
+ recentTableCount: 6,
453
+ },
454
+ })
455
+ .setBaseCfg({
456
+ sqlDatabase: 'mydb',
457
+ sqlDbType: SqlDbType.mysql,
458
+ enableSoftDelete: true,
459
+ });
460
+ ```
461
+
462
+ ## 关联数据填充
463
+
464
+ ```typescript
465
+ const cfgModel = {
466
+ method: 'order.list',
467
+ sqlTable: 't_order',
468
+ sqlSimpleName: 'SIMPLE_QUERY_PAGE',
469
+ columnsRelation: [
470
+ // 字典翻译
471
+ {
472
+ relatedType: 'dict',
473
+ relatedCode: 'OrderStatusEnum',
474
+ sourceColumn: 'status',
475
+ targetColumns: [{ from: 'label', to: 'status_text' }],
476
+ },
477
+ // 用户信息填充
478
+ {
479
+ relatedType: 'accountBasic',
480
+ sourceColumn: 'created_by',
481
+ targetColumns: [],
482
+ },
483
+ // 站点信息填充
484
+ {
485
+ relatedType: 'workbenchBasic',
486
+ sourceColumn: 'workbench_code',
487
+ targetColumns: [
488
+ { from: 'workbench_name', to: 'site_name' },
489
+ ],
490
+ },
491
+ ],
492
+ };
493
+
494
+ const ctx = await this.curdMixService.executeCrudByCfg(
495
+ { condition: {}, pageNo: 1, pageSize: 10, orderBy: 'created_at DESC' },
496
+ cfgModel
497
+ );
498
+ const { rows } = ctx.getResModelForQueryPage();
499
+ // rows 自动包含 status_text、created_by_nickname、site_name 等字段
500
+ ```
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: midway-fatcms
3
+ description: >-
4
+ midway-fatcms 是一个功能完善的 CMS 服务端框架,提供数据库 CRUD 操作、分表查询、
5
+ 数据关联填充、权限验证等能力。支持 MySQL、PostgreSQL、SQL Server。
6
+ 当用户需要执行数据库操作、分表查询、字典翻译、用户信息填充时使用本 Skill。
7
+ ---
8
+
9
+ # midway-fatcms SDK 使用指南
10
+
11
+ ## 简介
12
+
13
+ midway-fatcms 提供三个层次的 CRUD 操作能力:
14
+
15
+ | 层次 | 类名 | 用途 | 获取方式 |
16
+ |------|------|------|---------|
17
+ | **便捷层** | `CrudProQuick` | 单表快速操作 | `curdProService.getQuickCrud()` |
18
+ | **分表层** | `ShardingCrudPro` | 自动路由分表 | `curdProService.getShardingCrud()` |
19
+ | **协调层** | `CurdMixService` | 带关联数据填充 | `curdMixService.executeCrud()` |
20
+
21
+ ## 章节导航
22
+
23
+ | 章节 | 内容 | 适用场景 |
24
+ |------|------|---------|
25
+ | [01-quick-start](./01-quick-start.md) | 快速入门、安装配置 | 首次使用 |
26
+ | [02-crud-quick](./02-crud-quick.md) | CrudProQuick 单表操作 | 基础增删改查 |
27
+ | [03-crud-sharding](./03-crud-sharding.md) | ShardingCrudPro 分表操作 | 分库分表场景 |
28
+ | [04-condition-operators](./04-condition-operators.md) | 条件操作符大全 | 复杂查询条件 |
29
+ | [05-configuration](./05-configuration.md) | 配置模型、返回类型 | 高级配置 |
30
+ | [06-builtin-functions](./06-builtin-functions.md) | 内置函数参考 | 自动字段填充 |
31
+ | [07-examples](./07-examples.md) | 完整示例集 | 参考实现 |
32
+
33
+ ## 快速开始
34
+
35
+ ```typescript
36
+ import { Provide, Inject } from '@midwayjs/core';
37
+ import { CurdProService, SqlDbType } from 'midway-fatcms';
38
+
39
+ @Provide()
40
+ export class OrderService {
41
+ @Inject()
42
+ curdProService: CurdProService;
43
+
44
+ async getOrders() {
45
+ // 1. 获取 CrudProQuick 实例
46
+ const quick = this.curdProService.getQuickCrud({
47
+ sqlDatabase: 'mydb',
48
+ sqlDbType: SqlDbType.mysql,
49
+ sqlTable: 't_order',
50
+ });
51
+
52
+ // 2. 分页查询
53
+ const page = await quick.findPage({
54
+ condition: { status: 'paid' },
55
+ pageNo: 1,
56
+ pageSize: 20,
57
+ orderBy: 'created_at DESC',
58
+ });
59
+
60
+ return {
61
+ list: page.rows,
62
+ total: page.totalCount,
63
+ };
64
+ }
65
+ }
66
+ ```
67
+
68
+ ## 核心特性
69
+
70
+ - ✅ **三种数据库**:MySQL、PostgreSQL、SQL Server
71
+ - ✅ **类型安全**:完整的 TypeScript 类型支持
72
+ - ✅ **软删除**:自动将 DELETE 转为 UPDATE
73
+ - ✅ **标准字段填充**:自动填充 created_by、modified_by 等
74
+ - ✅ **分表路由**:时间分表、哈希分表、范围分表
75
+ - ✅ **数据关联**:字典翻译、用户信息填充
76
+ - ✅ **原生 SQL**:支持执行自定义 SQL 语句
77
+
78
+ ## 实例复用规则
79
+
80
+ | 类 | 是否可复用 | 原因 |
81
+ |----|-----------|------|
82
+ | `CrudPro` | ❌ 禁止复用 | 有状态执行器,内部 Context 会累积 |
83
+ | `CrudProQuick` | ✅ 可复用 | 内部每次获取新 CrudPro |
84
+ | `ShardingCrudPro` | ✅ 可复用 | 内部每次获取新 CrudPro |
85
+
86
+ ```typescript
87
+ // ✅ CrudProQuick 可复用
88
+ const quick = this.curdProService.getQuickCrud({...});
89
+ await quick.findList({ condition: {...} });
90
+ await quick.insert({ data: {...} }); // 复用 OK
91
+
92
+ // ❌ CrudPro 禁止复用
93
+ const crudPro = new CrudPro();
94
+ await crudPro.executeCrudByCfg(req1, cfg1);
95
+ // 禁止再次使用同一个 crudPro 实例!
96
+ ```
package/README.md CHANGED
@@ -102,7 +102,7 @@ const ctx = await crudPro.executeCrudByCfg(reqJson, cfgJson);
102
102
  const { rows, total_count } = ctx.getResModelForQueryPage();
103
103
  ```
104
104
 
105
- > Full CRUD-Pro documentation: [src/libs/crud-pro/README.md](src/libs/crud-pro/README.md) · Built-in Functions: [src/libs/crud-pro/README_FUNC.md](src/libs/crud-pro/README_FUNC.md)
105
+ > Full CRUD-Pro documentation: [src/libs/crud-pro/README.md](doc/skills/CrudPro使用指南.md) · Built-in Functions: [src/libs/crud-pro/README_FUNC.md](doc/skills/CrudPro内置函数参考.md)
106
106
 
107
107
  ---
108
108
 
@@ -155,7 +155,7 @@ const page = await sharding.queryPage({
155
155
  });
156
156
  ```
157
157
 
158
- > Full Sharding documentation: [src/libs/crud-sharding/ROUTING_LOGIC.md](src/libs/crud-sharding/ROUTING_LOGIC.md)
158
+ > Full Sharding documentation: [src/libs/crud-sharding/ROUTING_LOGIC.md](doc/skills/分表CRUD使用指南.md)
159
159
 
160
160
  ---
161
161
 
@@ -408,7 +408,7 @@ Business Code
408
408
  └── fixSoftDelete() → Soft delete handling
409
409
  ```
410
410
 
411
- > Full service layer documentation: [src/service/curd/README.md](src/service/curd/README.md)
411
+ > Full service layer documentation: [src/service/curd/README.md](doc/skills/Curd服务层.md)
412
412
 
413
413
  ---
414
414
 
@@ -433,7 +433,7 @@ const result = await quick.insertObject({ data: { name: 'Alice', email: 'a@b.com
433
433
  const batch = await quick.batchInsert({ data: [{ name: 'A' }, { name: 'B' }] });
434
434
  const updated = await quick.updateObject({ condition: { id: 1 }, data: { name: 'Bob' } });
435
435
  const deleted = await quick.deleteObject({ condition: { id: 1 } });
436
- const upserted = await quick.insertOnDuplicate({ data: { id: 1, name: 'A' } }, ['id']);
436
+ const upserted = await quick.insertOnDuplicateUpdate({ data: { id: 1, name: 'A' } }, ['id']);
437
437
 
438
438
  // Raw SQL
439
439
  const rows = await quick.executeSQL('SELECT * FROM t_user WHERE status = ?', ['active']);
@@ -499,7 +499,7 @@ CrudPro provides 30+ built-in functions for `updateCfg`, `validateCfg`, `execute
499
499
 
500
500
  **Type Check:** `isBasicType`, `isBoolean`, `isString`, `isInteger`, `isNumber`, `isNumeric`, `isValidName`, `isChinesePhone`, `isEmailStrValid`, `pickNumber`
501
501
 
502
- > Full function reference: [src/libs/crud-pro/README_FUNC.md](src/libs/crud-pro/README_FUNC.md)
502
+ > Full function reference: [src/libs/crud-pro/README_FUNC.md](doc/skills/CrudPro内置函数参考.md)
503
503
 
504
504
  ### Soft Delete
505
505
 
@@ -656,10 +656,10 @@ http://127.0.0.1:7002/ns/api/helpers/cryptoAes128CBC?input=123
656
656
 
657
657
  | Document | Description |
658
658
  |----------|-------------|
659
- | [CRUD-Pro Guide](src/libs/crud-pro/README.md) | Configuration-driven CRUD operations, validation, permissions |
660
- | [Built-in Functions](src/libs/crud-pro/README_FUNC.md) | 30+ functions: date, compare, utility, type check |
661
- | [Service Layer Guide](src/service/curd/README.md) | Context injection, soft delete, quick CRUD, sharding, relations |
662
- | [Sharding Routing Logic](src/libs/crud-sharding/ROUTING_LOGIC.md) | Shard strategies, cross-shard pagination, COUNT cache |
659
+ | [CRUD-Pro Guide](doc/skills/CrudPro使用指南.md) | Configuration-driven CRUD operations, validation, permissions |
660
+ | [Built-in Functions](doc/skills/CrudPro内置函数参考.md) | 30+ functions: date, compare, utility, type check |
661
+ | [Service Layer Guide](doc/skills/Curd服务层.md) | Context injection, soft delete, quick CRUD, sharding, relations |
662
+ | [Sharding Routing Logic](doc/skills/分表CRUD使用指南.md) | Shard strategies, cross-shard pagination, COUNT cache |
663
663
 
664
664
  ---
665
665
 
@@ -33,7 +33,7 @@ export declare class BaseApiController extends BaseService {
33
33
  */
34
34
  protected checkUserActionTimeLimit(actionCode: string, limitSecond?: number): Promise<void>;
35
35
  protected getUserSessionInfo(): import("../../models/userSession").ISessionInfo;
36
- executeSysSQL(executeSql: string, executeSqlArgs: any[]): Promise<any>;
36
+ executeSysSQL(executeSql: string, executeSqlArgs: any[]): Promise<import("../../libs/crud-pro/interfaces").ExecuteSQLResult<Record<string, any>>>;
37
37
  /**
38
38
  * 查询sys表中的SQL语句。sys表的表结构都是标准的。
39
39
  * @param sqlTable
@@ -42,7 +42,6 @@ export declare class BaseApiController extends BaseService {
42
42
  * @protected
43
43
  */
44
44
  protected executeSysSimpleSQL(sqlTable: string, sqlSimpleName: KeysOfSimpleSQL, extParams?: IExecuteSimpleSqlParams): Promise<import("../../libs/crud-pro/models/ExecuteContext").ExecuteContext>;
45
- protected get sysDBUtil(): import("../..").CrudProQuick;
46
45
  private addAccountBasicInfoCfgModel;
47
46
  private addWorkbenchBasicInfoCfgModel;
48
47
  protected decodeBodyBySession<T>(body: any): Promise<any>;
@@ -89,10 +89,6 @@ let BaseApiController = class BaseApiController extends BaseService_1.BaseServic
89
89
  }
90
90
  return await this.curdMixService.executeCrudByCfg(body, cfgModel);
91
91
  }
92
- get sysDBUtil() {
93
- const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
94
- return this.curdMixService.getBbUtil(SystemDbName, SystemDbType);
95
- }
96
92
  addAccountBasicInfoCfgModel(cfgModel) {
97
93
  let columnsRelation = cfgModel.columnsRelation;
98
94
  if (!columnsRelation) {
@@ -106,7 +106,7 @@ let DocGatewayController = class DocGatewayController extends BaseApiController_
106
106
  condition: {
107
107
  doc_lib_id: parseInt(docLibId),
108
108
  doc_category_code: {
109
- $notNull: '',
109
+ $notNull: true,
110
110
  },
111
111
  },
112
112
  }, {