smart-power-ui/src/views/index.vue

610 lines
17 KiB
Vue

<template>
<div class="page-cloud">
<div class="public-nav-div">
<div :style="'width: calc(100% - 280px); float: left;'">
<div class="genert-div button-div">
<div class="title" >云端数据概况</div>
<div class="content-div buttom-div" v-if="userType === 'SYSTEM'">
<i class="iconfont icon-chanpinC fontsize"></i>
<p class="buttom-div-p">{{tempObject.modelCount}}</p>
<p>全部型号数量</p>
<el-button type="text" :disabled="true" @click="toProdFu">管理型号</el-button>
</div>
<div class="content-div buttom-div" v-else-if="userType === 'TENANT'">
<i class="iconfont icon-chanpinC fontsize"></i>
<p class="buttom-div-p">{{tempObject.modelCount}}</p>
<p>全部项目数量</p>
<el-button type="text" :disabled="true" @click="toProdFu">管理项目</el-button>
</div>
<div class="content-div buttom-div" v-else>
<i class="iconfont icon-chanpinC fontsize"></i>
<p class="buttom-div-p">0</p>
<p>全部项目数量</p>
<el-button type="text" :disabled="true" @click="toProdFu">管理项目</el-button>
</div>
<div class="content-div buttom-div">
<i class="iconfont icon-shebeishuliang fontsize"></i>
<p class="buttom-div-p">{{tempObject.deviceCount}}</p>
<p>全部设备数量</p>
<el-button type="text" :disabled="true" @click="toDeviceFu">管理设备</el-button>
</div>
<div class="content-div buttom-div">
<i class="iconfont icon-chufaqi fontsize"></i>
<p class="buttom-div-p">{{tempObject.onlineCount}}</p>
<p>在线设备数量</p>
<el-button type="text" :disabled="true" @click="toDeviceFu">管理设备</el-button>
</div>
<div class="content-div buttom-div">
<div style=" width: 100%; height: 160px; position: relative; top: 32px;">
<span
style="font-size: 14px; font-family: 'Microsoft YaHei'; font-weight: bold; position: relative;top: 35px;left: 20px;"
>在线率</span>
<span
style="font-size: 17px; font-family: 'Microsoft YaHei'; font-weight: bold; color: #30ff00; position: relative;top: 20px;left: -20px;"
>{{deviceRate( tempObject.deviceCount, tempObject.onlineCount)}}</span>
<pancake
styles="width: 100%; height: 160px; width: 158px; border-radius: 50%; border: 1px solid; height: 158px;"
id="pancake026"
:config="deviceConfig"
:option="{ data: [{value: tempObject.onlineCount, name:'在线'}, {value: tempObject.offlineCount, name:'离线'}], title: '设备状态' }"
></pancake>
</div>
</div>
<div class="content-div buttom-div">
<i class="iconfont icon-baojing fontsize"></i>
<p class="buttom-div-p">{{alarmCount.alarmCount}}</p>
<p>报警总数</p>
<el-button type="text" :disabled="true" @click="toAlarmFu">管理报警</el-button>
</div>
<div class="content-div buttom-div">
<i class="iconfont icon-gaojingyichuli fontsize"></i>
<p class="buttom-div-p">{{alarmCount.processCount}}</p>
<p>已处理</p>
<el-button type="text" :disabled="true" @click="toAlarmFu">管理报警</el-button>
</div>
<div class="content-div buttom-div">
<i class="iconfont icon-weichuligaojing fontsize"></i>
<p class="buttom-div-p">{{alarmCount.unProcessCount}}</p>
<p>未处理</p>
<el-button type="text" :disabled="true" @click="toAlarmFu">管理报警</el-button>
</div>
<div class="content-div buttom-div">
<div style=" width: 100%; height: 160px; position: relative; top: 32px;">
<span
style="font-size: 14px; font-family: 'Microsoft YaHei'; font-weight: bold; position: relative;top: 35px;left: 18px;"
>处理率</span>
<span
style="font-size: 17px; font-family: 'Microsoft YaHei'; font-weight: bold; color: #30ff00; position: relative;top: 20px;left: -20px;"
>{{alarmRate(alarmCount.alarmCount, alarmCount.processCount)}}</span>
<pancake
styles="width: 100%; height: 160px; height: 160px; width: 158px; border-radius: 50%; border: 1px solid; height: 158px;"
:config="alarmConfig"
id="pancake157"
:option="{ data: [{value: alarmCount.processCount, name:'已处理'}, {value: alarmCount.unProcessCount, name:'未处理'}], title: '报警处理' }"
></pancake>
</div>
</div>
</div>
<div class="genert-div" v-if="index_m_tzgg">
<div class="title">云端设备组态流程</div>
<div class="content">
<div class="content-div" @click="toProdFu">
<i class="iconfont icon-chanpinC fontsize"></i>
<p>添加产品</p>
<p>定义产品属性</p>
</div>
<div class="right-icon">
<i class="iconfont icon-right-fill youjiantou"></i>
</div>
<div class="content-div" @click="toDeviceFu">
<i class="iconfont icon-tianjiashebei fontsize"></i>
<p>添加设备</p>
<p>创建设备与实物对应</p>
</div>
<div class="right-icon">
<i class="iconfont icon-right-fill youjiantou"></i>
</div>
<div class="content-div">
<i class="iconfont icon-icon_xinyong_xianxing_jijin- fontsize"></i>
<p>数据上报</p>
<p>设备实时数据上传云端</p>
</div>
<div class="right-icon">
<i class="iconfont icon-right-fill youjiantou"></i>
</div>
<div class="content-div">
<i class="iconfont icon-lishijilu fontsize"></i>
<p>云端查看</p>
<p>云端查看设备历史数据</p>
</div>
</div>
</div>
<div
class="genert-div button-div"
style="width: calc((100% - 30px) / 2); margin-right: 30px;"
>
<div class="title">
更新日志
<div class="see-more" @click="versionSeeMoreClick()">查看更多</div>
</div>
<div class="new-div-wrap">
<div
style="font-size: 20px; line-height: 24px; margin-bottom: 3px;"
>更新内容 ( {{versionObj.version}} )</div>
<div
style="font-size: 16px; line-height: 25px; padding-left: 0px; height: 140px; overflow: auto;"
class="new-info-wrap"
v-html="versionObj.content"
>
<!-- <el-input v-model="versionObj.content" :readonly="true" type="textarea" class="version-input" :rows="6"></el-input> -->
</div>
</div>
</div>
<div class="genert-div button-div" style="width: calc((100% - 30px) / 2)">
<div class="title">
通知公告
<div class="see-more" @click="noticeSeeMoreClick()">查看更多</div>
</div>
<div style="padding: 20px 5px; " class="new-div-wrap">
<div v-for="(item, index) in newsList" :key="index" class="news-item">
<span class="ontice-span"></span>
<span @click="noticeClick(item)">{{item.noticeTitle}}</span>
</div>
</div>
</div>
</div>
<div class="dashboard-tips">
<indexTips title="微信小程序" :option="option1"></indexTips>
<indexTips title="微信公众号" :option="option2"></indexTips>
</div>
</div>
</div>
</template>
<script>
import indexTips from "./bashboardcom/indexTips";
import pancake from "./bashboardcom/pancake_echarts";
import { homeCount } from "@/api/system/home";
import { newUplog } from '@/api/system/uplog'
import { listNotice } from "@/api/system/notice";
import gzhqr from "@/assets/images/gzhqr.jpg"
import ydxcx from "@/assets/images/ydxcx.jpg"
export default {
name: "cloud",
data() {
return {
activeNames: ["1", "2", "3", "4"],
DATA: [],
text: "",
actor: "",
count: 0,
isText: false,
currentRole: "adminDashboard",
headerObj: "",
versionObj: {},
newsList: [],
tempObject: {
onlineCount: "0",
activeCount: "0",
deviceCount: "0",
modelCount: "0",
offlineCount: "0",
userId: "",
userName: ""
},
alarmCount: {
processCount: "0",
unProcessCount: "0",
alarmCount: "0"
},
deviceConfig: {
tooltip: {
formatter: "{a} <br/>{b}: {c} ({d}%)"
},
series: {
radius: ["50%", "75%"]
},
itemStyle: {
normal: {
color: function(params) {
var colorList = ["#00cefc", "rgb(211, 251, 253)"];
return colorList[params.dataIndex];
}
}
}
},
alarmConfig: {
tooltip: {
formatter: "{a} <br/>{b}: {c} ({d}%)"
},
series: {
radius: ["50%", "75%"]
},
itemStyle: {
normal: {
color: function(params) {
var colorList = ["rgb(255, 158, 98)", "rgb(255, 233, 213)"];
return colorList[params.dataIndex];
}
}
}
},
option1: [
{
img: ydxcx,
lable: "微信小程序",
describe: "企业用户和个人用户通过微信小程序,可以查看设备,控制设备,查看设备实时数据和历史数据;查看报警信息,处理报警信息,查看项目信息等。"
}
],
option2: [
{
img: gzhqr,
lable: "微信公众号",
describe: "通过关注微信公众号,可以实时接收到系统通知,触发器消息等。"
}
],
index_m_tzgg: false,
head_btn_gjjk: false,
head_btn_sbjk: false,
index_m_ydxcx: false,
userType: null
};
},
components: {
indexTips,
pancake
},
created() {
this.init();
},
methods: {
init() {
this.userType = this.$store.getters.userType;
this.getCount();
this.getVersionList();
this.getNoticeList();
},
versionSeeMoreClick() {
this.$router.push({
path: "/uplog/list"
});
},
noticeSeeMoreClick() {
this.$router.push({ path: "/news" });
// this.$router.push({
// path: "/admin/notices/list"
// });
},
getNoticeList() {
listNotice({
pageNum: 1,
pageSize: 5
}).then(response => {
this.newsList = response.rows
}).catch(err => {})
},
getVersionList() {
newUplog().then(response => {
this.versionObj = response.data
}).catch(err => {})
},
noticeClick(row) {
this.$router.push({ path: "/news", query: { newId: row.noticeId } });
},
contentToString(val) {
let str = "";
if (val) {
let list = new Array();
list = val.split(";");
list.forEach((v, index) => {
// if (index !== list.length -1) {
str += v + " <br>";
// }
});
}
return str;
},
deviceRate(count, zk) {
let num = ((parseInt(zk) / parseInt(count)) * 100).toFixed(0);
if (num !== "NaN") {
return num + " %";
} else {
return "0 %";
}
},
alarmRate(count, zk) {
let num = ((parseInt(zk) / parseInt(count)) * 100).toFixed(0);
if (num !== "NaN") {
return num + " %";
} else {
return "0 %";
}
},
getAlarmCount() {
},
getCount() {
homeCount().then(response => {
this.tempObject = {
onlineCount: response.data.onlineTotal,
activeCount: response.data.activeCount,
deviceCount: response.data.deviceTotal,
modelCount: response.data.projectTotal,
offlineCount: (response.data.deviceTotal - response.data.onlineTotal) || 0
}
this.alarmCount = {
processCount: response.data.processed,
unProcessCount: response.data.unProcessed,
alarmCount: response.data.alarmTotal
};
}).catch(err => {
console.log(err)
})
},
toDeviceFu() {
this.$router.push({
path: "/iot/devices"
});
},
toProdFu() {
this.$router.push({
path: "/iot/prod"
});
},
toAlarmFu() {
this.$router.push({
path: "/trigger/trigger/log"
});
},
getData() {
if (this.count < this.DATA.length - 1) {
this.count++;
} else {
this.count = 0;
}
this.isText = true;
this.actor = this.DATA[this.count];
},
setData() {
let num = 0;
let count = 0;
let active = false;
let timeoutstart = 5000;
let timeoutend = 1000;
let timespeed = 10;
setInterval(() => {
if (this.isText) {
if (count == this.actor.length) {
active = true;
} else {
active = false;
}
if (active) {
num--;
this.text = this.actor.substr(0, num);
if (num == 0) {
this.isText = false;
setTimeout(() => {
count = 0;
this.getData();
}, timeoutend);
}
} else {
num++;
this.text = this.actor.substr(0, num);
if (num == this.actor.length) {
this.isText = false;
setTimeout(() => {
this.isText = true;
count = this.actor.length;
}, timeoutstart);
}
}
}
}, timespeed);
}
}
};
</script>
<style lang="scss">
.page-cloud {
padding: 20px;
height: calc(100vh - 84px);
width: 100%;
padding: 20px;
background: #f0f2f5;
overflow: auto;
.public-nav-div {
// 最小宽度
width: 100%;
min-width: 1100px;
}
.genert-div {
border: 0px;
border-radius: 5px;
box-shadow: 0px 1px 3px 1px;
background-color: white;
font: 14px/16px "Roboto", sans-serif;
color: #666666;
width: 100%;
float: left;
margin-bottom: 20px;
cursor: default;
}
.new-div-wrap {
height: 200px;
width: calc(100% - 35px);
overflow: auto;
padding: 20px 5px 10px 30px;
padding-left: 30px;
}
.title {
height: 50px;
border-bottom: 1px solid #c4c4c4;
padding: 21px 10px 10px 30px;
font-size: 18px;
}
.content {
height: 160px;
padding: 30px 20px 30px 30px;
color: #999;
}
.content-div {
float: left;
width: 160px;
min-height: 150px;
font-size: 16px;
text-align: center;
padding-top: 25px;
border-radius: 5px;
p {
margin-top: 10px;
}
}
.content-div:hover {
box-shadow: 0 0 10px #09c;
color: #09c;
}
.buttom-div {
margin: 20px 20px 20px 20px;
margin-left: calc((100% - (170px * 4)) / 8);
margin-right: calc((100% - (170px * 4)) / 8);
}
.fontsize {
font-size: 64px;
line-height: 1;
}
.dashboard-tips {
width: 260px;
float: left;
margin-left: 20px;
}
.youjiantou {
font-size: 18px;
}
.right-icon {
width: calc((100% - (170px * 4)) / 3);
float: left;
padding-top: 65px;
margin-right: 10px;
text-align: center;
}
}
.wel-contailer {
position: relative;
}
.banner-text {
position: relative;
padding: 0 20px;
font-size: 20px;
text-align: center;
color: #333;
}
.buttom-div-p {
font-size: 22px;
}
.news-item {
position: relative;
left: 20px;
line-height: 30px;
font-size: 16px;
width: calc(100% - 20px);
overflow: hidden;
}
.news-item:hover {
color: #1890ff;
}
.ontice-span {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 6px;
background: #1890ff;
margin-right: 20px;
position: relative;
top: -1px;
}
.see-more {
position: relative;
// left: 10px;
float: right;
font-size: 12px;
// top: 10px;
}
.see-more:hover {
color: #1890ff;
}
.new-div-wrap .new-info-wrap::-webkit-scrollbar {
/*滚动条整体样式*/
width: 8px; /*高宽分别对应横竖滚动条的尺寸*/
height: 3px;
}
.new-div-wrap .new-info-wrap::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/
border-radius: 10px;
box-shadow: inset 0 0 5px #9e9d9d;
background: #ffffff;
}
.new-div-wrap .new-info-wrap::-webkit-scrollbar-track {
/*滚动条里面轨道*/
box-shadow: inset 0 0 5px #f6f6f6;
border-radius: 10px;
background: #ffffff;
}
.page-cloud::-webkit-scrollbar {
/*滚动条整体样式*/
width: 8px; /*高宽分别对应横竖滚动条的尺寸*/
height: 3px;
}
.page-cloud::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/
border-radius: 10px;
box-shadow: inset 0 0 5px #9e9d9d;
background: #ffffff;
}
.page-cloud::-webkit-scrollbar-track {
/*滚动条里面轨道*/
box-shadow: inset 0 0 5px #f6f6f6;
border-radius: 10px;
background: #ffffff;
}
</style>
<style>
.version-input .el-textarea__inner {
border: 0px;
cursor: default;
}
</style>