mm_os 4.3.7 → 5.0.1

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 (231) hide show
  1. package/README.md +102 -504
  2. package/index.js +26 -19
  3. package/lib/os.js +536 -0
  4. package/package.json +60 -84
  5. package/LICENSE +0 -21
  6. package/README_EN.md +0 -505
  7. package/adapter/adapter.js +0 -484
  8. package/adapter/custom_persistence.js +0 -661
  9. package/adapter/mqtt.js +0 -254
  10. package/adapter/socket.js +0 -244
  11. package/adapter/web.js +0 -92
  12. package/adapter/websocket.js +0 -43
  13. package/ai.js +0 -130
  14. package/com/api/README.md +0 -3
  15. package/com/api/com.json +0 -5
  16. package/com/api/config.tpl.json +0 -41
  17. package/com/api/drive.js +0 -732
  18. package/com/api/index.js +0 -201
  19. package/com/api/oauth.js +0 -200
  20. package/com/api/script.tpl.js +0 -32
  21. package/com/cmd/README.md +0 -11
  22. package/com/cmd/com.json +0 -5
  23. package/com/cmd/config.tpl.json +0 -48
  24. package/com/cmd/drive.js +0 -176
  25. package/com/cmd/index.js +0 -287
  26. package/com/cmd/job/config.json +0 -66
  27. package/com/cmd/job/index.js +0 -241
  28. package/com/cmd/job/test.js +0 -188
  29. package/com/cmd/msg.json +0 -48
  30. package/com/cmd/script.tpl.js +0 -12
  31. package/com/db/README.md +0 -3
  32. package/com/db/com.json +0 -5
  33. package/com/db/drive.js +0 -2206
  34. package/com/db/index.js +0 -241
  35. package/com/event/README.md +0 -4
  36. package/com/event/com.json +0 -5
  37. package/com/event/config.tpl.json +0 -20
  38. package/com/event/drive.js +0 -61
  39. package/com/event/index.js +0 -438
  40. package/com/event/script.tpl.js +0 -23
  41. package/com/mqtt/README.md +0 -47
  42. package/com/mqtt/com.json +0 -5
  43. package/com/mqtt/config.tpl.json +0 -42
  44. package/com/mqtt/drive.js +0 -704
  45. package/com/mqtt/index.js +0 -1052
  46. package/com/mqtt/index.test.js +0 -503
  47. package/com/mqtt/script.tpl.js +0 -719
  48. package/com/nav/README.md +0 -2
  49. package/com/nav/com.json +0 -5
  50. package/com/nav/config.tpl.json +0 -84
  51. package/com/nav/drive.js +0 -702
  52. package/com/nav/index.js +0 -228
  53. package/com/nav/tpl/admin_pc/page_channel.vue +0 -305
  54. package/com/nav/tpl/admin_pc/page_config.vue +0 -280
  55. package/com/nav/tpl/admin_pc/page_config_form.vue +0 -194
  56. package/com/nav/tpl/admin_pc/page_default.vue +0 -247
  57. package/com/nav/tpl/admin_pc/page_form.vue +0 -180
  58. package/com/nav/tpl/admin_pc/page_lang.vue +0 -264
  59. package/com/nav/tpl/admin_pc/page_nav.vue +0 -321
  60. package/com/nav/tpl/admin_pc/page_table.vue +0 -296
  61. package/com/nav/tpl/admin_pc/page_type.vue +0 -321
  62. package/com/nav/tpl/admin_pc/page_view.vue +0 -124
  63. package/com/nav/tpl/dev_pc/page_channel.vue +0 -253
  64. package/com/nav/tpl/dev_pc/page_config.vue +0 -253
  65. package/com/nav/tpl/dev_pc/page_default.vue +0 -247
  66. package/com/nav/tpl/dev_pc/page_form.vue +0 -162
  67. package/com/nav/tpl/dev_pc/page_nav.vue +0 -253
  68. package/com/nav/tpl/dev_pc/page_table.vue +0 -247
  69. package/com/nav/tpl/dev_pc/page_type.vue +0 -313
  70. package/com/nav/tpl/home_pc/page_channel.vue +0 -234
  71. package/com/nav/tpl/home_pc/page_default.vue +0 -234
  72. package/com/nav/tpl/home_pc/page_form.vue +0 -137
  73. package/com/nav/tpl/home_pc/page_list.vue +0 -234
  74. package/com/nav/tpl/home_pc/page_nav.vue +0 -221
  75. package/com/nav/tpl/home_pc/page_type.vue +0 -234
  76. package/com/nav/tpl/home_pc/page_view.vue +0 -125
  77. package/com/nav/tpl/home_phone/page_channel.vue +0 -234
  78. package/com/nav/tpl/home_phone/page_default.vue +0 -234
  79. package/com/nav/tpl/home_phone/page_form.vue +0 -137
  80. package/com/nav/tpl/home_phone/page_list.vue +0 -234
  81. package/com/nav/tpl/home_phone/page_nav.vue +0 -237
  82. package/com/nav/tpl/home_phone/page_type.vue +0 -234
  83. package/com/nav/tpl/home_phone/page_view.vue +0 -125
  84. package/com/nav/viewmodel.js +0 -446
  85. package/com/param/README.md +0 -2
  86. package/com/param/com.json +0 -5
  87. package/com/param/config.tpl.json +0 -136
  88. package/com/param/drive.js +0 -502
  89. package/com/param/index.js +0 -158
  90. package/com/param/script.tpl.js +0 -12
  91. package/com/pendant/README.md +0 -3
  92. package/com/pendant/com.json +0 -5
  93. package/com/pendant/config.tpl.json +0 -32
  94. package/com/pendant/drive.js +0 -204
  95. package/com/pendant/index.js +0 -467
  96. package/com/pendant/pendant.html +0 -16
  97. package/com/pendant/script.tpl.js +0 -18
  98. package/com/socket/README.md +0 -47
  99. package/com/socket/com.json +0 -5
  100. package/com/socket/config.tpl.json +0 -12
  101. package/com/socket/drive.js +0 -679
  102. package/com/socket/index.js +0 -402
  103. package/com/socket/script.tpl.js +0 -41
  104. package/com/sql/README.md +0 -3
  105. package/com/sql/com.json +0 -5
  106. package/com/sql/config.tpl.json +0 -74
  107. package/com/sql/drive.js +0 -1328
  108. package/com/sql/index.js +0 -152
  109. package/com/sql/script.tpl.js +0 -47
  110. package/com/static/README.md +0 -2
  111. package/com/static/com.json +0 -5
  112. package/com/static/config.tpl.json +0 -24
  113. package/com/static/drive.js +0 -194
  114. package/com/static/index.js +0 -237
  115. package/com/static/script.tpl.js +0 -28
  116. package/com/task/README.md +0 -3
  117. package/com/task/com.json +0 -5
  118. package/com/task/config.tpl.json +0 -24
  119. package/com/task/drive.js +0 -428
  120. package/com/task/index.js +0 -159
  121. package/com/task/script.tpl.js +0 -40
  122. package/com/template/com.json +0 -5
  123. package/com/template/config.tpl.json +0 -16
  124. package/com/template/drive.js +0 -81
  125. package/com/template/index.js +0 -141
  126. package/com.js +0 -237
  127. package/common/README.md +0 -2
  128. package/common/middleware/web_after/index.js +0 -26
  129. package/common/middleware/web_after/middleware.json +0 -9
  130. package/common/middleware/web_base/index.js +0 -113
  131. package/common/middleware/web_base/middleware.json +0 -19
  132. package/common/middleware/web_before/index.js +0 -33
  133. package/common/middleware/web_before/middleware.json +0 -9
  134. package/common/middleware/web_cors/index.js +0 -87
  135. package/common/middleware/web_cors/middleware.json +0 -24
  136. package/common/middleware/web_error/index.js +0 -131
  137. package/common/middleware/web_error/middleware.json +0 -19
  138. package/common/middleware/web_ip/index.js +0 -15
  139. package/common/middleware/web_ip/middleware.json +0 -14
  140. package/common/middleware/web_logger/index.js +0 -156
  141. package/common/middleware/web_logger/middleware.json +0 -14
  142. package/common/middleware/web_main/index.js +0 -26
  143. package/common/middleware/web_main/middleware.json +0 -9
  144. package/common/middleware/web_static/index.js +0 -73
  145. package/common/middleware/web_static/middleware.json +0 -54
  146. package/common/middleware/web_waf/index.js +0 -395
  147. package/common/middleware/web_waf/middleware.json +0 -13
  148. package/core/app/config.tpl.json +0 -67
  149. package/core/app/index.js +0 -711
  150. package/core/app/script.tpl.js +0 -52
  151. package/core/channel/index.js +0 -899
  152. package/core/channel/matcher.js +0 -585
  153. package/core/com/config.tpl.json +0 -16
  154. package/core/com/index.js +0 -77
  155. package/core/com/script.tpl.js +0 -5
  156. package/core/component/component.js +0 -42
  157. package/core/component/config.tpl.json +0 -63
  158. package/core/component/index.js +0 -273
  159. package/core/component/script.tpl.js +0 -19
  160. package/core/controller/config.tpl.json +0 -14
  161. package/core/controller/index.js +0 -371
  162. package/core/controller/script.tpl.js +0 -27
  163. package/core/factory/config.tpl.json +0 -14
  164. package/core/factory/entity.js +0 -275
  165. package/core/factory/index.js +0 -241
  166. package/core/factory/script.tpl.js +0 -16
  167. package/core/game/bat/index.js +0 -137
  168. package/core/game/bat/world.js +0 -622
  169. package/core/game/config.tpl.json +0 -16
  170. package/core/game/entity_admin.js +0 -230
  171. package/core/game/index.js +0 -186
  172. package/core/handler/config.tpl.json +0 -22
  173. package/core/handler/index.js +0 -181
  174. package/core/handler/script.tpl.js +0 -23
  175. package/core/logic/config.tpl.json +0 -14
  176. package/core/logic/index.js +0 -59
  177. package/core/logic/script.tpl.js +0 -19
  178. package/core/middleware/config.tpl.json +0 -16
  179. package/core/middleware/index.js +0 -117
  180. package/core/middleware/script.tpl.js +0 -37
  181. package/core/mod/config.tpl.json +0 -22
  182. package/core/mod/index.js +0 -136
  183. package/core/mod/script.tpl.js +0 -34
  184. package/core/model/config.tpl.json +0 -219
  185. package/core/model/index.js +0 -272
  186. package/core/model/model.js +0 -27
  187. package/core/model/script.tpl.js +0 -20
  188. package/core/notifier/config.tpl.json +0 -14
  189. package/core/notifier/index.js +0 -77
  190. package/core/notifier/script.tpl.js +0 -20
  191. package/core/plugin/config.tpl.json +0 -36
  192. package/core/plugin/index.js +0 -267
  193. package/core/plugin/script.tpl.js +0 -51
  194. package/core/pusher/config.tpl.json +0 -14
  195. package/core/pusher/index.js +0 -158
  196. package/core/pusher/script.tpl.js +0 -20
  197. package/core/room/bat/index.js +0 -170
  198. package/core/room/bat/room.js +0 -524
  199. package/core/room/config.tpl.json +0 -20
  200. package/core/room/index.js +0 -249
  201. package/core/room/room.js +0 -61
  202. package/core/scene/config.tpl.json +0 -14
  203. package/core/scene/index.js +0 -467
  204. package/core/scene/loop.js +0 -1306
  205. package/core/scene/map.js +0 -28
  206. package/core/scene/script.tpl.js +0 -22
  207. package/core/sender/config.tpl.json +0 -14
  208. package/core/sender/index.js +0 -79
  209. package/core/sender/script.tpl.js +0 -20
  210. package/core/service/config.tpl.json +0 -14
  211. package/core/service/index.js +0 -100
  212. package/core/service/script.tpl.js +0 -25
  213. package/core/store/config.tpl.json +0 -26
  214. package/core/store/index.js +0 -1794
  215. package/core/store/script.tpl.js +0 -22
  216. package/core/system/config.tpl.json +0 -18
  217. package/core/system/index.js +0 -312
  218. package/core/system/script.tpl.js +0 -77
  219. package/core/view/config.tpl.json +0 -14
  220. package/core/view/index.js +0 -91
  221. package/core/view/script.tpl.js +0 -20
  222. package/core/zone/bat/index.js +0 -744
  223. package/core/zone/config.tpl.json +0 -54
  224. package/core/zone/index.js +0 -655
  225. package/core/zone/script.tpl.js +0 -10
  226. package/core/zone/zone_bat.js +0 -136
  227. package/core//345/237/272/347/261/273/346/250/241/345/235/227/346/270/205/345/215/225.md +0 -24
  228. package/os.js +0 -53
  229. package/server.js +0 -602
  230. package/ulits/id_gen.js +0 -134
  231. package/ulits/word.js +0 -206
package/com/sql/drive.js DELETED
@@ -1,1328 +0,0 @@
1
- const Item = require('mm_machine').Drive;
2
-
3
- /**
4
- * 校验SQL标识符安全性, 仅允许字母、数字和下划线
5
- * @param {string} name 标识符名称
6
- * @returns {string} 安全的标识符
7
- */
8
- function validateIden(name) {
9
- if (typeof name !== 'string' || !name) {
10
- return '';
11
- }
12
- var sanitized = name.replace(/`/g, '');
13
- if (!/^[a-zA-Z0-9_]+$/.test(sanitized)) {
14
- return '';
15
- }
16
- return sanitized;
17
- }
18
-
19
- /**
20
- * Sql操作驱动类
21
- * @augments {Item}
22
- * @class
23
- */
24
- class Drive extends Item {
25
- static config = {
26
- main: '',
27
- // 表名 {0} 代表可前端传参自定义查询的表
28
- table: '{0}',
29
- // 主键 用于水平连表查询时 例如:id
30
- key: '',
31
- // 排序 {0} 代表可前台传参自定义排序规则 格式: `name` asc, `id` desc
32
- orderby: '{0}',
33
- // 默认排序 `id` desc
34
- orderby_default: '',
35
- // 显示的字段 {0} 代表可前台传参自定义查询的字段, 例如: `id`,`username`,`name`,`email`
36
- field: '{0}',
37
- // 默认显示字段 例如: `id`,`username`,`name`
38
- field_default: '*',
39
- // 隐藏字段 有些字段即使前端请求也不能返回,这是通过隐藏字段将其过滤掉, 例如:password *表示包含匹配
40
- field_hide: ['*password*', '*token*', 'salt'],
41
- // 分页大小,默认一页显示条数
42
- page_size: 30,
43
- /* 过滤参数 */
44
- filter: {
45
- /**
46
- * 表名
47
- */
48
- table: 'table',
49
- /**
50
- * 查询的页码
51
- */
52
- page: 'page',
53
- /**
54
- * 查询每页条数
55
- */
56
- size: 'size',
57
- /**
58
- * 操作方式: 传入参数method=add, 支持参数 add增、del删、set改、get查,为空则为get
59
- */
60
- method: 'method',
61
- /**
62
- * 排序
63
- */
64
- orderby: 'orderby',
65
- /**
66
- * 查询显示的字段
67
- */
68
- field: 'field',
69
- /**
70
- * 统计结果: 统计符合条件的结果数,只有当page等于1或0时才会统计
71
- */
72
- count_ret: 'count_ret',
73
- },
74
- // 分隔符 用于查询时的多条件处理
75
- separator: '|',
76
- // 支持的方法 add增、del删、set改、get查, 只填get表示只支持查询 // import export del_repeat",
77
- method:
78
- 'add del set get get_obj import export del_repeat avg sum count update',
79
- // sql查询语句
80
- query: {},
81
- // 默认查询, 当查询条件中不包含该项时,默认添加该项。 例如: { "age": "`age` < 20" } , 当查询参含有age,不调用该项,不存在时,sql会增加该项
82
- query_default: {},
83
- // sql更改语句
84
- update: {},
85
- // 默认添加条件,当不包含该项时,默认添加该项。 例如: { "age": "`age` += 1" } , 当查询参含有age,不调用该项,不存在时,sql会增加该项
86
- body_default: {},
87
- // 参数 []
88
- params: null,
89
- // 格式
90
- format: [
91
- /* {
92
- // 表名,当选择转换方式 表转换时需填写
93
- "table": "mm_web_region",
94
- // 查询条件,用于加速转换
95
- "query": {
96
- "group": "市"
97
- },
98
- // 表标题名
99
- "title": "所属省份",
100
- // 转换ID
101
- "id": "province_id",
102
- // 转换主键
103
- "key": "province",
104
- // 取名
105
- "name": "name",
106
- // 列表
107
- "list": [{
108
- "province_id": 1,
109
- "name": "广东省"
110
- },
111
- {
112
- "province_id": 2,
113
- "name": "广西省"
114
- },
115
- {
116
- "province_id": 3,
117
- "name": "湖南省"
118
- }
119
- ]
120
- },
121
- {
122
- "title": "是否可见",
123
- "key": "show",
124
- "list": ["否", "是"]
125
- } */
126
- ],
127
- /* 去重 */
128
- del_repeat: {
129
- // 判断重复的字段,例如字段名 number
130
- groupby: '',
131
- // 排序方式 例如: `diJia` ASC
132
- orderby: '',
133
- },
134
- /* 逻辑符 */
135
- logic: {},
136
- // 输出sql语句
137
- log: false,
138
- };
139
-
140
- /**
141
- * 构造函数
142
- * @param {object} config 配置参数
143
- * @param {object} parent 父对象
144
- * @class
145
- */
146
- constructor(config, parent) {
147
- super({ ...Drive.config, ...config }, parent);
148
- // 默认启用热更新
149
- this.mode = 3;
150
- }
151
- }
152
-
153
- /**
154
- * 获取模板目录
155
- * @returns {string} 模板目录
156
- */
157
- Drive.prototype._getTplDir = function () {
158
- return __dirname;
159
- };
160
-
161
- /**
162
- * 预设
163
- */
164
- Drive.prototype._preset = function () {
165
- // 保存文件目录
166
- this.save_dir = './static/file/';
167
- // 读取文件目录
168
- this.url_path = '/file/';
169
- /* 通用项 */
170
- this.params = null;
171
- };
172
-
173
- /**
174
- * 执行前, 可用于过滤参数
175
- * @param {object} params 参数对象 (object) 包含query和body 如{ query, body }
176
- * @param {object} db 数据库管理器
177
- * @returns {object} 过滤后的参数
178
- */
179
- Drive.prototype.before = async function (params, db) {
180
- return params;
181
- };
182
-
183
- /**
184
- * 验证, 用于判断是否执行
185
- * @param {object} params 参数对象 (object) 包含query和body
186
- * @param {object} db 数据管理器
187
- * @returns {boolean} 验证通过返回true, 失败返回false
188
- */
189
- Drive.prototype.check = async function (params, db) {
190
- return true;
191
- };
192
-
193
- /**
194
- * 执行后, 可用于附加执行
195
- * @param {object} params 参数对象 (object) 包含query和body
196
- * @param {object} db 数据管理器
197
- * @returns {object} 最终执行结果
198
- */
199
- Drive.prototype.after = async function (params, db) {
200
- return db.ret;
201
- };
202
-
203
- /**
204
- * 更新缓存
205
- * @param {string} table 表名
206
- * @param {object} sql 缓存sql语句
207
- */
208
- Drive.prototype.updateCache = async function (table, sql) {};
209
-
210
- /**
211
- * @ 执行修改
212
- * @param {object} query 查询url参数
213
- * @param {object} body 修改时置入body的参数
214
- * @param {object} db 数据库管理器
215
- * @returns {object} 返回执行结果
216
- */
217
- Drive.prototype.run = async function (query, body, db) {
218
- var params = {
219
- query,
220
- body,
221
- };
222
- params = await this.before(params, db);
223
- if (this.check(params, db)) {
224
- var ret = await this.main(params, db);
225
- if (!ret.error) {
226
- db.ret = ret;
227
- return await this.after(params, db);
228
- } else {
229
- return ret;
230
- }
231
- }
232
- return null;
233
- };
234
-
235
- /**
236
- * SQL操作准备
237
- * @param {object} db 数据库操作类
238
- * @param {object} query 查询条件
239
- * @param {object} body 修改项
240
- * @returns {object} 返回准备参数
241
- */
242
- Drive.prototype.ready = function (db, query, body) {
243
- var cg = this.config;
244
- var qy = { ...query };
245
- $.push(db.config.filter, cg.filter, true);
246
- db.filter(qy);
247
- return {
248
- cg,
249
- qy,
250
- };
251
- };
252
-
253
- /**
254
- * 转为查询条件字符串
255
- * @param {object} db 数据库管理器
256
- * @param {object} query 查寻条件
257
- * @param {object} method 方法
258
- * @returns {string} 返回查询条件
259
- */
260
- Drive.prototype.toWhere = function (db, query, method) {
261
- var { cg, qy: originalQy } = this.ready(db, query, {});
262
- // 创建 qy 对象的副本,避免修改原始参数
263
- var qy = { ...originalQy };
264
- this._setDbConfig(db, cg, query);
265
- qy = this._setQueryField(db, query, cg, method, qy);
266
- qy = this._setOrderBy(db, query, cg, qy);
267
- return this._buildQueryString(db, qy, cg);
268
- };
269
-
270
- /**
271
- * 设置数据库配置
272
- * @param {object} db 数据库管理器
273
- * @param {object} cg 配置
274
- * @param {object} query 查询条件
275
- * @private
276
- */
277
- Drive.prototype._setDbConfig = function (db, cg, query) {
278
- db.config.separator = cg.separator;
279
- if (!query.size && cg.page_size) {
280
- db.size = cg.page_size + 0;
281
- }
282
- if (db.size > 0 && db.page === 0) {
283
- db.page = 1;
284
- }
285
- };
286
-
287
- /**
288
- * 设置查询字段
289
- * @param {object} db 数据库管理器
290
- * @param {object} query 查询条件
291
- * @param {object} cg 配置
292
- * @param {object} method 方法
293
- * @param {object} qy 查询条件对象
294
- * @returns {object} 更新后的查询条件对象
295
- * @private
296
- */
297
- Drive.prototype._setQueryField = function (db, query, cg, method, qy) {
298
- var f = db.config.filter;
299
- var field = query[f.field];
300
- if (cg.field.has('*{0}*')) {
301
- if (field) {
302
- var safe_field = validateIden(field);
303
- if (safe_field) {
304
- db.field = cg.field.replace('{0}', safe_field);
305
- } else {
306
- db.field = cg.field_default || cg.field + '';
307
- }
308
- } else if (method === 'get_obj' && cg.field_obj) {
309
- db.field = cg.field_obj + '';
310
- } else if (cg.field_default) {
311
- db.field = cg.field_default + '';
312
- }
313
- } else {
314
- db.field = cg.field + '';
315
- if (field) {
316
- return { ...qy, [f.field]: field };
317
- }
318
- }
319
- return qy;
320
- };
321
-
322
- /**
323
- * 设置排序方式
324
- * @param {object} db 数据库管理器
325
- * @param {object} query 查询条件
326
- * @param {object} cg 配置
327
- * @param {object} qy 查询条件对象
328
- * @returns {object} 更新后的查询条件对象
329
- * @private
330
- */
331
- Drive.prototype._setOrderBy = function (db, query, cg, qy) {
332
- var f = db.config.filter;
333
- var orderby = query[f.orderby];
334
- if (cg.orderby.has('*{0}*')) {
335
- if (orderby) {
336
- var safe_orderby = validateIden(orderby);
337
- if (safe_orderby) {
338
- db.orderby = cg.orderby.replace('{0}', safe_orderby);
339
- } else {
340
- db.orderby = cg.orderby_default || cg.orderby + '';
341
- }
342
- } else if (cg.orderby_default) {
343
- db.orderby = cg.orderby_default + '';
344
- }
345
- } else {
346
- db.orderby = cg.orderby + '';
347
- if (orderby) {
348
- return { ...qy, [f.orderby]: orderby };
349
- }
350
- }
351
- return qy;
352
- };
353
-
354
- /**
355
- * 构建查询字符串
356
- * @param {object} db 数据库管理器
357
- * @param {object} qy 查询条件对象
358
- * @param {object} cg 配置
359
- * @returns {string} 查询字符串
360
- * @private
361
- */
362
- Drive.prototype._buildQueryString = function (db, qy, cg) {
363
- var query_str = db.tplQuery(qy, cg.query);
364
- var qt = cg.query_default;
365
- if (Object.keys(qt).length > 0) {
366
- var id = $.dict.user_id;
367
- var id_key = '{' + id + '}';
368
- var user_id = '0';
369
- var user = db.user;
370
- if (user && user[id]) {
371
- user_id = user[id];
372
- }
373
- for (var k in qt) {
374
- if (!qy[k]) {
375
- query_str += ' && ' + qt[k].replaceAll(id_key, user_id);
376
- }
377
- }
378
- if (query_str.startsWith(' && ')) {
379
- query_str = query_str.replace(' && ', '');
380
- }
381
- }
382
- return query_str;
383
- };
384
-
385
- /**
386
- * 查询(主要)
387
- * @param {object} db 数据库操作类
388
- * @param {object} query 查询条件
389
- * @param {object} method 方法
390
- * @returns {object} 返回查询结果
391
- */
392
- Drive.prototype.getMain = async function (db, query, method) {
393
- var ret;
394
- if (this.config.field.has('*{0}*')) {
395
- var field = query[db.config.filter.field];
396
- if (field && this.config.field_hide.getMatch(field)) {
397
- return $.ret.error(70003, '不合法的查询参数');
398
- }
399
- }
400
- var query_str = this.toWhere(db, query, method);
401
-
402
- // 查询
403
- if (db.count_ret === 'true') {
404
- ret = $.ret.body(await db.getCountSql(query_str, db.orderby, db.field));
405
- } else {
406
- ret = $.ret.list(await db.getSql(query_str, db.orderby, db.field));
407
- }
408
- return ret;
409
- };
410
-
411
- /**
412
- * 查询
413
- * @param {object} db 数据库操作类
414
- * @param {object} query 查询条件
415
- * @param {object} body 修改项
416
- * @returns {object} 返回查询结果
417
- */
418
- Drive.prototype.get = async function (db, query, body) {
419
- return await this.getMain(db, query);
420
- };
421
-
422
- /**
423
- * 查询单条数据
424
- * @param {object} db 数据库操作类
425
- * @param {object} query 查询条件
426
- * @param {object} body 修改项
427
- * @returns {object} 返回查询结果
428
- */
429
- Drive.prototype.getObj = async function (db, query, body) {
430
- var qy = { ...query };
431
- qy.page = 1;
432
- qy.size = 1;
433
- var ret = await this.getMain(db, qy, 'get_obj');
434
- if (ret.result) {
435
- var list = ret.result.list;
436
- if (list.length > 0) {
437
- return $.ret.obj(list[0]);
438
- } else {
439
- return $.ret.obj(null);
440
- }
441
- }
442
- return ret;
443
- };
444
-
445
- /**
446
- * 修改(主要)
447
- * @param {object} db 数据库操作类
448
- * @param {object} query 查询条件
449
- * @param {object} body 修改项
450
- * @returns {object} 返回修改结果
451
- */
452
- Drive.prototype.setMain = async function (db, query, body) {
453
- var ret;
454
- var { cg, qy } = this.ready(db, query, body);
455
- var key = cg.key;
456
- if (body[key]) {
457
- qy[key] = body[key];
458
- }
459
- var query_str = db.tplQuery(qy, cg.query);
460
-
461
- var qt = cg.query_default;
462
- if (Object.keys(qt).length > 0) {
463
- var id = $.dict.user_id;
464
- var id_key = '{' + id + '}';
465
- var user_id = '0';
466
- var user = db.user;
467
- if (user && user[id]) {
468
- user_id = user[id];
469
- }
470
- for (var k in qt) {
471
- if (!qy[k]) {
472
- query_str += ' && ' + qt[k].replace(id_key, user_id);
473
- }
474
- }
475
- if (query_str.startsWith(' && ')) {
476
- query_str = query_str.replace(' && ', '');
477
- }
478
- }
479
- var n = await db.setSql(query_str, db.tplBody(body, cg.update));
480
-
481
- if (n < 1) {
482
- ret = $.ret.error(500, '修改失败!\n' + db.error.message);
483
- } else {
484
- ret = $.ret.bl(true, '修改成功!');
485
- }
486
- return ret;
487
- };
488
-
489
- /**
490
- * 修改
491
- * @param {object} db 数据库操作类
492
- * @param {object} query 查询条件
493
- * @param {object} body 修改项
494
- * @returns {object} 返回查询结果
495
- */
496
- Drive.prototype.set = async function (db, query, body) {
497
- return await this.setMain(db, query, body);
498
- };
499
-
500
- /**
501
- * 添加(主要)
502
- * @param {object} db 数据库操作类
503
- * @param {object} body 添加项
504
- * @returns {object} 返回查询结果
505
- */
506
- Drive.prototype.addMain = async function (db, body) {
507
- var ret;
508
- var cg = this.config;
509
- if (Object.keys(body).length > 0) {
510
- var bt = cg.body_default;
511
- if (Object.keys(bt).length > 0) {
512
- var id = $.dict.user_id;
513
- var id_key = '{' + id + '}';
514
- var user_id = '0';
515
- var user = db.user;
516
- if (user && user[id]) {
517
- user_id = user[id];
518
- }
519
- for (var k in bt) {
520
- if (!body[k]) {
521
- var str = bt[k].replace(id_key, user_id);
522
- var key = str.left('=').trim('`');
523
- body[key] = str.right('=').trim("'");
524
- }
525
- }
526
- }
527
- var n = await db.add(body);
528
- if (n < 1) {
529
- ret = $.ret.error(500, '添加失败!\n' + db.error.message);
530
- } else {
531
- ret = $.ret.bl(true, '添加成功!');
532
- }
533
- } else {
534
- ret = $.ret.error(30001, '参数不能为空');
535
- }
536
- if (cg.log) {
537
- this.log('debug', '添加SQL语句', db.sql);
538
- }
539
- return ret;
540
- };
541
-
542
- /**
543
- * 添加
544
- * @param {object} db 数据库操作类
545
- * @param {object} query 查询条件
546
- * @param {object} body 修改项
547
- * @returns {object} 返回添加结果
548
- */
549
- Drive.prototype.add = async function (db, query, body) {
550
- return await this.addMain(db, body);
551
- };
552
-
553
- /**
554
- * 批量添加(主要)
555
- * @param {object} db 数据库操作类
556
- * @param {Array} list 添加项列表
557
- * @returns {object} 返回批量添加结果
558
- */
559
- Drive.prototype.addListMain = async function (db, list) {
560
- if (!Array.isArray(list) || list.length === 0) {
561
- return $.ret.error(30001, '参数不能为空');
562
- }
563
- var success_num = 0;
564
- var error_num = 0;
565
- var errors = [];
566
- var list_error = [];
567
- for (var i = 0; i < list.length; i++) {
568
- var ret = await this.addMain(db, list[i]);
569
- if (ret.error) {
570
- error_num++;
571
- errors.push(ret.error.message);
572
- list_error.push(list[i]);
573
- } else {
574
- success_num++;
575
- }
576
- }
577
- var done = $.ret.bl(success_num > 0, success_num > 0 ? '批量添加成功!' : '批量添加失败!');
578
- Object.assign(done.result, {
579
- total: list.length,
580
- success: success_num,
581
- error: error_num,
582
- list_error: list_error,
583
- errors: errors
584
- });
585
- return done;
586
- };
587
-
588
- /**
589
- * 批量添加
590
- * @param {object} db 数据库操作类
591
- * @param {Array} list 添加项列表
592
- * @returns {object} 返回批量添加结果
593
- */
594
- Drive.prototype.addList = async function (db, list) {
595
- return await this.addListMain(db, list);
596
- };
597
-
598
- /**
599
- * 删除(主要)
600
- * @param {object} db 数据库操作类
601
- * @param {object} query 查询条件
602
- * @returns {object} 返回查询结果
603
- */
604
- Drive.prototype.delMain = async function (db, query) {
605
- var ret;
606
- var { cg, qy } = this.ready(db, query, {});
607
- var query_str = db.tplQuery(qy, cg.query);
608
- var bl = await db.delSql(query_str);
609
- if (bl < 1) {
610
- ret = $.ret.error(500, '删除失败!\n' + db.error.message);
611
- } else {
612
- ret = $.ret.bl(true, '删除成功!');
613
- }
614
- if (cg.log) {
615
- this.log('debug', '删除SQL语句', db.sql);
616
- }
617
- return ret;
618
- };
619
-
620
- /**
621
- * 删除
622
- * @param {object} db 数据库操作类
623
- * @param {object} query 查询条件
624
- * @param {object} body 修改项
625
- * @returns {object} 返回删除结果
626
- */
627
- Drive.prototype.del = async function (db, query, body = {}) {
628
- return await this.delMain(db, { ...query, ...body });
629
- };
630
-
631
- /**
632
- * 添加或修改(主要)
633
- * @param {object} db 数据库操作类
634
- * @param {object} query 查询条件
635
- * @param {object} body 修改项
636
- * @returns {object} 返回修改结果
637
- */
638
- Drive.prototype.addorsetMain = async function (db, query, body) {
639
- var ret;
640
- var { cg, qy } = this.ready(db, query, body);
641
- if (Object.keys(body).length > 0 && Object.keys(qy).length > 0) {
642
- var n = await db.addOrSet(qy, body);
643
- if (n < 1) {
644
- ret = $.ret.error(500, '操作失败!\n' + db.error.message);
645
- } else {
646
- ret = $.ret.bl(true, '操作成功!');
647
- }
648
- } else {
649
- ret = $.ret.error(30001, '参数不能为空');
650
- }
651
- if (cg.log) {
652
- this.log('debug', '添加或修改SQL语句', db.sql);
653
- }
654
- return ret;
655
- };
656
-
657
- /**
658
- * 添加或修改
659
- * @param {object} db 数据库操作类
660
- * @param {object} query 查询条件
661
- * @param {object} body 修改项
662
- * @returns {object} 返回查询结果
663
- */
664
- Drive.prototype.addOrSet = async function (db, query, body) {
665
- return await this.addOrSetMain(db, query, body);
666
- };
667
-
668
- /**
669
- * 获取数据类型
670
- * @param {string} data_type 数据类型
671
- * @returns {string} 返回数据类型
672
- */
673
- Drive.prototype.getType = function (data_type) {
674
- if (data_type.indexOf('int') !== -1) {
675
- return 'number';
676
- } else {
677
- return 'string';
678
- }
679
- };
680
-
681
- /**
682
- * 获取数据
683
- * @param {object} db 数据库操作类
684
- * @param {string} field 要获取的字段
685
- * @returns {Array} 返回参数信息列表
686
- */
687
- Drive.prototype.getParam = async function (db, field) {
688
- var cg = this.config;
689
- if (cg.params) {
690
- return cg.params;
691
- }
692
- if (this.params) {
693
- return this.params;
694
- }
695
- var lt = await this._getFieldsFromCache(cg);
696
- if (!lt.length) {
697
- lt = await this._getFieldsFromDb(db, cg);
698
- }
699
- return this._filterFields(lt, field, cg);
700
- };
701
-
702
- /**
703
- * 从缓存获取字段列表
704
- * @param {object} cg 配置
705
- * @returns {Array} 字段列表
706
- * @private
707
- */
708
- Drive.prototype._getFieldsFromCache = function (cg) {
709
- var lt = [];
710
- if ($.pool.db) {
711
- var pool = $.pool.db['sys'];
712
- if (pool) {
713
- var dt = pool.get(cg.table);
714
- if (dt && dt.config) {
715
- var list = dt.config.fields;
716
- for (var i = 0; i < list.length; i++) {
717
- var name = list[i].replace(/`/g, '');
718
- lt.push({ name, title: name });
719
- }
720
- }
721
- }
722
- }
723
- return lt;
724
- };
725
-
726
- /**
727
- * 从数据库获取字段列表
728
- * @param {object} db 数据库操作类
729
- * @param {object} cg 配置
730
- * @returns {Array} 字段列表
731
- * @private
732
- */
733
- Drive.prototype._getFieldsFromDb = async function (db, cg) {
734
- var lt = [];
735
- db.table = cg.table;
736
- var list = await db.fields();
737
- for (var i = 0; i < list.length; i++) {
738
- var o = list[i];
739
- var name = o.name;
740
- var note = o.note ? o.note.replace(':', ':') : name;
741
- lt.push({
742
- name,
743
- title: note.left(':', true),
744
- type: this.getType(o.type),
745
- });
746
- }
747
- return lt;
748
- };
749
-
750
- /**
751
- * 过滤字段
752
- * @param {Array} lt 字段列表
753
- * @param {string} field 字段筛选
754
- * @param {object} cg 配置
755
- * @returns {Array} 过滤后的字段列表
756
- * @private
757
- */
758
- Drive.prototype._filterFields = function (lt, field, cg) {
759
- var fields = field || cg.field_default;
760
- if (fields && fields !== '*') {
761
- var arr = fields.replace(/`/g, '').split(',');
762
- return arr.map((name) => lt.getObj({ name })).filter((obj) => obj);
763
- }
764
- return lt;
765
- };
766
-
767
- /**
768
- * 获取导入导出格式
769
- * @param {object} db 数据库操作类
770
- * @returns {Array} 格式列表
771
- */
772
- Drive.prototype.getFormat = async function (db) {
773
- var dbs = { ...db };
774
- dbs.size = 0;
775
- var fmt = this.config.format;
776
- for (var i = 0; i < fmt.length; i++) {
777
- var o = fmt[i];
778
- if (o.table) {
779
- if (!o.list || o.list.length == 0) {
780
- dbs.table = o.table;
781
- if (!o.id) {
782
- o.id = o.key;
783
- }
784
- o.list = await dbs.getSql(o.where, null, o.id + ',' + o.name);
785
- if (o.id !== o.key) {
786
- for (var j = 0; j < o.list.length; j++) {
787
- var m = o.list[j];
788
- m[o.key] = m[o.name];
789
- }
790
- }
791
- }
792
- }
793
- }
794
- return fmt;
795
- };
796
-
797
- /**
798
- * 导入数据(主要)
799
- * @param {object} db 数据库操作类
800
- * @param {string} filename 文件名
801
- * @returns {object} 返回导入结果
802
- */
803
- Drive.prototype.importMain = async function (db, filename) {
804
- var params = await this.getParam(db);
805
- var format = await this.getFormat(db);
806
- var file = this._processFilePath(filename);
807
- if (!file.hasFile()) {
808
- return $.ret.error(30001, file + '文件不存在!');
809
- }
810
- var jarr = await this._loadImport(file, params, format);
811
- if (!jarr || !jarr.length) {
812
- return $.ret.error(10000, '要导入的数据不能为空!');
813
- }
814
- var result = await this._importToDb(db, jarr);
815
- return this._buildImport(result);
816
- };
817
-
818
- /**
819
- * 处理文件路径
820
- * @param {string} filename 文件名
821
- * @returns {string} 处理后的文件路径
822
- * @private
823
- */
824
- Drive.prototype._processFilePath = function (filename) {
825
- var file = filename;
826
- if (file.indexOf($.run_path) !== 0) {
827
- file = file.replace(this.url_path, this.save_dir);
828
- var path = this._getPath();
829
- file = file.fullname(path);
830
- }
831
- return file;
832
- };
833
-
834
- /**
835
- * 加载导入数据
836
- * @param {string} file 文件路径
837
- * @param {Array} params 参数列表
838
- * @param {Array} format 格式列表
839
- * @returns {Array} 数据数组
840
- * @private
841
- */
842
- Drive.prototype._loadImport = async function (file, params, format) {
843
- if (file.ends('.json')) {
844
- return file.loadJson();
845
- } else if (file.ends('.xml')) {
846
- return file.loadXml();
847
- } else {
848
- const Excel = require('mm_excel');
849
- var excel = new Excel({ file, params, format });
850
- try {
851
- return await excel.load();
852
- } catch (e) {
853
- this.log('error', '导入文件', e);
854
- } finally {
855
- excel.clear();
856
- excel = null;
857
- }
858
- }
859
- return [];
860
- };
861
-
862
- /**
863
- * 导入数据到数据库
864
- * @param {object} db 数据库操作类
865
- * @param {Array} jarr 数据数组
866
- * @returns {object} 导入结果
867
- * @private
868
- */
869
- Drive.prototype._importToDb = async function (db, jarr) {
870
- var list = [];
871
- var errors = [];
872
- var list_error = [];
873
- db.table = db.table || this.config.table;
874
- var key = this.config.key;
875
- if (jarr[0][key]) {
876
- for (var i = 0; i < jarr.length; i++) {
877
- var o = jarr[i];
878
- var qy = {};
879
- qy[key] = o[key];
880
- var n = await db.addOrSet(qy, o);
881
- if (n < 1) {
882
- errors.push(db.error);
883
- list_error.push(o);
884
- } else {
885
- list.push(o);
886
- }
887
- }
888
- } else {
889
- for (var i = 0; i < jarr.length; i++) {
890
- var o = jarr[i];
891
- var n = await db.add(o);
892
- if (n < 1) {
893
- errors.push(db.error);
894
- list_error.push(o);
895
- } else {
896
- list.push(o);
897
- }
898
- }
899
- }
900
- return { list, errors, list_error, total: jarr.length };
901
- };
902
-
903
- /**
904
- * 构建导入结果
905
- * @param {object} result 导入结果数据
906
- * @returns {object} 返回结果对象
907
- * @private
908
- */
909
- Drive.prototype._buildImport = function (result) {
910
- var bl = result.list.length === result.total;
911
- var body = $.ret.bl(bl, bl ? '导入成功!' : '导入失败!');
912
- body.result.list = result.list;
913
- if (result.errors.length) {
914
- body.result.list_error = result.list_error;
915
- body.result.errors = result.errors;
916
- }
917
- return body;
918
- };
919
-
920
- /**
921
- * 导入数据
922
- * @param {object} db 数据库操作类
923
- * @param {object} query 查询条件
924
- * @param {object} body 导入设置
925
- * @returns {object} 返回执行结果
926
- */
927
- Drive.prototype.import = async function (db, query, body) {
928
- var params = { ...query, ...body };
929
- if (!params.file) {
930
- return $.ret.error(60000, '文件名(file)参数不能为空');
931
- }
932
- return await this.importMain(db, params.file);
933
- };
934
-
935
- /**
936
- * 导出数据(主要)
937
- * @param {object} db 数据库操作类
938
- * @param {object} query 查询参数
939
- * @param {object} body 正文参数(导出设置)
940
- * @property {string} body.fields 需要导出的字段 例如: `username`,`gm`,`vip`
941
- * @property {string} body.file 文件名 例如: 用户名.xlsx 、用户信息.csv 、用户账户.xls
942
- * @property {string} body.path 文件路径 例如: /static/download, 可不填写
943
- * @returns {object} 返回执行结果
944
- */
945
- Drive.prototype.exportMain = async function (db, query, body) {
946
- var by = await this.getMain(db, query);
947
- if (db.error) {
948
- return $.ret.error(10000, db.error.message);
949
- }
950
- var config = this._prepareExportConfig(query, body);
951
- var params = await this.getParam(db, config.fields);
952
- var format = await this.getFormat(db);
953
- var file = await this._saveExportFile(
954
- config.file,
955
- params,
956
- format,
957
- by.result.list,
958
- );
959
- return this._buildExport(file, config.name);
960
- };
961
-
962
- /**
963
- * 准备导出配置
964
- * @param {object} query 查询参数
965
- * @param {object} body 正文参数
966
- * @returns {object} 导出配置
967
- * @private
968
- */
969
- Drive.prototype._prepareExportConfig = function (query, body) {
970
- var path = body.path;
971
- var file = body.file;
972
- var fields = body.fields;
973
- var table = $.dict.table || this.config.table;
974
- if (!path) {
975
- path = this._getPath();
976
- }
977
- if (!file) {
978
- var date = new Date();
979
- file = this.save_dir + table + '_' + date.stamp() + '.xlsx';
980
- }
981
- if (!fields) {
982
- fields =
983
- query.field ||
984
- (this.config.field_default !== '*' ? this.config.field_default : '');
985
- }
986
- return { path, file, fields, name: file.split('/').pop() };
987
- };
988
-
989
- /**
990
- * 获取路径
991
- * @returns {string} 导出路径
992
- * @private
993
- */
994
- Drive.prototype._getPath = function () {
995
- return (
996
- $.config.get('user_path') || $.config.get('static_path') || './static/'
997
- );
998
- };
999
-
1000
- /**
1001
- * 保存导出文件
1002
- * @param {string} file 文件路径
1003
- * @param {Array} params 参数列表
1004
- * @param {Array} format 格式列表
1005
- * @param {Array} list 数据列表
1006
- * @returns {string} 保存后的文件路径
1007
- * @private
1008
- */
1009
- Drive.prototype._saveExportFile = async function (file, params, format, list) {
1010
- var export_path = this._getPath();
1011
- var save_file = file.fullname(export_path);
1012
- save_file.addDir();
1013
- const Excel = require('mm_excel');
1014
- var excel = new Excel({ file: save_file, params, format });
1015
- try {
1016
- return await excel.save(list);
1017
- } catch (e) {
1018
- this.log('error', '导出保存文件失败!', e);
1019
- } finally {
1020
- excel.clear();
1021
- excel = null;
1022
- }
1023
- return '';
1024
- };
1025
-
1026
- /**
1027
- * 构建导出结果
1028
- * @param {string} file 文件路径
1029
- * @param {string} name 文件名
1030
- * @returns {object} 导出结果
1031
- * @private
1032
- */
1033
- Drive.prototype._buildExport = function (file, name) {
1034
- var body = $.ret.bl(!!file, file ? '导出成功!' : '导出失败!');
1035
- body.result.file = file;
1036
- body.result.url = this.url_path + name;
1037
- return body;
1038
- };
1039
-
1040
- /**
1041
- * 导出数据
1042
- * @param {object} db 数据库操作类
1043
- * @param {object} query 查询条件
1044
- * @param {object} body 修改项
1045
- * @returns {object} 返回执行结果
1046
- */
1047
- Drive.prototype.export = async function (db, query, body) {
1048
- return await this.exportMain(db, query, body);
1049
- };
1050
-
1051
- /**
1052
- * 删除重复项(主要)
1053
- * @param {object} db 数据库管理器
1054
- * @param {object} params 查询参数
1055
- * @returns {object} 返回执行结果
1056
- */
1057
- Drive.prototype.delRepeatMain = async function (db, params) {
1058
- var pm = { ...params };
1059
- var msg = '';
1060
- var cg = this.config.del_repeat;
1061
- var order_by = pm.orderby || cg.orderby;
1062
- delete pm.orderby;
1063
- var group_by =
1064
- validateIden(pm.groupby || cg.groupby) || cg.groupby || '';
1065
- delete pm.groupby;
1066
- var f = db.config.filter;
1067
- // 设置查询字段
1068
- var field = validateIden(pm[f.field]) || group_by;
1069
- delete pm[f.field];
1070
- db.field = field;
1071
- var sql = db
1072
- .toGetSql(pm)
1073
- .replace(' * ', ' `' + field + '`, count(*) as len ');
1074
- sql += ` GROUP BY ${group_by}`;
1075
- sql = 'SELECT * FROM (' + sql + ') a WHERE len > 1';
1076
- var list = await db.run(sql);
1077
- if (list.length) {
1078
- db.page = 1;
1079
- db.size = 1;
1080
- var key = this.config.key;
1081
- for (var i = 0; i < list.length; i++) {
1082
- var o = list[i];
1083
- var len = o.len - 1;
1084
- delete o.len;
1085
- for (var n = 0; n < len; n++) {
1086
- var obj = await db.getObj(o, order_by, key);
1087
- if (obj) {
1088
- await db.del(obj);
1089
- }
1090
- }
1091
- }
1092
- } else {
1093
- msg = '没有重复项。';
1094
- }
1095
- return $.ret.bl(!msg, msg ? '去重失败!原因:' + msg : '去重成功!');
1096
- };
1097
-
1098
- /**
1099
- * 删除重复项
1100
- * @param {object} db 数据库管理器
1101
- * @param {object} query 查询条件
1102
- * @param {object} body 正文参数
1103
- * @returns {object} 返回执行结果
1104
- */
1105
- Drive.prototype.delRepeat = async function (db, query, body) {
1106
- var pm = { ...query, ...body };
1107
- return await this.delRepeatMain(db, pm);
1108
- };
1109
-
1110
- /**
1111
- * 执行模板操作
1112
- * @param {object} params 参数对象 (object) 包含query和body
1113
- * @param {object} db 数据管理器
1114
- * @returns {object} 返回执行结果
1115
- */
1116
- Drive.prototype.main = async function (params, db) {
1117
- var { query, body } = params;
1118
-
1119
- var cg = this.config;
1120
- var method = query.method;
1121
-
1122
- if (!method) {
1123
- method = 'get';
1124
- }
1125
- if (!cg.method.has('*' + method + '*')) {
1126
- return $.ret.error(50001, '不支持的操作方式');
1127
- }
1128
- method = this._getMethodName(method);
1129
- var qy = { ...query };
1130
- delete qy.method;
1131
- if (this[method]) {
1132
- db.method = method;
1133
-
1134
- // 过滤查询参数
1135
- var f = cg.filter;
1136
- var table = query[f.table];
1137
- var safe_table = validateIden(table);
1138
-
1139
- // 设置操作的数据表
1140
- if (cg.table.has('*{0}*')) {
1141
- if (table) {
1142
- if (!safe_table) {
1143
- return $.ret.error(30001, '表名包含无效字符');
1144
- }
1145
- db.table = cg.table.replace('{0}', safe_table);
1146
- } else {
1147
- return $.ret.error(30001, '表名不能为空');
1148
- }
1149
- } else {
1150
- db.table = cg.table + '';
1151
- }
1152
-
1153
- return await this[method](db, qy, { ...body });
1154
- } else {
1155
- return $.ret.error(50001, '不支持的操作方式');
1156
- }
1157
- };
1158
-
1159
- /**
1160
- * 获取方法名
1161
- * @param {string} method 方法名
1162
- * @returns {string} 方法名
1163
- * @private
1164
- */
1165
- Drive.prototype._getMethodName = function (method) {
1166
- if (!method) {
1167
- return '';
1168
- }
1169
- if (method.indexOf('_') == -1) {
1170
- return method;
1171
- }
1172
- // 将小写蛇形改为小驼峰
1173
- let arr = method.split('_');
1174
- let new_name = arr[0].toLowerCase();
1175
- for (let i = 1; i < arr.length; i++) {
1176
- let name = arr[i];
1177
- new_name += name.charAt(0).toUpperCase() + name.substring(1);
1178
- }
1179
- return new_name;
1180
- };
1181
-
1182
- /**
1183
- * 总计
1184
- * @param {object} db 数据库管理器
1185
- * @param {object} param 查询条件
1186
- * @returns {object} 返回执行结果
1187
- */
1188
- Drive.prototype.sumMain = async function (db, param) {
1189
- var pm = { ...param };
1190
- var ret;
1191
- var orderby = pm.orderby || '';
1192
- delete pm.orderby;
1193
- var groupby = pm.groupby;
1194
- delete pm.groupby;
1195
- var f = db.config.filter;
1196
- var field = pm[f.field];
1197
- delete pm[f.field];
1198
- var query_str = this.toWhere(db, pm, 'get_list');
1199
-
1200
- if (!groupby || !field) {
1201
- ret = $.ret.error(30000, '参数groupby、field是必须的,且值不能为空!');
1202
- } else {
1203
- var list = await db.groupSumSql(query_str, groupby, field, orderby);
1204
- if (!list.length && db.error) {
1205
- ret = $.ret.body(db.error);
1206
- } else {
1207
- ret = $.ret.list(list);
1208
- }
1209
- }
1210
- return ret;
1211
- };
1212
-
1213
- /**
1214
- * 总计
1215
- * @param {object} db 数据库管理器
1216
- * @param {object} query 查询条件
1217
- * @param {object} body 正文参数
1218
- * @returns {object} 返回执行结果
1219
- */
1220
- Drive.prototype.sum = async function (db, query, body) {
1221
- var pm = { ...query, ...body };
1222
- return await this.sumMain(db, pm);
1223
- };
1224
-
1225
- /**
1226
- * 平均值
1227
- * @param {object} db 数据库管理器
1228
- * @param {object} param 查询条件
1229
- * @returns {object} 返回执行结果
1230
- */
1231
- Drive.prototype.avgMain = async function (db, param) {
1232
- var pm = { ...param };
1233
- var ret;
1234
- var orderby = pm.orderby || '';
1235
- delete pm.orderby;
1236
- var groupby = pm.groupby;
1237
- delete pm.groupby;
1238
- var f = db.config.filter;
1239
- var field = pm[f.field];
1240
- delete pm[f.field];
1241
- var query_str = this.toWhere(db, pm, 'get_list');
1242
-
1243
- if (!groupby || !field) {
1244
- ret = $.ret.error(30000, '参数groupby、field是必须的,且值不能为空!');
1245
- } else {
1246
- var list = await db.groupAvgSql(query_str, groupby, field, orderby);
1247
- if (!list.length && db.error) {
1248
- ret = $.ret.body(db.error);
1249
- } else {
1250
- ret = $.ret.list(list);
1251
- }
1252
- }
1253
- return ret;
1254
- };
1255
-
1256
- /**
1257
- * 平均值
1258
- * @param {object} db 数据库管理器
1259
- * @param {object} query 查询条件
1260
- * @param {object} body 正文参数
1261
- * @returns {object} 返回执行结果
1262
- */
1263
- Drive.prototype.avg = async function (db, query, body) {
1264
- var pm = { ...query, ...body };
1265
- return await this.avgMain(db, pm);
1266
- };
1267
-
1268
- /**
1269
- * 总计
1270
- * @param {object} db 数据库管理器
1271
- * @param {object} param 查询条件
1272
- * @returns {object} 返回执行结果
1273
- */
1274
- Drive.prototype.countMain = async function (db, param) {
1275
- var pm = { ...param };
1276
- var ret;
1277
- var orderby = pm.orderby || '';
1278
- delete pm.orderby;
1279
- var groupby = pm.groupby;
1280
- delete pm.groupby;
1281
- var f = db.config.filter;
1282
- var field = pm[f.field];
1283
- delete pm[f.field];
1284
- var query_str = this.toWhere(db, pm, 'get_list');
1285
-
1286
- if (!groupby || !field) {
1287
- ret = $.ret.error(30000, '参数groupby、field是必须的,且值不能为空!');
1288
- } else {
1289
- var list = await db.groupCountSql(query_str, groupby, field, orderby);
1290
- if (!list.length && db.error) {
1291
- ret = $.ret.body(db.error);
1292
- } else {
1293
- ret = $.ret.list(list);
1294
- }
1295
- }
1296
- return ret;
1297
- };
1298
-
1299
- /**
1300
- * 总计
1301
- * @param {object} db 数据库管理器
1302
- * @param {object} query 查询条件
1303
- * @param {object} body 正文参数
1304
- * @returns {object} 返回执行结果
1305
- */
1306
- Drive.prototype.count = async function (db, query, body) {
1307
- var pm = { ...query, ...body };
1308
- return await this.countMain(db, pm);
1309
- };
1310
-
1311
- /**
1312
- * 获取模型
1313
- * @param {string} type 模型类型
1314
- * @returns {object} 返回获取到的模型
1315
- */
1316
- Drive.prototype.getModel = function (type) {
1317
- let model = { ...this.config };
1318
- let dir = this.getDir();
1319
- let l = $.slash;
1320
- let app_name = dir.between('app' + l, l);
1321
- let plugin_name = dir.between('plugin' + l, l);
1322
- let name = dir.basename();
1323
- model.app = app_name;
1324
- model.plugin = plugin_name;
1325
- model.name = model.name || app_name + '_' + name;
1326
- return model;
1327
- };
1328
- module.exports = Drive;