|
@@ -0,0 +1,875 @@
|
|
|
|
+<template>
|
|
|
|
+ <div class="JNPF-common-layout">
|
|
|
|
+ <div class="top">
|
|
|
|
+ <div class="left"></div>
|
|
|
|
+ <div class="center">资源概况</div>
|
|
|
|
+ <div class="right">
|
|
|
|
+ <div class="now-time">{{ nowTime }}</div>
|
|
|
|
+ <el-select v-model="nowOrg" :popper-append-to-body="false" filterable
|
|
|
|
+ placeholder="请选择厅局" @change="orgChange">
|
|
|
|
+ <div>
|
|
|
|
+ <el-option v-for="item in orgList" :key="item.orgId" :label="item.orgName"
|
|
|
|
+ :value="item.orgId"> </el-option>
|
|
|
|
+ </div>
|
|
|
|
+ </el-select>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="content">
|
|
|
|
+ <div class="c1">
|
|
|
|
+ <div class="f1">
|
|
|
|
+ <div class="rect-title">主机概况</div>
|
|
|
|
+ <div class="chart" v-loading="loading" element-loading-text="加载中">
|
|
|
|
+ <template v-if="!loading">
|
|
|
|
+ <div class="echarts1" id="echarts1">
|
|
|
|
+ </div>
|
|
|
|
+ <div class="legend">
|
|
|
|
+ <div class="xinchuang item">
|
|
|
|
+ <div class="doc"></div>
|
|
|
|
+ <span>信创主机</span>
|
|
|
|
+ <div class="num">{{chartData.xinChuangBaseInfo.count}}</div>
|
|
|
|
+ <span>个</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="feixinchuang item">
|
|
|
|
+ <div class="doc" style="background-color: #ffca3c"></div>
|
|
|
|
+ <span>非信创主机</span>
|
|
|
|
+ <div class="num" style="color: #ffca3c">
|
|
|
|
+ {{chartData.notXinChuangBaseInfo.count}}</div>
|
|
|
|
+ <span>个</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ <el-empty style="height: 100%;" v-else description="暂无数据"></el-empty>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="f2">
|
|
|
|
+ <div class="rect-title">主机分类情况</div>
|
|
|
|
+ <div class="overview-list" v-loading="loading" element-loading-text="加载中">
|
|
|
|
+ <div class="overview-item" v-for="(item, index) in overviewList"
|
|
|
|
+ :key="index">
|
|
|
|
+ <div class="item-top">
|
|
|
|
+ <img v-if="index == 1" src="@/assets/images/icon4.png"
|
|
|
|
+ mode=""></img>
|
|
|
|
+ <img v-else src="@/assets/images/icon3.png" mode=""></img>
|
|
|
|
+ <div class="">
|
|
|
|
+ {{ item.name }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="list">
|
|
|
|
+ <div class="list-item" v-for="(item2, index2) in item.children"
|
|
|
|
+ :key="index2">
|
|
|
|
+ <div class="num">
|
|
|
|
+ {{ item2.num || 0 }}
|
|
|
|
+ </div>
|
|
|
|
+ <div class="name">
|
|
|
|
+ {{ item2.label }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="c2">
|
|
|
|
+ <div class="t">
|
|
|
|
+ <div class="rect-title">昨日利用率Top10</div>
|
|
|
|
+ <div class="buttons">
|
|
|
|
+ <span v-for="(item, index) in topButtons" :key="index"
|
|
|
|
+ :class="nowTop == index ? 'now' : ''"
|
|
|
|
+ @click="changeNowTopButton(index)">{{ item.label }}</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="list" v-loading="loading" element-loading-text="加载中">
|
|
|
|
+ <div class="list-item" v-for="(item, index) in topButtons[nowTop].value"
|
|
|
|
+ :key="index">
|
|
|
|
+ <div class="left"
|
|
|
|
+ :style="{ background: item.color ? item.color + '20' : '#f0f0f0', color: item.color || '#adadad' }">
|
|
|
|
+ {{ index < 9 ? '0' + (index + 1) : index + 1 }}
|
|
|
|
+ </div>
|
|
|
|
+ <div class="center">
|
|
|
|
+ <div>{{ item.assetName }}</div>
|
|
|
|
+ <el-progress :percentage="item.count" :stroke-width="6"
|
|
|
|
+ :color="item.color ? item.color : '#92d050'"></el-progress>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="right"
|
|
|
|
+ :style="{ color: item.color, fontWeight: 'bold', fontSize: '20px' }">
|
|
|
|
+ {{ item.count || 0 }}%</div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="c3">
|
|
|
|
+ <div class="t">
|
|
|
|
+ <div class="rect-title">资源监控列表</div>
|
|
|
|
+ <el-select v-model="nowSys" :popper-append-to-body="false" filterable
|
|
|
|
+ collapse-tags :multiple="true" placeholder="请选择系统" @change="sysChange">
|
|
|
|
+ <div>
|
|
|
|
+ <el-option v-for="item in sysList" :key="item.systemName"
|
|
|
|
+ :label="item.systemName" :value="item.systemName"> </el-option>
|
|
|
|
+ </div>
|
|
|
|
+ </el-select>
|
|
|
|
+
|
|
|
|
+ </div>
|
|
|
|
+ <div class="list" v-loading="!list.length" element-loading-text="加载中">
|
|
|
|
+ <div class="list-item" v-for="(item, index) in list" :key="index"
|
|
|
|
+ @click="toDetail(item)">
|
|
|
|
+ <el-card class="box-card">
|
|
|
|
+ <div slot="header" class="clearfix"
|
|
|
|
+ style="display: flex;align-items: center;justify-content: space-between;">
|
|
|
|
+ <div class="item-top">
|
|
|
|
+ <div class="left">
|
|
|
|
+ <div class="asset-name">
|
|
|
|
+ {{ item.assetName }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <span class="status" style="float: right; padding: 3px 0"
|
|
|
|
+ :class="item.downTime ? 'down-status' : 'not-down-status'">
|
|
|
|
+ <img v-if="!item.downTime"
|
|
|
|
+ src="@/assets/images/check_shifang.png" mode="">
|
|
|
|
+ </img>
|
|
|
|
+ <img v-else src="@/assets/images/check_yunxing.png"
|
|
|
|
+ mode=""></img>
|
|
|
|
+ <div :class="item.downTime ? 'down-time' : 'not-down-time'">
|
|
|
|
+ {{ item.downTime ? '运行中' : '已释放' }}
|
|
|
|
+ </div>
|
|
|
|
+ </span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="center">
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">IP地址</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.ip }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">创建时间</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.createTime }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">cpu(核)</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.cpu }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">内存(G)</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.memory }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">磁盘(G)</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.disk }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">备份(G)</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.backup }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">资源标识</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.uuid }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="label">是否信创</div>
|
|
|
|
+ <div class="value">
|
|
|
|
+ {{ item.xinchuang? '是' : '否' }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </el-card>
|
|
|
|
+
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
|
|
|
|
+ :current-page="pageNum" :page-sizes="[10, 20]" :page-size="pageSize"
|
|
|
|
+ layout="total, sizes, prev, pager, next, jumper" :total="total">
|
|
|
|
+ </el-pagination>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script>
|
|
|
|
+import {
|
|
|
|
+ findOrganizeListWithUserRoleExtension, getAssetByOrgId, getSystemInfoByOrgId, getAssetListByOrgIdV2
|
|
|
|
+} from "@/api/governmentCloud/statisticalCenter/statisticalCenter";
|
|
|
|
+
|
|
|
|
+export default {
|
|
|
|
+ data() {
|
|
|
|
+ return {
|
|
|
|
+ nowTime: null,
|
|
|
|
+ orgList: [],
|
|
|
|
+ nowOrg: null,
|
|
|
|
+ chartData: {
|
|
|
|
+ xinChuangBaseInfo: {},
|
|
|
|
+ notXinChuangBaseInfo: {},
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ loading: false,
|
|
|
|
+ nowTop: 0,
|
|
|
|
+ overviewList: [
|
|
|
|
+ {
|
|
|
|
+ name: '信创主机',
|
|
|
|
+ children: [
|
|
|
|
+ {
|
|
|
|
+ label: 'VCPU(核)',
|
|
|
|
+ num: '0',
|
|
|
|
+ key: 'cpu'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ label: '内存(G)',
|
|
|
|
+ num: '0',
|
|
|
|
+ key: 'disk'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ label: '磁盘(G)',
|
|
|
|
+ num: '0',
|
|
|
|
+ key: 'memory'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ label: '备份(G)',
|
|
|
|
+ num: '0',
|
|
|
|
+ key: 'backup'
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '非信创主机',
|
|
|
|
+ children: [
|
|
|
|
+ {
|
|
|
|
+ label: 'VCPU(核)',
|
|
|
|
+ num: '4652',
|
|
|
|
+ key: 'cpu'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ label: '内存(G)',
|
|
|
|
+ num: '14752',
|
|
|
|
+ key: 'disk'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ label: '磁盘(G)',
|
|
|
|
+ num: '0',
|
|
|
|
+ key: 'memory'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ label: '备份(G)',
|
|
|
|
+ num: '22219',
|
|
|
|
+ key: 'backup'
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+ }
|
|
|
|
+ ],
|
|
|
|
+ colorList: ['#fd7f55', '#fea147', '#ffc936'],
|
|
|
|
+ topButtons: [
|
|
|
|
+ {
|
|
|
|
+ label: 'CPU',
|
|
|
|
+ value: []
|
|
|
|
+ }, {
|
|
|
|
+ label: '内存',
|
|
|
|
+ value: []
|
|
|
|
+ }, {
|
|
|
|
+ label: '磁盘',
|
|
|
|
+ value: []
|
|
|
|
+ }
|
|
|
|
+ ],
|
|
|
|
+
|
|
|
|
+ onlyCollect: false,
|
|
|
|
+ sysList: [],
|
|
|
|
+ nowSys: [],
|
|
|
|
+ pageNum: 1,
|
|
|
|
+ pageSize: 10,
|
|
|
|
+ total: null,
|
|
|
|
+ list: []
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ watch: {
|
|
|
|
+ topButtons(newValue) {
|
|
|
|
+ newValue.map((item, index) => {
|
|
|
|
+ item.value.map((item2, index2) => {
|
|
|
|
+ item2.color = this.colorList[index2] || ''
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ async mounted() {
|
|
|
|
+ this.loading = true
|
|
|
|
+ this.timer = setInterval(() => {
|
|
|
|
+ this.time = new Date()
|
|
|
|
+ this.nowTime = this.timestampToTime(this.time.toLocaleString('en-US', { hour12: false }).split(' '))
|
|
|
|
+ }, 1000)
|
|
|
|
+
|
|
|
|
+ if (this.orgList.length == 0) {
|
|
|
|
+ await this.getOrgList()
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ methods: {
|
|
|
|
+ changeNowTopButton(index) {
|
|
|
|
+ this.nowTop = index;
|
|
|
|
+ },
|
|
|
|
+ timestampToTime(times) {
|
|
|
|
+ let time = times[1]
|
|
|
|
+ let mdy = times[0]
|
|
|
|
+ mdy = mdy.split('/')
|
|
|
|
+ this.month = parseInt(mdy[0])
|
|
|
|
+ this.day = parseInt(mdy[1])
|
|
|
|
+ if (mdy[0].length == 1) {
|
|
|
|
+ this.month = '0' + parseInt(mdy[0])
|
|
|
|
+ }
|
|
|
|
+ if (mdy[1].length == 1) {
|
|
|
|
+ this.day = '0' + parseInt(mdy[1])
|
|
|
|
+ }
|
|
|
|
+ this.year = parseInt(mdy[2])
|
|
|
|
+ return this.year + '-' + this.month + '-' + this.day + ' ' + time
|
|
|
|
+ },
|
|
|
|
+ getOrgList() {
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ let params = {
|
|
|
|
+ dataType: "1", // 数据类型 0-当前页 1-全部数据
|
|
|
|
+ currentPage: 1,
|
|
|
|
+ pageSize: 20
|
|
|
|
+ }
|
|
|
|
+ findOrganizeListWithUserRoleExtension(params).then((res) => {
|
|
|
|
+ this.orgList = res.data
|
|
|
|
+ this.nowOrg = this.orgList[0].orgId
|
|
|
|
+ this.getInfo()
|
|
|
|
+ resolve(true)
|
|
|
|
+ });
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ getSysList() {
|
|
|
|
+ let params = {
|
|
|
|
+ orgId: this.nowOrg
|
|
|
|
+ }
|
|
|
|
+ getSystemInfoByOrgId(params).then((res) => {
|
|
|
|
+ this.sysList = res.data
|
|
|
|
+ this.nowSys = []
|
|
|
|
+ this.sysList.forEach((sys) => {
|
|
|
|
+ this.nowSys.push(sys.systemName);
|
|
|
|
+ });
|
|
|
|
+ this.fetchList()
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ //切换厅局
|
|
|
|
+ orgChange(value) {
|
|
|
|
+ this.getInfo()
|
|
|
|
+ },
|
|
|
|
+ //切换系统
|
|
|
|
+ sysChange(value) {
|
|
|
|
+ this.fetchList()
|
|
|
|
+ },
|
|
|
|
+ //获取数据
|
|
|
|
+ getInfo() {
|
|
|
|
+ this.loading = true
|
|
|
|
+ let params = {
|
|
|
|
+ orgId: this.nowOrg
|
|
|
|
+ };
|
|
|
|
+ getAssetByOrgId(params).then((res) => {
|
|
|
|
+ if (res.code == 200) {
|
|
|
|
+ this.chartData = res.data
|
|
|
|
+ this.overviewList[0].children.map(item => {
|
|
|
|
+ for (let key in this.chartData.xinChuangBaseInfo) {
|
|
|
|
+ if (key == item.key) {
|
|
|
|
+ item.num = this.chartData.xinChuangBaseInfo[key]
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ this.overviewList[1].children.map(item => {
|
|
|
|
+ for (let key in this.chartData.notXinChuangBaseInfo) {
|
|
|
|
+ if (key == item.key) {
|
|
|
|
+ item.num = this.chartData.notXinChuangBaseInfo[key]
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ this.loading = false
|
|
|
|
+
|
|
|
|
+ this.topButtons = [
|
|
|
|
+ {
|
|
|
|
+ label: 'CPU',
|
|
|
|
+ value: this.chartData.cpuTop
|
|
|
|
+ }, {
|
|
|
|
+ label: '内存',
|
|
|
|
+ value: this.chartData.memoryTop
|
|
|
|
+ }, {
|
|
|
|
+ label: '磁盘',
|
|
|
|
+ value: this.chartData.diskTop
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // 绘制图表
|
|
|
|
+ this.$nextTick(() => {
|
|
|
|
+ this.initEchart1()
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ this.getSysList()
|
|
|
|
+ },
|
|
|
|
+ fetchList() {
|
|
|
|
+ this.list = []
|
|
|
|
+ let params = {
|
|
|
|
+ orgId: this.nowOrg,
|
|
|
|
+ pageSize: this.pageSize,
|
|
|
|
+ currentPage: this.pageNum,
|
|
|
|
+ systemNameList: this.nowSys,
|
|
|
|
+ };
|
|
|
|
+ getAssetListByOrgIdV2(params).then((res) => {
|
|
|
|
+ if (res.code == 200) {
|
|
|
|
+ if (res.data) {
|
|
|
|
+ this.list = res.data.assetList.list; //返回的数据列表
|
|
|
|
+ this.total = res.data.assetList.pagination.total
|
|
|
|
+
|
|
|
|
+ this.list.map((item) => {
|
|
|
|
+ if (item.backup > 9999) {
|
|
|
|
+ item.backup = (item.backup / 1024).toFixed(2);
|
|
|
|
+ item.backupUnit = 'T';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (item.disk > 9999) {
|
|
|
|
+ item.disk = (item.disk / 1024).toFixed(2);
|
|
|
|
+ item.diskUnit = 'T';
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ //主机概况
|
|
|
|
+ initEchart1() {
|
|
|
|
+ var chartDom = document.getElementById('echarts1');
|
|
|
|
+ var myChart = this.$echarts.init(chartDom);
|
|
|
|
+
|
|
|
|
+ let data = [
|
|
|
|
+ {
|
|
|
|
+ value: this.chartData.notXinChuangBaseInfo.count,
|
|
|
|
+ name: '非信创主机'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: this.chartData.xinChuangBaseInfo.count,
|
|
|
|
+ name: '信创主机'
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+
|
|
|
|
+ let count = this.chartData.notXinChuangBaseInfo.count + this.chartData.xinChuangBaseInfo.count
|
|
|
|
+
|
|
|
|
+ var option = {
|
|
|
|
+ tooltip: {
|
|
|
|
+ trigger: 'item'
|
|
|
|
+ },
|
|
|
|
+ grid: {
|
|
|
|
+ left: '5%',
|
|
|
|
+ right: '5%',
|
|
|
|
+ bottom: '15%',
|
|
|
|
+ top: '15%',
|
|
|
|
+ containLabel: true
|
|
|
|
+ },
|
|
|
|
+ series: [
|
|
|
|
+ {
|
|
|
|
+ name: '',
|
|
|
|
+ type: 'pie',
|
|
|
|
+ radius: ['75%', '90%'],
|
|
|
|
+ avoidLabelOverlap: false,
|
|
|
|
+ label: {
|
|
|
|
+ show: true,
|
|
|
|
+ position: 'center',
|
|
|
|
+ formatter: function (params) {
|
|
|
|
+ return `${count}\n主机总数`;
|
|
|
|
+ },
|
|
|
|
+ fontSize: 24
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ itemStyle: {
|
|
|
|
+ normal: {
|
|
|
|
+ color: function (params) {
|
|
|
|
+ // 预定义一个颜色数组
|
|
|
|
+ var colorList = [
|
|
|
|
+ '#ffca3c', '#3e7dfe',
|
|
|
|
+ ];
|
|
|
|
+ // 返回每个饼图扇区的颜色
|
|
|
|
+ return colorList[params.dataIndex % colorList.length];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ labelLine: {
|
|
|
|
+ show: false
|
|
|
|
+ },
|
|
|
|
+ data: data
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+ };
|
|
|
|
+ myChart.setOption(option);
|
|
|
|
+ },
|
|
|
|
+ handleSizeChange(val) {
|
|
|
|
+ console.log(`每页 ${val} 条`);
|
|
|
|
+ this.pageSize = val
|
|
|
|
+ this.fetchList()
|
|
|
|
+ },
|
|
|
|
+ handleCurrentChange(val) {
|
|
|
|
+ this.pageNum = val
|
|
|
|
+ console.log(`当前页: ${val}`);
|
|
|
|
+ this.fetchList()
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+}
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+.JNPF-common-layout {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ height: 100%;
|
|
|
|
+ .top {
|
|
|
|
+ background-color: #fff;
|
|
|
|
+ height: 5vh;
|
|
|
|
+ width: 100%;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: flex-end;
|
|
|
|
+ padding: 0 20px;
|
|
|
|
+ position: relative;
|
|
|
|
+ .center {
|
|
|
|
+ font-size: 26px;
|
|
|
|
+ color: #000;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ position: absolute;
|
|
|
|
+ top: 50%;
|
|
|
|
+ left: 50%;
|
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
|
+ }
|
|
|
|
+ .right {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-around;
|
|
|
|
+ gap: 20px;
|
|
|
|
+ .now-time {
|
|
|
|
+ font-size: 20px;
|
|
|
|
+ color: #808080;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .content {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 80vh;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-around;
|
|
|
|
+ gap: 10px;
|
|
|
|
+ .c1,
|
|
|
|
+ .c2,
|
|
|
|
+ .c3 {
|
|
|
|
+ width: 33%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ background-color: #fff;
|
|
|
|
+ padding: 20px;
|
|
|
|
+ }
|
|
|
|
+ .c2,
|
|
|
|
+ .c3 {
|
|
|
|
+ padding-right: 5px;
|
|
|
|
+ }
|
|
|
|
+ .c1 {
|
|
|
|
+ display: flex;
|
|
|
|
+ background-color: #ebeef5;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ padding: 0;
|
|
|
|
+ gap: 10px;
|
|
|
|
+ justify-content: space-around;
|
|
|
|
+ align-items: center;
|
|
|
|
+ .f1,
|
|
|
|
+ .f2 {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 49%;
|
|
|
|
+ padding: 20px;
|
|
|
|
+ background-color: #fff;
|
|
|
|
+ }
|
|
|
|
+ .f1 {
|
|
|
|
+ .chart {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ .echarts1 {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 70%;
|
|
|
|
+ }
|
|
|
|
+ .legend {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 20%;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-evenly;
|
|
|
|
+ .item {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ .doc {
|
|
|
|
+ width: 5px;
|
|
|
|
+ height: 5px;
|
|
|
|
+ background: #2c7bff;
|
|
|
|
+ border-radius: 50%;
|
|
|
|
+ margin-right: 5px;
|
|
|
|
+ }
|
|
|
|
+ span {
|
|
|
|
+ font-family: PingFang SC;
|
|
|
|
+ font-weight: 500;
|
|
|
|
+ font-size: 16px;
|
|
|
|
+ color: #000000;
|
|
|
|
+ opacity: 0.6;
|
|
|
|
+ }
|
|
|
|
+ .num {
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ font-size: 24px;
|
|
|
|
+ color: #3e7dfe;
|
|
|
|
+ margin: 0 5px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .f2 {
|
|
|
|
+ .overview-list {
|
|
|
|
+ margin-top: 20px;
|
|
|
|
+ height: 90%;
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ justify-content: space-evenly;
|
|
|
|
+
|
|
|
|
+ .overview-item {
|
|
|
|
+ .item-top {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: flex-start;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ img {
|
|
|
|
+ width: 30px;
|
|
|
|
+ height: 30px;
|
|
|
|
+ margin-right: 10px;
|
|
|
|
+ }
|
|
|
|
+ div {
|
|
|
|
+ font-size: 18px;
|
|
|
|
+ color: #000000;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .list {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-around;
|
|
|
|
+ gap: 20px;
|
|
|
|
+ margin-bottom: 15px;
|
|
|
|
+ .list-item {
|
|
|
|
+ width: 90px;
|
|
|
|
+ height: 50px;
|
|
|
|
+ background: #f7f7f8;
|
|
|
|
+ border-radius: 8px;
|
|
|
|
+ text-align: center;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ align-content: center;
|
|
|
|
+
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+
|
|
|
|
+ .num {
|
|
|
|
+ width: 100%;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ font-size: 18px;
|
|
|
|
+ color: #373743;
|
|
|
|
+ }
|
|
|
|
+ .name {
|
|
|
|
+ width: 100%;
|
|
|
|
+ font-size: 18px;
|
|
|
|
+ color: #000000;
|
|
|
|
+ opacity: 0.5;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .c2 {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ .t {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ padding-bottom: 10px;
|
|
|
|
+ .buttons {
|
|
|
|
+ span {
|
|
|
|
+ color: #000000;
|
|
|
|
+ opacity: 0.9;
|
|
|
|
+ border-radius: 25px;
|
|
|
|
+ padding: 5px 10px;
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ }
|
|
|
|
+ .now {
|
|
|
|
+ background: #dfecfd;
|
|
|
|
+ color: #1c77f2;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .list {
|
|
|
|
+ padding: 10px 0;
|
|
|
|
+ padding-right: 10px;
|
|
|
|
+ overflow-y: auto;
|
|
|
|
+ .list-item {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+
|
|
|
|
+ .left {
|
|
|
|
+ width: 50px;
|
|
|
|
+ height: 50px;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ align-content: center;
|
|
|
|
+ justify-content: center;
|
|
|
|
+ text-align: center;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ font-size: 16px;
|
|
|
|
+ border-radius: 8px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .center {
|
|
|
|
+ width: 70%;
|
|
|
|
+ padding: 5px 0;
|
|
|
|
+ flex: 1;
|
|
|
|
+ margin: 0 12px;
|
|
|
|
+ div {
|
|
|
|
+ font-size: 20px;
|
|
|
|
+ color: #000000;
|
|
|
|
+ opacity: 0.7;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .right {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-content: flex-end;
|
|
|
|
+ align-items: flex-end;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .c3 {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ padding-bottom: 5px;
|
|
|
|
+ .t {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ padding-bottom: 10px;
|
|
|
|
+ .right {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .list {
|
|
|
|
+ flex: 1;
|
|
|
|
+ padding: 10px 0;
|
|
|
|
+ padding-right: 10px;
|
|
|
|
+ overflow-y: auto;
|
|
|
|
+ .list-item {
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ padding: 15px;
|
|
|
|
+ .item-top {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ .left {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ .asset-name {
|
|
|
|
+ font-size: 18px;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ margin-right: 10px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ img {
|
|
|
|
+ width: 40px;
|
|
|
|
+ height: 40px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .status {
|
|
|
|
+ margin: 10px 0;
|
|
|
|
+ padding: 5px 10px;
|
|
|
|
+ width: 100px;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-evenly;
|
|
|
|
+ align-content: center;
|
|
|
|
+ border-radius: 5px;
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ img {
|
|
|
|
+ width: 15px;
|
|
|
|
+ height: 15px;
|
|
|
|
+ min-width: 15px;
|
|
|
|
+ min-height: 15px;
|
|
|
|
+ margin-right: 5px;
|
|
|
|
+ }
|
|
|
|
+ .down-time {
|
|
|
|
+ color: #177532;
|
|
|
|
+ }
|
|
|
|
+ .not-down-time {
|
|
|
|
+ color: #d81e06;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .down-status {
|
|
|
|
+ background-color: #1dcaac20;
|
|
|
|
+ }
|
|
|
|
+ .not-down-status {
|
|
|
|
+ background-color: #d81e0620;
|
|
|
|
+ }
|
|
|
|
+ .center {
|
|
|
|
+ color: #838385;
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ .row {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ margin: 5px 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .foot {
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ align-items: center;
|
|
|
|
+ padding-top: 20px;
|
|
|
|
+ .ip {
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ color: #585858;
|
|
|
|
+ }
|
|
|
|
+ .time {
|
|
|
|
+ color: #585858;
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .rect-title {
|
|
|
|
+ font-size: 20px;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ color: #000;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|
|
|
|
+
|
|
|
|
+<style >
|
|
|
|
+::v-deep .app-main {
|
|
|
|
+ background-color: #ebeef5;
|
|
|
|
+}
|
|
|
|
+</style>
|