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