260 lines
5.8 KiB
Vue
260 lines
5.8 KiB
Vue
<script setup>
|
||
import { onMounted, reactive, ref } from "vue";
|
||
import * as echarts from 'echarts';
|
||
import border from "../../../components/border.vue"
|
||
import { orderRanking } from "@/api/index.js"
|
||
import { useAppStore } from "@/store/app.js"
|
||
|
||
const appStore = useAppStore();
|
||
|
||
const xData2 = ref([]);
|
||
const data1 = ref([]);
|
||
const data_bottom = ref([]);
|
||
const orderCount = ref(0);
|
||
|
||
const echartsRef = ref(null);
|
||
const initMap = () => {
|
||
|
||
// 基于DOM元素初始化echarts实例
|
||
const chart = echarts.init(echartsRef.value);
|
||
|
||
let option = {
|
||
backgroundColor: 'rgba(0,0,0,0)',
|
||
tooltip: {
|
||
trigger: 'item',
|
||
backgroundColor: 'rgba(91, 219, 246, 0.7)',
|
||
textStyle: {
|
||
color: '#fff'
|
||
}
|
||
},
|
||
grid: {
|
||
left: 60,
|
||
bottom: 50
|
||
},
|
||
xAxis: {
|
||
data: xData2.value,
|
||
axisTick: {
|
||
show: false
|
||
},
|
||
axisLine: {
|
||
show: false
|
||
},
|
||
axisLabel: {
|
||
// interval: 0,
|
||
textStyle: {
|
||
color: '#fff',
|
||
fontSize: 10,
|
||
},
|
||
margin: 20, //刻度标签与轴线之间的距离。
|
||
formatter: function (value) {
|
||
return value.split("").slice(0, 3).join("\n"); // 将文字逐个字符换行显示
|
||
}
|
||
},
|
||
|
||
},
|
||
yAxis: {
|
||
splitLine: {
|
||
show: true,
|
||
lineStyle: {
|
||
color: 'rgba(0, 156, 255, 0.10)' // 设置分隔线颜色
|
||
}
|
||
},
|
||
axisTick: {
|
||
show: false
|
||
},
|
||
axisLine: {
|
||
show: false
|
||
},
|
||
axisLabel: {
|
||
textStyle: {
|
||
color: '#fff',
|
||
fontSize: 10,
|
||
},
|
||
}
|
||
},
|
||
series: [
|
||
{//三个最低下的圆片
|
||
"name": "",
|
||
"type": "pictorialBar",
|
||
"symbolSize": [10, 4],
|
||
"symbolOffset": [0, 2],
|
||
"z": 12,
|
||
itemStyle: {
|
||
opacity: 1,
|
||
color: function (params) {
|
||
return new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||
offset: 0,
|
||
color: '#0E60B2' // 0% 处的颜色
|
||
}, {
|
||
offset: 1,
|
||
color: '#5BDBF6'// 100% 处的颜色
|
||
}], false)
|
||
}
|
||
},
|
||
"data": data_bottom.value
|
||
},
|
||
|
||
|
||
//下半截柱状图
|
||
{
|
||
name: '2020',
|
||
type: 'bar',
|
||
barWidth: 10,
|
||
barGap: '-100%',
|
||
itemStyle: {//lenged文本
|
||
opacity: .7,
|
||
color: function (params) {
|
||
return new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||
offset: 0,
|
||
color: '#0E60B2' // 0% 处的颜色
|
||
}, {
|
||
offset: 1,
|
||
color: '#5BDBF6'// 100% 处的颜色
|
||
}], false)
|
||
}
|
||
},
|
||
|
||
data: data1.value
|
||
},
|
||
|
||
{ // 替代柱状图 默认不显示颜色,是最下方柱图(邮件营销)的value值 - 20
|
||
type: 'bar',
|
||
barWidth: 10,
|
||
barGap: '-100%',
|
||
stack: '广告',
|
||
itemStyle: {
|
||
color: 'transparent'
|
||
},
|
||
data: data1.value
|
||
},
|
||
|
||
{
|
||
"name": "",
|
||
"type": "pictorialBar",
|
||
"symbolSize": [10, 4],
|
||
"symbolOffset": [0, -2],
|
||
"z": 12,
|
||
itemStyle: {
|
||
opacity: 1,
|
||
color: function (params) {
|
||
return new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||
offset: 0,
|
||
color: '#0E60B2' // 0% 处的颜色
|
||
}, {
|
||
offset: 1,
|
||
color: '#5BDBF6'// 100% 处的颜色
|
||
}], false)
|
||
}
|
||
},
|
||
"symbolPosition": "end",
|
||
"data": data1.value
|
||
},
|
||
|
||
|
||
]
|
||
}
|
||
|
||
// 使用配置项显示图表
|
||
chart.setOption(option);
|
||
}
|
||
|
||
const loadOrderList = () => {
|
||
orderRanking({
|
||
areaCode: appStore.address.areaCode,
|
||
streetCode: appStore.address.streetCode,
|
||
type: 2, // 1表示今日, 2表示总计
|
||
}).then((res) => {
|
||
orderCount.value = res.data.orderCount;
|
||
res.data.townOrderList.forEach(e => {
|
||
xData2.value.push(e.street_name);
|
||
data1.value.push(e.order_count);
|
||
data_bottom.value.push(1)
|
||
})
|
||
setTimeout(() => {
|
||
initMap()
|
||
})
|
||
})
|
||
}
|
||
|
||
onMounted(() => {
|
||
loadOrderList();
|
||
})
|
||
</script>
|
||
|
||
<template>
|
||
<border>
|
||
<div class="box">
|
||
<div class="title">订单总数</div>
|
||
<div class="box-c">
|
||
<div class="left">
|
||
<div class="img">
|
||
<div class="text">{{ orderCount }}</div>
|
||
</div>
|
||
<div>订单总数</div>
|
||
</div>
|
||
<div class="map" ref="echartsRef"></div>
|
||
</div>
|
||
</div>
|
||
</border>
|
||
</template>
|
||
|
||
<style scoped lang="scss">
|
||
.box {
|
||
height: 88%;
|
||
padding: 20px;
|
||
font-size: 0.8rem;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
width: calc(100% - 40px);
|
||
.title {
|
||
width: 100%;
|
||
background-image: url(../../../assets/img/title2.png);
|
||
background-size: 100% 100%;
|
||
height: 40px;
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
font-family: "ifonts";
|
||
font-size: 1.2rem;
|
||
}
|
||
.box-c {
|
||
flex: 1;
|
||
width: 100%;
|
||
height: calc(100% - 80px);
|
||
display: flex;
|
||
justify-content: space-between;
|
||
.left {
|
||
width: 11rem;
|
||
height: 100%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-evenly;
|
||
.img {
|
||
color: #5bdbf6;
|
||
font-family: "ifonts";
|
||
width: 10.2rem;
|
||
height: 10.5rem;
|
||
background-image: url(../../../assets/img/order_ball.png);
|
||
background-size: 100% 100%;
|
||
position: relative;
|
||
margin-top: 2rem;
|
||
.text {
|
||
position: absolute;
|
||
top: 50%;
|
||
left: 50%;
|
||
transform: translate(-50%, -50%);
|
||
padding-bottom: 2rem;
|
||
font-size: 1.4rem;
|
||
}
|
||
}
|
||
}
|
||
.map {
|
||
flex: 1;
|
||
height: 100%;
|
||
}
|
||
}
|
||
}
|
||
</style>
|