mm_sqlite 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +2 -0
- package/config.json +8 -0
- package/db/mm.db +0 -0
- package/db.js +344 -94
- package/index.js +38 -8
- package/index_/345/217/202/350/200/203.js +299 -0
- package/link_model.js +132 -0
- package/package.json +38 -36
- package/sql.js +275 -51
- package/sql.json +56 -0
- package/test.js +594 -82
package/sql.js
CHANGED
|
@@ -3,7 +3,16 @@
|
|
|
3
3
|
* @author <a href="http://qww.elins.cn">邱文武</a>
|
|
4
4
|
* @version 1.2
|
|
5
5
|
*/
|
|
6
|
-
require('
|
|
6
|
+
require('mm_logs');
|
|
7
|
+
const SqlString = require('sqlstring');
|
|
8
|
+
|
|
9
|
+
function escape(value, stringifyObjects, timeZone) {
|
|
10
|
+
return SqlString.escape(value, stringifyObjects, timeZone);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function escapeId(value, forbidQualified) {
|
|
14
|
+
return SqlString.escapeId(value, forbidQualified);
|
|
15
|
+
}
|
|
7
16
|
|
|
8
17
|
/**
|
|
9
18
|
* @class 数据库语法通用类
|
|
@@ -24,6 +33,23 @@ class Sql {
|
|
|
24
33
|
* 更改函数 用于增删改
|
|
25
34
|
*/
|
|
26
35
|
this.exec = exec;
|
|
36
|
+
/**
|
|
37
|
+
* 规避SQL注入函数
|
|
38
|
+
* @param {Object} value 值
|
|
39
|
+
* @return {String} 返回执行结果
|
|
40
|
+
*/
|
|
41
|
+
this.escape = function(value) {
|
|
42
|
+
return escape(value);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 规避排序、SQL注入函数
|
|
47
|
+
* @param {String} key 键
|
|
48
|
+
* @return {String} 返回执行结果
|
|
49
|
+
*/
|
|
50
|
+
this.escapeId = function(key) {
|
|
51
|
+
return escapeId(key);
|
|
52
|
+
};
|
|
27
53
|
|
|
28
54
|
/**
|
|
29
55
|
* sql语句
|
|
@@ -65,6 +91,11 @@ class Sql {
|
|
|
65
91
|
*/
|
|
66
92
|
this.orderby = "";
|
|
67
93
|
|
|
94
|
+
/**
|
|
95
|
+
* 查询分组
|
|
96
|
+
*/
|
|
97
|
+
this.groupby = "";
|
|
98
|
+
|
|
68
99
|
/**
|
|
69
100
|
* 是否统计查询结果数
|
|
70
101
|
*/
|
|
@@ -112,6 +143,8 @@ class Sql {
|
|
|
112
143
|
"count_ret": "count_ret"
|
|
113
144
|
}
|
|
114
145
|
};
|
|
146
|
+
|
|
147
|
+
this.like = false;
|
|
115
148
|
}
|
|
116
149
|
}
|
|
117
150
|
|
|
@@ -164,7 +197,7 @@ Sql.prototype.toQuery = function(where, sort, view) {
|
|
|
164
197
|
sql += " WHERE " + where;
|
|
165
198
|
}
|
|
166
199
|
if (sort) {
|
|
167
|
-
sql += " ORDER BY " + sort;
|
|
200
|
+
sql += " ORDER BY " + sort.replace(/;/, '');
|
|
168
201
|
}
|
|
169
202
|
sql = sql.replace("{0}", this.table).replace("{1}", view);
|
|
170
203
|
if (this.size && this.page) {
|
|
@@ -233,13 +266,14 @@ Sql.prototype.addOrSetSql = async function(where, set) {
|
|
|
233
266
|
var arr = set.split(',');
|
|
234
267
|
var key = "";
|
|
235
268
|
var value = "";
|
|
236
|
-
arr.
|
|
269
|
+
for (var i = 0; i < arr.length; i++) {
|
|
270
|
+
var o = arr[i];
|
|
237
271
|
var ar = o.split('=');
|
|
238
272
|
if (ar.length === 2) {
|
|
239
273
|
key += "," + ar[0];
|
|
240
274
|
value += "," + ar[1];
|
|
241
275
|
}
|
|
242
|
-
}
|
|
276
|
+
}
|
|
243
277
|
return await this.addSql(key.replace(',', ''), value.replace(',', ''));
|
|
244
278
|
}
|
|
245
279
|
return await this.setSql(where, set);
|
|
@@ -262,6 +296,7 @@ Sql.prototype.countSql = async function(where) {
|
|
|
262
296
|
}
|
|
263
297
|
return n;
|
|
264
298
|
};
|
|
299
|
+
|
|
265
300
|
/**
|
|
266
301
|
* @description 查询数据并返回符合条件总数
|
|
267
302
|
* @param {String} where 查询条件
|
|
@@ -281,20 +316,182 @@ Sql.prototype.getCountSql = async function(where, sort, view) {
|
|
|
281
316
|
};
|
|
282
317
|
return ret;
|
|
283
318
|
};
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* @description 统计学
|
|
322
|
+
* @param {String} where 查询条件
|
|
323
|
+
* @param {String} groupby 分组的字段
|
|
324
|
+
* @param {String} view 返回的字段
|
|
325
|
+
* @param {String} sort 排序方式
|
|
326
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
327
|
+
*/
|
|
328
|
+
Sql.prototype.groupMathSql = async function(where, groupby, view, sort, method) {
|
|
329
|
+
if (!view) {
|
|
330
|
+
view = "*"
|
|
331
|
+
}
|
|
332
|
+
var viewStr = "";
|
|
333
|
+
if (view.indexOf(",") !== -1) {
|
|
334
|
+
var arr = view.split(",");
|
|
335
|
+
for (var i = 0; i < arr.length; i++) {
|
|
336
|
+
var str = this.escapeId(arr[i]);
|
|
337
|
+
viewStr += "," + method.toUpperCase() + "(" + str + ") " + method.toLowerCase() + "_" + str.replace(
|
|
338
|
+
/`/g, "")
|
|
339
|
+
}
|
|
340
|
+
} else {
|
|
341
|
+
viewStr = "," + method.toUpperCase() + "(" + this.escapeId(view) + ") " + method.toLowerCase() + "_" +
|
|
342
|
+
view.replace(/`/g, "")
|
|
343
|
+
}
|
|
344
|
+
var sql = "SELECT " + (groupby ? this.escapeId(groupby) : "") + viewStr + " FROM `" + this.table + "`";
|
|
345
|
+
if (where) {
|
|
346
|
+
sql += ' WHERE ' + where;
|
|
347
|
+
}
|
|
348
|
+
if (groupby) {
|
|
349
|
+
sql += " GROUP BY " + this.escapeId(groupby);
|
|
350
|
+
}
|
|
351
|
+
if (sort) {
|
|
352
|
+
sql += " ORDER BY " + sort;
|
|
353
|
+
}
|
|
354
|
+
if (this.size && this.page) {
|
|
355
|
+
var start = this.size * (this.page - 1);
|
|
356
|
+
sql += " limit " + start + ',' + this.size;
|
|
357
|
+
}
|
|
358
|
+
return await this.run(sql);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* @description 分组求平均值
|
|
364
|
+
* @param {String} where 查询条件
|
|
365
|
+
* @param {String} groupby 分组的字段
|
|
366
|
+
* @param {String} view 返回的字段
|
|
367
|
+
* @param {String} sort 排序方式
|
|
368
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
369
|
+
*/
|
|
370
|
+
Sql.prototype.groupAvgSql = async function(where, groupby, view, sort = "") {
|
|
371
|
+
return await this.groupMathSql(where, groupby, view, sort, "AVG");
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* @description 分组合计数值
|
|
376
|
+
* @param {String} where 查询条件
|
|
377
|
+
* @param {String} groupby 分组的字段
|
|
378
|
+
* @param {String} view 返回的字段
|
|
379
|
+
* @param {String} sort 排序方式
|
|
380
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
381
|
+
*/
|
|
382
|
+
Sql.prototype.groupSumSql = async function(where, groupby, view, sort = "") {
|
|
383
|
+
return await this.groupMathSql(where, groupby, view, sort, "SUM");
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* @description 分组合计不同条数
|
|
388
|
+
* @param {String} where 查询条件
|
|
389
|
+
* @param {String} groupby 分组的字段
|
|
390
|
+
* @param {String} view 返回的字段
|
|
391
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
392
|
+
*/
|
|
393
|
+
Sql.prototype.groupCountSql = async function(where, groupby, view, sort = "") {
|
|
394
|
+
return await this.groupMathSql(where, groupby, view, sort, "COUNT");
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* @description 统计学
|
|
400
|
+
* @param {Object} query 查询条件
|
|
401
|
+
* @param {String} groupby 分组的字段
|
|
402
|
+
* @param {String} view 返回的字段
|
|
403
|
+
* @param {String} sort 排序方式
|
|
404
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
405
|
+
*/
|
|
406
|
+
Sql.prototype.groupMath = async function(query, groupby, view, sort, method) {
|
|
407
|
+
var where = this.toWhere(query, this.like);
|
|
408
|
+
return await this.groupMathSql(where, groupby, view, sort, method);
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* @description 分组求平均值
|
|
413
|
+
* @param {Object} query 查询条件
|
|
414
|
+
* @param {String} groupby 分组的字段
|
|
415
|
+
* @param {String} view 返回的字段
|
|
416
|
+
* @param {String} sort 排序方式
|
|
417
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
418
|
+
*/
|
|
419
|
+
Sql.prototype.groupAvg = async function(query, groupby, view, sort) {
|
|
420
|
+
return await this.groupMath(query, groupby, view, sort, "AVG");
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* @description 分组合计数值
|
|
425
|
+
* @param {Object} query 查询条件
|
|
426
|
+
* @param {String} groupby 分组的字段
|
|
427
|
+
* @param {String} view 返回的字段
|
|
428
|
+
* @param {String} sort 排序方式
|
|
429
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
430
|
+
*/
|
|
431
|
+
Sql.prototype.groupSum = async function(query, groupby, view, sort) {
|
|
432
|
+
return await this.groupMath(query, groupby, view, sort, "SUM");
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* @description 分组合计不同条数
|
|
437
|
+
* @param {Object} query 查询条件
|
|
438
|
+
* @param {String} groupby 分组的字段
|
|
439
|
+
* @param {String} view 返回的字段
|
|
440
|
+
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
441
|
+
*/
|
|
442
|
+
Sql.prototype.groupCount = async function(query, groupby, view, sort) {
|
|
443
|
+
return await this.groupMath(query, groupby, view, sort, "COUNT");
|
|
444
|
+
};
|
|
445
|
+
|
|
284
446
|
/* === sql语句拼接函数 === */
|
|
285
|
-
///
|
|
286
447
|
/**
|
|
287
448
|
* @description 转为where语句
|
|
288
449
|
* @param {Object} obj 用作拼接的对象
|
|
450
|
+
* @param {Boolean} like 是否使用like匹配, 默认不使用
|
|
289
451
|
* @return {String} where格式sql语句字符串
|
|
290
452
|
*/
|
|
291
|
-
Sql.prototype.toWhere = function(obj) {
|
|
453
|
+
Sql.prototype.toWhere = function(obj, like) {
|
|
292
454
|
var where = "";
|
|
293
|
-
|
|
294
|
-
|
|
455
|
+
if (like === undefined) {
|
|
456
|
+
like = this.like;
|
|
457
|
+
}
|
|
458
|
+
if (like) {
|
|
459
|
+
for (var k in obj) {
|
|
460
|
+
var val = obj[k];
|
|
461
|
+
if (k.endWith('_min')) {
|
|
462
|
+
where += " and " + this.escapeId(k.replace('_min', '')) + " >= " + this.escape(val);
|
|
463
|
+
} else if (k.endWith('_max')) {
|
|
464
|
+
where += " and " + this.escapeId(k.replace('_max', '')) + " <= " + this.escape(val);
|
|
465
|
+
} else if (k.endWith('_not')) {
|
|
466
|
+
where += " and " + this.escapeId(k.replace('_not', '')) + " != " + this.escape(val);
|
|
467
|
+
} else if (k.endWith('_has')) {
|
|
468
|
+
where += " and " + this.escapeId(k.replace('_has', '')) + " in (" + val + ")";
|
|
469
|
+
} else if (typeof(val) === "string" && !/^[0-9]+$/.test(val)) {
|
|
470
|
+
where += " and " + this.escapeId(k) + " LIKE '%" + this.escape(val).trim("'") + "%'"
|
|
471
|
+
} else {
|
|
472
|
+
where += " and " + this.escapeId(k) + " = " + val
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
} else {
|
|
476
|
+
for (var k in obj) {
|
|
477
|
+
var val = obj[k];
|
|
478
|
+
if (k.endWith('_min')) {
|
|
479
|
+
where += " and " + this.escapeId(k.replace('_min', '')) + " >= " + this.escape(val.replace('_min',
|
|
480
|
+
''));
|
|
481
|
+
} else if (k.endWith('_max')) {
|
|
482
|
+
where += " and " + this.escapeId(k.replace('_max', '')) + " <= " + this.escape(val);
|
|
483
|
+
} else if (k.endWith('_not')) {
|
|
484
|
+
where += " and " + this.escapeId(k.replace('_not', '')) + " != " + this.escape(val);
|
|
485
|
+
} else if (k.endWith('_has')) {
|
|
486
|
+
where += " and " + this.escapeId(k.replace('_has', '')) + " in (" + val.replace(/`/gi, "") + ")";
|
|
487
|
+
} else {
|
|
488
|
+
where += " and " + this.escapeId(k) + "=" + this.escape(val);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
295
491
|
}
|
|
296
492
|
return where.replace(" and ", "");
|
|
297
493
|
};
|
|
494
|
+
|
|
298
495
|
/**
|
|
299
496
|
* @description 转为set语句
|
|
300
497
|
* @param {Object} obj 用作拼接的对象
|
|
@@ -303,7 +500,16 @@ Sql.prototype.toWhere = function(obj) {
|
|
|
303
500
|
Sql.prototype.toSet = function(obj) {
|
|
304
501
|
var set = "";
|
|
305
502
|
for (var k in obj) {
|
|
306
|
-
|
|
503
|
+
var val = this.escape(obj[k]);
|
|
504
|
+
if (k.endWith('_add')) {
|
|
505
|
+
var k2 = this.escapeId(k.replace('_add', ''));
|
|
506
|
+
set += "," + k2 + " = " + k2 + " + " + val;
|
|
507
|
+
} else if (k.endWith('_del')) {
|
|
508
|
+
var k3 = this.escapeId(k.replace('_del', ''));
|
|
509
|
+
set += "," + k3 + " = " + k3 + " - " + val;
|
|
510
|
+
} else {
|
|
511
|
+
set += "," + this.escapeId(k) + " = " + val;
|
|
512
|
+
}
|
|
307
513
|
}
|
|
308
514
|
return set.replace(",", "");
|
|
309
515
|
};
|
|
@@ -317,8 +523,8 @@ Sql.prototype.toAddSql = function(item) {
|
|
|
317
523
|
var key = "";
|
|
318
524
|
var val = "";
|
|
319
525
|
for (var k in item) {
|
|
320
|
-
key += "
|
|
321
|
-
val += ",
|
|
526
|
+
key += "," + this.escapeId(k);
|
|
527
|
+
val += "," + this.escape(item[k]);
|
|
322
528
|
}
|
|
323
529
|
var sql = "INSERT INTO `{0}` ({1}) VALUES ({2});";
|
|
324
530
|
return sql.replace("{0}", this.table).replace("{1}", key.replace(",", "")).replace("{2}", val.replace(",", ""));
|
|
@@ -353,10 +559,11 @@ Sql.prototype.toSetSql = function(query, item) {
|
|
|
353
559
|
* @param {Object} query 查询键值集合
|
|
354
560
|
* @param {String} sort 排序规则
|
|
355
561
|
* @param {String} view 显示的字段
|
|
562
|
+
* @param {Boolean} like 是否使用like匹配, 默认使用
|
|
356
563
|
* @return {String} sql语句
|
|
357
564
|
*/
|
|
358
|
-
Sql.prototype.toGetSql = function(query, sort, view) {
|
|
359
|
-
var where = this.toWhere(query);
|
|
565
|
+
Sql.prototype.toGetSql = function(query, sort, view, like = true) {
|
|
566
|
+
var where = this.toWhere(query, like);
|
|
360
567
|
var sql = this.toQuery(where, sort, view);
|
|
361
568
|
return sql;
|
|
362
569
|
};
|
|
@@ -396,10 +603,11 @@ Sql.prototype.set = function(query, item) {
|
|
|
396
603
|
* @param {Object} query 查询条件
|
|
397
604
|
* @param {String} sort 排序
|
|
398
605
|
* @param {String} view 返回的字段
|
|
606
|
+
* @param {Boolean} like 是否使用like匹配, 默认使用
|
|
399
607
|
* @return {Promise|Array} 查询结果
|
|
400
608
|
*/
|
|
401
|
-
Sql.prototype.get = function(query, sort, view) {
|
|
402
|
-
var sql = this.toGetSql(query, sort, view);
|
|
609
|
+
Sql.prototype.get = function(query, sort, view, like = true) {
|
|
610
|
+
var sql = this.toGetSql(query, sort, view, like);
|
|
403
611
|
return this.run(sql);
|
|
404
612
|
};
|
|
405
613
|
|
|
@@ -407,19 +615,21 @@ Sql.prototype.get = function(query, sort, view) {
|
|
|
407
615
|
* @description 添加或修改
|
|
408
616
|
* @param {Object} where 查询条件集合
|
|
409
617
|
* @param {Object} set 修改的键值
|
|
618
|
+
* @param {Boolean} like 是否使用like匹配, 默认不使用
|
|
410
619
|
* @return {Promise|Object} 执行结果
|
|
411
620
|
*/
|
|
412
|
-
Sql.prototype.addOrSet = async function(where, set) {
|
|
413
|
-
return await this.addOrSetSql(this.toWhere(where), this.toSet(set));
|
|
621
|
+
Sql.prototype.addOrSet = async function(where, set, like) {
|
|
622
|
+
return await this.addOrSetSql(this.toWhere(where, like), this.toSet(set));
|
|
414
623
|
};
|
|
415
624
|
|
|
416
625
|
/**
|
|
417
626
|
* @description 查询符合结果总数
|
|
418
627
|
* @param {Object} query 查询条件集合
|
|
628
|
+
* @param {Boolean} like 是否使用like匹配, 默认使用
|
|
419
629
|
* @return {Promise|Number} 查询结果
|
|
420
630
|
*/
|
|
421
|
-
Sql.prototype.count = function(query) {
|
|
422
|
-
return this.countSql(this.toWhere(query));
|
|
631
|
+
Sql.prototype.count = function(query, like = true) {
|
|
632
|
+
return this.countSql(this.toWhere(query, like));
|
|
423
633
|
};
|
|
424
634
|
|
|
425
635
|
/**
|
|
@@ -427,24 +637,27 @@ Sql.prototype.count = function(query) {
|
|
|
427
637
|
* @param {Object} query 查询条件
|
|
428
638
|
* @param {String} sort 排序
|
|
429
639
|
* @param {String} view 返回的字段
|
|
640
|
+
* @param {Boolean} like 是否使用like匹配, 默认使用
|
|
430
641
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
431
642
|
*/
|
|
432
|
-
Sql.prototype.getCount = async function(query, sort, view) {
|
|
433
|
-
return this.getCountSql(this.toWhere(query), sort, view);
|
|
643
|
+
Sql.prototype.getCount = async function(query, sort, view, like = true) {
|
|
644
|
+
return this.getCountSql(this.toWhere(query, like), sort, view);
|
|
434
645
|
};
|
|
435
646
|
|
|
436
647
|
/* === 传入数组操作 === */
|
|
437
648
|
/**
|
|
438
649
|
* @description 添加多条数据
|
|
439
650
|
* @param {Array} list 对象数组
|
|
651
|
+
* @param {Boolean} lock 是否锁定
|
|
440
652
|
* @return {Promise|Object} 执行结果
|
|
441
653
|
*/
|
|
442
|
-
Sql.prototype.addList = function(list) {
|
|
443
|
-
var sql = "
|
|
654
|
+
Sql.prototype.addList = function(list, lock = true) {
|
|
655
|
+
var sql = lock ? "BEGIN;\r\n" : "\r\n";
|
|
444
656
|
var len = list.length;
|
|
445
657
|
for (var i = 0; i < len; i++) {
|
|
446
|
-
sql += this.toAddSql(list[i]);
|
|
658
|
+
sql += this.toAddSql(list[i]) + "\r\n";
|
|
447
659
|
}
|
|
660
|
+
sql += lock ? "COMMIT;" : "";
|
|
448
661
|
return this.exec(sql);
|
|
449
662
|
};
|
|
450
663
|
/**
|
|
@@ -484,7 +697,8 @@ Sql.prototype.setList = function(list) {
|
|
|
484
697
|
Sql.prototype.has_param = function(paramDt, sqlDt) {
|
|
485
698
|
var bl = false;
|
|
486
699
|
for (var key in sqlDt) {
|
|
487
|
-
|
|
700
|
+
var value = paramDt[key];
|
|
701
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
488
702
|
bl = true;
|
|
489
703
|
break;
|
|
490
704
|
}
|
|
@@ -533,7 +747,7 @@ Sql.prototype.filter_param = function(paramDt, sqlDt) {
|
|
|
533
747
|
*/
|
|
534
748
|
Sql.prototype.tpl_query = function(paramDt, sqlDt) {
|
|
535
749
|
var sql = "";
|
|
536
|
-
if(sqlDt){
|
|
750
|
+
if (sqlDt) {
|
|
537
751
|
var l = this.config.separator;
|
|
538
752
|
if (l) {
|
|
539
753
|
for (var key in paramDt) {
|
|
@@ -546,12 +760,12 @@ Sql.prototype.tpl_query = function(paramDt, sqlDt) {
|
|
|
546
760
|
var sl = "(";
|
|
547
761
|
var len = arr.length;
|
|
548
762
|
for (var i = 0; i < len; i++) {
|
|
549
|
-
sl += " || " + tpl.replaceAll("{0}", arr[i]);
|
|
763
|
+
sl += " || " + tpl.replaceAll("{0}", this.escape(arr[i]).trim("'"));
|
|
550
764
|
}
|
|
551
765
|
sl = sl.replace(" || ", "") + ")";
|
|
552
766
|
sql += " && " + sl;
|
|
553
767
|
} else {
|
|
554
|
-
sql += " && " + tpl.replaceAll("{0}", value);
|
|
768
|
+
sql += " && " + tpl.replaceAll("{0}", this.escape(value).trim("'"));
|
|
555
769
|
}
|
|
556
770
|
} else {
|
|
557
771
|
if (arr.length > 1) {
|
|
@@ -559,49 +773,50 @@ Sql.prototype.tpl_query = function(paramDt, sqlDt) {
|
|
|
559
773
|
var sl = "(";
|
|
560
774
|
var len = arr.length;
|
|
561
775
|
for (var i = 0; i < len; i++) {
|
|
562
|
-
sl += " ||
|
|
776
|
+
sl += " || " + this.escapeId(key) + " = " + this.escape(arr[i]);
|
|
563
777
|
}
|
|
564
778
|
sl = sl.replace(" || ", "") + ")";
|
|
565
779
|
sql += " && " + sl;
|
|
566
780
|
} else {
|
|
567
|
-
sql += " &&
|
|
781
|
+
sql += " && " + this.escapeId(key) + " = " + this.escape(value);
|
|
568
782
|
}
|
|
569
783
|
}
|
|
570
784
|
}
|
|
571
785
|
} else {
|
|
572
786
|
for (var key in paramDt) {
|
|
787
|
+
var value = this.escape(paramDt[key]);
|
|
573
788
|
if (sqlDt[key]) {
|
|
574
|
-
sql += " && " + sqlDt[key].replaceAll("{0}",
|
|
789
|
+
sql += " && " + sqlDt[key].replaceAll("{0}", value.trim("'"));
|
|
575
790
|
} else {
|
|
576
|
-
sql += " &&
|
|
791
|
+
sql += " && " + this.escapeId(key) + " = " + value;
|
|
577
792
|
}
|
|
578
793
|
}
|
|
579
794
|
}
|
|
580
|
-
}
|
|
581
|
-
else {
|
|
795
|
+
} else {
|
|
582
796
|
// 如果没有模板,则直接拼接参数
|
|
583
797
|
var l = this.config.separator;
|
|
584
798
|
if (l) {
|
|
585
799
|
// 使用分隔数组拼接
|
|
586
800
|
for (var key in paramDt) {
|
|
587
|
-
var
|
|
801
|
+
var value = paramDt[key];
|
|
802
|
+
var arr = value.split(l);
|
|
588
803
|
if (arr.length > 1) {
|
|
589
804
|
// 如果数量大于0,则增加多条件
|
|
590
805
|
var sl = "(";
|
|
591
806
|
var len = arr.length;
|
|
592
807
|
for (var i = 0; i < len; i++) {
|
|
593
|
-
sl += " ||
|
|
808
|
+
sl += " || " + this.escapeId(key) + " = " + this.escape(arr[i]);
|
|
594
809
|
}
|
|
595
810
|
sl = sl.replace(" || ", "") + ")";
|
|
596
811
|
sql += " && " + sl;
|
|
597
812
|
} else {
|
|
598
|
-
sql += " &&
|
|
813
|
+
sql += " && " + this.escapeId(key) + " = " + this.escape(value);
|
|
599
814
|
}
|
|
600
815
|
}
|
|
601
816
|
} else {
|
|
602
817
|
// 直接拼接
|
|
603
818
|
for (var key in paramDt) {
|
|
604
|
-
sql += " &&
|
|
819
|
+
sql += " && " + this.escapeId(key) + " = " + this.escape(paramDt[key]);
|
|
605
820
|
}
|
|
606
821
|
}
|
|
607
822
|
}
|
|
@@ -618,14 +833,15 @@ Sql.prototype.tpl_body = function(paramDt, sqlDt) {
|
|
|
618
833
|
var sql = "";
|
|
619
834
|
if (!sqlDt || sqlDt.length === 0) {
|
|
620
835
|
for (var key in paramDt) {
|
|
621
|
-
sql += " ,
|
|
836
|
+
sql += " , " + this.escapeId(key) + " = " + this.escape(val[key]);
|
|
622
837
|
}
|
|
623
838
|
} else {
|
|
624
839
|
for (var key in paramDt) {
|
|
840
|
+
var value = this.escape(paramDt[key]);
|
|
625
841
|
if (sqlDt[key]) {
|
|
626
|
-
sql += " , " + sqlDt[key].replace("{0}",
|
|
842
|
+
sql += " , " + sqlDt[key].replace("{0}", value).replace('+ -', '- ').replace('- -', '+ ');
|
|
627
843
|
} else {
|
|
628
|
-
sql += " ,
|
|
844
|
+
sql += " , " + this.escapeId(key) + " = " + value;
|
|
629
845
|
}
|
|
630
846
|
}
|
|
631
847
|
}
|
|
@@ -645,11 +861,14 @@ Sql.prototype.model = function(model) {
|
|
|
645
861
|
var n = obj[prop];
|
|
646
862
|
var cha = value - n;
|
|
647
863
|
if (cha > 0) {
|
|
648
|
-
_this.setSql("`" + _this.key + "`=" + obj[_this.key]
|
|
864
|
+
_this.setSql("`" + _this.key + "`=" + obj[_this.key], "`" + prop + "`=`" +
|
|
865
|
+
prop + "` + " + cha);
|
|
649
866
|
} else if (cha < 0) {
|
|
650
|
-
_this.setSql("`" + _this.key + "`=" + obj[_this.key]
|
|
867
|
+
_this.setSql("`" + _this.key + "`=" + obj[_this.key], "`" + prop + "`=`" +
|
|
868
|
+
prop + "` - " + (-cha));
|
|
651
869
|
} else {
|
|
652
|
-
_this.setSql("`" + _this.key + "`=" + obj[_this.key]
|
|
870
|
+
_this.setSql("`" + _this.key + "`=" + obj[_this.key], "`" + prop + "`=" +
|
|
871
|
+
value);
|
|
653
872
|
}
|
|
654
873
|
} else {
|
|
655
874
|
var query = {};
|
|
@@ -669,21 +888,26 @@ Sql.prototype.model = function(model) {
|
|
|
669
888
|
* @param {Object} query 查询条件
|
|
670
889
|
* @param {String} sort 排序
|
|
671
890
|
* @param {String} view 返回的字段
|
|
891
|
+
* @param {Boolean} like 是否like匹配
|
|
672
892
|
* @return {Promise|Array} 查询结果
|
|
673
893
|
*/
|
|
674
|
-
Sql.prototype.getObj = async function(query, sort, view) {
|
|
894
|
+
Sql.prototype.getObj = async function(query, sort, view, like) {
|
|
675
895
|
this.page = 1;
|
|
676
896
|
this.size = 1;
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
897
|
+
var key = this.key;
|
|
898
|
+
if (key) {
|
|
899
|
+
if (view && view.indexOf(key) === -1 && view.indexOf('*') === -1) {
|
|
900
|
+
view += "," + this.escapeId(key);
|
|
680
901
|
}
|
|
681
902
|
}
|
|
682
|
-
|
|
903
|
+
if (like === undefined) {
|
|
904
|
+
like = this.like;
|
|
905
|
+
}
|
|
906
|
+
var sql = this.toGetSql(query, sort, view, like);
|
|
683
907
|
var list = await this.run(sql);
|
|
684
908
|
if (list.length > 0) {
|
|
685
909
|
var obj = list[0];
|
|
686
|
-
if (
|
|
910
|
+
if (key) {
|
|
687
911
|
return this.model(obj);
|
|
688
912
|
} else {
|
|
689
913
|
return obj;
|
|
@@ -693,4 +917,4 @@ Sql.prototype.getObj = async function(query, sort, view) {
|
|
|
693
917
|
}
|
|
694
918
|
};
|
|
695
919
|
|
|
696
|
-
module.exports = Sql;
|
|
920
|
+
module.exports = Sql;
|
package/sql.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "user_account",
|
|
3
|
+
"title": "用户信息",
|
|
4
|
+
"table": "user_account",
|
|
5
|
+
"key": "user_id",
|
|
6
|
+
"orderby_default": "`user_id` desc",
|
|
7
|
+
"field_default": "`user_id`,`state`,`vip`,`gm`,`mc`,`referee_id`,`create_time`,`login_time`,`invite_code`,`phone`,`phone_state`,`username`,`nickname`,`email`,`email_state`,`user_group`,`user_admin`,`login_ip`,`signature`,`avatar`,`friends`,`admin_group`",
|
|
8
|
+
"method": "get",
|
|
9
|
+
"query": {
|
|
10
|
+
"state_min": "`state` >= '{0}'",
|
|
11
|
+
"state_max": "`state` <= '{0}'",
|
|
12
|
+
"vip_min": "`vip` >= '{0}'",
|
|
13
|
+
"vip_max": "`vip` <= '{0}'",
|
|
14
|
+
"gm_min": "`gm` >= '{0}'",
|
|
15
|
+
"gm_max": "`gm` <= '{0}'",
|
|
16
|
+
"mc_min": "`mc` >= '{0}'",
|
|
17
|
+
"mc_max": "`mc` <= '{0}'",
|
|
18
|
+
"create_time_min": "`create_time` >= '{0}'",
|
|
19
|
+
"create_time_max": "`create_time` <= '{0}'",
|
|
20
|
+
"login_time_min": "`login_time` >= '{0}'",
|
|
21
|
+
"login_time_max": "`login_time` <= '{0}'",
|
|
22
|
+
"salt": "`salt` like '%{0}%'",
|
|
23
|
+
"invite_code": "`invite_code` like '%{0}%'",
|
|
24
|
+
"phone": "`phone` like '%{0}%'",
|
|
25
|
+
"username": "`username` like '%{0}%'",
|
|
26
|
+
"nickname": "`nickname` like '%{0}%'",
|
|
27
|
+
"password": "`password` like '%{0}%'",
|
|
28
|
+
"email": "`email` like '%{0}%'",
|
|
29
|
+
"user_group": "`user_group` like '%{0}%'",
|
|
30
|
+
"user_admin": "`user_admin` like '%{0}%'",
|
|
31
|
+
"login_ip": "`login_ip` like '%{0}%'",
|
|
32
|
+
"signature": "`signature` like '%{0}%'",
|
|
33
|
+
"avatar": "`avatar` like '%{0}%'",
|
|
34
|
+
"friends": "`friends` like '%{0}%'",
|
|
35
|
+
"admin_group": "`admin_group` like '%{0}%'"
|
|
36
|
+
},
|
|
37
|
+
"query_default": {
|
|
38
|
+
"user_id": "`user_id` = {user_id}"
|
|
39
|
+
},
|
|
40
|
+
"update": {
|
|
41
|
+
"state_add": "`state` = `state` + '{0}'",
|
|
42
|
+
"vip_add": "`vip` = `vip` + '{0}'",
|
|
43
|
+
"gm_add": "`gm` = `gm` + '{0}'",
|
|
44
|
+
"mc_add": "`mc` = `mc` + '{0}'"
|
|
45
|
+
},
|
|
46
|
+
"filter": {
|
|
47
|
+
"table": "table",
|
|
48
|
+
"page": "page",
|
|
49
|
+
"size": "size",
|
|
50
|
+
"method": "method",
|
|
51
|
+
"orderby": "orderby",
|
|
52
|
+
"field": "field",
|
|
53
|
+
"count_ret": "count_ret",
|
|
54
|
+
"user_id": "user_id"
|
|
55
|
+
}
|
|
56
|
+
}
|