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/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('mm_expand');
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.map(function(o) {
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
- for (var k in obj) {
294
- where += " and `" + k + "`='" + obj[k] + "'";
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
- set += ",`" + k + "`='" + obj[k] + "'";
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 += ",`" + k + "`";
321
- val += ",'" + item[k] + "'";
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 = "START TRANSACTION;\n";
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
- if (paramDt[key] !== undefined && paramDt[key] !== null && paramDt[key] !== '') {
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 += " || `" + key + "` = '" + arr[i] + "'";
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 += " && `" + key + "` = '" + value + "'";
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}", paramDt[key]);
789
+ sql += " && " + sqlDt[key].replaceAll("{0}", value.trim("'"));
575
790
  } else {
576
- sql += " && `" + key + "` = '" + paramDt[key] + "'";
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 arr = paramDt[key].split(l);
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 += " || `" + key + "` = '" + arr[i] + "'";
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 += " && `" + key + "` = '" + paramDt[key] + "'";
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 += " && `" + key + "` = '" + paramDt[key] + "'";
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 += " , `" + key + "` = '" + val[key];
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}", paramDt[key]).replace('+ -', '- ').replace('- -', '+ ');
842
+ sql += " , " + sqlDt[key].replace("{0}", value).replace('+ -', '- ').replace('- -', '+ ');
627
843
  } else {
628
- sql += " , `" + key + "` = '" + paramDt[key] + "'";
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] + "", "`" + prop + "`=`" + prop + "` + " + cha);
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] + "", "`" + prop + "`=`" + prop + "` - " + (-cha));
867
+ _this.setSql("`" + _this.key + "`=" + obj[_this.key], "`" + prop + "`=`" +
868
+ prop + "` - " + (-cha));
651
869
  } else {
652
- _this.setSql("`" + _this.key + "`=" + obj[_this.key] + "", "`" + prop + "`=" + value);
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
- if (this.key) {
678
- if (view && view.indexOf(this.key) === -1 && view.indexOf('*') === -1) {
679
- view += ",`" + this.key + "`";
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
- var sql = this.toGetSql(query, sort, view);
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 (this.key) {
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
+ }