@ -0,0 +1,10 @@ |
|||||||
|
import request from "@/utils/request"; |
||||||
|
|
||||||
|
//根据房间号查询对应的风柜系统操作
|
||||||
|
export function windList(query) { |
||||||
|
return request({ |
||||||
|
url: "/device/ahu/monitor/list", |
||||||
|
method: "get", |
||||||
|
params: query, |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
import request from "@/utils/request"; |
||||||
|
|
||||||
|
// 能耗总览和基本信息、冷源系统和生活热水系统能耗
|
||||||
|
export function overView(data) { |
||||||
|
return request({ |
||||||
|
url: "/bigScreen/overview", |
||||||
|
method: "post", |
||||||
|
data: data, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// 用电趋势
|
||||||
|
export function systemTrend(data) { |
||||||
|
return request({ |
||||||
|
url: "/bigScreen/systemTrend", |
||||||
|
method: "post", |
||||||
|
data: data, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// 天气数据
|
||||||
|
export function getWeatherData() { |
||||||
|
return request({ |
||||||
|
url: "/device/cs/getWeatherData", |
||||||
|
method: "get", |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// 运行时间
|
||||||
|
export function getRunTime() { |
||||||
|
return request({ |
||||||
|
url: "/device/cs/runTime", |
||||||
|
method: "get", |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
import request from "@/utils/request"; |
||||||
|
|
||||||
|
// 历史数据
|
||||||
|
export function temHistory(query) { |
||||||
|
return request({ |
||||||
|
url: "/device/indoor/tempHis", |
||||||
|
method: "get", |
||||||
|
params: query, |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
import request from "@/utils/request"; |
||||||
|
|
||||||
|
// 设备监视
|
||||||
|
export function temList(query) { |
||||||
|
return request({ |
||||||
|
url: "/device/indoor/tempList", |
||||||
|
method: "get", |
||||||
|
params: query, |
||||||
|
}); |
||||||
|
} |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 224 KiB |
After Width: | Height: | Size: 336 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 7.9 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 178 KiB |
After Width: | Height: | Size: 284 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 537 KiB |
After Width: | Height: | Size: 8.9 KiB |
After Width: | Height: | Size: 10 MiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 783 B |
@ -0,0 +1,2 @@ |
|||||||
|
import Vue from "vue"; |
||||||
|
export const eventBus = new Vue(); |
@ -0,0 +1,758 @@ |
|||||||
|
<template> |
||||||
|
<div class="app-container"> |
||||||
|
<div class="left-tree"> |
||||||
|
<!-- 为 el-tree 设置一个固定的高度和滚动条 --> |
||||||
|
<div style="height: 7rem; overflow-y: auto"> |
||||||
|
<el-tree |
||||||
|
ref="tree" |
||||||
|
:data="treeData" |
||||||
|
node-key="id" |
||||||
|
:default-expand-all="false" |
||||||
|
:default-expanded-keys="expandedKeys" |
||||||
|
:auto-expand-parent="true" |
||||||
|
icon-class="none" |
||||||
|
@node-expand="handleNodeExpand" |
||||||
|
@node-collapse="handleNodeCollapse" |
||||||
|
:highlight-current="true" |
||||||
|
@node-click="handleNodeClick" |
||||||
|
> |
||||||
|
<template #default="{ node }"> |
||||||
|
<span class="custom-tree-node"> |
||||||
|
<!-- 根据节点状态动态设置图标类名 --> |
||||||
|
<div class="tree-left"> |
||||||
|
<i :class="getIconClass(node)" class="custom-tree-icon"></i> |
||||||
|
<span class="tree-label">{{ node.label }}</span> |
||||||
|
</div> |
||||||
|
</span> |
||||||
|
</template> |
||||||
|
</el-tree> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="right-monitor"> |
||||||
|
<div class="buildingDiv"> |
||||||
|
<img |
||||||
|
class="title-bg" |
||||||
|
src="../../../assets/images/title-bg.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="title-word">位置:{{ currentName }}</div> |
||||||
|
</div> |
||||||
|
<div class="mostDiv"> |
||||||
|
<div class="windC"> |
||||||
|
<!-- 空调风柜定位 --> |
||||||
|
<img |
||||||
|
class="wind-img" |
||||||
|
src="../../../assets/images/fenggui.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<!-- 风扇定位 --> |
||||||
|
<img |
||||||
|
class="wind-move tunCircle" |
||||||
|
src="../../../assets/images/fengshan.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<!-- 箭头定位 --> |
||||||
|
<div class="arrow-flex"> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/orange-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/orange-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/orange-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/orange-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<div class="arrow-flex2"> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<div class="arrow-flex3"> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
class="wind-arrow" |
||||||
|
src="../../../assets/images/blue-arrow.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<div class="wind-tem"> |
||||||
|
<div class="wind-text">回风温度</div> |
||||||
|
<el-input v-model="temValue" size="mini"> |
||||||
|
<svg-icon slot="prefix" icon-class="tem_icon" class="tem-icon" /> |
||||||
|
</el-input> |
||||||
|
</div> |
||||||
|
<div class="wind-valve"> |
||||||
|
<div class="wind-text">电动阀比例调节控制</div> |
||||||
|
<el-input v-model="valvePercent" size="mini"> |
||||||
|
<svg-icon |
||||||
|
slot="prefix" |
||||||
|
icon-class="percentage-icon" |
||||||
|
class="percentage-icon" |
||||||
|
/> |
||||||
|
</el-input> |
||||||
|
</div> |
||||||
|
<div class="fan-run"> |
||||||
|
<div class="wind-text">风机运行状态</div> |
||||||
|
<el-switch |
||||||
|
style="display: block" |
||||||
|
v-model="runStatus" |
||||||
|
active-color="#13ce66" |
||||||
|
inactive-color="#ff4949" |
||||||
|
active-text="运行" |
||||||
|
inactive-text="停止" |
||||||
|
> |
||||||
|
</el-switch> |
||||||
|
</div> |
||||||
|
<div class="fan-auto"> |
||||||
|
<div class="wind-text">风机手自动状态</div> |
||||||
|
<el-switch |
||||||
|
style="display: block" |
||||||
|
v-model="autoStatus" |
||||||
|
active-color="#13ce66" |
||||||
|
inactive-color="#ff4949" |
||||||
|
active-text="手动" |
||||||
|
inactive-text="自动" |
||||||
|
> |
||||||
|
</el-switch> |
||||||
|
</div> |
||||||
|
<div class="fan-start"> |
||||||
|
<div class="wind-text">风机启停控制</div> |
||||||
|
<el-switch |
||||||
|
style="display: block" |
||||||
|
v-model="startStatus" |
||||||
|
active-color="#13ce66" |
||||||
|
inactive-color="#ff4949" |
||||||
|
active-text="关闭" |
||||||
|
inactive-text="打开" |
||||||
|
> |
||||||
|
</el-switch> |
||||||
|
</div> |
||||||
|
<div class="fan-frequency"> |
||||||
|
<div class="wind-text">风机变频控制</div> |
||||||
|
<el-input v-model="frequency" size="mini"> |
||||||
|
<svg-icon |
||||||
|
slot="prefix" |
||||||
|
icon-class="percentage-icon" |
||||||
|
class="percentage-icon" |
||||||
|
/> |
||||||
|
</el-input> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { spaceTree } from "@/api/region"; |
||||||
|
import { windList } from "@/api/aircAndWindc/index"; |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
loading: false, |
||||||
|
treeData: [], |
||||||
|
defaultProps: { |
||||||
|
children: "children", |
||||||
|
label: "label", |
||||||
|
}, |
||||||
|
deviceList: [], |
||||||
|
expandedKeys: [], |
||||||
|
currentId: "", //当前选中高亮的id |
||||||
|
currentName: "", //当前选中的名称 |
||||||
|
currentLevel: "", //当前节点的层级 |
||||||
|
currentParentId: "", //当前节点的上级的id |
||||||
|
|
||||||
|
tableData: [], //系统状态表格数据 |
||||||
|
temValue: "℃", //回风温度 |
||||||
|
valvePercent: "%", //阀比例 |
||||||
|
runStatus: false, //运行状态 |
||||||
|
autoStatus: false, //手自动状态 |
||||||
|
startStatus: false, //启停控制 |
||||||
|
frequency: "v", |
||||||
|
}; |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
temValue(newVal) { |
||||||
|
let valueWithoutTem = newVal.replace(/℃/g, ""); |
||||||
|
if (valueWithoutTem === "") { |
||||||
|
this.temValue = "℃"; |
||||||
|
} else { |
||||||
|
this.temValue = valueWithoutTem + "℃"; |
||||||
|
} |
||||||
|
}, |
||||||
|
valvePercent(newVal) { |
||||||
|
// 去除输入值中的 % |
||||||
|
let valueWithoutPercent = newVal.replace(/%/g, ""); |
||||||
|
// 如果输入值为空,保持 % |
||||||
|
if (valueWithoutPercent === "") { |
||||||
|
this.temValue = "%"; |
||||||
|
} else { |
||||||
|
// 否则在输入值后面添加 % |
||||||
|
this.temValue = valueWithoutPercent + "%"; |
||||||
|
} |
||||||
|
}, |
||||||
|
frequency(newVal) { |
||||||
|
let valueWithoutFrequency = newVal.replace(/v/g, ""); |
||||||
|
if (valueWithoutFrequency === "") { |
||||||
|
this.temValue = "v"; |
||||||
|
} else { |
||||||
|
this.temValue = valueWithoutFrequency + "v"; |
||||||
|
} |
||||||
|
}, |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.getSysBuild(); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
getSysBuild() { |
||||||
|
spaceTree().then((res) => { |
||||||
|
if (res.code == 200) { |
||||||
|
// 只需要保留热水的系统 |
||||||
|
console.log("楼栋返回值", res); |
||||||
|
let newRes = { ...res }; |
||||||
|
|
||||||
|
if (newRes.data && newRes.data[0] && newRes.data[0].children) { |
||||||
|
newRes.data[0].children = newRes.data[0].children.filter((item) => { |
||||||
|
// 假设子项有一个 label属性,用于检查是否包含 "热水" |
||||||
|
return item.label && item.label.includes("空调风柜"); |
||||||
|
}); |
||||||
|
} |
||||||
|
// 指定要保留的最大层级(从 1 开始计数),这里假设指定为第 4 级 |
||||||
|
const targetLevel = 7; |
||||||
|
// 从 data[0] 开始处理,当前层级为 1 |
||||||
|
if (newRes.data[0]) { |
||||||
|
this.removeChildrenAfterLevel(newRes.data[0], 1, targetLevel); |
||||||
|
} |
||||||
|
console.log("筛选后的新结果", newRes); |
||||||
|
this.treeData = newRes.data; |
||||||
|
this.$nextTick(() => { |
||||||
|
// 默认展开节点 |
||||||
|
this.getExpandedKeys(this.treeData, 1); |
||||||
|
if (this.treeData.length > 0) { |
||||||
|
// 找到最后一层的第一个子节点 |
||||||
|
const lastLevelFirstChild = this.findLastLevelFirstChild( |
||||||
|
this.treeData[0] |
||||||
|
); |
||||||
|
// this.$refs.tree.setCurrentKey( |
||||||
|
// this.treeData[0].children[0].children[0].children[0].id |
||||||
|
// ); |
||||||
|
// 设置当前选中的节点,默认高亮 |
||||||
|
this.$refs.tree.setCurrentKey(lastLevelFirstChild.id); |
||||||
|
// 更新当前节点的信息 |
||||||
|
this.currentId = lastLevelFirstChild.id; |
||||||
|
this.currentLevel = lastLevelFirstChild.level; |
||||||
|
this.currentName = lastLevelFirstChild.label; |
||||||
|
console.log("当前选中节点ID", this.currentId); |
||||||
|
console.log("当前选中节点层级", this.currentLevel); |
||||||
|
console.log("当前选中节点名称", this.currentName); |
||||||
|
this.getWindList(); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 递归函数,用于去除指定层级往后的 children 数据 |
||||||
|
removeChildrenAfterLevel(obj, currentLevel, targetLevel) { |
||||||
|
if (currentLevel >= targetLevel) { |
||||||
|
// 当达到指定层级时,将 children 属性置为空数组 |
||||||
|
obj.children = []; |
||||||
|
return; |
||||||
|
} |
||||||
|
if (obj.children && obj.children.length > 0) { |
||||||
|
// 若存在 children 数组,则递归处理每个子项 |
||||||
|
for (let i = 0; i < obj.children.length; i++) { |
||||||
|
this.removeChildrenAfterLevel( |
||||||
|
obj.children[i], |
||||||
|
currentLevel + 1, |
||||||
|
targetLevel |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
// 递归函数,找到最后一层的第一个子节点 |
||||||
|
findLastLevelFirstChild(node, level = 1) { |
||||||
|
if (!node.children || node.children.length === 0) { |
||||||
|
return { |
||||||
|
id: node.id, |
||||||
|
level, |
||||||
|
label: node.label, |
||||||
|
}; |
||||||
|
} |
||||||
|
return this.findLastLevelFirstChild(node.children[0], level + 1); |
||||||
|
}, |
||||||
|
// 默认只展示一二级菜单 |
||||||
|
getExpandedKeys(nodes, level) { |
||||||
|
nodes.forEach((node) => { |
||||||
|
if (level <= this.currentId + 4) { |
||||||
|
this.expandedKeys.push(node.id); |
||||||
|
} |
||||||
|
if (node.children) { |
||||||
|
this.getExpandedKeys(node.children, level + 1); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 更换图标 |
||||||
|
getIconClass(node) { |
||||||
|
// console.log("当前图标的节点内容", node); |
||||||
|
if (node.level === 5) { |
||||||
|
// 4级菜单时的图标 |
||||||
|
if (node.expanded) { |
||||||
|
return "el-icon-document-opened"; // 三级菜单展开时的图标类名 |
||||||
|
} |
||||||
|
return "el-icon-document"; // 三级菜单收缩时的图标类名 |
||||||
|
} |
||||||
|
if (node.expanded) { |
||||||
|
return "el-icon-folder-opened"; // 非三级菜单展开时的图标类名 |
||||||
|
} |
||||||
|
return "el-icon-folder-add"; // 非三级菜单收缩时的图标类名 |
||||||
|
}, |
||||||
|
handleNodeExpand(node) { |
||||||
|
// 节点展开时触发 |
||||||
|
}, |
||||||
|
handleNodeCollapse(node) { |
||||||
|
// 节点收缩时触发 |
||||||
|
}, |
||||||
|
// 点击当前节点,保存节点内容 |
||||||
|
handleNodeClick(node, data) { |
||||||
|
console.log("点击的当前节点", node, data); |
||||||
|
if (data.level !== 5) { |
||||||
|
console.log("不是第5层000"); |
||||||
|
// 设置当前选中的节点,默认高亮 |
||||||
|
this.$refs.tree.setCurrentKey(this.currentId); |
||||||
|
console.log("当前选中节点ID", this.currentId); |
||||||
|
console.log("当前选中节点层级", this.currentLevel); |
||||||
|
console.log("当前选中节点名称", this.currentName); |
||||||
|
} else { |
||||||
|
console.log("第5层111"); |
||||||
|
this.currentId = node.id; |
||||||
|
this.currentLevel = data.level; |
||||||
|
this.currentName = node.label; |
||||||
|
// 设置当前选中的节点,默认高亮 |
||||||
|
this.$refs.tree.setCurrentKey(this.currentId); |
||||||
|
console.log("当前选中节点ID", this.currentId); |
||||||
|
console.log("当前选中节点层级", this.currentLevel); |
||||||
|
console.log("当前选中节点名称", this.currentName); |
||||||
|
this.getWindList(); |
||||||
|
} |
||||||
|
}, |
||||||
|
// 请求数据 |
||||||
|
getWindList() { |
||||||
|
let data = { |
||||||
|
systemType: "2", |
||||||
|
houseId: this.currentId, |
||||||
|
}; |
||||||
|
windList(data).then((res) => { |
||||||
|
console.log("风柜系统查询返回", res); |
||||||
|
}); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.buildingDiv { |
||||||
|
padding-left: 54px; |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
margin-bottom: 20px; |
||||||
|
position: relative; |
||||||
|
.title-bg { |
||||||
|
width: 208px; |
||||||
|
height: 38px; |
||||||
|
position: absolute; |
||||||
|
left: 0; |
||||||
|
z-index: 0; |
||||||
|
} |
||||||
|
.title-word { |
||||||
|
z-index: 10; |
||||||
|
font-family: YouSheBiaoTiHei; |
||||||
|
font-size: 24px; |
||||||
|
color: #ffffff; |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
} |
||||||
|
.mostDiv { |
||||||
|
width: 100%; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
.windC { |
||||||
|
width: 13rem; |
||||||
|
height: 5.38rem; |
||||||
|
position: relative; |
||||||
|
.wind-img { |
||||||
|
width: 13rem; |
||||||
|
height: 5.38rem; |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
z-index: 1; |
||||||
|
} |
||||||
|
.wind-tem { |
||||||
|
z-index: 10; |
||||||
|
width: 1.3rem; |
||||||
|
position: absolute; |
||||||
|
top: 0.3rem; |
||||||
|
left: 7.3rem; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
.wind-text { |
||||||
|
color: #00d2ff; |
||||||
|
font-size: 0.18rem; |
||||||
|
margin-bottom: 0.15rem; |
||||||
|
} |
||||||
|
} |
||||||
|
.wind-valve { |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 4.6rem; |
||||||
|
left: 3rem; |
||||||
|
width: 3rem; |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
.wind-text { |
||||||
|
color: #00d2ff; |
||||||
|
font-size: 0.18rem; |
||||||
|
margin-right: 0.1rem; |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
} |
||||||
|
.fan-run { |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 1.8rem; |
||||||
|
left: 7rem; |
||||||
|
width: 3rem; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
.wind-text { |
||||||
|
color: #00d2ff; |
||||||
|
font-size: 0.18rem; |
||||||
|
margin-bottom: 0.15rem; |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
} |
||||||
|
.fan-auto { |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 1.8rem; |
||||||
|
left: 9rem; |
||||||
|
width: 3rem; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
.wind-text { |
||||||
|
color: #00d2ff; |
||||||
|
font-size: 0.18rem; |
||||||
|
margin-bottom: 0.15rem; |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
} |
||||||
|
.fan-start { |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 4.6rem; |
||||||
|
left: 7rem; |
||||||
|
width: 3rem; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
.wind-text { |
||||||
|
color: #00d2ff; |
||||||
|
font-size: 0.18rem; |
||||||
|
margin-bottom: 0.15rem; |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
} |
||||||
|
.fan-frequency { |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 4.55rem; |
||||||
|
right: 0.5rem; |
||||||
|
width: 2.5rem; |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
.wind-text { |
||||||
|
color: #00d2ff; |
||||||
|
font-size: 0.18rem; |
||||||
|
margin-right: 0.1rem; |
||||||
|
white-space: nowrap; |
||||||
|
} |
||||||
|
} |
||||||
|
.wind-move { |
||||||
|
width: 0.72rem; |
||||||
|
height: 0.73rem; |
||||||
|
position: absolute; |
||||||
|
top: 3.23rem; |
||||||
|
right: 3.81rem; |
||||||
|
z-index: 10; |
||||||
|
} |
||||||
|
.tunCircle { |
||||||
|
/* 应用动画 */ |
||||||
|
animation: rotate 2s linear infinite; |
||||||
|
} /* 定义旋转动画 */ |
||||||
|
@keyframes rotate { |
||||||
|
from { |
||||||
|
transform: rotate(0deg); |
||||||
|
} |
||||||
|
to { |
||||||
|
transform: rotate(360deg); |
||||||
|
} |
||||||
|
} |
||||||
|
.arrow-flex { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 3.2rem; |
||||||
|
left: -0.1rem; |
||||||
|
} |
||||||
|
.arrow-flex2 { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 3.2rem; |
||||||
|
right: 0.6rem; |
||||||
|
} |
||||||
|
.arrow-flex3 { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
z-index: 10; |
||||||
|
position: absolute; |
||||||
|
top: 0.6rem; |
||||||
|
right: 6rem; |
||||||
|
transform: rotateY(180deg); |
||||||
|
} |
||||||
|
.wind-arrow { |
||||||
|
width: 0.4rem; |
||||||
|
height: 0.6rem; |
||||||
|
margin-right: 0.15rem; |
||||||
|
animation: moveArrow 2s linear infinite; |
||||||
|
} |
||||||
|
/* 定义每个箭头的透明度 */ |
||||||
|
.wind-arrow:nth-child(1) { |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
|
||||||
|
.wind-arrow:nth-child(2) { |
||||||
|
opacity: 0.6; |
||||||
|
} |
||||||
|
|
||||||
|
.wind-arrow:nth-child(3) { |
||||||
|
opacity: 0.4; |
||||||
|
} |
||||||
|
.wind-arrow:nth-child(4) { |
||||||
|
opacity: 0.2; |
||||||
|
} |
||||||
|
|
||||||
|
/* 定义箭头移动的动画 */ |
||||||
|
@keyframes moveArrow { |
||||||
|
0% { |
||||||
|
transform: translateX(0); |
||||||
|
} |
||||||
|
|
||||||
|
100% { |
||||||
|
transform: translateX(0.2rem); |
||||||
|
/* 箭头向右移动的距离 */ |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.app-container { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: stretch; |
||||||
|
height: 100%; |
||||||
|
.left-tree { |
||||||
|
width: 256px; |
||||||
|
padding: 15px 10px 10px 10px; |
||||||
|
border: 1px solid #004b8c; |
||||||
|
.status { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
justify-content: space-between; |
||||||
|
flex-wrap: wrap; |
||||||
|
margin-top: 20px; |
||||||
|
.status-li { |
||||||
|
width: 50%; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
margin-bottom: 15px; |
||||||
|
} |
||||||
|
.status1, |
||||||
|
.status2, |
||||||
|
.status3, |
||||||
|
.status4 { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
margin-bottom: 5px; |
||||||
|
} |
||||||
|
.status1::before { |
||||||
|
content: ""; |
||||||
|
width: 10px; |
||||||
|
height: 10px; |
||||||
|
border-radius: 50%; |
||||||
|
background-color: #00d2ff; |
||||||
|
margin-right: 5px; |
||||||
|
} |
||||||
|
.status2::before { |
||||||
|
content: ""; |
||||||
|
width: 10px; |
||||||
|
height: 10px; |
||||||
|
border-radius: 50%; |
||||||
|
background-color: #ff2f2f; |
||||||
|
margin-right: 5px; |
||||||
|
} |
||||||
|
.status3::before { |
||||||
|
content: ""; |
||||||
|
width: 10px; |
||||||
|
height: 10px; |
||||||
|
border-radius: 50%; |
||||||
|
background-color: #ff9908; |
||||||
|
margin-right: 5px; |
||||||
|
} |
||||||
|
.status4::before { |
||||||
|
content: ""; |
||||||
|
width: 10px; |
||||||
|
height: 10px; |
||||||
|
border-radius: 50%; |
||||||
|
background-color: #7398c7; |
||||||
|
margin-right: 5px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.right-monitor { |
||||||
|
width: calc(100% - 280px); |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
justify-content: flex-start; |
||||||
|
} |
||||||
|
} |
||||||
|
.tree-container { |
||||||
|
height: 300px; /* 设置固定高度 */ |
||||||
|
overflow-y: auto; /* 启用垂直滚动条 */ |
||||||
|
} |
||||||
|
// 滚动条 |
||||||
|
:-webkit-scrollbar { |
||||||
|
width: 10px; /* 滚动条宽度 */ |
||||||
|
} |
||||||
|
|
||||||
|
::-webkit-scrollbar-track { |
||||||
|
background: transparent !important; /* 滚动条轨道背景色 */ |
||||||
|
} |
||||||
|
.custom-tree-node { |
||||||
|
flex: 1; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
justify-content: space-between; |
||||||
|
font-size: 14px; |
||||||
|
padding-right: 8px; |
||||||
|
.tree-left { |
||||||
|
.custom-tree-icon { |
||||||
|
margin-right: 5px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
@media (min-width: 1360px) and (max-width: 1680px) { |
||||||
|
.windC { |
||||||
|
transform: scale(0.9); |
||||||
|
} |
||||||
|
} |
||||||
|
@media (min-width: 1160px) and (max-width: 1360px) { |
||||||
|
.windC { |
||||||
|
transform: scale(0.8); |
||||||
|
} |
||||||
|
} |
||||||
|
@media (min-width: 990px) and (max-width: 1160px) { |
||||||
|
.windC { |
||||||
|
transform: scale(0.7); |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
||||||
|
<style scoped> |
||||||
|
/* 自定义高亮颜色 */ |
||||||
|
.left-tree |
||||||
|
>>> .el-tree--highlight-current |
||||||
|
.el-tree-node.is-current |
||||||
|
> .el-tree-node__content { |
||||||
|
background-color: #285b9e !important; |
||||||
|
/* color: #f56c6c; */ |
||||||
|
color: #25f1f8; |
||||||
|
} |
||||||
|
.windC >>> .el-input__inner { |
||||||
|
background-color: #04193a; |
||||||
|
border: 1px solid #1262db; |
||||||
|
color: #3ef0fd; |
||||||
|
font-weight: 700; |
||||||
|
text-align: center; |
||||||
|
padding: 0 0.1rem !important; |
||||||
|
} |
||||||
|
.windC >>> .el-input__prefix { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
.windC >>> .svg-icon { |
||||||
|
width: 0.2rem !important; |
||||||
|
height: 0.2rem !important; |
||||||
|
fill: #ffffff !important; |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,584 @@ |
|||||||
|
<template> |
||||||
|
<div class="loginD"> |
||||||
|
<img |
||||||
|
src="../../assets/images/index_img_top.png" |
||||||
|
class="loginD_img_top" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<img |
||||||
|
src="../../assets/images/index_img_down.png" |
||||||
|
class="loginD_img_down" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="sys-title">楼宇智慧管理系统平台</div> |
||||||
|
<!-- <div class="day">已监测100天</div> --> |
||||||
|
<div class="set"> |
||||||
|
<img src="../../assets/images/icon_time.png" class="icon_time" alt="" /> |
||||||
|
<div>{{ nowTime }}</div> |
||||||
|
<img |
||||||
|
src="../../assets/images/icon_home.png" |
||||||
|
class="icon_home" |
||||||
|
alt="" |
||||||
|
title="进入系统" |
||||||
|
@click="goSys" |
||||||
|
/> |
||||||
|
<img |
||||||
|
src="../../assets/images/icon_dianyuan.png" |
||||||
|
class="icon_dianyuan" |
||||||
|
alt="" |
||||||
|
title="退出系统" |
||||||
|
@click="logout" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<div class="screen-page"> |
||||||
|
<div class="screen-left" :class="{ collapsed: !isLeftPanelOpen }"> |
||||||
|
<div class="showLeftConent"> |
||||||
|
<div class="special-div"> |
||||||
|
<div class="special-top"> |
||||||
|
<div class="special-title"> |
||||||
|
<div class="title-left"> |
||||||
|
<div>能耗总览</div> |
||||||
|
<time-data |
||||||
|
v-model="sharedIndex" |
||||||
|
:currentIndex="sharedIndex" |
||||||
|
@update-message="handleUpdateMessage" |
||||||
|
></time-data> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<all-energy :viewMes="viewMes"></all-energy> |
||||||
|
</div> |
||||||
|
<div class="special-div"> |
||||||
|
<div class="special-top"> |
||||||
|
<div class="special-title"> |
||||||
|
<div class="title-left"> |
||||||
|
<div>冷源系统能耗</div> |
||||||
|
<time-data |
||||||
|
v-model="sharedIndex" |
||||||
|
:currentIndex="sharedIndex" |
||||||
|
@update-message="handleUpdateMessage" |
||||||
|
></time-data> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<cold-sys-energy :viewMes="viewMes"></cold-sys-energy> |
||||||
|
</div> |
||||||
|
<div class="special-div"> |
||||||
|
<div class="special-top"> |
||||||
|
<div class="special-title"> |
||||||
|
<div class="title-left"> |
||||||
|
<div>生活热水系统</div> |
||||||
|
<time-data |
||||||
|
v-model="sharedIndex" |
||||||
|
:currentIndex="sharedIndex" |
||||||
|
@update-message="handleUpdateMessage" |
||||||
|
></time-data> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<water-sys-energy :viewMes="viewMes"></water-sys-energy> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<img |
||||||
|
:src="leftIndicatorSrc" |
||||||
|
class="left-Indicator" |
||||||
|
@click="togglePanel('left')" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<div class="screen-right" :class="{ collapsed: !isRightPanelOpen }"> |
||||||
|
<div class="showRightConent"> |
||||||
|
<div class="special-div"> |
||||||
|
<div class="special-top"> |
||||||
|
<div class="special-title"> |
||||||
|
<div class="title-left"> |
||||||
|
<div>基本信息</div> |
||||||
|
<time-data |
||||||
|
v-model="sharedIndex" |
||||||
|
:currentIndex="sharedIndex" |
||||||
|
@update-message="handleUpdateMessage" |
||||||
|
></time-data> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="message"> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img1.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.buildingArea }}m²</div> |
||||||
|
<div>建筑面积</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img3.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.totalEle }}kwh</div> |
||||||
|
<div>总电耗</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img4.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.totalWater }}t</div> |
||||||
|
<div>总水耗</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img2.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.totalCold }}kw</div> |
||||||
|
<div>总产冷量</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img6.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.totalGas }}t</div> |
||||||
|
<div>总蒸汽量</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img5.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.eleUnitArea }}wkh/m²</div> |
||||||
|
<div>面积电耗</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img7.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.waterUnitArea }}kwh</div> |
||||||
|
<div>面积水耗</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img8.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.coldUnitArea }}kw/lm³</div> |
||||||
|
<div>面积冷耗</div> |
||||||
|
</div> |
||||||
|
<div class="message-li"> |
||||||
|
<img |
||||||
|
class="message-img" |
||||||
|
src="../../assets/images/message-img9.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="message-data">{{ viewMes.gasUnitArea }}kw/lm³</div> |
||||||
|
<div>面积汽耗</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="special-div"> |
||||||
|
<div class="special-top"> |
||||||
|
<div class="special-title"> |
||||||
|
<div class="title-left"> |
||||||
|
<div>用电趋势</div> |
||||||
|
<time-data |
||||||
|
v-model="sharedIndex" |
||||||
|
:currentIndex="sharedIndex" |
||||||
|
@update-message="handleUpdateMessage" |
||||||
|
></time-data> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<use-elect></use-elect> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<img |
||||||
|
:src="rightIndicatorSrc" |
||||||
|
class="right-Indicator" |
||||||
|
@click="togglePanel('right')" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div></div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import AllEnergy from "./components/allEnergy.vue"; |
||||||
|
import ColdSysEnergy from "./components/coldSysEnergy.vue"; |
||||||
|
import waterSysEnergy from "./components/waterSysEnergy.vue"; |
||||||
|
import useElect from "./components/useElect.vue"; |
||||||
|
import timeData from "./components/timeData.vue"; |
||||||
|
import { overView, getWeatherData, getRunTime } from "@/api/bigScreen"; |
||||||
|
import { getDay, getMonth, getYear } from "@/utils/datetime"; |
||||||
|
export default { |
||||||
|
name: "screen", |
||||||
|
components: { timeData, AllEnergy, ColdSysEnergy, waterSysEnergy, useElect }, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
nowTime: "", |
||||||
|
sharedIndex: "0", //默认为0 |
||||||
|
queryType: "day", //默认为day |
||||||
|
isLeftPanelOpen: true, // 默认显示左边内容 |
||||||
|
isRightPanelOpen: true, // 默认显示右边内容 |
||||||
|
leftIndicatorSrc: require("@/assets/images/left-arrow.png"), |
||||||
|
rightIndicatorSrc: require("@/assets/images/right-arrow.png"), |
||||||
|
viewMes: {}, |
||||||
|
dataTime: getDay(0), //默认为今天 |
||||||
|
}; |
||||||
|
}, |
||||||
|
created() { |
||||||
|
this.nowTimes(); |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.getMessage(); |
||||||
|
// this.getWeather(); |
||||||
|
// this.getRunData(); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
//显示当前时间(年月日时分秒) |
||||||
|
timeFormate(timeStamp) { |
||||||
|
let hh = |
||||||
|
new Date(timeStamp).getHours() < 10 |
||||||
|
? "0" + new Date(timeStamp).getHours() |
||||||
|
: new Date(timeStamp).getHours(); |
||||||
|
let mm = |
||||||
|
new Date(timeStamp).getMinutes() < 10 |
||||||
|
? "0" + new Date(timeStamp).getMinutes() |
||||||
|
: new Date(timeStamp).getMinutes(); |
||||||
|
let ss = |
||||||
|
new Date(timeStamp).getSeconds() < 10 |
||||||
|
? "0" + new Date(timeStamp).getSeconds() |
||||||
|
: new Date(timeStamp).getSeconds(); |
||||||
|
this.nowTime = hh + ":" + mm + ":" + ss; |
||||||
|
}, |
||||||
|
nowTimes() { |
||||||
|
this.timeFormate(new Date()); |
||||||
|
setInterval(this.nowTimes, 1000); |
||||||
|
this.clear(); |
||||||
|
}, |
||||||
|
clear() { |
||||||
|
clearInterval(this.nowTimes); |
||||||
|
this.nowTimes = null; |
||||||
|
}, |
||||||
|
// 进入系统 |
||||||
|
goSys() { |
||||||
|
this.$router.push("/"); |
||||||
|
}, |
||||||
|
// 退出系统 |
||||||
|
logout() { |
||||||
|
// 清除缓存 |
||||||
|
this.$store.dispatch("LogOut").then(() => { |
||||||
|
location.href = "/index"; |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 父子组件传值 |
||||||
|
handleUpdateMessage(message) { |
||||||
|
console.log("父组件接收的值", message); |
||||||
|
this.sharedIndex = message; |
||||||
|
if (this.sharedIndex === 0) { |
||||||
|
this.queryType = "day"; |
||||||
|
this.dataTime = getDay(0); |
||||||
|
} else if (this.sharedIndex === 1) { |
||||||
|
this.queryType = "month"; |
||||||
|
this.dataTime = getMonth(0); |
||||||
|
} else if (this.sharedIndex === 2) { |
||||||
|
this.queryType = "year"; |
||||||
|
this.dataTime = getYear(0); |
||||||
|
} |
||||||
|
this.getMessage(); |
||||||
|
}, |
||||||
|
togglePanel(val) { |
||||||
|
if (val === "left") { |
||||||
|
console.log("左边伸缩"); |
||||||
|
this.isLeftPanelOpen = !this.isLeftPanelOpen; |
||||||
|
// 切换图片路径,从左箭头切换到右箭头 |
||||||
|
if (this.isLeftPanelOpen) { |
||||||
|
this.leftIndicatorSrc = require("@/assets/images/left-arrow.png"); // 左 |
||||||
|
} else { |
||||||
|
this.leftIndicatorSrc = require("@/assets/images/right-arrow.png"); // 右 |
||||||
|
} |
||||||
|
} else if (val === "right") { |
||||||
|
console.log("右边伸缩"); |
||||||
|
this.indicatorSrc = require("@/assets/images/right-arrow.png"); |
||||||
|
this.isRightPanelOpen = !this.isRightPanelOpen; |
||||||
|
// 切换图片路径,从左箭头切换到右箭头 |
||||||
|
if (this.isRightPanelOpen) { |
||||||
|
this.rightIndicatorSrc = require("@/assets/images/right-arrow.png"); // 右 |
||||||
|
} else { |
||||||
|
this.rightIndicatorSrc = require("@/assets/images/left-arrow.png"); // 左 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
// 请求基本信息、冷源、热水系统数据 |
||||||
|
getMessage() { |
||||||
|
let data = { |
||||||
|
timeType: this.queryType, |
||||||
|
startTime: this.dataTime, |
||||||
|
endTime: this.dataTime, |
||||||
|
}; |
||||||
|
overView(data).then((res) => { |
||||||
|
console.log("基本信返回", res); |
||||||
|
if (res.code == 200) { |
||||||
|
let viewData = res.rows[0]; |
||||||
|
if (viewData.buildingArea > 10000) { |
||||||
|
let result = (viewData.buildingArea / 10000).toFixed(4); |
||||||
|
// 将结果转换为浮点数再转回字符串 |
||||||
|
result = parseFloat(result).toString(); |
||||||
|
viewData.buildingArea = result + "万"; |
||||||
|
} |
||||||
|
this.viewMes = viewData; |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 获取天气数据 |
||||||
|
getWeather() { |
||||||
|
getWeatherData().then((res) => { |
||||||
|
console.log("天气返回", res); |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 获取运行时间 |
||||||
|
getRunData() { |
||||||
|
getRunTime().then((res) => { |
||||||
|
console.log("运行时间返回", res); |
||||||
|
}); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style rel="stylesheet/scss" lang="scss"> |
||||||
|
/* 定义呼吸灯动画 */ |
||||||
|
@keyframes blink { |
||||||
|
0% { |
||||||
|
opacity: 0.2; |
||||||
|
} |
||||||
|
50% { |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
100% { |
||||||
|
opacity: 0.2; |
||||||
|
} |
||||||
|
} |
||||||
|
.loginD { |
||||||
|
background-color: #062140; |
||||||
|
background-image: url("../../assets/images/bigscreen.png"); |
||||||
|
background-size: 100% 100%; |
||||||
|
background-repeat: no-repeat; |
||||||
|
width: 100%; |
||||||
|
min-height: 100vh; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
position: relative; |
||||||
|
padding-bottom: 20px; |
||||||
|
.sys-title { |
||||||
|
position: absolute; |
||||||
|
top: 0.13rem; |
||||||
|
font-family: YouSheBiaoTiHei; |
||||||
|
font-size: 0.4rem; |
||||||
|
letter-spacing: 0.03rem; |
||||||
|
text-shadow: 0px 2px 1px rgba(255, 255, 255, 0.3); |
||||||
|
background-image: linear-gradient(to bottom, #ffffff, #b0dbff); |
||||||
|
background-clip: text; |
||||||
|
-webkit-background-clip: text; |
||||||
|
color: transparent; |
||||||
|
} |
||||||
|
.day{ |
||||||
|
position: absolute; |
||||||
|
top: 0.43rem; |
||||||
|
left: 5rem; |
||||||
|
color: #ffffff; |
||||||
|
font-size: 0.18rem; |
||||||
|
} |
||||||
|
.set { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
font-family: SourceHanSansCN-Regular; |
||||||
|
font-size: 0.24rem; |
||||||
|
font-weight: normal; |
||||||
|
font-stretch: normal; |
||||||
|
letter-spacing: 0.03rem; |
||||||
|
color: #ffffff; |
||||||
|
position: absolute; |
||||||
|
top: 0.44rem; |
||||||
|
right: 0.7rem; |
||||||
|
.icon_time { |
||||||
|
width: 0.22rem; |
||||||
|
height: 0.22rem; |
||||||
|
margin-right: 0.08rem; |
||||||
|
} |
||||||
|
.icon_home { |
||||||
|
width: 0.3rem; |
||||||
|
height: 0.27rem; |
||||||
|
margin: 0 0.25rem 0 0.27rem; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
.icon_dianyuan { |
||||||
|
width: 0.24rem; |
||||||
|
height: 0.26rem; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
} |
||||||
|
.loginD_img_top { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
width: 18.27rem; |
||||||
|
height: 1.13rem; |
||||||
|
} |
||||||
|
.loginD_img_down { |
||||||
|
position: absolute; |
||||||
|
bottom: 0; |
||||||
|
width: 18.66rem; |
||||||
|
} |
||||||
|
.title-left { |
||||||
|
width: calc(100% - 30px); |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
.special-div { |
||||||
|
margin-bottom: 17px; |
||||||
|
} |
||||||
|
.screen-page { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: stretch; |
||||||
|
width: calc(100% - 122px); |
||||||
|
margin-top: 86px; |
||||||
|
.screen-left { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
width: 433px; |
||||||
|
position: relative; |
||||||
|
.left-Indicator { |
||||||
|
position: absolute; |
||||||
|
right: -90px; |
||||||
|
width: 60px; |
||||||
|
height: 40px; |
||||||
|
cursor: pointer; |
||||||
|
top: 50%; /* 垂直居中对齐 */ |
||||||
|
transform: translateY(-50%); /* 调整垂直对齐 */ |
||||||
|
transition: transform 1s ease; |
||||||
|
} |
||||||
|
.left-Indicator:hover { |
||||||
|
animation: blink 1s infinite; |
||||||
|
} |
||||||
|
} |
||||||
|
.screen-right { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
width: 433px; |
||||||
|
position: relative; |
||||||
|
.message { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
flex-wrap: wrap; |
||||||
|
justify-content: flex-start; |
||||||
|
margin-top: 29px; |
||||||
|
font-family: SourceHanSansCN-Regular; |
||||||
|
font-size: 16px; |
||||||
|
font-weight: normal; |
||||||
|
font-stretch: normal; |
||||||
|
letter-spacing: 0px; |
||||||
|
color: #ffffff; |
||||||
|
.message-li { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
width: calc(33.33% - 32px); |
||||||
|
margin: 0 16px; |
||||||
|
// margin-bottom: 22px; |
||||||
|
.message-data { |
||||||
|
font-family: DIN-Bold; |
||||||
|
font-size: 20px; |
||||||
|
letter-spacing: 0px; |
||||||
|
color: #ffffff; |
||||||
|
margin-bottom: 3px; |
||||||
|
} |
||||||
|
.message-img { |
||||||
|
width: 100px; |
||||||
|
height: 99px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.right-Indicator { |
||||||
|
position: absolute; |
||||||
|
left: -90px; |
||||||
|
width: 60px; |
||||||
|
height: 40px; |
||||||
|
cursor: pointer; |
||||||
|
top: 50%; /* 垂直居中对齐 */ |
||||||
|
transform: translateY(-50%); /* 调整垂直对齐 */ |
||||||
|
transition: transform 1s ease; |
||||||
|
} |
||||||
|
.right-Indicator:hover { |
||||||
|
animation: blink 1s infinite; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.screen-left { |
||||||
|
transition: width 0.3s ease; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-left.collapsed .showLeftConent { |
||||||
|
// width: 0 !important; |
||||||
|
// overflow: hidden; |
||||||
|
display: none; |
||||||
|
} |
||||||
|
.screen-right.collapsed .showRightConent { |
||||||
|
// width: 0 !important; |
||||||
|
// overflow: hidden; |
||||||
|
display: none; |
||||||
|
} |
||||||
|
.screen-left.collapsed .left-Indicator { |
||||||
|
right: auto !important; |
||||||
|
left: 0px !important; |
||||||
|
} |
||||||
|
.screen-right.collapsed .right-Indicator { |
||||||
|
left: auto !important; |
||||||
|
right: 0px !important; |
||||||
|
} |
||||||
|
@media (max-width: 1170px) { |
||||||
|
.screen-page { |
||||||
|
width: calc(100% - 60px) !important; |
||||||
|
.screen-left { |
||||||
|
transform: scale(0.9); |
||||||
|
transform-origin: top left; |
||||||
|
} |
||||||
|
.screen-right { |
||||||
|
transform: scale(0.9); |
||||||
|
transform-origin: top right; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
@media (max-width: 1060px) { |
||||||
|
.screen-page { |
||||||
|
width: calc(100% - 40px) !important; |
||||||
|
.screen-left { |
||||||
|
transform: scale(0.8); |
||||||
|
transform-origin: top left; |
||||||
|
} |
||||||
|
.screen-right { |
||||||
|
transform: scale(0.8); |
||||||
|
transform-origin: top right; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,429 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<div class="charts" ref="chart_ref"></div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import * as echarts from "echarts"; |
||||||
|
export default { |
||||||
|
props: { |
||||||
|
viewMes: { |
||||||
|
type: Object, |
||||||
|
default: () => ({}), |
||||||
|
}, |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
chartInstance: null, |
||||||
|
option: {}, |
||||||
|
energyMes:{} |
||||||
|
}; |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
viewMes: { |
||||||
|
immediate: true, // 页面加载时立即触发一次监听 |
||||||
|
handler(newVal) { |
||||||
|
if (Object.keys(newVal).length > 0) { |
||||||
|
console.log("newval", newVal); |
||||||
|
this.energyMes = newVal; |
||||||
|
this.$nextTick(() => { |
||||||
|
this.echartsData(); |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.initChart(); |
||||||
|
window.addEventListener("resize", this.screenAdapter); |
||||||
|
this.screenAdapter(); |
||||||
|
}, |
||||||
|
destroyed() { |
||||||
|
//取消监听器 |
||||||
|
window.removeEventListener("resize", this.screenAdapter); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
echartsData() { |
||||||
|
console.log("父组件传过来的值", this.energyMes); |
||||||
|
if (this.energyMes) { |
||||||
|
const titleFontSize = (this.$refs.chart_ref.offsetWidth / 100) * 2; |
||||||
|
const colorList = ["#ffe21e", "#08c8ff", "#0882ff", "#2df499"]; // 提取颜色列表 |
||||||
|
const adapterOption = { |
||||||
|
tooltip: { |
||||||
|
trigger: "item", |
||||||
|
formatter: "{a} <br/>{b} : {c} ({d}%)", |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
itemWidth: titleFontSize, |
||||||
|
itemHeight: titleFontSize, |
||||||
|
itemGap: titleFontSize * 2, |
||||||
|
formatter: function (name) { |
||||||
|
var arr = []; |
||||||
|
let data = adapterOption.series[0].data; |
||||||
|
var index = 0; |
||||||
|
var total = 0; |
||||||
|
// 计算总和 |
||||||
|
for (var i = 0; i < data.length; i++) { |
||||||
|
total += data[i].value; |
||||||
|
if (data[i].name == name) { |
||||||
|
index = i; |
||||||
|
} |
||||||
|
} |
||||||
|
// 检查当前项的值是否为 0 |
||||||
|
var percentage = |
||||||
|
data[index].value === 0 |
||||||
|
? "0.00" |
||||||
|
: ((data[index].value / total) * 100).toFixed(2); |
||||||
|
arr.push( |
||||||
|
"{name|" + name + "}", |
||||||
|
"{text|" + " " + ":" + " " + "}", |
||||||
|
"{value|" + data[index].value + " " + "}", |
||||||
|
"{percentage|" + " " + percentage + "%}" |
||||||
|
); |
||||||
|
return arr.join(""); |
||||||
|
}, |
||||||
|
textStyle: { |
||||||
|
color: function (name) { |
||||||
|
const dataSeries = adapterOption.series[1].data; // 数据圆的data |
||||||
|
const index = dataSeries.findIndex( |
||||||
|
(item) => item.name === name |
||||||
|
); |
||||||
|
const colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"]; // 数据圆的颜色列表 |
||||||
|
return colorList[index]; |
||||||
|
}, |
||||||
|
rich: { |
||||||
|
name: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
}, |
||||||
|
text: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
}, |
||||||
|
value: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
// color: function (params) { |
||||||
|
// let data = adapterOption.series[1].data; |
||||||
|
// return data.itemStyle.color({ dataIndex: params.dataIndex }); |
||||||
|
// }, |
||||||
|
}, |
||||||
|
percentage: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
// color: function (params) { |
||||||
|
// let data = adapterOption.series[1].data; |
||||||
|
// return data.itemStyle.color({ dataIndex: params.dataIndex }); |
||||||
|
// }, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "数据详情:", |
||||||
|
data: [ |
||||||
|
{ value: this.energyMes.totalEle, name: "耗电量标准煤" }, |
||||||
|
{ value: this.energyMes.totalEle, name: "用水量标准煤" }, |
||||||
|
{ value: this.energyMes.totalEle, name: "产冷量标准煤" }, |
||||||
|
{ value: this.energyMes.totalEle, name: "蒸汽量标准煤" }, |
||||||
|
], |
||||||
|
itemStyle: { |
||||||
|
color: function (params) { |
||||||
|
var colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"]; |
||||||
|
return colorList[params.dataIndex]; |
||||||
|
}, |
||||||
|
// borderWidth: 5, |
||||||
|
borderColor: "#002a56", |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
data: [ |
||||||
|
{ value: this.energyMes.totalEle, name: "耗电量标准煤" }, |
||||||
|
{ value: this.energyMes.totalEle, name: "用水量标准煤" }, |
||||||
|
{ value: this.energyMes.totalEle, name: "产冷量标准煤" }, |
||||||
|
{ value: this.energyMes.totalEle, name: "蒸汽量标准煤" }, |
||||||
|
], |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
this.chartInstance.resize(); |
||||||
|
} else { |
||||||
|
const titleFontSize = (this.$refs.chart_ref.offsetWidth / 100) * 2; |
||||||
|
const adapterOption = { |
||||||
|
tooltip: { |
||||||
|
trigger: "item", |
||||||
|
formatter: "{a} <br/>{b} : {c} ({d}%)", |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
itemWidth: titleFontSize, |
||||||
|
itemHeight: titleFontSize, |
||||||
|
itemGap: titleFontSize * 2, |
||||||
|
formatter: function (name) { |
||||||
|
var arr = []; |
||||||
|
let data = adapterOption.series[0].data; |
||||||
|
var index = 0; |
||||||
|
var total = 0; |
||||||
|
// 计算总和 |
||||||
|
for (var i = 0; i < data.length; i++) { |
||||||
|
total += data[i].value; |
||||||
|
if (data[i].name == name) { |
||||||
|
index = i; |
||||||
|
} |
||||||
|
} |
||||||
|
// 检查当前项的值是否为 0 |
||||||
|
var percentage = |
||||||
|
data[index].value === 0 |
||||||
|
? "0.00" |
||||||
|
: ((data[index].value / total) * 100).toFixed(2); |
||||||
|
arr.push( |
||||||
|
"{name|" + name + "}", |
||||||
|
"{text|" + " " + ":" + " " + "}", |
||||||
|
"{value|" + data[index].value + " " + "}", |
||||||
|
"{percentage|" + " " + percentage + "%}" |
||||||
|
); |
||||||
|
return arr.join(""); |
||||||
|
}, |
||||||
|
textStyle: { |
||||||
|
color: function (name) { |
||||||
|
const dataSeries = adapterOption.series[1].data; // 数据圆的data |
||||||
|
const index = dataSeries.findIndex( |
||||||
|
(item) => item.name === name |
||||||
|
); |
||||||
|
const colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"]; // 数据圆的颜色列表 |
||||||
|
return colorList[index]; |
||||||
|
}, |
||||||
|
rich: { |
||||||
|
name: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
}, |
||||||
|
text: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
}, |
||||||
|
value: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
// color: function (params) { |
||||||
|
// let data = adapterOption.series[1].data; |
||||||
|
// return data.itemStyle.color({ dataIndex: params.dataIndex }); |
||||||
|
// }, |
||||||
|
}, |
||||||
|
percentage: { |
||||||
|
align: "left", |
||||||
|
fontSize: titleFontSize * 1.6, |
||||||
|
// color: function (params) { |
||||||
|
// let data = adapterOption.series[1].data; |
||||||
|
// return data.itemStyle.color({ dataIndex: params.dataIndex }); |
||||||
|
// }, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "数据详情:", |
||||||
|
data: [ |
||||||
|
{ value: 0, name: "耗电量标准煤" }, |
||||||
|
{ value: 0, name: "用水量标准煤" }, |
||||||
|
{ value: 0, name: "产冷量标准煤" }, |
||||||
|
{ value: 0, name: "蒸汽量标准煤" }, |
||||||
|
], |
||||||
|
itemStyle: { |
||||||
|
color: function (params) { |
||||||
|
var colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"]; |
||||||
|
return colorList[params.dataIndex]; |
||||||
|
}, |
||||||
|
// borderWidth: 5, |
||||||
|
borderColor: "#002a56", |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
data: [ |
||||||
|
{ value: 0, name: "耗电量标准煤" }, |
||||||
|
{ value: 0, name: "用水量标准煤" }, |
||||||
|
{ value: 0, name: "产冷量标准煤" }, |
||||||
|
{ value: 0, name: "蒸汽量标准煤" }, |
||||||
|
], |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
this.chartInstance.resize(); |
||||||
|
} |
||||||
|
}, |
||||||
|
// 折线图自适应+ 根据按钮切换图例仅限一条且不可点击+ 折线图数据 |
||||||
|
screenAdapter() { |
||||||
|
//自己定义的比较合适的适配大小,2.6 mes_ref是图表盒子 |
||||||
|
const titleFontSize = this.$refs.chart_ref.offsetWidth / 40; |
||||||
|
//因为option可以多次配置的,所以这里的option只需要写 需要配置大小的相关数据 |
||||||
|
const adapterOption = { |
||||||
|
title: { |
||||||
|
subtextStyle: { |
||||||
|
fontSize: titleFontSize * 1.2, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
//记得重新给配置项给实例对象。只要实例对象.chartInstance不变,option就可以多次配置不同的条件。也可以配置一个dataoption只写需要从后台请求的数据相关 |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
//手动的调用图标对象的resize才能产生效果 |
||||||
|
this.chartInstance.resize(); |
||||||
|
}, |
||||||
|
//初始化chartInstance对象 |
||||||
|
initChart() { |
||||||
|
this.chartInstance = echarts.init(this.$refs.chart_ref); |
||||||
|
this.option = { |
||||||
|
//环形图中间文字 |
||||||
|
title: { |
||||||
|
subtext: "总标准煤", |
||||||
|
textStyle: { |
||||||
|
color: "#ffffff", |
||||||
|
}, |
||||||
|
subtextStyle: { |
||||||
|
color: "#ffffff", |
||||||
|
}, |
||||||
|
textAlign: "center", |
||||||
|
x: "27%", |
||||||
|
y: "36%", //距离上边的距离 |
||||||
|
}, |
||||||
|
tooltip: { |
||||||
|
trigger: "item", |
||||||
|
formatter: "{a} <br/>{b} : {c} ({d}%)", |
||||||
|
}, |
||||||
|
//图例 |
||||||
|
legend: { |
||||||
|
orient: "vertical", // 垂直排列 |
||||||
|
right: "4%", // 距离右边10% |
||||||
|
top: "middle", // 垂直居中 |
||||||
|
//图例文字颜色 |
||||||
|
textStyle: { |
||||||
|
color: "#ffffff", |
||||||
|
// fontSize: 18, |
||||||
|
}, |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
// 数据圆 |
||||||
|
{ |
||||||
|
name: "数据详情:", |
||||||
|
type: "pie", |
||||||
|
radius: ["60%", "72%"], |
||||||
|
center: ["28%", "44%"], |
||||||
|
avoidLabelOverlap: false, |
||||||
|
label: { |
||||||
|
show: false, |
||||||
|
position: "center", |
||||||
|
}, |
||||||
|
labelLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
itemStyle: { |
||||||
|
color: function (params) { |
||||||
|
var colorList = ["#08c8ff", "#2df499", "#ffe21e", "#0882ff"]; |
||||||
|
return colorList[params.dataIndex]; |
||||||
|
}, |
||||||
|
borderWidth: 5, |
||||||
|
borderColor: "#002a56", |
||||||
|
}, |
||||||
|
z: 10, //设置层级更高,否则会被阴影圆遮住 |
||||||
|
}, |
||||||
|
// 阴影圆 |
||||||
|
{ |
||||||
|
type: "pie", |
||||||
|
radius: ["50%", "62%"], |
||||||
|
center: ["28%", "44%"], |
||||||
|
avoidLabelOverlap: false, |
||||||
|
label: { |
||||||
|
show: false, |
||||||
|
position: "center", |
||||||
|
}, |
||||||
|
silent: true, |
||||||
|
labelLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
//颜色 |
||||||
|
itemStyle: { |
||||||
|
color: function (colors) { |
||||||
|
var colorList = ["#024e7d", "#09596b", "#385f5c", "#02427f"]; |
||||||
|
return colorList[colors.dataIndex]; |
||||||
|
}, |
||||||
|
}, |
||||||
|
z: 15, |
||||||
|
}, |
||||||
|
// 内圈边框 |
||||||
|
{ |
||||||
|
// 颜色 |
||||||
|
color: ["#305376"], |
||||||
|
type: "pie", |
||||||
|
silent: true, //鼠标移入不显示内容,不触发鼠标事件 |
||||||
|
// hoverAnimation: false, //鼠标移入不放大,此属性已被废弃 |
||||||
|
// 使用emphasis.scale 是否开启高亮后扇区的放大效果,默认true |
||||||
|
// 这里开启silent: true, 就达到效果了 |
||||||
|
// center与非内圈一致 |
||||||
|
radius: ["38%", "39%"], |
||||||
|
center: ["28%", "44%"], |
||||||
|
label: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 0, |
||||||
|
name: "", |
||||||
|
itemStyle: {}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
// 最里面渐变小圆 |
||||||
|
{ |
||||||
|
// 颜色 |
||||||
|
type: "pie", |
||||||
|
silent: true, //鼠标移入不显示内容,不触发鼠标事件 |
||||||
|
// hoverAnimation: false, //鼠标移入不放大,此属性已被废弃 |
||||||
|
// 使用emphasis.scale 是否开启高亮后扇区的放大效果,默认true |
||||||
|
// 这里开启silent: true, 就达到效果了 |
||||||
|
// center与非内圈一致 |
||||||
|
radius: ["0%", "38%"], |
||||||
|
center: ["28%", "44%"], |
||||||
|
label: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 0, |
||||||
|
name: "", |
||||||
|
itemStyle: {}, |
||||||
|
}, |
||||||
|
], |
||||||
|
itemStyle: { |
||||||
|
color: { |
||||||
|
type: "linear", |
||||||
|
x: 0, |
||||||
|
y: 0, |
||||||
|
x2: 1, |
||||||
|
y2: 1, |
||||||
|
colorStops: [ |
||||||
|
{ offset: 0, color: "#002a55" }, // 0% 处的颜色 |
||||||
|
{ offset: 1, color: "#0a457a" }, // 100% 处的颜色 |
||||||
|
], |
||||||
|
global: false, // 缺省为 false |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
//把配置项给实例对象 |
||||||
|
this.chartInstance.setOption(this.option, true); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
.charts { |
||||||
|
margin-top: 30px; |
||||||
|
width: 100%; |
||||||
|
height: 200px; |
||||||
|
margin-top: 20px; |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,598 @@ |
|||||||
|
<template> |
||||||
|
<div class="energy_content"> |
||||||
|
<div class="sys_charts" ref="sys_charts"></div> |
||||||
|
<div class="eer"> |
||||||
|
<div>用电量:{{energyMes.totalEle}}kw/h</div> |
||||||
|
<div>产冷量:{{energyMes.totalCold}}kwh</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import * as echarts from "echarts"; |
||||||
|
import { eventBus } from "@/utils/evenBus"; |
||||||
|
import { overView } from "@/api/bigScreen"; |
||||||
|
import { getDay, getMonth, getYear } from "@/utils/datetime"; |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
chartInstance: null, |
||||||
|
option: {}, |
||||||
|
isShowModule: false, |
||||||
|
energyCostText: "eer数据", |
||||||
|
dateUse: "", |
||||||
|
useForm: { |
||||||
|
useData: 5, |
||||||
|
maxData: 10, //最大的刻度值 |
||||||
|
}, |
||||||
|
queryType: "day", //默认页面为day |
||||||
|
dataTime: "", |
||||||
|
energyMes: {}, |
||||||
|
}; |
||||||
|
}, |
||||||
|
created() { |
||||||
|
eventBus.$on("data-sent-queryType", (data) => { |
||||||
|
this.queryType = data; |
||||||
|
console.log("得到的queryType为", this.queryType); |
||||||
|
this.getChartsData(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.initChart(); |
||||||
|
this.screenAdapter(); |
||||||
|
window.addEventListener("resize", this.screenAdapter); |
||||||
|
this.getChartsData(); |
||||||
|
}, |
||||||
|
destroyed() { |
||||||
|
//与mounted中的监听对应,在组件销毁的时候,需要将监听器取消掉 |
||||||
|
window.removeEventListener("resize", this.screenAdapter); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
// 计算颜色设置的函数 |
||||||
|
getAxisLineColor(useData, maxData) { |
||||||
|
// 计算阈值 |
||||||
|
// 真实值大于最大值的0.75才使用颜色渐变 |
||||||
|
const threshold = maxData * 0.75; |
||||||
|
|
||||||
|
// 判断实际值是否超过阈值 |
||||||
|
if (useData > threshold) { |
||||||
|
return [ |
||||||
|
[ |
||||||
|
useData / maxData, |
||||||
|
new echarts.graphic.LinearGradient(0, 0, 1, 0, [ |
||||||
|
{ offset: 0, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 0.6, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 1, color: "rgba(69, 235, 167,0.5)" }, |
||||||
|
]), |
||||||
|
], |
||||||
|
[1, "rgba(28,128,245,.0)"], |
||||||
|
]; |
||||||
|
} else { |
||||||
|
return [ |
||||||
|
[ |
||||||
|
useData / maxData, |
||||||
|
new echarts.graphic.LinearGradient(0, 0, 1, 0, [ |
||||||
|
{ offset: 0, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 0.5, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 1, color: "rgba(0,127,208,1)" }, |
||||||
|
]), |
||||||
|
], |
||||||
|
[1, "rgba(28,128,245,.0)"], |
||||||
|
]; |
||||||
|
} |
||||||
|
}, |
||||||
|
//初始化chartInstance2对象 折线图 |
||||||
|
initChart() { |
||||||
|
// 使用配置函数 |
||||||
|
const axisLineColor = this.getAxisLineColor( |
||||||
|
this.useForm.useData, |
||||||
|
this.useForm.maxData |
||||||
|
); |
||||||
|
this.chartInstance = echarts.init(this.$refs.sys_charts); |
||||||
|
// var dataArr = 80; |
||||||
|
this.option = { |
||||||
|
backgroundColor: "transparent", |
||||||
|
tooltip: { |
||||||
|
formatter: "{a} <br/>{b} : {c}", |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "内部动态阴影", |
||||||
|
type: "gauge", |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 180, |
||||||
|
endAngle: -0, |
||||||
|
radius: "155%", |
||||||
|
z: 1, |
||||||
|
splitNumber: 10, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: axisLineColor, |
||||||
|
// 相当于阴影部分的直径 |
||||||
|
// width: 80, |
||||||
|
}, |
||||||
|
}, |
||||||
|
axisLabel: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
splitLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
textStyle: { |
||||||
|
formatter: function (value) { |
||||||
|
if (value !== 0) { |
||||||
|
return parseInt(value); |
||||||
|
} else { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
}, |
||||||
|
offsetCenter: [0, 5], |
||||||
|
detail: { |
||||||
|
padding: [0, 0, 0, 0], |
||||||
|
// fontSize: titleFontSize * 1.2, |
||||||
|
color: "#EDFFFD", |
||||||
|
}, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
//标题 |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 新增的蓝色背景 |
||||||
|
name: "蓝色背景", |
||||||
|
type: "gauge", |
||||||
|
center: ["50%", "100%"], |
||||||
|
// 自定义起始角度 |
||||||
|
startAngle: 200, |
||||||
|
// 自定义结束角度 |
||||||
|
endAngle: -20, |
||||||
|
radius: "155%", |
||||||
|
z: 0, // 确保它在最底层 |
||||||
|
splitNumber: 10, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [ |
||||||
|
[1, "#01366d"], // 设置背景颜色为蓝色 |
||||||
|
], |
||||||
|
}, |
||||||
|
}, |
||||||
|
axisLabel: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
splitLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
textStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "内部大边框", |
||||||
|
type: "gauge", |
||||||
|
z: 2, |
||||||
|
min: 0, |
||||||
|
max: this.useForm.maxData, |
||||||
|
splitNumber: 10, |
||||||
|
radius: "180%", |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 180, |
||||||
|
endAngle: -0, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [[1, "#023B80"]], |
||||||
|
width: 3, |
||||||
|
// 阴影 |
||||||
|
shadowColor: "rgba(14,31,73)", |
||||||
|
shadowBlur: 6, |
||||||
|
shadowOffsetX: 0, |
||||||
|
}, |
||||||
|
}, |
||||||
|
tooltip: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisLabel: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
splitLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
detail: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
//标题 |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的圆", |
||||||
|
//指针上的圆 |
||||||
|
type: "pie", |
||||||
|
tooltip: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
emphasis: { |
||||||
|
scale: false, // 新版的配置 |
||||||
|
}, |
||||||
|
legendHoverLink: false, |
||||||
|
radius: ["0%", "70%"], |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 120, |
||||||
|
endAngle: -0, |
||||||
|
labelLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [[1, "#F2BF59"]], |
||||||
|
width: 3, |
||||||
|
// 阴影 |
||||||
|
shadowColor: "rgba(14,31,73)", |
||||||
|
shadowBlur: 60, |
||||||
|
shadowOffsetX: 0, |
||||||
|
}, |
||||||
|
}, |
||||||
|
label: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 120, |
||||||
|
itemStyle: { |
||||||
|
color: "#00223a", |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
z: 4, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的渐变圆", |
||||||
|
//指针上的圆-渐变 |
||||||
|
type: "pie", |
||||||
|
tooltip: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
emphasis: { |
||||||
|
scale: false, // 新版的配置 |
||||||
|
}, |
||||||
|
legendHoverLink: false, |
||||||
|
radius: ["0%", "70%"], |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 120, |
||||||
|
endAngle: 0, |
||||||
|
labelLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [[1, "#F2BF59"]], |
||||||
|
width: 3, |
||||||
|
// 阴影 |
||||||
|
shadowColor: "rgba(14,31,73)", |
||||||
|
shadowBlur: 60, |
||||||
|
shadowOffsetX: 0, |
||||||
|
}, |
||||||
|
}, |
||||||
|
z: 5, |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 指针 数据 |
||||||
|
name: this.energyCostText, |
||||||
|
type: "gauge", |
||||||
|
radius: "175%", |
||||||
|
center: ["50%", "100%"], |
||||||
|
min: 0, //最小刻度 |
||||||
|
max: this.useForm.maxData, //最大刻度 |
||||||
|
splitNumber: 0, //刻度数量 |
||||||
|
startAngle: 180, |
||||||
|
endAngle: -0, |
||||||
|
axisLine: { |
||||||
|
show: false, |
||||||
|
}, //仪表盘轴线 |
||||||
|
axisLabel: { |
||||||
|
show: true, |
||||||
|
color: "rgba(4,112,212,1)", |
||||||
|
// distance: 16, |
||||||
|
// fontSize: 12, |
||||||
|
formatter: (value) => { |
||||||
|
// 仅显示 0 和最大值 |
||||||
|
if (value === 0 || value == this.useForm.maxData) { |
||||||
|
// 替换 100 为你的最大值 |
||||||
|
return value; |
||||||
|
} |
||||||
|
return ""; |
||||||
|
}, |
||||||
|
}, //刻度标签-数字。 |
||||||
|
axisTick: { |
||||||
|
show: true, |
||||||
|
// splitNumber: 5, |
||||||
|
lineStyle: { |
||||||
|
color: "rgba(4,112,212,1)", //用颜色渐变函数不起作用 |
||||||
|
// width: 3, |
||||||
|
}, |
||||||
|
// length: 6, |
||||||
|
}, //刻度样式 |
||||||
|
splitLine: { |
||||||
|
show: true, |
||||||
|
// length: 6, |
||||||
|
lineStyle: { |
||||||
|
color: "rgba(106, 104, 228, 0.5)", //用颜色渐变函数不起作用 |
||||||
|
}, |
||||||
|
}, //分隔线样式 |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
detail: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
//标题 |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
name: this.dateUse, |
||||||
|
value: this.useForm.useData, |
||||||
|
}, |
||||||
|
], |
||||||
|
itemStyle: { |
||||||
|
color: "#EDF85B", |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: true, |
||||||
|
length: "60%", |
||||||
|
radius: "30%", |
||||||
|
shape: "triangle", // 使用内置的箭头形状 |
||||||
|
// width: 15, //指针粗细 |
||||||
|
itemStyle: { |
||||||
|
color: "rgb(3, 105, 206,0.5)", // 指针的颜色 |
||||||
|
// shadowColor: "rgb(104, 194, 247, 1)", // 朦胧光的颜色 |
||||||
|
shadowBlur: 20, // 朦胧光的模糊度 |
||||||
|
}, |
||||||
|
}, |
||||||
|
animationDuration: 4000, |
||||||
|
z: 2, |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
//把配置项给实例对象 |
||||||
|
this.chartInstance.setOption(this.option, true); |
||||||
|
}, |
||||||
|
screenAdapter() { |
||||||
|
const titleFontSize = this.$refs.sys_charts.offsetWidth / 18; |
||||||
|
const adapterOption = { |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "内部动态阴影", |
||||||
|
type: "gauge", |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize * 1, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "蓝色背景", |
||||||
|
type: "gauge", |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize * 1, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 指针 数据 |
||||||
|
name: this.energyCostText, |
||||||
|
axisLabel: { |
||||||
|
distance: titleFontSize, |
||||||
|
fontSize: titleFontSize / 4, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
distance: -(titleFontSize / 70), |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize / 20, |
||||||
|
}, |
||||||
|
length: titleFontSize / 5, |
||||||
|
}, //刻度样式 |
||||||
|
splitLine: { |
||||||
|
distance: -(titleFontSize / 70), |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize / 20, |
||||||
|
}, |
||||||
|
length: titleFontSize / 3.6, |
||||||
|
}, //分隔线样式 |
||||||
|
pointer: { |
||||||
|
width: titleFontSize / 2, //指针粗细 |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
this.chartInstance.resize(); |
||||||
|
}, |
||||||
|
// 请求的数据 |
||||||
|
getChartsData() { |
||||||
|
if (this.queryType === "day") { |
||||||
|
this.dataTime = getDay(0); |
||||||
|
} else if (this.queryType === "month") { |
||||||
|
this.dataTime = getMonth(0); |
||||||
|
} else if (this.queryType === "year") { |
||||||
|
this.dataTime = getYear(0); |
||||||
|
} |
||||||
|
let data = { |
||||||
|
timeType: this.queryType, |
||||||
|
startTime: this.dataTime, |
||||||
|
endTime: this.dataTime, |
||||||
|
systemType: "0", |
||||||
|
}; |
||||||
|
overView(data).then((res) => { |
||||||
|
console.log("两个系统参数返回", res); |
||||||
|
if (res.code == 200) { |
||||||
|
this.energyMes = res.rows[0]; |
||||||
|
this.useForm.maxData = 10; |
||||||
|
this.useForm.useData = res.rows[0].eer; |
||||||
|
let that = this; |
||||||
|
// 使用配置函数 |
||||||
|
const axisLineColor = this.getAxisLineColor( |
||||||
|
this.useForm.useData, |
||||||
|
this.useForm.maxData |
||||||
|
); |
||||||
|
const adapterOption = { |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "内部动态阴影", |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: axisLineColor, |
||||||
|
// 相当于阴影部分的直径 |
||||||
|
// width: 80, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "内部大边框", |
||||||
|
min: 0, |
||||||
|
max: this.useForm.maxData, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的圆", |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 5, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的渐变圆", |
||||||
|
label: { |
||||||
|
show: true, |
||||||
|
position: "center", // 文字显示在中心位置 |
||||||
|
offset: [0, -5], // 向上偏移 10 个单位 |
||||||
|
formatter: function () { |
||||||
|
// 返回 HTML 标签,使用 rich 里定义的样式 |
||||||
|
return `{line|${that.useForm.useData}}`; |
||||||
|
}, |
||||||
|
rich: { |
||||||
|
line: { |
||||||
|
color: "#fff", // 第二行文字颜色 |
||||||
|
fontSize: 20, // 第二行文字大小 |
||||||
|
lineHeight: 0, // 行高,实现间距 |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 0, |
||||||
|
itemStyle: { |
||||||
|
// 设置渐变颜色 |
||||||
|
color: { |
||||||
|
type: "linear", |
||||||
|
x: 0, |
||||||
|
y: 0, |
||||||
|
x2: 0, |
||||||
|
y2: 1, |
||||||
|
colorStops: [ |
||||||
|
{ |
||||||
|
offset: 0, |
||||||
|
color: "rgb(4,112,212)", // 顶部颜色 |
||||||
|
}, |
||||||
|
{ |
||||||
|
offset: 0.3, |
||||||
|
color: "rgba(0, 46, 93)", // 底部透明 |
||||||
|
}, |
||||||
|
], |
||||||
|
global: false, // 缺省为 false |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 指针 数据 |
||||||
|
name: this.energyCostText, |
||||||
|
max: this.useForm.maxData, //最大刻度 |
||||||
|
axisLabel: { |
||||||
|
formatter: (value) => { |
||||||
|
// 仅显示 0 和最大值 |
||||||
|
if (value === 0 || value == this.useForm.maxData) { |
||||||
|
// 替换 100 为你的最大值 |
||||||
|
return value; |
||||||
|
} |
||||||
|
return ""; |
||||||
|
}, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
name: this.dateUse, |
||||||
|
value: this.useForm.useData, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
//手动的调用图标对象的resize才能产生效果 |
||||||
|
this.chartInstance.resize(); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.energy_content { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
width: 100% !important; |
||||||
|
height: 100%; |
||||||
|
|
||||||
|
.sys_charts { |
||||||
|
width: 100%; |
||||||
|
height: 1.6rem; |
||||||
|
} |
||||||
|
.eer { |
||||||
|
width: 80%; |
||||||
|
color: #fff; |
||||||
|
font-size: 18px; |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
justify-content: space-between; |
||||||
|
margin: 10px 0; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,52 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<div class="choice"> |
||||||
|
<div |
||||||
|
class="mr20" |
||||||
|
v-for="(item, index) in timeData2" |
||||||
|
:key="index" |
||||||
|
@click="handleEnter(index, $event)" |
||||||
|
:class="{ timeStyle: currentIndex == index }" |
||||||
|
> |
||||||
|
{{ item.title }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
import { eventBus } from "@/utils/evenBus"; |
||||||
|
export default { |
||||||
|
props: ["currentIndex"], |
||||||
|
data() { |
||||||
|
return { |
||||||
|
timeData2: [{ title: "日" }, { title: "月" }, { title: "年" }], |
||||||
|
timeIndex2: 0, |
||||||
|
}; |
||||||
|
}, |
||||||
|
// watch: { |
||||||
|
// selectedIndex(newValue) { |
||||||
|
// this.timeIndex2 = newValue; |
||||||
|
// }, |
||||||
|
// }, |
||||||
|
methods: { |
||||||
|
handleEnter(index, event) { |
||||||
|
// event.stopPropagation(); // 阻止事件冒泡 |
||||||
|
// this.$emit("update:selectedIndex", index); |
||||||
|
this.timeIndex2 = index; |
||||||
|
let queryType = ""; |
||||||
|
if (index === 0) { |
||||||
|
queryType = "day"; |
||||||
|
} else if (index === 1) { |
||||||
|
queryType = "month"; |
||||||
|
} else if (index === 2) { |
||||||
|
queryType = "year"; |
||||||
|
} |
||||||
|
console.log("传值给父组件", index); |
||||||
|
this.$emit("update-message", index); |
||||||
|
//事件车传值,子组件可互相传值 |
||||||
|
eventBus.$emit("data-sent-queryType", queryType); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped></style> |
@ -0,0 +1,265 @@ |
|||||||
|
<template> |
||||||
|
<div class="energy_content"> |
||||||
|
<div class="sys_charts" ref="sys_charts"></div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import * as echarts from "echarts"; |
||||||
|
import { getDay, getMonth, getYear } from "@/utils/datetime"; |
||||||
|
import { systemTrend } from "@/api/bigScreen"; |
||||||
|
import { eventBus } from "@/utils/evenBus"; |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
chartInstance: null, |
||||||
|
option: {}, |
||||||
|
queryType: "day", //默认页面为day |
||||||
|
dataTime: "", |
||||||
|
energyMes: {}, |
||||||
|
}; |
||||||
|
}, |
||||||
|
created() { |
||||||
|
eventBus.$on("data-sent-queryType", (data) => { |
||||||
|
this.queryType = data; |
||||||
|
console.log("得到的queryType为", this.queryType); |
||||||
|
this.getChartsData(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.initChart(); |
||||||
|
this.screenAdapter(); |
||||||
|
window.addEventListener("resize", this.screenAdapter); |
||||||
|
this.getChartsData(); |
||||||
|
}, |
||||||
|
destroyed() { |
||||||
|
//与mounted中的监听对应,在组件销毁的时候,需要将监听器取消掉 |
||||||
|
window.removeEventListener("resize", this.screenAdapter); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
// 折线图自适应+ 根据按钮切换图例仅限一条且不可点击+ 折线图数据 |
||||||
|
screenAdapter() { |
||||||
|
//自己定义的比较合适的适配大小,2.6 mes_ref是图表盒子 |
||||||
|
const titleFontSize = this.$refs.sys_charts.offsetWidth / 130; |
||||||
|
//因为option可以多次配置的,所以这里的option只需要写 需要配置大小的相关数据 |
||||||
|
const adapterOption = {}; |
||||||
|
//记得重新给配置项给实例对象。只要实例对象.chartInstance不变,option就可以多次配置不同的条件。也可以配置一个dataoption只写需要从后台请求的数据相关 |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
//手动的调用图标对象的resize才能产生效果 |
||||||
|
this.chartInstance.resize(); |
||||||
|
}, |
||||||
|
//初始化chartInstance对象 |
||||||
|
initChart() { |
||||||
|
this.chartInstance = echarts.init(this.$refs.sys_charts); |
||||||
|
this.option = { |
||||||
|
tooltip: { |
||||||
|
trigger: "item", |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
top: "10%", |
||||||
|
left: "4%", |
||||||
|
right: "6%", |
||||||
|
bottom: "3%", |
||||||
|
containLabel: true, |
||||||
|
}, |
||||||
|
xAxis: { |
||||||
|
type: "category", |
||||||
|
//设置为true代表离零刻度间隔一段距离 |
||||||
|
boundaryGap: true, |
||||||
|
// 修饰刻度标签的颜色即x坐标数据 |
||||||
|
axisLabel: { |
||||||
|
// interval: 0, //强制显示所有x轴数据 |
||||||
|
// rotate: 30, //x轴坐标字体倾斜30度 |
||||||
|
color: "rgba(255, 255, 255, 1)", |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
show: false, // 不显示坐标轴刻度线 |
||||||
|
}, |
||||||
|
// x坐标轴的颜色 |
||||||
|
axisLine: { |
||||||
|
show: true, |
||||||
|
lineStyle: { |
||||||
|
color: "#365576", |
||||||
|
}, |
||||||
|
}, |
||||||
|
splitLine: { |
||||||
|
lineStyle: { |
||||||
|
color: "#e2e6f0", |
||||||
|
}, |
||||||
|
}, //x轴分割线 |
||||||
|
}, |
||||||
|
yAxis: { |
||||||
|
min: 0, |
||||||
|
// max:20, |
||||||
|
// // // min:'dataMin', |
||||||
|
// // // max:'dataMax', |
||||||
|
// name: "kwh", // 第一个 y 轴的单位描述 |
||||||
|
// 设置 name 的样式 |
||||||
|
nameTextStyle: { |
||||||
|
color: "rgba(255, 255, 255, 1)", |
||||||
|
fontSize: 12, |
||||||
|
}, |
||||||
|
miniInterval: 5, |
||||||
|
type: "value", |
||||||
|
// 修饰刻度标签的颜色即y坐标数据 |
||||||
|
axisLabel: { |
||||||
|
color: "rgba(255, 255, 255, 1)", |
||||||
|
}, |
||||||
|
// 显示y坐标轴 |
||||||
|
axisLine: { |
||||||
|
show: true, |
||||||
|
lineStyle: { |
||||||
|
color: "#365576", // 设置 y 轴线的颜色 |
||||||
|
}, |
||||||
|
}, |
||||||
|
//y轴分割线段数 |
||||||
|
// splitNumber: 10, |
||||||
|
// 修改y轴分割线的颜色 |
||||||
|
splitLine: { |
||||||
|
lineStyle: { |
||||||
|
color: "#1a3d62", // 设置分割线的颜色 |
||||||
|
type: "dashed", // 设置分割线为虚线 |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
type: "line", |
||||||
|
// 拐点大小 |
||||||
|
symbolSize: 8, |
||||||
|
//折线颜色 |
||||||
|
itemStyle: { |
||||||
|
color: "#00CED1", //折线的颜色 |
||||||
|
}, |
||||||
|
lineStyle: { |
||||||
|
color: "#00CED1", //折线点的颜色 |
||||||
|
}, |
||||||
|
areaStyle: { |
||||||
|
color: { |
||||||
|
type: "linear", |
||||||
|
x: 0, |
||||||
|
y: 0, |
||||||
|
x2: 0, |
||||||
|
y2: 1, |
||||||
|
colorStops: [ |
||||||
|
{ |
||||||
|
offset: 0, |
||||||
|
color: "rgba(0, 206, 209, 0.5)", // 渐变起始颜色 |
||||||
|
}, |
||||||
|
{ |
||||||
|
offset: 1, |
||||||
|
color: "rgba(0, 206, 209, 0)", // 渐变结束颜色 |
||||||
|
}, |
||||||
|
], |
||||||
|
global: false, // 缺省为 false |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
//把配置项给实例对象 |
||||||
|
this.chartInstance.setOption(this.option, true); |
||||||
|
}, |
||||||
|
// 请求的数据 |
||||||
|
getChartsData() { |
||||||
|
if (this.queryType === "day") { |
||||||
|
this.dataTime = getDay(0); |
||||||
|
} else if (this.queryType === "month") { |
||||||
|
this.dataTime = getMonth(0); |
||||||
|
} else if (this.queryType === "year") { |
||||||
|
this.dataTime = getYear(0); |
||||||
|
} |
||||||
|
let data = { |
||||||
|
timeType: this.queryType, |
||||||
|
startTime: this.dataTime, |
||||||
|
endTime: this.dataTime, |
||||||
|
}; |
||||||
|
systemTrend(data).then((res) => { |
||||||
|
console.log("用电趋势返回", res); |
||||||
|
if (res.code == 200) { |
||||||
|
let adapterOption = {}; |
||||||
|
// 添加折线的配置 |
||||||
|
adapterOption = { |
||||||
|
tooltip: { |
||||||
|
trigger: "axis", |
||||||
|
// 自定义 tooltip 内容 |
||||||
|
formatter: function (params) { |
||||||
|
var res = params[0].name + "<br/>"; |
||||||
|
for (var i = 0, l = params.length; i < l; i++) { |
||||||
|
var seriesName = params[i].seriesName; |
||||||
|
var value = params[i].value; |
||||||
|
var marker = |
||||||
|
'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:' + |
||||||
|
params[i].color + |
||||||
|
'"></span>'; |
||||||
|
// 根据不同德seriesName 返回不同的单位 |
||||||
|
res += |
||||||
|
marker + |
||||||
|
seriesName + |
||||||
|
":" + |
||||||
|
'<span style="color: #000000; font-weight: bold;margin-left:5px">' + |
||||||
|
value + |
||||||
|
"</span><br>"; |
||||||
|
} |
||||||
|
return res; |
||||||
|
}, |
||||||
|
}, |
||||||
|
xAxis: { |
||||||
|
data: res.rows[0].timeStr, |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
data: res.rows[0].data, |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
//记得重新给配置项给实例对象。只要实例对象.chartInstance不变,option就可以多次配置不同的条件。也可以配置一个dataoption只写需要从后台请求的数据相关 |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
//手动的调用图标对象的resize才能产生效果 |
||||||
|
this.chartInstance.resize(); |
||||||
|
} else { |
||||||
|
let adapterOption = {}; |
||||||
|
// 添加折线的配置 |
||||||
|
adapterOption = { |
||||||
|
xAxis: { |
||||||
|
data: [], |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
data: [], |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
//记得重新给配置项给实例对象。只要实例对象.chartInstance不变,option就可以多次配置不同的条件。也可以配置一个dataoption只写需要从后台请求的数据相关 |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
//手动的调用图标对象的resize才能产生效果 |
||||||
|
this.chartInstance.resize(); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.energy_content { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
width: 100% !important; |
||||||
|
height: 100%; |
||||||
|
|
||||||
|
.sys_charts { |
||||||
|
width: 100%; |
||||||
|
height: 2rem; |
||||||
|
} |
||||||
|
.eer { |
||||||
|
font-size: 18px; |
||||||
|
margin-top: 25px; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,599 @@ |
|||||||
|
<template> |
||||||
|
<div class="energy_content"> |
||||||
|
<div class="sys_charts" ref="sys_charts"></div> |
||||||
|
<div class="eer"> |
||||||
|
<div>用电量:{{energyMes.totalEle}}kw/h</div> |
||||||
|
<div>用水量:{{energyMes.totalWater}}吨</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import * as echarts from "echarts"; |
||||||
|
import { eventBus } from "@/utils/evenBus"; |
||||||
|
import { overView } from "@/api/bigScreen"; |
||||||
|
import { getDay, getMonth, getYear } from "@/utils/datetime"; |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
chartInstance: null, |
||||||
|
option: {}, |
||||||
|
isShowModule: false, |
||||||
|
energyCostText: "eer数据", |
||||||
|
dateUse: "", |
||||||
|
useForm: { |
||||||
|
useData: 5, |
||||||
|
maxData: 10, //最大的刻度值 |
||||||
|
}, |
||||||
|
queryType: "day", //默认页面为day |
||||||
|
dataTime: "", |
||||||
|
energyMes: {}, |
||||||
|
}; |
||||||
|
}, |
||||||
|
created() { |
||||||
|
eventBus.$on("data-sent-queryType", (data) => { |
||||||
|
this.queryType = data; |
||||||
|
console.log("得到的queryType为", this.queryType); |
||||||
|
this.getChartsData(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.initChart(); |
||||||
|
this.screenAdapter(); |
||||||
|
window.addEventListener("resize", this.screenAdapter); |
||||||
|
this.getChartsData(); |
||||||
|
}, |
||||||
|
destroyed() { |
||||||
|
//与mounted中的监听对应,在组件销毁的时候,需要将监听器取消掉 |
||||||
|
window.removeEventListener("resize", this.screenAdapter); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
// 计算颜色设置的函数 |
||||||
|
getAxisLineColor(useData, maxData) { |
||||||
|
// 计算阈值 |
||||||
|
// 真实值大于最大值的0.75才使用颜色渐变 |
||||||
|
const threshold = maxData * 0.75; |
||||||
|
|
||||||
|
// 判断实际值是否超过阈值 |
||||||
|
if (useData > threshold) { |
||||||
|
return [ |
||||||
|
[ |
||||||
|
useData / maxData, |
||||||
|
new echarts.graphic.LinearGradient(0, 0, 1, 0, [ |
||||||
|
{ offset: 0, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 0.6, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 1, color: "rgba(69, 235, 167,0.5)" }, |
||||||
|
]), |
||||||
|
], |
||||||
|
[1, "rgba(28,128,245,.0)"], |
||||||
|
]; |
||||||
|
} else { |
||||||
|
return [ |
||||||
|
[ |
||||||
|
useData / maxData, |
||||||
|
new echarts.graphic.LinearGradient(0, 0, 1, 0, [ |
||||||
|
{ offset: 0, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 0.5, color: "rgba(0,127,208,1)" }, |
||||||
|
{ offset: 1, color: "rgba(0,127,208,1)" }, |
||||||
|
]), |
||||||
|
], |
||||||
|
[1, "rgba(28,128,245,.0)"], |
||||||
|
]; |
||||||
|
} |
||||||
|
}, |
||||||
|
//初始化chartInstance2对象 折线图 |
||||||
|
initChart() { |
||||||
|
// 使用配置函数 |
||||||
|
const axisLineColor = this.getAxisLineColor( |
||||||
|
this.useForm.useData, |
||||||
|
this.useForm.maxData |
||||||
|
); |
||||||
|
this.chartInstance = echarts.init(this.$refs.sys_charts); |
||||||
|
// var dataArr = 80; |
||||||
|
this.option = { |
||||||
|
backgroundColor: "transparent", |
||||||
|
tooltip: { |
||||||
|
formatter: "{a} <br/>{b} : {c}", |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "内部动态阴影", |
||||||
|
type: "gauge", |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 180, |
||||||
|
endAngle: -0, |
||||||
|
radius: "155%", |
||||||
|
z: 1, |
||||||
|
splitNumber: 10, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: axisLineColor, |
||||||
|
// 相当于阴影部分的直径 |
||||||
|
// width: 80, |
||||||
|
}, |
||||||
|
}, |
||||||
|
axisLabel: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
splitLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
textStyle: { |
||||||
|
formatter: function (value) { |
||||||
|
if (value !== 0) { |
||||||
|
return parseInt(value); |
||||||
|
} else { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
}, |
||||||
|
offsetCenter: [0, 5], |
||||||
|
detail: { |
||||||
|
padding: [0, 0, 0, 0], |
||||||
|
// fontSize: titleFontSize * 1.2, |
||||||
|
color: "#EDFFFD", |
||||||
|
}, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
//标题 |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 新增的蓝色背景 |
||||||
|
name: "蓝色背景", |
||||||
|
type: "gauge", |
||||||
|
center: ["50%", "100%"], |
||||||
|
// 自定义起始角度 |
||||||
|
startAngle: 200, |
||||||
|
// 自定义结束角度 |
||||||
|
endAngle: -20, |
||||||
|
radius: "155%", |
||||||
|
z: 0, // 确保它在最底层 |
||||||
|
splitNumber: 10, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [ |
||||||
|
[1, "#01366d"], // 设置背景颜色为蓝色 |
||||||
|
], |
||||||
|
}, |
||||||
|
}, |
||||||
|
axisLabel: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
splitLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
textStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "内部大边框", |
||||||
|
type: "gauge", |
||||||
|
z: 2, |
||||||
|
min: 0, |
||||||
|
max: this.useForm.maxData, |
||||||
|
splitNumber: 10, |
||||||
|
radius: "180%", |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 180, |
||||||
|
endAngle: -0, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [[1, "#023B80"]], |
||||||
|
width: 3, |
||||||
|
// 阴影 |
||||||
|
shadowColor: "rgba(14,31,73)", |
||||||
|
shadowBlur: 6, |
||||||
|
shadowOffsetX: 0, |
||||||
|
}, |
||||||
|
}, |
||||||
|
tooltip: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisLabel: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
splitLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
detail: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
//标题 |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的圆", |
||||||
|
//指针上的圆 |
||||||
|
type: "pie", |
||||||
|
tooltip: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
emphasis: { |
||||||
|
scale: false, // 新版的配置 |
||||||
|
}, |
||||||
|
legendHoverLink: false, |
||||||
|
radius: ["0%", "70%"], |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 120, |
||||||
|
endAngle: -0, |
||||||
|
labelLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [[1, "#F2BF59"]], |
||||||
|
width: 3, |
||||||
|
// 阴影 |
||||||
|
shadowColor: "rgba(14,31,73)", |
||||||
|
shadowBlur: 60, |
||||||
|
shadowOffsetX: 0, |
||||||
|
}, |
||||||
|
}, |
||||||
|
label: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 120, |
||||||
|
itemStyle: { |
||||||
|
color: "#00223a", |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
z: 4, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的渐变圆", |
||||||
|
//指针上的圆-渐变 |
||||||
|
type: "pie", |
||||||
|
tooltip: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
emphasis: { |
||||||
|
scale: false, // 新版的配置 |
||||||
|
}, |
||||||
|
legendHoverLink: false, |
||||||
|
radius: ["0%", "70%"], |
||||||
|
center: ["50%", "100%"], |
||||||
|
startAngle: 120, |
||||||
|
endAngle: 0, |
||||||
|
labelLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: [[1, "#F2BF59"]], |
||||||
|
width: 3, |
||||||
|
// 阴影 |
||||||
|
shadowColor: "rgba(14,31,73)", |
||||||
|
shadowBlur: 60, |
||||||
|
shadowOffsetX: 0, |
||||||
|
}, |
||||||
|
}, |
||||||
|
z: 5, |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 指针 数据 |
||||||
|
name: this.energyCostText, |
||||||
|
type: "gauge", |
||||||
|
radius: "175%", |
||||||
|
center: ["50%", "100%"], |
||||||
|
min: 0, //最小刻度 |
||||||
|
max: this.useForm.maxData, //最大刻度 |
||||||
|
splitNumber: 0, //刻度数量 |
||||||
|
startAngle: 180, |
||||||
|
endAngle: -0, |
||||||
|
axisLine: { |
||||||
|
show: false, |
||||||
|
}, //仪表盘轴线 |
||||||
|
axisLabel: { |
||||||
|
show: true, |
||||||
|
color: "rgba(4,112,212,1)", |
||||||
|
// distance: 16, |
||||||
|
// fontSize: 12, |
||||||
|
formatter: (value) => { |
||||||
|
// 仅显示 0 和最大值 |
||||||
|
if (value === 0 || value == this.useForm.maxData) { |
||||||
|
// 替换 100 为你的最大值 |
||||||
|
return value; |
||||||
|
} |
||||||
|
return ""; |
||||||
|
}, |
||||||
|
}, //刻度标签-数字。 |
||||||
|
axisTick: { |
||||||
|
show: true, |
||||||
|
// splitNumber: 5, |
||||||
|
lineStyle: { |
||||||
|
color: "rgba(4,112,212,1)", //用颜色渐变函数不起作用 |
||||||
|
// width: 3, |
||||||
|
}, |
||||||
|
// length: 6, |
||||||
|
}, //刻度样式 |
||||||
|
splitLine: { |
||||||
|
show: true, |
||||||
|
// length: 6, |
||||||
|
lineStyle: { |
||||||
|
color: "rgba(106, 104, 228, 0.5)", //用颜色渐变函数不起作用 |
||||||
|
}, |
||||||
|
}, //分隔线样式 |
||||||
|
itemStyle: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
detail: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
title: { |
||||||
|
//标题 |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
name: this.dateUse, |
||||||
|
value: this.useForm.useData, |
||||||
|
}, |
||||||
|
], |
||||||
|
itemStyle: { |
||||||
|
color: "#EDF85B", |
||||||
|
}, |
||||||
|
pointer: { |
||||||
|
show: true, |
||||||
|
length: "60%", |
||||||
|
radius: "30%", |
||||||
|
shape: "triangle", // 使用内置的箭头形状 |
||||||
|
// width: 15, //指针粗细 |
||||||
|
itemStyle: { |
||||||
|
color: "rgb(3, 105, 206,0.5)", // 指针的颜色 |
||||||
|
// shadowColor: "rgb(104, 194, 247, 1)", // 朦胧光的颜色 |
||||||
|
shadowBlur: 20, // 朦胧光的模糊度 |
||||||
|
}, |
||||||
|
}, |
||||||
|
animationDuration: 4000, |
||||||
|
z: 2, |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
//把配置项给实例对象 |
||||||
|
this.chartInstance.setOption(this.option, true); |
||||||
|
}, |
||||||
|
screenAdapter() { |
||||||
|
const titleFontSize = this.$refs.sys_charts.offsetWidth / 18; |
||||||
|
const adapterOption = { |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "内部动态阴影", |
||||||
|
type: "gauge", |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize * 1, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "蓝色背景", |
||||||
|
type: "gauge", |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize * 1, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 指针 数据 |
||||||
|
name: this.energyCostText, |
||||||
|
axisLabel: { |
||||||
|
distance: titleFontSize, |
||||||
|
fontSize: titleFontSize / 4, |
||||||
|
}, |
||||||
|
axisTick: { |
||||||
|
distance: -(titleFontSize / 70), |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize / 20, |
||||||
|
}, |
||||||
|
length: titleFontSize / 5, |
||||||
|
}, //刻度样式 |
||||||
|
splitLine: { |
||||||
|
distance: -(titleFontSize / 70), |
||||||
|
lineStyle: { |
||||||
|
width: titleFontSize / 20, |
||||||
|
}, |
||||||
|
length: titleFontSize / 3.6, |
||||||
|
}, //分隔线样式 |
||||||
|
pointer: { |
||||||
|
width: titleFontSize / 2, //指针粗细 |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
this.chartInstance.resize(); |
||||||
|
}, |
||||||
|
// 请求的数据 |
||||||
|
getChartsData() { |
||||||
|
if (this.queryType === "day") { |
||||||
|
this.dataTime = getDay(0); |
||||||
|
} else if (this.queryType === "month") { |
||||||
|
this.dataTime = getMonth(0); |
||||||
|
} else if (this.queryType === "year") { |
||||||
|
this.dataTime = getYear(0); |
||||||
|
} |
||||||
|
let data = { |
||||||
|
timeType: this.queryType, |
||||||
|
startTime: this.dataTime, |
||||||
|
endTime: this.dataTime, |
||||||
|
systemType: "1", |
||||||
|
}; |
||||||
|
overView(data).then((res) => { |
||||||
|
console.log("两个系统参数返回", res); |
||||||
|
if (res.code == 200) { |
||||||
|
this.energyMes = res.rows[0]; |
||||||
|
this.useForm.maxData = 10; |
||||||
|
this.useForm.useData = res.rows[0].eer; |
||||||
|
let that = this; |
||||||
|
// 使用配置函数 |
||||||
|
const axisLineColor = this.getAxisLineColor( |
||||||
|
this.useForm.useData, |
||||||
|
this.useForm.maxData |
||||||
|
); |
||||||
|
const adapterOption = { |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
name: "内部动态阴影", |
||||||
|
axisLine: { |
||||||
|
lineStyle: { |
||||||
|
color: axisLineColor, |
||||||
|
// 相当于阴影部分的直径 |
||||||
|
// width: 80, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "内部大边框", |
||||||
|
min: 0, |
||||||
|
max: this.useForm.maxData, |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的圆", |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 5, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "指针上的渐变圆", |
||||||
|
label: { |
||||||
|
show: true, |
||||||
|
position: "center", // 文字显示在中心位置 |
||||||
|
offset: [0, -5], // 向上偏移 10 个单位 |
||||||
|
formatter: function () { |
||||||
|
// 返回 HTML 标签,使用 rich 里定义的样式 |
||||||
|
return `{line|${that.useForm.useData}}`; |
||||||
|
}, |
||||||
|
rich: { |
||||||
|
line: { |
||||||
|
color: "#fff", // 第二行文字颜色 |
||||||
|
fontSize: 20, // 第二行文字大小 |
||||||
|
lineHeight: 0, // 行高,实现间距 |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 0, |
||||||
|
itemStyle: { |
||||||
|
// 设置渐变颜色 |
||||||
|
color: { |
||||||
|
type: "linear", |
||||||
|
x: 0, |
||||||
|
y: 0, |
||||||
|
x2: 0, |
||||||
|
y2: 1, |
||||||
|
colorStops: [ |
||||||
|
{ |
||||||
|
offset: 0, |
||||||
|
color: "rgb(4,112,212)", // 顶部颜色 |
||||||
|
}, |
||||||
|
{ |
||||||
|
offset: 0.3, |
||||||
|
color: "rgba(0, 46, 93)", // 底部透明 |
||||||
|
}, |
||||||
|
], |
||||||
|
global: false, // 缺省为 false |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
{ |
||||||
|
// 指针 数据 |
||||||
|
name: this.energyCostText, |
||||||
|
max: this.useForm.maxData, //最大刻度 |
||||||
|
axisLabel: { |
||||||
|
formatter: (value) => { |
||||||
|
// 仅显示 0 和最大值 |
||||||
|
if (value === 0 || value == this.useForm.maxData) { |
||||||
|
// 替换 100 为你的最大值 |
||||||
|
return value; |
||||||
|
} |
||||||
|
return ""; |
||||||
|
}, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
name: this.dateUse, |
||||||
|
value: this.useForm.useData, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
this.chartInstance.setOption(adapterOption); |
||||||
|
//手动的调用图标对象的resize才能产生效果 |
||||||
|
this.chartInstance.resize(); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.energy_content { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
width: 100% !important; |
||||||
|
height: 100%; |
||||||
|
|
||||||
|
.sys_charts { |
||||||
|
width: 100%; |
||||||
|
height: 1.6rem; |
||||||
|
} |
||||||
|
.eer { |
||||||
|
width: 80%; |
||||||
|
color: #fff; |
||||||
|
font-size: 18px; |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
justify-content: space-between; |
||||||
|
margin: 10px 0; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
||||||
|
|
@ -0,0 +1,20 @@ |
|||||||
|
<template> |
||||||
|
<div></div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
export default { |
||||||
|
created() { |
||||||
|
this.toPage(); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
toPage() { |
||||||
|
console.log("需要跳转的") |
||||||
|
// 跳转到高校导航大屏展示 |
||||||
|
this.$router.push("/bigScreen") |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style></style> |
@ -0,0 +1,458 @@ |
|||||||
|
<template> |
||||||
|
<div class="app-container" v-loading="loading"> |
||||||
|
<img |
||||||
|
class="right-line" |
||||||
|
src="../../../assets/images/right_line.png" |
||||||
|
alt="" |
||||||
|
/> |
||||||
|
<div class="delay-title">定时开关机功能</div> |
||||||
|
<div class="device-container"> |
||||||
|
<div class="device-li"> |
||||||
|
<div class="device-name">定时名称</div> |
||||||
|
<div class="device-name">定时开机</div> |
||||||
|
<div class="device-name">定时关机</div> |
||||||
|
<div class="device-name">启动状态</div> |
||||||
|
</div> |
||||||
|
<div class="device-li" v-for="(item, index) in delayList" :key="index"> |
||||||
|
<div class="device-name">{{ item.name }}</div> |
||||||
|
<div class="device-name"> |
||||||
|
<el-input |
||||||
|
size="mini" |
||||||
|
v-model="item.delayOpenHour" |
||||||
|
@keyup.enter.native="handleEnter(item, 'openHour')" |
||||||
|
@input="handleInput(item, 'delayOpenHour', 'hour')" |
||||||
|
></el-input> |
||||||
|
<div class="slip">:</div> |
||||||
|
<el-input |
||||||
|
size="mini" |
||||||
|
v-model="item.delayOpenMinute" |
||||||
|
@keyup.enter.native="handleEnter(item, 'openMinute')" |
||||||
|
@input="handleInput(item, 'delayOpenMinute', 'minute')" |
||||||
|
></el-input> |
||||||
|
</div> |
||||||
|
<div class="device-name"> |
||||||
|
<el-input |
||||||
|
size="mini" |
||||||
|
v-model="item.delayCloseHour" |
||||||
|
@keyup.enter.native="handleEnter(item, 'closeHour')" |
||||||
|
@input="handleInput(item, 'delayCloseHour', 'hour')" |
||||||
|
></el-input> |
||||||
|
<div class="slip">:</div> |
||||||
|
<el-input |
||||||
|
size="mini" |
||||||
|
v-model="item.delayCloseMinute" |
||||||
|
@keyup.enter.native="handleEnter(item, 'closeMinute')" |
||||||
|
@input="handleInput(item, 'delayCloseMinute', 'minute')" |
||||||
|
></el-input> |
||||||
|
</div> |
||||||
|
<div class="device-name"> |
||||||
|
<el-switch |
||||||
|
style="display: block" |
||||||
|
active-color="#13ce66" |
||||||
|
inactive-color="#ff4949" |
||||||
|
active-text="开启" |
||||||
|
inactive-text="禁用" |
||||||
|
v-model="item.delayStatus" |
||||||
|
@change="handleStatus(item)" |
||||||
|
> |
||||||
|
</el-switch> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<img class="left-line" src="../../../assets/images/left_line.png" alt="" /> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { policyListData } from "@/api/centerairC/strategy"; |
||||||
|
import { operationConrol } from "@/api/centerairC/sysMonitor"; |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
loading: false, |
||||||
|
delayList: [], |
||||||
|
}; |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.getPolicyList(); |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
// 请求列表 |
||||||
|
getPolicyList() { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
let data = { |
||||||
|
systemType: "0", |
||||||
|
funPolicyType: "3", |
||||||
|
}; |
||||||
|
policyListData(data) |
||||||
|
.then((res) => { |
||||||
|
console.log("设备定时开关返回res", res); |
||||||
|
if (res.code === 200) { |
||||||
|
let handleList = res.rows; |
||||||
|
this.delayList = []; |
||||||
|
handleList.forEach((element, index) => { |
||||||
|
if (element.values && element.values.length > 0) { |
||||||
|
// 初始化一个空对象来存储非蝶阀处理后的结果 |
||||||
|
let delayItem = { |
||||||
|
name: element.name, |
||||||
|
}; |
||||||
|
const limitedChildren = element.values; |
||||||
|
limitedChildren.forEach((child) => { |
||||||
|
// console.log("定时${index}开_时", `定时${index}开_时`); |
||||||
|
// console.log("child.pointName", child.pointName); |
||||||
|
if (child.pointName) { |
||||||
|
// 定时开机-小时 |
||||||
|
if (child.pointName == `定时${index + 1}开_时`) { |
||||||
|
// console.log("定时开机-时·························"); |
||||||
|
delayItem.delayOpenHour = child.curValue; |
||||||
|
delayItem.delayOpenHourId = child.cpmId; |
||||||
|
} |
||||||
|
// 定时开机-分钟 |
||||||
|
else if ( |
||||||
|
child.pointName.includes(`定时${index + 1}开_分`) |
||||||
|
) { |
||||||
|
delayItem.delayOpenMinute = child.curValue; |
||||||
|
delayItem.delayOpenMinuteId = child.cpmId; |
||||||
|
} |
||||||
|
// 定时关机-小时 |
||||||
|
else if ( |
||||||
|
child.pointName.includes(`定时${index + 1}关_时`) |
||||||
|
) { |
||||||
|
delayItem.delayCloseHour = child.curValue; |
||||||
|
delayItem.delayCloseHourId = child.cpmId; |
||||||
|
} |
||||||
|
// 定时关机-分钟 |
||||||
|
else if ( |
||||||
|
child.pointName.includes(`定时${index + 1}关_分`) |
||||||
|
) { |
||||||
|
delayItem.delayCloseMinute = child.curValue; |
||||||
|
delayItem.delayCloseMinuteId = child.cpmId; |
||||||
|
} |
||||||
|
// 启动状态 |
||||||
|
else if (child.pointName.includes(`启动标志`)) { |
||||||
|
delayItem.delayStatus = |
||||||
|
Number(child.curValue) == 0 ? false : true; |
||||||
|
delayItem.delayStatusId = child.cpmId; |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
// 将处理后的对象添加到 delayList 中 |
||||||
|
if (Object.keys(delayItem).length > 1) { |
||||||
|
this.delayList.push(delayItem); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
console.log("处理后的数组", this.delayList); |
||||||
|
// this.delayList = res.rows; |
||||||
|
} else { |
||||||
|
this.delayList = []; |
||||||
|
} |
||||||
|
// 成功时解析 Promise |
||||||
|
resolve(res); |
||||||
|
}) |
||||||
|
.catch((error) => { |
||||||
|
// 失败时拒绝 Promise |
||||||
|
reject(error); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
// 处理输入事件,过滤非数字字符 |
||||||
|
handleInput(item, propertyName, name) { |
||||||
|
console.log("校验", item[propertyName]); |
||||||
|
// 如果值为空,不进行后续校验 |
||||||
|
if (item[propertyName] === "") { |
||||||
|
return; |
||||||
|
} |
||||||
|
let isValid = true; |
||||||
|
// 实时校验并过滤非数字字符 |
||||||
|
let inputValue = String(item[propertyName]).replace(/[^\d]/g, ""); |
||||||
|
if (name === "hour") { |
||||||
|
isValid = |
||||||
|
!isNaN(inputValue) && |
||||||
|
parseInt(inputValue) >= 0 && |
||||||
|
parseInt(inputValue) <= 23; |
||||||
|
if (!isValid) { |
||||||
|
this.$message.error("输入值在0-23区间,请重新输入"); |
||||||
|
item[propertyName] = ""; |
||||||
|
return; |
||||||
|
} |
||||||
|
} else if (name === "minute") { |
||||||
|
isValid = |
||||||
|
!isNaN(inputValue) && |
||||||
|
parseInt(inputValue) >= 0 && |
||||||
|
parseInt(inputValue) <= 59; |
||||||
|
if (!isValid) { |
||||||
|
this.$message.error("输入值在0-59区间,请重新输入"); |
||||||
|
item[propertyName] = ""; |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
item[propertyName] = inputValue; |
||||||
|
}, |
||||||
|
handleEnter(item, name) { |
||||||
|
let id = ""; |
||||||
|
let value = ""; |
||||||
|
let title = ""; |
||||||
|
let unit = ""; |
||||||
|
if (name === "openHour") { |
||||||
|
id = item.delayOpenHourId; |
||||||
|
value = item.delayOpenHour; |
||||||
|
title = "定时开机-小时"; |
||||||
|
unit = "时"; |
||||||
|
} else if (name === "openMinute") { |
||||||
|
id = item.delayOpenMinuteId; |
||||||
|
value = item.delayOpenMinute; |
||||||
|
title = "定时开机-分钟"; |
||||||
|
unit = "分"; |
||||||
|
} else if (name === "closeHour") { |
||||||
|
id = item.delayCloseHourId; |
||||||
|
value = item.delayCloseHour; |
||||||
|
title = "定时关机-小时"; |
||||||
|
unit = "时"; |
||||||
|
} else if (name === "closeMinute") { |
||||||
|
id = item.delayCloseMinuteId; |
||||||
|
value = item.delayCloseMinute; |
||||||
|
title = "定时关机-分钟"; |
||||||
|
unit = "分"; |
||||||
|
} |
||||||
|
|
||||||
|
if (value === "") { |
||||||
|
this.$message.warning("请输入当前设置值!"); |
||||||
|
return; |
||||||
|
} |
||||||
|
console.log("请求后端", item); |
||||||
|
this.$confirm( |
||||||
|
`确定要把"${item.name}"的${title}设置为:${value} ${unit}吗?`, |
||||||
|
"提示", |
||||||
|
{ |
||||||
|
confirmButtonText: "确定", |
||||||
|
cancelButtonText: "取消", |
||||||
|
type: "warning", |
||||||
|
} |
||||||
|
) |
||||||
|
.then(() => { |
||||||
|
this.hadleOperationConrol(id, value); |
||||||
|
}) |
||||||
|
.catch(() => { |
||||||
|
// 用户取消操作,需要更新原来的频率 |
||||||
|
this.getPolicyList(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
hadleOperationConrol(id, param) { |
||||||
|
let data = { |
||||||
|
id: id, |
||||||
|
param: param, |
||||||
|
}; |
||||||
|
console.log("操作参数", data); |
||||||
|
operationConrol([data]) |
||||||
|
.then((res) => { |
||||||
|
if (res.code == 200) { |
||||||
|
this.$modal.msgSuccess("操作成功"); |
||||||
|
// 开启 loading 效果 |
||||||
|
this.loading = true; |
||||||
|
// 更新所有设备状态; |
||||||
|
setTimeout(() => { |
||||||
|
this.getPolicyList().finally(() => { |
||||||
|
// 关闭 loading 效果 |
||||||
|
this.loading = false; |
||||||
|
}); |
||||||
|
}, 6000); |
||||||
|
} else { |
||||||
|
// this.$modal.msgError("操作失败"); |
||||||
|
console.log("应该更新状态的"); |
||||||
|
// 更新所有设备状态; |
||||||
|
this.getPolicyList(); |
||||||
|
} |
||||||
|
}) |
||||||
|
.catch((error) => { |
||||||
|
console.log("请求发生错误,更新设备状态", error); |
||||||
|
// 更新所有设备状态; |
||||||
|
this.getPolicyList(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 启用状态 |
||||||
|
handleStatus(item) { |
||||||
|
this.$confirm( |
||||||
|
`确定要切换"${item.name}"的状态为:${ |
||||||
|
item.delayStatus ? "开启" : "禁用 吗?" |
||||||
|
}`, |
||||||
|
"提示", |
||||||
|
{ |
||||||
|
confirmButtonText: "确定", |
||||||
|
cancelButtonText: "取消", |
||||||
|
type: "warning", |
||||||
|
} |
||||||
|
) |
||||||
|
.then(() => { |
||||||
|
// 这里调用请求函数 |
||||||
|
console.log("请求后台", item.delayStatus); |
||||||
|
let param = null; |
||||||
|
if (item.delayStatus) { |
||||||
|
param = 1; |
||||||
|
} else { |
||||||
|
param = 0; |
||||||
|
} |
||||||
|
this.hadleOperationConrol(item.delayStatusId, param); |
||||||
|
}) |
||||||
|
.catch(() => { |
||||||
|
// 用户取消操作,恢复开关状态 |
||||||
|
item.delayStatus = !item.delayStatus; |
||||||
|
console.log("不请求后台"); |
||||||
|
}); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.app-container { |
||||||
|
position: relative; |
||||||
|
padding: 0.2rem; |
||||||
|
.delay-title { |
||||||
|
/* 基础样式 */ |
||||||
|
display: inline-block; |
||||||
|
padding: 0.1rem; |
||||||
|
font-family: "Arial Rounded MT Bold", sans-serif; |
||||||
|
font-size: 0.18rem; |
||||||
|
font-weight: 700; |
||||||
|
color: #e6f3ff; |
||||||
|
text-shadow: 0 2px 4px rgba(0, 60, 120, 0.4); |
||||||
|
letter-spacing: 2px; |
||||||
|
position: relative; |
||||||
|
overflow: hidden; |
||||||
|
cursor: default; |
||||||
|
|
||||||
|
/* 双背景叠加 */ |
||||||
|
background: linear-gradient( |
||||||
|
65deg, |
||||||
|
rgba(1, 11, 24, 0.8) 0%, |
||||||
|
rgba(36, 91, 146, 0.6) 50%, |
||||||
|
rgba(18, 53, 95, 0.5) 100% |
||||||
|
), |
||||||
|
linear-gradient(-25deg, #0b274b 20%, #2b4d6b 80%); |
||||||
|
background-blend-mode: overlay; |
||||||
|
|
||||||
|
/* 动态边框 */ |
||||||
|
border: 2px solid; |
||||||
|
border-image: linear-gradient(45deg, #026bbb, transparent) 1; |
||||||
|
|
||||||
|
/* 主流光动画 */ |
||||||
|
&::before { |
||||||
|
content: ""; |
||||||
|
position: absolute; |
||||||
|
top: -50%; |
||||||
|
left: -100%; |
||||||
|
width: 250%; |
||||||
|
height: 200%; |
||||||
|
background: linear-gradient( |
||||||
|
60deg, |
||||||
|
transparent 20%, |
||||||
|
rgba(255, 255, 255, 0.3) 50%, |
||||||
|
transparent 80% |
||||||
|
); |
||||||
|
animation: shine 2.5s infinite linear; |
||||||
|
} |
||||||
|
|
||||||
|
/* 副流光动画 */ |
||||||
|
&::after { |
||||||
|
content: ""; |
||||||
|
position: absolute; |
||||||
|
top: -30%; |
||||||
|
left: -50%; |
||||||
|
width: 200%; |
||||||
|
height: 160%; |
||||||
|
background: linear-gradient( |
||||||
|
-30deg, |
||||||
|
transparent 30%, |
||||||
|
rgba(255, 255, 255, 0.2) 50%, |
||||||
|
transparent 70% |
||||||
|
); |
||||||
|
animation: shineReverse 3s infinite linear; |
||||||
|
animation-delay: 0.8s; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* 主流光动画 */ |
||||||
|
@keyframes shine { |
||||||
|
0% { |
||||||
|
transform: translateX(-20%) rotate(60deg); |
||||||
|
} |
||||||
|
100% { |
||||||
|
transform: translateX(120%) rotate(60deg); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* 反向副流光 */ |
||||||
|
@keyframes shineReverse { |
||||||
|
0% { |
||||||
|
transform: translateX(20%) rotate(-30deg); |
||||||
|
} |
||||||
|
100% { |
||||||
|
transform: translateX(-120%) rotate(-30deg); |
||||||
|
} |
||||||
|
} |
||||||
|
.right-line { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
width: 1.7rem; |
||||||
|
height: 0.4rem; |
||||||
|
} |
||||||
|
.left-line { |
||||||
|
position: absolute; |
||||||
|
right: 0; |
||||||
|
bottom: 0; |
||||||
|
width: 0.5rem; |
||||||
|
height: 2.2rem; |
||||||
|
} |
||||||
|
} |
||||||
|
.device-container { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
width: 100%; |
||||||
|
min-height: 700px; |
||||||
|
background-color: #142c4e; |
||||||
|
padding: 10px 10px 30px 10px; |
||||||
|
border-radius: 10px; |
||||||
|
.device-li { |
||||||
|
width: 100%; |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
padding: 12px 0; |
||||||
|
color: #abcdfc; |
||||||
|
border-bottom: 1px dashed #0349ac; |
||||||
|
.device-name { |
||||||
|
flex: 1; |
||||||
|
white-space: nowrap; |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
flex-wrap: nowrap; |
||||||
|
.slip { |
||||||
|
margin: 0 5px; |
||||||
|
color: #1282d8; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.device-li:nth-child(1) { |
||||||
|
color: #9ca3af; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
||||||
|
<style scoped> |
||||||
|
.device-name >>> .el-input { |
||||||
|
width: 80px !important; |
||||||
|
} |
||||||
|
.device-name >>> .el-input__inner { |
||||||
|
background-color: #04193a; |
||||||
|
border: 1px solid #1262db; |
||||||
|
color: #3ef0fd; |
||||||
|
font-weight: 700; |
||||||
|
text-align: center; |
||||||
|
padding: 0 0.1rem !important; |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,13 @@ |
|||||||
|
<template> |
||||||
|
<div>历史数据</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
export default { |
||||||
|
|
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style> |
||||||
|
|
||||||
|
</style> |