midway-fatcms 0.0.7 → 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 (120) 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 -2
  24. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
  25. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
  26. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +1 -2
  27. package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +295 -0
  28. package/dist/libs/crud-pro-quick/CrudProQuick.js +529 -0
  29. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
  30. package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
  31. package/dist/libs/crud-pro-quick/index.d.ts +36 -0
  32. package/dist/libs/crud-pro-quick/index.js +49 -0
  33. package/dist/libs/crud-pro-quick/models.d.ts +33 -0
  34. package/dist/libs/crud-pro-quick/models.js +2 -0
  35. package/dist/libs/crud-sharding/ShardingConfig.d.ts +15 -2
  36. package/dist/libs/crud-sharding/ShardingConfig.js +2 -2
  37. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +119 -274
  38. package/dist/libs/crud-sharding/ShardingCrudPro.js +544 -340
  39. package/dist/libs/crud-sharding/ShardingMerger.d.ts +10 -18
  40. package/dist/libs/crud-sharding/ShardingMerger.js +27 -44
  41. package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
  42. package/dist/libs/crud-sharding/ShardingResult.js +16 -0
  43. package/dist/libs/crud-sharding/ShardingRouter.d.ts +1 -0
  44. package/dist/libs/crud-sharding/ShardingRouter.js +25 -6
  45. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
  46. package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
  47. package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
  48. package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
  49. package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  50. package/dist/libs/crud-sharding/index.d.ts +4 -3
  51. package/dist/libs/crud-sharding/index.js +14 -2
  52. package/dist/models/bizmodels.d.ts +2 -6
  53. package/dist/service/SysAppService.d.ts +2 -2
  54. package/dist/service/SysAppService.js +16 -5
  55. package/dist/service/SysConfigService.d.ts +1 -1
  56. package/dist/service/SysConfigService.js +7 -2
  57. package/dist/service/SysDictDataService.js +14 -4
  58. package/dist/service/SysMenuService.js +7 -2
  59. package/dist/service/curd/CurdMixService.d.ts +6 -4
  60. package/dist/service/curd/CurdMixService.js +16 -2
  61. package/dist/service/curd/CurdProService.d.ts +43 -27
  62. package/dist/service/curd/CurdProService.js +32 -33
  63. package/dist/service/flow/FlowConfigService.js +7 -2
  64. package/dist/service/flow/FlowInstanceCrudService.js +22 -19
  65. package/package.json +1 -1
  66. package/src/controller/base/BaseApiController.ts +0 -5
  67. package/src/controller/gateway/DocGatewayController.ts +1 -1
  68. package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
  69. package/src/controller/manage/FlowConfigManageApi.ts +4 -2
  70. package/src/controller/manage/SysConfigMangeApi.ts +6 -1
  71. package/src/controller/manage/UserAccountManageApi.ts +7 -2
  72. package/src/index.ts +2 -2
  73. package/src/libs/crud-pro/CrudPro.ts +62 -4
  74. package/src/libs/crud-pro/interfaces.ts +110 -15
  75. package/src/libs/crud-pro/models/CrudResult.ts +178 -0
  76. package/src/libs/crud-pro/models/RequestModel.ts +2 -2
  77. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
  78. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
  79. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +1 -2
  80. package/src/libs/crud-pro-quick/CrudProQuick.ts +594 -0
  81. package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
  82. package/src/libs/crud-pro-quick/index.ts +52 -0
  83. package/src/libs/crud-pro-quick/models.ts +35 -0
  84. package/src/libs/crud-sharding/ShardingConfig.ts +18 -2
  85. package/src/libs/crud-sharding/ShardingCrudPro.ts +660 -390
  86. package/src/libs/crud-sharding/ShardingMerger.ts +35 -63
  87. package/src/libs/crud-sharding/ShardingResult.ts +29 -0
  88. package/src/libs/crud-sharding/ShardingRouter.ts +27 -6
  89. package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
  90. package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
  91. package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  92. package/src/libs/crud-sharding/index.ts +14 -3
  93. package/src/models/bizmodels.ts +4 -7
  94. package/src/service/SysAppService.ts +18 -7
  95. package/src/service/SysConfigService.ts +8 -3
  96. package/src/service/SysDictDataService.ts +14 -4
  97. package/src/service/SysMenuService.ts +7 -2
  98. package/src/service/crudstd/CrudStdService.ts +2 -2
  99. package/src/service/curd/CurdMixService.ts +26 -5
  100. package/src/service/curd/CurdProService.ts +58 -39
  101. package/src/service/flow/FlowConfigService.ts +7 -2
  102. package/src/service/flow/FlowInstanceCrudService.ts +23 -20
  103. package/.qoder/skills/midway-fatcms-crud/SKILL.md +0 -375
  104. package/.qoder/skills/midway-fatcms-crud/examples.md +0 -990
  105. package/.qoder/skills/midway-fatcms-crud/reference.md +0 -568
  106. package/dist/libs/crud-pro/README.md +0 -809
  107. package/dist/libs/crud-pro/README_FUNC.md +0 -193
  108. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  109. package/dist/models/StandardColumns.d.ts +0 -71
  110. package/dist/models/StandardColumns.js +0 -28
  111. package/dist/service/curd/CrudProQuick.d.ts +0 -190
  112. package/dist/service/curd/CrudProQuick.js +0 -319
  113. package/dist/service/curd/README.md +0 -1100
  114. package/dist/service/curd/fixSoftDelete.d.ts +0 -20
  115. package/src/libs/crud-pro/README.md +0 -809
  116. package/src/libs/crud-pro/README_FUNC.md +0 -193
  117. package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  118. package/src/models/StandardColumns.ts +0 -76
  119. package/src/service/curd/CrudProQuick.ts +0 -360
  120. package/src/service/curd/README.md +0 -1100
@@ -1,71 +0,0 @@
1
- /**
2
- * 标准表结构字段类型定义
3
- *
4
- * 常用标准字段(推荐所有表都包含):
5
- * - deleted_at: 软删除标记,0=未删除,时间戳=已删除
6
- * - deleted_by: 删除人ID
7
- * - created_by: 创建人ID
8
- * - created_at: 创建时间
9
- * - modified_by: 最后修改人ID
10
- * - modified_at: 最后修改时间
11
- *
12
- * 完整标准字段(需要记录详细用户信息时使用):
13
- * - created_account_type: 创建人账号类型
14
- * - created_avatar: 创建人头像
15
- * - created_nickname: 创建人昵称
16
- * - modified_account_type: 修改人账号类型
17
- * - modified_avatar: 修改人头像
18
- * - modified_nickname: 修改人昵称
19
- */
20
- /**
21
- * 常用标准表结构字段(6个字段)
22
- *
23
- * 推荐所有业务表都包含这些字段:
24
- * - deleted_at: 删除时间戳,0=未删除
25
- * - deleted_by: 删除人ID
26
- * - created_by: 创建人ID
27
- * - created_at: 创建时间(毫秒时间戳)
28
- * - modified_by: 修改人ID
29
- * - modified_at: 修改时间(毫秒时间戳)
30
- */
31
- export interface ICommonStandardColumns {
32
- deleted_at?: number;
33
- deleted_by?: string;
34
- created_by?: string;
35
- created_at?: number;
36
- modified_by?: string;
37
- modified_at?: number;
38
- }
39
- /**
40
- * 完整标准表结构字段(12个字段)
41
- *
42
- * 在常用字段基础上增加用户详细信息:
43
- * - created_account_type: 创建人账号类型
44
- * - created_avatar: 创建人头像URL
45
- * - created_nickname: 创建人昵称
46
- * - modified_account_type: 修改人账号类型
47
- * - modified_avatar: 修改人头像URL
48
- * - modified_nickname: 修改人昵称
49
- */
50
- export interface IFullStandardColumns extends ICommonStandardColumns {
51
- created_account_type?: string;
52
- created_avatar?: string;
53
- created_nickname?: string;
54
- modified_account_type?: string;
55
- modified_avatar?: string;
56
- modified_nickname?: string;
57
- }
58
- /**
59
- * 包含常用标准字段的数据模型
60
- */
61
- export declare type StandardDataModel<T = {}> = T & ICommonStandardColumns;
62
- /**
63
- * 包含完整标准字段的数据模型
64
- */
65
- export declare type FullStandardDataModel<T = {}> = T & IFullStandardColumns;
66
- /**
67
- * 未删除查询条件
68
- */
69
- export declare const NotDeletedCondition: {
70
- deleted_at: 0;
71
- };
@@ -1,28 +0,0 @@
1
- "use strict";
2
- /**
3
- * 标准表结构字段类型定义
4
- *
5
- * 常用标准字段(推荐所有表都包含):
6
- * - deleted_at: 软删除标记,0=未删除,时间戳=已删除
7
- * - deleted_by: 删除人ID
8
- * - created_by: 创建人ID
9
- * - created_at: 创建时间
10
- * - modified_by: 最后修改人ID
11
- * - modified_at: 最后修改时间
12
- *
13
- * 完整标准字段(需要记录详细用户信息时使用):
14
- * - created_account_type: 创建人账号类型
15
- * - created_avatar: 创建人头像
16
- * - created_nickname: 创建人昵称
17
- * - modified_account_type: 修改人账号类型
18
- * - modified_avatar: 修改人头像
19
- * - modified_nickname: 修改人昵称
20
- */
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.NotDeletedCondition = void 0;
23
- /**
24
- * 未删除查询条件
25
- */
26
- exports.NotDeletedCondition = {
27
- deleted_at: 0,
28
- };
@@ -1,190 +0,0 @@
1
- import { SqlDbType } from '../../libs/crud-pro/models/keys';
2
- import { IRequestModel } from '../../libs/crud-pro/interfaces';
3
- import { IRequestCfgModel2 } from '../../models/bizmodels';
4
- import { CrudPro } from '../../libs/crud-pro/CrudPro';
5
- import { ResModelAffected, ResModelPageQuery, ResModelStandard } from '../../libs/crud-pro/models/ResModel';
6
- import { Context } from "@midwayjs/koa";
7
- interface ICrudProQuick {
8
- curdPro: CrudPro;
9
- sqlDatabase: string;
10
- sqlDbType: SqlDbType;
11
- sqlTable?: string;
12
- ctx?: Context;
13
- }
14
- export declare class CrudProQuick {
15
- private readonly curdPro;
16
- private readonly sqlDbType;
17
- private readonly sqlDatabase;
18
- private readonly sqlTable?;
19
- private readonly ctx?;
20
- private baseCfgModel;
21
- constructor(args: ICrudProQuick);
22
- /**
23
- * 设置基础配置模型,合并到实例的 baseCfgModel 中,后续所有 CRUD 操作都会携带这些配置
24
- * 例如可以统一设置 maxLimit、sqlSimpleName 等公共参数,避免每次调用都重复传入
25
- * @param baseCfgModel 要合并的配置项
26
- */
27
- setBaseCfgModel(baseCfgModel: IRequestCfgModel2): void;
28
- private executeCrudByCfg;
29
- /**
30
- * 随便获取一个。不推荐使用。建议使用getUniqueOne。
31
- * @deprecated
32
- * @param reqJson
33
- * @param sqlTable
34
- * @returns 返回一条数据对象
35
- */
36
- getOne(reqJson: IRequestModel, sqlTable?: string): Promise<any>;
37
- /**
38
- * 期望获取唯一的一个对象,如果数据库中的数量不唯一,则报错。
39
- * @param reqJson
40
- * @param sqlTable
41
- * @returns 返回一条数据对象
42
- */
43
- getUniqueOne(reqJson: IRequestModel, sqlTable?: string): Promise<any>;
44
- /**
45
- * 获取数据列表
46
- * @param reqJson
47
- * @param sqlTable 数据库表名称
48
- * @returns 返回多条数据对象组成的数组
49
- */
50
- getList(reqJson: IRequestModel, sqlTable?: string): Promise<any[]>;
51
- /**
52
- * 分页查询数据列表,返回包含 rows 和 total_count 的分页结果
53
- * 内部使用 SIMPLE_QUERY_PAGE 模式,reqJson 中可传入 pageNo、pageSize 控制分页
54
- * @param reqJson 请求参数,支持 condition(查询条件)、pageNo、pageSize 等
55
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
56
- * @returns ResModelPageQuery 包含 rows(数据行数组)和 total_count(总记录数)
57
- */
58
- getListPage(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelPageQuery>;
59
- /**
60
- * 判断满足条件的记录是否存在
61
- * 内部使用 SIMPLE_QUERY_EXIST 模式,通过 SELECT EXISTS 子查询实现,找到首条匹配即返回,比 COUNT(*) 更高效
62
- * @param reqJson 请求参数,通过 condition 指定查询条件
63
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
64
- * @returns boolean 存在返回 true,不存在返回 false
65
- */
66
- isExist(reqJson: IRequestModel, sqlTable?: string): Promise<boolean>;
67
- /**
68
- * 查询满足条件的记录总数
69
- * 内部使用 SIMPLE_QUERY_COUNT 模式,仅返回 count 结果
70
- * @param reqJson 请求参数,通过 condition 指定查询条件
71
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
72
- * @returns number 满足条件的记录总数
73
- */
74
- getTotalCount(reqJson: IRequestModel, sqlTable?: string): Promise<number>;
75
- /**
76
- * 插入一条数据记录
77
- * 内部使用 SIMPLE_INSERT 模式,通过 reqJson.data 传入要插入的字段和值
78
- * @param reqJson 请求参数,data 字段中包含要插入的键值对
79
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
80
- * @returns ResModelAffected 包含受影响的行数信息
81
- */
82
- insertObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected>;
83
- /**
84
- * 批量插入数据记录
85
- * 内部使用 SIMPLE_BATCH_INSERT 模式,单条 SQL 插入多行数据,效率远高于循环单条插入
86
- *
87
- * @param reqJson 请求参数,data 为对象数组 [{name:'a'},{name:'b'}]
88
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
89
- * @returns ResModelAffected 包含受影响的行数信息
90
- *
91
- * 注意事项:
92
- * - affectedRows: 返回实际插入的行数,所有数据库均正确返回
93
- * - insertId: 仅返回第一条记录的自增ID,后续记录的ID需通过 insertId + index 推算
94
- * - MySQL: 返回第一条的 insertId
95
- * - PostgreSQL: RETURNING * 返回所有行,但仅取第一条的 id
96
- * - SQL Server: OUTPUT 返回所有行,但仅取第一条的 id
97
- */
98
- batchInsert(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected>;
99
- /**
100
- * 更新数据记录
101
- * 内部使用 SIMPLE_UPDATE 模式,通过 reqJson.data 传入要更新的字段和值,通过 reqJson.condition 指定更新条件
102
- * @param reqJson 请求参数,data 为更新内容,condition 为更新条件
103
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
104
- * @returns ResModelAffected 包含受影响的行数信息
105
- */
106
- updateObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected>;
107
- /**
108
- * 插入或更新数据记录(upsert)
109
- * 内部使用 SIMPLE_INSERT_OR_UPDATE 模式,若记录已存在则更新,不存在则插入
110
- * @param reqJson 请求参数,data 为要插入/更新的内容,condition 为判断条件
111
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
112
- * @returns ResModelStandard 返回完整的结果模型,包含 affected、insertId 等多种返回值
113
- */
114
- insertOrUpdate(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelStandard>;
115
- /**
116
- * 使用数据库原生 upsert 语法插入或更新(ON DUPLICATE KEY UPDATE / ON CONFLICT / MERGE)
117
- * 内部使用 SIMPLE_INSERT_ON_DUPLICATE_UPDATE 模式,单条 SQL 完成 upsert,效率更高
118
- *
119
- * 数据库差异:
120
- * - MySQL: ON DUPLICATE KEY UPDATE(依赖唯一索引/主键)
121
- * - PostgreSQL: ON CONFLICT (...) DO UPDATE(需配置 uniqueColumn)
122
- * - SQL Server: IF EXISTS ... ELSE ...(需配置 uniqueColumn,仅支持单列)
123
- *
124
- * @param reqJson 请求参数,data 为要插入/更新的内容
125
- * @param uniqueColumn 唯一列名(PostgreSQL/SQL Server 必需),PostgreSQL 支持多列,SQL Server 仅支持单列
126
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
127
- * @returns ResModelAffected 包含受影响的行数信息
128
- */
129
- insertOnDuplicate(reqJson: IRequestModel, uniqueColumn?: string[], sqlTable?: string): Promise<ResModelAffected>;
130
- /**
131
- * 删除数据记录
132
- * 内部使用 SIMPLE_DELETE 模式,通过 reqJson.condition 指定删除条件
133
- * 注意:如果启用了软删除,实际执行的是更新操作而非物理删除
134
- * @param reqJson 请求参数,condition 为删除条件
135
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
136
- * @returns ResModelAffected 包含受影响的行数信息
137
- */
138
- deleteObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected>;
139
- /**
140
- * 执行自定义 SQL 语句(经 CrudPro 框架封装处理)
141
- * 与 executeNativeSQL 不同,此方法执行的 SQL 会经过框架的参数绑定等安全处理
142
- * @param executeSql 要执行的 SQL 语句,支持参数占位符
143
- * @param args SQL 参数数组,与占位符一一对应
144
- * @returns any SQL 执行结果
145
- */
146
- executeSQL(executeSql: string, args?: any[]): Promise<any>;
147
- /**
148
- * 执行数据库的原生SQL语句,不做任何封装
149
- *
150
- * 返回值结构取决于 SQL 类型和数据库类型:
151
- *
152
- * **SELECT 查询**: 返回行数据数组
153
- *
154
- * **INSERT/UPDATE/DELETE**: 返回数据库驱动的原始结果
155
- * - MySQL: `NativeSqlResultMySQL` - 包含 insertId、affectedRows、changedRows 等
156
- * - PostgreSQL: 空数组(pg 驱动返回 rows 为空)
157
- * - SQL Server: 空数组(mssql 驱动返回 recordset 为空)
158
- *
159
- * **注意**:
160
- * - 使用 `?` 作为占位符,框架会自动转换为对应数据库的占位符
161
- * - PostgreSQL/SQL Server 会将 `?` 转换为 `$1, $2, ...` 或 `@fatcms_ms1, @fatcms_ms2, ...`
162
- *
163
- * @typeParam T 返回值类型,默认 any。
164
- * 预定义类型位于 `@/libs/crud-pro/models/ResModel`:
165
- * - `NativeSqlSelectResult` - SELECT 查询返回的行数组
166
- * - `NativeSqlResultMySQL` - MySQL INSERT/UPDATE/DELETE 返回结果
167
- * - 或自定义行类型数组,如 `{id: number, name: string}[]`
168
- *
169
- * @param executeNativeSql 原生 SQL 语句,使用 `?` 作为参数占位符
170
- * @param args 参数数组,与 SQL 中的 `?` 一一对应
171
- * @returns 根据 SQL 类型返回对应结果
172
- *
173
- * @example
174
- * // SELECT 查询 - 使用自定义行类型
175
- * const rows = await crudProQuick.executeNativeSQL<{id: number, name: string}[]>(
176
- * 'SELECT id, name FROM user WHERE age > ?',
177
- * [18]
178
- * );
179
- *
180
- * // INSERT - MySQL 返回 NativeSqlResultMySQL
181
- * // 需先导入: import { NativeSqlResultMySQL } from '../../libs/crud-pro/models/ResModel';
182
- * const result = await crudProQuick.executeNativeSQL<NativeSqlResultMySQL>(
183
- * 'INSERT INTO user (name, age) VALUES (?, ?)',
184
- * ['张三', 20]
185
- * );
186
- * console.log(result.insertId, result.affectedRows);
187
- */
188
- executeNativeSQL<T = any>(executeNativeSql: string, args?: any[]): Promise<T>;
189
- }
190
- export {};
@@ -1,319 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CrudProQuick = void 0;
4
- const keys_1 = require("../../libs/crud-pro/models/keys");
5
- const fixSoftDelete_1 = require("../../service/curd/fixSoftDelete");
6
- const DEFAULT_MAX_LIMIT = 10 * 10000;
7
- class CrudProQuick {
8
- constructor(args) {
9
- this.baseCfgModel = {
10
- maxLimit: DEFAULT_MAX_LIMIT,
11
- };
12
- this.ctx = args.ctx;
13
- this.sqlDatabase = args.sqlDatabase;
14
- this.sqlDbType = args.sqlDbType;
15
- this.curdPro = args.curdPro;
16
- this.sqlTable = args.sqlTable; // 全局sqlTable为空时,单独调用时就必须传sqlTable参数。
17
- }
18
- /**
19
- * 设置基础配置模型,合并到实例的 baseCfgModel 中,后续所有 CRUD 操作都会携带这些配置
20
- * 例如可以统一设置 maxLimit、sqlSimpleName 等公共参数,避免每次调用都重复传入
21
- * @param baseCfgModel 要合并的配置项
22
- */
23
- setBaseCfgModel(baseCfgModel) {
24
- Object.assign(this.baseCfgModel, baseCfgModel);
25
- }
26
- async executeCrudByCfg(reqJson, cfgModel2) {
27
- const cfgModel = { ...this.baseCfgModel };
28
- Object.assign(cfgModel, cfgModel2);
29
- cfgModel.method = 'CrudProQuickAnonymous';
30
- cfgModel.updateCfg = {};
31
- cfgModel.sqlDatabase = this.sqlDatabase;
32
- cfgModel.sqlDbType = this.sqlDbType;
33
- if (!cfgModel.sqlTable) {
34
- cfgModel.sqlTable = this.sqlTable;
35
- }
36
- if (!cfgModel.sqlTable) {
37
- throw new Error('[CrudProQuick] sqlTable not found');
38
- }
39
- // 应用软删除动作。
40
- (0, fixSoftDelete_1.fixSoftDelete)(cfgModel2.sqlSimpleName, cfgModel2, reqJson, this.ctx);
41
- return await this.curdPro.executeCrudByCfg(reqJson, cfgModel);
42
- }
43
- /**
44
- * 随便获取一个。不推荐使用。建议使用getUniqueOne。
45
- * @deprecated
46
- * @param reqJson
47
- * @param sqlTable
48
- * @returns 返回一条数据对象
49
- */
50
- async getOne(reqJson, sqlTable) {
51
- const cfgModel = {
52
- sqlTable,
53
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_ONE,
54
- };
55
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
56
- return res.getOneObj();
57
- }
58
- /**
59
- * 期望获取唯一的一个对象,如果数据库中的数量不唯一,则报错。
60
- * @param reqJson
61
- * @param sqlTable
62
- * @returns 返回一条数据对象
63
- */
64
- async getUniqueOne(reqJson, sqlTable) {
65
- const cfgModel = {
66
- sqlTable,
67
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_PAGE,
68
- };
69
- reqJson.pageNo = 1;
70
- reqJson.pageSize = 1;
71
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
72
- const resModel = res.getResModel();
73
- const total_count = resModel.total_count;
74
- const rows = resModel.rows;
75
- if (total_count === 0) {
76
- return null;
77
- }
78
- if (total_count > 1) {
79
- throw new Error(`[CrudProQuick][getUniqueOne] only one object is required, but got ${total_count}`);
80
- }
81
- return rows[0];
82
- }
83
- /**
84
- * 获取数据列表
85
- * @param reqJson
86
- * @param sqlTable 数据库表名称
87
- * @returns 返回多条数据对象组成的数组
88
- */
89
- async getList(reqJson, sqlTable) {
90
- const cfgModel = {
91
- sqlTable,
92
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY,
93
- };
94
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
95
- return res.getResRows();
96
- }
97
- /**
98
- * 分页查询数据列表,返回包含 rows 和 total_count 的分页结果
99
- * 内部使用 SIMPLE_QUERY_PAGE 模式,reqJson 中可传入 pageNo、pageSize 控制分页
100
- * @param reqJson 请求参数,支持 condition(查询条件)、pageNo、pageSize 等
101
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
102
- * @returns ResModelPageQuery 包含 rows(数据行数组)和 total_count(总记录数)
103
- */
104
- async getListPage(reqJson, sqlTable) {
105
- const cfgModel = {
106
- sqlTable,
107
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_PAGE,
108
- };
109
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
110
- return res.getResModelForQueryPage();
111
- }
112
- /**
113
- * 判断满足条件的记录是否存在
114
- * 内部使用 SIMPLE_QUERY_EXIST 模式,通过 SELECT EXISTS 子查询实现,找到首条匹配即返回,比 COUNT(*) 更高效
115
- * @param reqJson 请求参数,通过 condition 指定查询条件
116
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
117
- * @returns boolean 存在返回 true,不存在返回 false
118
- */
119
- async isExist(reqJson, sqlTable) {
120
- const cfgModel = {
121
- sqlTable,
122
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_EXIST,
123
- };
124
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
125
- return res.getResModel().is_exist;
126
- }
127
- /**
128
- * 查询满足条件的记录总数
129
- * 内部使用 SIMPLE_QUERY_COUNT 模式,仅返回 count 结果
130
- * @param reqJson 请求参数,通过 condition 指定查询条件
131
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
132
- * @returns number 满足条件的记录总数
133
- */
134
- async getTotalCount(reqJson, sqlTable) {
135
- const cfgModel = {
136
- sqlTable,
137
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_COUNT,
138
- };
139
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
140
- return res.getResModel().total_count;
141
- }
142
- /**
143
- * 插入一条数据记录
144
- * 内部使用 SIMPLE_INSERT 模式,通过 reqJson.data 传入要插入的字段和值
145
- * @param reqJson 请求参数,data 字段中包含要插入的键值对
146
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
147
- * @returns ResModelAffected 包含受影响的行数信息
148
- */
149
- async insertObject(reqJson, sqlTable) {
150
- const cfgModel = {
151
- sqlTable,
152
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_INSERT,
153
- };
154
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
155
- return res.getResModel().affected;
156
- }
157
- /**
158
- * 批量插入数据记录
159
- * 内部使用 SIMPLE_BATCH_INSERT 模式,单条 SQL 插入多行数据,效率远高于循环单条插入
160
- *
161
- * @param reqJson 请求参数,data 为对象数组 [{name:'a'},{name:'b'}]
162
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
163
- * @returns ResModelAffected 包含受影响的行数信息
164
- *
165
- * 注意事项:
166
- * - affectedRows: 返回实际插入的行数,所有数据库均正确返回
167
- * - insertId: 仅返回第一条记录的自增ID,后续记录的ID需通过 insertId + index 推算
168
- * - MySQL: 返回第一条的 insertId
169
- * - PostgreSQL: RETURNING * 返回所有行,但仅取第一条的 id
170
- * - SQL Server: OUTPUT 返回所有行,但仅取第一条的 id
171
- */
172
- async batchInsert(reqJson, sqlTable) {
173
- const cfgModel = {
174
- sqlTable,
175
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_BATCH_INSERT,
176
- };
177
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
178
- return res.getResModel().affected;
179
- }
180
- /**
181
- * 更新数据记录
182
- * 内部使用 SIMPLE_UPDATE 模式,通过 reqJson.data 传入要更新的字段和值,通过 reqJson.condition 指定更新条件
183
- * @param reqJson 请求参数,data 为更新内容,condition 为更新条件
184
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
185
- * @returns ResModelAffected 包含受影响的行数信息
186
- */
187
- async updateObject(reqJson, sqlTable) {
188
- const cfgModel = {
189
- sqlTable,
190
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
191
- };
192
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
193
- return res.getResModel().affected;
194
- }
195
- /**
196
- * 插入或更新数据记录(upsert)
197
- * 内部使用 SIMPLE_INSERT_OR_UPDATE 模式,若记录已存在则更新,不存在则插入
198
- * @param reqJson 请求参数,data 为要插入/更新的内容,condition 为判断条件
199
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
200
- * @returns ResModelStandard 返回完整的结果模型,包含 affected、insertId 等多种返回值
201
- */
202
- async insertOrUpdate(reqJson, sqlTable) {
203
- const cfgModel = {
204
- sqlTable,
205
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_INSERT_OR_UPDATE,
206
- };
207
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
208
- return res.getResModel(); // 因为它有三个返回值
209
- }
210
- /**
211
- * 使用数据库原生 upsert 语法插入或更新(ON DUPLICATE KEY UPDATE / ON CONFLICT / MERGE)
212
- * 内部使用 SIMPLE_INSERT_ON_DUPLICATE_UPDATE 模式,单条 SQL 完成 upsert,效率更高
213
- *
214
- * 数据库差异:
215
- * - MySQL: ON DUPLICATE KEY UPDATE(依赖唯一索引/主键)
216
- * - PostgreSQL: ON CONFLICT (...) DO UPDATE(需配置 uniqueColumn)
217
- * - SQL Server: IF EXISTS ... ELSE ...(需配置 uniqueColumn,仅支持单列)
218
- *
219
- * @param reqJson 请求参数,data 为要插入/更新的内容
220
- * @param uniqueColumn 唯一列名(PostgreSQL/SQL Server 必需),PostgreSQL 支持多列,SQL Server 仅支持单列
221
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
222
- * @returns ResModelAffected 包含受影响的行数信息
223
- */
224
- async insertOnDuplicate(reqJson, uniqueColumn, sqlTable) {
225
- const cfgModel = {
226
- sqlTable,
227
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_INSERT_ON_DUPLICATE_UPDATE,
228
- uniqueColumn,
229
- };
230
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
231
- return res.getResModel().affected;
232
- }
233
- /**
234
- * 删除数据记录
235
- * 内部使用 SIMPLE_DELETE 模式,通过 reqJson.condition 指定删除条件
236
- * 注意:如果启用了软删除,实际执行的是更新操作而非物理删除
237
- * @param reqJson 请求参数,condition 为删除条件
238
- * @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
239
- * @returns ResModelAffected 包含受影响的行数信息
240
- */
241
- async deleteObject(reqJson, sqlTable) {
242
- const cfgModel = {
243
- sqlTable,
244
- sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_DELETE,
245
- };
246
- const res = await this.executeCrudByCfg(reqJson, cfgModel);
247
- return res.getResModel().affected;
248
- }
249
- /**
250
- * 执行自定义 SQL 语句(经 CrudPro 框架封装处理)
251
- * 与 executeNativeSQL 不同,此方法执行的 SQL 会经过框架的参数绑定等安全处理
252
- * @param executeSql 要执行的 SQL 语句,支持参数占位符
253
- * @param args SQL 参数数组,与占位符一一对应
254
- * @returns any SQL 执行结果
255
- */
256
- async executeSQL(executeSql, args) {
257
- const sqlCfgModel = {
258
- executeSql: executeSql,
259
- executeSqlArgs: args,
260
- sqlDatabase: this.sqlDatabase,
261
- sqlDbType: this.sqlDbType,
262
- maxLimit: this.baseCfgModel.maxLimit || DEFAULT_MAX_LIMIT,
263
- };
264
- return await this.curdPro.executeSQL(sqlCfgModel);
265
- }
266
- /**
267
- * 执行数据库的原生SQL语句,不做任何封装
268
- *
269
- * 返回值结构取决于 SQL 类型和数据库类型:
270
- *
271
- * **SELECT 查询**: 返回行数据数组
272
- *
273
- * **INSERT/UPDATE/DELETE**: 返回数据库驱动的原始结果
274
- * - MySQL: `NativeSqlResultMySQL` - 包含 insertId、affectedRows、changedRows 等
275
- * - PostgreSQL: 空数组(pg 驱动返回 rows 为空)
276
- * - SQL Server: 空数组(mssql 驱动返回 recordset 为空)
277
- *
278
- * **注意**:
279
- * - 使用 `?` 作为占位符,框架会自动转换为对应数据库的占位符
280
- * - PostgreSQL/SQL Server 会将 `?` 转换为 `$1, $2, ...` 或 `@fatcms_ms1, @fatcms_ms2, ...`
281
- *
282
- * @typeParam T 返回值类型,默认 any。
283
- * 预定义类型位于 `@/libs/crud-pro/models/ResModel`:
284
- * - `NativeSqlSelectResult` - SELECT 查询返回的行数组
285
- * - `NativeSqlResultMySQL` - MySQL INSERT/UPDATE/DELETE 返回结果
286
- * - 或自定义行类型数组,如 `{id: number, name: string}[]`
287
- *
288
- * @param executeNativeSql 原生 SQL 语句,使用 `?` 作为参数占位符
289
- * @param args 参数数组,与 SQL 中的 `?` 一一对应
290
- * @returns 根据 SQL 类型返回对应结果
291
- *
292
- * @example
293
- * // SELECT 查询 - 使用自定义行类型
294
- * const rows = await crudProQuick.executeNativeSQL<{id: number, name: string}[]>(
295
- * 'SELECT id, name FROM user WHERE age > ?',
296
- * [18]
297
- * );
298
- *
299
- * // INSERT - MySQL 返回 NativeSqlResultMySQL
300
- * // 需先导入: import { NativeSqlResultMySQL } from '../../libs/crud-pro/models/ResModel';
301
- * const result = await crudProQuick.executeNativeSQL<NativeSqlResultMySQL>(
302
- * 'INSERT INTO user (name, age) VALUES (?, ?)',
303
- * ['张三', 20]
304
- * );
305
- * console.log(result.insertId, result.affectedRows);
306
- */
307
- async executeNativeSQL(executeNativeSql, args) {
308
- const sqlCfgModel = {
309
- isNativeSQL: true,
310
- executeSql: executeNativeSql,
311
- executeSqlArgs: args,
312
- sqlDatabase: this.sqlDatabase,
313
- sqlDbType: this.sqlDbType,
314
- maxLimit: this.baseCfgModel.maxLimit || DEFAULT_MAX_LIMIT,
315
- };
316
- return await this.curdPro.executeSQL(sqlCfgModel);
317
- }
318
- }
319
- exports.CrudProQuick = CrudProQuick;