Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
E
evm-store
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanli
evm-store
Commits
f92508d1
Commit
f92508d1
authored
Jul 20, 2021
by
wanli
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
✨
feat(资源监视器): 集成资源监视器功能
parent
2c317d70
Changes
17
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
3427 additions
and
394 deletions
+3427
-394
tools/build_out/controllers/monitor.py
tools/build_out/controllers/monitor.py
+8
-7
tools/build_out/controllers/monitorWatch.py
tools/build_out/controllers/monitorWatch.py
+17
-9
tools/build_out/manager.py
tools/build_out/manager.py
+28
-2
tools/build_out/views/monitor.py
tools/build_out/views/monitor.py
+335
-0
tools/frontend/package-lock.json
tools/frontend/package-lock.json
+933
-86
tools/frontend/package.json
tools/frontend/package.json
+6
-4
tools/frontend/src/api/openapi.js
tools/frontend/src/api/openapi.js
+16
-1
tools/frontend/src/components/SettingDrawer/index.js
tools/frontend/src/components/SettingDrawer/index.js
+125
-109
tools/frontend/src/utils/notify.js
tools/frontend/src/utils/notify.js
+45
-0
tools/frontend/src/utils/utils.js
tools/frontend/src/utils/utils.js
+44
-0
tools/frontend/src/views/Application/Monitor.vue
tools/frontend/src/views/Application/Monitor.vue
+573
-176
tools/frontend/src/views/Application/components/EvmChart.vue
tools/frontend/src/views/Application/components/EvmChart.vue
+252
-0
tools/frontend/src/views/Application/components/EvmHistoryChart.vue
...tend/src/views/Application/components/EvmHistoryChart.vue
+223
-0
tools/frontend/src/views/Application/components/ImageChart.vue
.../frontend/src/views/Application/components/ImageChart.vue
+290
-0
tools/frontend/src/views/Application/components/LvglChart.vue
...s/frontend/src/views/Application/components/LvglChart.vue
+255
-0
tools/frontend/src/views/Application/components/LvglHistoryChart.vue
...end/src/views/Application/components/LvglHistoryChart.vue
+222
-0
tools/frontend/src/views/Application/components/mixins/resize.js
...rontend/src/views/Application/components/mixins/resize.js
+55
-0
No files found.
tools/build_out/controllers/monitor.py
View file @
f92508d1
'''
Author: your name
Date: 2021-06-29 19:24:32
LastEditTime: 2021-07-
12 12:09:34
LastEditTime: 2021-07-
20 01:18:45
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath:
\
evm-store
\b
ackend
\
controller
\
monitor.py
'''
from
application.app
import
db
from
models.device
import
DeviceModel
from
models.monitorEvm
import
MonitorEvmModel
from
models.monitorImage
import
MonitorImageModel
from
models.monitorLvgl
import
MonitorLvglModel
from
models.monitorSystem
import
MonitorSystemModel
from
models.monitorWatch
import
MonitorWatchModel
from
webcreator.log
import
logger
class
SystemResource
(
object
):
def
get
(
self
):
...
...
@@ -58,7 +59,7 @@ class ImageResource(object):
t
=
[]
for
a
in
array
:
a
.
update
({
"watch"
:
watch
})
t
.
append
(
**
a
)
t
.
append
(
a
)
db
.
session
.
execute
(
MonitorImageModel
.
__table__
.
insert
(),
t
)
db
.
session
.
commit
()
...
...
@@ -73,11 +74,11 @@ def insert_data(msg):
# 先判断手表imei是否存在,不存在则先注册手表IMEI
watch_id
=
-
1
if
msg
.
get
(
"imei"
):
result
=
MonitorWatch
Model
.
query
.
filter_by
(
imei
=
msg
.
get
(
"imei"
))
.
one_or_none
()
result
=
Device
Model
.
query
.
filter_by
(
imei
=
msg
.
get
(
"imei"
))
.
one_or_none
()
if
result
:
watch_id
=
result
.
id
else
:
result
=
MonitorWatchModel
.
query
.
filter
(
MonitorWatchModel
.
imei
==
msg
.
get
(
"imei"
))
.
one_or_none
(
)
result
=
DeviceModel
(
imei
=
msg
.
get
(
"imei"
)
)
db
.
session
.
add
(
result
)
db
.
session
.
commit
()
watch_id
=
result
.
id
...
...
@@ -99,7 +100,7 @@ def insert_data(msg):
imageResource
.
post_array
(
msg
.
get
(
"image"
),
watch_id
)
def
get_watch_list
():
result
=
MonitorWatch
Model
.
query
.
all
()
result
=
Device
Model
.
query
.
all
()
tmp
=
[]
for
item
in
result
:
tmp
.
append
({
...
...
@@ -158,7 +159,7 @@ def image_data(watch, start, end):
def
get_monitor_list
(
watch
,
category
,
start
,
end
):
# 判断watch是否存在
w
=
MonitorWatchModel
.
query
.
filter
(
MonitorWatch
Model
.
id
==
watch
)
.
first
()
w
=
DeviceModel
.
query
.
filter
(
Device
Model
.
id
==
watch
)
.
first
()
if
not
w
:
return
[]
...
...
tools/build_out/controllers/monitorWatch.py
View file @
f92508d1
'''
Author: your name
Date: 2021-07-15 09:33:39
LastEditTime: 2021-07-20 01:18:27
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath:
\
evm-store
\t
ools
\b
uild_out
\
controllers
\
monitorWatch.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from
datetime
import
datetime
from
application.app
import
db
from
models.
monitorWatch
import
MonitorWatch
Model
from
models.
device
import
Device
Model
from
webcreator.log
import
logger
from
webcreator.response
import
ResponseCode
...
...
@@ -13,8 +21,8 @@ class MonitorWatchResource(object):
def
get
(
self
,
uuid
,
params
):
# handle business
filters
=
[
MonitorWatchModel
.
is_delete
==
False
,
MonitorWatch
Model
.
uuid
==
uuid
]
result
=
MonitorWatch
Model
.
query
.
filter
(
*
filters
)
.
first
()
filters
=
[
DeviceModel
.
is_delete
==
False
,
Device
Model
.
uuid
==
uuid
]
result
=
Device
Model
.
query
.
filter
(
*
filters
)
.
first
()
if
result
:
return
result
,
ResponseCode
.
HTTP_SUCCESS
return
None
,
ResponseCode
.
HTTP_NOT_FOUND
...
...
@@ -22,8 +30,8 @@ class MonitorWatchResource(object):
def
getList
(
self
,
params
):
# handle business
logger
.
warn
(
params
)
filters
=
[
MonitorWatch
Model
.
is_delete
==
False
]
result
=
MonitorWatchModel
.
query
.
filter
(
*
filters
)
.
order_by
(
MonitorWatch
Model
.
create_at
)
.
paginate
(
params
.
get
(
'page'
,
1
),
params
.
get
(
'pageSize'
,
10
),
error_out
=
False
)
filters
=
[
Device
Model
.
is_delete
==
False
]
result
=
DeviceModel
.
query
.
filter
(
*
filters
)
.
order_by
(
Device
Model
.
create_at
)
.
paginate
(
params
.
get
(
'page'
,
1
),
params
.
get
(
'pageSize'
,
10
),
error_out
=
False
)
if
result
:
return
result
,
ResponseCode
.
HTTP_SUCCESS
...
...
@@ -31,7 +39,7 @@ class MonitorWatchResource(object):
def
post
(
self
,
params
,
jwt
=
{}):
# handle business
result
=
MonitorWatchModel
.
query
.
filter
(
MonitorWatch
Model
.
imei
==
params
.
get
(
'imei'
))
.
first
()
result
=
DeviceModel
.
query
.
filter
(
Device
Model
.
imei
==
params
.
get
(
'imei'
))
.
first
()
if
result
and
result
.
is_delete
:
result
.
is_delete
=
False
result
.
update_by
=
jwt
.
get
(
"id"
,
""
)
...
...
@@ -41,14 +49,14 @@ class MonitorWatchResource(object):
elif
result
and
result
.
is_delete
==
False
:
return
False
,
ResponseCode
.
HTTP_INVAILD_REQUEST
result
=
MonitorWatch
Model
(
**
params
)
result
=
Device
Model
(
**
params
)
db
.
session
.
add
(
result
)
db
.
session
.
commit
()
return
True
,
ResponseCode
.
HTTP_SUCCESS
def
put
(
self
,
uuid
,
params
,
jwt
=
{}):
# handle business
result
=
MonitorWatchModel
.
query
.
filter
(
MonitorWatch
Model
.
uuid
==
uuid
)
.
first
()
result
=
DeviceModel
.
query
.
filter
(
Device
Model
.
uuid
==
uuid
)
.
first
()
if
not
result
:
return
None
,
ResponseCode
.
HTTP_NOT_FOUND
...
...
@@ -64,7 +72,7 @@ class MonitorWatchResource(object):
def
delete
(
self
,
uuid
,
jwt
=
{}):
# handle business
result
=
MonitorWatchModel
.
query
.
filter
(
MonitorWatch
Model
.
uuid
==
uuid
)
.
first
()
result
=
DeviceModel
.
query
.
filter
(
Device
Model
.
uuid
==
uuid
)
.
first
()
if
not
result
:
return
False
,
ResponseCode
.
HTTP_NOT_FOUND
...
...
tools/build_out/manager.py
View file @
f92508d1
'''
Author: your name
Date: 2021-06-15 17:40:09
LastEditTime: 2021-0
6-30 18:09:51
LastEditTime: 2021-0
7-19 23:46:49
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath:
\
evm-store
\t
ools
\r
esources
\
manager.py
'''
# -*- coding: utf-8 -*-
import
signal
from
tornado.wsgi
import
WSGIContainer
from
tornado.web
import
Application
,
FallbackHandler
from
tornado.httpserver
import
HTTPServer
from
tornado.ioloop
import
IOLoop
from
flask_script
import
Manager
from
flask_migrate
import
Migrate
from
application.app
import
create_app
,
db
from
application.config
import
config
from
views.monitor
import
DeviceMessageHandler
,
NotifyHandler
,
WatchHandler
# 根据配置初始化app
app
=
create_app
(
config
)
migrate
=
Migrate
(
app
,
db
)
manager
=
Manager
(
app
)
class
GracefulExit
(
SystemExit
):
code
=
1
def
raise_graceful_exit
(
*
args
):
IOLoop
.
current
()
.
stop
()
print
(
"Gracefully shutdown"
,
args
)
raise
GracefulExit
()
@
manager
.
command
def
run
():
"""
...
...
@@ -39,7 +51,21 @@ def debug():
To use: python3 manager.py debug
"""
# app.logger.setLevel(logging.DEBUG)
app
.
run
(
debug
=
True
,
port
=
3000
,
host
=
'127.0.0.1'
)
# app.run(debug=True, port=3000, host='127.0.0.1')
wsgi_app
=
WSGIContainer
(
app
)
application
=
Application
([
(
r"/api/v1/evm_store/monitor"
,
DeviceMessageHandler
),
(
r"/api/v1/evm_store/watch"
,
WatchHandler
),
(
r"/ws/v1/notify"
,
NotifyHandler
),
(
r'.*'
,
FallbackHandler
,
dict
(
fallback
=
wsgi_app
))
],
**
{
'debug'
:
True
,
})
application
.
listen
(
3000
,
address
=
'127.0.0.1'
,
xheaders
=
True
)
# 主进程退出信号
signal
.
signal
(
signal
.
SIGINT
,
raise_graceful_exit
)
signal
.
signal
(
signal
.
SIGTERM
,
raise_graceful_exit
)
IOLoop
.
instance
()
.
start
()
if
__name__
==
'__main__'
:
manager
.
run
()
tools/build_out/views/monitor.py
0 → 100644
View file @
f92508d1
'''
Author: your name
Date: 2021-06-29 19:33:41
LastEditTime: 2021-07-20 01:20:45
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath:
\
evm-store
\b
ackend
\v
iew
\
monitor.py
'''
import
json
import
signal
import
time
import
pprint
import
traceback
import
jwt
from
typing
import
(
Any
,)
from
threading
import
Timer
from
datetime
import
datetime
,
timedelta
import
tornado.ioloop
import
tornado.web
from
tornado
import
httputil
from
tornado.web
import
RequestHandler
,
StaticFileHandler
from
tornado.websocket
import
WebSocketHandler
,
WebSocketClosedError
from
application.app
import
config
from
webcreator.utils
import
ObjectDict
from
webcreator.log
import
logger
from
models.device
import
DeviceModel
from
models.user
import
UserModel
from
controllers.monitor
import
insert_data
,
get_monitor_list
,
get_watch_list
def
datetime2secs
(
mydate
):
return
time
.
mktime
(
mydate
.
timetuple
())
def
secs2datetime
(
ts
):
return
datetime
.
fromtimestamp
(
ts
)
class
GracefulExit
(
SystemExit
):
code
=
1
def
raise_graceful_exit
(
*
args
):
tornado
.
ioloop
.
IOLoop
.
current
()
.
stop
()
print
(
"Gracefully shutdown"
,
args
)
raise
GracefulExit
()
class
BaseHandler
(
RequestHandler
):
"""解决JS跨域请求问题"""
def
set_default_headers
(
self
):
self
.
set_header
(
'Access-Control-Allow-Origin'
,
'*'
)
self
.
set_header
(
'Access-Control-Allow-Methods'
,
'POST, GET'
)
self
.
set_header
(
'Access-Control-Max-Age'
,
1000
)
self
.
set_header
(
'Access-Control-Allow-Headers'
,
'*'
)
self
.
set_header
(
'Content-type'
,
'application/json'
)
class
WebsocketResponse
(
ObjectDict
):
def
__init__
(
self
,
type
=
"Response"
,
api_code
=-
1
,
message
=
'fail'
,
data
=
None
,
traceback
=
""
):
super
(
WebsocketResponse
,
self
)
.
__init__
()
self
.
type
=
type
self
.
code
=
api_code
self
.
message
=
message
self
.
data
=
data
self
.
traceback
=
traceback
if
isinstance
(
self
.
data
,
list
):
self
.
count
=
len
(
self
.
data
)
def
pushmessage
(
func
):
def
send
(
*
agrs
,
**
kwargs
):
self
=
agrs
[
0
]
ret
=
func
(
*
agrs
,
**
kwargs
)
if
ret
:
msg
,
binary
=
ret
try
:
if
isinstance
(
msg
,
WebsocketResponse
)
or
isinstance
(
msg
,
dict
):
self
.
write_message
(
json
.
dumps
(
msg
),
binary
)
elif
isinstance
(
msg
,
str
):
self
.
write_message
(
msg
,
binary
)
else
:
self
.
write_message
(
repr
(
msg
),
binary
)
except
WebSocketClosedError
as
e
:
logger
.
error
(
e
)
traceback
.
print_exc
()
self
.
on_close
()
return
send
class
BaseWebsocket
(
WebSocketHandler
):
_clients
=
[]
handlers
=
{}
def
open
(
self
):
# 新加入一个连接后,设置一个接收消息时间戳
# 同时查询改用可以查看哪些设备
# 当有消息到来时,遍历用户列表,将设备IMEI与每个用户的IMEI列表比对
# 如果用户列表有这个IMEI,则需要向该用户广播消息
# 列表 [里面存放字典]
# 字典 { 'uuid': '', 'context': self, 'devices': ['imei', 'imei'], 'ts': '接收消息时间戳' }
className
=
self
.
__class__
.
__name__
logger
.
warning
(
"websocket of
%
s is opened"
%
className
)
if
className
not
in
self
.
handlers
:
self
.
handlers
[
className
]
=
set
()
self
.
handlers
[
className
]
.
add
(
self
)
logger
.
info
(
self
.
handlers
[
className
])
# pprint.pprint(self.handlers)
@
pushmessage
def
send
(
self
,
message
,
binary
=
False
):
return
message
,
binary
def
on_close
(
self
):
className
=
self
.
__class__
.
__name__
logger
.
warning
(
"websocket of
%
s is closed"
%
className
)
if
className
in
self
.
handlers
and
self
in
self
.
handlers
[
className
]:
# 更加健壮的处理是,这里需要增加一个self是否存在的判断
self
.
handlers
[
className
]
.
remove
(
self
)
for
i
,
c
in
enumerate
(
self
.
_clients
):
if
id
(
self
)
==
id
(
c
.
get
(
"context"
)):
del
self
.
_clients
[
i
]
def
check_origin
(
self
,
origin
):
logger
.
info
(
origin
)
return
True
@
classmethod
def
broadcastMessage
(
cls
,
message
):
# pprint.pprint(message)
print
(
"=======>"
,
cls
.
_clients
)
if
not
message
.
get
(
"imei"
):
return
False
for
item
in
cls
.
_clients
:
if
message
.
get
(
"imei"
)
in
item
.
get
(
"devices"
,
[]):
item
.
get
(
"context"
)
.
write_message
(
json
.
dumps
(
message
))
# className = cls.__name__
# message = json.dumps(message)
# if className in cls.handlers:
# for handler in cls.handlers[className]:
# # 判断用户能否查看该设备
# handler.send(message, binary)
class
NotifyHandler
(
BaseWebsocket
):
"""
建立与web前端的通信连接,发送状态信息报文
"""
_timer
=
None
def
__init__
(
self
,
application
:
tornado
.
web
.
Application
,
request
:
httputil
.
HTTPServerRequest
,
**
kwargs
:
Any
)
->
None
:
super
()
.
__init__
(
application
,
request
,
**
kwargs
)
self
.
on_heartbeat
()
def
open
(
self
):
super
(
NotifyHandler
,
self
)
.
open
()
def
on_message
(
self
,
message
):
try
:
className
=
self
.
__class__
.
__name__
message
=
json
.
loads
(
message
)
# 判断消息类型
if
message
.
get
(
"type"
):
# 获取token值,检验正确与否,获取uuid
payload
=
jwt
.
decode
(
message
.
get
(
"token"
),
config
.
JWT_SECRET_KEY
,
verify
=
True
,
algorithms
=
[
'HS256'
])
logger
.
info
(
payload
)
# 认证包,认证不通过,则剔除该连接
if
message
.
get
(
"type"
)
==
"auth"
:
if
not
message
.
get
(
"token"
):
self
.
write_message
(
json
.
dumps
({
"code"
:
400
,
"data"
:
None
,
"msg"
:
"token can not be null"
}))
return
user
=
UserModel
.
query
.
filter
(
UserModel
.
uuid
==
payload
.
get
(
"sub"
)
.
get
(
"uuid"
))
.
one_or_none
()
if
not
user
:
self
.
write_message
(
json
.
dumps
({
"code"
:
400
,
"data"
:
None
,
"msg"
:
"user not exists"
}))
# self.close()
return
# 查询该用户可查看设备
devices
=
DeviceModel
.
query
.
filter
(
DeviceModel
.
create_by
==
user
.
id
)
.
all
()
if
len
(
devices
):
logger
.
info
(
"==========================================================>"
)
self
.
_clients
.
append
({
'uuid'
:
payload
.
get
(
"sub"
)
.
get
(
"uuid"
),
'context'
:
self
,
'devices'
:
list
(
map
(
lambda
d
:
d
.
imei
,
devices
)),
'ts'
:
int
(
time
.
time
())
})
self
.
write_message
(
json
.
dumps
({
'code'
:
200
,
'data'
:
None
,
'msg'
:
'auth passed'
}))
else
:
# 没有设备,是否断开连接
self
.
write_message
(
json
.
dumps
({
'code'
:
400
,
'data'
:
None
,
'msg'
:
'no devices'
}))
# self.close()
elif
message
.
get
(
"type"
)
==
"heartbeat"
:
# 心跳包
# 收到心跳包消息,更新接收数据时间
for
c
in
self
.
_clients
:
if
c
.
get
(
"uuid"
)
==
payload
.
get
(
"sub"
)
.
get
(
"uuid"
):
c
[
"ts"
]
=
int
(
time
.
time
())
self
.
write_message
(
json
.
dumps
({
'code'
:
200
,
'data'
:
None
,
'msg'
:
'update session timestamp success'
}))
else
:
self
.
write_message
(
json
.
dumps
({
'code'
:
200
,
'data'
:
None
,
'msg'
:
'unkonw message packet, disconnect by server'
}))
self
.
handlers
[
className
]
.
remove
(
self
)
except
Exception
as
e
:
# 认证失败会导致触发异常,这里不能remove(self),否则会导致on_close方法报错
self
.
write_message
(
json
.
dumps
({
'code'
:
400
,
'data'
:
e
.
args
,
'msg'
:
"server error"
}))
logger
.
error
(
e
)
traceback
.
print_exc
()
logger
.
info
(
message
)
def
on_heartbeat
(
self
):
# 心跳定时器,固定间隔扫描连接列表,当连接超时,主动剔除该连接
for
i
in
range
(
len
(
self
.
_clients
)
-
1
,
-
1
,
-
1
):
if
int
(
time
.
time
())
-
self
.
_clients
[
i
]
.
get
(
"ts"
)
>
5
:
# self._clients.pop(i)
del
self
.
_clients
[
i
]
className
=
self
.
__class__
.
__name__
if
self
.
handlers
.
get
(
className
,
None
)
and
self
in
self
.
handlers
[
className
]:
self
.
handlers
[
className
]
.
remove
(
self
)
self
.
_timer
=
Timer
(
1
,
self
.
on_heartbeat
)
self
.
_timer
.
start
()
class
MainHandler
(
BaseHandler
):
def
get
(
self
,
*
args
,
**
kwargs
):
print
(
"#############"
,
args
)
print
(
"/////////////"
,
kwargs
)
print
(
self
.
request
.
path
)
# 请求路径
print
(
self
.
request
.
method
)
# 请求方法
print
(
self
.
request
.
host
)
# IP地址
print
(
self
.
request
.
protocol
)
# self.get_query_argument('a', value)
# self.get_body_argument()
# self.request.files
self
.
write
(
json
.
dumps
({
"msg"
:
"Hello, world"
}))
def
post
(
self
):
data
=
tornado
.
escape
.
json_decode
(
self
.
request
.
body
)
self
.
write
(
json
.
dumps
({
'code'
:
100
,
'data'
:
data
,
'msg'
:
'success'
}))
message
=
{
'imei'
:
'12345678900005'
,
'type'
:
'report'
,
'system'
:
{
'free_size'
:
0
},
'lvgl'
:
{
'total_size'
:
5242880
,
'free_cnt'
:
31
,
'free_size'
:
1279664
,
'free_biggest_size'
:
1205448
,
'used_cnt'
:
832
,
'used_pct'
:
76
,
'frag_pct'
:
6
},
'evm'
:
{
'total_size'
:
2097152
,
'free_size'
:
0
,
'gc_usage'
:
50
},
'image'
:
[{
'uri'
:
'evue_launcher'
,
'length'
:
1043
,
'png_total_count'
:
0
,
'png_uncompressed_size'
:
0
,
'png_file_size'
:
0
},
{
'uri'
:
'kdgs_1_storyList'
,
'length'
:
9608
,
'png_total_count'
:
193
,
'png_uncompressed_size'
:
370884
,
'png_file_size'
:
209807
}]}
insert_data
(
message
)
# 这里不能使用广播,得点对点发送,有此设备的账号才能看到调试信息
NotifyHandler
.
broadcastMessage
(
message
)
class
WatchHandler
(
BaseHandler
):
def
get
(
self
,
*
args
,
**
kwargs
):
# 获取手表列表
print
(
"#############"
,
args
)
print
(
"/////////////"
,
kwargs
)
print
(
self
.
request
.
path
)
# 请求路径
print
(
self
.
request
.
method
)
# 请求方法
print
(
self
.
request
.
host
)
# IP地址
print
(
self
.
request
.
protocol
)
try
:
result
=
get_watch_list
()
if
result
:
self
.
write
(
json
.
dumps
({
'code'
:
200
,
'data'
:
result
,
'msg'
:
'success'
}))
else
:
self
.
write
(
json
.
dumps
({
'code'
:
204
,
'data'
:
None
,
'msg'
:
'no data'
}))
except
Exception
as
e
:
logger
.
error
(
e
)
self
.
write
(
json
.
dumps
({
'code'
:
500
,
'data'
:
None
,
'msg'
:
'server error'
}))
def
post
(
self
):
data
=
tornado
.
escape
.
json_decode
(
self
.
request
.
body
)
self
.
write
(
json
.
dumps
({
'code'
:
100
,
'data'
:
data
,
'msg'
:
'success'
}))
class
DeviceMessageHandler
(
BaseHandler
):
def
get
(
self
):
if
not
self
.
get_argument
(
'watch'
,
None
):
self
.
write
(
json
.
dumps
({
'code'
:
400
,
'msg'
:
'params error, watch can not be null'
}))
return
try
:
watch
=
self
.
get_query_argument
(
'watch'
)
category
=
self
.
get_query_argument
(
'category'
,
'all'
)
start
=
self
.
get_query_argument
(
'start'
,
None
)
end
=
self
.
get_query_argument
(
'end'
,
None
)
if
start
and
start
.
isdigit
():
start
=
int
(
start
)
start
=
time
.
localtime
(
start
)
start
=
time
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
,
start
)
else
:
start
=
(
datetime
.
now
()
-
timedelta
(
minutes
=
10
))
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
if
end
and
end
.
isdigit
():
end
=
time
.
localtime
(
int
(
end
))
end
=
time
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
,
end
)
result
=
get_monitor_list
(
int
(
watch
),
category
,
start
,
end
)
if
result
:
self
.
write
(
json
.
dumps
({
'code'
:
200
,
'data'
:
result
,
'msg'
:
'success'
,
'type'
:
'array'
if
isinstance
(
result
,
list
)
else
'object'
}))
else
:
self
.
write
(
json
.
dumps
({
'code'
:
204
,
'data'
:
None
,
'msg'
:
'no data'
}))
except
Exception
as
e
:
logger
.
error
(
e
)
traceback
.
print_exc
()
self
.
write
(
json
.
dumps
({
'code'
:
500
,
'data'
:
None
,
'msg'
:
'server error'
}))
def
post
(
self
):
if
not
self
.
request
.
body
:
self
.
write
(
json
.
dumps
({
'code'
:
304
,
'data'
:
None
,
'msg'
:
'parmeters error'
}))
return
data
=
tornado
.
escape
.
json_decode
(
self
.
request
.
body
)
data
.
update
({
'request'
:
{
'host'
:
self
.
request
.
remote_ip
,
'path'
:
self
.
request
.
path
,
'protocol'
:
self
.
request
.
protocol
}
})
logger
.
info
(
data
)
insert_data
(
data
)
data
[
'type'
]
=
'report'
data
[
'request'
]
.
update
({
'timestamp'
:
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
})
NotifyHandler
.
broadcastMessage
(
data
)
self
.
write
(
json
.
dumps
({
'code'
:
100
,
'message'
:
'success'
}))
def
make_app
():
return
tornado
.
web
.
Application
([
(
r"/"
,
MainHandler
),
(
r"/api/v1/evm_store/monitor"
,
DeviceMessageHandler
),
(
r"/api/v1/evm_store/watch"
,
WatchHandler
),
(
r"/ws/v1/notify"
,
NotifyHandler
),
(
r"/dist/(.*)"
,
StaticFileHandler
,
{
"path"
:
"dist"
}),
])
if
__name__
==
"__main__"
:
app
=
make_app
()
app
.
listen
(
5001
)
signal
.
signal
(
signal
.
SIGINT
,
raise_graceful_exit
)
signal
.
signal
(
signal
.
SIGTERM
,
raise_graceful_exit
)
tornado
.
ioloop
.
IOLoop
.
current
()
.
start
()
tools/frontend/package-lock.json
View file @
f92508d1
...
...
@@ -1973,6 +1973,11 @@
"resolved"
:
"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"
,
"integrity"
:
"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"absolute"
:
{
"version"
:
"0.0.1"
,
"resolved"
:
"https://registry.npmjs.org/absolute/-/absolute-0.0.1.tgz"
,
"integrity"
:
"sha1-wigi+H4ck59XmIdQTZwQnEFzgp0="
},
"accepts"
:
{
"version"
:
"1.3.5"
,
"resolved"
:
"http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz"
,
...
...
@@ -2090,7 +2095,6 @@
"version"
:
"5.5.2"
,
"resolved"
:
"http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz"
,
"integrity"
:
"sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU="
,
"dev"
:
true
,
"requires"
:
{
"co"
:
"^4.6.0"
,
"fast-deep-equal"
:
"^1.0.0"
,
...
...
@@ -2178,8 +2182,7 @@
"ansi-escapes"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz"
,
"integrity"
:
"sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
,
"dev"
:
true
"integrity"
:
"sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
},
"ansi-html"
:
{
"version"
:
"0.0.7"
,
...
...
@@ -2187,6 +2190,14 @@
"integrity"
:
"sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
,
"dev"
:
true
},
"ansi-red"
:
{
"version"
:
"0.1.1"
,
"resolved"
:
"https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz"
,
"integrity"
:
"sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw="
,
"requires"
:
{
"ansi-wrap"
:
"0.1.0"
}
},
"ansi-regex"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz"
,
...
...
@@ -2196,11 +2207,15 @@
"version"
:
"3.2.1"
,
"resolved"
:
"http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz"
,
"integrity"
:
"sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0="
,
"dev"
:
true
,
"requires"
:
{
"color-convert"
:
"^1.9.0"
}
},
"ansi-wrap"
:
{
"version"
:
"0.1.0"
,
"resolved"
:
"https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz"
,
"integrity"
:
"sha1-qCJQ3bABXponyoLoLqYDu/pF768="
},
"ant-design-vue"
:
{
"version"
:
"1.7.5"
,
"resolved"
:
"https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-1.7.5.tgz"
,
...
...
@@ -2557,7 +2572,6 @@
"version"
:
"1.0.10"
,
"resolved"
:
"http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz"
,
"integrity"
:
"sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE="
,
"dev"
:
true
,
"requires"
:
{
"sprintf-js"
:
"~1.0.2"
}
...
...
@@ -2583,6 +2597,11 @@
"integrity"
:
"sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
,
"dev"
:
true
},
"array-differ"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz"
,
"integrity"
:
"sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
},
"array-filter"
:
{
"version"
:
"0.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/array-filter/download/array-filter-0.0.1.tgz"
,
...
...
@@ -2622,7 +2641,6 @@
"version"
:
"1.0.2"
,
"resolved"
:
"http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz"
,
"integrity"
:
"sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk="
,
"dev"
:
true
,
"requires"
:
{
"array-uniq"
:
"^1.0.1"
}
...
...
@@ -2630,8 +2648,7 @@
"array-uniq"
:
{
"version"
:
"1.0.3"
,
"resolved"
:
"http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz"
,
"integrity"
:
"sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
,
"dev"
:
true
"integrity"
:
"sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
},
"array-unique"
:
{
"version"
:
"0.2.1"
,
...
...
@@ -2642,8 +2659,7 @@
"arrify"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz"
,
"integrity"
:
"sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
,
"dev"
:
true
"integrity"
:
"sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
},
"asap"
:
{
"version"
:
"2.0.6"
,
...
...
@@ -3240,6 +3256,15 @@
"integrity"
:
"sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
,
"dev"
:
true
},
"bl"
:
{
"version"
:
"1.2.3"
,
"resolved"
:
"https://registry.npmjs.org/bl/-/bl-1.2.3.tgz"
,
"integrity"
:
"sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww=="
,
"requires"
:
{
"readable-stream"
:
"^2.3.5"
,
"safe-buffer"
:
"^5.1.1"
}
},
"block-stream"
:
{
"version"
:
"0.0.9"
,
"resolved"
:
"https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz"
,
...
...
@@ -3252,8 +3277,7 @@
"bluebird"
:
{
"version"
:
"3.5.2"
,
"resolved"
:
"http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.2.tgz"
,
"integrity"
:
"sha1-G+CQjgVKdRdUVJwnBInBUF1KsVo="
,
"dev"
:
true
"integrity"
:
"sha1-G+CQjgVKdRdUVJwnBInBUF1KsVo="
},
"bn.js"
:
{
"version"
:
"4.11.8"
,
...
...
@@ -3556,6 +3580,30 @@
"isarray"
:
"^1.0.0"
}
},
"buffer-alloc"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz"
,
"integrity"
:
"sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow=="
,
"requires"
:
{
"buffer-alloc-unsafe"
:
"^1.1.0"
,
"buffer-fill"
:
"^1.0.0"
}
},
"buffer-alloc-unsafe"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz"
,
"integrity"
:
"sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
},
"buffer-crc32"
:
{
"version"
:
"0.2.13"
,
"resolved"
:
"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz"
,
"integrity"
:
"sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
},
"buffer-fill"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz"
,
"integrity"
:
"sha1-+PeLdniYiO858gXNY39o5wISKyw="
},
"buffer-from"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz"
,
...
...
@@ -3803,6 +3851,11 @@
"integrity"
:
"sha1-64KpWWmHRQM7JqTc002J26fMbrM="
,
"dev"
:
true
},
"capture-stack-trace"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz"
,
"integrity"
:
"sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw=="
},
"case-sensitive-paths-webpack-plugin"
:
{
"version"
:
"2.1.2"
,
"resolved"
:
"http://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.1.2.tgz"
,
...
...
@@ -3814,6 +3867,17 @@
"resolved"
:
"http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz"
,
"integrity"
:
"sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"caw"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npmjs.org/caw/-/caw-2.0.1.tgz"
,
"integrity"
:
"sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA=="
,
"requires"
:
{
"get-proxy"
:
"^2.0.0"
,
"isurl"
:
"^1.0.0-alpha5"
,
"tunnel-agent"
:
"^0.6.0"
,
"url-to-options"
:
"^1.0.1"
}
},
"center-align"
:
{
"version"
:
"0.1.3"
,
"resolved"
:
"http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz"
,
...
...
@@ -3827,7 +3891,6 @@
"version"
:
"2.4.1"
,
"resolved"
:
"http://registry.npm.taobao.org/chalk/download/chalk-2.4.1.tgz"
,
"integrity"
:
"sha1-GMSasWoDe26wFSzIPjRxM4IVtm4="
,
"dev"
:
true
,
"requires"
:
{
"ansi-styles"
:
"^3.2.1"
,
"escape-string-regexp"
:
"^1.0.5"
,
...
...
@@ -4072,7 +4135,6 @@
"version"
:
"2.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz"
,
"integrity"
:
"sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU="
,
"dev"
:
true
,
"requires"
:
{
"restore-cursor"
:
"^2.0.0"
}
...
...
@@ -4080,8 +4142,7 @@
"cli-spinners"
:
{
"version"
:
"1.3.1"
,
"resolved"
:
"http://registry.npm.taobao.org/cli-spinners/download/cli-spinners-1.3.1.tgz"
,
"integrity"
:
"sha1-ACwZkJEtDVlYDJO9NsBW3pnkJZo="
,
"dev"
:
true
"integrity"
:
"sha1-ACwZkJEtDVlYDJO9NsBW3pnkJZo="
},
"cli-table"
:
{
"version"
:
"0.3.6"
,
...
...
@@ -4101,8 +4162,7 @@
"cli-width"
:
{
"version"
:
"2.2.1"
,
"resolved"
:
"https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz"
,
"integrity"
:
"sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
,
"dev"
:
true
"integrity"
:
"sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
},
"clipboardy"
:
{
"version"
:
"1.2.3"
,
...
...
@@ -4156,8 +4216,7 @@
"clone"
:
{
"version"
:
"1.0.4"
,
"resolved"
:
"http://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz"
,
"integrity"
:
"sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
,
"dev"
:
true
"integrity"
:
"sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
},
"clone-deep"
:
{
"version"
:
"4.0.1"
,
...
...
@@ -4189,8 +4248,52 @@
"co"
:
{
"version"
:
"4.6.0"
,
"resolved"
:
"http://registry.npm.taobao.org/co/download/co-4.6.0.tgz"
,
"integrity"
:
"sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
,
"dev"
:
true
"integrity"
:
"sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
},
"co-from-stream"
:
{
"version"
:
"0.0.0"
,
"resolved"
:
"https://registry.npmjs.org/co-from-stream/-/co-from-stream-0.0.0.tgz"
,
"integrity"
:
"sha1-GlzYztdyY5RglPo58kmaYyl7yvk="
,
"requires"
:
{
"co-read"
:
"0.0.1"
}
},
"co-fs-extra"
:
{
"version"
:
"1.2.1"
,
"resolved"
:
"https://registry.npmjs.org/co-fs-extra/-/co-fs-extra-1.2.1.tgz"
,
"integrity"
:
"sha1-O2rXfPJhRTD2d7HPYmZPW6dWtyI="
,
"requires"
:
{
"co-from-stream"
:
"~0.0.0"
,
"fs-extra"
:
"~0.26.5"
,
"thunkify-wrap"
:
"~1.0.4"
},
"dependencies"
:
{
"fs-extra"
:
{
"version"
:
"0.26.7"
,
"resolved"
:
"https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz"
,
"integrity"
:
"sha1-muH92UiXeY7at20JGM9C0MMYT6k="
,
"requires"
:
{
"graceful-fs"
:
"^4.1.2"
,
"jsonfile"
:
"^2.1.0"
,
"klaw"
:
"^1.0.0"
,
"path-is-absolute"
:
"^1.0.0"
,
"rimraf"
:
"^2.2.8"
}
},
"jsonfile"
:
{
"version"
:
"2.4.0"
,
"resolved"
:
"https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz"
,
"integrity"
:
"sha1-NzaitCi4e72gzIO1P6PWM6NcKug="
,
"requires"
:
{
"graceful-fs"
:
"^4.1.6"
}
}
}
},
"co-read"
:
{
"version"
:
"0.0.1"
,
"resolved"
:
"https://registry.npmjs.org/co-read/-/co-read-0.0.1.tgz"
,
"integrity"
:
"sha1-+Bs+uKhmdf7FHj2IOn9WToc8k4k="
},
"coa"
:
{
"version"
:
"2.0.1"
,
...
...
@@ -4211,6 +4314,11 @@
"resolved"
:
"https://registry.npmjs.org/codemirror/-/codemirror-5.62.0.tgz"
,
"integrity"
:
"sha512-Xnl3304iCc8nyVZuRkzDVVwc794uc9QNX0UcPGeNic1fbzkSrO4l4GVXho9tRNKBgPYZXgocUqXyfIv3BILhCQ=="
},
"coffee-script"
:
{
"version"
:
"1.12.7"
,
"resolved"
:
"https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz"
,
"integrity"
:
"sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw=="
},
"collection-visit"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz"
,
...
...
@@ -4235,7 +4343,6 @@
"version"
:
"1.9.3"
,
"resolved"
:
"http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz"
,
"integrity"
:
"sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg="
,
"dev"
:
true
,
"requires"
:
{
"color-name"
:
"1.1.3"
}
...
...
@@ -4243,8 +4350,7 @@
"color-name"
:
{
"version"
:
"1.1.3"
,
"resolved"
:
"http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz"
,
"integrity"
:
"sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
,
"dev"
:
true
"integrity"
:
"sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"color-string"
:
{
"version"
:
"1.5.3"
,
...
...
@@ -4273,8 +4379,7 @@
"commander"
:
{
"version"
:
"2.17.1"
,
"resolved"
:
"http://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz"
,
"integrity"
:
"sha1-vXerfebelCBc6sxy8XFtKfIKd78="
,
"dev"
:
true
"integrity"
:
"sha1-vXerfebelCBc6sxy8XFtKfIKd78="
},
"commondir"
:
{
"version"
:
"1.0.1"
,
...
...
@@ -4353,6 +4458,15 @@
"typedarray"
:
"^0.0.6"
}
},
"config-chain"
:
{
"version"
:
"1.1.13"
,
"resolved"
:
"https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz"
,
"integrity"
:
"sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="
,
"requires"
:
{
"ini"
:
"^1.3.4"
,
"proto-list"
:
"~1.2.1"
}
},
"configstore"
:
{
"version"
:
"5.0.1"
,
"resolved"
:
"https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz"
,
...
...
@@ -4571,6 +4685,14 @@
"elliptic"
:
"^6.0.0"
}
},
"create-error-class"
:
{
"version"
:
"3.0.2"
,
"resolved"
:
"https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz"
,
"integrity"
:
"sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y="
,
"requires"
:
{
"capture-stack-trace"
:
"^1.0.0"
}
},
"create-hash"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"http://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz"
,
...
...
@@ -5081,6 +5203,28 @@
"integrity"
:
"sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
,
"dev"
:
true
},
"decompress"
:
{
"version"
:
"4.2.1"
,
"resolved"
:
"https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz"
,
"integrity"
:
"sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ=="
,
"requires"
:
{
"decompress-tar"
:
"^4.0.0"
,
"decompress-tarbz2"
:
"^4.0.0"
,
"decompress-targz"
:
"^4.0.0"
,
"decompress-unzip"
:
"^4.0.1"
,
"graceful-fs"
:
"^4.1.10"
,
"make-dir"
:
"^1.0.0"
,
"pify"
:
"^2.3.0"
,
"strip-dirs"
:
"^2.0.0"
},
"dependencies"
:
{
"pify"
:
{
"version"
:
"2.3.0"
,
"resolved"
:
"https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
,
"integrity"
:
"sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
}
}
},
"decompress-response"
:
{
"version"
:
"3.3.0"
,
"resolved"
:
"https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz"
,
...
...
@@ -5089,6 +5233,77 @@
"mimic-response"
:
"^1.0.0"
}
},
"decompress-tar"
:
{
"version"
:
"4.1.1"
,
"resolved"
:
"https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz"
,
"integrity"
:
"sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ=="
,
"requires"
:
{
"file-type"
:
"^5.2.0"
,
"is-stream"
:
"^1.1.0"
,
"tar-stream"
:
"^1.5.2"
}
},
"decompress-tarbz2"
:
{
"version"
:
"4.1.1"
,
"resolved"
:
"https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz"
,
"integrity"
:
"sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A=="
,
"requires"
:
{
"decompress-tar"
:
"^4.1.0"
,
"file-type"
:
"^6.1.0"
,
"is-stream"
:
"^1.1.0"
,
"seek-bzip"
:
"^1.0.5"
,
"unbzip2-stream"
:
"^1.0.9"
},
"dependencies"
:
{
"file-type"
:
{
"version"
:
"6.2.0"
,
"resolved"
:
"https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz"
,
"integrity"
:
"sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg=="
}
}
},
"decompress-targz"
:
{
"version"
:
"4.1.1"
,
"resolved"
:
"https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz"
,
"integrity"
:
"sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w=="
,
"requires"
:
{
"decompress-tar"
:
"^4.1.1"
,
"file-type"
:
"^5.2.0"
,
"is-stream"
:
"^1.1.0"
}
},
"decompress-unzip"
:
{
"version"
:
"4.0.1"
,
"resolved"
:
"https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz"
,
"integrity"
:
"sha1-3qrM39FK6vhVePczroIQ+bSEj2k="
,
"requires"
:
{
"file-type"
:
"^3.8.0"
,
"get-stream"
:
"^2.2.0"
,
"pify"
:
"^2.3.0"
,
"yauzl"
:
"^2.4.2"
},
"dependencies"
:
{
"file-type"
:
{
"version"
:
"3.9.0"
,
"resolved"
:
"https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz"
,
"integrity"
:
"sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
},
"get-stream"
:
{
"version"
:
"2.3.1"
,
"resolved"
:
"https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz"
,
"integrity"
:
"sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4="
,
"requires"
:
{
"object-assign"
:
"^4.0.1"
,
"pinkie-promise"
:
"^2.0.0"
}
},
"pify"
:
{
"version"
:
"2.3.0"
,
"resolved"
:
"https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
,
"integrity"
:
"sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
}
}
},
"deep-equal"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz"
,
...
...
@@ -5402,6 +5617,68 @@
"is-obj"
:
"^1.0.0"
}
},
"download"
:
{
"version"
:
"5.0.3"
,
"resolved"
:
"https://registry.npmjs.org/download/-/download-5.0.3.tgz"
,
"integrity"
:
"sha1-Y1N/l3+ZJmow64oqL70fILgAD3o="
,
"requires"
:
{
"caw"
:
"^2.0.0"
,
"decompress"
:
"^4.0.0"
,
"filenamify"
:
"^2.0.0"
,
"get-stream"
:
"^3.0.0"
,
"got"
:
"^6.3.0"
,
"mkdirp"
:
"^0.5.1"
,
"pify"
:
"^2.3.0"
},
"dependencies"
:
{
"got"
:
{
"version"
:
"6.7.1"
,
"resolved"
:
"https://registry.npmjs.org/got/-/got-6.7.1.tgz"
,
"integrity"
:
"sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA="
,
"requires"
:
{
"create-error-class"
:
"^3.0.0"
,
"duplexer3"
:
"^0.1.4"
,
"get-stream"
:
"^3.0.0"
,
"is-redirect"
:
"^1.0.0"
,
"is-retry-allowed"
:
"^1.0.0"
,
"is-stream"
:
"^1.0.0"
,
"lowercase-keys"
:
"^1.0.0"
,
"safe-buffer"
:
"^5.0.1"
,
"timed-out"
:
"^4.0.0"
,
"unzip-response"
:
"^2.0.1"
,
"url-parse-lax"
:
"^1.0.0"
}
},
"pify"
:
{
"version"
:
"2.3.0"
,
"resolved"
:
"https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
,
"integrity"
:
"sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
},
"prepend-http"
:
{
"version"
:
"1.0.4"
,
"resolved"
:
"https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"
,
"integrity"
:
"sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
},
"url-parse-lax"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz"
,
"integrity"
:
"sha1-evjzA2Rem9eaJy56FKxovAYJ2nM="
,
"requires"
:
{
"prepend-http"
:
"^1.0.1"
}
}
}
},
"download-git-repo"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"https://registry.npmjs.org/download-git-repo/-/download-git-repo-1.1.0.tgz"
,
"integrity"
:
"sha512-yXcCvhkPKmq5M2cQXss6Qbig+LZnzRIT40XCYm/QCRnJaPG867StB1qnsBLxOGrPH1YEIRWW2gJq7LLMyw+NmA=="
,
"requires"
:
{
"download"
:
"^5.0.3"
,
"git-clone"
:
"^0.1.0"
,
"rimraf"
:
"^2.6.1"
}
},
"duplexer"
:
{
"version"
:
"0.1.1"
,
"resolved"
:
"http://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz"
,
...
...
@@ -5485,6 +5762,11 @@
"integrity"
:
"sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
,
"dev"
:
true
},
"enable"
:
{
"version"
:
"1.3.2"
,
"resolved"
:
"https://registry.npmjs.org/enable/-/enable-1.3.2.tgz"
,
"integrity"
:
"sha1-nrpoN9FtCYK1n4fYib91REPVKTE="
},
"encodeurl"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz"
,
...
...
@@ -6120,8 +6402,7 @@
"esprima"
:
{
"version"
:
"4.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz"
,
"integrity"
:
"sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
,
"dev"
:
true
"integrity"
:
"sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
},
"esquery"
:
{
"version"
:
"1.0.1"
,
...
...
@@ -6355,8 +6636,7 @@
"fast-deep-equal"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz"
,
"integrity"
:
"sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
,
"dev"
:
true
"integrity"
:
"sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
},
"fast-glob"
:
{
"version"
:
"2.2.2"
,
...
...
@@ -6732,6 +7012,14 @@
"websocket-driver"
:
">=0.5.1"
}
},
"fd-slicer"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz"
,
"integrity"
:
"sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4="
,
"requires"
:
{
"pend"
:
"~1.2.0"
}
},
"fecha"
:
{
"version"
:
"2.3.3"
,
"resolved"
:
"http://registry.npm.taobao.org/fecha/download/fecha-2.3.3.tgz"
,
...
...
@@ -6746,7 +7034,6 @@
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/figures/-/figures-2.0.0.tgz"
,
"integrity"
:
"sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI="
,
"dev"
:
true
,
"requires"
:
{
"escape-string-regexp"
:
"^1.0.5"
}
...
...
@@ -6770,12 +7057,32 @@
"schema-utils"
:
"^0.4.5"
}
},
"file-type"
:
{
"version"
:
"5.2.0"
,
"resolved"
:
"https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz"
,
"integrity"
:
"sha1-LdvqfHP/42No365J3DOMBYwritY="
},
"filename-regex"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz"
,
"integrity"
:
"sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
,
"dev"
:
true
},
"filename-reserved-regex"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz"
,
"integrity"
:
"sha1-q/c9+rc10EVECr/qLZHzieu/oik="
},
"filenamify"
:
{
"version"
:
"2.1.0"
,
"resolved"
:
"https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz"
,
"integrity"
:
"sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA=="
,
"requires"
:
{
"filename-reserved-regex"
:
"^2.0.0"
,
"strip-outer"
:
"^1.0.0"
,
"trim-repeated"
:
"^1.0.0"
}
},
"filesize"
:
{
"version"
:
"3.6.1"
,
"resolved"
:
"http://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz"
,
...
...
@@ -7079,6 +7386,11 @@
"readable-stream"
:
"^2.0.0"
}
},
"fs-constants"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz"
,
"integrity"
:
"sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
},
"fs-extra"
:
{
"version"
:
"6.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/fs-extra/download/fs-extra-6.0.1.tgz"
,
...
...
@@ -7749,6 +8061,14 @@
"integrity"
:
"sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o="
,
"dev"
:
true
},
"get-proxy"
:
{
"version"
:
"2.1.0"
,
"resolved"
:
"https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz"
,
"integrity"
:
"sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw=="
,
"requires"
:
{
"npm-conf"
:
"^1.1.0"
}
},
"get-stdin"
:
{
"version"
:
"8.0.0"
,
"resolved"
:
"https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz"
,
...
...
@@ -7757,8 +8077,7 @@
"get-stream"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz"
,
"integrity"
:
"sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
,
"dev"
:
true
"integrity"
:
"sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
},
"get-value"
:
{
"version"
:
"2.0.6"
,
...
...
@@ -7774,6 +8093,11 @@
"assert-plus"
:
"^1.0.0"
}
},
"git-clone"
:
{
"version"
:
"0.1.0"
,
"resolved"
:
"https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz"
,
"integrity"
:
"sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk="
},
"glob"
:
{
"version"
:
"7.1.3"
,
"resolved"
:
"http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz"
,
...
...
@@ -8010,6 +8334,28 @@
"resolved"
:
"http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz"
,
"integrity"
:
"sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
"gray-matter"
:
{
"version"
:
"2.1.1"
,
"resolved"
:
"https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz"
,
"integrity"
:
"sha1-MELZrewqHe1qdwep7SOA+KF6Qw4="
,
"requires"
:
{
"ansi-red"
:
"^0.1.1"
,
"coffee-script"
:
"^1.12.4"
,
"extend-shallow"
:
"^2.0.1"
,
"js-yaml"
:
"^3.8.1"
,
"toml"
:
"^2.3.2"
},
"dependencies"
:
{
"extend-shallow"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"
,
"integrity"
:
"sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
,
"requires"
:
{
"is-extendable"
:
"^0.1.0"
}
}
}
},
"gzip-size"
:
{
"version"
:
"4.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/gzip-size/download/gzip-size-4.1.0.tgz"
,
...
...
@@ -8026,6 +8372,35 @@
"integrity"
:
"sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ="
,
"dev"
:
true
},
"handlebars"
:
{
"version"
:
"4.7.7"
,
"resolved"
:
"https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz"
,
"integrity"
:
"sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA=="
,
"requires"
:
{
"minimist"
:
"^1.2.5"
,
"neo-async"
:
"^2.6.0"
,
"source-map"
:
"^0.6.1"
,
"uglify-js"
:
"^3.1.4"
,
"wordwrap"
:
"^1.0.0"
},
"dependencies"
:
{
"minimist"
:
{
"version"
:
"1.2.5"
,
"resolved"
:
"https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
,
"integrity"
:
"sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"neo-async"
:
{
"version"
:
"2.6.2"
,
"resolved"
:
"https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
,
"integrity"
:
"sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
"source-map"
:
{
"version"
:
"0.6.1"
,
"resolved"
:
"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
,
"integrity"
:
"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
}
}
},
"har-schema"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz"
,
...
...
@@ -8035,7 +8410,6 @@
"version"
:
"5.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.0.tgz"
,
"integrity"
:
"sha1-RGV/VoiiLP1LckhugbOj+xF0LCk="
,
"dev"
:
true
,
"requires"
:
{
"ajv"
:
"^5.3.0"
,
"har-schema"
:
"^2.0.0"
...
...
@@ -8067,8 +8441,17 @@
"has-flag"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz"
,
"integrity"
:
"sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
,
"dev"
:
true
"integrity"
:
"sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"has-generators"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/has-generators/-/has-generators-1.0.1.tgz"
,
"integrity"
:
"sha1-pqLlVIYBGUBILhPiyTeRxEms9Ek="
},
"has-symbol-support-x"
:
{
"version"
:
"1.4.2"
,
"resolved"
:
"https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz"
,
"integrity"
:
"sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
},
"has-symbols"
:
{
"version"
:
"1.0.0"
,
...
...
@@ -8076,6 +8459,14 @@
"integrity"
:
"sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
,
"dev"
:
true
},
"has-to-string-tag-x"
:
{
"version"
:
"1.4.1"
,
"resolved"
:
"https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz"
,
"integrity"
:
"sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw=="
,
"requires"
:
{
"has-symbol-support-x"
:
"^1.4.1"
}
},
"has-unicode"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"
,
...
...
@@ -9060,6 +9451,11 @@
"integrity"
:
"sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
,
"dev"
:
true
},
"is"
:
{
"version"
:
"3.3.0"
,
"resolved"
:
"https://registry.npmjs.org/is/-/is-3.3.0.tgz"
,
"integrity"
:
"sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg=="
},
"is-absolute-url"
:
{
"version"
:
"2.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz"
,
...
...
@@ -9198,8 +9594,7 @@
"is-extendable"
:
{
"version"
:
"0.1.1"
,
"resolved"
:
"http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz"
,
"integrity"
:
"sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
,
"dev"
:
true
"integrity"
:
"sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
},
"is-extglob"
:
{
"version"
:
"1.0.0"
,
...
...
@@ -9253,6 +9648,11 @@
"resolved"
:
"https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz"
,
"integrity"
:
"sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg=="
},
"is-natural-number"
:
{
"version"
:
"4.0.1"
,
"resolved"
:
"https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz"
,
"integrity"
:
"sha1-q5124dtM7VHjXeDHLr7PCfc0zeg="
},
"is-negative-zero"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz"
,
...
...
@@ -9278,6 +9678,11 @@
"integrity"
:
"sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
,
"dev"
:
true
},
"is-object"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz"
,
"integrity"
:
"sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA=="
},
"is-path-cwd"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz"
,
...
...
@@ -9337,6 +9742,11 @@
"integrity"
:
"sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
,
"dev"
:
true
},
"is-redirect"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz"
,
"integrity"
:
"sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
},
"is-regex"
:
{
"version"
:
"1.0.4"
,
"resolved"
:
"http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz"
,
...
...
@@ -9351,11 +9761,15 @@
"integrity"
:
"sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg="
,
"dev"
:
true
},
"is-retry-allowed"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz"
,
"integrity"
:
"sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
},
"is-stream"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz"
,
"integrity"
:
"sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
,
"dev"
:
true
"integrity"
:
"sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"is-svg"
:
{
"version"
:
"3.0.0"
,
...
...
@@ -9379,8 +9793,7 @@
"is-utf8"
:
{
"version"
:
"0.2.1"
,
"resolved"
:
"https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
,
"integrity"
:
"sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
,
"dev"
:
true
"integrity"
:
"sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
},
"is-windows"
:
{
"version"
:
"1.0.2"
,
...
...
@@ -9437,6 +9850,15 @@
"resolved"
:
"http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz"
,
"integrity"
:
"sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"isurl"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz"
,
"integrity"
:
"sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w=="
,
"requires"
:
{
"has-to-string-tag-x"
:
"^1.2.0"
,
"is-object"
:
"^1.0.1"
}
},
"javascript-stringify"
:
{
"version"
:
"1.6.0"
,
"resolved"
:
"http://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-1.6.0.tgz"
,
...
...
@@ -9494,7 +9916,6 @@
"version"
:
"3.12.0"
,
"resolved"
:
"http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.12.0.tgz"
,
"integrity"
:
"sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E="
,
"dev"
:
true
,
"requires"
:
{
"argparse"
:
"^1.0.7"
,
"esprima"
:
"^4.0.0"
...
...
@@ -9544,8 +9965,7 @@
"json-schema-traverse"
:
{
"version"
:
"0.3.1"
,
"resolved"
:
"http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz"
,
"integrity"
:
"sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
,
"dev"
:
true
"integrity"
:
"sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
},
"json-stable-stringify-without-jsonify"
:
{
"version"
:
"1.0.1"
,
...
...
@@ -9644,6 +10064,14 @@
"is-buffer"
:
"^1.1.5"
}
},
"klaw"
:
{
"version"
:
"1.3.1"
,
"resolved"
:
"https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz"
,
"integrity"
:
"sha1-QIhDO0azsbolnXh4XY6W9zugJDk="
,
"requires"
:
{
"graceful-fs"
:
"^4.1.9"
}
},
"kleur"
:
{
"version"
:
"3.0.3"
,
"resolved"
:
"https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz"
,
...
...
@@ -9995,7 +10423,6 @@
"version"
:
"2.2.0"
,
"resolved"
:
"http://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz"
,
"integrity"
:
"sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo="
,
"dev"
:
true
,
"requires"
:
{
"chalk"
:
"^2.0.1"
}
...
...
@@ -10054,7 +10481,6 @@
"version"
:
"1.3.0"
,
"resolved"
:
"http://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz"
,
"integrity"
:
"sha1-ecEDO4BRW9bSTsmTPoYMp17ifww="
,
"dev"
:
true
,
"requires"
:
{
"pify"
:
"^3.0.0"
}
...
...
@@ -10336,9 +10762,69 @@
"integrity"
:
"sha1-AyEuPajYbE2FI869YxgZNBT5TjQ="
,
"dev"
:
true
},
"methods"
:
{
"version"
:
"1.1.2"
,
"resolved"
:
"http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz"
,
"metalsmith"
:
{
"version"
:
"2.3.0"
,
"resolved"
:
"https://registry.npmjs.org/metalsmith/-/metalsmith-2.3.0.tgz"
,
"integrity"
:
"sha1-gzr7taKmOF4tmuPZNeOeM+rqUjE="
,
"requires"
:
{
"absolute"
:
"0.0.1"
,
"chalk"
:
"^1.1.3"
,
"clone"
:
"^1.0.2"
,
"co-fs-extra"
:
"^1.2.1"
,
"commander"
:
"^2.6.0"
,
"gray-matter"
:
"^2.0.0"
,
"has-generators"
:
"^1.0.1"
,
"is"
:
"^3.1.0"
,
"is-utf8"
:
"~0.2.0"
,
"recursive-readdir"
:
"^2.1.0"
,
"rimraf"
:
"^2.2.8"
,
"stat-mode"
:
"^0.2.0"
,
"thunkify"
:
"^2.1.2"
,
"unyield"
:
"0.0.1"
,
"ware"
:
"^1.2.0"
,
"win-fork"
:
"^1.1.1"
},
"dependencies"
:
{
"ansi-regex"
:
{
"version"
:
"2.1.1"
,
"resolved"
:
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
,
"integrity"
:
"sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"ansi-styles"
:
{
"version"
:
"2.2.1"
,
"resolved"
:
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
,
"integrity"
:
"sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
},
"chalk"
:
{
"version"
:
"1.1.3"
,
"resolved"
:
"https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
,
"integrity"
:
"sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg="
,
"requires"
:
{
"ansi-styles"
:
"^2.2.1"
,
"escape-string-regexp"
:
"^1.0.2"
,
"has-ansi"
:
"^2.0.0"
,
"strip-ansi"
:
"^3.0.0"
,
"supports-color"
:
"^2.0.0"
}
},
"strip-ansi"
:
{
"version"
:
"3.0.1"
,
"resolved"
:
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
,
"integrity"
:
"sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8="
,
"requires"
:
{
"ansi-regex"
:
"^2.0.0"
}
},
"supports-color"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
,
"integrity"
:
"sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
}
}
},
"methods"
:
{
"version"
:
"1.1.2"
,
"resolved"
:
"http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz"
,
"integrity"
:
"sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
,
"dev"
:
true
},
...
...
@@ -10395,8 +10881,7 @@
"mimic-fn"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz"
,
"integrity"
:
"sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
,
"dev"
:
true
"integrity"
:
"sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
},
"mimic-response"
:
{
"version"
:
"1.0.1"
,
...
...
@@ -10480,8 +10965,7 @@
"minimist"
:
{
"version"
:
"0.0.8"
,
"resolved"
:
"http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz"
,
"integrity"
:
"sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
,
"dev"
:
true
"integrity"
:
"sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"minipass"
:
{
"version"
:
"3.1.3"
,
...
...
@@ -10615,7 +11099,6 @@
"version"
:
"0.5.1"
,
"resolved"
:
"http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz"
,
"integrity"
:
"sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM="
,
"dev"
:
true
,
"requires"
:
{
"minimist"
:
"0.0.8"
}
...
...
@@ -10660,6 +11143,17 @@
"integrity"
:
"sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
,
"dev"
:
true
},
"multimatch"
:
{
"version"
:
"2.1.0"
,
"resolved"
:
"https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz"
,
"integrity"
:
"sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis="
,
"requires"
:
{
"array-differ"
:
"^1.0.0"
,
"array-union"
:
"^1.0.1"
,
"arrify"
:
"^1.0.0"
,
"minimatch"
:
"^3.0.0"
}
},
"mutationobserver-shim"
:
{
"version"
:
"0.3.7"
,
"resolved"
:
"https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz"
,
...
...
@@ -10668,8 +11162,7 @@
"mute-stream"
:
{
"version"
:
"0.0.7"
,
"resolved"
:
"https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz"
,
"integrity"
:
"sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
,
"dev"
:
true
"integrity"
:
"sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
},
"nan"
:
{
"version"
:
"2.11.0"
,
...
...
@@ -11330,6 +11823,15 @@
}
}
},
"npm-conf"
:
{
"version"
:
"1.1.3"
,
"resolved"
:
"https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz"
,
"integrity"
:
"sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw=="
,
"requires"
:
{
"config-chain"
:
"^1.1.11"
,
"pify"
:
"^3.0.0"
}
},
"npm-install-checks"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz"
,
...
...
@@ -11692,7 +12194,6 @@
"version"
:
"2.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz"
,
"integrity"
:
"sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ="
,
"dev"
:
true
,
"requires"
:
{
"mimic-fn"
:
"^1.0.0"
}
...
...
@@ -11758,8 +12259,7 @@
"os-homedir"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz"
,
"integrity"
:
"sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
,
"dev"
:
true
"integrity"
:
"sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
},
"os-locale"
:
{
"version"
:
"3.0.1"
,
...
...
@@ -11775,8 +12275,7 @@
"os-tmpdir"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
,
"integrity"
:
"sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
,
"dev"
:
true
"integrity"
:
"sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"osenv"
:
{
"version"
:
"0.1.5"
,
...
...
@@ -12133,6 +12632,11 @@
"sha.js"
:
"^2.4.8"
}
},
"pend"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"
,
"integrity"
:
"sha1-elfrVQpng/kRUzH89GY9XI4AelA="
},
"performance-now"
:
{
"version"
:
"2.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz"
,
...
...
@@ -12146,20 +12650,17 @@
"pify"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz"
,
"integrity"
:
"sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
,
"dev"
:
true
"integrity"
:
"sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
},
"pinkie"
:
{
"version"
:
"2.0.4"
,
"resolved"
:
"http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz"
,
"integrity"
:
"sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
,
"dev"
:
true
"integrity"
:
"sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
},
"pinkie-promise"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz"
,
"integrity"
:
"sha1-ITXW36ejWMBprJsXh3YogihFD/o="
,
"dev"
:
true
,
"requires"
:
{
"pinkie"
:
"^2.0.0"
}
...
...
@@ -13533,6 +14034,11 @@
"sisteransi"
:
"^1.0.5"
}
},
"proto-list"
:
{
"version"
:
"1.2.4"
,
"resolved"
:
"https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz"
,
"integrity"
:
"sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
},
"proxy-addr"
:
{
"version"
:
"2.0.4"
,
"resolved"
:
"http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.4.tgz"
,
...
...
@@ -13833,6 +14339,14 @@
}
}
},
"read-metadata"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/read-metadata/-/read-metadata-1.0.0.tgz"
,
"integrity"
:
"sha1-bfnL5RGE6M630GaLQO5Rkebz2sY="
,
"requires"
:
{
"yaml-js"
:
"0.0.8"
}
},
"read-package-json-fast"
:
{
"version"
:
"2.0.2"
,
"resolved"
:
"https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz"
,
...
...
@@ -14222,6 +14736,14 @@
}
}
},
"recursive-readdir"
:
{
"version"
:
"2.2.2"
,
"resolved"
:
"https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz"
,
"integrity"
:
"sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg=="
,
"requires"
:
{
"minimatch"
:
"3.0.4"
}
},
"redent"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/redent/-/redent-1.0.0.tgz"
,
...
...
@@ -14464,7 +14986,6 @@
"version"
:
"2.88.0"
,
"resolved"
:
"http://registry.npm.taobao.org/request/download/request-2.88.0.tgz"
,
"integrity"
:
"sha1-nC/KT301tZLv5Xx/ClXoEFIST+8="
,
"dev"
:
true
,
"requires"
:
{
"aws-sign2"
:
"~0.7.0"
,
"aws4"
:
"^1.8.0"
,
...
...
@@ -14604,7 +15125,6 @@
"version"
:
"2.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz"
,
"integrity"
:
"sha1-n37ih/gv0ybU/RYpI9YhKe7g368="
,
"dev"
:
true
,
"requires"
:
{
"onetime"
:
"^2.0.0"
,
"signal-exit"
:
"^3.0.2"
...
...
@@ -14658,7 +15178,6 @@
"version"
:
"2.6.2"
,
"resolved"
:
"http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz"
,
"integrity"
:
"sha1-LtgVDSShbqhlHm1u8PR8QVjOejY="
,
"dev"
:
true
,
"requires"
:
{
"glob"
:
"^7.0.5"
}
...
...
@@ -14728,8 +15247,7 @@
"run-async"
:
{
"version"
:
"2.4.1"
,
"resolved"
:
"https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz"
,
"integrity"
:
"sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
,
"dev"
:
true
"integrity"
:
"sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
},
"run-parallel"
:
{
"version"
:
"1.2.0"
,
...
...
@@ -14768,6 +15286,14 @@
"rx-lite"
:
"*"
}
},
"rxjs"
:
{
"version"
:
"6.6.7"
,
"resolved"
:
"https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz"
,
"integrity"
:
"sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="
,
"requires"
:
{
"tslib"
:
"^1.9.0"
}
},
"safe-buffer"
:
{
"version"
:
"5.1.2"
,
"resolved"
:
"http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz"
,
...
...
@@ -15125,6 +15651,14 @@
}
}
},
"seek-bzip"
:
{
"version"
:
"1.0.6"
,
"resolved"
:
"https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz"
,
"integrity"
:
"sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ=="
,
"requires"
:
{
"commander"
:
"^2.8.1"
}
},
"select-hose"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz"
,
...
...
@@ -15143,8 +15677,7 @@
"semver"
:
{
"version"
:
"5.5.1"
,
"resolved"
:
"http://registry.npm.taobao.org/semver/download/semver-5.5.1.tgz"
,
"integrity"
:
"sha1-ff3YgUvbfKvHvg+x1zTPtmyUBHc="
,
"dev"
:
true
"integrity"
:
"sha1-ff3YgUvbfKvHvg+x1zTPtmyUBHc="
},
"semver-diff"
:
{
"version"
:
"3.1.1"
,
...
...
@@ -15776,8 +16309,7 @@
"sprintf-js"
:
{
"version"
:
"1.0.3"
,
"resolved"
:
"http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz"
,
"integrity"
:
"sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
,
"dev"
:
true
"integrity"
:
"sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"sshpk"
:
{
"version"
:
"1.14.2"
,
...
...
@@ -15816,6 +16348,11 @@
"integrity"
:
"sha1-NXskqZL5Qny6a1RdlqFO0svKGHs="
,
"dev"
:
true
},
"stat-mode"
:
{
"version"
:
"0.2.2"
,
"resolved"
:
"https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz"
,
"integrity"
:
"sha1-5sgLYjEj19gM8TLOU480YokHJQI="
},
"static-extend"
:
{
"version"
:
"0.1.2"
,
"resolved"
:
"http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz"
,
...
...
@@ -15974,6 +16511,14 @@
"is-utf8"
:
"^0.2.0"
}
},
"strip-dirs"
:
{
"version"
:
"2.1.0"
,
"resolved"
:
"https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz"
,
"integrity"
:
"sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g=="
,
"requires"
:
{
"is-natural-number"
:
"^4.0.1"
}
},
"strip-eof"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz"
,
...
...
@@ -15992,6 +16537,14 @@
"integrity"
:
"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
,
"dev"
:
true
},
"strip-outer"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz"
,
"integrity"
:
"sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg=="
,
"requires"
:
{
"escape-string-regexp"
:
"^1.0.2"
}
},
"stylehacks"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.0.tgz"
,
...
...
@@ -16048,7 +16601,6 @@
"version"
:
"5.5.0"
,
"resolved"
:
"http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz"
,
"integrity"
:
"sha1-4uaaRKyHcveKHsCzW2id9lMO/I8="
,
"dev"
:
true
,
"requires"
:
{
"has-flag"
:
"^3.0.0"
}
...
...
@@ -16639,6 +17191,20 @@
}
}
},
"tar-stream"
:
{
"version"
:
"1.6.2"
,
"resolved"
:
"https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz"
,
"integrity"
:
"sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A=="
,
"requires"
:
{
"bl"
:
"^1.0.0"
,
"buffer-alloc"
:
"^1.2.0"
,
"end-of-stream"
:
"^1.0.0"
,
"fs-constants"
:
"^1.0.0"
,
"readable-stream"
:
"^2.3.0"
,
"to-buffer"
:
"^1.1.1"
,
"xtend"
:
"^4.0.0"
}
},
"text-table"
:
{
"version"
:
"0.2.0"
,
"resolved"
:
"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
,
...
...
@@ -16682,12 +17248,38 @@
"xtend"
:
"~4.0.1"
}
},
"thunkify"
:
{
"version"
:
"2.1.2"
,
"resolved"
:
"https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz"
,
"integrity"
:
"sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0="
},
"thunkify-wrap"
:
{
"version"
:
"1.0.4"
,
"resolved"
:
"https://registry.npmjs.org/thunkify-wrap/-/thunkify-wrap-1.0.4.tgz"
,
"integrity"
:
"sha1-tSvlSN3+/aIOALWMYJZ2K0PdaIA="
,
"requires"
:
{
"enable"
:
"1"
}
},
"thunky"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"http://registry.npm.taobao.org/thunky/download/thunky-1.0.2.tgz"
,
"integrity"
:
"sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E="
,
"dev"
:
true
},
"tildify"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz"
,
"integrity"
:
"sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo="
,
"requires"
:
{
"os-homedir"
:
"^1.0.0"
}
},
"timed-out"
:
{
"version"
:
"4.0.1"
,
"resolved"
:
"https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz"
,
"integrity"
:
"sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
},
"timers-browserify"
:
{
"version"
:
"2.0.10"
,
"resolved"
:
"http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.10.tgz"
,
...
...
@@ -16712,7 +17304,6 @@
"version"
:
"0.0.33"
,
"resolved"
:
"https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
,
"integrity"
:
"sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="
,
"dev"
:
true
,
"requires"
:
{
"os-tmpdir"
:
"~1.0.2"
}
...
...
@@ -16723,6 +17314,11 @@
"integrity"
:
"sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
,
"dev"
:
true
},
"to-buffer"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz"
,
"integrity"
:
"sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
},
"to-fast-properties"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz"
,
...
...
@@ -16776,6 +17372,11 @@
}
}
},
"toml"
:
{
"version"
:
"2.3.6"
,
"resolved"
:
"https://registry.npmjs.org/toml/-/toml-2.3.6.tgz"
,
"integrity"
:
"sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ=="
},
"topo"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"http://registry.npm.taobao.org/topo/download/topo-3.0.0.tgz"
,
...
...
@@ -16795,7 +17396,6 @@
"version"
:
"2.4.3"
,
"resolved"
:
"http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz"
,
"integrity"
:
"sha1-U/Nto/R3g7CSWvoG/587FlKA94E="
,
"dev"
:
true
,
"requires"
:
{
"psl"
:
"^1.1.24"
,
"punycode"
:
"^1.4.1"
...
...
@@ -16804,8 +17404,7 @@
"punycode"
:
{
"version"
:
"1.4.1"
,
"resolved"
:
"http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz"
,
"integrity"
:
"sha1-wNWmOycYgArY4esPpSachN1BhF4="
,
"dev"
:
true
"integrity"
:
"sha1-wNWmOycYgArY4esPpSachN1BhF4="
}
}
},
...
...
@@ -16821,6 +17420,14 @@
"integrity"
:
"sha1-WIeWa7WCpFA6QetST301ARgVphM="
,
"dev"
:
true
},
"trim-repeated"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz"
,
"integrity"
:
"sha1-42RqLqTokTEr9+rObPsFOAvAHCE="
,
"requires"
:
{
"escape-string-regexp"
:
"^1.0.2"
}
},
"trim-right"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz"
,
...
...
@@ -16845,8 +17452,7 @@
"tslib"
:
{
"version"
:
"1.9.3"
,
"resolved"
:
"http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz"
,
"integrity"
:
"sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY="
,
"dev"
:
true
"integrity"
:
"sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY="
},
"tty-browserify"
:
{
"version"
:
"0.0.0"
,
...
...
@@ -16910,7 +17516,6 @@
"version"
:
"3.4.9"
,
"resolved"
:
"http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.9.tgz"
,
"integrity"
:
"sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM="
,
"dev"
:
true
,
"requires"
:
{
"commander"
:
"~2.17.1"
,
"source-map"
:
"~0.6.1"
...
...
@@ -16919,8 +17524,7 @@
"source-map"
:
{
"version"
:
"0.6.1"
,
"resolved"
:
"http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz"
,
"integrity"
:
"sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
,
"dev"
:
true
"integrity"
:
"sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
}
}
},
...
...
@@ -16970,6 +17574,41 @@
}
}
},
"uid"
:
{
"version"
:
"0.0.2"
,
"resolved"
:
"https://registry.npmjs.org/uid/-/uid-0.0.2.tgz"
,
"integrity"
:
"sha1-XkpdS3gTi09w+J/Tx2/FmqnS8QM="
},
"unbzip2-stream"
:
{
"version"
:
"1.4.3"
,
"resolved"
:
"https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz"
,
"integrity"
:
"sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="
,
"requires"
:
{
"buffer"
:
"^5.2.1"
,
"through"
:
"^2.3.8"
},
"dependencies"
:
{
"base64-js"
:
{
"version"
:
"1.5.1"
,
"resolved"
:
"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
,
"integrity"
:
"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"buffer"
:
{
"version"
:
"5.7.1"
,
"resolved"
:
"https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz"
,
"integrity"
:
"sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="
,
"requires"
:
{
"base64-js"
:
"^1.3.1"
,
"ieee754"
:
"^1.1.13"
}
},
"ieee754"
:
{
"version"
:
"1.2.1"
,
"resolved"
:
"https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
,
"integrity"
:
"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
}
}
},
"unicode-canonical-property-names-ecmascript"
:
{
"version"
:
"1.0.4"
,
"resolved"
:
"http://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz"
,
...
...
@@ -17140,6 +17779,26 @@
}
}
},
"unyield"
:
{
"version"
:
"0.0.1"
,
"resolved"
:
"https://registry.npmjs.org/unyield/-/unyield-0.0.1.tgz"
,
"integrity"
:
"sha1-FQ5l2kK/d0JEW5WKZOubhdHSsYA="
,
"requires"
:
{
"co"
:
"~3.1.0"
},
"dependencies"
:
{
"co"
:
{
"version"
:
"3.1.0"
,
"resolved"
:
"https://registry.npmjs.org/co/-/co-3.1.0.tgz"
,
"integrity"
:
"sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g="
}
}
},
"unzip-response"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz"
,
"integrity"
:
"sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
},
"upath"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/upath/download/upath-1.1.0.tgz"
,
...
...
@@ -17376,12 +18035,25 @@
"unidecode"
:
"0.1.8"
}
},
"url-to-options"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz"
,
"integrity"
:
"sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
},
"use"
:
{
"version"
:
"3.1.1"
,
"resolved"
:
"http://registry.npm.taobao.org/use/download/use-3.1.1.tgz"
,
"integrity"
:
"sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8="
,
"dev"
:
true
},
"user-home"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz"
,
"integrity"
:
"sha1-nHC/2Babwdy/SGBODwS4tJzenp8="
,
"requires"
:
{
"os-homedir"
:
"^1.0.0"
}
},
"util"
:
{
"version"
:
"0.10.4"
,
"resolved"
:
"http://registry.npm.taobao.org/util/download/util-0.10.4.tgz"
,
...
...
@@ -17493,6 +18165,135 @@
"resolved"
:
"http://registry.npm.taobao.org/vue/download/vue-2.5.17.tgz"
,
"integrity"
:
"sha1-D4eJrXGL5oyhhyYpgy7VM1icato="
},
"vue-cli"
:
{
"version"
:
"2.9.6"
,
"resolved"
:
"https://registry.npmjs.org/vue-cli/-/vue-cli-2.9.6.tgz"
,
"integrity"
:
"sha512-swQ0bfyJSWfFr42IXr8A774yA1n+YudhzsaHBKhWSkczSqjvgZvSvM8NEnx6QKnfOHBXbdNR5vhahjNUMlftQQ=="
,
"requires"
:
{
"async"
:
"^2.4.0"
,
"chalk"
:
"^2.1.0"
,
"coffee-script"
:
"1.12.7"
,
"commander"
:
"^2.9.0"
,
"consolidate"
:
"^0.14.0"
,
"download-git-repo"
:
"^1.0.1"
,
"handlebars"
:
"^4.0.5"
,
"inquirer"
:
"^6.0.0"
,
"metalsmith"
:
"^2.1.0"
,
"minimatch"
:
"^3.0.0"
,
"multimatch"
:
"^2.1.0"
,
"ora"
:
"^1.3.0"
,
"read-metadata"
:
"^1.0.0"
,
"request"
:
"^2.67.0"
,
"rimraf"
:
"^2.5.0"
,
"semver"
:
"^5.1.0"
,
"tildify"
:
"^1.2.0"
,
"uid"
:
"0.0.2"
,
"user-home"
:
"^2.0.0"
,
"validate-npm-package-name"
:
"^3.0.0"
},
"dependencies"
:
{
"ansi-regex"
:
{
"version"
:
"4.1.0"
,
"resolved"
:
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz"
,
"integrity"
:
"sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"async"
:
{
"version"
:
"2.6.3"
,
"resolved"
:
"https://registry.npmjs.org/async/-/async-2.6.3.tgz"
,
"integrity"
:
"sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg=="
,
"requires"
:
{
"lodash"
:
"^4.17.14"
}
},
"chardet"
:
{
"version"
:
"0.7.0"
,
"resolved"
:
"https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz"
,
"integrity"
:
"sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
},
"consolidate"
:
{
"version"
:
"0.14.5"
,
"resolved"
:
"https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz"
,
"integrity"
:
"sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM="
,
"requires"
:
{
"bluebird"
:
"^3.1.1"
}
},
"external-editor"
:
{
"version"
:
"3.1.0"
,
"resolved"
:
"https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz"
,
"integrity"
:
"sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="
,
"requires"
:
{
"chardet"
:
"^0.7.0"
,
"iconv-lite"
:
"^0.4.24"
,
"tmp"
:
"^0.0.33"
}
},
"iconv-lite"
:
{
"version"
:
"0.4.24"
,
"resolved"
:
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
,
"integrity"
:
"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="
,
"requires"
:
{
"safer-buffer"
:
">= 2.1.2 < 3"
}
},
"inquirer"
:
{
"version"
:
"6.5.2"
,
"resolved"
:
"https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz"
,
"integrity"
:
"sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ=="
,
"requires"
:
{
"ansi-escapes"
:
"^3.2.0"
,
"chalk"
:
"^2.4.2"
,
"cli-cursor"
:
"^2.1.0"
,
"cli-width"
:
"^2.0.0"
,
"external-editor"
:
"^3.0.3"
,
"figures"
:
"^2.0.0"
,
"lodash"
:
"^4.17.12"
,
"mute-stream"
:
"0.0.7"
,
"run-async"
:
"^2.2.0"
,
"rxjs"
:
"^6.4.0"
,
"string-width"
:
"^2.1.0"
,
"strip-ansi"
:
"^5.1.0"
,
"through"
:
"^2.3.6"
},
"dependencies"
:
{
"chalk"
:
{
"version"
:
"2.4.2"
,
"resolved"
:
"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
,
"integrity"
:
"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
,
"requires"
:
{
"ansi-styles"
:
"^3.2.1"
,
"escape-string-regexp"
:
"^1.0.5"
,
"supports-color"
:
"^5.3.0"
}
}
}
},
"lodash"
:
{
"version"
:
"4.17.21"
,
"resolved"
:
"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
,
"integrity"
:
"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"ora"
:
{
"version"
:
"1.4.0"
,
"resolved"
:
"https://registry.npmjs.org/ora/-/ora-1.4.0.tgz"
,
"integrity"
:
"sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw=="
,
"requires"
:
{
"chalk"
:
"^2.1.0"
,
"cli-cursor"
:
"^2.1.0"
,
"cli-spinners"
:
"^1.0.1"
,
"log-symbols"
:
"^2.1.0"
}
},
"strip-ansi"
:
{
"version"
:
"5.2.0"
,
"resolved"
:
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
,
"integrity"
:
"sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="
,
"requires"
:
{
"ansi-regex"
:
"^4.1.0"
}
}
}
},
"vue-codemirror"
:
{
"version"
:
"4.0.6"
,
"resolved"
:
"https://registry.npmjs.org/vue-codemirror/-/vue-codemirror-4.0.6.tgz"
,
...
...
@@ -17689,6 +18490,14 @@
"resolved"
:
"http://registry.npm.taobao.org/vuex-router-sync/download/vuex-router-sync-5.0.0.tgz"
,
"integrity"
:
"sha1-GiJcF6Hdni90rwobLGIHLpSSswU="
},
"ware"
:
{
"version"
:
"1.3.0"
,
"resolved"
:
"https://registry.npmjs.org/ware/-/ware-1.3.0.tgz"
,
"integrity"
:
"sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q="
,
"requires"
:
{
"wrap-fn"
:
"^0.1.0"
}
},
"warning"
:
{
"version"
:
"4.0.3"
,
"resolved"
:
"https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
,
...
...
@@ -18371,6 +19180,11 @@
}
}
},
"win-fork"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"https://registry.npmjs.org/win-fork/-/win-fork-1.1.1.tgz"
,
"integrity"
:
"sha1-j1jgZW/KAK3IyGoriePNLWotXl4="
},
"window-size"
:
{
"version"
:
"0.1.0"
,
"resolved"
:
"http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz"
,
...
...
@@ -18387,6 +19201,11 @@
"integrity"
:
"sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
,
"dev"
:
true
},
"wordwrap"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz"
,
"integrity"
:
"sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
},
"worker-farm"
:
{
"version"
:
"1.6.0"
,
"resolved"
:
"http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.6.0.tgz"
,
...
...
@@ -18443,6 +19262,21 @@
}
}
},
"wrap-fn"
:
{
"version"
:
"0.1.5"
,
"resolved"
:
"https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz"
,
"integrity"
:
"sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU="
,
"requires"
:
{
"co"
:
"3.1.0"
},
"dependencies"
:
{
"co"
:
{
"version"
:
"3.1.0"
,
"resolved"
:
"https://registry.npmjs.org/co/-/co-3.1.0.tgz"
,
"integrity"
:
"sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g="
}
}
},
"wrappy"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz"
,
...
...
@@ -18492,8 +19326,7 @@
"xtend"
:
{
"version"
:
"4.0.1"
,
"resolved"
:
"http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz"
,
"integrity"
:
"sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
,
"dev"
:
true
"integrity"
:
"sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
},
"y18n"
:
{
"version"
:
"4.0.0"
,
...
...
@@ -18507,6 +19340,11 @@
"integrity"
:
"sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
,
"dev"
:
true
},
"yaml-js"
:
{
"version"
:
"0.0.8"
,
"resolved"
:
"https://registry.npmjs.org/yaml-js/-/yaml-js-0.0.8.tgz"
,
"integrity"
:
"sha1-h8+lqWE/SOJgBUINao7g2m/o2uw="
},
"yargs"
:
{
"version"
:
"12.0.2"
,
"resolved"
:
"http://registry.npm.taobao.org/yargs/download/yargs-12.0.2.tgz"
,
...
...
@@ -18581,6 +19419,15 @@
"camelcase"
:
"^4.1.0"
}
},
"yauzl"
:
{
"version"
:
"2.10.0"
,
"resolved"
:
"https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"
,
"integrity"
:
"sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk="
,
"requires"
:
{
"buffer-crc32"
:
"~0.2.3"
,
"fd-slicer"
:
"~1.1.0"
}
},
"yocto-queue"
:
{
"version"
:
"0.1.0"
,
"resolved"
:
"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
,
...
...
tools/frontend/package.json
View file @
f92508d1
...
...
@@ -15,22 +15,24 @@
"codemirror"
:
"^5.59.2"
,
"core-js"
:
"^3.9.0"
,
"cropperjs"
:
"^1.5.11"
,
"echarts"
:
"^5.1.2"
,
"js-cookie"
:
"^2.2.1"
,
"npm-check-updates"
:
"^11.7.1"
,
"numeral"
:
"^2.0.6"
,
"plyr"
:
"^3.6.4"
,
"vue"
:
"^2.
5.17
"
,
"vue"
:
"^2.
6.12
"
,
"vue-cli"
:
"^2.9.6"
,
"vue-codemirror"
:
"^4.0.6"
,
"vue-grid-layout"
:
"^2.3.12"
,
"vue-i18n"
:
"^8.1.0"
,
"vue-router"
:
"^3.0.1"
,
"vuex"
:
"^3.0.1"
,
"vuex-router-sync"
:
"^5.0.0"
},
"devDependencies"
:
{
"@vue/cli-plugin-babel"
:
"^3.
0.3
"
,
"@vue/cli-plugin-eslint"
:
"^3.
0.3
"
,
"@vue/cli-service"
:
"^3.
0.3
"
,
"@vue/cli-plugin-babel"
:
"^3.
3.0
"
,
"@vue/cli-plugin-eslint"
:
"^3.
3.0
"
,
"@vue/cli-service"
:
"^3.
3.0
"
,
"babel-eslint"
:
"^10.1.0"
,
"babel-plugin-import"
:
"^1.9.1"
,
"eslint"
:
"^7.30.0"
,
...
...
tools/frontend/src/api/openapi.js
View file @
f92508d1
/*
* @Author: your name
* @Date: 2021-07-15 09:33:39
* @LastEditTime: 2021-07-19 2
0:05:01
* @LastEditTime: 2021-07-19 2
1:02:00
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\tools\frontend\src\api\openapi.js
*/
import
request
from
"
@/utils/request
"
;
export
function
getWatchList
()
{
return
request
({
url
:
"
/api/v1/monitor/watch
"
,
method
:
"
get
"
,
});
}
export
function
getMonitorData
(
params
)
{
return
request
({
url
:
"
/api/v1/monitor
"
,
method
:
"
get
"
,
params
,
});
}
export
function
users
(
params
)
{
return
request
({
url
:
"
https://randomuser.me/api
"
,
...
...
tools/frontend/src/components/SettingDrawer/index.js
View file @
f92508d1
import
'
./index.less
'
;
import
ThemeColor
from
'
./ThemeColor
'
;
import
BlockChecbox
from
'
./BlockChecbox
'
;
import
"
./index.less
"
;
import
ThemeColor
from
"
./ThemeColor
"
;
import
BlockChecbox
from
"
./BlockChecbox
"
;
import
Vue
from
'
vue
'
;
import
{
Drawer
,
Modal
,
Divider
,
message
}
from
"
ant-design-vue
"
;
import
{
mapGetters
}
from
"
vuex
"
;
const
Body
=
{
props
:[
'
title
'
],
props
:
[
"
title
"
],
render
:
function
render
()
{
var
h
=
arguments
[
0
];
const
{
$slots
,
title
}
=
this
return
h
(
'
div
'
,
{
style
:
{
marginBottom
:
24
}
},
[
h
(
'
h3
'
,
{
'
class
'
:
'
title
'
},
title
),
$slots
[
'
default
'
]])
}
}
const
{
$slots
,
title
}
=
this
;
return
h
(
"
div
"
,
{
style
:
{
marginBottom
:
24
}
},
[
h
(
"
h3
"
,
{
class
:
"
title
"
},
title
),
$slots
[
"
default
"
],
]);
},
};
Vue
.
use
(
Drawer
)
Vue
.
use
(
Modal
)
const
SettingDrawer
=
{
// data: () => ({
// primaryColor: "#42b983",
...
...
@@ -23,38 +31,36 @@ const SettingDrawer = {
}),
},
methods
:
{
changeSetting
(
key
,
value
)
{
changeSetting
(
key
,
value
)
{
const
nextState
=
this
.
settings
;
nextState
[
key
]
=
value
;
if
(
key
===
'
layout
'
)
{
nextState
.
contentWidth
=
value
===
'
topmenu
'
?
'
Fixed
'
:
'
Fluid
'
;
if
(
key
===
"
layout
"
)
{
nextState
.
contentWidth
=
value
===
"
topmenu
"
?
"
Fixed
"
:
"
Fluid
"
;
}
else
if
(
key
===
'
fixedHeader
'
&&
!
value
)
{
nextState
.
autoHideHeader
=
false
;
}
// else if (key === 'fixedHeader' && !value) {
// nextState.autoHideHeader = false;
// }
// console.log(this.settings);
// console.log(nextState);
//
this.$store.commit('global/UpdateDefaultSettings', this.s)
//
this.$store.commit('global/UpdateDefaultSettings', nextState)
//
console.log(key);
//
console.log(value);
//
message.loading("正在编译主题!", 3);
this
.
$store
.
commit
(
'
global/UpdateDefaultSettings
'
,
this
.
s
)
this
.
$store
.
commit
(
'
global/UpdateDefaultSettings
'
,
nextState
)
console
.
log
(
key
);
console
.
log
(
value
);
message
.
loading
(
"
正在编译主题!
"
,
3
);
this
.
$store
.
dispatch
(
'
global/defaultSettings
'
,
true
)
this
.
$store
.
dispatch
(
"
global/defaultSettings
"
,
true
);
},
togglerContent
()
{
this
.
$parent
.
collapse
=
!
this
.
collapse
}
this
.
$parent
.
collapse
=
!
this
.
collapse
;
},
},
render
()
{
const
{
collapse
}
=
this
const
{
primaryColor
,
layout
,
navTheme
}
=
this
.
settings
const
{
collapse
}
=
this
;
const
{
primaryColor
,
layout
,
navTheme
}
=
this
.
settings
;
return
(
<
Drawer
title
=
"
我是一个抽屉
"
placement
=
"
right
"
closable
=
{
false
}
...
...
@@ -63,50 +69,60 @@ const SettingDrawer = {
width
=
{
300
}
>
<
div
class
=
"
setting-drawer content
"
>
<
Body
title
=
{
this
.
$t
(
'
app.setting.pagestyle
'
)}
>
<
Body
title
=
{
this
.
$t
(
"
app.setting.pagestyle
"
)}
>
<
BlockChecbox
list
=
{[
{
key
:
'
dark
'
,
url
:
'
https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg
'
,
title
:
this
.
$t
(
'
app.setting.pagestyle.dark
'
),
key
:
"
dark
"
,
url
:
"
https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg
"
,
title
:
this
.
$t
(
"
app.setting.pagestyle.dark
"
),
},
{
key
:
'
light
'
,
url
:
'
https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg
'
,
title
:
this
.
$t
(
'
app.setting.pagestyle.light
'
),
key
:
"
light
"
,
url
:
"
https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg
"
,
title
:
this
.
$t
(
"
app.setting.pagestyle.light
"
),
},
]}
value
=
{
navTheme
}
onChange
=
{
e
=>
{
this
.
changeSetting
(
'
navTheme
'
,
e
)}}
onChange
=
{(
e
)
=>
{
this
.
changeSetting
(
"
navTheme
"
,
e
);
}}
/
>
<
/Body
>
<
Divider
/>
<
ThemeColor
title
=
{
this
.
$t
(
'
app.setting.themecolor
'
)}
title
=
{
this
.
$t
(
"
app.setting.themecolor
"
)}
value
=
{
primaryColor
}
onChange
=
{
e
=>
{
this
.
changeSetting
(
'
primaryColor
'
,
e
)}}
onChange
=
{(
e
)
=>
{
this
.
changeSetting
(
"
primaryColor
"
,
e
);
}}
/
>
<
Divider
/>
<
Body
title
=
{
this
.
$t
(
'
app.setting.navigationmode
'
)}
>
<
Body
title
=
{
this
.
$t
(
"
app.setting.navigationmode
"
)}
>
<
BlockChecbox
list
=
{[
{
key
:
'
sidemenu
'
,
url
:
'
https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg
'
,
title
:
this
.
$t
(
'
app.setting.sidemenu
'
),
key
:
"
sidemenu
"
,
url
:
"
https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg
"
,
title
:
this
.
$t
(
"
app.setting.sidemenu
"
),
},
{
key
:
'
topmenu
'
,
url
:
'
https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg
'
,
title
:
this
.
$t
(
'
app.setting.topmenu
'
),
style
:
{
paddingLeft
:
'
18px
'
}
key
:
"
topmenu
"
,
url
:
"
https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg
"
,
title
:
this
.
$t
(
"
app.setting.topmenu
"
),
style
:
{
paddingLeft
:
"
18px
"
},
},
]}
value
=
{
layout
}
onChange
=
{
e
=>
{
this
.
changeSetting
(
'
layout
'
,
e
)}}
onChange
=
{(
e
)
=>
{
this
.
changeSetting
(
"
layout
"
,
e
);
}}
/
>
<
/Body
>
...
...
@@ -114,7 +130,7 @@ const SettingDrawer = {
<
p
>
其它设置
<
/p
>
<
/div
>
<
/Drawer
>
)
}
}
export
default
SettingDrawer
\ No newline at end of file
);
},
};
export
default
SettingDrawer
;
tools/frontend/src/utils/notify.js
0 → 100644
View file @
f92508d1
/*
* @Author: your name
* @Date: 2021-07-01 15:02:16
* @LastEditTime: 2021-07-19 20:38:32
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\eventBus.js
*/
import
Vue
from
"
vue
"
;
import
{
getToken
}
from
"
@/utils/auth
"
;
export
const
wsNotify
=
new
WebSocket
(
`ws://
${
window
.
location
.
hostname
}
:3000/ws/v1/notify`
);
window
.
wsNotify
=
wsNotify
;
wsNotify
.
eventBus
=
new
Vue
();
let
timer
=
null
;
wsNotify
.
onopen
=
function
(
event
)
{
console
.
log
(
"
websocket is conneted!
"
,
event
);
wsNotify
.
eventBus
.
$emit
(
"
open
"
,
event
);
timer
=
setInterval
(
function
()
{
wsNotify
.
send
(
JSON
.
stringify
({
type
:
'
heartbeat
'
,
ts
:
Date
.
now
(),
token
:
getToken
()
}))
},
1000
)
};
wsNotify
.
onmessage
=
function
(
event
)
{
var
message
=
JSON
.
parse
(
event
.
data
);
wsNotify
.
eventBus
.
$emit
(
"
message
"
,
message
);
};
wsNotify
.
onerror
=
function
(
error
)
{
console
.
log
(
error
);
wsNotify
.
eventBus
.
$emit
(
"
error
"
,
error
);
if
(
timer
)
clearInterval
(
timer
);
};
wsNotify
.
onclose
=
function
(
event
)
{
console
.
log
(
"
websocket is colosed!
"
,
event
);
wsNotify
.
eventBus
.
$emit
(
"
close
"
,
event
);
if
(
timer
)
clearInterval
(
timer
);
};
tools/frontend/src/utils/utils.js
0 → 100644
View file @
f92508d1
/*
* @Author: your name
* @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-01 02:12:04
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\utils.js
*/
function
formatNumber
(
n
)
{
n
=
n
.
toString
();
return
n
[
1
]
?
n
:
"
0
"
+
n
;
}
export
function
getDateTime
(
datetime
)
{
var
year
=
datetime
.
getFullYear
();
var
month
=
datetime
.
getMonth
()
+
1
;
var
day
=
datetime
.
getDate
();
var
hour
=
datetime
.
getHours
();
var
minute
=
datetime
.
getMinutes
();
var
second
=
datetime
.
getSeconds
();
return
[
year
,
month
,
day
,
hour
,
minute
,
second
].
map
(
formatNumber
);
}
export
function
formatDateTime
(
datetime
=
[],
format
=
[
"
-
"
,
"
-
"
,
"
"
,
"
:
"
,
"
:
"
]
)
{
let
result
=
""
;
datetime
.
forEach
((
d
,
i
)
=>
{
result
+=
i
<
5
?
d
+
format
[
i
]
:
d
;
});
return
result
;
}
export
function
getDateTimeString
(
datetime
)
{
if
(
!
(
datetime
instanceof
Date
))
datetime
=
new
Date
(
datetime
);
datetime
=
getDateTime
(
datetime
);
const
format
=
[
"
-
"
,
"
-
"
,
"
"
,
"
:
"
,
"
:
"
];
let
result
=
""
;
datetime
.
forEach
((
d
,
i
)
=>
{
result
+=
i
<
5
?
d
+
format
[
i
]
:
d
;
});
return
result
;
}
tools/frontend/src/views/Application/Monitor.vue
View file @
f92508d1
<
template
>
<
a-page-header-wrapper
title=
"查询表格
"
>
<
a-card
:bordered=
"false
"
>
<
div
class=
"tableList"
>
<div
class=
"tableListForm"
>
<a-form
v-show=
"!expandForm"
layout=
"inline"
>
<a-row
:gutter=
"
{ md: 8, lg: 24, xl: 48 }">
<a-col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"设备"
v-decorator=
"['name']"
>
<a-input
placeholder=
"请输入"
/>
</a-form-item>
</a-col>
<a-col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"性别"
v-decorator=
"['gender']"
>
<a-select
placeholder=
"请选择"
style=
"width: 100%"
>
<a-option
value=
"male"
>
male
</a-option>
<a-option
value=
"female"
>
female
</a-option
>
</a-select>
</a-form-item>
</a-col>
<a-col
:md=
"8"
:sm=
"24"
>
<span
class=
"submitButtons"
>
<a-button
type=
"primary"
htmlType=
"submit"
>
查询
</a-button>
<a-button
:style=
"
{ marginLeft: '8px' }"> 重置
</a-button>
<a
:style=
"
{ marginLeft: '8px' }" @click="toggleForm">
展开
<a-icon
type=
"down"
/>
</a>
</span>
</a-col
>
</a-row
>
<
/a-form
>
<a-form
v-show=
"expandForm"
layout=
"inline"
>
<a-row
:gutter=
"
{ md: 8, lg: 24, xl: 48 }">
<a-col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"用户"
v-decorator=
"['username']"
>
<a-input
placeholder=
"请输入"
/>
</a-form-item>
</a-col
>
<a-
col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"性别"
v-decorator=
"['gender']"
>
<a-select
placeholder=
"请选择"
style=
"width: 100%"
>
<a-option
value=
"male"
>
male
</a-option>
<a-option
value=
"female"
>
female
</a-option>
<
div
class=
"app-container
"
>
<
div
style=
"margin-top: 10px
"
>
<
grid-layout
:layout.sync=
"layout"
:col-num=
"12"
:row-height=
"30"
:is-draggable=
"draggable"
:is-resizable=
"resizable"
:vertical-compact=
"true"
:use-css-transforms=
"true"
@
layout-created=
"layoutCreatedEvent"
@
layout-before-mount=
"layoutBeforeMountEvent"
@
layout-mounted=
"layoutMountedEvent"
@
layout-ready=
"layoutReadyEvent"
@
layout-updated=
"layoutUpdatedEvent"
>
<grid-item
:x=
"0"
:y=
"0"
:w=
"6"
:h=
"5"
i=
"1"
@
resize=
"resizeEvent"
@
move=
"moveEvent"
@
resized=
"resizedEvent"
@
container-resized=
"containerResizedEvent"
@
moved=
"movedEvent"
>
<p
class=
"item-title"
>
DEVICE
</p
>
<
div
style=
"padding: 15px"
>
<a-select
style=
"width: 200px;"
size=
"large"
v-model=
"device"
@
change=
"onSelectChange"
placeholder=
"请选择设备"
>
<a-
option
v-for=
"(item, index) in deviceList"
:key=
"index"
:value=
"item"
>
{{
item
}}
</a-option>
</a-select>
</a-form-item>
</a-col>
<a-col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"姓名"
v-decorator=
"['name']"
>
<a-input
placeholder=
"请输入"
/>
</a-form-item>
</a-col>
</a-row>
<a-row
:gutter=
"
{ md: 8, lg: 24, xl: 48 }">
<a-col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"时间"
v-decorator=
"['registered']"
>
<a-range-picker
style=
"width: 100%"
/>
</a-form-item>
</a-col>
<a-col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"邮箱"
v-decorator=
"['email']"
>
<a-input
placeholder=
"请输入"
/>
</a-form-item>
</a-col>
<a-col
:md=
"8"
:sm=
"24"
>
<a-form-item
label=
"国籍"
v-decorator=
"['nat']"
>
<a-input
placeholder=
"请输入"
/>
</a-form-item>
</a-col>
</a-row>
<div
style=
"overflow: hidden"
>
<div
:style=
"
{ float: 'right', marginBottom: '24px' }">
<a-button
type=
"primary"
htmlType=
"submit"
>
查询
</a-button>
<a-button
:style=
"
{ marginLeft: '8px' }"> 重置
</a-button>
<a
:style=
"
{ marginLeft: '8px' }" @click="toggleForm">
收起
<a-icon
type=
"up"
/>
</a>
</div>
</div>
</a-form>
</div>
<div
class=
"tableListOperator"
>
<a-button
icon=
"plus"
type=
"primary"
>
新建
</a-button>
<span
v-show=
"selectedRowKeys.length > 0"
>
<a-button>
批量操作
</a-button>
<!--
<a-dropdown
overlay=
{menu}>
<a-button>
更多操作
<icon
type=
"down"
/>
</a-button>
</a-dropdown>
-->
</span>
</div>
<!--
<StandardTable
selectedRows=
{selectedRows}
loading={loading}
data={data}
columns={this.columns}
onSelectRow={this.handleSelectRows}
onChange={this.handleStandardTableChange}
/> -->
<a-table
:columns=
"columns"
:rowKey=
"(record) => record.uuid"
:dataSource=
"users.data"
:pagination=
"users.pagination"
:loading=
"loading"
@
change=
"handleTableChange"
</div>
</grid-item>
<grid-item
:x=
"6"
:y=
"0"
:w=
"6"
:h=
"5"
i=
"2"
@
resize=
"resizeEvent"
@
move=
"moveEvent"
@
resized=
"resizedEvent"
@
container-resized=
"containerResizedEvent"
@
moved=
"movedEvent"
>
<p
class=
"item-title"
>
SYSTEM
</p>
<div
class=
"grid-container"
>
<div
class=
"grid-item"
>
<h3>
host
</h3>
<p>
{{
system
.
host
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
timestamp
</h3>
<p>
{{
system
.
timestamp
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
imei
</h3>
<p>
{{
system
.
imei
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
free_size
</h3>
<p>
{{
system
.
free_size
}}
</p>
</div>
</div>
</grid-item>
<grid-item
:x=
"0"
:y=
"5"
:w=
"6"
:h=
"5"
i=
"3"
@
resize=
"resizeEvent"
@
move=
"moveEvent"
@
resized=
"resizedEvent"
@
container-resized=
"containerResizedEvent"
@
moved=
"movedEvent"
>
<p
class=
"item-title"
>
EVM
</p>
<div
class=
"grid-container"
>
<div
class=
"grid-item"
>
<h3>
heap_map_size
</h3>
<p>
{{
evm
.
heap_map_size
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
heap_total_size
</h3>
<p>
{{
evm
.
heap_total_size
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
heap_used_size
</h3>
<p>
{{
evm
.
heap_used_size
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
stack_total_size
</h3>
<p>
{{
evm
.
stack_total_size
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
stack_used_size
</h3>
<p>
{{
evm
.
stack_used_size
}}
</p>
</div>
</div>
</grid-item>
<grid-item
:x=
"6"
:y=
"5"
:w=
"6"
:h=
"5"
i=
"4"
@
resize=
"resizeEvent"
@
move=
"moveEvent"
@
resized=
"resizedEvent"
@
container-resized=
"containerResizedEvent"
@
moved=
"movedEvent"
>
<p
class=
"item-title"
>
LVGL
</p>
<div
class=
"grid-container"
>
<div
class=
"grid-item"
>
<h3>
total_size
</h3>
<p>
{{
lvgl
.
total_size
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
free_cnt
</h3>
<p>
{{
lvgl
.
free_cnt
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
free_size
</h3>
<p>
{{
lvgl
.
free_size
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
free_biggest_size
</h3>
<p>
{{
lvgl
.
free_biggest_size
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
used_cnt
</h3>
<p>
{{
lvgl
.
used_cnt
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
used_pct
</h3>
<p>
{{
lvgl
.
used_pct
}}
</p>
</div>
<div
class=
"grid-item"
>
<h3>
frag_pct
</h3>
<p>
{{
lvgl
.
frag_pct
}}
</p>
</div>
</div>
</grid-item>
<grid-item
:x=
"0"
:y=
"10"
:w=
"12"
:h=
"10"
i=
"5"
@
resize=
"resizeEvent"
@
move=
"moveEvent"
@
resized=
"resizedEvent"
@
container-resized=
"containerResizedEvent"
@
moved=
"movedEvent"
>
<template
slot=
"action"
slot-scope=
"text, record"
>
<a
href=
"javascript:;"
>
查看
</a>
<a-divider
type=
"vertical"
/>
<a
href=
"javascript:;"
>
配置
</a>
</
template
>
</a-table>
</div>
</a-card>
</a-page-header-wrapper>
<div
style=
"width: 100%; height: 100%; overflow-y: auto"
>
<p
class=
"item-title"
>
APP
</p>
<div
class=
"grid-container"
>
<div
class=
"grid-item"
>
<h3>
uri
</h3>
</div>
<div
class=
"grid-item"
>
<h3>
length
</h3>
</div>
<div
class=
"grid-item"
>
<h3>
png_file_size
</h3>
</div>
<div
class=
"grid-item"
>
<h3>
png_total_count
</h3>
</div>
<div
class=
"grid-item"
>
<h3>
png_uncompressed_size
</h3>
</div>
</div>
<div
class=
"grid-container"
v-for=
"(item, index) in imageList"
:key=
"index"
>
<div
class=
"grid-item"
><p>
{{
item
.
uri
}}
</p></div>
<div
class=
"grid-item"
><p>
{{
item
.
length
}}
</p></div>
<div
class=
"grid-item"
><p>
{{
item
.
png_file_size
}}
</p></div>
<div
class=
"grid-item"
><p>
{{
item
.
png_total_count
}}
</p></div>
<div
class=
"grid-item"
><p>
{{
item
.
png_uncompressed_size
}}
</p></div>
</div>
</div>
</grid-item>
<grid-item
:x=
"0"
:y=
"20"
:w=
"12"
:h=
"7"
i=
"6"
@
resize=
"resizeEvent"
@
move=
"moveEvent"
@
resized=
"resizedEvent"
@
container-resized=
"containerResizedEvent"
@
moved=
"movedEvent"
>
<EvmChart
:chartData=
"evm"
></EvmChart>
</grid-item>
<grid-item
:x=
"0"
:y=
"27"
:w=
"12"
:h=
"7"
i=
"7"
@
resize=
"resizeEvent"
@
move=
"moveEvent"
@
resized=
"resizedEvent"
@
container-resized=
"containerResizedEvent"
@
moved=
"movedEvent"
>
<LvglChart
:chartData=
"lvgl"
></LvglChart>
</grid-item>
</grid-layout>
</div>
</div>
</
template
>
<
script
>
import
{
Avatar
,
Row
,
...
...
@@ -135,62 +248,78 @@ import {
}
from
"
ant-design-vue
"
;
import
PageHeaderWrapper
from
"
@/components/PageHeaderWrapper
"
;
import
DescriptionItem
from
"
@/components/DescriptionItem
"
;
const
columns
=
[
{
title
:
"
用户名
"
,
dataIndex
:
"
login
"
,
sorter
:
true
,
width
:
"
12%
"
,
scopedSlots
:
{
customRender
:
"
login
"
},
},
{
title
:
"
姓名
"
,
dataIndex
:
"
name
"
,
sorter
:
true
,
width
:
"
15%
"
,
scopedSlots
:
{
customRender
:
"
name
"
},
},
{
title
:
"
性别
"
,
dataIndex
:
"
gender
"
,
filters
:
[
{
text
:
"
Male
"
,
value
:
"
male
"
},
{
text
:
"
Female
"
,
value
:
"
female
"
},
],
import
{
getWatchList
,
getMonitorData
}
from
"
@/api/openapi
"
;
import
EvmChart
from
"
./components/EvmChart
"
;
import
LvglChart
from
"
./components/LvglChart
"
;
import
{
GridLayout
,
GridItem
}
from
"
vue-grid-layout
"
;
import
{
wsNotify
}
from
"
@/utils/notify.js
"
;
export
default
{
name
:
"
Monitor
"
,
data
()
{
return
{
watchs
:
[],
device
:
null
,
devices
:
{},
deviceList
:
[],
system
:
{
host
:
null
,
imei
:
null
,
timestamp
:
null
,
},
{
title
:
"
邮箱
"
,
dataIndex
:
"
email
"
,
evm
:
{
heap_map_size
:
null
,
heap_total_size
:
null
,
heap_used_size
:
null
,
stack_total_size
:
null
,
stack_used_size
:
null
,
},
{
title
:
"
国籍
"
,
dataIndex
:
"
nat
"
,
evmList
:
[],
lvgl
:
{
total_size
:
null
,
free_cnt
:
null
,
free_size
:
null
,
free_biggest_size
:
null
,
used_cnt
:
null
,
used_pct
:
null
,
frag_pct
:
null
},
{
title
:
"
Action
"
,
key
:
"
action
"
,
scopedSlots
:
{
customRender
:
"
action
"
},
lvglList
:
[],
image
:
{},
imageList
:
[],
socket
:
null
,
form
:
{
system
:
[
"
free_size
"
],
lvgl
:
[
"
total_size
"
,
"
free_size
"
,
"
free_biggest_size
"
],
evm
:
[
"
total_size
"
,
"
free_size
"
,
"
heap_map_size
"
,
"
heap_total_size
"
,
"
heap_used_size
"
,
"
stack_total_size
"
,
"
stack_used_size
"
,
],
image
:
[
"
png_uncompressed_size
"
,
"
png_file_size
"
,
"
length
"
],
},
layout
:
[
{
x
:
0
,
y
:
0
,
w
:
6
,
h
:
5
,
i
:
"
0
"
,
static
:
false
},
{
x
:
6
,
y
:
0
,
w
:
6
,
h
:
5
,
i
:
"
1
"
,
static
:
true
},
{
x
:
0
,
y
:
5
,
w
:
6
,
h
:
5
,
i
:
"
2
"
,
static
:
false
},
{
x
:
6
,
y
:
5
,
w
:
6
,
h
:
5
,
i
:
"
3
"
,
static
:
false
},
{
x
:
0
,
y
:
10
,
w
:
12
,
h
:
10
,
i
:
"
4
"
,
static
:
false
},
{
x
:
0
,
y
:
20
,
w
:
12
,
h
:
7
,
i
:
"
5
"
,
static
:
false
},
{
x
:
0
,
y
:
27
,
w
:
12
,
h
:
7
,
i
:
"
6
"
,
static
:
false
},
],
draggable
:
true
,
resizable
:
true
,
};
},
];
export
default
{
name
:
"
DeviceIndex
"
,
data
:
()
=>
({
expandForm
:
false
,
selectedRowKeys
:
[],
columns
,
sya
:
{
fontSize
:
"
16px
"
,
color
:
"
rgba(0,0,0,0.85)
"
,
lineHeight
:
"
24px
"
,
display
:
"
block
"
,
marginBottom
:
"
16px
"
,
},
syb
:
{
marginBottom
:
"
24px
"
,
},
}),
components
:
{
GridLayout
,
GridItem
,
EvmChart
,
LvglChart
,
APageHeaderWrapper
:
PageHeaderWrapper
,
AAvatar
:
Avatar
,
ARow
:
Row
,
...
...
@@ -213,20 +342,288 @@ export default {
ARangePicker
:
DatePicker
.
RangePicker
,
},
methods
:
{
toggleForm
()
{
this
.
expandForm
=
!
this
.
expandForm
;
moveEvent
(
i
,
newX
,
newY
)
{
const
msg
=
"
MOVE i=
"
+
i
+
"
, X=
"
+
newX
+
"
, Y=
"
+
newY
;
console
.
log
(
msg
);
},
movedEvent
(
i
,
newX
,
newY
)
{
const
msg
=
"
MOVED i=
"
+
i
+
"
, X=
"
+
newX
+
"
, Y=
"
+
newY
;
console
.
log
(
msg
);
},
resizeEvent
(
i
,
newH
,
newW
,
newHPx
,
newWPx
)
{
const
msg
=
"
RESIZE i=
"
+
i
+
"
, H=
"
+
newH
+
"
, W=
"
+
newW
+
"
, H(px)=
"
+
newHPx
+
"
, W(px)=
"
+
newWPx
;
console
.
log
(
msg
);
},
resizedEvent
(
i
,
newX
,
newY
,
newHPx
,
newWPx
)
{
const
msg
=
"
RESIZED i=
"
+
i
+
"
, X=
"
+
newX
+
"
, Y=
"
+
newY
+
"
, H(px)=
"
+
newHPx
+
"
, W(px)=
"
+
newWPx
;
console
.
log
(
msg
);
},
containerResizedEvent
(
i
,
newH
,
newW
,
newHPx
,
newWPx
)
{
const
msg
=
"
CONTAINER RESIZED i=
"
+
i
+
"
, H=
"
+
newH
+
"
, W=
"
+
newW
+
"
, H(px)=
"
+
newHPx
+
"
, W(px)=
"
+
newWPx
;
console
.
log
(
msg
);
},
layoutCreatedEvent
(
newLayout
)
{
console
.
log
(
"
Created layout:
"
,
newLayout
);
},
layoutBeforeMountEvent
(
newLayout
)
{
console
.
log
(
"
beforeMount layout:
"
,
newLayout
);
},
layoutMountedEvent
(
newLayout
)
{
console
.
log
(
"
Mounted layout:
"
,
newLayout
);
},
layoutReadyEvent
(
newLayout
)
{
console
.
log
(
"
Ready layout:
"
,
newLayout
);
},
onSelectChange
(
selectedRowKeys
)
{
window
.
console
.
log
(
"
selectedRowKeys changed:
"
,
selectedRowKeys
);
this
.
selectedRowKeys
=
selectedRowKeys
;
layoutUpdatedEvent
(
newLayout
)
{
console
.
log
(
"
Updated layout:
"
,
newLayout
);
},
handleTableChange
(
pagination
,
filters
,
sorter
)
{
console
.
log
(
pagination
,
filters
,
sorter
)
fetchData
()
{
this
.
isLoading
=
true
;
getWatchList
()
.
then
((
res
)
=>
{
if
(
res
.
code
==
200
)
this
.
watchs
=
res
.
data
;
})
.
catch
((
err
)
=>
{
this
.
$message
.
warning
(
err
.
msg
);
})
.
finally
(()
=>
{
this
.
isLoading
=
false
;
});
},
queryData
()
{
getMonitorData
({
watch
:
this
.
device
,
})
.
then
((
res
)
=>
{
if
(
res
.
type
==
"
object
"
)
{
this
.
evmList
=
res
.
data
.
evm
;
this
.
lvglList
=
res
.
data
.
lvgl
;
this
.
imageList
=
res
.
data
.
image
;
}
})
.
catch
((
err
)
=>
{
this
.
$message
.
warning
(
err
.
msg
);
});
},
onChange
(
res
)
{
if
(
!
res
)
return
null
;
var
t
=
this
.
watchs
.
find
((
item
)
=>
{
return
item
.
id
==
res
;
});
if
(
t
)
this
.
device
=
t
.
imei
;
// 清空之前数据
this
.
resetData
();
},
onSubmit
()
{
this
.
queryData
();
},
onReset
(
formName
)
{
this
.
$refs
[
formName
].
resetFields
();
this
.
fetchData
();
},
sendMsg
()
{
let
message
=
JSON
.
stringify
({
type
:
"
auth
"
,
token
:
window
.
sessionStorage
.
getItem
(
"
Authorization
"
),
});
this
.
socket
.
send
(
message
);
},
handleMessage
(
msg
)
{
if
(
msg
.
type
!==
"
report
"
||
!
msg
.
imei
)
return
false
;
if
(
!
this
.
deviceList
)
{
this
.
deviceList
=
[];
}
if
(
!
this
.
deviceList
.
includes
(
msg
.
imei
))
{
this
.
deviceList
.
push
(
msg
.
imei
);
}
if
(
!
this
.
device
)
{
if
(
this
.
deviceList
&&
this
.
deviceList
.
length
)
this
.
device
=
this
.
deviceList
[
0
];
else
this
.
device
=
msg
.
imei
;
}
this
.
devices
[
msg
.
imei
]
=
msg
;
this
.
processData
(
msg
);
this
.
resetData
();
},
processData
(
msg
)
{
if
(
!
msg
)
return
null
;
Object
.
keys
(
msg
).
forEach
((
item
)
=>
{
if
(
this
.
form
[
item
])
{
var
keys
=
this
.
form
[
item
];
for
(
var
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
var
k
=
keys
[
i
];
if
(
item
==
"
image
"
)
{
for
(
var
j
=
0
;
j
<
msg
[
item
].
length
;
j
++
)
{
msg
[
item
][
j
][
k
]
=
Math
.
ceil
(
msg
[
item
][
j
][
k
]
/
1024
);
}
}
else
{
msg
[
item
][
k
]
=
Math
.
ceil
(
msg
[
item
][
k
]
/
1024
);
}
}
}
});
},
onSelectChange
(
res
)
{
this
.
device
=
res
;
this
.
processData
(
this
.
devices
[
this
.
device
]);
this
.
resetData
();
console
.
log
(
res
);
},
resetData
()
{
wsNotify
.
eventBus
.
$emit
(
"
resize
"
);
this
.
evmList
=
[{
...
this
.
devices
[
this
.
device
].
evm
}];
this
.
lvglList
=
[{
...
this
.
devices
[
this
.
device
].
lvgl
}];
this
.
system
=
{
imei
:
this
.
devices
[
this
.
device
].
imei
,
...
this
.
devices
[
this
.
device
].
system
,
...
this
.
devices
[
this
.
device
].
request
};
// 这里需要特殊处理下,先判断uri是否存在,不存在则添加,存在则更新
let
uris
=
[];
this
.
imageList
.
forEach
((
img
)
=>
{
uris
.
push
(
img
.
uri
);
});
this
.
devices
[
this
.
device
].
image
&&
this
.
devices
[
this
.
device
].
image
.
forEach
((
item
)
=>
{
if
(
!
uris
.
includes
(
item
.
uri
))
{
this
.
imageList
.
push
(
item
);
}
});
// this.imageList = msg.image;
if
(
this
.
devices
[
this
.
device
])
{
if
(
this
.
devices
[
this
.
device
].
evm
)
this
.
evm
=
this
.
devices
[
this
.
device
].
evm
;
if
(
this
.
devices
[
this
.
device
].
lvgl
)
this
.
lvgl
=
this
.
devices
[
this
.
device
].
lvgl
;
if
(
this
.
devices
[
this
.
device
].
image
)
this
.
image
=
this
.
devices
[
this
.
device
].
image
;
}
},
},
mounted
()
{},
created
()
{
this
.
socket
=
wsNotify
;
wsNotify
.
eventBus
.
$on
(
"
open
"
,
(
message
)
=>
{
this
.
sendMsg
();
this
.
$nextTick
(()
=>
{
console
.
log
(
message
);
});
// 这里启动一个定时器,10秒钟后,如果没有消息进来,说明当前没有在线设备
});
wsNotify
.
eventBus
.
$on
(
"
close
"
,
(
message
)
=>
{
this
.
$nextTick
(()
=>
{
console
.
log
(
message
);
});
});
wsNotify
.
eventBus
.
$on
(
"
message
"
,
(
message
)
=>
{
this
.
$nextTick
(()
=>
{
this
.
handleMessage
(
message
);
});
});
},
created
()
{},
};
</
script
>
<
style
lang=
"less"
>
@import url("styles/tableList.less");
<
style
lang=
"scss"
scoped
>
.app-container
{
&
>
div
.page-wrapper
{
margin
:
10px
0px
;
}
}
.grid-container
{
display
:
flex
;
flex-direction
:
row
;
&
>
.grid-item
{
flex
:
1
;
&
>
h3
,
p
{
text-align
:
center
;
}
}
}
.vue-grid-layout
{
background
:
none
;
}
.vue-grid-item
:not
(
.vue-grid-placeholder
)
{
background
:
#fff
;
border
:
0px
solid
#eee
;
}
.vue-grid-item
.resizing
{
opacity
:
0
.9
;
}
.vue-grid-item
.static
{
background
:
#cce
;
}
.vue-grid-item
.text
{
font-size
:
24px
;
text-align
:
center
;
position
:
absolute
;
top
:
0
;
bottom
:
0
;
left
:
0
;
right
:
0
;
margin
:
auto
;
height
:
100%
;
width
:
100%
;
}
.vue-grid-item
.item-title
{
margin
:
15px
;
}
.vue-grid-item
.no-drag
{
height
:
100%
;
width
:
100%
;
}
.vue-grid-item
.minMax
{
font-size
:
12px
;
}
.vue-grid-item
.add
{
cursor
:
pointer
;
}
.vue-draggable-handle
{
position
:
absolute
;
width
:
20px
;
height
:
20px
;
top
:
0
;
left
:
0
;
background
:
url("data:image/svg+xml;utf8,
<
svg
xmlns
='
http
:
//
www
.
w3
.
org
/
2000
/
svg
' width='
10
' height='
10
'>
<
circle
cx
=
'5'
cy
=
'5'
r
=
'5'
fill
=
'#999999'
/></
svg
>
")
no-repeat;
background-position: bottom right;
padding: 0 8px 8px 0;
background-repeat: no-repeat;
background-origin: content-box;
box-sizing: border-box;
cursor: pointer;
}
</
style
>
tools/frontend/src/views/Application/components/EvmChart.vue
0 → 100644
View file @
f92508d1
<
template
>
<div
:class=
"className"
:style=
"
{ height: height, width: width }" />
</
template
>
<
script
>
import
*
as
echarts
from
"
echarts
"
;
require
(
"
echarts/theme/macarons
"
);
// echarts theme
import
resize
from
"
./mixins/resize
"
;
import
{
getDateTimeString
}
from
"
@/utils/utils
"
;
import
{
wsNotify
}
from
"
@/utils/notify.js
"
;
// function randomData() {
// now = new Date(+now + oneDay);
// value = value + Math.random() * 21 - 10;
// return {
// name: "EVM",
// value: [
// [now.getFullYear(), now.getMonth() + 1, now.getDate()].join("/") +
// " " +
// [now.getHours(), now.getMinutes() + 1, now.getSeconds()].join(":"),
// Math.round(value),
// ],
// };
// }
// const dataList = [];
// let now = +new Date(1997, 9, 3);
// const oneDay = 24 * 3600 * 1000;
// var value = Math.random() * 1000;
// for (var i = 0; i
<
1000
;
i
++
)
{
// dataList.push(randomData());
// }
const
seriesData
=
{
heap_total_size
:
[],
heap_used_size
:
[],
stack_total_size
:
[],
stack_used_size
:
[],
};
export
default
{
mixins
:
[
resize
],
props
:
{
className
:
{
type
:
String
,
default
:
"
chart
"
,
},
width
:
{
type
:
String
,
default
:
"
100%
"
,
},
height
:
{
type
:
String
,
default
:
"
270px
"
,
},
autoResize
:
{
type
:
Boolean
,
default
:
true
,
},
chartData
:
{
type
:
Object
,
required
:
true
,
},
},
data
()
{
return
{
loading
:
null
,
chart
:
null
,
timer
:
null
,
series
:
[
{
name
:
"
heap_total_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
scale
:
false
,
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
heap_total_size
,
},
{
name
:
"
heap_used_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
heap_used_size
,
},
{
name
:
"
stack_total_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
stack_total_size
,
},
{
name
:
"
stack_used_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
stack_used_size
,
},
],
legendData
:
Object
.
keys
(
seriesData
),
};
},
watch
:
{
chartData
:
{
deep
:
true
,
handler
(
val
)
{
this
.
handleMessage
(
val
);
},
},
},
mounted
()
{
this
.
$nextTick
(()
=>
{
this
.
initChart
();
});
wsNotify
.
eventBus
.
$on
(
"
resize
"
,
()
=>
{
if
(
this
.
chart
)
this
.
chart
.
resize
()
});
},
beforeDestroy
()
{
if
(
!
this
.
chart
)
{
return
;
}
this
.
chart
.
dispose
();
this
.
chart
=
null
;
},
methods
:
{
cleanData
()
{
// 关闭从WebSocket接收数据
// 重置所有数据
Object
.
keys
(
seriesData
).
forEach
((
key
)
=>
{
seriesData
[
key
]
=
[];
});
this
.
series
.
forEach
((
item
)
=>
{
item
.
data
=
[];
});
this
.
chart
.
setOption
({
series
:
this
.
series
});
},
handleMessage
(
data
)
{
if
(
!
data
||
data
.
length
==
0
)
this
.
cleanData
()
// 这里面应该增加一个数组长度判断,当超过了多少个之后,弹出数组第一项,防止数组内存溢出
// seriesData[k].shift()
Object
.
keys
(
data
).
forEach
((
k
)
=>
{
var
t
=
getDateTimeString
(
new
Date
());
if
(
k
==
"
timestamp
"
)
t
=
data
[
k
];
if
(
this
.
legendData
.
includes
(
k
))
{
seriesData
[
k
].
push
({
name
:
k
,
value
:
[
t
,
data
[
k
]],
});
}
});
this
.
$nextTick
(()
=>
{
this
.
chart
&&
this
.
chart
.
setOption
({
series
:
this
.
series
,
});
});
},
initChart
()
{
this
.
chart
=
echarts
.
init
(
this
.
$el
,
"
macarons
"
);
this
.
setOptions
();
},
setOptions
()
{
this
.
chart
.
setOption
({
title
:
{
text
:
"
EVM
"
,
},
xAxis
:
{
type
:
"
time
"
,
splitLine
:
{
show
:
false
,
},
// data: xAxisTitle,
// boundaryGap: false,
// axisTick: {
// show: false,
// },
axisLabel
:
{
formatter
:
"
{HH}:{mm}:{ss}
"
,
},
},
yAxis
:
{
type
:
"
value
"
,
scale
:
true
,
// boundaryGap: [0, "100%"],
// splitNumber: 10,
splitLine
:
{
show
:
false
,
},
},
grid
:
{
left
:
10
,
right
:
10
,
bottom
:
10
,
top
:
50
,
containLabel
:
true
,
},
tooltip
:
{
trigger
:
"
axis
"
,
axisPointer
:
{
type
:
"
cross
"
,
animation
:
false
,
},
// formatter: function (params) {
// params = params[0];
// console.log(params);
// var date = new Date(params.name);
// return (
// date.getDate() +
// "/" +
// (date.getMonth() + 1) +
// "/" +
// date.getFullYear() +
// " : " +
// params.value[1]
// );
// },
padding
:
[
5
,
10
],
},
legend
:
{
data
:
this
.
legendData
,
selected
:
{
heap_total_size
:
false
,
stack_total_size
:
false
,
stack_used_size
:
false
,
},
},
series
:
this
.
series
,
});
},
},
};
</
script
>
tools/frontend/src/views/Application/components/EvmHistoryChart.vue
0 → 100644
View file @
f92508d1
<
template
>
<div
:class=
"className"
:style=
"
{ height: height, width: width }" />
</
template
>
<
script
>
import
*
as
echarts
from
"
echarts
"
;
require
(
"
echarts/theme/macarons
"
);
import
resize
from
"
./mixins/resize
"
;
let
chart
=
null
const
seriesData
=
{
heap_total_size
:
[],
heap_used_size
:
[],
stack_total_size
:
[],
stack_used_size
:
[],
};
export
default
{
mixins
:
[
resize
],
props
:
{
className
:
{
type
:
String
,
default
:
"
chart
"
,
},
width
:
{
type
:
String
,
default
:
"
100%
"
,
},
height
:
{
type
:
String
,
default
:
"
350px
"
,
},
autoResize
:
{
type
:
Boolean
,
default
:
true
,
},
dataList
:
{
type
:
Array
,
required
:
false
,
default
:
()
=>
[],
},
},
data
()
{
return
{
loading
:
null
,
series
:
[
{
name
:
"
heap_total_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
scale
:
false
,
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
heap_used_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
stack_total_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
stack_used_size
"
,
type
:
"
line
"
,
max
:
"
dataMax
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
],
legendData
:
Object
.
keys
(
seriesData
),
};
},
watch
:
{
dataList
:
{
deep
:
true
,
handler
(
val
)
{
if
(
val
.
length
>
0
)
this
.
handleData
(
val
);
},
},
},
mounted
()
{
this
.
$nextTick
(()
=>
{
this
.
initChart
();
});
},
beforeDestroy
()
{
if
(
!
chart
)
{
return
;
}
chart
.
clear
();
chart
.
dispose
();
},
methods
:
{
handleData
(
data
)
{
Object
.
keys
(
seriesData
).
forEach
((
key
)
=>
{
seriesData
[
key
]
=
[];
});
this
.
series
.
forEach
((
item
)
=>
{
item
.
data
=
[];
});
// chart.setOption({ series: this.series });
data
.
forEach
((
item
)
=>
{
this
.
handleMessage
(
item
);
});
let
temp
=
Object
.
assign
(
this
.
series
);
temp
.
forEach
(
item
=>
{
if
(
Object
.
prototype
.
hasOwnProperty
.
call
(
seriesData
,
item
.
name
))
{
item
.
data
=
seriesData
[
item
.
name
]
}
});
this
.
series
=
temp
;
this
.
$nextTick
(()
=>
{
chart
&&
chart
.
setOption
({
series
:
this
.
series
,
});
});
},
handleMessage
(
data
)
{
Object
.
keys
(
data
).
forEach
((
k
)
=>
{
if
(
this
.
legendData
.
includes
(
k
))
{
seriesData
[
k
].
push
({
name
:
k
,
value
:
[
data
.
timestamp
,
data
[
k
]],
});
}
});
},
initChart
()
{
chart
=
echarts
.
init
(
this
.
$el
,
"
macarons
"
);
this
.
setOptions
();
},
setOptions
()
{
chart
.
setOption
({
title
:
{
text
:
"
EVM
"
,
},
xAxis
:
{
type
:
"
time
"
,
splitLine
:
{
show
:
false
,
},
// data: xAxisTitle,
// boundaryGap: false,
// axisTick: {
// show: false,
// },
axisLabel
:
{
formatter
:
"
{HH}:{mm}:{ss}
"
,
},
},
yAxis
:
{
type
:
"
value
"
,
scale
:
true
,
splitLine
:
{
show
:
false
,
},
},
// grid: {
// left: 10,
// right: 10,
// bottom: 20,
// top: 30,
// containLabel: true,
// },
tooltip
:
{
trigger
:
"
axis
"
,
axisPointer
:
{
type
:
"
cross
"
,
animation
:
false
,
},
// formatter: function (params) {
// params = params[0];
// console.log(params);
// var date = new Date(params.name);
// return (
// date.getDate() +
// "/" +
// (date.getMonth() + 1) +
// "/" +
// date.getFullYear() +
// " : " +
// params.value[1]
// );
// },
padding
:
[
5
,
10
],
},
legend
:
{
data
:
this
.
legendData
,
},
series
:
this
.
series
,
});
},
},
};
</
script
>
tools/frontend/src/views/Application/components/ImageChart.vue
0 → 100644
View file @
f92508d1
<
template
>
<div
:class=
"className"
:style=
"
{ height: height, width: width }" />
</
template
>
<
script
>
import
*
as
echarts
from
"
echarts
"
;
require
(
"
echarts/theme/macarons
"
);
import
resize
from
"
./mixins/resize
"
;
// import { getDateTimeString } from "@/utils/utils";
const
seriesData
=
{
heap_total_size
:
[],
heap_used_size
:
[],
stack_total_size
:
[],
stack_used_size
:
[],
};
var
data
=
[
[
"
2000-06-05
"
,
116
],
[
"
2000-06-06
"
,
129
],
[
"
2000-06-07
"
,
135
],
[
"
2000-06-08
"
,
86
],
[
"
2000-06-09
"
,
73
],
[
"
2000-06-10
"
,
85
],
[
"
2000-06-11
"
,
73
],
[
"
2000-06-12
"
,
68
],
[
"
2000-06-13
"
,
92
],
[
"
2000-06-14
"
,
130
],
[
"
2000-06-15
"
,
245
],
[
"
2000-06-16
"
,
139
],
[
"
2000-06-17
"
,
115
],
[
"
2000-06-18
"
,
111
],
[
"
2000-06-19
"
,
309
],
[
"
2000-06-20
"
,
206
],
[
"
2000-06-21
"
,
137
],
[
"
2000-06-22
"
,
128
],
[
"
2000-06-23
"
,
85
],
[
"
2000-06-24
"
,
94
],
[
"
2000-06-25
"
,
71
],
[
"
2000-06-26
"
,
106
],
[
"
2000-06-27
"
,
84
],
[
"
2000-06-28
"
,
93
],
[
"
2000-06-29
"
,
85
],
[
"
2000-06-30
"
,
73
],
[
"
2000-07-01
"
,
83
],
[
"
2000-07-02
"
,
125
],
[
"
2000-07-03
"
,
107
],
[
"
2000-07-04
"
,
82
],
[
"
2000-07-05
"
,
44
],
[
"
2000-07-06
"
,
72
],
[
"
2000-07-07
"
,
106
],
[
"
2000-07-08
"
,
107
],
[
"
2000-07-09
"
,
66
],
[
"
2000-07-10
"
,
91
],
[
"
2000-07-11
"
,
92
],
[
"
2000-07-12
"
,
113
],
[
"
2000-07-13
"
,
107
],
[
"
2000-07-14
"
,
131
],
[
"
2000-07-15
"
,
111
],
[
"
2000-07-16
"
,
64
],
[
"
2000-07-17
"
,
69
],
[
"
2000-07-18
"
,
88
],
[
"
2000-07-19
"
,
77
],
[
"
2000-07-20
"
,
83
],
[
"
2000-07-21
"
,
111
],
[
"
2000-07-22
"
,
57
],
[
"
2000-07-23
"
,
55
],
[
"
2000-07-24
"
,
60
],
];
var
dateList
=
data
.
map
(
function
(
item
)
{
return
item
[
0
];
});
var
valueList
=
data
.
map
(
function
(
item
)
{
return
item
[
1
];
});
export
default
{
mixins
:
[
resize
],
props
:
{
className
:
{
type
:
String
,
default
:
"
chart
"
,
},
width
:
{
type
:
String
,
default
:
"
100%
"
,
},
height
:
{
type
:
String
,
default
:
"
600px
"
,
},
autoResize
:
{
type
:
Boolean
,
default
:
true
,
},
chartData
:
{
type
:
Array
,
required
:
true
,
},
},
data
()
{
return
{
chart
:
null
,
series
:
[
{
name
:
"
heap_total_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
scale
:
false
,
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
heap_total_size
,
},
{
name
:
"
heap_used_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
heap_used_size
,
},
{
name
:
"
stack_total_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
stack_total_size
,
},
{
name
:
"
stack_used_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
stack_used_size
,
},
],
legendData
:
[
"
heap_total_size
"
,
"
heap_used_size
"
,
"
stack_total_size
"
,
"
stack_used_size
"
,
],
options
:
{
tooltip
:
{
trigger
:
"
axis
"
,
},
visualMap
:
[],
title
:
[],
xAxis
:
[],
yAxis
:
[],
grid
:
[],
series
:
[]
},
};
},
watch
:
{
chartData
:
{
deep
:
true
,
handler
(
val
)
{
this
.
handleMessage
(
val
);
},
},
},
mounted
()
{
this
.
$nextTick
(()
=>
{
this
.
initChart
();
});
},
beforeDestroy
()
{
if
(
!
this
.
chart
)
{
return
;
}
this
.
chart
.
dispose
();
this
.
chart
=
null
;
},
methods
:
{
handleMessage
(
data
)
{
console
.
log
(
data
);
// Object.keys(data).forEach((k) => {
// if (this.legendData.includes(k))
// seriesData[k].push({
// name: k,
// value: [getDateTimeString(new Date()), data[k]],
// });
// });
this
.
$nextTick
(()
=>
{
// this.chart &&
// this.chart.setOption({
// series: this.series,
// });
});
},
initChart
()
{
this
.
chart
=
echarts
.
init
(
this
.
$el
,
"
macarons
"
);
this
.
setOptions
();
},
initOption
()
{},
setOptions
()
{
this
.
chart
.
setOption
({
// Make gradient line here
visualMap
:
[
{
show
:
false
,
type
:
"
continuous
"
,
seriesIndex
:
0
,
min
:
0
,
max
:
400
,
},
{
show
:
false
,
type
:
"
continuous
"
,
seriesIndex
:
1
,
dimension
:
0
,
min
:
0
,
max
:
dateList
.
length
-
1
,
},
],
title
:
[
{
left
:
"
center
"
,
text
:
"
Gradient along the y axis
"
,
},
{
top
:
"
300px
"
,
left
:
"
center
"
,
text
:
"
Gradient along the x axis
"
,
},
],
tooltip
:
{
trigger
:
"
axis
"
,
},
xAxis
:
[
{
data
:
dateList
,
gridIndex
:
0
,
},
{
data
:
dateList
,
gridIndex
:
1
,
},
],
yAxis
:
[
{
gridIndex
:
0
,
},
{
gridIndex
:
1
,
},
],
grid
:
[
{
bottom
:
"
350px
"
,
},
{
top
:
"
350px
"
,
},
],
series
:
[
{
type
:
"
line
"
,
showSymbol
:
false
,
data
:
valueList
,
xAxisIndex
:
0
,
yAxisIndex
:
0
,
},
{
type
:
"
line
"
,
showSymbol
:
false
,
data
:
valueList
,
xAxisIndex
:
1
,
yAxisIndex
:
1
,
},
],
});
},
},
};
</
script
>
tools/frontend/src/views/Application/components/LvglChart.vue
0 → 100644
View file @
f92508d1
<
template
>
<div
:class=
"className"
:style=
"
{ height: height, width: width }" />
</
template
>
<
script
>
import
*
as
echarts
from
"
echarts
"
;
require
(
"
echarts/theme/macarons
"
);
// echarts theme
import
resize
from
"
./mixins/resize
"
;
import
{
getDateTimeString
}
from
"
@/utils/utils
"
;
import
{
wsNotify
}
from
"
@/utils/notify.js
"
;
const
seriesData
=
{
frag_pct
:
[],
free_biggest_size
:
[],
free_cnt
:
[],
free_size
:
[],
total_size
:
[],
used_cnt
:
[],
used_pct
:
[],
};
export
default
{
mixins
:
[
resize
],
props
:
{
className
:
{
type
:
String
,
default
:
"
chart
"
,
},
width
:
{
type
:
String
,
default
:
"
100%
"
,
},
height
:
{
type
:
String
,
default
:
"
270px
"
,
},
autoResize
:
{
type
:
Boolean
,
default
:
true
,
},
chartData
:
{
type
:
Object
,
required
:
true
,
},
dataList
:
{
type
:
Array
,
required
:
false
,
default
:
()
=>
[],
},
},
data
()
{
return
{
chart
:
null
,
series
:
[
{
name
:
"
frag_pct
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
scale
:
false
,
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
frag_pct
,
},
{
name
:
"
free_biggest_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
free_biggest_size
,
},
{
name
:
"
free_cnt
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
free_cnt
,
},
{
name
:
"
free_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
free_size
,
},
{
name
:
"
total_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
total_size
,
},
{
name
:
"
used_cnt
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
used_cnt
,
},
{
name
:
"
used_pct
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
seriesData
.
used_pct
,
},
],
legendData
:
[
"
frag_pct
"
,
"
free_biggest_size
"
,
"
free_cnt
"
,
"
free_size
"
,
"
total_size
"
,
"
used_cnt
"
,
"
used_pct
"
,
],
};
},
watch
:
{
chartData
:
{
deep
:
true
,
handler
(
val
)
{
this
.
handleMessage
(
val
);
},
},
dataList
:
{
deep
:
true
,
handler
(
val
)
{
if
(
val
.
length
>
0
)
this
.
handleData
(
val
);
},
},
},
mounted
()
{
this
.
$nextTick
(()
=>
{
this
.
initChart
();
});
wsNotify
.
eventBus
.
$on
(
"
resize
"
,
()
=>
{
if
(
this
.
chart
)
this
.
chart
.
resize
()
});
},
beforeDestroy
()
{
if
(
!
this
.
chart
)
{
return
;
}
this
.
chart
.
dispose
();
this
.
chart
=
null
;
},
methods
:
{
handleData
(
data
)
{
Object
.
keys
(
seriesData
).
forEach
(
key
=>
{
seriesData
[
key
]
=
[]
});
this
.
series
.
forEach
(
item
=>
{
item
.
data
=
[]
});
this
.
chart
.
setOption
({
series
:
this
.
series
});
data
.
forEach
((
item
)
=>
{
this
.
handleMessage
(
item
);
});
},
handleMessage
(
data
)
{
Object
.
keys
(
data
).
forEach
((
k
)
=>
{
var
t
=
getDateTimeString
(
new
Date
());
if
(
k
==
"
timestamp
"
)
t
=
data
[
k
];
if
(
this
.
legendData
.
includes
(
k
))
seriesData
[
k
].
push
({
name
:
k
,
value
:
[
t
,
data
[
k
]],
});
});
this
.
$nextTick
(()
=>
{
this
.
chart
&&
this
.
chart
.
setOption
({
series
:
this
.
series
,
});
});
},
initChart
()
{
this
.
chart
=
echarts
.
init
(
this
.
$el
,
"
macarons
"
);
this
.
setOptions
();
},
setOptions
()
{
this
.
chart
.
setOption
({
title
:
{
text
:
"
LVGL
"
,
},
grid
:
{
left
:
10
,
right
:
10
,
bottom
:
10
,
top
:
50
,
containLabel
:
true
,
},
xAxis
:
{
type
:
"
time
"
,
splitLine
:
{
},
axisLabel
:
{
formatter
:
"
{HH}:{mm}:{ss}
"
,
},
},
yAxis
:
{
type
:
"
value
"
,
// boundaryGap: [0, "100%"],
splitLine
:
{
},
},
tooltip
:
{
trigger
:
"
axis
"
,
axisPointer
:
{
type
:
"
cross
"
,
animation
:
false
,
},
padding
:
[
5
,
10
],
},
legend
:
{
data
:
this
.
legendData
,
selected
:
{
frag_pct
:
false
,
free_biggest_size
:
false
,
free_cnt
:
false
,
free_size
:
false
,
total_size
:
false
,
},
},
series
:
this
.
series
,
});
},
},
};
</
script
>
tools/frontend/src/views/Application/components/LvglHistoryChart.vue
0 → 100644
View file @
f92508d1
<
template
>
<div
:class=
"className"
:style=
"
{ height: height, width: width }" />
</
template
>
<
script
>
import
*
as
echarts
from
"
echarts
"
;
require
(
"
echarts/theme/macarons
"
);
import
resize
from
"
./mixins/resize
"
;
const
seriesData
=
{
frag_pct
:
[],
free_biggest_size
:
[],
free_cnt
:
[],
free_size
:
[],
total_size
:
[],
used_cnt
:
[],
used_pct
:
[],
};
export
default
{
mixins
:
[
resize
],
props
:
{
className
:
{
type
:
String
,
default
:
"
chart
"
,
},
width
:
{
type
:
String
,
default
:
"
100%
"
,
},
height
:
{
type
:
String
,
default
:
"
350px
"
,
},
autoResize
:
{
type
:
Boolean
,
default
:
true
,
},
dataList
:
{
type
:
Array
,
required
:
false
,
default
:
()
=>
[],
},
},
data
()
{
return
{
chart
:
null
,
series
:
[
{
name
:
"
frag_pct
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
scale
:
false
,
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
free_biggest_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
free_cnt
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
free_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
total_size
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
used_cnt
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
{
name
:
"
used_pct
"
,
type
:
"
line
"
,
showSymbol
:
false
,
emphasis
:
{
focus
:
"
series
"
,
blurScope
:
"
coordinateSystem
"
,
},
data
:
[],
},
],
legendData
:
Object
.
keys
(
seriesData
),
};
},
watch
:
{
dataList
:
{
deep
:
true
,
handler
(
val
)
{
if
(
val
.
length
>
0
)
this
.
handleData
(
val
);
},
},
},
mounted
()
{
this
.
$nextTick
(()
=>
{
this
.
initChart
();
});
},
beforeDestroy
()
{
if
(
!
this
.
chart
)
{
return
;
}
this
.
chart
.
dispose
();
this
.
chart
=
null
;
},
methods
:
{
handleData
(
data
)
{
Object
.
keys
(
seriesData
).
forEach
(
key
=>
{
seriesData
[
key
]
=
[]
});
this
.
series
.
forEach
(
item
=>
{
item
.
data
=
[]
});
// this.chart.setOption({ series: this.series });
data
.
forEach
((
item
)
=>
{
this
.
handleMessage
(
item
);
});
let
temp
=
Object
.
assign
(
this
.
series
);
temp
.
forEach
(
item
=>
{
if
(
Object
.
prototype
.
hasOwnProperty
.
call
(
seriesData
,
item
.
name
))
{
item
.
data
=
seriesData
[
item
.
name
]
}
});
this
.
series
=
temp
;
this
.
$nextTick
(()
=>
{
this
.
chart
&&
this
.
chart
.
setOption
({
series
:
this
.
series
,
});
});
},
handleMessage
(
data
)
{
Object
.
keys
(
data
).
forEach
((
k
)
=>
{
if
(
this
.
legendData
.
includes
(
k
))
seriesData
[
k
].
push
({
name
:
k
,
value
:
[
data
.
timestamp
,
data
[
k
]],
});
});
},
initChart
()
{
this
.
chart
=
echarts
.
init
(
this
.
$el
,
"
macarons
"
);
this
.
setOptions
();
},
setOptions
()
{
this
.
chart
.
setOption
({
title
:
{
text
:
"
LVGL
"
,
},
xAxis
:
{
type
:
"
time
"
,
splitLine
:
{
show
:
false
,
},
axisLabel
:
{
formatter
:
"
{HH}:{mm}:{ss}
"
,
},
},
yAxis
:
{
type
:
"
value
"
,
splitLine
:
{
show
:
false
,
},
},
tooltip
:
{
trigger
:
"
axis
"
,
axisPointer
:
{
type
:
"
cross
"
,
animation
:
false
,
},
padding
:
[
5
,
10
],
},
legend
:
{
data
:
this
.
legendData
,
},
series
:
this
.
series
,
});
},
},
};
</
script
>
tools/frontend/src/views/Application/components/mixins/resize.js
0 → 100644
View file @
f92508d1
import
{
debounce
}
from
'
@/utils
'
export
default
{
data
()
{
return
{
$_sidebarElm
:
null
,
$_resizeHandler
:
null
}
},
mounted
()
{
this
.
$_resizeHandler
=
debounce
(()
=>
{
if
(
this
.
chart
)
{
this
.
chart
.
resize
()
}
},
100
)
this
.
$_initResizeEvent
()
this
.
$_initSidebarResizeEvent
()
},
beforeDestroy
()
{
this
.
$_destroyResizeEvent
()
this
.
$_destroySidebarResizeEvent
()
},
// to fixed bug when cached by keep-alive
// https://github.com/PanJiaChen/vue-element-admin/issues/2116
activated
()
{
this
.
$_initResizeEvent
()
this
.
$_initSidebarResizeEvent
()
},
deactivated
()
{
this
.
$_destroyResizeEvent
()
this
.
$_destroySidebarResizeEvent
()
},
methods
:
{
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_initResizeEvent
()
{
window
.
addEventListener
(
'
resize
'
,
this
.
$_resizeHandler
)
},
$_destroyResizeEvent
()
{
window
.
removeEventListener
(
'
resize
'
,
this
.
$_resizeHandler
)
},
$_sidebarResizeHandler
(
e
)
{
if
(
e
.
propertyName
===
'
width
'
)
{
this
.
$_resizeHandler
()
}
},
$_initSidebarResizeEvent
()
{
this
.
$_sidebarElm
=
document
.
getElementsByClassName
(
'
sidebar-container
'
)[
0
]
this
.
$_sidebarElm
&&
this
.
$_sidebarElm
.
addEventListener
(
'
transitionend
'
,
this
.
$_sidebarResizeHandler
)
},
$_destroySidebarResizeEvent
()
{
this
.
$_sidebarElm
&&
this
.
$_sidebarElm
.
removeEventListener
(
'
transitionend
'
,
this
.
$_sidebarResizeHandler
)
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment