123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805 |
- <!--
- *@description: 哨兵基础页
- *@author: yh Fu
- *@date: 2025-08-29 11:16:01
- *@version: V1.0.5
- -->
- <template>
- <div class="visual-con hz_body">
- <div class="s_header">
- <div class="head_btn">
- <div @click="jumpTo('/SentryCockpit',0)" :class="routerIdx == 0 ? 'on' : ''">
- <i>驾驶舱</i>
- </div>
- <div @click="jumpTo('/SenEquipmentCenter',1)" :class="routerIdx == 1 ? 'on' : ''">
- <i>设备中心</i>
- </div>
- </div>
- <div class="header_tit"><i>{{title}}</i></div>
- <div class="head_btn">
- <div @click="jumpTo('/SenEventCenter',2)" :class="routerIdx == 2 ? 'on' : ''">
- <i>事件中心</i>
- </div>
- <div @click="jumpTo('/useCenter',3)" :class="routerIdx == 3 ? 'on' : ''">
- <i>用户中心</i>
- </div>
- </div>
- <div class="head_tx">
- <span><img src="../assets/images/sentinel/hz_tx.png" /></span>
- </div>
- </div>
- <div class="visual-body">
- <!--主体-->
- <router-view>
- </router-view>
- <!-- 哨兵详情弹窗 -->
- <div class="tk_div" v-show="isDetailVisible">
- <div class="tk1 tk_bor" style="width: 371px;height: 310px;">
- <h1>
- <span :title="detailInfo.deviceName || '--'" style="display: inline-block;overflow: hidden;width: 62%;text-overflow: ellipsis;">{{ detailInfo.deviceName || '--' }}</span>
- <i class="el-icon el-icon-close" style="margin-left: 5%;cursor: pointer;" @click="closeDetail"></i>
- <i>{{ detailInfo.workingStatus == '0' ? '在线' : '离线' }}</i>
- </h1>
- <p>设备名称:{{ detailInfo.deviceName || '--' }}</p>
- <p>设备类型:{{ detailInfo.deviceTypeText || '--' }}</p>
- <p>设备监测指标:{{ detailInfo.threshold || '--' }}</p>
- <p>品牌:{{ detailInfo.brand || '--' }}</p>
- <p>所在街道:{{ detailInfo.address || '--' }}</p>
- <p>历史数值:<a @click="toggleDisplay(detailInfo.deviceCode)">详情</a></p>
- </div>
- <div class="tk2 tk_bor" v-if="isVisible" style="position: absolute;width: 466px;height: 455px;left: 98%;">
- <h1>哨兵详情</h1>
- <div id="sbxqChart" ref="MyChart"></div>
- </div>
- </div>
- <!-- 地图 -->
- <supermap ref="supermap" style="width: 100%;height: 100vh;" @preview="preview">
- </supermap>
- </div>
- </div>
- </template>
- <script>
- import Cookies from 'js-cookie'
- import supermap from '@/components/supermap-2.5d' //超图
- import {
- getUserProfile
- } from "@/api/system/user";
- import '../assets/styles/hz_body.css';
- import {
- selectConfigKey
- } from "@/api/system/config";
- import {
- selectByDeviceId,
- selectDailyThreshold
- } from "@/api/sentinel"
- let echarts = require("echarts");
- export default {
- name: 'MyChart',
- components: {
- supermap
- },
- metaInfo() {
- return {
- title: '四平市智慧哨兵监管平台',
- meta: [{
- charset: "utf-8"
- },
- {
- name: "viewport",
- content: "width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
- }
- ]
- }
- },
- data() {
- return {
- title: '四平市智慧哨兵监管平台',
- routerIdx:0, // 当前导航索引
- detailInfo:{}, // 设备详情信息
- isVisible: false, // 初始时设置为false,不显示内容
- isDetailVisible:false, // 设备弹窗显隐flag
- }
- },
- created() {
- },
- mounted() {
- // 初始定向到驾驶舱
- this.$router.push({
- path:'/SentryCockpit'
- })
- // 初始化地图数据
- this.getSuperMapUrl();
- setTimeout(() => {
- this.title = '四平市智慧哨兵监管平台'
- }, 1000);
- },
- methods:{
- closeDetail(){
- this.isDetailVisible = false
- this.isVisible = false
- },
- preview(e){
- selectByDeviceId({id:e.id}).then(res => {
- this.detailInfo = res.data
- this.isDetailVisible = true
- })
- },
- toggleDisplay(deviceCode) {
- this.isVisible = !this.isVisible; // 点击按钮时切换isVisible的值
- if(this.isVisible){
- selectDailyThreshold(deviceCode).then(res => {
- this.initChart(res.data)
- })
- }
- },
- jumpTo(path,idx){
- if(this.routerIdx == idx) return;
- // 重置哨兵详情态
- this.isDetailVisible = false
- this.isVisible = false
- // 地图清点
- this.$refs.supermap.clearM();
- this.routerIdx = idx
- this.$router.push({
- path
- })
- },
- initChart(data){
- // 基于准备好的dom,初始化echarts实例
- const myChart = echarts.init(document.getElementById('sbxqChart'))
- let xdata = data.time //x轴
- let dataArr = data.value //value
- let dashedArr = data.threshold
- let titleName = "阈值";
- let titleNames = "实际值";
- let option = {
- backgroundColor: "rgba(25,44,59,.4)",
- grid: {
- left: "5%",
- bottom: "10%",
- top: "18%",
- containLabel: true,
- },
- tooltip: {
- trigger: "axis",
- axisPointer: {
- type: "shadow",
- },
- },
- legend: {
- show: true,
- x: "center",
- y: 20,
- textStyle: {
- color: "#fff", // 图例文字颜色
- fontSize: 16,
- },
- },
- xAxis: {
- type: "category",
- boundaryGap: false,
- data: xdata,
- axisLabel: {
- show: true,
- textStyle: {
- color: "#fff",
- },
- },
- axisLine: {
- lineStyle: {
- color: "transparent",
- width: 2, //这里是为了突出显示加上的
- },
- },
- },
- "dataZoom": [
- {
- "show": true,
- "height": 12,
- "xAxisIndex": [
- 0
- ],
- "bottom": "8%",
- "start": 0,
- "end": 50,
- "handleIcon": "path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
- "handleSize": "110%",
- "handleStyle": {
- "color": "#d3dee5"
- },
- "textStyle": {
- "color": "#fff"
- },
- "borderColor": "#90979c"
- },
- {
- "type": "inside",
- "show": true,
- "height": 15,
- "start": 1,
- "end": 35
- }
- ],
- yAxis: [
- {
- type: "value",
- name: "(%vol)",
- nameTextStyle: {
- color: "#fff",
- },
- axisLabel: {
- formatter: "{value}",
- textStyle: {
- color: "#fff",
- },
- },
- axisLine: {
- lineStyle: {
- color: "transparent",
- width: 2, //这里是为了突出显示加上的
- },
- },
- axisTick: {
- show: false,
- },
- splitLine: {
- show: true,
- lineStyle: {
- color: "#11366e",
- },
- },
- },
- ],
- series: [
- {
- name: titleName,
- type: "line",
- smooth: true,
- symbol: "none",
- itemStyle: {
- normal: {
- lineStyle: {
- type: "dashed",
- },
- color: "#01F699", //拐点的颜色
- borderColor: "#01F699", //拐点边框的颜色
- },
- },
- data: dashedArr,
- },
- {
- name: titleNames,
- type: "line",
- stack: "总量",
- smooth: true, //平滑曲线显示
- symbol: "circle", //标记的图形为实心圆
- symbolSize: 8,
- itemStyle: {
- normal: {
- color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
- {
- offset: 0,
- color: "rgba(3,191,255,1)",
- },
- {
- offset: 1,
- color: "rgba(18,93,236,1)",
- },
- ]),
- areaStyle: {
- color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
- {
- offset: 0,
- color: "rgba(3,191,255,.3)",
- },
- {
- offset: 1,
- color: "rgba(18,93,236,.3)",
- },
- ]),
- },
- },
- },
- data: dataArr,
- },
- ],
- };
- myChart.setOption(option);
- },
- getSuperMapUrl() {
- getUserProfile().then(response => {
- let mapDeptId = response.mapDeptId
- let num = 0;
- if (mapDeptId == "365") {
- num = 0;
- } else if (mapDeptId == "369") {
- num = 1;
- } else if (mapDeptId == "371") {
- num = 2;
- } else if (mapDeptId == "373") {
- num = 3;
- } else if (mapDeptId == "372") {
- num = 4;
- } else if (mapDeptId == "370") {
- num = 5;
- }
- this.$refs.supermap.removeAllviewer(mapDeptId, -1);
- });
- },
- }
- }
- </script>
- <style rel="stylesheet/scss" lang="scss">
- .visual-con .el-input__inner {
- border: 1px solid #3bb8a4;
- background-color: rgba(20, 107, 115, 0.3);
- color: #fff;
- }
- .hz_body {
- position: relative;
- }
- i,
- b,
- u {
- font-style: normal;
- text-decoration: none;
- }
- /*//头部通用*/
- .s_header {
- width: 100%;
- height: 110px;
- position: absolute;
- top: 0px;
- left: 0px;
- z-index: 99;
- display: flex;
- flex-direction: row;
- justify-content: space-around;
- background: url("../assets/images/sentinel/hz_header.png") no-repeat center;
- background-size: contain;
- }
- .s_header .header_tit {
- display: block;
- width: 1000px;
- height: 109px;
- line-height: 65px;
- text-align: center;
- }
- .s_header .header_tit i {
- font-family: 'ysbth';
- font-size: 40px;
- /*text-shadow: 3px 5.196px 0px rgba(17, 20, 22, 0.22);*/
- letter-spacing: 4px;
- background: linear-gradient(180deg, #fff 0%, #b0d3f1 100%);
- -webkit-background-clip: text;
- color: transparent;
- mix-blend-mode: screen;
- /*text-shadow: 3px 5px 0px rgba(17, 20, 22, 0.22);*/
- display: block;
- text-align: center;
- }
- .s_header .head_btn {
- width: 316px;
- }
- .s_header .head_tx {
- display: block;
- position: absolute;
- right: 20px;
- }
- .s_header .head_btn div {
- display: inline-block;
- background: url("../assets/images/sentinel/hz_btnbg.png") no-repeat center;
- width: 138px;
- margin: 0px 10px;
- height: 29px;
- line-height: 29px;
- text-align: center;
- transition: all 0.3s;
- }
- .s_header .head_btn div i {
- display: block;
- font-family: 'ysbth';
- font-size: 20px;
- background: linear-gradient(180deg, #95dded 60%, #fff 40%);
- -webkit-background-clip: text;
- color: transparent;
- mix-blend-mode: screen;
- /*text-shadow: 3px 5px 0px rgba(17, 20, 22, 0.22);*/
- display: block;
- text-align: center;
- }
- .s_header .head_btn div.on,
- .s_header .head_btn div:hover {
- background: url("../assets/images/sentinel/hz_btnbg_on.png") no-repeat center;
- box-shadow: none;
- filter: brightness(170%);
- }
- .con_left {
- position: absolute;
- z-index: 99;
- left: 30px;
- top: 100px;
- width: 320px;
- background: rgba(0, 0, 0, 0.55);
- padding: 0px 10px 20px 10px !important;
- }
- .con_right {
- position: absolute;
- z-index: 99;
- right: 30px;
- top: 100px;
- width: 320px;
- background: rgba(0, 0, 0, 0.55);
- padding: 0px 10px 20px 10px !important;
- .list_tit {
- background: url("../assets/images/sentinel/hz_list_tit.png") no-repeat center;
- background-size: 100% 100%;
- height: 44px;
- line-height: 44px;
- padding-left: 20px;
- font-family: 'ysbth';
- font-size: 20px;
- color: #fff;
- margin-bottom: 10px;
- }
- }
- .con_left_js {
- width: 400px !important;
- }
- .con_left .list_tit {
- background: url("../assets/images/sentinel/hz_list_tit.png") no-repeat center;
- background-size: 100% 100%;
- height: 44px;
- line-height: 44px;
- padding-left: 20px;
- font-family: 'ysbth';
- font-size: 20px;
- color: #fff;
- margin-bottom: 10px;
- }
- .con_left .el-select {
- width: 100%;
- margin-bottom: 8px;
- }
- .el-select-dropdown {
- border: 1px solid #3bb7a3;
- background-color: #0c3038;
- }
- .el-select-dropdown__item {
- color: #b0d3f1;
- }
- .el-select-dropdown__item.hover,
- .con_left .el-select-dropdown__item:hover {
- background-color: #0a4c5c;
- }
- .el-select-dropdown__item.selected {
- color: #3bb7a3;
- }
- .el-input__inner {
- color: #b0d3f1;
- height: 35px;
- line-height: 35px;
- }
- .el-input__icon {
- line-height: 35px;
- color: #5bf9e0;
- }
- .sp_list {
- margin-top: 10px !important;
- }
- .sp_list dt {
- background: linear-gradient(to right, rgba(40, 115, 124, 0.68), rgba(38, 75, 80, 0.68));
- height: 38px;
- line-height: 38px;
- margin-bottom: 5px;
- }
- .sp_list dd {
- display: flex;
- flex-direction: row;
- cursor: pointer;
- transition: all 0.3s;
- }
- .sp_list dd:hover {
- filter: brightness(170%) hue-rotate(-20deg);
- }
- .sp_list dd:nth-child(odd) {
- background: linear-gradient(to right, rgba(40, 115, 124, 0.68), rgba(38, 75, 80, 0.68));
- height: 38px;
- line-height: 38px;
- margin-bottom: 5px;
- }
- .sp_list dd:nth-child(even) {
- background: linear-gradient(to right, rgba(40, 115, 124, 0.38), rgba(38, 75, 80, 0.38));
- height: 38px;
- line-height: 38px;
- margin-bottom: 5px;
- }
- .sp_list span {
- display: inline-block;
- text-align: left;
- font-size: 14px;
- color: #acdfe5;
- height: 38px;
- line-height: 38px;
- }
- .sp_list span.dt1 {
- width: 60px;
- background: url("../assets/images/sentinel/hz_list_j.png") no-repeat left;
- padding-left: 15px;
- }
- .sp_list span.dt2 {
- width: 200px;
- text-align: left;
- }
- .sp_list span.dt3 {
- width: 40px;
- text-align: center;
- line-height: 38px;
- position: relative;
- }
- .sp_list span.dt3 img {
- display: inline-block;
- position: absolute;
- top: 10px;
- left: 11px;
- }
- .el-pagination {
- width: 100%;
- margin-top: 20px !important;
- }
- .el-pagination.is-background .btn-next,
- .el-pagination.is-background .btn-prev,
- .el-pagination.is-background .el-pager li {
- margin: 0 2px;
- background-color: unset !important;
- color: #47c5b0;
- min-width: 26px;
- }
- .el-pagination.is-background .el-pager li:not(.disabled).active {
- background-color: #47c5b0 !important;
- color: #FFF;
- }
- .el-pagination.is-background .el-pager li:not(.disabled):hover {
- background-color: #47c5b0 !important;
- color: #FFF;
- }
- .el-pager li:hover {
- background-color: #47c5b0 !important;
- color: #FFF;
- }
- .hei_scroll {
- overflow-y: scroll;
- }
- .hei_scroll::-webkit-scrollbar {
- width: 0px;
- height: 0px;
- }
- .hei56 {
- height: 56vh;
- }
- .qydw1 {
- position: absolute;
- top: 60%;
- left: 40%;
- display: block;
- width: 54px;
- height: 77px;
- }
- .qydw2 {
- position: absolute;
- top: 50%;
- left: 70%;
- display: block;
- width: 54px;
- height: 77px;
- }
- .qydw3 {
- position: absolute;
- top: 40%;
- left: 80%;
- display: block;
- width: 54px;
- height: 77px;
- }
- .tk_div {
- position: absolute;
- top: 24%;
- left: 32.2%;
- z-index: 98;
- display: flex;
- flex-direction: row;
- }
- .tk_bor {
- padding: 15px !important;
- border: 3px solid #28727e;
- box-shadow: 0px 0px 24px #28727e;
- background: rgba(0, 0, 0, 0.39);
- }
- .info-list {
- display: flex;
- flex-wrap: wrap;
- margin-bottom: 20px !important;
- p {
- width: 50%;
- padding-left: 20px;
- background: url("../assets/images/sentinel/hz_k.png") no-repeat left;
- background-size: 12px;
- font-size: 14px;
- color: #fff;
- line-height: 60px;
- }
- }
- .tk_bor h1 {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding-left: 20px;
- background: url("../assets/images/sentinel/hz_k.png") no-repeat left;
- font-size: 18px;
- color: #e0e5fa;
- font-weight: bold;
- height: 38px;
- line-height: 38px;
- }
- .tk_bor h1 i {
- display: inline-block;
- float: right;
- background: #3bad96;
- padding: 0px 10px;
- color: #fff;
- font-size: 16px;
- height: 30px;
- line-height: 30px;
- position: relative;
- border-radius: 4px;
- }
- .tk_bor h1 i::after {
- display: block;
- content: '';
- border-bottom: 9px solid transparent;
- border-right: 9px solid #3bad96;
- border-top: 9px solid transparent;
- position: absolute;
- left: -8px;
- top: 8px;
- }
- .tk_bor p {
- padding-left: 20px;
- background: url("../assets/images/sentinel/hz_k.png") no-repeat left;
- background-size: 12px;
- font-size: 16px;
- color: #fff;
- line-height: 35px;
- }
- .tk_bor p a {
- color: #6bf5f2;
- text-underline-offset: 0.4em;
- text-decoration: underline;
- }
- .tk_bor p a:hover {
- color: #6bf5f2;
- text-underline-offset: 0.4em;
- text-decoration: underline;
- cursor: pointer;
- }
- .tk_bor .icon{
- display: flex;
- align-items: center;
- float: right;
- img{
- margin-left: 10px;
- }
- }
- .tk1 {
- position: relative;
- margin-right: 20px !important;
- }
- .tk1::after {
- display: block;
- content: '';
- background: url("../assets/images/sentinel/hz_down.png") no-repeat left;
- width: 46px;
- height: 40px;
- position: absolute;
- bottom: -40px;
- left: 50%;
- transform: translateX(-50%);
- }
- #sbxqChart {
- width: 100%;
- height: 91%;
- }
- //图表设备分析
- .sb_fx {
- width: 100%;
- height: 300px;
- }
- .yh_fx {
- width: 100%;
- height: 260px;
- }
- .sj_fx {
- width: 100%;
- height: 280px;
- }
- </style>
- <style rel="stylesheet/scss" lang="scss" scoped>
- @import '@/assets/styles/base.scss';
- </style>
|