From 50cd9f6356fdf511908c33e9a085ae7a54501082 Mon Sep 17 00:00:00 2001 From: 刘嘉威 <daidaibg@163.com> Date: 星期二, 25 十月 2022 15:50:51 +0800 Subject: [PATCH] feat: 增加安装计划,增加右侧结构 --- src/views/index/center-bottom.vue | 160 ++++++++++++++++++++++++++++++++ src/views/index/right-center.vue | 13 ++ src/views/index/right-top.vue | 13 ++ components.d.ts | 3 src/api/modules/index.ts | 6 + src/views/index/center-map.vue | 8 src/views/index/right-bottom.vue | 13 ++ src/api/api.ts | 4 src/mock/mock-index.ts | 41 +++++++ src/views/index/index.vue | 12 + src/plugins/echarts.ts | 4 11 files changed, 261 insertions(+), 16 deletions(-) diff --git a/components.d.ts b/components.d.ts index 2228740..835eb88 100644 --- a/components.d.ts +++ b/components.d.ts @@ -8,13 +8,10 @@ declare module '@vue/runtime-core' { export interface GlobalComponents { CountUp: typeof import('./src/components/count-up/count-up.vue')['default'] - DialogContent: typeof import('./src/components/Plugins/DialogContent/index.vue')['default'] - ElButton: typeof import('element-plus/es')['ElButton'] ElDrawer: typeof import('element-plus/es')['ElDrawer'] ElRadio: typeof import('element-plus/es')['ElRadio'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ItemWrap: typeof import('./src/components/item-wrap/item-wrap.vue')['default'] - LoadingContent: typeof import('./src/components/Plugins/LoadingContent/index.vue')['default'] MessageContent: typeof import('./src/components/Plugins/MessageContent/index.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] diff --git a/src/api/api.ts b/src/api/api.ts index 1c6e1f4..0d6e66e 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -1,7 +1,7 @@ /* * @LastEditors: Please set LastEditors - * @LastEditTime: 2022-10-25 11:07:25 + * @LastEditTime: 2022-10-25 15:34:56 */ import axios from 'axios'; @@ -114,7 +114,7 @@ */ export const GETNOBASE = async (url: string, params?: Params): Promise<any> => { try { - const data = await axios.get(url, { + const data = await axios.get(location.pathname+url, { params: params, }); return data; diff --git a/src/api/modules/index.ts b/src/api/modules/index.ts index 5d9744f..66db6bd 100644 --- a/src/api/modules/index.ts +++ b/src/api/modules/index.ts @@ -2,4 +2,10 @@ 'leftTop':'/bigscreen/countDeviceNum',//宸︿笂 'leftCenter':'/bigscreen/countUserNum',//宸︿腑 "centerMap":"/bigscreen/centerMap", + "centerBottom":"/bigscreen/installationPlan", + + // 'big3':"/bigscreen/sbtx", //璁惧鎻愰啋 + // 'big4':"/bigscreen/alarmNum", //鎶ヨ娆℃暟 + // 'big5':'/bigscreen/ssyj',//瀹炴椂棰勮 + // 'big7':'/bigscreen/ranking',// 鎶ヨ鎺掑悕 } \ No newline at end of file diff --git a/src/mock/mock-index.ts b/src/mock/mock-index.ts index b54e53f..82e78c5 100644 --- a/src/mock/mock-index.ts +++ b/src/mock/mock-index.ts @@ -10,7 +10,18 @@ }, []) return arrays } - +/** +* @description: min 鈮� r 鈮� max 闅忔満鏁� +* @param {*} Min +* @param {*} Max +* @return {*} +*/ +function RandomNumBoth(Min: any, Max: any) { + var Range = Max - Min; + var Rand = Math.random(); + var num = Min + Math.round(Rand * Range); //鍥涜垗浜斿叆 + return num; +} //宸︿腑 export default [ { @@ -44,6 +55,32 @@ }) a.data.onlineNum = a.data.totalNum - a.data.offlineNum return a + } + }, + //瀹夎璁″垝 + { + url: "/bigscreen/installationPlan", + type: "get", + response: () => { + + let num = RandomNumBoth(26, 32); + const a = Mock.mock({ + ["category|" + num]: ["@city()"], + ["barData|" + num]: ["@integer(10, 100)"], + }) + let lineData = [], rateData = []; + for (let index = 0; index < num; index++) { + let lineNum = Mock.mock('@integer(0, 100)') + a.barData[index] + lineData.push(lineNum) + let rate = a.barData[index] / lineNum; + rateData.push((rate * 100).toFixed(0)) + } + a.lineData = lineData + a.rateData = rateData + return { + success: true, + data: a + } } }, { @@ -80,7 +117,7 @@ } }) // 鍘婚噸 - a.data.dataList = ArrSet(a.data.dataList,"name") + a.data.dataList = ArrSet(a.data.dataList, "name") return a } } diff --git a/src/plugins/echarts.ts b/src/plugins/echarts.ts index 1c59e92..25fe485 100644 --- a/src/plugins/echarts.ts +++ b/src/plugins/echarts.ts @@ -5,7 +5,7 @@ CanvasRenderer } from 'echarts/renderers' import { - BarChart,PieChart,MapChart,EffectScatterChart + BarChart,PieChart,MapChart,EffectScatterChart,LineChart } from 'echarts/charts' import { GridComponent, @@ -19,7 +19,7 @@ use([ CanvasRenderer, - BarChart,PieChart,MapChart,EffectScatterChart, + BarChart,PieChart,MapChart,EffectScatterChart,LineChart, GridComponent, LegendComponent, TooltipComponent, diff --git a/src/views/index/center-bottom.vue b/src/views/index/center-bottom.vue new file mode 100644 index 0000000..c047996 --- /dev/null +++ b/src/views/index/center-bottom.vue @@ -0,0 +1,160 @@ +<script setup lang="ts"> +import { ref, reactive, onMounted, nextTick } from "vue"; +import { currentGET } from "@/api"; +import {graphic} from "echarts/core" +const option = ref({}); +const getData = () => { + currentGET("centerBottom", {}).then((res) => { + console.log("瀹夎璁″垝", res); + if (res.success) { + setOption(res.data); + } else { + window["$message"]({ + text: res.msg, + type: "warning", + }); + } + }); +}; +const setOption =async (newData: any) => { + await nextTick() + option.value = { + tooltip: { + trigger: "axis", + backgroundColor: "rgba(0,0,0,.6)", + borderColor: "rgba(147, 235, 248, .8)", + textStyle: { + color: "#FFF", + }, + formatter: function (params: any) { + // 娣诲姞鍗曚綅 + var result = params[0].name + "<br>"; + params.forEach(function (item: any) { + if (item.value) { + if (item.seriesName == "瀹夎鐜�") { + result += + item.marker + + " " + + item.seriesName + + " : " + + item.value + + "%</br>"; + } else { + result += + item.marker + + " " + + item.seriesName + + " : " + + item.value + + "涓�</br>"; + } + } else { + result += item.marker + " " + item.seriesName + " : - </br>"; + } + }); + return result; + }, + }, + legend: { + data: ["宸插畨瑁�", "璁″垝瀹夎", "瀹夎鐜�"], + textStyle: { + color: "#B4B4B4", + }, + top: "0", + }, + grid: { + left: "50px", + right: "40px", + bottom: "30px", + top: "20px", + }, + xAxis: { + data: newData.category, + axisLine: { + lineStyle: { + color: "#B4B4B4", + }, + }, + axisTick: { + show: false, + }, + }, + yAxis: [ + { + splitLine: { show: false }, + axisLine: { + lineStyle: { + color: "#B4B4B4", + }, + }, + + axisLabel: { + formatter: "{value}", + }, + }, + { + splitLine: { show: false }, + axisLine: { + lineStyle: { + color: "#B4B4B4", + }, + }, + axisLabel: { + formatter: "{value}% ", + }, + }, + ], + series: [ + { + name: "宸插畨瑁�", + type: "bar", + barWidth: 10, + itemStyle: { + borderRadius: 5, + color: new graphic.LinearGradient(0, 0, 0, 1, [ + { offset: 0, color: "#956FD4" }, + { offset: 1, color: "#3EACE5" }, + ]), + }, + data: newData.barData, + }, + { + name: "璁″垝瀹夎", + type: "bar", + barGap: "-100%", + barWidth: 10, + itemStyle: { + borderRadius: 5, + color: new graphic.LinearGradient(0, 0, 0, 1, [ + { offset: 0, color: "rgba(156,107,211,0.8)" }, + { offset: 0.2, color: "rgba(156,107,211,0.5)" }, + { offset: 1, color: "rgba(156,107,211,0.2)" }, + ]), + }, + z: -12, + data: newData.lineData, + }, + { + name: "瀹夎鐜�", + type: "line", + smooth: true, + showAllSymbol: true, + symbol: "emptyCircle", + symbolSize: 8, + yAxisIndex: 1, + itemStyle: { + color: "#F02FC2", + }, + data: newData.rateData, + }, + ], + }; +}; +getData(); +</script> + +<template> + <v-chart class="chart" :option="option" v-if="JSON.stringify(option)!='{}'"/> +</template> + +<style scoped lang="scss"></style> diff --git a/src/views/index/center-map.vue b/src/views/index/center-map.vue index 4ed9922..052b475 100644 --- a/src/views/index/center-map.vue +++ b/src/views/index/center-map.vue @@ -6,7 +6,7 @@ import type { MapdataType } from "./center.map"; const option = ref({}); const code = ref("china"); //china 浠h〃涓浗 鍏朵粬鍦板競鏄鏀跨紪鐮� -const centerMapRef = ref(); + withDefaults( defineProps<{ // 缁撴潫鏁板�� @@ -36,7 +36,6 @@ } }); await nextTick(); - centerMapRef.value?.resize(); option.value = optionHandle(regionCode, list, mapData); }; @@ -56,7 +55,7 @@ mapjson = mapjson.geoJSON; resolve(mapjson); } else { - mapjson = await GETNOBASE(`/map-geojson/${regionCode}.json`).then( + mapjson = await GETNOBASE(`map-geojson/${regionCode}.json`).then( (data) => data ); code.value=regionCode @@ -98,6 +97,7 @@ :option="option" ref="centerMapRef" @click="mapClick" + v-if="JSON.stringify(option)!='{}'" /> </div> </div> @@ -147,7 +147,7 @@ } .mapwrap { - height: 548px; + height: 580px; width: 100%; // padding: 0 0 10px 0; box-sizing: border-box; diff --git a/src/views/index/index.vue b/src/views/index/index.vue index c7bb11b..1fec044 100644 --- a/src/views/index/index.vue +++ b/src/views/index/index.vue @@ -3,6 +3,12 @@ import LeftTop from "./left-top.vue"; import LeftCenter from "./left-center.vue"; import CenterMap from "./center-map.vue"; +import CenterBottom from "./center-bottom.vue"; +import RightTop from "./right-top.vue"; +import RightCenter from "./right-center.vue"; +import RightBottom from "./right-bottom.vue"; + + </script> @@ -32,11 +38,11 @@ <div class="contetn_center"> <CenterMap class="contetn_center_top" title="璁惧鍒嗗竷鍥�"/> <ItemWrap class="contetn_center-bottom" title="瀹夎璁″垝"> - <!-- <CenterBottom /> --> + <CenterBottom /> </ItemWrap> </div> <div class="contetn_right"> - <!-- <ItemWrap class="contetn_left-bottom contetn_lr-item" title="鎶ヨ娆℃暟"> + <ItemWrap class="contetn_left-bottom contetn_lr-item" title="鎶ヨ娆℃暟"> <RightTop /> </ItemWrap> <ItemWrap @@ -48,7 +54,7 @@ </ItemWrap> <ItemWrap class="contetn_left-bottom contetn_lr-item" title="鏁版嵁缁熻鍥� "> <RightBottom /> - </ItemWrap> --> + </ItemWrap> </div> </div> </template> diff --git a/src/views/index/right-bottom.vue b/src/views/index/right-bottom.vue new file mode 100644 index 0000000..7df5872 --- /dev/null +++ b/src/views/index/right-bottom.vue @@ -0,0 +1,13 @@ +<script setup lang='ts'> + +</script> + +<template> + <div class=''> + + </div> +</template> + +<style scoped lang='scss'> + +</style> \ No newline at end of file diff --git a/src/views/index/right-center.vue b/src/views/index/right-center.vue new file mode 100644 index 0000000..7df5872 --- /dev/null +++ b/src/views/index/right-center.vue @@ -0,0 +1,13 @@ +<script setup lang='ts'> + +</script> + +<template> + <div class=''> + + </div> +</template> + +<style scoped lang='scss'> + +</style> \ No newline at end of file diff --git a/src/views/index/right-top.vue b/src/views/index/right-top.vue new file mode 100644 index 0000000..7df5872 --- /dev/null +++ b/src/views/index/right-top.vue @@ -0,0 +1,13 @@ +<script setup lang='ts'> + +</script> + +<template> + <div class=''> + + </div> +</template> + +<style scoped lang='scss'> + +</style> \ No newline at end of file -- Gitblit v1.8.0