You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
353 lines
8.1 KiB
353 lines
8.1 KiB
3 years ago
|
<template>
|
||
|
<div>
|
||
|
<div class='infos'>
|
||
|
<el-card>
|
||
|
<div class='title'>
|
||
|
<span class='icon el-icon-tickets'></span>
|
||
|
租户基本信息
|
||
|
</div>
|
||
|
<div class='content'>
|
||
|
<div>
|
||
|
租户ID <span>{{tenantDetail.tenantId}}</span>
|
||
|
</div>
|
||
|
<div>
|
||
|
租户名称 <span>{{tenantDetail.tenantName}}</span>
|
||
|
</div>
|
||
|
<div>
|
||
|
开通时间 <span>{{tenantDetail.tenantCreateTime}}</span>
|
||
|
</div>
|
||
|
</div>
|
||
|
</el-card>
|
||
|
<el-card>
|
||
|
<div class='title'>
|
||
|
<span class='icon el-icon-cpu'></span>
|
||
|
设备数
|
||
|
</div>
|
||
|
<div class='content'>
|
||
|
<Bar
|
||
|
:current-value='tenantDetail.countStatistics.productCount || 0'
|
||
|
:total-value='tenantDetail.countStatistics.productLimitNumber || 1'
|
||
|
>
|
||
|
<template #title>
|
||
|
<div class='bar-title'>
|
||
|
<div class='label'>
|
||
|
产品
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
<template #currentValue>已添加</template>
|
||
|
</Bar>
|
||
|
<Bar
|
||
|
:current-value='tenantDetail.countStatistics.deviceCount || 0'
|
||
|
:total-value='(tenantDetail.countStatistics.deviceLimitNumberPerProduct || 1) * (tenantDetail.countStatistics.productLimitNumber || 1)'
|
||
|
>
|
||
|
<template #title>
|
||
|
<div class='bar-title'>
|
||
|
<div class='label'>
|
||
|
设备
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
<template #currentValue>已添加</template>
|
||
|
</Bar>
|
||
|
</div>
|
||
|
</el-card>
|
||
|
<el-card>
|
||
|
<div class='title'>
|
||
|
<span class='icon el-icon-coin'></span>
|
||
|
Open API
|
||
|
</div>
|
||
|
<div class='content'>
|
||
|
<div>
|
||
|
AppID <span>{{tenantDetail.openApi.appId || '-'}}</span>
|
||
|
</div>
|
||
|
<div class='secret'>
|
||
|
AppSecret
|
||
|
<span>
|
||
|
{{tenantDetail.openApi.appSecret || '-'}}
|
||
|
</span>
|
||
|
<a class='reset' @click='handleReset'>重置</a>
|
||
|
</div>
|
||
|
<div>
|
||
|
生成时间 <span>{{tenantDetail.openApi.createTime || '-'}}</span>
|
||
|
</div>
|
||
|
</div>
|
||
|
</el-card>
|
||
|
</div>
|
||
|
<div class='device'>
|
||
|
<el-card>
|
||
|
<div class='title'>
|
||
|
<span class='icon el-icon-cpu'></span>
|
||
|
实时在线设备数
|
||
|
<el-tooltip effect='dark' content='于物联网平台建立长连接的设备数量,数据采集有一定延迟。' placement='top'>
|
||
|
<span class='tips el-icon-question'></span>
|
||
|
</el-tooltip>
|
||
|
</div>
|
||
|
<div class='content'>
|
||
|
<Bar
|
||
|
:current-value='tenantDetail.onlineStatistics.onlineCount || 0'
|
||
|
:total-value='tenantDetail.onlineStatistics.totalCount || 1'
|
||
|
>
|
||
|
<template #title>
|
||
|
<div class='bar-title'>
|
||
|
<div class='label'>
|
||
|
当前在线设备
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
</Bar>
|
||
|
<div class='not-active'>
|
||
|
<div>
|
||
|
占比: {{
|
||
|
((tenantDetail.onlineStatistics.onlineCount || 0) / (tenantDetail.onlineStatistics.totalCount || 1) * 100).toFixed(2)
|
||
|
}}%
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</el-card>
|
||
|
<el-card>
|
||
|
<div class='title'>
|
||
|
<span class='icon el-icon-cpu'></span>
|
||
|
在线设备数量
|
||
|
<DatePicker
|
||
|
v-model='onLineDeviceQueryDate'
|
||
|
@change='getOnLineDevice'
|
||
|
/>
|
||
|
</div>
|
||
|
<BasicLine class='line-chart' :data='onLineDeviceList' />
|
||
|
</el-card>
|
||
|
</div>
|
||
|
<div class='message'>
|
||
|
<el-card>
|
||
|
<div class='title'>
|
||
|
<span class='icon el-icon-chat-dot-square'></span>
|
||
|
发送到平台的消息量
|
||
|
<el-tooltip effect='dark' content='从物联网发送到服务端和设备的消息,数据采集有一定延迟。' placement='top'>
|
||
|
<span class='tips el-icon-question'></span>
|
||
|
</el-tooltip>
|
||
|
</div>
|
||
|
<BasicLine :height='210'/>
|
||
|
<div class='month'>本月消息量: 3000</div>
|
||
|
</el-card>
|
||
|
<el-card>
|
||
|
<div class='title'>
|
||
|
<span class='icon el-icon-chat-dot-square'></span>
|
||
|
平台发出的消息量
|
||
|
<el-tooltip effect='dark' content='从物联网发送到服务端和设备的消息,数据采集有一定延迟。' placement='top'>
|
||
|
<span class='tips el-icon-question'></span>
|
||
|
</el-tooltip>
|
||
|
</div>
|
||
|
<BasicLine :height='210' />
|
||
|
<div class='month'>本月消息量: 3000</div>
|
||
|
</el-card>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import {mapGetters} from 'vuex';
|
||
|
import dayjs from 'dayjs';
|
||
|
import Bar from '@/components/Bar/index.vue';
|
||
|
import BasicLine from '@/components/Charts/BasicLine';
|
||
|
import {getOnlineDeviceData, getTenantDetail} from '@/api/sys';
|
||
|
import DatePicker from '@/components/DatePicker/index.vue';
|
||
|
|
||
|
export default {
|
||
|
name: 'Sys',
|
||
|
components: {
|
||
|
Bar,
|
||
|
BasicLine,
|
||
|
DatePicker,
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
tenantDetail: {
|
||
|
countStatistics: {},
|
||
|
onlineStatistics: {},
|
||
|
openApi: {},
|
||
|
},
|
||
|
onLineDeviceQueryDate: [dayjs().subtract(24, 'hour'), dayjs()],
|
||
|
onLineDeviceList: [],
|
||
|
};
|
||
|
},
|
||
|
computed: {
|
||
|
...mapGetters(['userInfo']),
|
||
|
},
|
||
|
methods: {
|
||
|
// 重置
|
||
|
handleReset() {
|
||
|
this.$confirm('重置后将导致原有AppSecret失效, 是否确定重置?', { type: 'warning' }).then(() => {
|
||
|
// todo reset
|
||
|
}).catch(() => {});
|
||
|
},
|
||
|
|
||
|
// 获取在线设备数量
|
||
|
getOnLineDevice() {
|
||
|
let [start, end] = this.onLineDeviceQueryDate;
|
||
|
const format = 'YYYY-MM-DD HH:mm:ss';
|
||
|
start = dayjs(start).format(format);
|
||
|
end = dayjs(end).format(format);
|
||
|
getOnlineDeviceData(start, end).then((res) => {
|
||
|
this.onLineDeviceList = res.data.data.map((item) => ({
|
||
|
label: dayjs(item.timeString).format('MM/DD HH:mm'),
|
||
|
value: item.onlineNum,
|
||
|
}));
|
||
|
});
|
||
|
},
|
||
|
|
||
|
initData() {
|
||
|
getTenantDetail(this.userInfo['tenant_id']).then((res) => {
|
||
|
this.tenantDetail = res.data.data;
|
||
|
});
|
||
|
this.getOnLineDevice();
|
||
|
},
|
||
|
},
|
||
|
mounted() {
|
||
|
this.initData();
|
||
|
},
|
||
|
};
|
||
|
</script>
|
||
|
|
||
|
<style scoped lang='scss'>
|
||
|
.infos {
|
||
|
display: flex;
|
||
|
|
||
|
.el-card {
|
||
|
flex: 1;
|
||
|
margin-right: 20px;
|
||
|
|
||
|
&:last-child {
|
||
|
margin-right: 0;
|
||
|
}
|
||
|
|
||
|
.content {
|
||
|
color: #555555;
|
||
|
font-size: 14px;
|
||
|
line-height: 3;
|
||
|
|
||
|
span {
|
||
|
margin-left: 10px;
|
||
|
}
|
||
|
|
||
|
.reset {
|
||
|
color: red;
|
||
|
cursor: pointer;
|
||
|
margin: 0 20px;
|
||
|
|
||
|
&:hover {
|
||
|
text-decoration: underline;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.ki-bar:first-child {
|
||
|
margin-top: 20px;
|
||
|
}
|
||
|
|
||
|
.ki-bar {
|
||
|
margin-top: 30px;
|
||
|
}
|
||
|
|
||
|
.secret {
|
||
|
display: flex;
|
||
|
|
||
|
span {
|
||
|
width: 0;
|
||
|
flex: 1;
|
||
|
overflow: hidden;
|
||
|
white-space: nowrap;
|
||
|
text-overflow: ellipsis;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.title {
|
||
|
color: #000c17;
|
||
|
font-weight: bold;
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
|
||
|
.icon {
|
||
|
margin-right: 10px;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.bar-title {
|
||
|
color: #555555;
|
||
|
font-size: 14px;
|
||
|
display: flex;
|
||
|
align-items: baseline;
|
||
|
|
||
|
.label {
|
||
|
font-size: 16px;
|
||
|
font-weight: bold;
|
||
|
margin-right: 20px;
|
||
|
}
|
||
|
|
||
|
span {
|
||
|
font-size: 14px;
|
||
|
font-weight: normal;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.tips {
|
||
|
color: #cccccc;
|
||
|
margin-left: 10px;
|
||
|
}
|
||
|
|
||
|
.el-date-editor {
|
||
|
margin-left: auto;
|
||
|
}
|
||
|
|
||
|
.device {
|
||
|
margin-top: 20px;
|
||
|
display: flex;
|
||
|
|
||
|
.el-card:first-child {
|
||
|
flex: 1;
|
||
|
margin-right: 20px;
|
||
|
}
|
||
|
|
||
|
.el-card:last-child {
|
||
|
flex: 2;
|
||
|
padding-right: 20px
|
||
|
}
|
||
|
|
||
|
.ki-bar, .line-chart {
|
||
|
margin-top: 25px;
|
||
|
}
|
||
|
|
||
|
.not-active {
|
||
|
margin-top: 30px;
|
||
|
|
||
|
span {
|
||
|
font-size: 14px;
|
||
|
margin-left: 10px;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.message {
|
||
|
margin-top: 20px;
|
||
|
display: flex;
|
||
|
|
||
|
.title {
|
||
|
margin-bottom: 30px;
|
||
|
}
|
||
|
|
||
|
.el-card {
|
||
|
flex: 1;
|
||
|
}
|
||
|
|
||
|
.el-card:first-child {
|
||
|
margin-right: 20px;
|
||
|
}
|
||
|
|
||
|
.month {
|
||
|
font-size: 14px;
|
||
|
margin-top: 15px;
|
||
|
}
|
||
|
}
|
||
|
</style>
|