2023-03-29 19:07:13 +08:00

189 lines
5.5 KiB
Vue

<template>
<div class="main">
<div class="homePlace">
<canvas v-if="!homePlacePath" class="carNum" canvas-id="homePlace" id="homePlace"/>
<image v-if="homePlacePath" class="carNum" :src="homePlacePath"></image>
</div>
<div class="homeCity">
<view class="item" v-for="(item,index) in progressList" :key="index">
<view class="top">
<p class="title">{{item.name}}</p>
<p class="rate"> {{item.rate}}</p>
</view>
<view class="progress">
<view class="have" :style="{width:item.rate}"></view>
</view>
</view>
</div>
</div>
</template>
<script>
import uCharts from '@/components/u-charts.js';
var uChartsInstance = {};
export default {
name: "homePlace",
data() {
return {
homePlacePath:'',//图片路径
progressList:[]//进度条数组
}
},
props: {
homeData: {
type: Array,
default: () => []
},
homeCity:{
type:Array,
default:() => []
}
},
watch: {
homeData: {
handler(value) {
this.handleCarData(value)
}
},
homeCity:{
handler(value){
let all = 0
value.forEach(item=>{
all+=item.value
})
value.forEach(item=>{
item.rate = ((item.value/all)*100).toFixed(2) + '%'
})
this.progressList = value
},
deep:true
}
},
methods: {
// 处理传入的数据
handleCarData(value) {
let res = {
series:[
{
data: value
}
]
}
this.drawCharts('homePlace', res)
},
drawCharts(id, data) {
const ctx = uni.createCanvasContext(id, this);
let phoneInfo = uni.getStorageSync('phoneInfo')
let width = phoneInfo.screenWidth-32
uChartsInstance[id] = new uCharts({
type: "ring",
context: ctx,
width: width,
height: 160,
series: data.series,
animation: true,
rotate: false,
rotateLock: false,
canvas2d: true,
background: "#FFFFFF",
color: ["#1E80FF", "#456497","#748AAE","#ACB9CD","#CAD0DA"],
padding: [5, 5, 5, 5],
dataLabel: false,
enableScroll: false,
legend: {
show: true,
position: "right",
lineHeight: 25
},
extra: {
ring: {
ringWidth: 12,
activeOpacity: 0.5,
activeRadius: 10,
offsetAngle: 0,
labelWidth: 15,
border: false,
borderWidth: 3,
borderColor: "#FFFFFF"
}
}
});
setTimeout(()=>{
this.canvasToTempImage('homePlace')
},2000)
},
canvasToTempImage(id){
uni.canvasToTempFilePath({
canvasId:id,
complete:(res)=>{
if (res.tempFilePath){
uni.getFileSystemManager().readFile({
filePath: res.tempFilePath,
encoding: 'base64',
success: res => {
let base64 = 'data:image/png;base64,' + res.data;
this.homePlacePath = base64
}
})
}
}
},this)
}
}
}
</script>
<style scoped lang="scss">
.main{
.homePlace{
width: 100%;
.carNum{
width: 100%;
height: 160px;
}
}
.homeCity{
width: 100%;
.item{
width: 100%;
margin-bottom: 12px;
.top{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 4px;
.title{
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #160002;
line-height: 20px;
}
.rate{
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #160002;
line-height: 20px;
}
}
.progress{
width: 100%;
height: 14px;
background: #E5E8EF;
border-radius: 2px;
position: relative;
.have{
height: 100%;
background: #1E80FF;
border-radius: 2px;
position: absolute;
left: 0;top: 0;
}
}
}
}
}
</style>