midway-fatcms 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
  2. package/.qoder/skills/midway-fatcms/02-crud-quick.md +375 -0
  3. package/.qoder/skills/midway-fatcms/03-crud-sharding.md +489 -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 +504 -0
  8. package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
  9. package/README.md +9 -9
  10. package/dist/configuration.d.ts +10 -0
  11. package/dist/configuration.js +26 -0
  12. package/dist/controller/base/BaseApiController.d.ts +1 -2
  13. package/dist/controller/base/BaseApiController.js +0 -4
  14. package/dist/controller/gateway/DocGatewayController.js +1 -1
  15. package/dist/controller/helpers.controller.d.ts +6 -0
  16. package/dist/controller/helpers.controller.js +19 -0
  17. package/dist/controller/manage/FlowConfigManageApi.js +4 -2
  18. package/dist/controller/manage/SysConfigMangeApi.js +6 -1
  19. package/dist/controller/manage/UserAccountManageApi.js +7 -2
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +2 -2
  22. package/dist/libs/crud-pro/CrudPro.d.ts +51 -3
  23. package/dist/libs/crud-pro/CrudPro.js +111 -4
  24. package/dist/libs/crud-pro/exceptions.d.ts +7 -0
  25. package/dist/libs/crud-pro/exceptions.js +7 -0
  26. package/dist/libs/crud-pro/interfaces.d.ts +83 -12
  27. package/dist/libs/crud-pro/models/CrudResult.d.ts +116 -0
  28. package/dist/libs/crud-pro/models/CrudResult.js +126 -0
  29. package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -2
  30. package/dist/libs/crud-pro/models/ServiceHub.d.ts +2 -0
  31. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +70 -2
  32. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +205 -13
  33. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
  34. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
  35. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +36 -0
  36. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +97 -4
  37. package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +2 -0
  38. package/dist/libs/crud-pro/services/CurdProServiceHub.js +6 -0
  39. package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +382 -0
  40. package/dist/libs/crud-pro-quick/CrudProQuick.js +689 -0
  41. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
  42. package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
  43. package/dist/libs/crud-pro-quick/index.d.ts +36 -0
  44. package/dist/libs/crud-pro-quick/index.js +49 -0
  45. package/dist/libs/crud-pro-quick/models.d.ts +33 -0
  46. package/dist/libs/crud-pro-quick/models.js +2 -0
  47. package/dist/libs/crud-sharding/ShardingBase.d.ts +78 -0
  48. package/dist/libs/crud-sharding/ShardingBase.js +179 -0
  49. package/dist/libs/crud-sharding/ShardingByCustomCrud.d.ts +35 -0
  50. package/dist/libs/crud-sharding/ShardingByCustomCrud.js +297 -0
  51. package/dist/libs/crud-sharding/ShardingByHashCrud.d.ts +38 -0
  52. package/dist/libs/crud-sharding/ShardingByHashCrud.js +86 -0
  53. package/dist/libs/crud-sharding/ShardingByKeyCrud.d.ts +39 -0
  54. package/dist/libs/crud-sharding/ShardingByKeyCrud.js +74 -0
  55. package/dist/libs/crud-sharding/ShardingByTimeCrud.d.ts +66 -0
  56. package/dist/libs/crud-sharding/ShardingByTimeCrud.js +524 -0
  57. package/dist/libs/crud-sharding/ShardingConfig.d.ts +25 -10
  58. package/dist/libs/crud-sharding/ShardingConfig.js +5 -5
  59. package/dist/libs/crud-sharding/ShardingMerger.d.ts +10 -18
  60. package/dist/libs/crud-sharding/ShardingMerger.js +27 -44
  61. package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
  62. package/dist/libs/crud-sharding/ShardingResult.js +16 -0
  63. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
  64. package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
  65. package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
  66. package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
  67. package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  68. package/dist/libs/crud-sharding/index.d.ts +13 -15
  69. package/dist/libs/crud-sharding/index.js +33 -17
  70. package/dist/models/RedisKeys.d.ts +1 -0
  71. package/dist/models/RedisKeys.js +1 -0
  72. package/dist/models/bizmodels.d.ts +2 -6
  73. package/dist/service/SysAppService.d.ts +2 -2
  74. package/dist/service/SysAppService.js +16 -5
  75. package/dist/service/SysConfigService.d.ts +1 -1
  76. package/dist/service/SysConfigService.js +7 -2
  77. package/dist/service/SysDictDataService.js +14 -4
  78. package/dist/service/SysMenuService.js +7 -2
  79. package/dist/service/TableMetaCacheRedisSubscriber.d.ts +31 -0
  80. package/dist/service/TableMetaCacheRedisSubscriber.js +98 -0
  81. package/dist/service/curd/CurdMixService.d.ts +6 -4
  82. package/dist/service/curd/CurdMixService.js +16 -2
  83. package/dist/service/curd/CurdProService.d.ts +149 -29
  84. package/dist/service/curd/CurdProService.js +157 -38
  85. package/dist/service/flow/FlowConfigService.js +7 -2
  86. package/dist/service/flow/FlowInstanceCrudService.js +22 -19
  87. package/package.json +1 -1
  88. package/src/configuration.ts +27 -0
  89. package/src/controller/base/BaseApiController.ts +0 -5
  90. package/src/controller/gateway/DocGatewayController.ts +1 -1
  91. package/src/controller/helpers.controller.ts +15 -0
  92. package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
  93. package/src/controller/manage/FlowConfigManageApi.ts +4 -2
  94. package/src/controller/manage/SysConfigMangeApi.ts +6 -1
  95. package/src/controller/manage/UserAccountManageApi.ts +7 -2
  96. package/src/index.ts +2 -2
  97. package/src/libs/crud-pro/CrudPro.ts +134 -7
  98. package/src/libs/crud-pro/exceptions.ts +8 -0
  99. package/src/libs/crud-pro/interfaces.ts +111 -15
  100. package/src/libs/crud-pro/models/CrudResult.ts +178 -0
  101. package/src/libs/crud-pro/models/RequestModel.ts +2 -2
  102. package/src/libs/crud-pro/models/ServiceHub.ts +4 -0
  103. package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +238 -15
  104. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
  105. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
  106. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +110 -3
  107. package/src/libs/crud-pro/services/CurdProServiceHub.ts +8 -0
  108. package/src/libs/crud-pro-quick/CrudProQuick.ts +782 -0
  109. package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
  110. package/src/libs/crud-pro-quick/index.ts +52 -0
  111. package/src/libs/crud-pro-quick/models.ts +35 -0
  112. package/src/libs/crud-sharding/ShardingBase.ts +256 -0
  113. package/src/libs/crud-sharding/ShardingByCustomCrud.ts +329 -0
  114. package/src/libs/crud-sharding/ShardingByHashCrud.ts +111 -0
  115. package/src/libs/crud-sharding/ShardingByKeyCrud.ts +97 -0
  116. package/src/libs/crud-sharding/ShardingByTimeCrud.ts +628 -0
  117. package/src/libs/crud-sharding/ShardingConfig.ts +28 -10
  118. package/src/libs/crud-sharding/ShardingMerger.ts +35 -63
  119. package/src/libs/crud-sharding/ShardingResult.ts +29 -0
  120. package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
  121. package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
  122. package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  123. package/src/libs/crud-sharding/index.ts +30 -16
  124. package/src/models/RedisKeys.ts +1 -0
  125. package/src/models/bizmodels.ts +4 -7
  126. package/src/service/SysAppService.ts +18 -7
  127. package/src/service/SysConfigService.ts +8 -3
  128. package/src/service/SysDictDataService.ts +14 -4
  129. package/src/service/SysMenuService.ts +7 -2
  130. package/src/service/TableMetaCacheRedisSubscriber.ts +105 -0
  131. package/src/service/crudstd/CrudStdService.ts +2 -2
  132. package/src/service/curd/CurdMixService.ts +26 -5
  133. package/src/service/curd/CurdProService.ts +186 -45
  134. package/src/service/flow/FlowConfigService.ts +7 -2
  135. package/src/service/flow/FlowInstanceCrudService.ts +23 -20
  136. package/.qoder/skills/midway-fatcms-crud/SKILL.md +0 -375
  137. package/.qoder/skills/midway-fatcms-crud/examples.md +0 -990
  138. package/.qoder/skills/midway-fatcms-crud/reference.md +0 -568
  139. package/dist/libs/crud-pro/README.md +0 -809
  140. package/dist/libs/crud-pro/README_FUNC.md +0 -193
  141. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  142. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +0 -363
  143. package/dist/libs/crud-sharding/ShardingCrudPro.js +0 -675
  144. package/dist/libs/crud-sharding/ShardingRouter.d.ts +0 -69
  145. package/dist/libs/crud-sharding/ShardingRouter.js +0 -377
  146. package/dist/models/StandardColumns.d.ts +0 -71
  147. package/dist/models/StandardColumns.js +0 -28
  148. package/dist/service/curd/CrudProQuick.d.ts +0 -190
  149. package/dist/service/curd/CrudProQuick.js +0 -319
  150. package/dist/service/curd/README.md +0 -1100
  151. package/dist/service/curd/fixSoftDelete.d.ts +0 -20
  152. package/src/libs/crud-pro/README.md +0 -809
  153. package/src/libs/crud-pro/README_FUNC.md +0 -193
  154. package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  155. package/src/libs/crud-sharding/ShardingCrudPro.ts +0 -835
  156. package/src/libs/crud-sharding/ShardingRouter.ts +0 -512
  157. package/src/models/StandardColumns.ts +0 -76
  158. package/src/service/curd/CrudProQuick.ts +0 -360
  159. package/src/service/curd/README.md +0 -1100
@@ -1,12 +1,34 @@
1
1
  import { Context } from '@midwayjs/koa';
2
- import { IRequestCfgModel, IRequestModel, ISqlCfgModel, ITableListResult, ITableNamesOptions, ITableNamesQuery } from '../../libs/crud-pro/interfaces';
2
+ import { IRequestCfgModel, IRequestModel, ISqlCfgModel, ITableListResult, ITableNamesOptions, ITableNamesQuery, ExecuteSQLResult } from '../../libs/crud-pro/interfaces';
3
3
  import { SqlDbType } from '../../libs/crud-pro/models/keys';
4
4
  import { ExecuteContext, IExecuteContextHandler } from '../../libs/crud-pro/models/ExecuteContext';
5
5
  import { RelatedType } from './CurdMixUtils';
6
6
  import { BaseService } from '../base/BaseService';
7
7
  import { IRequestCfgModel2 } from '../../models/bizmodels';
8
- import { CrudProQuick } from './CrudProQuick';
9
- import { ShardingCrudPro, IShardingConfig } from '../../libs/crud-sharding';
8
+ import { CrudProQuick } from '../../libs/crud-pro-quick';
9
+ import { ShardingBase, IShardingConfig } from '../../libs/crud-sharding';
10
+ /**
11
+ * getQuickCrud 参数接口
12
+ */
13
+ export interface IGetQuickCrudParam {
14
+ /** 数据库名 */
15
+ sqlDatabase: string;
16
+ /** 数据库类型 */
17
+ sqlDbType: SqlDbType;
18
+ /** 表名(可选) */
19
+ sqlTable?: string;
20
+ }
21
+ /**
22
+ * getShardingCrud 参数接口
23
+ */
24
+ export interface IGetShardingCrudParam {
25
+ /** 数据库名 */
26
+ sqlDatabase: string;
27
+ /** 数据库类型 */
28
+ sqlDbType: SqlDbType;
29
+ /** 分表配置 */
30
+ shardingConfig: IShardingConfig;
31
+ }
10
32
  export declare class CurdProService extends BaseService {
11
33
  protected ctx: Context;
12
34
  private mysql2Config;
@@ -14,7 +36,37 @@ export declare class CurdProService extends BaseService {
14
36
  private sqlserver2Config;
15
37
  private crudProCfg;
16
38
  private responseCfgHandlers;
39
+ /**
40
+ * 注册“响应配置处理器”(response cfg handler)。
41
+ *
42
+ * 这些处理器会在一次 CRUD/SQL 执行完成后被调用,用于对 `ExecuteContext` 做统一的二次加工,
43
+ * 例如:追加扩展数据、做字段脱敏、统一包装返回结构等。
44
+ *
45
+ * @param key 处理器类型标识(业务自定义枚举/常量)
46
+ * @param handler 处理器实现
47
+ *
48
+ * @example
49
+ * curdProService.setResponseCfgHandlers(RelatedType.USER, {
50
+ * async handleExecuteContextPrepare(ctx) {
51
+ * // 可在执行结果处理前做准备
52
+ * },
53
+ * async handleExecuteContext(ctx) {
54
+ * // 对 ctx.result / ctx.data 等进行二次加工
55
+ * },
56
+ * });
57
+ */
17
58
  setResponseCfgHandlers(key: RelatedType, handler: IExecuteContextHandler): void;
59
+ /**
60
+ * 获取当前已注册的“响应配置处理器”集合。
61
+ *
62
+ * 一般用于调试或在外层框架中统一检查/复用已有 handler。
63
+ *
64
+ * @returns 以 `RelatedType` 为 key 的处理器映射表
65
+ *
66
+ * @example
67
+ * const handlers = curdProService.getResponseCfgHandlers();
68
+ * const userHandler = handlers[RelatedType.USER];
69
+ */
18
70
  getResponseCfgHandlers(): Record<RelatedType, IExecuteContextHandler>;
19
71
  /**
20
72
  * Execute级别:每次调用都会产生新的
@@ -22,53 +74,121 @@ export declare class CurdProService extends BaseService {
22
74
  */
23
75
  private getCrudPro;
24
76
  /**
25
- * 依赖缓存中与加载的配置
26
- * @param reqJson
77
+ * 通过 `method` 走配置化 CRUD 执行(从缓存/加载的配置中解析)。
78
+ *
79
+ * 适用于:前端/调用方只传 `method` + 入参,由服务端根据 `method` 找到对应的 CRUD 配置并执行。
80
+ * 在非调试模式下会启用配置缓存(调试模式关闭缓存,便于开发即时生效)。
81
+ *
82
+ * @param reqJson 请求模型,必须包含 `method`
83
+ * @returns `ExecuteContext`(包含执行过程与结果数据)
84
+ *
85
+ * @example
86
+ * const ctx = await curdProService.executeCrud({
87
+ * method: 'user.list',
88
+ * pageNo: 1,
89
+ * pageSize: 20,
90
+ * });
91
+ * console.log(ctx.result);
27
92
  */
28
93
  executeCrud(reqJson: IRequestModel): Promise<ExecuteContext>;
29
- executeSQL(sqlCfgModel: ISqlCfgModel): Promise<any>;
30
- executeCrudByCfg(reqJson: IRequestModel, cfgModel: IRequestCfgModel2): Promise<ExecuteContext>;
31
94
  /**
32
- * 获取 CrudProQuick 工具类(已废弃)
95
+ * 直接执行一段 SQL(不依赖 `method` 配置)。
33
96
  *
34
- * @deprecated 请使用 getQuickCrud 替代
35
- * @param sqlDatabase 数据库名
36
- * @param sqlDbType 数据库类型
37
- * @param sqlTable 表名(可选)
38
- * @returns CrudProQuick 实例
97
+ * 适用于:后台管理/运维脚本/内部工具需要直接跑 SQL 的场景(仍会复用本服务的连接池、日志、visitor、事务等上下文)。
98
+ *
99
+ * @param sqlCfgModel SQL 执行配置(数据库、类型、SQL、参数等)
100
+ * @returns SQL 执行结果
101
+ *
102
+ * @example
103
+ * const res = await curdProService.executeSQL({
104
+ * sqlDbType: SqlDbType.mysql,
105
+ * sqlDatabase: 'mydb',
106
+ * executeSql: 'select * from t_user where id = ?',
107
+ * executeSqlArgs: [1],
108
+ * });
39
109
  */
40
- getBbUtil(sqlDatabase: string, sqlDbType: SqlDbType, sqlTable?: string): CrudProQuick;
110
+ executeSQL(sqlCfgModel: ISqlCfgModel): Promise<ExecuteSQLResult>;
111
+ /**
112
+ * 直接按指定配置执行一次 CRUD(不走缓存查找)。
113
+ *
114
+ * 适用于:调用方已经拿到了/动态生成了本次要执行的 CRUD 配置,想直接执行并得到结果。
115
+ * 该方法会对 `cfgModel` 做两类标准化处理:
116
+ * - 统一修正/补全配置(`fixCfgModel`)
117
+ * - 应用软删除规则(`fixSoftDelete`)
118
+ *
119
+ * @param reqJson 本次请求入参
120
+ * @param cfgModel 本次请求对应的 CRUD 配置
121
+ * @returns `ExecuteContext`
122
+ *
123
+ * @example
124
+ * const cfg = await curdProService.getCachedCfgByMethod('user.list');
125
+ * const ctx = await curdProService.executeCrudByCfg(
126
+ * { method: 'user.list', pageNo: 1, pageSize: 20 },
127
+ * cfg as any
128
+ * );
129
+ */
130
+ executeCrudByCfg(reqJson: IRequestModel, cfgModel: IRequestCfgModel2): Promise<ExecuteContext>;
41
131
  /**
42
132
  * 获取 CrudProQuick 工具类
43
133
  *
44
134
  * 提供快速 CRUD 操作的便捷方法,封装了常用的数据库操作。
45
135
  *
46
- * @param sqlDatabase 数据库名
47
- * @param sqlDbType 数据库类型
48
- * @param sqlTable 表名(可选)
136
+ * @param param 参数对象
49
137
  * @returns CrudProQuick 实例
50
138
  *
51
139
  * @example
52
- * const quick = curdProService.getQuickCrud('mydb', SqlDbType.mysql, 't_user');
53
- * const users = await quick.query({ status: 'active' });
140
+ * const quick = curdProService.getQuickCrud({
141
+ * sqlDatabase: 'mydb',
142
+ * sqlDbType: SqlDbType.mysql,
143
+ * sqlTable: 't_user',
144
+ * });
145
+ * const users = await quick.find({ status: 'active' });
54
146
  */
55
- getQuickCrud(sqlDatabase: string, sqlDbType: SqlDbType, sqlTable?: string): CrudProQuick;
147
+ getQuickCrud(param: IGetQuickCrudParam): CrudProQuick;
56
148
  /**
57
149
  * 获取分表 CRUD 操作器
58
150
  *
59
- * @param sqlDatabase 数据库名
60
- * @param sqlDbType 数据库类型
61
- * @param shardingConfig 分表配置
62
- * @returns ShardingCrudPro 实例
151
+ * @param param 参数对象
152
+ * @returns ShardingBase 实例(实际类型根据 shardingConfig.type 决定)
63
153
  *
64
154
  * @example
65
- * const sharding = curdProService.getShardingCrud('mydb', SqlDbType.mysql, {
66
- * type: ShardingType.MONTH,
67
- * baseTable: 't_order',
68
- * timeColumn: 'created_at',
155
+ * const sharding = curdProService.getShardingCrud({
156
+ * sqlDatabase: 'mydb',
157
+ * sqlDbType: SqlDbType.mysql,
158
+ * shardingConfig: {
159
+ * type: ShardingType.MONTH,
160
+ * baseTable: 't_order',
161
+ * timeColumn: 'created_at',
162
+ * },
69
163
  * });
70
164
  */
71
- getShardingCrud(sqlDatabase: string, sqlDbType: SqlDbType, shardingConfig: IShardingConfig): ShardingCrudPro;
165
+ getShardingCrud(param: IGetShardingCrudParam): ShardingBase;
166
+ /**
167
+ * 根据 `method` 获取(可能来自缓存的)CRUD 配置。
168
+ *
169
+ * 适用于:你只想先拿到配置做检查/二次加工/审计,再决定是否执行。
170
+ * 非调试模式会启用缓存(调试模式关闭缓存)。
171
+ *
172
+ * @param method 配置方法名,例如:`user.list`
173
+ * @returns CRUD 配置模型
174
+ *
175
+ * @example
176
+ * const cfg = await curdProService.getCachedCfgByMethod('user.list');
177
+ * console.log(cfg.sqlSimpleName);
178
+ */
72
179
  getCachedCfgByMethod(method: string): Promise<IRequestCfgModel>;
180
+ /**
181
+ * 获取数据库的表/视图等结构信息列表(用于数据源探测、表选择器、代码生成等场景)。
182
+ *
183
+ * @param query 查询条件(例如:指定数据库、关键字过滤、分页等)
184
+ * @param options 可选项(例如:是否包含视图/系统表、大小写处理等,具体以接口定义为准)
185
+ * @returns 表信息列表结果
186
+ *
187
+ * @example
188
+ * const tables = await curdProService.getAllTableInfos(
189
+ * { sqlDbType: SqlDbType.mysql, sqlDatabase: 'mydb' },
190
+ * { skipCache: true }
191
+ * );
192
+ */
73
193
  getAllTableInfos(query: ITableNamesQuery, options?: ITableNamesOptions): Promise<ITableListResult>;
74
194
  }
@@ -20,11 +20,11 @@ const keys_1 = require("../../libs/crud-pro/models/keys");
20
20
  const exceptions_1 = require("../../libs/crud-pro/exceptions");
21
21
  const ExecuteContextFunc_1 = require("../../libs/crud-pro/models/ExecuteContextFunc");
22
22
  const BaseService_1 = require("../base/BaseService");
23
- const CrudProQuick_1 = require("./CrudProQuick");
23
+ const crud_pro_quick_1 = require("../../libs/crud-pro-quick");
24
24
  const crud_sharding_1 = require("../../libs/crud-sharding");
25
25
  const fixCfgModel_1 = require("./fixCfgModel");
26
26
  const global_config_1 = require("../../libs/global-config/global-config");
27
- const fixSoftDelete_1 = require("../../service/curd/fixSoftDelete");
27
+ const fixSoftDelete_1 = require("../../libs/crud-pro-quick/fixSoftDelete");
28
28
  function toVisitor(ctx) {
29
29
  const workbenchInfo = ctx.workbenchInfo;
30
30
  const userSession = ctx.userSession;
@@ -123,9 +123,39 @@ let CurdProService = class CurdProService extends BaseService_1.BaseService {
123
123
  super(...arguments);
124
124
  this.responseCfgHandlers = {};
125
125
  }
126
+ /**
127
+ * 注册“响应配置处理器”(response cfg handler)。
128
+ *
129
+ * 这些处理器会在一次 CRUD/SQL 执行完成后被调用,用于对 `ExecuteContext` 做统一的二次加工,
130
+ * 例如:追加扩展数据、做字段脱敏、统一包装返回结构等。
131
+ *
132
+ * @param key 处理器类型标识(业务自定义枚举/常量)
133
+ * @param handler 处理器实现
134
+ *
135
+ * @example
136
+ * curdProService.setResponseCfgHandlers(RelatedType.USER, {
137
+ * async handleExecuteContextPrepare(ctx) {
138
+ * // 可在执行结果处理前做准备
139
+ * },
140
+ * async handleExecuteContext(ctx) {
141
+ * // 对 ctx.result / ctx.data 等进行二次加工
142
+ * },
143
+ * });
144
+ */
126
145
  setResponseCfgHandlers(key, handler) {
127
146
  this.responseCfgHandlers[key] = handler;
128
147
  }
148
+ /**
149
+ * 获取当前已注册的“响应配置处理器”集合。
150
+ *
151
+ * 一般用于调试或在外层框架中统一检查/复用已有 handler。
152
+ *
153
+ * @returns 以 `RelatedType` 为 key 的处理器映射表
154
+ *
155
+ * @example
156
+ * const handlers = curdProService.getResponseCfgHandlers();
157
+ * const userHandler = handlers[RelatedType.USER];
158
+ */
129
159
  getResponseCfgHandlers() {
130
160
  return this.responseCfgHandlers;
131
161
  }
@@ -153,8 +183,21 @@ let CurdProService = class CurdProService extends BaseService_1.BaseService {
153
183
  return crudPro;
154
184
  }
155
185
  /**
156
- * 依赖缓存中与加载的配置
157
- * @param reqJson
186
+ * 通过 `method` 走配置化 CRUD 执行(从缓存/加载的配置中解析)。
187
+ *
188
+ * 适用于:前端/调用方只传 `method` + 入参,由服务端根据 `method` 找到对应的 CRUD 配置并执行。
189
+ * 在非调试模式下会启用配置缓存(调试模式关闭缓存,便于开发即时生效)。
190
+ *
191
+ * @param reqJson 请求模型,必须包含 `method`
192
+ * @returns `ExecuteContext`(包含执行过程与结果数据)
193
+ *
194
+ * @example
195
+ * const ctx = await curdProService.executeCrud({
196
+ * method: 'user.list',
197
+ * pageNo: 1,
198
+ * pageSize: 20,
199
+ * });
200
+ * console.log(ctx.result);
158
201
  */
159
202
  async executeCrud(reqJson) {
160
203
  if (!reqJson.method) {
@@ -165,77 +208,153 @@ let CurdProService = class CurdProService extends BaseService_1.BaseService {
165
208
  const isEnableCache = !this.isEnableDebug();
166
209
  return curdPro.executeCrud(reqJson, isEnableCache);
167
210
  }
168
- // 直接执行一个SQL
211
+ /**
212
+ * 直接执行一段 SQL(不依赖 `method` 配置)。
213
+ *
214
+ * 适用于:后台管理/运维脚本/内部工具需要直接跑 SQL 的场景(仍会复用本服务的连接池、日志、visitor、事务等上下文)。
215
+ *
216
+ * @param sqlCfgModel SQL 执行配置(数据库、类型、SQL、参数等)
217
+ * @returns SQL 执行结果
218
+ *
219
+ * @example
220
+ * const res = await curdProService.executeSQL({
221
+ * sqlDbType: SqlDbType.mysql,
222
+ * sqlDatabase: 'mydb',
223
+ * executeSql: 'select * from t_user where id = ?',
224
+ * executeSqlArgs: [1],
225
+ * });
226
+ */
169
227
  async executeSQL(sqlCfgModel) {
170
228
  const curdPro = this.getCrudPro();
171
229
  return curdPro.executeSQL(sqlCfgModel);
172
230
  }
173
- // 直接执行一个请求
231
+ /**
232
+ * 直接按指定配置执行一次 CRUD(不走缓存查找)。
233
+ *
234
+ * 适用于:调用方已经拿到了/动态生成了本次要执行的 CRUD 配置,想直接执行并得到结果。
235
+ * 该方法会对 `cfgModel` 做两类标准化处理:
236
+ * - 统一修正/补全配置(`fixCfgModel`)
237
+ * - 应用软删除规则(`fixSoftDelete`)
238
+ *
239
+ * @param reqJson 本次请求入参
240
+ * @param cfgModel 本次请求对应的 CRUD 配置
241
+ * @returns `ExecuteContext`
242
+ *
243
+ * @example
244
+ * const cfg = await curdProService.getCachedCfgByMethod('user.list');
245
+ * const ctx = await curdProService.executeCrudByCfg(
246
+ * { method: 'user.list', pageNo: 1, pageSize: 20 },
247
+ * cfg as any
248
+ * );
249
+ */
174
250
  async executeCrudByCfg(reqJson, cfgModel) {
175
251
  this.logInfo('executeCrudByCfg', cfgModel);
176
252
  const curdPro = this.getCrudPro();
177
253
  // 应用标准的updateCfg。
178
254
  (0, fixCfgModel_1.fixCfgModel)(cfgModel);
179
255
  // 应用软删除动作。
180
- (0, fixSoftDelete_1.fixSoftDelete)(cfgModel.sqlSimpleName, cfgModel, reqJson, this.ctx);
256
+ (0, fixSoftDelete_1.fixSoftDelete)(cfgModel.sqlSimpleName, cfgModel, reqJson, curdPro.getVisitor());
181
257
  return await curdPro.executeCrudByCfg(reqJson, cfgModel);
182
258
  }
183
- /**
184
- * 获取 CrudProQuick 工具类(已废弃)
185
- *
186
- * @deprecated 请使用 getQuickCrud 替代
187
- * @param sqlDatabase 数据库名
188
- * @param sqlDbType 数据库类型
189
- * @param sqlTable 表名(可选)
190
- * @returns CrudProQuick 实例
191
- */
192
- getBbUtil(sqlDatabase, sqlDbType, sqlTable) {
193
- return this.getQuickCrud(sqlDatabase, sqlDbType, sqlTable);
194
- }
195
259
  /**
196
260
  * 获取 CrudProQuick 工具类
197
261
  *
198
262
  * 提供快速 CRUD 操作的便捷方法,封装了常用的数据库操作。
199
263
  *
200
- * @param sqlDatabase 数据库名
201
- * @param sqlDbType 数据库类型
202
- * @param sqlTable 表名(可选)
264
+ * @param param 参数对象
203
265
  * @returns CrudProQuick 实例
204
266
  *
205
267
  * @example
206
- * const quick = curdProService.getQuickCrud('mydb', SqlDbType.mysql, 't_user');
207
- * const users = await quick.query({ status: 'active' });
268
+ * const quick = curdProService.getQuickCrud({
269
+ * sqlDatabase: 'mydb',
270
+ * sqlDbType: SqlDbType.mysql,
271
+ * sqlTable: 't_user',
272
+ * });
273
+ * const users = await quick.find({ status: 'active' });
208
274
  */
209
- getQuickCrud(sqlDatabase, sqlDbType, sqlTable) {
210
- const curdPro = this.getCrudPro();
211
- return new CrudProQuick_1.CrudProQuick({ curdPro, sqlDatabase, sqlDbType, sqlTable, ctx: this.ctx });
275
+ getQuickCrud(param) {
276
+ const { sqlDatabase, sqlDbType, sqlTable } = param;
277
+ // 传入工厂函数,每次需要时创建新的 CrudPro 实例
278
+ return new crud_pro_quick_1.CrudProQuick({
279
+ crudProFactory: () => this.getCrudPro(),
280
+ sqlDatabase,
281
+ sqlDbType,
282
+ sqlTable,
283
+ });
212
284
  }
213
285
  /**
214
286
  * 获取分表 CRUD 操作器
215
287
  *
216
- * @param sqlDatabase 数据库名
217
- * @param sqlDbType 数据库类型
218
- * @param shardingConfig 分表配置
219
- * @returns ShardingCrudPro 实例
288
+ * @param param 参数对象
289
+ * @returns ShardingBase 实例(实际类型根据 shardingConfig.type 决定)
220
290
  *
221
291
  * @example
222
- * const sharding = curdProService.getShardingCrud('mydb', SqlDbType.mysql, {
223
- * type: ShardingType.MONTH,
224
- * baseTable: 't_order',
225
- * timeColumn: 'created_at',
292
+ * const sharding = curdProService.getShardingCrud({
293
+ * sqlDatabase: 'mydb',
294
+ * sqlDbType: SqlDbType.mysql,
295
+ * shardingConfig: {
296
+ * type: ShardingType.MONTH,
297
+ * baseTable: 't_order',
298
+ * timeColumn: 'created_at',
299
+ * },
226
300
  * });
227
301
  */
228
- getShardingCrud(sqlDatabase, sqlDbType, shardingConfig) {
229
- const curdPro = this.getCrudPro();
230
- const sharding = new crud_sharding_1.ShardingCrudPro(curdPro, shardingConfig);
302
+ getShardingCrud(param) {
303
+ const { sqlDatabase, sqlDbType, shardingConfig } = param;
304
+ const factory = () => this.getCrudPro();
305
+ let sharding;
306
+ switch (shardingConfig.type) {
307
+ case crud_sharding_1.ShardingType.YEAR:
308
+ case crud_sharding_1.ShardingType.MONTH:
309
+ case crud_sharding_1.ShardingType.DAY:
310
+ sharding = new crud_sharding_1.ShardingByTimeCrud(factory, shardingConfig);
311
+ break;
312
+ case crud_sharding_1.ShardingType.HASH:
313
+ sharding = new crud_sharding_1.ShardingByHashCrud(factory, shardingConfig);
314
+ break;
315
+ case crud_sharding_1.ShardingType.KEY:
316
+ sharding = new crud_sharding_1.ShardingByKeyCrud(factory, shardingConfig);
317
+ break;
318
+ case crud_sharding_1.ShardingType.CUSTOM:
319
+ sharding = new crud_sharding_1.ShardingByCustomCrud(factory, shardingConfig);
320
+ break;
321
+ default:
322
+ throw new Error(`[CurdProService] 不支持的分表类型: ${shardingConfig.type}`);
323
+ }
231
324
  sharding.setBaseCfg({ sqlDatabase, sqlDbType });
232
325
  return sharding;
233
326
  }
327
+ /**
328
+ * 根据 `method` 获取(可能来自缓存的)CRUD 配置。
329
+ *
330
+ * 适用于:你只想先拿到配置做检查/二次加工/审计,再决定是否执行。
331
+ * 非调试模式会启用缓存(调试模式关闭缓存)。
332
+ *
333
+ * @param method 配置方法名,例如:`user.list`
334
+ * @returns CRUD 配置模型
335
+ *
336
+ * @example
337
+ * const cfg = await curdProService.getCachedCfgByMethod('user.list');
338
+ * console.log(cfg.sqlSimpleName);
339
+ */
234
340
  async getCachedCfgByMethod(method) {
235
341
  const curdPro = this.getCrudPro();
236
342
  const isEnableCache = !this.isEnableDebug(); // 开发环境不使用缓存
237
343
  return curdPro.getCachedCfgByMethod(method, isEnableCache);
238
344
  }
345
+ /**
346
+ * 获取数据库的表/视图等结构信息列表(用于数据源探测、表选择器、代码生成等场景)。
347
+ *
348
+ * @param query 查询条件(例如:指定数据库、关键字过滤、分页等)
349
+ * @param options 可选项(例如:是否包含视图/系统表、大小写处理等,具体以接口定义为准)
350
+ * @returns 表信息列表结果
351
+ *
352
+ * @example
353
+ * const tables = await curdProService.getAllTableInfos(
354
+ * { sqlDbType: SqlDbType.mysql, sqlDatabase: 'mydb' },
355
+ * { skipCache: true }
356
+ * );
357
+ */
239
358
  async getAllTableInfos(query, options) {
240
359
  const curdPro = this.getCrudPro();
241
360
  return curdPro.getAllTableInfos(query, options);
@@ -47,7 +47,11 @@ exports.ParsedFlowConfig = ParsedFlowConfig;
47
47
  let FlowConfigService = class FlowConfigService extends BaseService_1.BaseService {
48
48
  get flow_config() {
49
49
  const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
50
- return this.curdProService.getQuickCrud(SystemDbName, SystemDbType, FlowModel_1.FLOW_TABLES.flow_config);
50
+ return this.curdProService.getQuickCrud({
51
+ sqlDatabase: SystemDbName,
52
+ sqlDbType: SystemDbType,
53
+ sqlTable: FlowModel_1.FLOW_TABLES.flow_config,
54
+ });
51
55
  }
52
56
  toCacheKey(flow_code, flow_version) {
53
57
  if (!flow_code || typeof flow_code !== 'string') {
@@ -64,9 +68,10 @@ let FlowConfigService = class FlowConfigService extends BaseService_1.BaseServic
64
68
  cacheKey: cacheKey,
65
69
  cacheName: bizmodels_1.CacheNameEnum.GetFlowConfigOne,
66
70
  getter: async () => {
67
- return await this.flow_config.getUniqueOne({
71
+ const res = await this.flow_config.findUniqueOne({
68
72
  condition: { flow_code, flow_version, deleted_at: 0 }
69
73
  });
74
+ return res.row;
70
75
  },
71
76
  });
72
77
  }
@@ -23,7 +23,10 @@ exports.getCurrentDateTime = getCurrentDateTime;
23
23
  let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_1.BaseService {
24
24
  get flowDB() {
25
25
  const { FlowDbName, FlowDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
26
- const util = this.curdProService.getQuickCrud(FlowDbName, FlowDbType);
26
+ const util = this.curdProService.getQuickCrud({
27
+ sqlDatabase: FlowDbName,
28
+ sqlDbType: FlowDbType,
29
+ });
27
30
  util.setBaseCfgModel({ maxLimit: 100000 });
28
31
  return util;
29
32
  }
@@ -67,7 +70,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
67
70
  modified_at: getCurrentDateTime(),
68
71
  deleted_at: 0,
69
72
  };
70
- const nodeInstanceId = await this.flowDB.insertObject({
73
+ const nodeInstanceId = await this.flowDB.insert({
71
74
  data: nodeInstance,
72
75
  }, FlowModel_1.FLOW_TABLES.flow_instance_node);
73
76
  nodeInstance.id = nodeInstanceId.insertId;
@@ -89,7 +92,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
89
92
  modified_at: getCurrentDateTime(),
90
93
  deleted_at: 0,
91
94
  };
92
- const taskInstanceId = await this.flowDB.insertObject({
95
+ const taskInstanceId = await this.flowDB.insert({
93
96
  data: taskInstance,
94
97
  }, FlowModel_1.FLOW_TABLES.flow_instance_task);
95
98
  taskInstance.id = taskInstanceId.insertId;
@@ -99,7 +102,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
99
102
  if (updateNodeInstance.id) {
100
103
  updateNodeInstance.modified_by = this.getCurrentUserAccountId();
101
104
  updateNodeInstance.modified_at = getCurrentDateTime();
102
- await this.flowDB.updateObject({
105
+ await this.flowDB.update({
103
106
  condition: {
104
107
  id: updateNodeInstance.id,
105
108
  },
@@ -110,7 +113,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
110
113
  else {
111
114
  updateNodeInstance.created_by = this.getCurrentUserAccountId();
112
115
  updateNodeInstance.created_at = getCurrentDateTime();
113
- const res = await this.flowDB.insertObject({
116
+ const res = await this.flowDB.insert({
114
117
  data: updateNodeInstance,
115
118
  }, FlowModel_1.FLOW_TABLES.flow_instance_node);
116
119
  return res.insertId || '';
@@ -124,7 +127,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
124
127
  if (taskInstance.id) {
125
128
  taskInstance.modified_by = this.getCurrentUserAccountId();
126
129
  taskInstance.modified_at = getCurrentDateTime();
127
- await this.flowDB.updateObject({
130
+ await this.flowDB.update({
128
131
  condition: {
129
132
  id: taskInstance.id,
130
133
  },
@@ -135,7 +138,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
135
138
  else {
136
139
  taskInstance.created_by = this.getCurrentUserAccountId();
137
140
  taskInstance.created_at = getCurrentDateTime();
138
- const res = await this.flowDB.insertObject({
141
+ const res = await this.flowDB.insert({
139
142
  data: taskInstance,
140
143
  }, FlowModel_1.FLOW_TABLES.flow_instance_task);
141
144
  return res.insertId || '';
@@ -155,7 +158,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
155
158
  if (flowInstance.id) {
156
159
  flowInstance.modified_by = this.getCurrentUserAccountId();
157
160
  flowInstance.modified_at = getCurrentDateTime();
158
- await this.flowDB.updateObject({
161
+ await this.flowDB.update({
159
162
  condition: {
160
163
  id: flowInstance.id,
161
164
  },
@@ -166,7 +169,7 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
166
169
  else {
167
170
  flowInstance.created_by = this.getCurrentUserAccountId();
168
171
  flowInstance.created_at = getCurrentDateTime();
169
- const res = await this.flowDB.insertObject({
172
+ const res = await this.flowDB.insert({
170
173
  data: flowInstance,
171
174
  }, FlowModel_1.FLOW_TABLES.flow_instance);
172
175
  return res.insertId || '';
@@ -186,10 +189,10 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
186
189
  else {
187
190
  throw new Error('flow_instance_id is required');
188
191
  }
189
- const res = await this.flowDB.getUniqueOne({
192
+ const res = await this.flowDB.findUniqueOne({
190
193
  condition: condition,
191
194
  }, FlowModel_1.FLOW_TABLES.flow_instance_node);
192
- return res;
195
+ return res.row;
193
196
  }
194
197
  async getFlowInstance(flow_instance_id, ticket_no) {
195
198
  const condition = {};
@@ -202,10 +205,10 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
202
205
  if (Object.keys(condition).length === 0) {
203
206
  throw new Error('flow_instance_id or ticket_no is required');
204
207
  }
205
- const res = await this.flowDB.getUniqueOne({
208
+ const res = await this.flowDB.findUniqueOne({
206
209
  condition: condition,
207
210
  }, FlowModel_1.FLOW_TABLES.flow_instance);
208
- return res;
211
+ return res.row;
209
212
  }
210
213
  async getTaskInstance(task_instance_id) {
211
214
  const condition = {};
@@ -215,10 +218,10 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
215
218
  if (Object.keys(condition).length === 0) {
216
219
  throw new Error('task_instance_id is required');
217
220
  }
218
- const res = await this.flowDB.getUniqueOne({
221
+ const res = await this.flowDB.findUniqueOne({
219
222
  condition: condition,
220
223
  }, FlowModel_1.FLOW_TABLES.flow_instance_task);
221
- return res;
224
+ return res.row;
222
225
  }
223
226
  async getTaskInstanceListByFlowInstanceId(flow_instance_id) {
224
227
  const condition = {};
@@ -228,10 +231,10 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
228
231
  if (Object.keys(condition).length === 0) {
229
232
  throw new Error('flow_instance_id is required');
230
233
  }
231
- const res = await this.flowDB.getList({
234
+ const res = await this.flowDB.findList({
232
235
  condition: condition,
233
236
  }, FlowModel_1.FLOW_TABLES.flow_instance_task);
234
- return res;
237
+ return res.rows;
235
238
  }
236
239
  async getNodeInstanceListByFlowInstanceId(flowInstanceId) {
237
240
  const condition = {};
@@ -241,10 +244,10 @@ let FlowInstanceCrudService = class FlowInstanceCrudService extends BaseService_
241
244
  if (Object.keys(condition).length === 0) {
242
245
  throw new Error('flowInstanceId is required');
243
246
  }
244
- const res = await this.flowDB.getList({
247
+ const res = await this.flowDB.findList({
245
248
  condition: condition,
246
249
  }, FlowModel_1.FLOW_TABLES.flow_instance_node);
247
- return res;
250
+ return res.rows;
248
251
  }
249
252
  };
250
253
  __decorate([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "midway-fatcms",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "This is a midway component sample",
5
5
  "main": "dist/index.js",
6
6
  "typings": "index.d.ts",