diff --git a/dist.zip b/dist.zip new file mode 100644 index 0000000..a361d5e Binary files /dev/null and b/dist.zip differ diff --git a/src/api/modules/index.ts b/src/api/modules/index.ts index be41cbb..f83b450 100644 --- a/src/api/modules/index.ts +++ b/src/api/modules/index.ts @@ -110,3 +110,7 @@ export const videoStream=(param:any={})=>{ export const getListCurrentMonth = (param: any = {}) => { return GET('/device/mevent/listCurrentMonth', param); } +// 今日各监测点车流情况 +export const getPointTraffic=(param:any={})=>{ + return GET('/device/trafficFlow/pointTraffic',param) +} diff --git a/src/assets/img/fwq2.png b/src/assets/img/fwq2.png new file mode 100644 index 0000000..af09bdf Binary files /dev/null and b/src/assets/img/fwq2.png differ diff --git a/src/assets/img/ql.png b/src/assets/img/ql.png new file mode 100644 index 0000000..3e41600 Binary files /dev/null and b/src/assets/img/ql.png differ diff --git a/src/assets/img/sfz.png b/src/assets/img/sfz.png new file mode 100644 index 0000000..d3d1f38 Binary files /dev/null and b/src/assets/img/sfz.png differ diff --git a/src/assets/img/snht.png b/src/assets/img/snht.png new file mode 100644 index 0000000..d09d811 Binary files /dev/null and b/src/assets/img/snht.png differ diff --git a/src/views/component/EventStatus.vue b/src/views/component/EventStatus.vue index 76d8f15..cb4235e 100644 --- a/src/views/component/EventStatus.vue +++ b/src/views/component/EventStatus.vue @@ -18,7 +18,6 @@ + + + + + + @@ -60,7 +114,7 @@
×
- +
@@ -92,6 +146,7 @@ import { ref, nextTick } from "vue"; import { onMounted } from 'vue'; import fee from "@/assets/img/fee.png"; +import fwq from "@/assets/img/fwq2.png"; import km from "@/assets/img/km.png"; import toll from "@/assets/img/toll.png"; import RealTimeImageCenter from "./RealTimeImageCenter.vue"; @@ -102,6 +157,10 @@ import { getDeviceList } from "@/api/modules/index"; import DeviceInfoComponentTwo from "./DeviceInfoComponentTwo.vue"; import Map from "./map.vue" import { emitter } from '@/utils/eventBus'; +import fwqImage from "@/assets/img/fwq.png"; +import ql from "@/assets/img/ql.png"; +import sfz from "@/assets/img/sfz.png"; +import snht from "@/assets/img/snht.png"; const showServiceArea = ref(false); const showMap = ref(true); const showDeviceInfo = ref(false); @@ -110,13 +169,316 @@ const closeDialog = () => { showServiceArea.value = false; }; const showDropdown = ref(false); -const serviceAreas = ["南皮服务区", "东光服务区"]; -const selectedServiceArea = ref("南皮服务区"); +const showDropdown1 = ref(false); +const showDropdown2 = ref(false); +const showDropdown3 = ref(false); +//服务区 +const serviceAreas =[{ + name:"南皮服务区", + type:'服务区', + fwqImage:fwqImage, + areaData:{ + value: 6000, + unit: "m²", + name1:'占地面积(m²)' + }, +llist:[ + { label: "充电车位", value: 1888 }, + { label: "大型车位", value: 60 }, + { label: "小型车位", value: 200 }, + { label: "危险品车位", value: 20 }, +]},{ + name:"东光服务区", + type:'服务区', + fwqImage:fwqImage, + areaData:{ + value: 6000, + unit: "m²", + name1:'占地面积(m²)' + }, + llist:[ + { label: "充电车位", value: 1888 }, + { label: "大型车位", value: 60 }, + { label: "小型车位", value: 200 }, + { label: "危险品车位", value: 20 }] +}] +const popUpContent= ref([]) +const selectedServiceArea = ref({}); +//收费站 +// const tollStationList = ["连镇", "找王", "寨子", "盐山", "盐山东"]; + +const tollStationList = [{ + name:"连镇", + type:'收费站', + fwqImage:sfz, + areaData:{ + value: 1200, + unit: "m²", + name1:'建筑面积(m²)' + }, +llist:[ + { label: "入口ETC车道", value: 2 }, + { label: "出口ETC车道", value: 2 }, + { label: "入口混合车道", value: 2 }, + { label: "出口混合车道", value: 2 }, +]},{ + name:"找王", + type:'收费站', + fwqImage:sfz, + areaData:{ + value: 1200, + unit: "m²", + name1:'建筑面积(m²)' + }, +llist:[ + { label: "入口ETC车道", value: 2 }, + { label: "出口ETC车道", value: 2 }, + { label: "入口混合车道", value: 2 }, + { label: "出口混合车道", value: 2 }, +] +},{ + name:"寨子", + type:'收费站', + fwqImage:sfz, + areaData:{ + value: 1200, + unit: "m²", + name1:'建筑面积(m²)' + }, +llist:[ + { label: "入口ETC车道", value: 2 }, + { label: "出口ETC车道", value: 2 }, + { label: "入口混合车道", value: 2 }, + { label: "出口混合车道", value: 2 }, +] +},{ + name:"盐山", + type:'收费站', + fwqImage:sfz, + areaData:{ + value: 1200, + unit: "m²", + name1:'建筑面积(m²)' + }, +llist:[ + { label: "入口ETC车道", value: 1 }, + { label: "出口ETC车道", value: 1 }, + { label: "入口混合车道", value: 2 }, + { label: "出口混合车道", value: 2 }, +] +},{ + name:"盐山东", + type:'收费站', + fwqImage:sfz, + areaData:{ + value: 1200, + unit: "m²", + name1:'建筑面积(m²)' + }, +llist:[ + { label: "入口ETC车道", value: 2 }, + { label: "出口ETC车道", value: 2 }, + { label: "入口混合车道", value: 2 }, + { label: "出口混合车道", value: 2 }, +] +}]; +const tollStation = ref("连镇"); +//桥梁 +// const bridgeList = ["南运河特大桥", "秦庄村大桥", "宣惠河大桥", "沙河大桥", "龙王河大桥", "大单沟大桥", "大商平底渠大桥"]; +const bridgeList = [{ + name:"南运河特大桥", + type:'桥梁(座)', + fwqImage:ql, + areaData:{ + value: 1003.838, + unit: "m²", + name1:'长度(m)(沧州境内)' + }, +llist:[ + { label: "中心桩号", value: 'K61+407' }, +] +},{ + name:"秦庄村大桥", + type:'桥梁(座)', + fwqImage:ql, + areaData:{ + value:577.543, + unit: "m²", + name1:'长度(m)' + }, +llist:[ + { label: "中心桩号", value: 'K62+401' }, +] +},{ + name:"宣惠河大桥", + type:'桥梁(座)', + fwqImage:ql, + areaData:{ + value:702, + unit: "m²", + name1:'长度(m)' + }, +llist:[ + { label: "中心桩号", value: 'K65+716' }, +] +},{ + name:"沙河大桥", + type:'桥梁(座)', + fwqImage:ql, + areaData:{ + value:131, + unit: "m²", + name1:'长度(m)' + }, +llist:[ + { label: "中心桩号", value: 'K76+079' }, +] +},{ + name:"龙王河大桥", + type:'桥梁(座)', + fwqImage:ql, + areaData:{ + value:156, + unit: "m²", + name1:'长度(m)' + }, +llist:[ + { label: "中心桩号", value: 'K90+280' }, +] +},{ + name:"大单沟大桥", + type:'桥梁(座)', + fwqImage:ql, + areaData:{ + value:127, + unit: "m²", + name1:'长度(m)' + }, +llist:[ + { label: "中心桩号", value: 'K96+099' }, +] +},{ + name:"大商平底渠大桥", + type:'桥梁(座)', + fwqImage:ql, + areaData:{ + value:106, + unit: "m²", + name1:'长度(m)' + }, +llist:[ + { label: "中心桩号", value: 'K114+265' }, +] +}]; +const bridge1 = ref("南运河特大桥"); +//枢纽互通 +// const hubIntercommunicationList = ["连镇互通", "大屯枢纽", "找王互通", "寨子互通", "小庄枢纽", "盐山互通", "盐山东互通"]; +const hubIntercommunicationList = [{ + name:"连镇互通", + type:'枢纽互通', + fwqImage:snht, + areaData:{ + value:'K64+776', + unit: "m²", + name1:'桩号' + }, +llist:[ + { label: "被交路名称", value: 'G105(京澳线)' }, + { label: "被交路等级", value: '一级公路' }, +] +},{ + name:"大屯枢纽", + type:'枢纽互通', + fwqImage:snht, + areaData:{ + value:'K69+454', + unit: "m²", + name1:'桩号' + }, +llist:[ + { label: "被交路名称", value: '京台高速' }, + { label: "被交路等级", value: '高速公路' }, +] +},{ + name:"找王互通", + type:'枢纽互通', + fwqImage:snht, + areaData:{ + value:'K80+359', + unit: "m²", + name1:'桩号' + }, +llist:[ + { label: "被交路名称", value: 'S337(辛平线)' }, + { label: "被交路等级", value: '一级公路' }, +] +},{ + name:"寨子互通", + type:'枢纽互通', + fwqImage:snht, + areaData:{ + value:'K80+359', + unit: "m²", + name1:'桩号' + }, +llist:[ + { label: "被交路名称", value: 'G104(京平线)' }, + { label: "被交路等级", value: '二级公路' }, +] +},{ + name:"小庄枢纽", + type:'枢纽互通', + fwqImage:snht, + areaData:{ + value:'K119+655', + unit: "m²", + name1:'桩号' + }, +llist:[ + { label: "被交路名称", value: '京沪高速' }, + { label: "被交路等级", value: '高速公路' }, +] +},{ + name:"盐山互通", + type:'枢纽互通', + fwqImage:snht, + areaData:{ + value:'S216(吕千线)', + unit: "m²", + name1:'桩号' + }, +llist:[ + { label: "被交路名称", value: 'S216(吕千线)' }, + { label: "被交路等级", value: '一级公路' }, +] +},{ + name:"盐山东互通", + type:'枢纽互通', + fwqImage:snht, + areaData:{ + value:'K139+358', + unit: "m²", + name1:'桩号' + }, +llist:[ + { label: "被交路名称", value: 'G205(山深线)' }, + { label: "被交路等级", value: '一级公路' }, +] +}]; +const hubIntercommunication = ref("连镇互通"); function selectServiceArea(area) { - selectedServiceArea.value = area; + console.log(area, 'tttttttttt') + selectedServiceArea.value = area.name; +popUpContent.value = area + tollStation.value = area; + bridge1.value = area; + hubIntercommunication.value = area; showServiceArea.value = true; showDropdown.value = false; + showDropdown1.value = false; + showDropdown2.value = false; + showDropdown3.value = false; } // 统计数据配置 const statistics = ref([ @@ -131,7 +493,7 @@ const statistics = ref([ label: "收费站", }, { - image: fee, + image: fwq, value: "2", label: "服务区", }, @@ -143,7 +505,7 @@ const statistics = ref([ { image: hub, value: "7", - label: "隧道互通(座)", + label: "枢纽互通(座)", }, ]); diff --git a/src/views/component/left.vue b/src/views/component/left.vue index 927a846..bd6e4d0 100644 --- a/src/views/component/left.vue +++ b/src/views/component/left.vue @@ -14,7 +14,11 @@ import eqm3Default from "@/assets/img/eqm/eqm3.png"; import eqm3Active from "@/assets/img/eqm/eqm3_active.png"; import eqm4Default from "@/assets/img/eqm/eqm4.png"; import eqm4Active from "@/assets/img/eqm/eqm4_active.png"; -import { todayTrafficCount, trafficTrend } from "@/api/modules/index"; +import { + todayTrafficCount, + trafficTrend, + getPointTraffic, +} from "@/api/modules/index"; import { update } from "lodash-es"; // 车流量数据 const trafficData = { @@ -37,20 +41,37 @@ const trafficData = { }; // 监测点车流数据 -const monitoringPointsData = reactive({ - points: [ - { name: "连镇", weeklyAvg: 19500, dailyTotal: 16500 }, - { name: "扬王", weeklyAvg: 12000, dailyTotal: 14500 }, - { name: "小庄", weeklyAvg: 10800, dailyTotal: 12300 }, - { name: "寨子", weeklyAvg: 21500, dailyTotal: 26800 }, - { name: "盐山", weeklyAvg: 19700, dailyTotal: 22000 }, - ], -}); +const monitoringPointsData = ref([]); // 交通流量趋势数据 const trafficTrendData = reactive({ - hours: ["00:00","01:00","02:00","03:00", "04:00","05:00","06:00","07:00", "08:00", "09:00", "10:00", "11:00","12:00", - "13:00","14:00","15:00","16:00", "17:00","18:00","19:00","20:00","21:00","22:00","23:00", "24:00"], + hours: [ + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "24:00", + ], realTimeValues: [], averageValues: [], }); @@ -186,37 +207,56 @@ const chartOptions: EChartsOption = { }, ], }; +const chartShow = ref(false); +const chartShow2 = ref(false); + // 初始化图表 const { initCharts, setOptions } = useCharts(chartRef, chartOptions); // 获取当前日期并格式化为 YYYY-MM-DD const today = new Date(); const year = today.getFullYear(); -const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从 0 开始 -const day = String(today.getDate()).padStart(2, '0'); +const month = String(today.getMonth() + 1).padStart(2, "0"); // 月份从 0 开始 +const day = String(today.getDate()).padStart(2, "0"); const todayTime = ref(`${year}-${month}-${day}`); // 确保图表在组件挂载后渲染 onMounted(async () => { + let dataMap = { + today: todayTime.value, + }; + const ress = await getPointTraffic(dataMap); + monitoringPointsData.value = ress.data || []; + chartShow.value = true; initCharts(); + try { const query = { - todayTime: todayTime.value + todayTime: todayTime.value, }; const res = await todayTrafficCount(query); if (res.data) { res.data.forEach((item) => { - if (item.vehicleType == 1) { //小车 + if (item.vehicleType == 1) { + //小车 trafficData.car.value = item.vehicleCount; trafficData.car.percentage = item.percentage; - } else if (item.vehicleType == 2) { //货车 + // alert(trafficData.car.percentage); + // this.$forceUpdate(); // 直接调用 + } else if (item.vehicleType == 2) { + //货车 trafficData.truck.value = item.vehicleCount; trafficData.truck.percentage = item.percentage; - } else if (item.vehicleType == 3) { //客车 + } else if (item.vehicleType == 3) { + //客车 trafficData.bus.value = item.vehicleCount; trafficData.bus.percentage = item.percentage; } trafficData.total = item.total; - }) + }); + + chartShow2.value = true; + // this.$forceUpdate(); + // this.$forceUpdate(); // console.log(trafficData, 'trafficData') } chartOptions.series[0].data = [ @@ -278,16 +318,18 @@ onMounted(async () => { // 调用 setOptions 方法重新渲染图表 setOptions(chartOptions); - trafficTrend({today: '2025-05-30', pileNum: ''}).then((res) => { - console.log(res, '///////////////////') + trafficTrend({ today: "2025-05-30", pileNum: "" }).then((res) => { + console.log(res, "///////////////////"); if (res.code == 200) { // 清空原有数据 trafficTrendData.realTimeValues = []; trafficTrendData.averageValues = []; - trafficTrendData.realTimeValues = [...res.data.map(item => item.total)]; - trafficTrendData.averageValues = [...res.data.map(item => item.avg)]; - console.log(trafficTrendData, 'trafficTrendData') + trafficTrendData.realTimeValues = [ + ...res.data.map((item) => item.total), + ]; + trafficTrendData.averageValues = [...res.data.map((item) => item.avg)]; + console.log(trafficTrendData, "trafficTrendData"); // // 可选:重新渲染图表 // trendChartInstance.setOption({ // series: [{ @@ -297,11 +339,10 @@ onMounted(async () => { // }] // }); } - }) + }); } catch (error) { console.error("请求设备列表失败:", error); } - }); // 趋势图时间范围选项 @@ -321,38 +362,43 @@ const handleTimeRangeChange = (event: Event) => { // 这里可以添加切换时间范围的逻辑 }; const items = ref([ -{ + { defaultImg: eqm1Default, activeImg: eqm1Active, isActive: true, // 默认选中 - type: '44', // + type: "44", // }, { defaultImg: eqm2Default, activeImg: eqm2Active, isActive: true, - type: '22', // 视频监控 + type: "22", // 视频监控 }, { defaultImg: eqm3Default, activeImg: eqm3Active, isActive: true, - type: '53', // 广播 + type: "53", // 广播 }, { defaultImg: eqm4Default, activeImg: eqm4Active, isActive: true, - type: '15', // 情报板 + type: "15", // 情报板 }, ]); const toggleSelection = (index: number) => { items.value[index].isActive = !items.value[index].isActive; // 通知地图组件切换显示/隐藏 - window.dispatchEvent(new CustomEvent('toggle-map-device', { - detail: { type: items.value[index].type, show: items.value[index].isActive } - })); + window.dispatchEvent( + new CustomEvent("toggle-map-device", { + detail: { + type: items.value[index].type, + show: items.value[index].isActive, + }, + }) + ); }; @@ -370,28 +416,43 @@ const toggleSelection = (index: number) => {
小型车 - {{ trafficData.car.percentage }}% + {{ trafficData.car.percentage }}%
- +
货车 - {{ trafficData.truck.percentage }}% + {{ trafficData.truck.percentage }}%
- +
客车 - {{ trafficData.bus.percentage }}% + {{ trafficData.bus.percentage }}%
- +
@@ -409,15 +470,26 @@ const toggleSelection = (index: number) => {
今日各监测点车流情况
- +
交通流量趋势
-
+ :style="{ + backgroundImage: `url(${ + item.isActive ? item.activeImg : item.defaultImg + })`, + }" + >
- @@ -544,16 +624,16 @@ const toggleSelection = (index: number) => { &.car { border-radius: 8px 8px 8px 8px; background: rgba(253, 187, 103, 0.1); - color: #FDBB67; + color: #fdbb67; } &.truck { - color: #59A2FC; + color: #59a2fc; background-color: rgba(0, 200, 255, 0.1); } &.bus { - color: #00FFFF; + color: #00ffff; background-color: rgba(0, 255, 255, 0.1); } } diff --git a/src/views/component/monitoring-points-chart.vue b/src/views/component/monitoring-points-chart.vue index 2b09c3b..a5ca534 100644 --- a/src/views/component/monitoring-points-chart.vue +++ b/src/views/component/monitoring-points-chart.vue @@ -1,28 +1,23 @@ `, - }, - }, - minify: true, - }), + inject: { + data: { + injectMapScript: ``, + }, + }, + minify: true, + }), // Compression({ // algorithm: 'gzip', // test: /\.(js|css|html|json|svg|jpe?g|png|gif)$/i, @@ -47,32 +46,37 @@ export default defineConfig(({ command, mode }: ConfigEnv): UserConfig => { ], publicDir: "public", build: { - outDir: 'dist', - assetsDir: 'static' + outDir: "dist", + assetsDir: "static", }, server: { - host: '0.0.0.0', + host: "0.0.0.0", port: 8080, open: true, strictPort: false, proxy: { [viteEnv.VITE_APP_CONTROL_BASE_API]: { - target: 'http://172.16.1.133:8081/xjIotApi', + target: "http://172.16.1.128:8090/xjIotApi", changeOrigin: true, - rewrite: (path) => path.replace(new RegExp(`^${viteEnv.VITE_APP_CONTROL_BASE_API}`), ''), + rewrite: (path) => + path.replace( + new RegExp(`^${viteEnv.VITE_APP_CONTROL_BASE_API}`), + "" + ), }, [viteEnv.VITE_APP_BASE_API]: { - target: 'http://172.16.1.128:8090/iotApi', + target: "http://172.16.1.128:8090/iotApi", changeOrigin: true, - rewrite: (path) => path.replace(new RegExp(`^${viteEnv.VITE_APP_BASE_API}`), ''), - } + rewrite: (path) => + path.replace(new RegExp(`^${viteEnv.VITE_APP_BASE_API}`), ""), + }, }, }, resolve: { alias: { "@": resolve(__dirname, "./src"), - "components": resolve(__dirname, "./src/components"), - "api": resolve(__dirname, "./src/api") + components: resolve(__dirname, "./src/components"), + api: resolve(__dirname, "./src/api"), }, }, css: { @@ -81,6 +85,6 @@ export default defineConfig(({ command, mode }: ConfigEnv): UserConfig => { additionalData: `@use "./src/assets/css/variable.scss" as *;`, }, }, - } + }, }; -}); \ No newline at end of file +});