父组件:Home.vue
<template>
<div class="home">
<top-view />
<sales-view />
<bottom-view />
<map-view />
</div>
</template>
<script>
import TopView from '../components/TopView'
import SalesView from '../components/SalesView'
import BottomView from '../components/BottomView'
import MapView from '../components/MapView'
export default {
name: 'Home',
components:{
TopView,
SalesView,
BottomView,
MapView
}
}
</script>
<style>
.home {
width: 100%;
padding: 20px;
background: #eee;
box-sizing: border-box;
}
</style>
Components:子组件
plugins:element.js按需导入组件
import Vue from 'vue'
import { Card,Row,col } from 'element-ui'
Vue.use(Card)
Vue.use(Row)
Vue.use(col)
构建TopView.vue组件
<template>
<div class="top-view">
<el-row :gutter="20">
<el-col :span="6">
<el-card shadow="hover">
1
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
2
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
3
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
4
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name:'TopView',
components: {
}
}
</script>
<style lang="scss" scoped>
</style>
- 如下效果
构建公共卡片CommonCard.vue组件
<template>
<div class="common-card">
<div class="title">{{title}}</div>
<div class="value">{{value}}</div>
<div class="chart">
<slot></slot>
</div>
<div class="line" />
<div class="total">
<slot name="footer"></slot>
</div>
</div>
</template>
<script>
export default {
props: {
title: String,
value: [String, Number]
}
}
</script>
<style lang="scss" scoped>
.title {
font-size: 12px;
color: #999;
}
.value {
font-size: 25px;
color: #000;
margin-top: 5px;
letter-spacing: 1px;
}
.chart {
height: 50px;
}
.line {
margin: 10px 0;
border-top: 1px solid #eee;
}
.total {
font-size: 12px;
color: #666;
}
</style>
<style lang="scss">
.emphasis {
margin-left: 5px;
color: #333;
font-weight: 700;
}
.increase {
width: 0;
height: 0;
border-width: 3px;
border-color: transparent transparent red transparent;
border-style: solid;
margin: 0 0 3px 5px;
}
.decrease {
width: 0;
height: 0;
border-width: 3px;
border-color: green transparent transparent transparent;
border-style: solid;
margin: 3px 0 0 5px;
}
</style>
构建各个卡片内容组件
- 分别对应下面的-销售-订单-用户模块
累计销售额组件构建TotalSales.vue
<template>
<common-card
title="累计销售额"
:value="salesToday"
>
<template>
<div class="compare-wrapper">
<div class="compare">
<span>日同比</span>
<span class="emphasis">{{salesGrowthLastDay}}</span>
<div class="increase" />
</div>
<div class="compare">
<span>月同比</span>
<span class="emphasis">{{salesGrowthLastMonth}}</span>
<div class="decrease" />
</div>
</div>
</template>
<template v-slot:footer>
<span>昨日销售额 </span>
<span class="emphasis">{{salesLastDay}}</span>
</template>
</common-card>
</template>
<script>
import commonCardMixin from '../../mixins/commonCardMixin'
import commonDataMixin from '../../mixins/commonDataMixin'
export default {
mixins: [commonCardMixin, commonDataMixin]
}
</script>
<style lang="scss" scoped>
.compare-wrapper {
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
.compare {
display: flex;
align-items: center;
font-size: 12px;
margin-top: 3px;
color: #666;
}
}
</style>
- 效果图
累计订单组件构建TotalOrders.vue
<template>
<common-card
title="累计订单量"
:value="orderToday"
>
<template>
<v-chart :options="getOptions()" />
</template>
<template v-slot:footer>
<span>昨日订单量 </span>
<span class="emphasis">{{orderLastDay}}</span>
</template>
</common-card>
</template>
<script>
import commonCardMixin from '../../mixins/commonCardMixin'
import commonDataMixin from '../../mixins/commonDataMixin'
export default {
mixins: [commonCardMixin, commonDataMixin],
methods: {
getOptions() {
return this.orderTrend.length > 0 ? {
xAxis: {
type: 'category',
show: false,
boundaryGap: false
},
yAxis: {
show: false
},
series: [{
type: 'line',
data: this.orderTrend,
areaStyle: {
color: 'purple'
},
lineStyle: {
width: 0
},
itemStyle: {
opacity: 0
},
smooth: true
}],
grid: {
top: 0,
bottom: 0,
left: 0,
right: 0
}
} : null
}
}
}
</script>
- 订单量组建效果
今日用户组件构建TotalOrders.vue
<template>
<common-card
title="今日交易用户数"
:value="orderUser"
>
<template>
<v-chart :options="getOptions()" />
</template>
<template v-slot:footer>
<span>退货率 </span>
<span class="emphasis">{{returnRate}}</span>
</template>
</common-card>
</template>
<script>
import commonCardMixin from '../../mixins/commonCardMixin'
import commonDataMixin from '../../mixins/commonDataMixin'
export default {
mixins: [commonCardMixin, commonDataMixin],
methods: {
getOptions() {
return {
color: ['#3398DB'],
tooltip: {},
series: [{
name: '用户实时交易量',
type: 'bar',
data: this.orderUserTrend,
barWidth: '60%'
}],
xAxis: {
type: 'category',
data: this.orderUserTrendAxis,
show: false
},
yAxis: {
show: false
},
grid: {
top: 0,
left: 0,
bottom: 0,
right: 0
}
}
}
}
}
</script>
<style lang="scss" scoped>
</style>
- 效果
全部用户组件构建TotalUsers.vue
<template>
<common-card
title="累计用户数"
:value="userToday"
>
<template>
<v-chart :options="getOptions()" />
</template>
<template v-slot:footer>
<div class="total-users-footer">
<span>日同比</span>
<span class="emphasis">{{userGrowthLastDay}}</span>
<div class="increase" />
<span class="month">月同比</span>
<span class="emphasis">{{userGrowthLastMonth}}</span>
<div class="decrease" />
</div>
</template>
</common-card>
</template>
<script>
import commonCardMixin from '../../mixins/commonCardMixin'
import commonDataMixin from '../../mixins/commonDataMixin'
export default {
mixins: [commonCardMixin, commonDataMixin],
methods: {
getOptions() {
return {
grid: {
left: 0,
right: 0,
top: 0,
bottom: 0
},
xAxis: {
type: 'value',
show: false
},
yAxis: {
type: 'category',
show: false
},
series: [{
name: '上月平台用户数',
type: 'bar',
stack: '总量',
data: [this.userLastMonth],
barWidth: 10,
itemStyle: {
color: '#45c946'
}
}, {
name: '今日平台用户数',
type: 'bar',
stack: '总量',
data: [this.userTodayNumber],
itemStyle: {
color: '#eee'
}
}, {
type: 'custom',
stack: '总量',
data: [this.userLastMonth],
renderItem: (params, api) => {
const value = api.value(0)
const endPoint = api.coord([value, 0])
return {
type: 'group',
position: endPoint,
children: [{
type: 'path',
shape: {
d: 'M1024 255.996 511.971 767.909 0 255.996 1024 255.996z',
x: -5,
y: -20,
width: 10,
height: 10,
layout: 'cover'
},
style: {
fill: '#45c946'
}
}, {
type: 'path',
shape: {
d: 'M0 767.909l512.029-511.913L1024 767.909 0 767.909z',
x: -5,
y: 10,
width: 10,
height: 10,
layout: 'cover'
},
style: {
fill: '#45c946'
}
}]
}
}
}]
}
}
}
}
</script>
<style lang="scss" scoped>
.total-users-footer {
display: flex;
align-items: center;
.month {
margin-left: 10px;
}
}
</style>
到这里核心指标TopViews.vue组件构建完成啦