Pārlūkot izejas kodu

加油站图标调整、移动指挥车、直升机页面

hmm 8 mēneši atpakaļ
vecāks
revīzija
65cb6dbe79

+ 24 - 0
src/api/globalMap/Helicopter.ts

@@ -0,0 +1,24 @@
+//直升机 调用了无人机的接口,待后端接口确定后修改
+
+import request from '@/utils/request';
+// 列表信息
+export const getDroneResourcesList = (data) => {
+  return request({
+    url: '/api/gateway/v2/get_drone_resources_info',
+    method: 'post',
+    data: data
+  });
+};
+
+// 轨迹信息
+export const getDroneResourcesTrajectory = (id) => {
+  return request({
+    url: '/api/gateway/v2/get_drone_resources_trajectory',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};

+ 24 - 0
src/api/globalMap/MobileCommandVehicle.ts

@@ -0,0 +1,24 @@
+//移动指挥车 目前接口是用了无人机的,后续需要后端补充更换移动指挥车的接口
+
+import request from '@/utils/request';
+// 列表信息
+export const getDroneResourcesList = (data) => {
+  return request({
+    url: '/api/gateway/v2/get_drone_resources_info',
+    method: 'post',
+    data: data
+  });
+};
+
+// 轨迹信息
+export const getDroneResourcesTrajectory = (id) => {
+  return request({
+    url: '/api/gateway/v2/get_drone_resources_trajectory',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};

+ 0 - 17
src/types/components.d.ts

@@ -20,7 +20,6 @@ declare module 'vue' {
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
     ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
     ElButton: typeof import('element-plus/es')['ElButton']
-    ElCard: typeof import('element-plus/es')['ElCard']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
@@ -42,28 +41,17 @@ declare module 'vue' {
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
-    ElPopover: typeof import('element-plus/es')['ElPopover']
-    ElRadio: typeof import('element-plus/es')['ElRadio']
-    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
     ElSkeletonItem: typeof import('element-plus/es')['ElSkeletonItem']
     ElSlider: typeof import('element-plus/es')['ElSlider']
-    ElStep: typeof import('element-plus/es')['ElStep']
-    ElSteps: typeof import('element-plus/es')['ElSteps']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
-    ElTable: typeof import('element-plus/es')['ElTable']
-    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
-    ElTabPane: typeof import('element-plus/es')['ElTabPane']
-    ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTimeline: typeof import('element-plus/es')['ElTimeline']
     ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
-    ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
-    ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     FileUpload: typeof import('./../components/FileUpload/index.vue')['default']
     FooterSection: typeof import('./../components/FooterSection/index.vue')['default']
@@ -74,7 +62,6 @@ declare module 'vue' {
     HikvisionPlayer: typeof import('./../components/HKVideo/hikvision-player.vue')['default']
     HKVideo: typeof import('./../components/HKVideo/index.vue')['default']
     IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
-    IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
     IFrame: typeof import('./../components/iFrame/index.vue')['default']
     ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']
@@ -107,10 +94,6 @@ declare module 'vue' {
     VideoContainer: typeof import('./../components/HKVideo/video-container.vue')['default']
     VideoContainer2: typeof import('./../components/HKVideo/video-container2.vue')['default']
     YMap: typeof import('./../components/Map/YMap.vue')['default']
-    YMapold: typeof import('./../components/Map/YMapold.vue')['default']
     YztMap: typeof import('./../components/Map/YztMap/index.vue')['default']
   }
-  export interface ComponentCustomProperties {
-    vLoading: typeof import('element-plus/es')['ElLoadingDirective']
-  }
 }

+ 211 - 0
src/views/globalMap/RightMenu/Helicopter.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="menu-content">
+    <div class="container">
+      <div class="gradient-text title">直升机</div>
+      <!--    <div class="box2">-->
+      <div class="box-left">
+        <el-input v-model="queryParams.keywords" class="custom-input" placeholder="搜索" @input="initData">
+          <template #prefix>
+            <el-icon class="el-input__icon"><search /></el-icon>
+          </template>
+        </el-input>
+        <el-button class="btn" @click="handleCancel">取消</el-button>
+      </div>
+    </div>
+    <div class="flex-container">
+      <div class="text-item">直升机</div>
+      <!--      <div class="button-item common-btn-primary2 edit-icon" style="margin-top: -20px">全部播放</div>-->
+    </div>
+    <div class="custom-table">
+      <div class="th">
+        <div class="td">直升机</div>
+        <div class="td">操作</div>
+      </div>
+      <div class="table-content">
+        <div v-for="(item, index) in dataList" :key="item.id" class="tr">
+          <div class="td">{{ item.drone_name }}</div>
+          <div class="td">{{ item.position }}</div>
+          <div class="td">
+            <div class="text" @click="handleConnect(index, item)">连线</div>
+            <!--            <div class="text" @click="handleCollaborate(index, item)">协同</div>-->
+            <div class="text" @click="handleTrack(item)">轨迹</div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { Search } from '@element-plus/icons-vue';
+import { onMounted, reactive } from 'vue';
+import { getDroneResourcesList, getDroneResourcesTrajectory } from '@/api/globalMap/MobileCommandVehicle';
+const trackPlayback = inject('trackPlayback');
+// 数据列表,直接定义为数组
+const dataList = reactive([]);
+//入参
+const queryParams = reactive({
+  keywords: ''
+});
+//调接口
+const initData = () => {
+  getDroneResourcesList({
+    query: {
+      keywords: queryParams.keywords
+    }
+  }).then((res) => {
+    if (res.code === 0 && Array.isArray(res.rows)) {
+      dataList.splice(0, dataList.length, ...res.rows); // 使用 splice 替换数组内容,保持响应性
+    } else {
+      console.error('Invalid response from server:', res);
+      // 可以选择清空数据列表或显示错误消息
+      dataList.splice(0, dataList.length); // 清空数据列表
+    }
+  });
+};
+
+// 取消按钮的逻辑,搜索框清空并重新加载数据
+const handleCancel = () => {
+  queryParams.keywords = '';
+  initData();
+};
+const handleConnect = () => {};
+const handleCollaborate = () => {};
+// 轨迹
+const handleTrack = (item) => {
+  getDroneResourcesTrajectory(item.id).then((res) => {
+    const trajectory = [];
+    res.rows.forEach((item) => {
+      trajectory.push([item.longitude, item.latitude]);
+    });
+    trackPlayback(trajectory);
+  });
+};
+//调用函数
+onMounted(() => {
+  initData();
+});
+</script>
+
+<style lang="scss" scoped>
+.menu-content {
+  width: 1579px;
+  height: 1394px;
+  background: url('@/assets/images/map/rightMenu/content.png') no-repeat;
+  padding: 130px 20px 20px 20px;
+  font-size: 36px;
+  position: relative;
+  color: #ffffff;
+}
+.title {
+  font-size: 60px;
+  position: absolute;
+  top: 30px;
+  left: 160px;
+}
+
+.box-left {
+  display: flex;
+  margin-top: 30px;
+  margin-bottom: 20px;
+  .btn {
+    width: 140px;
+    min-width: 140px;
+    height: 60px;
+    background: url('@/assets/images/map/rightMenu/potentialFloodHazard/btn.png') no-repeat;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+    margin-left: 20px;
+    color: #ffffff;
+    font-size: 32px;
+  }
+}
+
+.custom-input {
+  height: 60px;
+  line-height: 40px;
+}
+
+.custom-table {
+  width: 100%;
+  height: 1030px;
+  overflow-y: auto;
+  overflow-x: hidden;
+  .table-content {
+    height: 880px;
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
+  .th {
+    width: 100%;
+    height: 151px;
+    background: url('@/assets/images/map/rightMenu/th.png') no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+  }
+  .tr {
+    width: 100%;
+    height: 139px;
+    background: url('@/assets/images/map/rightMenu/td.png') no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+    padding-right: 20px;
+    &:hover {
+      background: url('@/assets/images/map/rightMenu/td_checked.png') no-repeat;
+      background-size: 100% 100%;
+    }
+  }
+  .td {
+    flex: 1;
+    color: #edfaff;
+    font-size: 38px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+  }
+  .td-text {
+    /* 设置字体透明 */
+    color: transparent;
+    /* 使用 -webkit-background-clip 属性将背景剪裁至文本形状 */
+    -webkit-background-clip: text;
+    /* 非Webkit内核浏览器需要使用标准前缀 */
+    background-clip: text;
+    font-family: 'YouSheBiaoTiHei';
+    /* 设置线性渐变,从红色渐变到蓝色 */
+    background-image: linear-gradient(to bottom, #ffffff 50%, #3075d3 100%);
+    font-size: 48px;
+  }
+  .text-green {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #40c75f 100%);
+  }
+  .text-danger {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #ff2f3c 100%);
+  }
+}
+.text {
+  font-size: 38px;
+  color: #247dff;
+  margin-right: 20px;
+  &:last-child {
+    margin-right: 0;
+  }
+}
+
+.flex-container {
+  display: flex;
+  justify-content: space-between; /* 左右两端对齐 */
+  align-items: center; /* 垂直居中对齐 */
+}
+.text-item {
+  font-size: 32px; /* 根据需要设置字体大小 */
+  line-height: 1; /* 确保行高一致 */
+}
+
+.button-item {
+  font-size: 32px; /* 根据需要设置字体大小 */
+  line-height: 1; /* 确保行高一致 */
+}
+</style>

+ 24 - 0
src/views/globalMap/RightMenu/KeyVehicles.vue

@@ -106,6 +106,7 @@ onMounted(() => {
     cursor: pointer;
     margin-left: 20px;
     color: #ffffff;
+    font-size: 32px;
   }
 }
 
@@ -171,4 +172,27 @@ onMounted(() => {
     background-image: linear-gradient(to bottom, #ffffff 50%, #ff2f3c 100%);
   }
 }
+.text {
+  font-size: 38px;
+  color: #247dff;
+  margin-right: 20px;
+  &:last-child {
+    margin-right: 0;
+  }
+}
+
+.flex-container {
+  display: flex;
+  justify-content: space-between; /* 左右两端对齐 */
+  align-items: center; /* 垂直居中对齐 */
+}
+.text-item {
+  font-size: 32px; /* 根据需要设置字体大小 */
+  line-height: 1; /* 确保行高一致 */
+}
+
+.button-item {
+  font-size: 32px; /* 根据需要设置字体大小 */
+  line-height: 1; /* 确保行高一致 */
+}
 </style>

+ 211 - 0
src/views/globalMap/RightMenu/MobileCommandVehicle.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="menu-content">
+    <div class="container">
+      <div class="gradient-text title">移动指挥车</div>
+      <!--    <div class="box2">-->
+      <div class="box-left">
+        <el-input v-model="queryParams.keywords" class="custom-input" placeholder="搜索" @input="initData">
+          <template #prefix>
+            <el-icon class="el-input__icon"><search /></el-icon>
+          </template>
+        </el-input>
+        <el-button class="btn" @click="handleCancel">取消</el-button>
+      </div>
+    </div>
+    <div class="flex-container">
+      <div class="text-item">移动指挥车</div>
+<!--      <div class="button-item common-btn-primary2 edit-icon" style="margin-top: -20px">全部播放</div>-->
+    </div>
+    <div class="custom-table">
+      <div class="th">
+        <div class="td">移动指挥车</div>
+        <div class="td">操作</div>
+      </div>
+      <div class="table-content">
+        <div v-for="(item, index) in dataList" :key="item.id" class="tr">
+          <div class="td">{{ item.drone_name }}</div>
+          <div class="td">{{ item.position }}</div>
+          <div class="td">
+            <div class="text" @click="handleConnect(index, item)">连线</div>
+            <!--            <div class="text" @click="handleCollaborate(index, item)">协同</div>-->
+            <div class="text" @click="handleTrack(item)">轨迹</div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { Search } from '@element-plus/icons-vue';
+import { onMounted, reactive } from 'vue';
+import { getDroneResourcesList, getDroneResourcesTrajectory } from '@/api/globalMap/Helicopter';
+const trackPlayback = inject('trackPlayback');
+// 数据列表,直接定义为数组
+const dataList = reactive([]);
+//入参
+const queryParams = reactive({
+  keywords: ''
+});
+//调接口
+const initData = () => {
+  getDroneResourcesList({
+    query: {
+      keywords: queryParams.keywords
+    }
+  }).then((res) => {
+    if (res.code === 0 && Array.isArray(res.rows)) {
+      dataList.splice(0, dataList.length, ...res.rows); // 使用 splice 替换数组内容,保持响应性
+    } else {
+      console.error('Invalid response from server:', res);
+      // 可以选择清空数据列表或显示错误消息
+      dataList.splice(0, dataList.length); // 清空数据列表
+    }
+  });
+};
+
+// 取消按钮的逻辑,搜索框清空并重新加载数据
+const handleCancel = () => {
+  queryParams.keywords = '';
+  initData();
+};
+const handleConnect = () => {};
+const handleCollaborate = () => {};
+// 轨迹
+const handleTrack = (item) => {
+  getDroneResourcesTrajectory(item.id).then((res) => {
+    const trajectory = [];
+    res.rows.forEach((item) => {
+      trajectory.push([item.longitude, item.latitude]);
+    });
+    trackPlayback(trajectory);
+  });
+};
+//调用函数
+onMounted(() => {
+  initData();
+});
+</script>
+
+<style lang="scss" scoped>
+.menu-content {
+  width: 1579px;
+  height: 1394px;
+  background: url('@/assets/images/map/rightMenu/content.png') no-repeat;
+  padding: 130px 20px 20px 20px;
+  font-size: 36px;
+  position: relative;
+  color: #ffffff;
+}
+.title {
+  font-size: 60px;
+  position: absolute;
+  top: 30px;
+  left: 160px;
+}
+
+.box-left {
+  display: flex;
+  margin-top: 30px;
+  margin-bottom: 20px;
+  .btn {
+    width: 140px;
+    min-width: 140px;
+    height: 60px;
+    background: url('@/assets/images/map/rightMenu/potentialFloodHazard/btn.png') no-repeat;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+    margin-left: 20px;
+    color: #ffffff;
+    font-size: 32px;
+  }
+}
+
+.custom-input {
+  height: 60px;
+  line-height: 40px;
+}
+
+.custom-table {
+  width: 100%;
+  height: 1030px;
+  overflow-y: auto;
+  overflow-x: hidden;
+  .table-content {
+    height: 880px;
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
+  .th {
+    width: 100%;
+    height: 151px;
+    background: url('@/assets/images/map/rightMenu/th.png') no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+  }
+  .tr {
+    width: 100%;
+    height: 139px;
+    background: url('@/assets/images/map/rightMenu/td.png') no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+    padding-right: 20px;
+    &:hover {
+      background: url('@/assets/images/map/rightMenu/td_checked.png') no-repeat;
+      background-size: 100% 100%;
+    }
+  }
+  .td {
+    flex: 1;
+    color: #edfaff;
+    font-size: 38px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+  }
+  .td-text {
+    /* 设置字体透明 */
+    color: transparent;
+    /* 使用 -webkit-background-clip 属性将背景剪裁至文本形状 */
+    -webkit-background-clip: text;
+    /* 非Webkit内核浏览器需要使用标准前缀 */
+    background-clip: text;
+    font-family: 'YouSheBiaoTiHei';
+    /* 设置线性渐变,从红色渐变到蓝色 */
+    background-image: linear-gradient(to bottom, #ffffff 50%, #3075d3 100%);
+    font-size: 48px;
+  }
+  .text-green {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #40c75f 100%);
+  }
+  .text-danger {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #ff2f3c 100%);
+  }
+}
+.text {
+  font-size: 38px;
+  color: #247dff;
+  margin-right: 20px;
+  &:last-child {
+    margin-right: 0;
+  }
+}
+
+.flex-container {
+  display: flex;
+  justify-content: space-between; /* 左右两端对齐 */
+  align-items: center; /* 垂直居中对齐 */
+}
+.text-item {
+  font-size: 32px; /* 根据需要设置字体大小 */
+  line-height: 1; /* 确保行高一致 */
+}
+
+.button-item {
+  font-size: 32px; /* 根据需要设置字体大小 */
+  line-height: 1; /* 确保行高一致 */
+}
+</style>

+ 12 - 0
src/views/globalMap/RightMenu/index.vue

@@ -70,6 +70,16 @@
           v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '机动无人机'"
           @handle-menu="handleMenu"
         />
+        <!--移动无人机-->
+        <MobileCommandVehicle
+          v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '移动指挥车'"
+          @handle-menu="handleMenu"
+        />
+        <!--直升机-->
+        <Helicopter
+          v-if="menuState.showMenu && menuState.menuData[menuState.activeIndex]?.name === '直升机'"
+          @handle-menu="handleMenu"
+        />
       </div>
     </div>
   </div>
@@ -97,6 +107,8 @@ import MobilePlatform from './MobilePlatform.vue';
 import KeyVehicles from './KeyVehicles.vue';
 import SatellitePhone from './SatellitePhone.vue';
 import MobileUnmannedVehicle from './MobileUnmannedVehicle.vue';
+import MobileCommandVehicle from './MobileCommandVehicle.vue';
+import Helicopter from './Helicopter.vue';
 interface Props {
   pointType: PointType[];
 }