|
@@ -1,411 +1,141 @@
|
|
|
<template>
|
|
|
- <div class="gdbh">
|
|
|
- <div class="box_gdbh">
|
|
|
- <div class="title">耕地保护</div>
|
|
|
- <div class="centent">
|
|
|
- <div class="item">
|
|
|
- <p class="text">
|
|
|
- <span>·</span>
|
|
|
- 地保有量
|
|
|
- <span>354.56</span>
|
|
|
- KM2
|
|
|
- </p>
|
|
|
- <p>
|
|
|
- <span>·</span>
|
|
|
- 永久基本农田
|
|
|
- <span>354.56</span>
|
|
|
- KM2
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <div class="item">
|
|
|
- <p class="text">
|
|
|
- <span>·</span>
|
|
|
- 地保有量
|
|
|
- <span>354.56</span>
|
|
|
- KM2
|
|
|
- </p>
|
|
|
- <p>
|
|
|
- <span>·</span>
|
|
|
- 永久基本农田
|
|
|
- <span>354.56</span>
|
|
|
- KM2
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div id="gdbh_echart">
|
|
|
-
|
|
|
- </div>
|
|
|
+ <borderTemplate titleName="耕地保护" class="gdbh">
|
|
|
+ <div class="content">
|
|
|
+ <div class="item" v-for="(sd, i) in sdlist" :key="i">
|
|
|
+ <div class="icon" :class="`icongdbh${i}`"></div>
|
|
|
+ <div class="text">
|
|
|
+ <p>{{ sd.name }}</p>
|
|
|
+ <span class="sdvalue">{{ sd.value || 0 }}</span>
|
|
|
+ <span class="unit">{{ sd.unit }}</span>
|
|
|
</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+ <highPie id="gdbh_echart" ref="echartRef"></highPie>
|
|
|
+ </borderTemplate>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
|
|
|
+import borderTemplate from "./borderTemplate.vue";
|
|
|
+import highPie from "../../components/echartsTemplate/highPie.vue";
|
|
|
|
|
|
export default {
|
|
|
- components: {},
|
|
|
- data() {
|
|
|
- return {};
|
|
|
- },
|
|
|
- //监听属性 类似于data概念
|
|
|
- computed: {},
|
|
|
- //监控data中的数据变化
|
|
|
- watch: {},
|
|
|
- //方法集合
|
|
|
-
|
|
|
- beforeCreate() { }, //生命周期 - 创建之前
|
|
|
- created() { }, //生命周期 - 创建完成(可以访问当前this实例)
|
|
|
- beforeMount() { }, //生命周期 - 挂载之前
|
|
|
- methods: {
|
|
|
- getRenKou() {
|
|
|
- var dom = document.getElementById('gdbh_echart');
|
|
|
- var myChart = window.echarts.init(dom);
|
|
|
-
|
|
|
- let data = [
|
|
|
- { name: '水田', value: 30 },
|
|
|
- { name: '水浇地', value: 40 },
|
|
|
- { name: '旱地', value: 50 },
|
|
|
- // { name: '住宿', value: 24 },
|
|
|
- ]
|
|
|
- for (var i = 0; i < data.length; i++) {
|
|
|
- for (var j = i + 1; j < data.length; j++) {
|
|
|
- //如果第一个比第二个大,就交换他们两个位置
|
|
|
- if (data[i].value < data[j].value) {
|
|
|
- var temp = data[i];
|
|
|
- data[i] = data[j];
|
|
|
- data[j] = temp;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- let pm = []
|
|
|
- for (var i = 0; i < data.length; i++) {
|
|
|
- let k = i + 1
|
|
|
- pm.push('NO.' + k)
|
|
|
- }
|
|
|
- data.forEach(function (value, index, obj) {
|
|
|
- value.pm = pm[index]
|
|
|
- })
|
|
|
- // console.log('ssss', data)
|
|
|
- const colors = ['rgb(96,149,239)', 'rgb(239,157,147)', 'rgb(232,191,72)', 'rgb(189,147,227)']
|
|
|
- const chartData = data.map((item, index) => ({
|
|
|
- value: item.value,
|
|
|
- name: item.name,
|
|
|
- pm: item.pm,
|
|
|
- itemStyle: {
|
|
|
- shadowBlur: 20,
|
|
|
- shadowColor: `#${(((index + 1) % 7) + 10) * 100 + 99}`,
|
|
|
- shadowOffsetx: 25,
|
|
|
- shadowOffsety: 20,
|
|
|
- color: colors[index % colors.length],
|
|
|
- },
|
|
|
- }))
|
|
|
- const sum = chartData.reduce((per, cur) => per + cur.value, 0)
|
|
|
- const gap = (1 * sum) / 100
|
|
|
- const pieData1 = []
|
|
|
- const gapData = {
|
|
|
- name: '',
|
|
|
- value: gap,
|
|
|
- itemStyle: {
|
|
|
- color: 'transparent',
|
|
|
- },
|
|
|
- }
|
|
|
- let totalRatio = []
|
|
|
- // let totalPercent = 0
|
|
|
- for (let i = 0; i < chartData.length; i++) {
|
|
|
- // 计算占比
|
|
|
- // let ratio = (chartData[i].value / sum).toFixed(2) * 100;
|
|
|
- // 累加占比到总占比中
|
|
|
- // totalRatio.push(ratio*100)
|
|
|
- let ratio = (chartData[i].value / sum) * 100
|
|
|
- let percent = Math.round(ratio)
|
|
|
- totalRatio.push(percent)
|
|
|
- // totalPercent += percent
|
|
|
- // 第一圈数据
|
|
|
- pieData1.push({
|
|
|
- ...chartData[i],
|
|
|
- })
|
|
|
- pieData1.push(gapData)
|
|
|
- }
|
|
|
- // 补充最后一项占比百分比保证之和为100%
|
|
|
- // totalRatio[0].value += 100 - totalPercent
|
|
|
- let option = {
|
|
|
- backgroundColor: 'rgba(1,1,1,0)',
|
|
|
-
|
|
|
- title: {
|
|
|
- show: true,
|
|
|
- // text: sum
|
|
|
- text: '耕地来源',
|
|
|
- x: '49%',
|
|
|
- y: '32%',
|
|
|
- itemGap: 6,
|
|
|
- textStyle: {
|
|
|
- color: '#fff',
|
|
|
- fontSize: 11,
|
|
|
- fontWeight: '400',
|
|
|
- lineHeight: 8,
|
|
|
- },
|
|
|
- subtextStyle: {
|
|
|
- color: '#fff',
|
|
|
- fontSize: 8,
|
|
|
- fontWeight: '400',
|
|
|
- lineHeight: 8,
|
|
|
- },
|
|
|
- textAlign: 'center',
|
|
|
- },
|
|
|
-
|
|
|
- // 图例
|
|
|
- legend: {
|
|
|
- show: true,
|
|
|
- orient: 'horizontal',
|
|
|
- icon: 'rect',
|
|
|
- textStyle: {
|
|
|
- color: '#fff',
|
|
|
- fontSize: 10,
|
|
|
- },
|
|
|
- top: '70%',
|
|
|
- // left: '20%',
|
|
|
- itemGap: 14,
|
|
|
- itemHeight: 14,
|
|
|
- itemWidth: 14,
|
|
|
- data: chartData,
|
|
|
- formatter: function (name) {
|
|
|
- const selectedItem = chartData.find((item) => `${item.name}`.includes(`${name}`));
|
|
|
- // if (selectedItem) {
|
|
|
- // const { value } = selectedItem;
|
|
|
- // const { pm } = selectedItem;
|
|
|
- // console.log('dddd', selectedItem)
|
|
|
- // const p = ((value / sum) * 100).toFixed(2);
|
|
|
- // const area = `${value}m²`;
|
|
|
- // // console.log(`{icon|${pm}} {name|${name}} {percent|${p}%} {area|${area}} `);
|
|
|
-
|
|
|
- // return `{icon|${pm}} {name|${name}} {percent|${p}%} {area|${area}} `;
|
|
|
- // } else {
|
|
|
- // console.log(name);
|
|
|
-
|
|
|
- // return name;
|
|
|
- // }
|
|
|
-
|
|
|
- if (selectedItem) {
|
|
|
- return name;
|
|
|
-
|
|
|
- }
|
|
|
- },
|
|
|
- },
|
|
|
- series: [
|
|
|
- // 中间圆环
|
|
|
- {
|
|
|
- name: '',
|
|
|
- type: 'pie',
|
|
|
- roundCap: true,
|
|
|
- radius: ['36%', '52%'],
|
|
|
- center: ['50%', '35%'],
|
|
|
- data: pieData1,
|
|
|
- labelLine: {
|
|
|
- length: 8,
|
|
|
- length2: 16,
|
|
|
- lineStyle: {
|
|
|
- width: 1,
|
|
|
- },
|
|
|
- },
|
|
|
- label: {
|
|
|
- show: false,
|
|
|
- fontFamily: 'ysbth',
|
|
|
- position: 'outside',
|
|
|
- padding: [0, -4, 0, -4],
|
|
|
- formatter(params) {
|
|
|
- if (params.name === '') {
|
|
|
- return ''
|
|
|
- }
|
|
|
- return `${params.percent.toFixed(0)}% `
|
|
|
- },
|
|
|
- color: '#fff',
|
|
|
- fontSize: '14px',
|
|
|
- lineHeight: 10,
|
|
|
- },
|
|
|
- emphasis: {
|
|
|
- // 鼠标移入时显示
|
|
|
- label: {
|
|
|
- show: true,
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- // 最里面圆环
|
|
|
- {
|
|
|
- type: 'pie',
|
|
|
- radius: ['28%', '30%'],
|
|
|
- center: ['50%', '35%'],
|
|
|
- animation: false,
|
|
|
- hoverAnimation: false,
|
|
|
- data: [
|
|
|
- {
|
|
|
- value: 100,
|
|
|
- },
|
|
|
- ],
|
|
|
- label: {
|
|
|
- show: false,
|
|
|
- },
|
|
|
- itemStyle: {
|
|
|
- color: '#3BC5EF',
|
|
|
- },
|
|
|
- },
|
|
|
- // 最里面圆环内的背景圆
|
|
|
- {
|
|
|
- name: '',
|
|
|
- type: 'pie',
|
|
|
- startAngle: 90,
|
|
|
- radius: '28%',
|
|
|
- animation: false,
|
|
|
- hoverAnimation: false,
|
|
|
- center: ['50%', '35%'],
|
|
|
- itemStyle: {
|
|
|
- labelLine: {
|
|
|
- show: false,
|
|
|
- },
|
|
|
- color: {
|
|
|
- type: 'radial',
|
|
|
- x: 0.5,
|
|
|
- y: 0.5,
|
|
|
- r: 1,
|
|
|
- colorStops: [
|
|
|
- {
|
|
|
- offset: 1,
|
|
|
- color: 'rgba(50,171,241, 0)',
|
|
|
- },
|
|
|
- {
|
|
|
- offset: 0.5,
|
|
|
- color: 'rgba(50,171,241, .4)',
|
|
|
- },
|
|
|
- {
|
|
|
- offset: 0,
|
|
|
- color: 'rgba(55,70,130, 0)',
|
|
|
- },
|
|
|
- ],
|
|
|
- global: false, // 缺省为 false
|
|
|
- },
|
|
|
- shadowBlur: 60,
|
|
|
- },
|
|
|
- data: [
|
|
|
- {
|
|
|
- value: 100,
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- // 最外面的圆环
|
|
|
- {
|
|
|
- type: 'pie',
|
|
|
- color: ['#1a4a8c', 'rgba(0,0,0,0)', '#1a4a8c', 'rgba(0,0,0,0)'],
|
|
|
- radius: ['53%', '54%'],
|
|
|
- center: ['50%', '35%'],
|
|
|
- label: {
|
|
|
- show: false,
|
|
|
- },
|
|
|
- select: {
|
|
|
- display: false,
|
|
|
- },
|
|
|
- tooltip: {
|
|
|
- show: false,
|
|
|
- },
|
|
|
- data: totalRatio,
|
|
|
- },
|
|
|
- ],
|
|
|
- }
|
|
|
-
|
|
|
- myChart.setOption(option);
|
|
|
- },
|
|
|
- },
|
|
|
- mounted() {
|
|
|
- this.getRenKou();
|
|
|
- },
|
|
|
- beforeUpdate() { }, //生命周期 - 更新之前
|
|
|
- updated() { }, //生命周期 - 更新之后
|
|
|
- beforeDestroy() { }, //生命周期 - 销毁之前
|
|
|
- destroy() { },//生命周期 - 销毁完成
|
|
|
- activated() { }, //若组件实例是 <KeepAlive> 缓存树的一部分,当组件被插入到 DOM 中时调用。
|
|
|
- deactivated() { } //若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用。
|
|
|
+ components: { borderTemplate, highPie },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ sdlist: [
|
|
|
+ { name: "耕地保有量", value: "", unit: "km²" },
|
|
|
+ { name: "补充耕地项目", value: "", unit: "个" },
|
|
|
+ { name: "永久基本农田", value: "", unit: "km²" },
|
|
|
+ { name: "补充耕地面积", value: "", unit: "km²" },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ },
|
|
|
+ //监听属性 类似于data概念
|
|
|
+ computed: {},
|
|
|
+ //监控data中的数据变化
|
|
|
+ watch: {},
|
|
|
+ //方法集合
|
|
|
+
|
|
|
+ methods: {},
|
|
|
+ mounted() {
|
|
|
+ let data = [
|
|
|
+ ["货1", 23],
|
|
|
+ ["客1", 18],
|
|
|
+ ["货2", 23],
|
|
|
+ ["客2", 18],
|
|
|
+ ];
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.echartRef.setOptions(data);
|
|
|
+ });
|
|
|
+ },
|
|
|
};
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
.gdbh {
|
|
|
- border-width: 0px;
|
|
|
+ top: 10px !important;
|
|
|
+ .content {
|
|
|
+ // border: #00FFFF 1px solid;
|
|
|
position: absolute;
|
|
|
- left: 1366px;
|
|
|
- top: 20px;
|
|
|
- display: -ms-flexbox;
|
|
|
- display: flex;
|
|
|
-
|
|
|
- .box_gdbh {
|
|
|
- font-family: 'Arial Normal', 'Arial';
|
|
|
- font-weight: 400;
|
|
|
- font-style: normal;
|
|
|
- font-size: 13px;
|
|
|
- letter-spacing: normal;
|
|
|
- color: #333333;
|
|
|
- text-align: center;
|
|
|
- line-height: normal;
|
|
|
- text-transform: none;
|
|
|
- border-width: 0px;
|
|
|
- position: absolute;
|
|
|
- left: 0px;
|
|
|
- top: 0px;
|
|
|
- width: 535px;
|
|
|
- height: 260px;
|
|
|
- background: inherit;
|
|
|
- background-color: rgba(3, 25, 67, 0.698039215686274);
|
|
|
- border: none;
|
|
|
- border-radius: 0px;
|
|
|
- -webkit-box-shadow: none;
|
|
|
- box-shadow: none;
|
|
|
-
|
|
|
- .title {
|
|
|
- border-width: 0px;
|
|
|
- width: 100%;
|
|
|
- height: 40px;
|
|
|
- font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
|
- font-weight: 700;
|
|
|
- font-style: normal;
|
|
|
- color: #00FFFF;
|
|
|
- padding: 2%;
|
|
|
- text-align: justify;
|
|
|
- }
|
|
|
-
|
|
|
- #gdbh_echart {
|
|
|
- width: 280px;
|
|
|
- height: 230px;
|
|
|
-
|
|
|
- position: relative;
|
|
|
- left: 54%;
|
|
|
- top: -75%;
|
|
|
- }
|
|
|
-
|
|
|
- .centent {
|
|
|
- // border: #00FFFF 1px solid;
|
|
|
- width: 280px;
|
|
|
- height: 185px;
|
|
|
- position: relative;
|
|
|
- left: 6%;
|
|
|
-
|
|
|
- .item {
|
|
|
- // border: #00FFFF 1px solid;
|
|
|
- height: 40%;
|
|
|
- margin-bottom: 10%;
|
|
|
- background-color: #283f6d;
|
|
|
- text-align: left;
|
|
|
- padding-left: 7%;
|
|
|
- padding-top: 4%;
|
|
|
-
|
|
|
- p {
|
|
|
- font-size: 14px;
|
|
|
- color: #fff;
|
|
|
- margin-bottom: 4%;
|
|
|
- }
|
|
|
-
|
|
|
- span {
|
|
|
- color: #00FFFF;
|
|
|
- font-weight: 1000;
|
|
|
+ left: 5%;
|
|
|
+ width: 400px;
|
|
|
+ height: 140px;
|
|
|
+ top: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .item {
|
|
|
+ width: 45%;
|
|
|
+ height: 45px;
|
|
|
+ display: inline-block;
|
|
|
+ // border: #00FFFF 1px solid;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ width: 45px;
|
|
|
+ height: 45px;
|
|
|
+ padding: 2%;
|
|
|
+ border-radius: 8px;
|
|
|
+ display: inline-block;
|
|
|
+ background: no-repeat 50%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icongdbh0 {
|
|
|
+ background-image: url("/static/images/overview/icongdbh0.png");
|
|
|
+ }
|
|
|
+ .icongdbh1 {
|
|
|
+ background-image: url("/static/images/overview/icongdbh1.png");
|
|
|
+ }
|
|
|
+ .icongdbh2 {
|
|
|
+ background-image: url("/static/images/overview/icongdbh2.png");
|
|
|
+ }
|
|
|
+ .icongdbh3 {
|
|
|
+ background-image: url("/static/images/overview/icongdbh3.png");
|
|
|
+ }
|
|
|
+
|
|
|
+ .text {
|
|
|
+ display: inline-block;
|
|
|
+ // border: #00FFFF 1px solid;
|
|
|
+ width: 100px;
|
|
|
+ margin-bottom: 4px;
|
|
|
+
|
|
|
+ p {
|
|
|
+ font-kerning: normal;
|
|
|
+ font-family: "Arial Negreta", "Arial Normal", "Arial";
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #bcd3e5;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ .sdvalue {
|
|
|
+ font-family: "Arial Negreta", "Arial Normal", "Arial";
|
|
|
+ font-weight: 700;
|
|
|
+ font-style: normal;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 18px;
|
|
|
+ color: #64daff;
|
|
|
+ line-height: 16px;
|
|
|
+ }
|
|
|
+ .unit {
|
|
|
+ font-family: "Arial Negreta", "Arial Normal", "Arial";
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #ecf6ff;
|
|
|
+ line-height: 12px;
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ .value {
|
|
|
+ display: inline-block;
|
|
|
+
|
|
|
+ // border: #00FFFF 1px solid;
|
|
|
+ width: 50px;
|
|
|
+ }
|
|
|
+ #gdbh_echart {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ position: relative;
|
|
|
+ top: 100px;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|