新增站点地图静态页面,项目新增ems router文件、components文件、mixin文件、scss文件和view文件
This commit is contained in:
16
src/assets/styles/common.scss
Normal file
16
src/assets/styles/common.scss
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
ems管理平台公共css样式
|
||||||
|
*/
|
||||||
|
|
||||||
|
//右侧内容区域
|
||||||
|
.ems-dashboard-editor-container{
|
||||||
|
background-color: #F1F5FC;
|
||||||
|
padding: 24px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.ems-content-conatiner{
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
ems-content-conatiner-padding{
|
||||||
|
padding: 24px;
|
||||||
|
}
|
@ -4,6 +4,7 @@
|
|||||||
@import './element-ui.scss';
|
@import './element-ui.scss';
|
||||||
@import './sidebar.scss';
|
@import './sidebar.scss';
|
||||||
@import './btn.scss';
|
@import './btn.scss';
|
||||||
|
@import './common.scss';
|
||||||
|
|
||||||
body {
|
body {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
35
src/components/Ems/SingleSquareBox/index.vue
Normal file
35
src/components/Ems/SingleSquareBox/index.vue
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<!--单独的背景颜色渐变、宽高100%的内容展示方块组件-->
|
||||||
|
<template>
|
||||||
|
<el-card shadow="always" class="single-square-box" :style="{background: 'linear-gradient(180deg, '+data.bgColor+' 0%,rgba(255,255,255,0) 100%)'}">
|
||||||
|
<div class="single-square-box-title">{{ data.title }}</div>
|
||||||
|
<div class="single-square-box-value">{{ data.value }}</div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.single-square-box{
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color:#666666;
|
||||||
|
text-align: left;
|
||||||
|
.single-square-box-title{
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 12px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
}
|
||||||
|
.single-square-box-value{
|
||||||
|
font-size: 26px;
|
||||||
|
line-height: 26px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
::v-deep .el-card__body{
|
||||||
|
padding: 12px 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: ['data'],
|
||||||
|
}
|
||||||
|
</script>
|
66
src/components/Ems/ZdBaseInfo/index.vue
Normal file
66
src/components/Ems/ZdBaseInfo/index.vue
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
<!--首页、地图站点页面顶部信息方块-->
|
||||||
|
<template>
|
||||||
|
<el-row type="flex" >
|
||||||
|
<el-card shadow="hover" class="card" v-for="(item,index) in data" :key="index+'zdInfo'" :style="{borderBottomColor:item.color}">
|
||||||
|
<div class="info">{{ item.title }}</div>
|
||||||
|
<div class="num">{{item.num}}</div>
|
||||||
|
</el-card>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
//todo 动态获取数据
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
data:[{
|
||||||
|
title:'站点总数(座)',
|
||||||
|
num:6,
|
||||||
|
color:'#FFBD00'
|
||||||
|
},{
|
||||||
|
title:'装机功率(MW)',
|
||||||
|
num:6,
|
||||||
|
color:'#3C81FF'
|
||||||
|
},{
|
||||||
|
title:'装机容量(MW)',
|
||||||
|
num:6,
|
||||||
|
color:'#5AC7C0'
|
||||||
|
},{
|
||||||
|
title:'总充电量(MWh)',
|
||||||
|
num:6,
|
||||||
|
color:'#A696FF'
|
||||||
|
},{
|
||||||
|
title:'总放电量(MWh)',
|
||||||
|
num:6,
|
||||||
|
color:'#A696FF'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.card{
|
||||||
|
width: 150px;
|
||||||
|
height: 96px;
|
||||||
|
margin-right: 27px;
|
||||||
|
border-bottom: 4px solid transparent;
|
||||||
|
text-align: center;
|
||||||
|
::v-deep .el-card__body{
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
.info{
|
||||||
|
color: #666666;
|
||||||
|
line-height: 14px;
|
||||||
|
padding-top: 18px;
|
||||||
|
}
|
||||||
|
.num{
|
||||||
|
color: rgba(51,51,51,1);
|
||||||
|
font-size: 26px;
|
||||||
|
line-height: 26px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-top: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
41
src/components/Ems/ZdSelect/index.vue
Normal file
41
src/components/Ems/ZdSelect/index.vue
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<!--站点选择组件-->
|
||||||
|
<template>
|
||||||
|
<div class="zd-select-container">
|
||||||
|
<el-form :inline="true">
|
||||||
|
<el-form-item label="站点选择">
|
||||||
|
<el-select v-model="id" placeholder="请选择换电站名称" :loading="loading" @change="change">
|
||||||
|
<el-option label="站点1" value="1"></el-option>
|
||||||
|
<el-option label="站点2" value="2"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="onSubmit">搜索</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
//todo 动态获取电站列表 默认值,是否有设置默认值的功能
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
id:'',
|
||||||
|
loading:false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
onSubmit(){
|
||||||
|
console.log(this.id)
|
||||||
|
this.$emit('submit',this.id)
|
||||||
|
},
|
||||||
|
change(id){
|
||||||
|
console.log('发生变更',id)
|
||||||
|
this.$emit('change',id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
56
src/mixins/ems/resize.js
Normal file
56
src/mixins/ems/resize.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import { debounce } from '@/utils'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
$_sidebarElm: null,
|
||||||
|
$_resizeHandler: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.initListener()
|
||||||
|
},
|
||||||
|
activated() {
|
||||||
|
if (!this.$_resizeHandler) {
|
||||||
|
// avoid duplication init
|
||||||
|
this.initListener()
|
||||||
|
}
|
||||||
|
|
||||||
|
// when keep-alive chart activated, auto resize
|
||||||
|
this.resize()
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.destroyListener()
|
||||||
|
},
|
||||||
|
deactivated() {
|
||||||
|
this.destroyListener()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// use $_ for mixins properties
|
||||||
|
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
|
||||||
|
$_sidebarResizeHandler(e) {
|
||||||
|
if (e.propertyName === 'width') {
|
||||||
|
this.$_resizeHandler()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initListener() {
|
||||||
|
this.$_resizeHandler = debounce(() => {
|
||||||
|
this.resize()
|
||||||
|
}, 100)
|
||||||
|
window.addEventListener('resize', this.$_resizeHandler)
|
||||||
|
|
||||||
|
this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
|
||||||
|
this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
|
||||||
|
},
|
||||||
|
destroyListener() {
|
||||||
|
window.removeEventListener('resize', this.$_resizeHandler)
|
||||||
|
this.$_resizeHandler = null
|
||||||
|
|
||||||
|
this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
|
||||||
|
},
|
||||||
|
resize() {
|
||||||
|
const { chart } = this
|
||||||
|
chart && chart.resize()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
src/router/ems.js
Normal file
19
src/router/ems.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import Layout from "@/layout/index.vue";
|
||||||
|
|
||||||
|
const ems = [
|
||||||
|
{
|
||||||
|
path: '/zddt',
|
||||||
|
component: Layout,
|
||||||
|
redirect: 'zddt',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: () => import('@/views/ems/zddt/index'),
|
||||||
|
name: 'zddt',
|
||||||
|
meta: { title: '站点地图', icon: 'guide' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export default ems
|
@ -1,5 +1,6 @@
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import Router from 'vue-router'
|
import Router from 'vue-router'
|
||||||
|
import ems from './ems'//EMS管理系统routers引用
|
||||||
|
|
||||||
Vue.use(Router)
|
Vue.use(Router)
|
||||||
|
|
||||||
@ -87,7 +88,9 @@ export const constantRoutes = [
|
|||||||
meta: { title: '个人中心', icon: 'user' }
|
meta: { title: '个人中心', icon: 'user' }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
// EMS管理系统routers
|
||||||
|
...ems
|
||||||
]
|
]
|
||||||
|
|
||||||
// 动态路由,基于用户权限动态去加载
|
// 动态路由,基于用户权限动态去加载
|
||||||
|
76
src/views/ems/zddt/BarChart.vue
Normal file
76
src/views/ems/zddt/BarChart.vue
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<!--站点地图页面柱状图组件-->
|
||||||
|
<template>
|
||||||
|
<div class="bar-chart-container"></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import * as echarts from 'echarts'
|
||||||
|
require('echarts/theme/macarons') // echarts theme
|
||||||
|
import resize from '@/mixins/ems/resize'
|
||||||
|
// todo
|
||||||
|
// 数据获取、数据格式处理、日期在前端处理还是后端返回
|
||||||
|
export default {
|
||||||
|
mixins: [resize],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chart: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.initChart()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
if (!this.chart) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.chart.dispose()
|
||||||
|
this.chart = null
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initChart() {
|
||||||
|
this.chart = echarts.init(this.$el, 'macarons')
|
||||||
|
this.chart.setOption({
|
||||||
|
legend: {
|
||||||
|
left: 'right',
|
||||||
|
bottom: '10',
|
||||||
|
},
|
||||||
|
tooltip: {},
|
||||||
|
xAxis: { type: 'category' },
|
||||||
|
yAxis: { },
|
||||||
|
dataset:{
|
||||||
|
source:[
|
||||||
|
['product','充电量','放电量'],
|
||||||
|
['第一天',10,20],
|
||||||
|
['第二天',20,30],
|
||||||
|
['第三天',20,30],
|
||||||
|
['第四天',20,10],
|
||||||
|
['第五天',200,80],
|
||||||
|
['第六天',210,300],
|
||||||
|
['第七天',200,30],
|
||||||
|
]
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'bar',//柱状图
|
||||||
|
color:'#A796FF',//柱的颜色
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'bar',//柱状图
|
||||||
|
color:'#FFBE01',//柱的颜色
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.bar-chart-container{
|
||||||
|
width:100%;
|
||||||
|
height: 260px;
|
||||||
|
}
|
||||||
|
</style>
|
122
src/views/ems/zddt/index.vue
Normal file
122
src/views/ems/zddt/index.vue
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<template>
|
||||||
|
<div class="ems-dashboard-editor-container">
|
||||||
|
<zd-info></zd-info>
|
||||||
|
<div class="content ems-content-conatiner ">
|
||||||
|
<div class="map-container"></div>
|
||||||
|
<div class="zd-msg-container">
|
||||||
|
<div class="zd-msg-top">
|
||||||
|
<zd-select></zd-select>
|
||||||
|
<el-card class="single-zd-detail-container">
|
||||||
|
<div slot="header">
|
||||||
|
<span class="header-title">基本信息</span>
|
||||||
|
<el-button style="float: right; padding: 3px 0" type="text" size="small">查看详情</el-button>
|
||||||
|
</div>
|
||||||
|
<div class="single-zd-name">上海电动工具所站</div>
|
||||||
|
<!-- 四个方块-->
|
||||||
|
<el-row :gutter="14">
|
||||||
|
<el-col :span="12" class="single-square-box-container" v-for="(item,index) in singleZdSqaure" :key="index+'singleSquareBox'">
|
||||||
|
<single-square-box :data="item"></single-square-box>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<!-- 基本信息 -->
|
||||||
|
<el-descriptions class="single-zd-info-container" :column="1" >
|
||||||
|
<el-descriptions-item v-for="(item,index) in singleZdInfo" :key="index+'singleZdInfo'" :label="item.title">{{item.value}}</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
<!-- echarts柱状图-->
|
||||||
|
<bar-chart></bar-chart>
|
||||||
|
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ZdInfo from '@/components/Ems/ZdBaseInfo/index.vue'
|
||||||
|
import ZdSelect from '@/components/Ems/ZdSelect/index.vue'
|
||||||
|
import SingleSquareBox from '@/components/Ems/SingleSquareBox/index.vue'
|
||||||
|
import BarChart from './BarChart.vue'
|
||||||
|
export default {
|
||||||
|
components:{ZdSelect,ZdInfo,SingleSquareBox,BarChart},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 单个电站 四个方块数据
|
||||||
|
singleZdSqaure:[{
|
||||||
|
title:'今日充电(kWh)',
|
||||||
|
value:'22.74',
|
||||||
|
bgColor:'#FFE5E5'
|
||||||
|
},{
|
||||||
|
title:'累计充电(kWh)',
|
||||||
|
value:'22.74',
|
||||||
|
bgColor:'#FFE5E5'
|
||||||
|
},{
|
||||||
|
title:'今日放电(kWh)',
|
||||||
|
value:'22.74',
|
||||||
|
bgColor:'#EEEBFF'
|
||||||
|
},{
|
||||||
|
title:'累计放电(kWh)',
|
||||||
|
value:'22.74',
|
||||||
|
bgColor:'#EEEBFF'
|
||||||
|
}],
|
||||||
|
// 单个电站 基本信息
|
||||||
|
singleZdInfo:[{
|
||||||
|
title:'电站位置',
|
||||||
|
value:'安徽省合肥市高新区中国声谷站',
|
||||||
|
},{
|
||||||
|
title:'投运时间',
|
||||||
|
value:'2024-10-11',
|
||||||
|
},{
|
||||||
|
title:'装机功率',
|
||||||
|
value:'215kW',
|
||||||
|
},{
|
||||||
|
title:'装机容量',
|
||||||
|
value:'430',
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.content{
|
||||||
|
display: flex;
|
||||||
|
padding:24px;
|
||||||
|
padding-right: 0;
|
||||||
|
margin-top:24px;
|
||||||
|
.map-container{
|
||||||
|
background: black;
|
||||||
|
flex:auto;
|
||||||
|
}
|
||||||
|
.zd-msg-container{
|
||||||
|
width: 500px;
|
||||||
|
padding: 24px;
|
||||||
|
::v-deep .el-card__header{
|
||||||
|
background: #F1F5FB;
|
||||||
|
border-bottom: none;
|
||||||
|
.header-title{
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.single-zd-name{
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 23px;
|
||||||
|
color: #FFBD00;
|
||||||
|
font-size: 16px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
.single-square-box-container{
|
||||||
|
height: 78px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.single-zd-info-container{
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: 10px;
|
||||||
|
color:#666666;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
Reference in New Issue
Block a user