From bdc6d8733ae6eeb3a9762e77dbabe21441336474 Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Thu, 13 Mar 2025 17:20:36 +0800
Subject: [PATCH] 更新分享

---
 src/views/DronePilotShare.vue                 |  638 ++++++++
 src/views/components/controlConsole-copy.vue  | 1138 ++++++++++++++
 package-lock.json                             |    6 
 src/views/DronePilotDetails.vue               |  113 
 src/store/index.ts                            |   19 
 src/api/http/request.ts                       |    9 
 src/types/enums.ts                            |    1 
 vite.config.ts                                |    4 
 src/views/DronePilotDetails-copy0303.vue      |  685 ++++++++
 src/views/components/controlConsole-copy1.vue | 1154 ++++++++++++++
 src/types/drc.ts                              |    4 
 tsconfig.json                                 |    2 
 src/api/manage.ts                             |   14 
 src/utils/mqtt/index.ts                       |   15 
 package.json                                  |    1 
 src/views/hooks/droneFly.ts                   |   23 
 src/router/index.ts                           |    5 
 src/views/DronePilotList.vue                  |    2 
 src/views/components/controlConsole.vue       |  848 ----------
 19 files changed, 3,803 insertions(+), 878 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fe6f1ae..a4c055e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,6 +12,7 @@
         "@turf/turf": "^6.5.0",
         "axios": "^0.21.1",
         "cesium": "^1.95.0",
+        "crypto-js": "^4.2.0",
         "element-plus": "^2.9.2",
         "eventemitter3": "^5.0.0",
         "flv.js": "^1.6.2",
@@ -4106,6 +4107,11 @@
         "node": ">= 8"
       }
     },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+    },
     "node_modules/csstype": {
       "version": "3.1.3",
       "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
diff --git a/package.json b/package.json
index ea58a6f..5406762 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
     "@turf/turf": "^6.5.0",
     "axios": "^0.21.1",
     "cesium": "^1.95.0",
+    "crypto-js": "^4.2.0",
     "element-plus": "^2.9.2",
     "eventemitter3": "^5.0.0",
     "flv.js": "^1.6.2",
diff --git a/src/api/http/request.ts b/src/api/http/request.ts
index 1bdf3a5..153b0a9 100644
--- a/src/api/http/request.ts
+++ b/src/api/http/request.ts
@@ -67,10 +67,8 @@
     url: string
     authorization: boolean
   }) => {
-    if(config.url.includes('h5')) {
-      config.url = '/drone-h5' + config.url
-    } else if (!config.url.includes('/blade-') && !config.url.includes('https://') && !config.url.includes('http://')) {
-      config.url = '/drone-yw' + config.url
+    if (!config.url.includes('/blade-') && !config.url.includes('https://') && !config.url.includes('http://')) {
+      config.url = '/drone-device-core' + config.url
     }
     const authorization = config.authorization === false
     if (!authorization) {
@@ -81,6 +79,9 @@
     const isToken = meta.isToken === false
     if (getToken() && !isToken) {
       config.headers[website.tokenHeader] = 'bearer ' + getToken()
+    } else {
+      // 为了兼容分享页面
+      config.headers[website.tokenHeader] = 'bearer ' + getAuthToken()
     }
     if (meta.noCookie) {
       delete config.headers.cookie
diff --git a/src/api/manage.ts b/src/api/manage.ts
index 6539e93..3107476 100644
--- a/src/api/manage.ts
+++ b/src/api/manage.ts
@@ -125,6 +125,20 @@
   return result.data
 }
 
+// 分享功能先保存token
+export const saveToken = async function (body:any): Promise<IWorkspaceResponse<any>> {
+  const url = `${HTTP_PREFIX_H5}/saveToken`
+  const result = await request.post(url,body)
+  return result.data
+}
+
+// 分享功能先保存code
+export const getTokenByCode = async function (code: string): Promise<IWorkspaceResponse<any>> {
+  const url = `${HTTP_PREFIX_H5}/getTokenByCode?code=${code}`
+  const result = await request.get(url)
+  return result.data
+}
+
 // Get User Info
 export const getUserInfo = async function (): Promise<IWorkspaceResponse<any>> {
   const url = `${HTTP_PREFIX}/users/current`
diff --git a/src/router/index.ts b/src/router/index.ts
index ee65479..05719a1 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -44,6 +44,11 @@
     component: () => import('@/views/DronePilotDetails.vue')
   },
   {
+    path: '/dronePilotShare',
+    name: ERouterName.DRONEPILOTSHARE,
+    component: () => import('@/views/DronePilotShare.vue')
+  },
+  {
     path: '/' + ERouterName.DRONE,
     name: ERouterName.DRONE,
     component: () => import('@/views/drone/index.vue')
diff --git a/src/store/index.ts b/src/store/index.ts
index bdde78d..1ad14d8 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -74,6 +74,20 @@
     psdk_widget_values: {},
     speakerAudioPlayStartProgress: {},
   },
+  airPortInfo: {
+    sn: '',
+    workspaceId: '',
+    subType: 0,
+    name: '',
+    longitude: 0,
+    latitude: 0,
+    isOnline: false,
+    height: 0,
+    domain: 0,
+    dockSn: '',
+    deviceType: 0,
+    children: {}
+  }, // 保存机场信息
   osdVisible: { // osd 显示设备相关信息
     sn: '',
     callsign: '',
@@ -185,6 +199,10 @@
     state.osdVisible = Object.assign({}, info)
     window.localStorage.setItem('bs_osd', JSON.stringify(info))
   },
+  // 保存机场信息
+  SET_AIRPORT_INFO (state, info) {
+    state.airPortInfo = info
+  },
   SET_SELECT_WAYLINE_INFO (state, info) {
     state.waylineInfo = info
   },
@@ -241,7 +259,6 @@
   },
   // 设置视角
   SET_CURRENTANGLE (state, currentAngle) {
-    console.log('120')
     state.currentAngle = currentAngle
   }
 }
diff --git a/src/types/drc.ts b/src/types/drc.ts
index ae83404..a5d867b 100644
--- a/src/types/drc.ts
+++ b/src/types/drc.ts
@@ -1,6 +1,8 @@
+import store from '@/store'
+console.log('哒哒哒',store.state.airPortInfo)
 export enum DRC_METHOD {
   HEART_BEAT = 'heart_beat',
-  DRONE_CONTROL = 'drone_control', // 飞行控制-虚拟摇杆
+  DRONE_CONTROL = (store.state.airPortInfo.deviceType == 1 && store.state.airPortInfo.subType == 0 && store.state.airPortInfo.domain == 3 )?'drone_control':'stick_control', // 飞行控制-摇杆
   DRONE_EMERGENCY_STOP = 'drone_emergency_stop', // 急停
   OSD_INFO_PUSH = 'osd_info_push', // 高频osd信息上报
   HSI_INFO_PUSH = 'hsi_info_push', // 避障信息上报
diff --git a/src/types/enums.ts b/src/types/enums.ts
index 61452dc..2e7f39a 100644
--- a/src/types/enums.ts
+++ b/src/types/enums.ts
@@ -3,6 +3,7 @@
     LOGIN = 'login',
     DRONEPILOTLIST = 'dronePilotList',
     DRONEPILOTDETAILS = 'dronePilotDetails',
+    DRONEPILOTSHARE = 'dronePilotShare',
     DRONE = 'drone',
     PROJECT = 'project',
     ADD_PROJECT = 'add_project',
diff --git a/src/utils/mqtt/index.ts b/src/utils/mqtt/index.ts
index fa25eaa..71e5e2b 100644
--- a/src/utils/mqtt/index.ts
+++ b/src/utils/mqtt/index.ts
@@ -81,25 +81,22 @@
 
   // 心跳
   const heartBeatSeq = ref(0)
-  const state = reactive({
-    heartState: new Map<string, {
-      pingInterval: any;
-    }>(),
-  })
+  const state = reactive({heartState: new Map()})
 
   // 监听云控控制权
   watch(() => deviceTopicInfo, (val, oldVal) => {
     if (val.subTopic !== '') {
-      // 1.订阅topic
       subscribeMqtt(deviceTopicInfo.subTopic)
-      // 2.发心跳
       publishDrcPing(deviceTopicInfo.sn)
     } else {
-      clearInterval(state.heartState.get(deviceTopicInfo.sn)?.pingInterval)
+      const heartState = state.heartState.get(deviceTopicInfo.sn)
+      if (heartState && heartState.pingInterval) {
+        clearInterval(heartState.pingInterval)
+      }
       state.heartState.delete(deviceTopicInfo.sn)
       heartBeatSeq.value = 0
     }
-  }, { immediate: true, deep: true })
+}, { immediate: true, deep: true })
 
   function publishDrcPing (sn: string) {
     const body = {
diff --git a/src/views/DronePilotDetails-copy0303.vue b/src/views/DronePilotDetails-copy0303.vue
new file mode 100644
index 0000000..c723c4e
--- /dev/null
+++ b/src/views/DronePilotDetails-copy0303.vue
@@ -0,0 +1,685 @@
+<template>
+    <div class="drone-pilot-details" :style="{ width: screenWidth,height: screenHeight}">
+      <van-nav-bar
+        title="详情"
+        left-arrow
+        @click-left="onClickLogin"
+      />
+      <div id="landscapeBox" class="landscape-box" :style="{ width: boxWidth + 'px', height: boxHeight + 'px'}">
+        <div id="videoModule" class="l-video" :style="{ width: screenWidthVideo + 'px', height: (screenHeightVideo) + 'px'}">
+          <video v-show="videoUrl" ref="videoPlayerBig" :style="{ width: screenWidthVideo + 'px', height: screenHeightVideo + 'px'}" controls autoplay muted playsinline style="text-align: left; object-fit: fill">
+            Your browser is too old which doesn't support HTML5 video.
+          </video>
+          <el-empty v-show="videoUrl == ''" description="当前设备已关机,无法进行直播" :image="imageUrl"></el-empty>
+          <div v-if="videoUrl" class="center-point"></div>
+          <div class="right-box">
+            <ptzControl :sn="sn" :osdVisible="sbInfo"/>
+            <controlConsole :sn="sn" :osdVisible="sbInfo" :cesiumViewe="globalViewer" />
+          </div>
+        </div>
+        <div class="l-map" :style="{ width: screenWidthVideo + 'px', height: (screenHeightVideo) + 'px'}">
+          <div id="cesiumContainerBigMap"></div>
+          <div class="l-zp" id="lZp">
+            <comPass :cesiumViewe="globalViewer"/>
+          </div>
+          <div class="l-zoom" id="lZoom">
+            <div class="zoom">
+              <img src="@/assets/images/me.png" @touchstart="clickPhoneLocation" />
+            </div>
+            <div class="zoom" @touchstart="onChangeD">
+              <img v-if="is2d" src="@/assets/images/stand.png" />
+              <img v-else src="@/assets/images/satellite.png" />
+            </div>
+            <div class="zoom">
+              <img v-if="!isBigMap" src="@/assets/images/fang.png" @touchstart="changeModelMap" />
+              <img v-else src="@/assets/images/suo.png" @touchstart="changeModelMap" />
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </template>
+  
+  <script lang="ts" setup>
+  import { ref, onMounted, onBeforeUnmount, nextTick, reactive, computed, watch } from 'vue';
+  import { EDeviceTypeName, EHmsLevel } from '@/types/enums'
+  import { getRoot } from '../../root'
+  import { getWaylineFile, getLiveVideoUrl } from '@/api/manage'
+  import { CURRENT_CONFIG as config } from '@/api/http/config';
+  import { getLnglatDist, cartesian3Convert, getLnglatAltitude, createCircleBillboard } from '@/utils/cesium/mapUtil';
+  import cesiumOperation from '@/utils/cesium-tsa.js';
+  const { _init, viewerDestory } = cesiumOperation();
+  import { useMyStore } from '@/store'
+  import comPass from './components/comPass.vue'
+  import ptzControl from './components/ptzControl.vue'
+  import controlConsole from './components/controlConsole.vue'
+  import { useConnectWebSocket } from '@/utils/websocket/connect-websocket'
+  import { getWebsocketUrl } from '@/websocket/util/config'
+  import { EBizCode, ELocalStorageKey, ERouterName } from '@/types'
+  import VConsole from 'vconsole';
+  import { analyzeKmzFile, XMLToJSON } from '@/utils/cesium/kmz.js'
+  import { initPointWayLine } from './hooks/initPointWayline'
+  import { initPlanarWayline } from './hooks/initPlanarWayline'
+  import { droneFly } from './hooks/droneFly'
+  const { pointWayline } = initPointWayLine()
+  const { planarWayline } = initPlanarWayline()
+  const { initDock, getPhoneLocation, clickPhoneLocation } = droneFly()
+  
+  const {
+    removeAllPoint,
+    removeAllDataSource,
+    globalCesium,
+    getEntityById,
+    removeById,
+    loadLAYER,
+  } = cesiumOperation()
+  
+  const vConsole = new VConsole();
+  
+  let globalViewer = null
+  
+  // 使用 ref 来存储屏幕宽度和高度
+  const screenWidth = ref(window.innerWidth);
+  const screenHeight = ref(window.innerHeight);
+  // 加了头部
+  const boxWidth = ref(window.innerWidth);
+  const boxHeight = ref(window.innerHeight - 46);
+  // 地图切换
+  const screenWidthMap = ref(boxWidth.value)// ref(((boxHeight.value)/2)*2)
+  const screenHeightMap = ref(((boxHeight.value)/2));
+  // 视频切换
+  const screenWidthVideo = ref(boxWidth.value);
+  const screenHeightVideo = ref(boxHeight.value/2);
+  const isBigMap = ref(false)
+  
+  // 显示高德地图矢量还是影像(2D/3D)
+  let is2d = ref(true)
+  
+  const onChangeD = () => {
+    is2d.value = !is2d.value
+    store.commit('SET_MAP_SETTING_MODE', is2d.value?2:3);
+    loadLAYER();
+  }
+  
+  const store = useMyStore()
+  // 获取路由
+  const root = getRoot()
+  
+  interface deviceInfo {
+    dockSn: string;
+    latitude?:number;// 机场经纬度
+    longitude?:number;
+    height?:number; // 机场高度
+    isOnline: boolean;
+    name: string; // 可选字段
+    sn: string;
+    workspaceId:string;
+    children?: {  };
+  }
+  // 获取机场/遥控器sn
+  let localData = ref<any>(window.localStorage.getItem('sbInfo'))
+  const sbInfo: deviceInfo = JSON.parse(localData.value) as deviceInfo;
+  
+  // 无人机sn 
+  const sn = ref<String>(sbInfo.sn)
+  // 机场sn 
+  const dockSn = ref<String>(sbInfo.dockSn)
+  
+  // 记录横竖屏模式
+  const isLandscape = ref(false);
+  
+  // 记录视频地址
+  const videoUrl = ref<String>('');
+  
+  // 设置图片地址
+  const imageUrl = new URL('@/assets/images/norecord.png', import.meta.url).href
+  
+  const imageMapSrc = new URL('@/assets/images/mapdock.png', import.meta.url).href
+  
+  const jgbMapSrc = new URL('@/assets/images/jgb.png', import.meta.url).href
+  
+  const mapswitching = new URL('@/assets/images/mapswitching.png', import.meta.url).href
+  
+  const videoWH = ref<any>(null)
+  
+  // 视频宽高
+  const drawCanvasWidth = ref<Number>(0)
+  const drawCanvasHeight = ref<Number>(0)
+  
+  const videoPlayerBig = ref<any>(null); // 视频播放器实例
+  let webrtcPlayerBig = null
+  
+  let player = null; // video.js 播放器
+  
+  // 无人机实时飞行链接
+  let ssLinePath = ref<String>(null)
+  
+  // 实时定位
+  let viewDroneInfo = {}
+  // 机场高度
+  let droneHeight = ref(0)
+  
+  // 监听
+  let connectWs = ref<any>(null)
+  
+  let workspaceId = ref<String>(sbInfo.workspaceId)
+  localStorage.setItem('bs_workspace_id', workspaceId.value)
+  
+  // RTCWEB 加载视频
+  const playBig = () => {
+    webrtcPlayerBig = new window.ZLMRTCClient.Endpoint({
+      element: videoPlayerBig.value, // video 标签
+      debug: true, // 是否打印日志
+      zlmsdpUrl: videoUrl.value, //流地址
+      simulecast: false,
+      useCamera: false,
+      audioEnable: true,
+      videoEnable: true,
+      recvOnly: true,
+      usedatachannel: false,
+    })
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR,
+      (e) => {
+        // ICE 协商出错
+        console.error('ICE 协商出错')
+        // this.eventcallbacK('ICE ERROR', 'ICE 协商出错')
+      },
+    )
+  
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,
+      (e) => {
+        //获取到了远端流,可以播放
+        console.log('播放成功', e.streams)
+        // this.eventcallbacK('playing', '播放成功')
+      },
+    )
+  
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,
+      (e) => {
+        // offer anwser 交换失败
+        console.error('offer anwser 交换失败', e)
+        // this.eventcallbacK('OFFER ANSWER ERROR ', 'offer anwser 交换失败')
+        if (e.code == -400 && e.msg == '流不存在') {
+          console.log('流不存在')
+          timerBig = setTimeout(() => {
+            webrtcPlayerBig.close()
+            playBig()
+          }, 100)
+        }
+      },
+    )
+  
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_ON_LOCAL_STREAM,
+      (s) => {
+        // 获取到了本地流
+  
+        // document.getElementById('selfVideo').srcObject=s;
+        // this.eventcallbacK('LOCAL STREAM', '获取到了本地流')
+      },
+    )
+  }
+  
+  
+  // 加载该设备的视频信息
+  const loadVideo = async () => {
+    await getLiveVideoUrl(sn.value).then((res) => {
+      if (res.data.code != 0) return
+      // 获取高度
+      if (videoWH.value) {
+        drawCanvasWidth.value = videoWH.value.offsetWidth;
+        drawCanvasHeight.value = videoWH.value.offsetHeight;
+      }
+      videoUrl.value =  res.data.data.rtcs_url
+      // 播放
+      playBig()
+    })
+  }
+  
+  //===============================
+  // 获取实时航线
+  const getWrjSsLx = () => {
+    if (window.cesiumViewer== null) return 
+    getWaylineFile(sbInfo.sn).then((res:any) => {
+      if (res.code != 200) return
+      ssLinePath.value = res.data
+      // globalViewer = window.cesiumViewer
+      // 先有航线,再飞行
+      generateCourse()
+    })
+  }
+  
+  // 生成航线轨迹
+  const generateCourse = async () => {
+    if (!ssLinePath.value) return
+    const { fileInfoObj } = await analyzeKmzFile(`${ssLinePath.value}?_t=${new Date().getTime()}`)
+    const xmlStr = await fileInfoObj['wpmz/template.kml']
+    const xmlJson = XMLToJSON(xmlStr)?.['Document']
+    const placemark = xmlJson.Folder.Placemark
+    if (placemark?.Polygon) {
+      // return 'planar'
+      planarWayline(ssLinePath.value, sbInfo.longitude, sbInfo.latitude)
+    } else {
+      // return 'point'
+      pointWayline(ssLinePath.value, sbInfo.longitude, sbInfo.latitude)
+    }
+  }
+  
+  // 无人机相关信息
+  // const droneInfo = ref({})
+  
+  // 监听ws
+  const messageHandler = async (payload: any) => {
+    // if (!payload) {
+    //   return
+    // }
+    switch (payload.biz_code) {
+      case EBizCode.GatewayOsd: { // 遥控器
+        store.commit('SET_GATEWAY_INFO', payload.data)
+        break
+      }
+      case EBizCode.DeviceOsd: { // 无人机的
+        store.commit('SET_DEVICE_INFO', payload.data)
+        store.commit('SET_WS_MESSAGE', payload)
+        getviewDrone(payload)
+        break
+      }
+      case EBizCode.DockOsd: { // 机场
+        store.commit('SET_DOCK_INFO', payload.data)
+        break
+      }
+      case EBizCode.DeviceOffline: {
+        store.commit('SET_DEVICE_OFFLINE', payload.data)
+        if (!payload.data.online_status) {
+          videoUrl.value = ''
+        }
+        break
+      }
+      case EBizCode.FlightTaskProgress: { // 获取进度
+        // 如果点击列表进入没有获取到航线文件,那么这里重新请求一次
+        if (!ssLinePath || !ssLinePath.value) {
+          getWrjSsLx()
+        }
+        break
+      }
+    }
+    
+  }
+  
+  const webSorketUrl = getWebsocketUrl() + '&workspace-id=' + workspaceId.value
+  // 监听ws 消息
+  useConnectWebSocket(messageHandler, webSorketUrl)
+  
+  // 定义方法直接监听机场消息
+  const getviewDrone = (newValue) => {
+    if (newValue.data.host) {
+      viewDroneInfo.longitude = newValue.data.host?.longitude
+      viewDroneInfo.latitude = newValue.data.host?.latitude
+      viewDroneInfo.elevation = Number(newValue.data.host?.elevation.toFixed(2)) + droneHeight.value
+    }
+  }
+  
+  
+  // let savedMapState = null; // 保存地图状态
+  // // 销毁之前先保存状态
+  // const destroyViewer = () => {
+  //   if ( window.cesiumViewer) {
+  //     // 保存当前地图状态(如相机位置)
+  //     // savedMapState = window.cesiumViewer.camera.view;
+  //     window.cesiumViewer.destroy();
+  //     window.cesiumViewer = null;
+  //   }
+  // }
+  
+  // 视频全屏切换
+  
+  // const changeModelVideo = (value:Boolean) => {
+  //   const videoModule = document.getElementById('videoModule');
+  //   // 不管是否竖/横屏都一样
+  //   if (value) { // 全屏
+  //     videoModule.style.width = `${screenWidth.value}px`
+  //     videoModule.style.height = `${screenHeight.value}px`
+  //   } else {
+  //     if (isLandscape.value) {
+  //       videoModule.style.width = `${screenWidth.value/2}px`
+  //       videoModule.style.height = `${screenHeight.value}px`
+  //     } else {
+  //       videoModule.style.height = `${screenHeight.value/2}px`
+  //       videoModule.style.width = `${screenWidth.value}px`
+  //     }
+  //   }
+  // }
+  
+  // 地图全屏切换
+  const changeModelMap = () => {
+    isBigMap.value = !isBigMap.value
+    const cesiumContainer = document.getElementById('cesiumContainerBigMap');
+    const lZp = document.getElementById('lZp');
+    // const lZoom = document.getElementById('lZoom');
+    if (isLandscape.value) { // 横屏
+      if (isBigMap.value) { // 全屏
+        cesiumContainer.style.position = 'fixed';
+        cesiumContainer.style.top = '46px';
+        cesiumContainer.style.left = '0';
+        cesiumContainer.style.width = `${boxWidth.value}px`
+        // cesiumContainer.style.height = `${screenHeightMap.value}px`
+        lZp.style.right = '40%';
+        // lZoom.style.left = '0';
+      } else { // 缩放
+        cesiumContainer.style.width = `${boxWidth.value/2}px`
+        // cesiumContainer.style.height = `${screenHeightMap.value}px`
+        cesiumContainer.style.position = 'static';
+        lZp.style.right = '16%';
+        // lZoom.style.left = '50%';
+        
+      }
+    } else {
+      if (isBigMap.value) { // 竖-全屏
+        cesiumContainer.style.position = 'fixed';
+        cesiumContainer.style.top = '46px';
+        cesiumContainer.style.left = '0';
+        // cesiumContainer.style.width = `${boxHeight.value}px`
+        cesiumContainer.style.height = `${boxHeight.value}px`
+        lZp.style.right = '30%';
+        // lZoom.style.right = '0';
+      } else { // 缩放
+        cesiumContainer.style.width = `${boxHeight.value}px`
+        cesiumContainer.style.height = `${boxHeight.value/2}px`
+        cesiumContainer.style.position = 'static';
+        lZp.style.right = '30%';
+        // lZoom.style.right = '0';
+        
+      }
+    }
+  }
+  
+  // 更新屏幕尺寸的函数
+  // const updateScreenSize = () => {
+  //   const cesiumContainer = document.getElementById('cesiumContainerBigMap');
+  //   screenWidth.value = window.innerWidth;
+  //   screenHeight.value = window.innerHeight;
+  //   console.log('屏幕自身宽度',window.innerWidth)
+  //   console.log('屏幕自身高度',window.innerHeight)
+  //   if (isLandscape.value) { //横屏
+  //     screenWidthMap.value = window.innerWidth/2
+  //     screenHeightMap.value = window.innerHeight
+  //     screenWidthVideo.value = window.innerWidth/2
+  //     screenHeightVideo.value = window.innerHeight
+  //     cesiumContainer.style.width = `${screenWidthMap.value}px`
+  //     cesiumContainer.style.height = `${screenHeightMap.value}px`
+  //   } else {//竖屏
+  //     screenWidthMap.value = window.innerHeight
+  //     screenHeightMap.value = (window.innerHeight/2)
+  //     screenWidthVideo.value = window.innerWidth
+  //     screenHeightVideo.value = (window.innerHeight/2)
+  //     // 重新给赋值宽高
+  //     cesiumContainer.style.width = `${screenWidthMap.value}px`
+  //     cesiumContainer.style.height = `${screenHeightMap.value}px`
+  //     console.log('切换竖屏宽度',screenWidthMap.value)
+  //     console.log('切换竖屏高度度',screenHeightMap.value)
+  //   }
+    
+  // };
+  
+  const checkOrientation = async () => {
+    boxWidth.value = window.innerWidth;
+    boxHeight.value = window.innerHeight - 46;
+    const landscapeBox = document.getElementById('landscapeBox');
+    let cesiumContainer = document.getElementById('cesiumContainerBigMap');
+    const lZp = document.getElementById('lZp');
+    const lZoom = document.getElementById('lZoom');
+  
+    if (window.innerWidth > window.innerHeight) {//横屏
+      screenWidthVideo.value = boxWidth.value/2
+      screenHeightVideo.value = boxHeight.value
+      isLandscape.value = true;
+      // updateScreenSize()
+      landscapeBox.style.display = 'flex';
+      lZp.style.right = '16%';
+      lZoom.style.position = 'fixed';
+      cesiumContainer.style.width = `${boxWidth.value/2}px`
+      cesiumContainer.style.height = `${boxHeight.value}px`
+      cesiumContainer.style.position = 'static'
+      cesiumContainer.style.right = '0'
+      cesiumContainer.style.marginLeft = '0%'
+    } else { //竖屏
+      isLandscape.value = false;
+      screenWidthVideo.value = boxWidth.value
+      screenHeightVideo.value = boxHeight.value/2
+      // updateScreenSize()
+      landscapeBox.style.display = 'inherit';
+      landscapeBox.style.overflow = 'hidden';
+      lZp.style.right = '32%';
+      cesiumContainer.style.width = `${boxHeight.value}px`
+      cesiumContainer.style.height = `${boxHeight.value/2}px`
+      // cesiumContainer.style.position = 'absolute'
+      cesiumContainer.style.marginLeft = '-32%'
+    }
+  };
+  
+  // 切换航线轨迹
+  const courseTrack = (data:any) => {
+    if (window.cesiumViewer== null) return 
+    const currentSn = dockSn.value
+    const longitude = data.dockInfo[currentSn]?.basic_osd?.longitude || null
+    const latitude = data.dockInfo[currentSn]?.basic_osd?.latitude || null
+    const height = data.dockInfo[currentSn]?.basic_osd?.height || null
+    let getLongOk = ref(0)
+    if (!getEntityById('drone_dock')) {
+      getLnglatAltitude(longitude, latitude,  window.cesiumViewer).then(res => {
+        removeById('drone_dock')
+         window.cesiumViewer.entities.add({
+          position: globalCesium.Cartesian3.fromDegrees(
+            longitude,
+            latitude,
+            res.height,
+          ),
+          id: 'drone_dock',
+          billboard: {
+            image: imageMapSrc,
+            outlineWidth: 0,
+            width: 36,
+            height: 36,
+            scale: 1.0,
+          }
+        })
+        window.cesiumViewer.scene.camera.setView({
+          destination: globalCesium.Cartesian3.fromDegrees(
+            Number(longitude),
+            Number(latitude),
+            10000.0,
+          ),
+        })
+        droneHeight.value = res.height
+      })
+    } else {
+      // 当机场坐标存在时,判断获取的位置与机场坐标位置是否一致,若不是,重新更新位置
+      let dornePoint = cartesian3Convert(getEntityById('drone_dock')._position._value, window.cesiumViewer,)
+      getLongOk = getLnglatDist(
+        dornePoint.longitude,
+        dornePoint.latitude,
+        longitude,
+        latitude,
+      )
+      if (getLongOk.value > 100) {
+        removeById('drone_dock')
+      }
+    }
+    if (getLongOk.value > 100) return
+    initDock(data, sn.value, dockSn.value, workspaceId.value, ssLinePath.value, viewDroneInfo)
+  }
+  
+  // 监听
+  watch(() => store.state.deviceState, (newValue, oldValue) => {
+    if (newValue) {
+      nextTick()
+      courseTrack(newValue)
+    }
+  }, {deep: true})
+  
+  // watch(() => store.state.wsMessage, (newValue, oldValue) => {
+  //   // 控制台报 Expected longitude to be typeof number, actual typeof was undefined 是因为这里没有及时拿到longitude数据
+  //   if (newValue) {
+  //     viewDroneInfo.longitude = newValue?.longitude
+  //     viewDroneInfo.latitude = newValue?.latitude
+  //     viewDroneInfo.elevation = Number(newValue?.elevation.toFixed(2)) + droneHeight.value
+  //   }
+  // }, {deep: true})
+  
+  
+  let intervalId = null;
+  
+  const onClickLogin = () => {
+    history.back();
+  }
+  
+  // 为组件赋值
+  const getGlobalViewer = () => {
+    globalViewer = window.cesiumViewer;
+  }
+  
+  onMounted(async () => {
+    window.addEventListener('orientationchange', checkOrientation);
+    window.addEventListener('resize', checkOrientation); // 兼容某些设备
+    checkOrientation(); // 初始化时检查一次
+    loadVideo()
+    await nextTick();
+    await _init('cesiumContainerBigMap');
+    await getGlobalViewer()
+    await getWrjSsLx();
+    // 判断是遥控器还是机场
+    let domain = sessionStorage.getItem('domain')
+    if (domain !== '0') {
+      await getPhoneLocation(workspaceId.value)
+    // // // 设置定时器,每隔 5 秒刷新一次数据
+      // intervalId = setInterval(()=> {
+      //   getPhoneLocation(workspaceId.value)
+      // }, 5000);
+    }
+  });
+  
+  onBeforeUnmount(() => {
+    window.removeEventListener('orientationchange', checkOrientation);
+    window.removeEventListener('resize', checkOrientation);
+  
+    // removeAllPoint()
+    // removeAllDataSource()
+    // 销毁地图实例
+    if (window.cesiumViewer && !window.cesiumViewer.isDestroyed()) {
+      window.cesiumViewer.destroy();
+    }
+    if (globalViewer && !globalViewer.isDestroyed()) {
+      globalViewer.destroy();
+    }
+    if (player) {
+      player.dispose();
+    }
+    // 组件卸载时清除定时器
+    if (intervalId) {
+      clearInterval(intervalId);
+    }
+  });
+  
+  
+  
+  </script>
+  
+  <style lang="scss" scoped>
+  .drone-pilot-details {
+    .landscape-box {
+      overflow: hidden;
+      // position: relative;
+      // display: flex;
+      .l-map {
+        .l-zp {
+          position: fixed;
+          right: 16%;
+          bottom: 0;
+        }
+        .l-zoom {
+          position: fixed;
+          bottom: 0;
+          right: 0;
+          .zoom {
+            width: 2rem;
+            height: 2rem;
+            margin: 0.2rem 0.4rem;
+            border-radius: 3px;
+            background-color: rgba(0, 0, 0, 0.8);
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            overflow: hidden;
+            cursor: pointer;
+            pointer-events: all;
+            img {
+              width: 1.6rem;
+              height: 1.6rem;
+            }
+          }
+        }
+      }
+    }
+    .l-video {
+      position: relative;
+      .el-empty {
+        width: 100%;
+        height: 100%;
+        padding: 0;
+        ::v-deep(.el-empty__image) {
+          width: 50%;
+          height: 50%;
+        }
+        ::v-deep(.el-empty__description) {
+          margin: 0;
+        }
+      }
+      .center-point {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        width: 0.4rem;
+        height: 0.4rem;
+        opacity: 0.5;
+        border-radius: 50%;
+        background-color: yellow;
+        transform: translate(-50%, -50%);
+        justify-content: center;
+      }
+      .right-box {}
+    }
+    #cesiumContainerBigMap {
+      width: 100%;
+      height: 100%;
+      margin: 0;
+      padding: 0;
+      overflow: hidden;
+  
+      :deep() {
+        .cesium-viewer {
+          width: 100%;
+          height: 100%;
+  
+          .cesium-viewer-cesiumWidgetContainer {
+            width: 100%;
+            height: 100%;
+  
+            .cesium-widget {
+              width: 100%;
+              height: 100%;
+  
+              canvas {
+                width: 100%;
+                height: 100%;
+              }
+            }
+          }
+        }
+      }
+    }
+    
+  }
+  </style>
\ No newline at end of file
diff --git a/src/views/DronePilotDetails.vue b/src/views/DronePilotDetails.vue
index d13116a..50392e1 100644
--- a/src/views/DronePilotDetails.vue
+++ b/src/views/DronePilotDetails.vue
@@ -2,8 +2,10 @@
   <div class="drone-pilot-details" :style="{ width: screenWidth,height: screenHeight}">
     <van-nav-bar
       title="详情"
+      right-text="分享"
       left-arrow
       @click-left="onClickLogin"
+      @click-right="onClickShare"
     />
     <div id="landscapeBox" class="landscape-box" :style="{ width: boxWidth + 'px', height: boxHeight + 'px'}">
       <div id="videoModule" class="l-video" :style="{ width: screenWidthVideo + 'px', height: (screenHeightVideo) + 'px'}">
@@ -37,14 +39,21 @@
         </div>
       </div>
     </div>
+    <van-share-sheet
+    v-model:show="showShare"
+    title="立即分享"
+    :options="shareOptions"
+    @select="onSelectShare"
+  />
   </div>
 </template>
 
 <script lang="ts" setup>
 import { ref, onMounted, onBeforeUnmount, nextTick, reactive, computed, watch } from 'vue';
+import { showNotify } from 'vant';
 import { EDeviceTypeName, EHmsLevel } from '@/types/enums'
 import { getRoot } from '../../root'
-import { getWaylineFile, getLiveVideoUrl } from '@/api/manage'
+import { getWaylineFile, getLiveVideoUrl, saveToken } from '@/api/manage'
 import { CURRENT_CONFIG as config } from '@/api/http/config';
 import { getLnglatDist, cartesian3Convert, getLnglatAltitude, createCircleBillboard } from '@/utils/cesium/mapUtil';
 import cesiumOperation from '@/utils/cesium-tsa.js';
@@ -75,6 +84,10 @@
 } = cesiumOperation()
 
 const vConsole = new VConsole();
+
+const showShare = ref(false)
+
+const shareOptions = [ { name: '复制链接', icon: 'link' }]
 
 let globalViewer = null
 
@@ -152,7 +165,7 @@
 let player = null; // video.js 播放器
 
 // 无人机实时飞行链接
-let ssLinePath = ref(null)
+let ssLinePath = ref<String>(null)
 
 // 实时定位
 let viewDroneInfo = {}
@@ -425,40 +438,40 @@
 // };
 
 const checkOrientation = async () => {
-  boxWidth.value = window.innerWidth;
-  boxHeight.value = window.innerHeight - 46;
-  const landscapeBox = document.getElementById('landscapeBox');
-  let cesiumContainer = document.getElementById('cesiumContainerBigMap');
-  const lZp = document.getElementById('lZp');
-  const lZoom = document.getElementById('lZoom');
-
-  if (window.innerWidth > window.innerHeight) {//横屏
-    screenWidthVideo.value = boxWidth.value/2
-    screenHeightVideo.value = boxHeight.value
-    isLandscape.value = true;
-    // updateScreenSize()
-    landscapeBox.style.display = 'flex';
-    lZp.style.right = '16%';
-    lZoom.style.position = 'fixed';
-    cesiumContainer.style.width = `${boxWidth.value/2}px`
-    cesiumContainer.style.height = `${boxHeight.value}px`
-    cesiumContainer.style.position = 'static'
-    cesiumContainer.style.right = '0'
-    cesiumContainer.style.marginLeft = '0%'
-  } else { //竖屏
-    isLandscape.value = false;
-    screenWidthVideo.value = boxWidth.value
-    screenHeightVideo.value = boxHeight.value/2
-    // updateScreenSize()
-    landscapeBox.style.display = 'inherit';
-    landscapeBox.style.overflow = 'hidden';
-    lZp.style.right = '32%';
-    cesiumContainer.style.width = `${boxHeight.value}px`
-    cesiumContainer.style.height = `${boxHeight.value/2}px`
-    // cesiumContainer.style.position = 'absolute'
-    cesiumContainer.style.marginLeft = '-32%'
-  }
-};
+    boxWidth.value = window.innerWidth;
+    boxHeight.value = window.innerHeight - 46;
+    const landscapeBox = document.getElementById('landscapeBox');
+    let cesiumContainer = document.getElementById('cesiumContainerBigMap');
+    const lZp = document.getElementById('lZp');
+    const lZoom = document.getElementById('lZoom');
+  
+    if (window.innerWidth > window.innerHeight) {//横屏
+      screenWidthVideo.value = boxWidth.value/2
+      screenHeightVideo.value = boxHeight.value
+      isLandscape.value = true;
+      // updateScreenSize()
+      landscapeBox.style.display = 'flex';
+      lZp.style.right = '16%';
+      lZoom.style.position = 'fixed';
+      cesiumContainer.style.width = `${boxWidth.value/2}px`
+      cesiumContainer.style.height = `${boxHeight.value}px`
+      cesiumContainer.style.position = 'static'
+      cesiumContainer.style.right = '0'
+      cesiumContainer.style.marginLeft = '0%'
+    } else { //竖屏
+      isLandscape.value = false;
+      screenWidthVideo.value = boxWidth.value
+      screenHeightVideo.value = boxHeight.value/2
+      // updateScreenSize()
+      landscapeBox.style.display = 'inherit';
+      landscapeBox.style.overflow = 'hidden';
+      lZp.style.right = '32%';
+      cesiumContainer.style.width = `${boxHeight.value}px`
+      cesiumContainer.style.height = `${boxHeight.value/2}px`
+      // cesiumContainer.style.position = 'absolute'
+      cesiumContainer.style.marginLeft = '-32%'
+    }
+  };
 
 // 切换航线轨迹
 const courseTrack = (data:any) => {
@@ -514,7 +527,6 @@
 
 // 监听
 watch(() => store.state.deviceState, (newValue, oldValue) => {
-  // 试试
   if (newValue) {
     nextTick()
     courseTrack(newValue)
@@ -537,6 +549,27 @@
   history.back();
 }
 
+const onClickShare = () => {
+  showShare.value = true
+
+  // root.$router.push({
+  //   path:ERouterName.DRONEPILOTSHARE,
+  //   query: { workspaceId:workspaceId.value, token: localStorage.getItem(ELocalStorageKey.Token),sbInfo:window.localStorage.getItem('sbInfo') } });
+}
+// 复制链接
+const onSelectShare = () => {
+  saveToken({ token: localStorage.getItem(ELocalStorageKey.Token), sbInfo: window.localStorage.getItem('sbInfo') }).then((res) => {
+    // if (res.code !==0) return
+    const shareUrl = `https://wrj.shuixiongit.com/pilot-h5/#/dronePilotShare?code=${Number(res.data)}`
+    navigator.clipboard.writeText(shareUrl).then(() => {
+      showNotify({ type: 'success', message: '复制成功' })
+    }).catch(() => {
+      showNotify({ type: 'warning', message: '复制失败' })
+    });
+    showShare.value = false
+  });
+}
+
 // 为组件赋值
 const getGlobalViewer = () => {
   globalViewer = window.cesiumViewer;
@@ -554,7 +587,7 @@
   // 判断是遥控器还是机场
   let domain = sessionStorage.getItem('domain')
   if (domain !== '0') {
-    await getPhoneLocation(workspaceId.value)
+    // await getPhoneLocation(workspaceId.value)
   // // // 设置定时器,每隔 5 秒刷新一次数据
     // intervalId = setInterval(()=> {
     //   getPhoneLocation(workspaceId.value)
@@ -658,6 +691,10 @@
     margin: 0;
     padding: 0;
     overflow: hidden;
+    transform-origin: top left;
+    transition: none; // 防止切换时的动画效果
+    backface-visibility: hidden; // 提高性能
+    -webkit-backface-visibility: hidden; // 提高性能  
 
     :deep() {
       .cesium-viewer {
diff --git a/src/views/DronePilotList.vue b/src/views/DronePilotList.vue
index 46b74a7..d83fb70 100644
--- a/src/views/DronePilotList.vue
+++ b/src/views/DronePilotList.vue
@@ -84,6 +84,8 @@
     // 前端自己加的判断
     window.sessionStorage.setItem('domain', JSON.stringify(droneOrPilotTxt.value == 'drone'? 0 : 2));
     store.commit('SET_OSD_VISIBLE_INFO', osdVisible)
+    // 存储机场信息
+    store.commit('SET_AIRPORT_INFO', data)
     // 跳转操作屏幕
     root.$router.push({ path:ERouterName.DRONEPILOTDETAILS })
   }
diff --git a/src/views/DronePilotShare.vue b/src/views/DronePilotShare.vue
new file mode 100644
index 0000000..e2d14a3
--- /dev/null
+++ b/src/views/DronePilotShare.vue
@@ -0,0 +1,638 @@
+<template>
+    <div class="drone-pilot-details" :style="{ width: screenWidth,height: screenHeight}">
+      <van-nav-bar
+        title="详情"
+        left-arrow
+        @click-left="onClickLogin"
+      />
+      <div id="landscapeBox" class="landscape-box" :style="{ width: boxWidth + 'px', height: boxHeight + 'px'}">
+        <div id="videoModule" class="l-video" :style="{ width: screenWidthVideo + 'px', height: (screenHeightVideo) + 'px'}">
+          <video v-show="videoUrl" ref="videoPlayerBig" :style="{ width: screenWidthVideo + 'px', height: screenHeightVideo + 'px'}" controls autoplay muted playsinline style="text-align: left; object-fit: fill">
+            Your browser is too old which doesn't support HTML5 video.
+          </video>
+          <el-empty v-show="videoUrl == ''" description="当前设备已关机,无法进行直播" :image="imageUrl"></el-empty>
+          <div v-if="videoUrl" class="center-point"></div>
+          <div class="right-box">
+            <!-- <ptzControl :sn="sn" :osdVisible="sbInfo"/> -->
+            <!-- <controlConsole :sn="sn" :osdVisible="sbInfo" :cesiumViewe="globalViewer" /> -->
+          </div>
+        </div>
+        <div class="l-map" :style="{ width: screenWidthVideo + 'px', height: (screenHeightVideo) + 'px'}">
+          <div id="cesiumContainerBigMap"></div>
+          <div class="l-zp" id="lZp">
+            <comPass :cesiumViewe="globalViewer"/>
+          </div>
+          <div class="l-zoom" id="lZoom">
+            <div class="zoom">
+              <img src="@/assets/images/me.png" @touchstart="clickPhoneLocation" />
+            </div>
+            <div class="zoom" @touchstart="onChangeD">
+              <img v-if="is2d" src="@/assets/images/stand.png" />
+              <img v-else src="@/assets/images/satellite.png" />
+            </div>
+            <div class="zoom">
+              <img v-if="!isBigMap" src="@/assets/images/fang.png" @touchstart="changeModelMap" />
+              <img v-else src="@/assets/images/suo.png" @touchstart="changeModelMap" />
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </template>
+  
+  <script lang="ts" setup>
+  import { ref, onMounted, onBeforeUnmount, nextTick, reactive, computed, watch } from 'vue';
+  import { EDeviceTypeName, EHmsLevel } from '@/types/enums'
+  import { getRoot } from '../../root'
+  import { getWaylineFile, getLiveVideoUrl,getTokenByCode } from '@/api/manage'
+  import { CURRENT_CONFIG as config } from '@/api/http/config';
+  import { getLnglatDist, cartesian3Convert, getLnglatAltitude, createCircleBillboard } from '@/utils/cesium/mapUtil';
+  import cesiumOperation from '@/utils/cesium-tsa.js';
+  const { _init, viewerDestory } = cesiumOperation();
+  import { useMyStore } from '@/store'
+  import comPass from './components/comPass.vue'
+  import ptzControl from './components/ptzControl.vue'
+  import controlConsole from './components/controlConsole.vue'
+  import { useConnectWebSocket } from '@/utils/websocket/connect-websocket'
+  import { getWebsocketUrl } from '@/websocket/util/config'
+  import { EBizCode, ELocalStorageKey, ERouterName } from '@/types'
+  import VConsole from 'vconsole';
+  import { analyzeKmzFile, XMLToJSON } from '@/utils/cesium/kmz.js'
+  import { initPointWayLine } from './hooks/initPointWayline'
+  import { initPlanarWayline } from './hooks/initPlanarWayline'
+  import { droneFly } from './hooks/droneFly'
+  const { pointWayline } = initPointWayLine()
+  const { planarWayline } = initPlanarWayline()
+  const { initDock, getPhoneLocation, clickPhoneLocation } = droneFly()
+  
+  const {
+    removeAllPoint,
+    removeAllDataSource,
+    globalCesium,
+    getEntityById,
+    removeById,
+    loadLAYER,
+  } = cesiumOperation()
+  
+  const vConsole = new VConsole();
+  
+  let globalViewer = null
+  
+  // 使用 ref 来存储屏幕宽度和高度
+  const screenWidth = ref(window.innerWidth);
+  const screenHeight = ref(window.innerHeight);
+  // 加了头部
+  const boxWidth = ref(window.innerWidth);
+  const boxHeight = ref(window.innerHeight - 46);
+  // 地图切换
+  const screenWidthMap = ref(boxWidth.value)// ref(((boxHeight.value)/2)*2)
+  const screenHeightMap = ref(((boxHeight.value)/2));
+  // 视频切换
+  const screenWidthVideo = ref(boxWidth.value);
+  const screenHeightVideo = ref(boxHeight.value/2);
+  const isBigMap = ref(false)
+  
+  // 显示高德地图矢量还是影像(2D/3D)
+  let is2d = ref(true)
+  
+  const onChangeD = () => {
+    is2d.value = !is2d.value
+    store.commit('SET_MAP_SETTING_MODE', is2d.value?2:3);
+    loadLAYER();
+  }
+  
+  const store = useMyStore()
+  // 获取路由
+  const root = getRoot()
+  
+  interface deviceInfo {
+    dockSn: string;
+    latitude?:number;// 机场经纬度
+    longitude?:number;
+    height?:number; // 机场高度
+    isOnline: boolean;
+    name: string; // 可选字段
+    sn: string;
+    workspaceId:string;
+    children?: {  };
+  }
+    // 取值
+    let sbInfo: deviceInfo = {} as deviceInfo;
+    // 无人机sn 
+    let sn = ref<String>('')
+    // 机场sn 
+    let dockSn = ref<String>('')
+    // workspaceId
+    let workspaceId = ref<String>('')
+    // 获取实时航线
+    const getWrjSsLx = async () => {
+      if (window.cesiumViewer== null) return 
+      console.log('哒哒哒1111',sbInfo)
+      await getWaylineFile(sbInfo.sn).then((res:any) => {
+        if (res.code != 200) return
+        ssLinePath.value = res.data
+        // globalViewer = window.cesiumViewer
+        // 先有航线,再飞行
+        generateCourse()
+      })
+    }
+    const getTokenAndTbInfo = () => {
+      getTokenByCode(root.$route.query.code).then((res:any) => {
+        let tokenAndInfo = JSON.parse(res.data);
+        sbInfo = JSON.parse(tokenAndInfo.sbInfo);
+        store.commit('SET_TOKEN', tokenAndInfo.token);
+        sn.value = sbInfo.sn;
+        dockSn.value = sbInfo.dockSn;
+        workspaceId.value = sbInfo.workspaceId
+        // 监听ws
+        const messageHandler = async (payload: any) => {
+          if (!payload) return
+          switch (payload.biz_code) {
+            case EBizCode.GatewayOsd: { // 遥控器
+              store.commit('SET_GATEWAY_INFO', payload.data)
+              break
+            }
+            case EBizCode.DeviceOsd: { // 无人机的
+              store.commit('SET_DEVICE_INFO', payload.data)
+              store.commit('SET_WS_MESSAGE', payload)
+              getviewDrone(payload)
+              break
+            }
+            case EBizCode.DockOsd: { // 机场
+              store.commit('SET_DOCK_INFO', payload.data)
+              break
+            }
+            case EBizCode.DeviceOffline: {
+              store.commit('SET_DEVICE_OFFLINE', payload.data)
+              if (!payload.data.online_status) {
+                videoUrl.value = ''
+              }
+              break
+            }
+            case EBizCode.FlightTaskProgress: { // 获取进度
+              // 如果点击列表进入没有获取到航线文件,那么这里重新请求一次
+              if (!ssLinePath || !ssLinePath.value) {
+                getWrjSsLx()
+              }
+              break
+            }
+          }
+        }
+        
+        const webSorketUrl = getWebsocketUrl() + '&workspace-id=' + workspaceId.value
+        // 监听ws 消息
+        useConnectWebSocket(messageHandler, webSorketUrl)
+        // 获取视频信息
+        loadVideo();
+        // 获取航线信息
+        getWrjSsLx();
+      })
+    }
+    getTokenAndTbInfo()
+    console.log('哒哒哒',sbInfo)
+  
+  
+  // 记录横竖屏模式
+  const isLandscape = ref(false);
+  
+  // 记录视频地址
+  const videoUrl = ref<String>('');
+  
+  // 设置图片地址
+  const imageUrl = new URL('@/assets/images/norecord.png', import.meta.url).href
+  
+  const imageMapSrc = new URL('@/assets/images/mapdock.png', import.meta.url).href
+  
+  const jgbMapSrc = new URL('@/assets/images/jgb.png', import.meta.url).href
+  
+  const mapswitching = new URL('@/assets/images/mapswitching.png', import.meta.url).href
+  
+  const videoWH = ref<any>(null)
+  
+  // 视频宽高
+  const drawCanvasWidth = ref<Number>(0)
+  const drawCanvasHeight = ref<Number>(0)
+  
+  const videoPlayerBig = ref<any>(null); // 视频播放器实例
+  let webrtcPlayerBig = null
+  
+  let player = null; // video.js 播放器
+  
+  // 无人机实时飞行链接
+  let ssLinePath = ref<String>(null)
+  
+  // 实时定位
+  let viewDroneInfo = {}
+  // 机场高度
+  let droneHeight = ref(0)
+  
+  // 监听
+  let connectWs = ref<any>(null)
+  
+  // RTCWEB 加载视频
+  const playBig = () => {
+    webrtcPlayerBig = new window.ZLMRTCClient.Endpoint({
+      element: videoPlayerBig.value, // video 标签
+      debug: true, // 是否打印日志
+      zlmsdpUrl: videoUrl.value, //流地址
+      simulecast: false,
+      useCamera: false,
+      audioEnable: true,
+      videoEnable: true,
+      recvOnly: true,
+      usedatachannel: false,
+    })
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR,
+      (e) => {
+        // ICE 协商出错
+        console.error('ICE 协商出错')
+        // this.eventcallbacK('ICE ERROR', 'ICE 协商出错')
+      },
+    )
+  
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,
+      (e) => {
+        //获取到了远端流,可以播放
+        console.log('播放成功', e.streams)
+        // this.eventcallbacK('playing', '播放成功')
+      },
+    )
+  
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,
+      (e) => {
+        // offer anwser 交换失败
+        console.error('offer anwser 交换失败', e)
+        // this.eventcallbacK('OFFER ANSWER ERROR ', 'offer anwser 交换失败')
+        if (e.code == -400 && e.msg == '流不存在') {
+          console.log('流不存在')
+          timerBig = setTimeout(() => {
+            webrtcPlayerBig.close()
+            playBig()
+          }, 100)
+        }
+      },
+    )
+  
+    webrtcPlayerBig.on(
+      window.ZLMRTCClient.Events.WEBRTC_ON_LOCAL_STREAM,
+      (s) => {
+        // 获取到了本地流
+  
+        // document.getElementById('selfVideo').srcObject=s;
+        // this.eventcallbacK('LOCAL STREAM', '获取到了本地流')
+      },
+    )
+  }
+  
+  
+  // 加载该设备的视频信息
+  const loadVideo = async () => {
+    await getLiveVideoUrl(sn.value).then((res) => {
+      if (res.data.code != 0) return
+      // 获取高度
+      if (videoWH.value) {
+        drawCanvasWidth.value = videoWH.value.offsetWidth;
+        drawCanvasHeight.value = videoWH.value.offsetHeight;
+      }
+      videoUrl.value =  res.data.data.rtcs_url
+      // 播放
+      playBig()
+    })
+  }
+  
+  
+  // 生成航线轨迹
+  const generateCourse = async () => {
+    if (!ssLinePath.value) return
+    const { fileInfoObj } = await analyzeKmzFile(`${ssLinePath.value}?_t=${new Date().getTime()}`)
+    const xmlStr = await fileInfoObj['wpmz/template.kml']
+    const xmlJson = XMLToJSON(xmlStr)?.['Document']
+    const placemark = xmlJson.Folder.Placemark
+    if (placemark?.Polygon) {
+      // return 'planar'
+      planarWayline(ssLinePath.value, sbInfo.longitude, sbInfo.latitude)
+    } else {
+      // return 'point'
+      pointWayline(ssLinePath.value, sbInfo.longitude, sbInfo.latitude)
+    }
+  }
+  
+  // 定义方法直接监听机场消息
+  const getviewDrone = (newValue:any) => {
+    if (newValue.data.host) {
+      viewDroneInfo.longitude = newValue.data.host?.longitude
+      viewDroneInfo.latitude = newValue.data.host?.latitude
+      viewDroneInfo.elevation = Number(newValue.data.host?.elevation.toFixed(2)) + droneHeight.value
+    }
+  }
+  
+  
+  // 地图全屏切换
+  const changeModelMap = () => {
+    isBigMap.value = !isBigMap.value
+    const cesiumContainer = document.getElementById('cesiumContainerBigMap');
+    const lZp = document.getElementById('lZp');
+    // const lZoom = document.getElementById('lZoom');
+    if (isLandscape.value) { // 横屏
+      if (isBigMap.value) { // 全屏
+        cesiumContainer.style.position = 'fixed';
+        cesiumContainer.style.top = '46px';
+        cesiumContainer.style.left = '0';
+        cesiumContainer.style.width = `${boxWidth.value}px`
+        // cesiumContainer.style.height = `${screenHeightMap.value}px`
+        lZp.style.right = '40%';
+        // lZoom.style.left = '0';
+      } else { // 缩放
+        cesiumContainer.style.width = `${boxWidth.value/2}px`
+        // cesiumContainer.style.height = `${screenHeightMap.value}px`
+        cesiumContainer.style.position = 'static';
+        lZp.style.right = '16%';
+        // lZoom.style.left = '50%';
+        
+      }
+    } else {
+      if (isBigMap.value) { // 竖-全屏
+        cesiumContainer.style.position = 'fixed';
+        cesiumContainer.style.top = '46px';
+        cesiumContainer.style.left = '0';
+        // cesiumContainer.style.width = `${boxHeight.value}px`
+        cesiumContainer.style.height = `${boxHeight.value}px`
+        lZp.style.right = '30%';
+        // lZoom.style.right = '0';
+      } else { // 缩放
+        cesiumContainer.style.width = `${boxHeight.value}px`
+        cesiumContainer.style.height = `${boxHeight.value/2}px`
+        cesiumContainer.style.position = 'static';
+        lZp.style.right = '30%';
+        // lZoom.style.right = '0';
+        
+      }
+    }
+  }
+  
+  const checkOrientation = async () => {
+      boxWidth.value = window.innerWidth;
+      boxHeight.value = window.innerHeight - 46;
+      const landscapeBox = document.getElementById('landscapeBox');
+      let cesiumContainer = document.getElementById('cesiumContainerBigMap');
+      const lZp = document.getElementById('lZp');
+      const lZoom = document.getElementById('lZoom');
+    
+      if (window.innerWidth > window.innerHeight) {//横屏
+        screenWidthVideo.value = boxWidth.value/2
+        screenHeightVideo.value = boxHeight.value
+        isLandscape.value = true;
+        // updateScreenSize()
+        landscapeBox.style.display = 'flex';
+        lZp.style.right = '16%';
+        lZoom.style.position = 'fixed';
+        cesiumContainer.style.width = `${boxWidth.value/2}px`
+        cesiumContainer.style.height = `${boxHeight.value}px`
+        cesiumContainer.style.position = 'static'
+        cesiumContainer.style.right = '0'
+        cesiumContainer.style.marginLeft = '0%'
+      } else { //竖屏
+        isLandscape.value = false;
+        screenWidthVideo.value = boxWidth.value
+        screenHeightVideo.value = boxHeight.value/2
+        // updateScreenSize()
+        landscapeBox.style.display = 'inherit';
+        landscapeBox.style.overflow = 'hidden';
+        lZp.style.right = '32%';
+        cesiumContainer.style.width = `${boxHeight.value}px`
+        cesiumContainer.style.height = `${boxHeight.value/2}px`
+        // cesiumContainer.style.position = 'absolute'
+        cesiumContainer.style.marginLeft = '-32%'
+      }
+    };
+  
+  // 切换航线轨迹
+  const courseTrack = (data:any) => {
+    if (window.cesiumViewer== null) return 
+    const currentSn = dockSn.value
+    const longitude = data.dockInfo[currentSn]?.basic_osd?.longitude || null
+    const latitude = data.dockInfo[currentSn]?.basic_osd?.latitude || null
+    const height = data.dockInfo[currentSn]?.basic_osd?.height || null
+    let getLongOk = ref(0)
+    if (!getEntityById('drone_dock')) {
+      getLnglatAltitude(longitude, latitude,  window.cesiumViewer).then(res => {
+        removeById('drone_dock')
+         window.cesiumViewer.entities.add({
+          position: globalCesium.Cartesian3.fromDegrees(
+            longitude,
+            latitude,
+            res.height,
+          ),
+          id: 'drone_dock',
+          billboard: {
+            image: imageMapSrc,
+            outlineWidth: 0,
+            width: 36,
+            height: 36,
+            scale: 1.0,
+          }
+        })
+        window.cesiumViewer.scene.camera.setView({
+          destination: globalCesium.Cartesian3.fromDegrees(
+            Number(longitude),
+            Number(latitude),
+            10000.0,
+          ),
+        })
+        droneHeight.value = res.height
+      })
+    } else {
+      // 当机场坐标存在时,判断获取的位置与机场坐标位置是否一致,若不是,重新更新位置
+      let dornePoint = cartesian3Convert(getEntityById('drone_dock')._position._value, window.cesiumViewer,)
+      getLongOk = getLnglatDist(
+        dornePoint.longitude,
+        dornePoint.latitude,
+        longitude,
+        latitude,
+      )
+      if (getLongOk.value > 100) {
+        removeById('drone_dock')
+      }
+    }
+    if (getLongOk.value > 100) return
+    initDock(data, sn.value, dockSn.value, workspaceId.value, ssLinePath.value, viewDroneInfo)
+  }
+  
+  // 监听
+  watch(() => store.state.deviceState, (newValue, oldValue) => {
+    if (newValue) {
+      nextTick()
+      courseTrack(newValue)
+    }
+  }, {deep: true})
+  
+  // watch(() => store.state.wsMessage, (newValue, oldValue) => {
+  //   // 控制台报 Expected longitude to be typeof number, actual typeof was undefined 是因为这里没有及时拿到longitude数据
+  //   if (newValue) {
+  //     viewDroneInfo.longitude = newValue?.longitude
+  //     viewDroneInfo.latitude = newValue?.latitude
+  //     viewDroneInfo.elevation = Number(newValue?.elevation.toFixed(2)) + droneHeight.value
+  //   }
+  // }, {deep: true})
+  
+  
+  let intervalId = null;
+  
+  const onClickLogin = () => {
+    history.back();
+  }
+  
+  // 为组件赋值
+  const getGlobalViewer = () => {
+    globalViewer = window.cesiumViewer;
+  }
+  
+  onMounted(async () => {
+    window.addEventListener('orientationchange', checkOrientation);
+    window.addEventListener('resize', checkOrientation); // 兼容某些设备
+    checkOrientation(); // 初始化时检查一次
+    // loadVideo();
+    await nextTick();
+    await _init('cesiumContainerBigMap');
+    await getGlobalViewer()
+    // await getWrjSsLx();
+    // 判断是遥控器还是机场
+    let domain = sessionStorage.getItem('domain')
+    if (domain !== '0') {
+      await getPhoneLocation(workspaceId.value)
+    // // // 设置定时器,每隔 5 秒刷新一次数据
+      // intervalId = setInterval(()=> {
+      //   getPhoneLocation(workspaceId.value)
+      // }, 5000);
+    }
+  });
+  
+  onBeforeUnmount(() => {
+    window.removeEventListener('orientationchange', checkOrientation);
+    window.removeEventListener('resize', checkOrientation);
+  
+    // removeAllPoint()
+    // removeAllDataSource()
+    // 销毁地图实例
+    if (window.cesiumViewer && !window.cesiumViewer.isDestroyed()) {
+      window.cesiumViewer.destroy();
+    }
+    if (globalViewer && !globalViewer.isDestroyed()) {
+      globalViewer.destroy();
+    }
+    if (player) {
+      player.dispose();
+    }
+    // 组件卸载时清除定时器
+    if (intervalId) {
+      clearInterval(intervalId);
+    }
+  });
+  
+  
+  
+  </script>
+  
+  <style lang="scss" scoped>
+  .drone-pilot-details {
+    .landscape-box {
+      overflow: hidden;
+      // position: relative;
+      // display: flex;
+      .l-map {
+        .l-zp {
+          position: fixed;
+          right: 16%;
+          bottom: 0;
+        }
+        .l-zoom {
+          position: fixed;
+          bottom: 0;
+          right: 0;
+          .zoom {
+            width: 2rem;
+            height: 2rem;
+            margin: 0.2rem 0.4rem;
+            border-radius: 3px;
+            background-color: rgba(0, 0, 0, 0.8);
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            overflow: hidden;
+            cursor: pointer;
+            pointer-events: all;
+            img {
+              width: 1.6rem;
+              height: 1.6rem;
+            }
+          }
+        }
+      }
+    }
+    .l-video {
+      position: relative;
+      .el-empty {
+        width: 100%;
+        height: 100%;
+        padding: 0;
+        ::v-deep(.el-empty__image) {
+          width: 50%;
+          height: 50%;
+        }
+        ::v-deep(.el-empty__description) {
+          margin: 0;
+        }
+      }
+      .center-point {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        width: 0.4rem;
+        height: 0.4rem;
+        opacity: 0.5;
+        border-radius: 50%;
+        background-color: yellow;
+        transform: translate(-50%, -50%);
+        justify-content: center;
+      }
+      .right-box {}
+    }
+    #cesiumContainerBigMap {
+      width: 100%;
+      height: 100%;
+      margin: 0;
+      padding: 0;
+      overflow: hidden;
+      transform-origin: top left;
+      transition: none; // 防止切换时的动画效果
+      backface-visibility: hidden; // 提高性能
+      -webkit-backface-visibility: hidden; // 提高性能  
+  
+      :deep() {
+        .cesium-viewer {
+          width: 100%;
+          height: 100%;
+  
+          .cesium-viewer-cesiumWidgetContainer {
+            width: 100%;
+            height: 100%;
+  
+            .cesium-widget {
+              width: 100%;
+              height: 100%;
+  
+              canvas {
+                width: 100%;
+                height: 100%;
+              }
+            }
+          }
+        }
+      }
+    }
+    
+  }
+  </style>
\ No newline at end of file
diff --git a/src/views/components/controlConsole-copy.vue b/src/views/components/controlConsole-copy.vue
new file mode 100644
index 0000000..9a8946d
--- /dev/null
+++ b/src/views/components/controlConsole-copy.vue
@@ -0,0 +1,1138 @@
+<template>
+    <div class="control-console">
+      <div class="control" :class="isShowKzBtn?'actived-blue':''" @click="authenticationPwd">
+        <img src="@/assets/images/open-close.png" />
+      </div>
+      <div class="control-left" v-show="isShowKzBtn">
+        <div class="top"  @touchstart="handlePublish({ x: SPEED })"><div class="xq">向前</div></div>
+        <div class="left" @touchstart="handlePublish({ y: -SPEED })"><div class="xz">向左</div></div>
+        <div class="bottom" @touchstart="handlePublish({ x: -SPEED })"><div class="xx">向下</div></div>
+        <div class="right" @touchstart="handlePublish({ y: SPEED })"><div class="xy">向右</div></div>
+      </div>
+      <div class="control-right" v-show="isShowKzBtn">
+        <div class="top"  @touchstart="handlePublish({ h: HEIGHT })"><div class="xq">上升</div></div>
+        <div class="left" @touchstart="handlePublish({ w: -W_SPEED })"><div class="xz">左转</div></div>
+        <div class="bottom" @touchstart="handlePublish({ h: -HEIGHT })"><div class="xx">下降</div></div>
+        <div class="right" @touchstart="handlePublish({ w: W_SPEED })" ><div class="xy">右转</div></div>
+      </div>
+      <van-dialog v-model:show="dialogVisible" title="确认是否接管?" show-cancel-button @confirm="sureJg"></van-dialog>
+    </div>
+  </template>
+  
+  <script lang="ts" setup>
+  import { showNotify } from 'vant';
+  import { ref, onMounted, onBeforeUnmount, nextTick, reactive, computed, watch } from 'vue';
+  import { useMyStore } from '@/store'
+  import {exitController,droneController,returnHomeCancel,returnHome} from '@/api/drone/drc'
+  import { useConnectMqtt } from '@/utils/mqtt/connect-mqtt';
+  import { useMqtt, DeviceTopicInfo } from '@/utils/mqtt/index'
+  import { DRC_METHOD } from '@/types/drc'
+  
+  
+  const props = defineProps({
+    sn: {
+      type: String,
+      required: true,
+    },
+    osdVisible: {
+      type: Object,
+      required: true,
+    }
+  });
+  
+  const store = useMyStore()
+  // 显示控制和退出控制状态按钮
+  let isShowKzBtn = ref(false);
+  // 是否接管提示
+  let dialogVisible = ref(false);
+  // 面板提示
+  let hasPermission = ref(false);
+  // 是否返航状态
+  let nowInReturnStatus = ref(false);
+  // 返航状态点击
+  let nowInReturnStatusClick = ref(false)
+  // 控制状态
+  let flightMode = ref('自动控制')
+  
+  // 控制无人机速度
+  let droneSeepd = ref(5);
+  const SPEED = ref(droneSeepd.value || 5) //  check
+  const HEIGHT = ref(5) //  check
+  const W_SPEED = ref(20) // 机头角速度
+  
+  // A S D....按键
+  let deviceTopicInfo: DeviceTopicInfo = reactive({
+    sn: props.sn || '',
+    pubTopic: '',
+    subTopic: ''
+  })
+  
+  // 连接或断开drc
+  useConnectMqtt()
+  
+  // const clientId = computed(() => {
+  //   return localStorage.getItem('clientId') //store.state.clientId
+  // });
+  let clientId = ref(localStorage.getItem('client_id'))
+  
+  // {"0":"待机","1":"起飞准备","2":"起飞准备完毕","3":"手动飞行","4":"自动起飞","5":"航线飞行","6":"全景拍照","7":"智能跟随","8":"ADS-B 躲避","9":"自动返航","10":"自动降落","11":"强制降落","12":"三桨叶降落","13":"升级中","14":"未连接","15":"APAS","16":"虚拟摇杆状态","17":"指令飞行","18":"空中 RTK 收敛模式","19":"机场选址中"}
+  watch(() => store.state.wsMessage, (newValue, oldValue) => {
+    // console.log('监控值', newValue.mode_code)
+    hasPermission.value = false
+    if (newValue.mode_code == '5') {
+      hasPermission.value = true
+    }
+    if (newValue.mode_code && (newValue.mode_code == 9 || newValue.mode_code == 10) && !nowInReturnStatusClick.value) {
+      nowInReturnStatus.value = true
+      flightMode.value = '自动控制'
+    } else if (newValue.mode_code && (newValue.mode_code == 9 || newValue.mode_code == 10) && nowInReturnStatusClick.value) {
+      // 没电、强制返航
+      nowInReturnStatus.value = true
+      nowInReturnStatusClick.value = false
+    }
+  }, {deep:true})
+  
+  // 进行控制
+  const enterFlightControl = () => {
+    droneController({ client_id: clientId.value, dock_sn: props.osdVisible.dockSn}).then((result:any) => {
+      if (result.code != 0) { return }
+      if (result.data.sub && result.data.sub?.length > 0) {
+        deviceTopicInfo.subTopic = result.data.sub[0]
+      }
+      if (result.data.pub && result.data.pub?.length > 0) {
+        deviceTopicInfo.pubTopic = result.data.pub[0]
+      }
+      // 接管成功之后再显示
+      isShowKzBtn.value = true
+      flightMode.value = '人工控制'
+      // 控制成功之后:也可以操作了
+      hasPermission.value = true
+      nowInReturnStatus.value = true
+    })
+  }
+  
+  // 退出控制
+  const exitFlightCOntrol = () => {
+    exitController({ client_id: clientId.value, dock_sn: props.osdVisible.dockSn}).then((result:any) => {
+      deviceTopicInfo.subTopic = ''
+      deviceTopicInfo.pubTopic = ''
+      flightMode.value = '自动控制'
+    })
+  }
+  
+  const sureJg = () => {
+    dialogVisible.value = false
+    enterFlightControl()
+  }
+  
+  // 是否进行人工控制
+  const authenticationPwd = (value:any, str:String) => {
+    // 提示是否进行人工控制
+    if (!isShowKzBtn.value) {
+      if (!hasPermission.value) { return showNotify({ type: 'warning', message: '暂无无人机控制权限' })}
+      dialogVisible.value = true
+    } else {
+      isShowKzBtn.value = false
+      exitFlightCOntrol()
+    }
+  }
+  
+  // 返航
+  const onBackDock = () => {
+    returnHome(props.sn).then((res) => {
+      if (res.code === 0) {
+        nowInReturnStatus.value = true
+        flightMode.value = '自动控制'
+        nowInReturnStatusClick.value = false
+      }
+    })
+  }
+  
+  // 取消返航
+  const notonBackDock = () => {
+    returnHomeCancel({ client_id: clientId.value, dock_sn: props.osdVisible.dockSn}).then((result:any) => {
+    if (result.code !== 0) return
+      nowInReturnStatus.value = false
+      // 取消返航时,退出飞行控制,进入人工控制
+      nowInReturnStatusClick.value = true       
+      flightMode.value = '人工控制'
+    })
+  }
+  
+  // 无人机速度控制
+  const onControlsDroneSpeed = (value:Boolean) => {
+    if (value) {
+      if (droneSeepd.value >= 15) {
+        return showNotify({ type: 'warning', message: '无人机速度范围应处于0~15m/s之间' })
+      }
+      droneSeepd.value += 1
+    } else {
+      if (droneSeepd.value <= 0) {
+        return showNotify({ type: 'warning', message: '无人机速度范围应处于0~15m/s之间' })
+      }
+      droneSeepd.value -= 1
+    }
+  }
+  
+  const mqttHooks =  useMqtt(deviceTopicInfo)
+  // 字母按键
+  const handlePublish = (params:Object) => {
+    if (!hasPermission.value) { return showNotify({ type: 'warning', message: '暂无无人机控制权限' });}
+    const body = { method: DRC_METHOD.DRONE_CONTROL, data: params}
+    mqttHooks?.publishMqtt(deviceTopicInfo.pubTopic, body, {qos: 0})
+  }
+  
+  onMounted(async () => {
+    await nextTick()
+  })
+  
+  </script>
+  
+  <style lang="scss" scoped>
+  .control-console {
+    
+    .control {
+      position: absolute;
+      bottom: 12.8rem;
+      right: 0.2rem;
+      width: 2rem;
+      height: 2rem;
+      border-radius: 3px;
+      background-color: rgba(0, 0, 0, 0.5);
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      overflow: hidden;
+      cursor: pointer;
+      pointer-events: all;
+      img {
+        width: 1.6rem;
+        height: 1.6rem;
+      }
+    }
+    .actived-blue {
+      background-image: none;
+      background-color: rgba(23, 124, 198, 0.7);
+    }
+    .control-left {
+      left: 10%;
+    }
+    .control-right {
+      right: 10%;
+    }
+    .control-left, .control-right{
+      width: 100px;
+      height: 100px;
+      border-radius: 50%;
+      overflow: hidden;
+      // background-color: rgba(255, 255, 255, 0.5); /* 白色,50%透明度 */
+      // box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3); /* 阴影效果 */
+      background-color: rgba(0, 0, 0, 0.5);
+      padding: 20px; /* 内边距 */
+      position: absolute;
+      top: 30%;
+      .top,
+      .left,
+      .bottom,
+      .right {
+        width: 10px;
+        height: 10px;
+        position: absolute;
+        cursor: pointer;
+        z-index: 2;
+      }
+  
+      .top {
+        top: -2px;
+        left: 50%;
+        transform: translateX(-50%);
+        border-top: 10px solid transparent;
+        border-right: 10px solid transparent;
+        border-left: 10px solid transparent;
+        border-bottom: 10px solid #fff;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-top: 50px solid #fff;
+          }
+        }
+        .xq {
+          position: absolute;
+          top: 10px;
+          font-size: 10px;
+          width: 30px;
+          left: -9px;
+          color: #fff;
+        }
+      }
+  
+      .left {
+        top: 50%;
+        left: -2px;
+        transform: translateY(-50%);
+        border-top: 10px solid transparent;
+        border-right: 10px solid #fff;
+        border-left: 10px solid transparent;
+        border-bottom: 10px solid transparent;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-left: 50px solid #fff;
+          }
+        }
+        .xz {
+          position: absolute;
+          top: -7px;
+          font-size: 10px;
+          width: 30px;
+          left: 11px;
+          color: #fff;
+        }
+      }
+  
+      .bottom {
+        bottom: -2px;
+        left: 50%;
+        transform: translateX(-50%);
+        border-top: 10px solid #fff;
+        border-right: 10px solid transparent;
+        border-left: 10px solid transparent;
+        border-bottom: 10px solid transparent;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-bottom: 50px solid #fff;
+          }
+        }
+        .xx {
+          position: absolute;
+          bottom: 8px;
+          font-size: 10px;
+          width: 30px;
+          left: -9px;
+          color: #fff;
+        }
+      }
+  
+      .right {
+        top: 50%;
+        right: -2px;
+        transform: translateY(-50%);
+        border-top: 10px solid transparent;
+        border-right: 10px solid transparent;
+        border-left: 10px solid #fff;
+        border-bottom: 10px solid transparent;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-right: 50px solid #fff;
+          }
+        }
+        .xy {
+          position: absolute;
+          top: -8px;
+          font-size: 10px;
+          width: 30px;
+          right : 2px;
+          color: #fff;
+        }
+      }
+    }
+      // width: 100%;
+      // height: 200px;
+      // margin-top: 20px;
+      // margin: 0 auto;
+      // display: flex;
+      // align-items: center;
+      // justify-content: space-between;
+      // overflow-x: auto;
+      // overflow-y: hidden;
+      // background-repeat: no-repeat;
+      // background-size: 100% 100%;
+      // color: #fff;
+      // font-weight: bold;
+    // .DroneOperation {
+    //   display: flex;
+    //   align-items: center;
+    //   height: 245px;
+    //   position: relative;
+    // }
+  
+    // .center {
+    //   display: flex;
+    //   align-items: center;
+  
+    //   &_left,
+    //   &_center,
+    //   .speed {
+    //     margin-right: 10px;
+    //   }
+  
+    //   .center_left {
+    //     .tubiaoshow {
+    //       height: 50px;
+    //       display: flex;
+    //       justify-content: center;
+    //       align-items: center;
+  
+    //       img {
+    //         width: 40px;
+    //         height: 50px;
+    //         cursor: pointer;
+    //       }
+    //     }
+  
+    //     .Airplanemode {
+    //       font-style: normal;
+    //       margin: 5px 0px;
+    //       text-align: center;
+    //     }
+  
+    //     .operatingjixufanhang {
+    //       display: flex;
+    //       justify-content: center;
+  
+    //       .el-button {
+    //         font-size: 16px;
+    //         background-color: rgba(0, 0, 0, 0.5);
+    //         color: white;
+    //         border-width: 0;
+    //         margin: 5px;
+    //       }
+    //     }
+    //   }
+  
+    //   .center_center {
+    //     width: 120px;
+  
+    //     padding: 0px 0px;
+  
+    //     .center {
+    //       height: 45px;
+  
+    //       p {
+    //         line-height: 50px;
+    //         color: #00ee8b;
+    //         font-size: 20px;
+    //         margin: 0 auto;
+    //       }
+    //     }
+  
+    //     .top,
+    //     .bottom {
+    //       background: rgba(0, 0, 0, 0.5);
+    //       border-radius: 5px;
+    //       display: flex;
+    //       height: 80px;
+    //       width: 100%;
+  
+    //       .Q,
+    //       .W,
+    //       .E {
+    //         flex: 1;
+    //         display: flex;
+    //         flex-direction: column;
+    //         align-items: center;
+    //         justify-content: center;
+    //         gap: 10px;
+  
+    //         img {
+    //           width: 20px;
+    //           height: 20px;
+    //           // margin-top: 5px;
+    //           // margin-top: 5px;
+    //         }
+  
+    //         .el-button {
+    //           padding: 4px;
+    //           font-size: 20px;
+    //           height: 30px;
+    //           background: #3c3c3c;
+    //           color: white;
+    //           -webkit-touch-callout: none;
+    //           -webkit-user-select: none;
+    //           -khtml-user-select: none;
+    //           -moz-user-select: none;
+    //           -ms-user-select: none;
+    //           user-select: none;
+    //         }
+    //       }
+  
+    //       .A,
+    //       .S,
+    //       .D {
+    //         flex: 1;
+    //         display: flex;
+    //         flex-direction: column;
+    //         align-items: center;
+    //         justify-content: center;
+  
+    //         img {
+    //           width: 20px;
+    //           height: 20px;
+    //         }
+  
+    //         .el-button {
+    //           padding: 4px;
+    //           font-size: 20px;
+    //           margin-bottom: 10px;
+    //           height: 30px;
+    //           background: #3c3c3c;
+    //           color: white;
+    //           -webkit-touch-callout: none;
+    //           -webkit-user-select: none;
+    //           -khtml-user-select: none;
+    //           -moz-user-select: none;
+    //           -ms-user-select: none;
+    //           user-select: none;
+    //         }
+    //       }
+    //     }
+  
+    //     .top {
+    //       // padding: 5px 2px 5px;
+    //       margin-bottom: 10px;
+    //     }
+  
+    //     .bottom {
+    //       padding: 5px 0px 0px 0px;
+    //     }
+    //   }
+  
+    //   .speed {
+    //     width: 43px;
+    //     height: 170px;
+    //     border-radius: 5px;
+    //     background-color: rgba(0, 0, 0, 0.5);
+  
+    //     &-content {
+    //       height: 100%;
+    //       display: flex;
+    //       flex-direction: column;
+  
+    //       .add-speed--button,
+    //       .sub-speed--button {
+    //         flex: 1;
+    //         display: flex;
+    //         justify-content: center;
+    //         align-items: center;
+    //         cursor: pointer;
+  
+    //         i {
+    //           font-size: 20px;
+    //           font-weight: bolder;
+    //         }
+    //       }
+  
+    //       .speed-text {
+    //         flex: 2;
+    //         display: flex;
+    //         flex-direction: column;
+    //         justify-content: center;
+    //         align-items: center;
+  
+    //         div:first-child {
+    //           font-size: 20px;
+    //           color: #00ee8b;
+    //           font-weight: bolder;
+    //         }
+    //       }
+    //     }
+    //   }
+    // }
+  
+    // .right {
+    //   .rightbutton {
+    //     // padding: 0px 0px;
+    //     // // width: 150px;
+    //     // margin-right: 0px;
+  
+    //     .center {
+    //       height: 45px;
+    //       margin: 5px 0px;
+    //       display: flex;
+    //       flex-direction: column;
+  
+    //       .top_in {
+    //         display: flex;
+    //         width: 100%;
+  
+    //         .top_in_left {
+    //           min-width: 70px;
+    //           text-align: right;
+    //           font-size: 22px;
+    //           color: #00ee8b;
+    //           margin-right: 5px;
+    //           margin-left: auto;
+    //         }
+  
+    //         .top_in_right {
+    //           p {
+    //             font-size: 14px;
+    //             line-height: 14px;
+    //             text-align: right;
+    //           }
+    //         }
+    //       }
+  
+    //       .top_in_ASL {
+    //         font-size: 12px;
+    //         line-height: 12px;
+    //         text-align: right;
+    //       }
+    //     }
+  
+    //     .top {
+    //       margin-left: auto;
+    //       width: 43px;
+    //       background: rgba(0, 0, 0, 0.5);
+    //       display: flex;
+    //       flex-direction: column;
+    //       border-radius: 5px;
+    //       height: 80px;
+    //       margin-bottom: 10px;
+  
+    //       img {
+    //         width: 25px;
+    //         height: 25px;
+    //         margin: 5px auto 0px;
+    //       }
+  
+    //       .el-button {
+    //         padding: 4px;
+    //         font-size: 16px;
+    //         background: #3c3c3c;
+    //         color: white;
+    //         width: 25px;
+    //         height: 30px;
+    //         margin: 10px auto 12px;
+    //         -webkit-touch-callout: none;
+    //         -webkit-user-select: none;
+    //         -khtml-user-select: none;
+    //         -moz-user-select: none;
+    //         -ms-user-select: none;
+    //         user-select: none;
+    //       }
+    //     }
+  
+    //     .bottom {
+    //       margin-left: auto;
+    //       width: 40px;
+    //       background: rgba(0, 0, 0, 0.5);
+    //       display: flex;
+    //       flex-direction: column;
+    //       border-radius: 5px;
+    //       height: 80px;
+  
+    //       img {
+    //         width: 25px;
+    //         height: 25px;
+    //         margin: 0px auto 5px;
+    //       }
+  
+    //       .el-button {
+    //         padding: 4px;
+    //         font-size: 20px;
+    //         background: #3c3c3c;
+    //         color: white;
+    //         width: 25px;
+    //         margin: 10px auto 10px;
+    //       }
+    //     }
+    //   }
+    // }
+  
+    // .instrument-panel {
+    //   position: relative;
+  
+    //   .title {
+    //     position: absolute;
+    //     font-size: 12px;
+    //     font-weight: 400;
+    //     top: -5px;
+    //     left: 10px;
+    //     color: #ffffff;
+    //     z-index: 1;
+    //   }
+    // }
+  
+    // .camera-load {
+  
+    //   // background: rgba(6, 25, 39, 0.5);
+    //   // height: 245px;
+    //   // padding: 10px;
+    //   // position: relative;
+    //   // border: 1px solid red;
+    //   .title {
+    //     position: absolute;
+    //     font-size: 12px;
+    //     font-weight: 400;
+    //     top: -5px;
+    //     left: 10px;
+    //     color: #ffffff;
+    //     z-index: 1;
+    //   }
+  
+    //   .camera-control {
+    //     width: 100%;
+    //     margin-bottom: 10px;
+    //     display: flex;
+    //     justify-content: center;
+  
+    //     .promptInformation {
+    //       position: absolute;
+    //       width: 30px;
+    //       height: 30px;
+    //       right: 10px;
+    //       top: 10px;
+    //     }
+  
+    //     .circle-box {
+    //       width: 90px;
+    //       height: 90px;
+    //       border-radius: 50%;
+    //       background-color: rgba(0, 0, 0, 0.5);
+    //       -webkit-mask-image: radial-gradient(circle,
+    //           transparent 35%,
+    //           white 35%);
+    //       mask-image: radial-gradient(circle, transparent 35%, white 35%);
+    //       position: relative;
+  
+    //       .top,
+    //       .left,
+    //       .bottom,
+    //       .right {
+    //         width: 10px;
+    //         height: 10px;
+    //         position: absolute;
+    //         cursor: pointer;
+    //         z-index: 2;
+    //       }
+  
+    //       .top {
+    //         top: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid #fff;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-top: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .left {
+    //         top: 50%;
+    //         left: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid #fff;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-left: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .bottom {
+    //         bottom: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid #fff;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-bottom: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .right {
+    //         top: 50%;
+    //         right: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid #fff;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-right: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .blue-bgc {
+    //         width: 90px;
+    //         height: 90px;
+    //         position: absolute;
+    //         top: 0;
+    //         left: 0;
+    //         z-index: 1;
+    //         border-top: 45px solid transparent;
+    //         border-right: 45px solid transparent;
+    //         border-left: 45px solid transparent;
+    //         border-bottom: 45px solid transparent;
+    //       }
+    //     }
+    //   }
+  
+    //   .camera-select {
+    //     display: flex;
+    //     display: flex;
+    //     justify-content: center;
+  
+    //     :deep() {
+    //       .el-select {
+    //         width: 250px;
+    //         height: 40px;
+    //         line-height: 40px;
+    //         background-color: rgba(0, 0, 0, 0.5);
+    //         border-radius: 5px;
+  
+    //         .el-input {
+    //           width: auto;
+    //           height: auto;
+  
+    //           .el-input__inner {
+    //             background-color: transparent;
+    //             box-shadow: none;
+    //             border: 0;
+    //             color: #fff;
+    //           }
+  
+    //           .el-input__suffix {
+    //             display: flex;
+    //             align-items: center;
+    //           }
+    //         }
+    //       }
+    //     }
+  
+    //     .load-button {
+    //       font-style: normal;
+    //       background: rgba(21, 138, 255, 0.5);
+    //       margin-left: 10px;
+    //       padding: 0 5px;
+  
+    //       &:hover {
+    //         color: #409eff;
+    //       }
+    //     }
+    //   }
+  
+    //   .btn-group {
+    //     display: flex;
+    //     flex-wrap: wrap;
+    //     margin-top: 10px;
+    //     width: 300px;
+    //     padding: 0px 20px;
+  
+    //     .btn-item {
+    //       display: flex;
+    //       // width: 140px;
+    //       box-sizing: border-box;
+    //       margin: 2px 10px;
+    //       cursor: pointer;
+  
+    //       img {
+    //         width: 30px;
+    //         height: 30px;
+    //         margin-right: 3px;
+    //       }
+  
+    //       div {
+    //         font-size: 18px;
+    //         font-style: normal;
+    //       }
+    //     }
+    //   }
+    // }
+  
+    // .payload-control {
+    //   height: 100%;
+    //   display: flex;
+    //   justify-content: center;
+    //   flex-direction: column;
+    //   gap: 15px;
+  
+    //   .left-box {
+    //     display: flex;
+    //     // flex-direction: column;
+    //     align-items: center;
+    //     justify-content: center;
+    //     gap: 10px;
+  
+    //     .circle-box {
+    //       width: 100px;
+    //       height: 100px;
+    //       border-radius: 50%;
+    //       overflow: hidden;
+    //       background-color: rgba(0, 0, 0, 0.5);
+    //       // -webkit-mask-image: radial-gradient(
+    //       //   circle,
+    //       //   transparent 35%,
+    //       //   white 35%
+    //       // );
+    //       // mask-image: radial-gradient(circle, transparent 35%, white 35%);
+    //       position: relative;
+    //       // border: 1px solid red;
+  
+    //       .top,
+    //       .left,
+    //       .bottom,
+    //       .right {
+    //         width: 10px;
+    //         height: 10px;
+    //         position: absolute;
+    //         cursor: pointer;
+    //         z-index: 2;
+    //       }
+  
+    //       .top {
+    //         top: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid #fff;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-top: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .left {
+    //         top: 50%;
+    //         left: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid #fff;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-left: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .bottom {
+    //         bottom: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid #fff;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-bottom: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .right {
+    //         top: 50%;
+    //         right: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid #fff;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-right: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .reset-center {
+    //         position: absolute;
+    //         width: 40%;
+    //         height: 40%;
+    //         left: 50%;
+    //         top: 50%;
+    //         transform: translate(-50%, -50%);
+    //         border-radius: 50%;
+    //         background-color: rgb(63, 66, 68);
+    //         z-index: 2;
+    //         cursor: pointer;
+    //         display: flex;
+    //         justify-content: center;
+    //         align-items: center;
+  
+    //         i {
+    //           color: #fff;
+    //           font-size: 20px;
+    //           font-weight: bolder;
+    //         }
+  
+    //         &:hover {
+    //           background-color: #409eff;
+    //         }
+    //       }
+  
+    //       .blue-bgc {
+    //         width: 100px;
+    //         height: 100px;
+    //         position: absolute;
+    //         top: 0;
+    //         left: 0;
+    //         z-index: 1;
+    //         border-top: 50px solid transparent;
+    //         border-right: 50px solid transparent;
+    //         border-left: 50px solid transparent;
+    //         border-bottom: 50px solid transparent;
+    //       }
+    //     }
+  
+    //     .payload-info {
+    //       font-size: 14px;
+    //     }
+  
+    //     .btn-group {
+    //       width: auto;
+    //       display: flex;
+    //       flex-wrap: wrap;
+    //       width: 200px;
+  
+    //       // flex-direction: column;
+    //       // justify-content: center;
+    //       .btn-item {
+    //         width: 100px;
+    //         display: flex;
+    //         box-sizing: border-box;
+    //         cursor: pointer;
+  
+    //         img {
+    //           width: 30px;
+    //           height: 30px;
+    //           margin-right: 3px;
+    //         }
+  
+    //         div {
+    //           height: 100%;
+    //           font-size: 17px;
+    //           line-height: 30px;
+    //           font-style: normal;
+    //         }
+    //       }
+    //     }
+    //   }
+  
+    //   .right-box {
+    //     position: relative;
+    //     flex-shrink: 0;
+    //     display: flex;
+  
+    //     // justify-content: center;
+    //     .btn-group {
+    //       width: auto;
+    //       display: flex;
+    //       flex-wrap: wrap;
+    //       width: 290px;
+    //       justify-content: center;
+  
+    //       .btn-item {
+    //         width: 140px;
+    //         display: flex;
+    //         box-sizing: border-box;
+    //         cursor: pointer;
+  
+    //         img {
+    //           width: 30px;
+    //           height: 30px;
+    //           margin-right: 3px;
+    //         }
+  
+    //         div {
+    //           width: 100px;
+    //           height: 100%;
+    //           font-size: 17px;
+    //           line-height: 30px;
+    //           font-style: normal;
+    //         }
+    //       }
+    //     }
+  
+    //     .payload-info {
+    //       font-size: 14px;
+  
+    //       .info-item {
+    //         display: flex;
+    //         align-items: center;
+    //         gap: 10px;
+    //         height: 25px;
+  
+    //         div:first-child {
+    //           width: 170px;
+    //         }
+  
+    //         div:nth-child(2) {
+    //           :deep() {
+    //             .el-input-number {
+    //               width: 70px;
+    //               height: 20px;
+  
+    //               &__decrease,
+    //               &__increase {
+    //                 width: 18px;
+    //                 height: 18px;
+    //                 line-height: 18px;
+    //                 background-color: transparent;
+    //                 border-right: 0;
+    //                 border-left: 0;
+  
+    //                 i {
+    //                   color: #fff;
+    //                   font-size: 17px;
+    //                   font-weight: bold;
+    //                 }
+    //               }
+  
+    //               .el-input {
+    //                 margin: 0;
+    //                 padding: 0;
+    //                 height: 18px;
+    //                 display: flex;
+    //                 justify-content: center;
+  
+    //                 &__inner {
+    //                   padding: 0;
+    //                 }
+  
+    //                 input {
+    //                   width: 80px;
+    //                   height: 18px;
+    //                   overflow: hidden;
+    //                   font-size: 14px;
+    //                   font-weight: bold;
+    //                 }
+    //               }
+    //             }
+    //           }
+    //         }
+    //       }
+    //     }
+    //   }
+    // }
+  }
+  </style>
\ No newline at end of file
diff --git a/src/views/components/controlConsole-copy1.vue b/src/views/components/controlConsole-copy1.vue
new file mode 100644
index 0000000..e88eaba
--- /dev/null
+++ b/src/views/components/controlConsole-copy1.vue
@@ -0,0 +1,1154 @@
+<template>
+    <div class="control-console">
+      <div class="control" :class="isShowKzBtn?'actived-blue':''" @click="authenticationPwd">
+        <img src="@/assets/images/open-close.png" />
+      </div>
+      <div class="control-left">
+        <div class="top"  @touchstart="handlePublish('xq')"><div class="xq">向前</div></div>
+        <div class="left" @touchstart="handlePublish('xz')"><div class="xz">向左</div></div>
+        <div class="bottom" @touchstart="handlePublish('xx')"><div class="xx">向下</div></div>
+        <div class="right" @touchstart="handlePublish('xy')"><div class="xy">向右</div></div>
+      </div>
+      <div class="control-right">
+        <div class="top"  @touchstart="handlePublish('ss')"><div class="xq">上升</div></div>
+        <div class="left" @touchstart="handlePublish('xz')"><div class="xz">左转</div></div>
+        <div class="bottom" @touchstart="handlePublish('xj')"><div class="xx">下降</div></div>
+        <div class="right" @touchstart="handlePublish('yz')" ><div class="xy">右转</div></div>
+      </div>
+      <van-dialog v-model:show="dialogVisible" title="确认是否接管?" show-cancel-button @confirm="sureJg"></van-dialog>
+    </div>
+  </template>
+  
+  <script lang="ts" setup>
+  import { showNotify } from 'vant';
+  import { ref, onMounted, onBeforeUnmount, nextTick, reactive, computed, watch } from 'vue';
+  import { useMyStore } from '@/store'
+  import {exitController,droneController,returnHomeCancel,returnHome} from '@/api/drone/drc'
+  import { useConnectMqtt } from '@/utils/mqtt/connect-mqtt';
+  import { useMqtt, DeviceTopicInfo } from '@/utils/mqtt/index'
+  import { DRC_METHOD } from '@/types/drc'
+  
+  
+  const props = defineProps({
+    sn: {
+      type: String,
+      required: true,
+    },
+    osdVisible: {
+      type: Object,
+      required: true,
+    }
+  });
+  
+  const store = useMyStore()
+  // 显示控制和退出控制状态按钮
+  let isShowKzBtn = ref(false);
+  // 是否接管提示
+  let dialogVisible = ref(false);
+  // 面板提示
+  let hasPermission = ref(false);
+  // 是否返航状态
+  let nowInReturnStatus = ref(false);
+  // 返航状态点击
+  let nowInReturnStatusClick = ref(false)
+  // 控制状态
+  let flightMode = ref('自动控制')
+  // 判断机型是1代还是其他机型 适配替换的api
+  let genPortOne = ref(false)
+  // 判断机型是1代还是其他机型 适配替换的api
+  if (store.state.airPortInfo.deviceType == 1 && store.state.airPortInfo.subType == 0 && store.state.airPortInfo.domain == 3) {
+    genPortOne.value = true
+  }
+  
+  // 控制无人机速度
+  let droneSeepd = ref(5);
+  const SPEED = genPortOne.value ? ref(droneSeepd.value || 5) : ref(500); //  check
+  const HEIGHT = genPortOne.value ? ref(5) : ref(500); //  check
+  const W_SPEED = genPortOne.value ? ref(20) : ref(500) // 机头角速度
+  
+  // A S D....按键
+  let deviceTopicInfo: DeviceTopicInfo = reactive({
+    sn: props.sn || '',
+    pubTopic: '',
+    subTopic: ''
+  })
+  
+  // 连接或断开drc
+  useConnectMqtt()
+  
+  // const clientId = computed(() => {
+  //   return localStorage.getItem('clientId') //store.state.clientId
+  // });
+  let clientId = ref(localStorage.getItem('client_id'))
+  
+  // {"0":"待机","1":"起飞准备","2":"起飞准备完毕","3":"手动飞行","4":"自动起飞","5":"航线飞行","6":"全景拍照","7":"智能跟随","8":"ADS-B 躲避","9":"自动返航","10":"自动降落","11":"强制降落","12":"三桨叶降落","13":"升级中","14":"未连接","15":"APAS","16":"虚拟摇杆状态","17":"指令飞行","18":"空中 RTK 收敛模式","19":"机场选址中"}
+  watch(() => store.state.wsMessage, (newValue, oldValue) => {
+    // console.log('监控值', newValue.mode_code)
+    hasPermission.value = false
+    if (newValue.mode_code == '5' || newValue.mode_code == '17') {
+      hasPermission.value = true
+    }
+    if (newValue.mode_code && (newValue.mode_code == 9 || newValue.mode_code == 10) && !nowInReturnStatusClick.value) {
+      nowInReturnStatus.value = true
+      flightMode.value = '自动控制'
+    } else if (newValue.mode_code && (newValue.mode_code == 9 || newValue.mode_code == 10) && nowInReturnStatusClick.value) {
+      // 没电、强制返航
+      nowInReturnStatus.value = true
+      nowInReturnStatusClick.value = false
+    }
+  }, {deep:true})
+  
+  // 进行控制
+  const enterFlightControl = () => {
+    droneController({ client_id: clientId.value, dock_sn: props.osdVisible.dockSn}).then((result:any) => {
+      if (result.code != 0) { return }
+      if (result.data.sub && result.data.sub?.length > 0) {
+        deviceTopicInfo.subTopic = result.data.sub[0]
+      }
+      if (result.data.pub && result.data.pub?.length > 0) {
+        deviceTopicInfo.pubTopic = result.data.pub[0]
+      }
+      // 接管成功之后再显示
+      isShowKzBtn.value = true
+      flightMode.value = '人工控制'
+      // 控制成功之后:也可以操作了
+      hasPermission.value = true
+      nowInReturnStatus.value = true
+    })
+  }
+  
+  // 退出控制
+  const exitFlightCOntrol = () => {
+    exitController({ client_id: clientId.value, dock_sn: props.osdVisible.dockSn}).then((result:any) => {
+      deviceTopicInfo.subTopic = ''
+      deviceTopicInfo.pubTopic = ''
+      flightMode.value = '自动控制'
+    })
+  }
+  
+  const sureJg = () => {
+    dialogVisible.value = false
+    enterFlightControl()
+  }
+  
+  // 是否进行人工控制
+  const authenticationPwd = (value:any, str:String) => {
+    // 提示是否进行人工控制
+    if (!isShowKzBtn.value) {
+      if (!hasPermission.value) { return showNotify({ type: 'warning', message: '暂无无人机控制权限' })}
+      dialogVisible.value = true
+    } else {
+      isShowKzBtn.value = false
+      exitFlightCOntrol()
+    }
+  }
+  
+  // 返航
+  const onBackDock = () => {
+    returnHome(props.sn).then((res) => {
+      if (res.code === 0) {
+        nowInReturnStatus.value = true
+        flightMode.value = '自动控制'
+        nowInReturnStatusClick.value = false
+      }
+    })
+  }
+  
+  // 取消返航
+  const notonBackDock = () => {
+    returnHomeCancel({ client_id: clientId.value, dock_sn: props.osdVisible.dockSn}).then((result:any) => {
+    if (result.code !== 0) return
+      nowInReturnStatus.value = false
+      // 取消返航时,退出飞行控制,进入人工控制
+      nowInReturnStatusClick.value = true       
+      flightMode.value = '人工控制'
+    })
+  }
+  
+  // 无人机速度控制
+  const onControlsDroneSpeed = (value:Boolean) => {
+    if (value) {
+      if (droneSeepd.value >= 15) {
+        return showNotify({ type: 'warning', message: '无人机速度范围应处于0~15m/s之间' })
+      }
+      droneSeepd.value += 1
+    } else {
+      if (droneSeepd.value <= 0) {
+        return showNotify({ type: 'warning', message: '无人机速度范围应处于0~15m/s之间' })
+      }
+      droneSeepd.value -= 1
+    }
+  }
+  
+  const mqttHooks =  useMqtt(deviceTopicInfo)
+  // 字母按键
+  const handlePublish = (str:String) => {
+    console.log('哒哒哒',DRC_METHOD.DRONE_CONTROL)
+    // if (!hasPermission.value) { return showNotify({ type: 'warning', message: '暂无无人机控制权限' });}
+    let params = ref({})
+    if (str == 'xq') {params.value = genPortOne.value?{ x: SPEED.value}:{ pitch: 1024+SPEED.value}}
+    else if (str == 'xz') {params.value = genPortOne.value?{ y: -SPEED.value}:{ roll: 1024-SPEED.value}}
+    else if (str == 'xx') {params.value = genPortOne.value?{ x: -SPEED.value}:{ pitch: 1024-SPEED.value}}
+    else if (str == 'xy') {params.value = genPortOne.value?{ y: SPEED.value}:{ roll: 1024+SPEED.value}}
+    else if (str == 'ss') {params.value = genPortOne.value?{ h: HEIGHT.value}:{ throttle: 1024+HEIGHT.value}}
+    else if (str == 'xj') {params.value = genPortOne.value?{ w: -W_SPEED.value}:{ yaw: 1024-W_SPEED.value}}
+    else if (str == 'yz') {params.value = genPortOne.value?{ h: -HEIGHT.value}:{ throttle: 1024+HEIGHT.value}}
+    else if (str == 'xz') {params.value = genPortOne.value?{ w: W_SPEED.value}:{ yaw: 1024+W_SPEED.value}}
+    const body = { method: 'stick_control', data: params.value}
+    mqttHooks?.publishMqtt(deviceTopicInfo.pubTopic, body, {qos: 0})
+  }
+  
+  onMounted(() => {
+    
+  })
+  
+  </script>
+  
+  <style lang="scss" scoped>
+  .control-console {
+    
+    .control {
+      position: absolute;
+      bottom: 12.8rem;
+      right: 0.2rem;
+      width: 2rem;
+      height: 2rem;
+      border-radius: 3px;
+      background-color: rgba(0, 0, 0, 0.5);
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      overflow: hidden;
+      cursor: pointer;
+      pointer-events: all;
+      img {
+        width: 1.6rem;
+        height: 1.6rem;
+      }
+    }
+    .actived-blue {
+      background-image: none;
+      background-color: rgba(23, 124, 198, 0.7);
+    }
+    .control-left {
+      left: 10%;
+    }
+    .control-right {
+      right: 10%;
+    }
+    .control-left, .control-right{
+      width: 100px;
+      height: 100px;
+      border-radius: 50%;
+      overflow: hidden;
+      // background-color: rgba(255, 255, 255, 0.5); /* 白色,50%透明度 */
+      // box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3); /* 阴影效果 */
+      background-color: rgba(0, 0, 0, 0.5);
+      padding: 20px; /* 内边距 */
+      position: absolute;
+      top: 30%;
+      .top,
+      .left,
+      .bottom,
+      .right {
+        width: 10px;
+        height: 10px;
+        position: absolute;
+        cursor: pointer;
+        z-index: 2;
+      }
+  
+      .top {
+        top: -2px;
+        left: 50%;
+        transform: translateX(-50%);
+        border-top: 10px solid transparent;
+        border-right: 10px solid transparent;
+        border-left: 10px solid transparent;
+        border-bottom: 10px solid #fff;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-top: 50px solid #fff;
+          }
+        }
+        .xq {
+          position: absolute;
+          top: 10px;
+          font-size: 10px;
+          width: 30px;
+          left: -9px;
+          color: #fff;
+        }
+      }
+  
+      .left {
+        top: 50%;
+        left: -2px;
+        transform: translateY(-50%);
+        border-top: 10px solid transparent;
+        border-right: 10px solid #fff;
+        border-left: 10px solid transparent;
+        border-bottom: 10px solid transparent;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-left: 50px solid #fff;
+          }
+        }
+        .xz {
+          position: absolute;
+          top: -7px;
+          font-size: 10px;
+          width: 30px;
+          left: 11px;
+          color: #fff;
+        }
+      }
+  
+      .bottom {
+        bottom: -2px;
+        left: 50%;
+        transform: translateX(-50%);
+        border-top: 10px solid #fff;
+        border-right: 10px solid transparent;
+        border-left: 10px solid transparent;
+        border-bottom: 10px solid transparent;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-bottom: 50px solid #fff;
+          }
+        }
+        .xx {
+          position: absolute;
+          bottom: 8px;
+          font-size: 10px;
+          width: 30px;
+          left: -9px;
+          color: #fff;
+        }
+      }
+  
+      .right {
+        top: 50%;
+        right: -2px;
+        transform: translateY(-50%);
+        border-top: 10px solid transparent;
+        border-right: 10px solid transparent;
+        border-left: 10px solid #fff;
+        border-bottom: 10px solid transparent;
+  
+        &:hover {
+          &~.blue-bgc {
+            border-right: 50px solid #fff;
+          }
+        }
+        .xy {
+          position: absolute;
+          top: -8px;
+          font-size: 10px;
+          width: 30px;
+          right : 2px;
+          color: #fff;
+        }
+      }
+    }
+      // width: 100%;
+      // height: 200px;
+      // margin-top: 20px;
+      // margin: 0 auto;
+      // display: flex;
+      // align-items: center;
+      // justify-content: space-between;
+      // overflow-x: auto;
+      // overflow-y: hidden;
+      // background-repeat: no-repeat;
+      // background-size: 100% 100%;
+      // color: #fff;
+      // font-weight: bold;
+    // .DroneOperation {
+    //   display: flex;
+    //   align-items: center;
+    //   height: 245px;
+    //   position: relative;
+    // }
+  
+    // .center {
+    //   display: flex;
+    //   align-items: center;
+  
+    //   &_left,
+    //   &_center,
+    //   .speed {
+    //     margin-right: 10px;
+    //   }
+  
+    //   .center_left {
+    //     .tubiaoshow {
+    //       height: 50px;
+    //       display: flex;
+    //       justify-content: center;
+    //       align-items: center;
+  
+    //       img {
+    //         width: 40px;
+    //         height: 50px;
+    //         cursor: pointer;
+    //       }
+    //     }
+  
+    //     .Airplanemode {
+    //       font-style: normal;
+    //       margin: 5px 0px;
+    //       text-align: center;
+    //     }
+  
+    //     .operatingjixufanhang {
+    //       display: flex;
+    //       justify-content: center;
+  
+    //       .el-button {
+    //         font-size: 16px;
+    //         background-color: rgba(0, 0, 0, 0.5);
+    //         color: white;
+    //         border-width: 0;
+    //         margin: 5px;
+    //       }
+    //     }
+    //   }
+  
+    //   .center_center {
+    //     width: 120px;
+  
+    //     padding: 0px 0px;
+  
+    //     .center {
+    //       height: 45px;
+  
+    //       p {
+    //         line-height: 50px;
+    //         color: #00ee8b;
+    //         font-size: 20px;
+    //         margin: 0 auto;
+    //       }
+    //     }
+  
+    //     .top,
+    //     .bottom {
+    //       background: rgba(0, 0, 0, 0.5);
+    //       border-radius: 5px;
+    //       display: flex;
+    //       height: 80px;
+    //       width: 100%;
+  
+    //       .Q,
+    //       .W,
+    //       .E {
+    //         flex: 1;
+    //         display: flex;
+    //         flex-direction: column;
+    //         align-items: center;
+    //         justify-content: center;
+    //         gap: 10px;
+  
+    //         img {
+    //           width: 20px;
+    //           height: 20px;
+    //           // margin-top: 5px;
+    //           // margin-top: 5px;
+    //         }
+  
+    //         .el-button {
+    //           padding: 4px;
+    //           font-size: 20px;
+    //           height: 30px;
+    //           background: #3c3c3c;
+    //           color: white;
+    //           -webkit-touch-callout: none;
+    //           -webkit-user-select: none;
+    //           -khtml-user-select: none;
+    //           -moz-user-select: none;
+    //           -ms-user-select: none;
+    //           user-select: none;
+    //         }
+    //       }
+  
+    //       .A,
+    //       .S,
+    //       .D {
+    //         flex: 1;
+    //         display: flex;
+    //         flex-direction: column;
+    //         align-items: center;
+    //         justify-content: center;
+  
+    //         img {
+    //           width: 20px;
+    //           height: 20px;
+    //         }
+  
+    //         .el-button {
+    //           padding: 4px;
+    //           font-size: 20px;
+    //           margin-bottom: 10px;
+    //           height: 30px;
+    //           background: #3c3c3c;
+    //           color: white;
+    //           -webkit-touch-callout: none;
+    //           -webkit-user-select: none;
+    //           -khtml-user-select: none;
+    //           -moz-user-select: none;
+    //           -ms-user-select: none;
+    //           user-select: none;
+    //         }
+    //       }
+    //     }
+  
+    //     .top {
+    //       // padding: 5px 2px 5px;
+    //       margin-bottom: 10px;
+    //     }
+  
+    //     .bottom {
+    //       padding: 5px 0px 0px 0px;
+    //     }
+    //   }
+  
+    //   .speed {
+    //     width: 43px;
+    //     height: 170px;
+    //     border-radius: 5px;
+    //     background-color: rgba(0, 0, 0, 0.5);
+  
+    //     &-content {
+    //       height: 100%;
+    //       display: flex;
+    //       flex-direction: column;
+  
+    //       .add-speed--button,
+    //       .sub-speed--button {
+    //         flex: 1;
+    //         display: flex;
+    //         justify-content: center;
+    //         align-items: center;
+    //         cursor: pointer;
+  
+    //         i {
+    //           font-size: 20px;
+    //           font-weight: bolder;
+    //         }
+    //       }
+  
+    //       .speed-text {
+    //         flex: 2;
+    //         display: flex;
+    //         flex-direction: column;
+    //         justify-content: center;
+    //         align-items: center;
+  
+    //         div:first-child {
+    //           font-size: 20px;
+    //           color: #00ee8b;
+    //           font-weight: bolder;
+    //         }
+    //       }
+    //     }
+    //   }
+    // }
+  
+    // .right {
+    //   .rightbutton {
+    //     // padding: 0px 0px;
+    //     // // width: 150px;
+    //     // margin-right: 0px;
+  
+    //     .center {
+    //       height: 45px;
+    //       margin: 5px 0px;
+    //       display: flex;
+    //       flex-direction: column;
+  
+    //       .top_in {
+    //         display: flex;
+    //         width: 100%;
+  
+    //         .top_in_left {
+    //           min-width: 70px;
+    //           text-align: right;
+    //           font-size: 22px;
+    //           color: #00ee8b;
+    //           margin-right: 5px;
+    //           margin-left: auto;
+    //         }
+  
+    //         .top_in_right {
+    //           p {
+    //             font-size: 14px;
+    //             line-height: 14px;
+    //             text-align: right;
+    //           }
+    //         }
+    //       }
+  
+    //       .top_in_ASL {
+    //         font-size: 12px;
+    //         line-height: 12px;
+    //         text-align: right;
+    //       }
+    //     }
+  
+    //     .top {
+    //       margin-left: auto;
+    //       width: 43px;
+    //       background: rgba(0, 0, 0, 0.5);
+    //       display: flex;
+    //       flex-direction: column;
+    //       border-radius: 5px;
+    //       height: 80px;
+    //       margin-bottom: 10px;
+  
+    //       img {
+    //         width: 25px;
+    //         height: 25px;
+    //         margin: 5px auto 0px;
+    //       }
+  
+    //       .el-button {
+    //         padding: 4px;
+    //         font-size: 16px;
+    //         background: #3c3c3c;
+    //         color: white;
+    //         width: 25px;
+    //         height: 30px;
+    //         margin: 10px auto 12px;
+    //         -webkit-touch-callout: none;
+    //         -webkit-user-select: none;
+    //         -khtml-user-select: none;
+    //         -moz-user-select: none;
+    //         -ms-user-select: none;
+    //         user-select: none;
+    //       }
+    //     }
+  
+    //     .bottom {
+    //       margin-left: auto;
+    //       width: 40px;
+    //       background: rgba(0, 0, 0, 0.5);
+    //       display: flex;
+    //       flex-direction: column;
+    //       border-radius: 5px;
+    //       height: 80px;
+  
+    //       img {
+    //         width: 25px;
+    //         height: 25px;
+    //         margin: 0px auto 5px;
+    //       }
+  
+    //       .el-button {
+    //         padding: 4px;
+    //         font-size: 20px;
+    //         background: #3c3c3c;
+    //         color: white;
+    //         width: 25px;
+    //         margin: 10px auto 10px;
+    //       }
+    //     }
+    //   }
+    // }
+  
+    // .instrument-panel {
+    //   position: relative;
+  
+    //   .title {
+    //     position: absolute;
+    //     font-size: 12px;
+    //     font-weight: 400;
+    //     top: -5px;
+    //     left: 10px;
+    //     color: #ffffff;
+    //     z-index: 1;
+    //   }
+    // }
+  
+    // .camera-load {
+  
+    //   // background: rgba(6, 25, 39, 0.5);
+    //   // height: 245px;
+    //   // padding: 10px;
+    //   // position: relative;
+    //   // border: 1px solid red;
+    //   .title {
+    //     position: absolute;
+    //     font-size: 12px;
+    //     font-weight: 400;
+    //     top: -5px;
+    //     left: 10px;
+    //     color: #ffffff;
+    //     z-index: 1;
+    //   }
+  
+    //   .camera-control {
+    //     width: 100%;
+    //     margin-bottom: 10px;
+    //     display: flex;
+    //     justify-content: center;
+  
+    //     .promptInformation {
+    //       position: absolute;
+    //       width: 30px;
+    //       height: 30px;
+    //       right: 10px;
+    //       top: 10px;
+    //     }
+  
+    //     .circle-box {
+    //       width: 90px;
+    //       height: 90px;
+    //       border-radius: 50%;
+    //       background-color: rgba(0, 0, 0, 0.5);
+    //       -webkit-mask-image: radial-gradient(circle,
+    //           transparent 35%,
+    //           white 35%);
+    //       mask-image: radial-gradient(circle, transparent 35%, white 35%);
+    //       position: relative;
+  
+    //       .top,
+    //       .left,
+    //       .bottom,
+    //       .right {
+    //         width: 10px;
+    //         height: 10px;
+    //         position: absolute;
+    //         cursor: pointer;
+    //         z-index: 2;
+    //       }
+  
+    //       .top {
+    //         top: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid #fff;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-top: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .left {
+    //         top: 50%;
+    //         left: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid #fff;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-left: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .bottom {
+    //         bottom: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid #fff;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-bottom: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .right {
+    //         top: 50%;
+    //         right: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid #fff;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-right: 45px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .blue-bgc {
+    //         width: 90px;
+    //         height: 90px;
+    //         position: absolute;
+    //         top: 0;
+    //         left: 0;
+    //         z-index: 1;
+    //         border-top: 45px solid transparent;
+    //         border-right: 45px solid transparent;
+    //         border-left: 45px solid transparent;
+    //         border-bottom: 45px solid transparent;
+    //       }
+    //     }
+    //   }
+  
+    //   .camera-select {
+    //     display: flex;
+    //     display: flex;
+    //     justify-content: center;
+  
+    //     :deep() {
+    //       .el-select {
+    //         width: 250px;
+    //         height: 40px;
+    //         line-height: 40px;
+    //         background-color: rgba(0, 0, 0, 0.5);
+    //         border-radius: 5px;
+  
+    //         .el-input {
+    //           width: auto;
+    //           height: auto;
+  
+    //           .el-input__inner {
+    //             background-color: transparent;
+    //             box-shadow: none;
+    //             border: 0;
+    //             color: #fff;
+    //           }
+  
+    //           .el-input__suffix {
+    //             display: flex;
+    //             align-items: center;
+    //           }
+    //         }
+    //       }
+    //     }
+  
+    //     .load-button {
+    //       font-style: normal;
+    //       background: rgba(21, 138, 255, 0.5);
+    //       margin-left: 10px;
+    //       padding: 0 5px;
+  
+    //       &:hover {
+    //         color: #409eff;
+    //       }
+    //     }
+    //   }
+  
+    //   .btn-group {
+    //     display: flex;
+    //     flex-wrap: wrap;
+    //     margin-top: 10px;
+    //     width: 300px;
+    //     padding: 0px 20px;
+  
+    //     .btn-item {
+    //       display: flex;
+    //       // width: 140px;
+    //       box-sizing: border-box;
+    //       margin: 2px 10px;
+    //       cursor: pointer;
+  
+    //       img {
+    //         width: 30px;
+    //         height: 30px;
+    //         margin-right: 3px;
+    //       }
+  
+    //       div {
+    //         font-size: 18px;
+    //         font-style: normal;
+    //       }
+    //     }
+    //   }
+    // }
+  
+    // .payload-control {
+    //   height: 100%;
+    //   display: flex;
+    //   justify-content: center;
+    //   flex-direction: column;
+    //   gap: 15px;
+  
+    //   .left-box {
+    //     display: flex;
+    //     // flex-direction: column;
+    //     align-items: center;
+    //     justify-content: center;
+    //     gap: 10px;
+  
+    //     .circle-box {
+    //       width: 100px;
+    //       height: 100px;
+    //       border-radius: 50%;
+    //       overflow: hidden;
+    //       background-color: rgba(0, 0, 0, 0.5);
+    //       // -webkit-mask-image: radial-gradient(
+    //       //   circle,
+    //       //   transparent 35%,
+    //       //   white 35%
+    //       // );
+    //       // mask-image: radial-gradient(circle, transparent 35%, white 35%);
+    //       position: relative;
+    //       // border: 1px solid red;
+  
+    //       .top,
+    //       .left,
+    //       .bottom,
+    //       .right {
+    //         width: 10px;
+    //         height: 10px;
+    //         position: absolute;
+    //         cursor: pointer;
+    //         z-index: 2;
+    //       }
+  
+    //       .top {
+    //         top: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid #fff;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-top: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .left {
+    //         top: 50%;
+    //         left: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid #fff;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-left: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .bottom {
+    //         bottom: -2px;
+    //         left: 50%;
+    //         transform: translateX(-50%);
+    //         border-top: 10px solid #fff;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid transparent;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-bottom: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .right {
+    //         top: 50%;
+    //         right: -2px;
+    //         transform: translateY(-50%);
+    //         border-top: 10px solid transparent;
+    //         border-right: 10px solid transparent;
+    //         border-left: 10px solid #fff;
+    //         border-bottom: 10px solid transparent;
+  
+    //         &:hover {
+    //           &~.blue-bgc {
+    //             border-right: 50px solid #409eff;
+    //           }
+    //         }
+    //       }
+  
+    //       .reset-center {
+    //         position: absolute;
+    //         width: 40%;
+    //         height: 40%;
+    //         left: 50%;
+    //         top: 50%;
+    //         transform: translate(-50%, -50%);
+    //         border-radius: 50%;
+    //         background-color: rgb(63, 66, 68);
+    //         z-index: 2;
+    //         cursor: pointer;
+    //         display: flex;
+    //         justify-content: center;
+    //         align-items: center;
+  
+    //         i {
+    //           color: #fff;
+    //           font-size: 20px;
+    //           font-weight: bolder;
+    //         }
+  
+    //         &:hover {
+    //           background-color: #409eff;
+    //         }
+    //       }
+  
+    //       .blue-bgc {
+    //         width: 100px;
+    //         height: 100px;
+    //         position: absolute;
+    //         top: 0;
+    //         left: 0;
+    //         z-index: 1;
+    //         border-top: 50px solid transparent;
+    //         border-right: 50px solid transparent;
+    //         border-left: 50px solid transparent;
+    //         border-bottom: 50px solid transparent;
+    //       }
+    //     }
+  
+    //     .payload-info {
+    //       font-size: 14px;
+    //     }
+  
+    //     .btn-group {
+    //       width: auto;
+    //       display: flex;
+    //       flex-wrap: wrap;
+    //       width: 200px;
+  
+    //       // flex-direction: column;
+    //       // justify-content: center;
+    //       .btn-item {
+    //         width: 100px;
+    //         display: flex;
+    //         box-sizing: border-box;
+    //         cursor: pointer;
+  
+    //         img {
+    //           width: 30px;
+    //           height: 30px;
+    //           margin-right: 3px;
+    //         }
+  
+    //         div {
+    //           height: 100%;
+    //           font-size: 17px;
+    //           line-height: 30px;
+    //           font-style: normal;
+    //         }
+    //       }
+    //     }
+    //   }
+  
+    //   .right-box {
+    //     position: relative;
+    //     flex-shrink: 0;
+    //     display: flex;
+  
+    //     // justify-content: center;
+    //     .btn-group {
+    //       width: auto;
+    //       display: flex;
+    //       flex-wrap: wrap;
+    //       width: 290px;
+    //       justify-content: center;
+  
+    //       .btn-item {
+    //         width: 140px;
+    //         display: flex;
+    //         box-sizing: border-box;
+    //         cursor: pointer;
+  
+    //         img {
+    //           width: 30px;
+    //           height: 30px;
+    //           margin-right: 3px;
+    //         }
+  
+    //         div {
+    //           width: 100px;
+    //           height: 100%;
+    //           font-size: 17px;
+    //           line-height: 30px;
+    //           font-style: normal;
+    //         }
+    //       }
+    //     }
+  
+    //     .payload-info {
+    //       font-size: 14px;
+  
+    //       .info-item {
+    //         display: flex;
+    //         align-items: center;
+    //         gap: 10px;
+    //         height: 25px;
+  
+    //         div:first-child {
+    //           width: 170px;
+    //         }
+  
+    //         div:nth-child(2) {
+    //           :deep() {
+    //             .el-input-number {
+    //               width: 70px;
+    //               height: 20px;
+  
+    //               &__decrease,
+    //               &__increase {
+    //                 width: 18px;
+    //                 height: 18px;
+    //                 line-height: 18px;
+    //                 background-color: transparent;
+    //                 border-right: 0;
+    //                 border-left: 0;
+  
+    //                 i {
+    //                   color: #fff;
+    //                   font-size: 17px;
+    //                   font-weight: bold;
+    //                 }
+    //               }
+  
+    //               .el-input {
+    //                 margin: 0;
+    //                 padding: 0;
+    //                 height: 18px;
+    //                 display: flex;
+    //                 justify-content: center;
+  
+    //                 &__inner {
+    //                   padding: 0;
+    //                 }
+  
+    //                 input {
+    //                   width: 80px;
+    //                   height: 18px;
+    //                   overflow: hidden;
+    //                   font-size: 14px;
+    //                   font-weight: bold;
+    //                 }
+    //               }
+    //             }
+    //           }
+    //         }
+    //       }
+    //     }
+    //   }
+    // }
+  }
+  </style>
\ No newline at end of file
diff --git a/src/views/components/controlConsole.vue b/src/views/components/controlConsole.vue
index 461f7f9..d695bbf 100644
--- a/src/views/components/controlConsole.vue
+++ b/src/views/components/controlConsole.vue
@@ -4,16 +4,16 @@
       <img src="@/assets/images/open-close.png" />
     </div>
     <div class="control-left" v-show="isShowKzBtn">
-      <div class="top"  @touchstart="handlePublish({ x: SPEED })"><div class="xq">向前</div></div>
-      <div class="left" @touchstart="handlePublish({ y: -SPEED })"><div class="xz">向左</div></div>
-      <div class="bottom" @touchstart="handlePublish({ x: -SPEED })"><div class="xx">向下</div></div>
-      <div class="right" @touchstart="handlePublish({ y: SPEED })"><div class="xy">向右</div></div>
+      <div class="top"  @touchstart="handlePublish('xq')"><div class="xq">向前</div></div>
+      <div class="left" @touchstart="handlePublish('xz')"><div class="xz">向左</div></div>
+      <div class="bottom" @touchstart="handlePublish('xx')"><div class="xx">向下</div></div>
+      <div class="right" @touchstart="handlePublish('xy')"><div class="xy">向右</div></div>
     </div>
     <div class="control-right" v-show="isShowKzBtn">
-      <div class="top"  @touchstart="handlePublish({ h: HEIGHT })"><div class="xq">上升</div></div>
-      <div class="left" @touchstart="handlePublish({ w: -W_SPEED })"><div class="xz">左转</div></div>
-      <div class="bottom" @touchstart="handlePublish({ h: -HEIGHT })"><div class="xx">下降</div></div>
-      <div class="right" @touchstart="handlePublish({ w: W_SPEED })" ><div class="xy">右转</div></div>
+      <div class="top"  @touchstart="handlePublish('ss')"><div class="xq">上升</div></div>
+      <div class="left" @touchstart="handlePublish('zz')"><div class="xz">左转</div></div>
+      <div class="bottom" @touchstart="handlePublish('xj')"><div class="xx">下降</div></div>
+      <div class="right" @touchstart="handlePublish('yz')" ><div class="xy">右转</div></div>
     </div>
     <van-dialog v-model:show="dialogVisible" title="确认是否接管?" show-cancel-button @confirm="sureJg"></van-dialog>
   </div>
@@ -54,11 +54,16 @@
 // 控制状态
 let flightMode = ref('自动控制')
 
+let genPortOne = ref(false)
+if (store.state.airPortInfo.deviceType == 1 && store.state.airPortInfo.subType == 0 && store.state.airPortInfo.domain == 3) {
+  genPortOne.value = true
+}
+
 // 控制无人机速度
 let droneSeepd = ref(5);
-const SPEED = ref(droneSeepd.value || 5) //  check
-const HEIGHT = ref(5) //  check
-const W_SPEED = ref(20) // 机头角速度
+const SPEED = genPortOne.value ? ref(droneSeepd.value || 5) : ref(500); //  check
+const HEIGHT = genPortOne.value ? ref(5) : ref(500); //  check
+const W_SPEED = genPortOne.value ? ref(20) : ref(500); // 机头角速度
 
 // A S D....按键
 let deviceTopicInfo: DeviceTopicInfo = reactive({
@@ -175,10 +180,29 @@
 }
 
 const mqttHooks =  useMqtt(deviceTopicInfo)
+let seq = ref(0)
 // 字母按键
-const handlePublish = (params:Object) => {
-  if (!hasPermission.value) { return showNotify({ type: 'warning', message: '暂无无人机控制权限' });}
-  const body = { method: DRC_METHOD.DRONE_CONTROL, data: params}
+const handlePublish = (str:String) => {
+  // if (!hasPermission.value) { return showNotify({ type: 'warning', message: '暂无无人机控制权限' });}
+  let params = ref({})
+  if (str === 'xq') {
+    params.value = genPortOne.value ? { x: SPEED.value,seq: seq.value++ } : { x: (1024+SPEED.value),seq: seq.value++ }
+  } else if(str === 'xz') {
+    params.value = genPortOne.value ? { y: -SPEED.value,seq: seq.value++ } : { y: (1024-SPEED.value),seq: seq.value++ }
+  } else if(str === 'xx') {
+    params.value = genPortOne.value ? { x: -SPEED.value,seq: seq.value++ } : { x: (1024-SPEED.value),seq: seq.value++ }
+  } else if(str === 'xy') {
+    params.value = genPortOne.value ? { y: SPEED.value,seq: seq.value++ } :  { y: (1024+SPEED.value),seq: seq.value++ }
+  } else if(str === 'ss') {
+    params.value = genPortOne.value ? { h: HEIGHT.value,seq: seq.value++ } : { h: (1024+HEIGHT.value),seq: seq.value++ }
+  } else if(str === 'zz') {
+    params.value = genPortOne.value ? { w: -W_SPEED.value,seq: seq.value++ } : { w: (1024-W_SPEED.value),seq: seq.value++ }
+  } else if(str === 'xj') {
+    params.value = genPortOne.value ? { h: -HEIGHT.value,seq: seq.value++ } :  { h: (1024-HEIGHT.value),seq: seq.value++ }
+  } else if(str === 'yz') {
+    params.value = genPortOne.value ? { w: W_SPEED.value,seq: seq.value++ } :  { w: (1024+W_SPEED.value),seq: seq.value++ }
+  }
+  const body = { method: genPortOne.value?'drone_control':'stick_control', data: params.value}
   mqttHooks?.publishMqtt(deviceTopicInfo.pubTopic, body, {qos: 0})
 }
 
@@ -338,801 +362,5 @@
       }
     }
   }
-    // width: 100%;
-    // height: 200px;
-    // margin-top: 20px;
-    // margin: 0 auto;
-    // display: flex;
-    // align-items: center;
-    // justify-content: space-between;
-    // overflow-x: auto;
-    // overflow-y: hidden;
-    // background-repeat: no-repeat;
-    // background-size: 100% 100%;
-    // color: #fff;
-    // font-weight: bold;
-  // .DroneOperation {
-  //   display: flex;
-  //   align-items: center;
-  //   height: 245px;
-  //   position: relative;
-  // }
-
-  // .center {
-  //   display: flex;
-  //   align-items: center;
-
-  //   &_left,
-  //   &_center,
-  //   .speed {
-  //     margin-right: 10px;
-  //   }
-
-  //   .center_left {
-  //     .tubiaoshow {
-  //       height: 50px;
-  //       display: flex;
-  //       justify-content: center;
-  //       align-items: center;
-
-  //       img {
-  //         width: 40px;
-  //         height: 50px;
-  //         cursor: pointer;
-  //       }
-  //     }
-
-  //     .Airplanemode {
-  //       font-style: normal;
-  //       margin: 5px 0px;
-  //       text-align: center;
-  //     }
-
-  //     .operatingjixufanhang {
-  //       display: flex;
-  //       justify-content: center;
-
-  //       .el-button {
-  //         font-size: 16px;
-  //         background-color: rgba(0, 0, 0, 0.5);
-  //         color: white;
-  //         border-width: 0;
-  //         margin: 5px;
-  //       }
-  //     }
-  //   }
-
-  //   .center_center {
-  //     width: 120px;
-
-  //     padding: 0px 0px;
-
-  //     .center {
-  //       height: 45px;
-
-  //       p {
-  //         line-height: 50px;
-  //         color: #00ee8b;
-  //         font-size: 20px;
-  //         margin: 0 auto;
-  //       }
-  //     }
-
-  //     .top,
-  //     .bottom {
-  //       background: rgba(0, 0, 0, 0.5);
-  //       border-radius: 5px;
-  //       display: flex;
-  //       height: 80px;
-  //       width: 100%;
-
-  //       .Q,
-  //       .W,
-  //       .E {
-  //         flex: 1;
-  //         display: flex;
-  //         flex-direction: column;
-  //         align-items: center;
-  //         justify-content: center;
-  //         gap: 10px;
-
-  //         img {
-  //           width: 20px;
-  //           height: 20px;
-  //           // margin-top: 5px;
-  //           // margin-top: 5px;
-  //         }
-
-  //         .el-button {
-  //           padding: 4px;
-  //           font-size: 20px;
-  //           height: 30px;
-  //           background: #3c3c3c;
-  //           color: white;
-  //           -webkit-touch-callout: none;
-  //           -webkit-user-select: none;
-  //           -khtml-user-select: none;
-  //           -moz-user-select: none;
-  //           -ms-user-select: none;
-  //           user-select: none;
-  //         }
-  //       }
-
-  //       .A,
-  //       .S,
-  //       .D {
-  //         flex: 1;
-  //         display: flex;
-  //         flex-direction: column;
-  //         align-items: center;
-  //         justify-content: center;
-
-  //         img {
-  //           width: 20px;
-  //           height: 20px;
-  //         }
-
-  //         .el-button {
-  //           padding: 4px;
-  //           font-size: 20px;
-  //           margin-bottom: 10px;
-  //           height: 30px;
-  //           background: #3c3c3c;
-  //           color: white;
-  //           -webkit-touch-callout: none;
-  //           -webkit-user-select: none;
-  //           -khtml-user-select: none;
-  //           -moz-user-select: none;
-  //           -ms-user-select: none;
-  //           user-select: none;
-  //         }
-  //       }
-  //     }
-
-  //     .top {
-  //       // padding: 5px 2px 5px;
-  //       margin-bottom: 10px;
-  //     }
-
-  //     .bottom {
-  //       padding: 5px 0px 0px 0px;
-  //     }
-  //   }
-
-  //   .speed {
-  //     width: 43px;
-  //     height: 170px;
-  //     border-radius: 5px;
-  //     background-color: rgba(0, 0, 0, 0.5);
-
-  //     &-content {
-  //       height: 100%;
-  //       display: flex;
-  //       flex-direction: column;
-
-  //       .add-speed--button,
-  //       .sub-speed--button {
-  //         flex: 1;
-  //         display: flex;
-  //         justify-content: center;
-  //         align-items: center;
-  //         cursor: pointer;
-
-  //         i {
-  //           font-size: 20px;
-  //           font-weight: bolder;
-  //         }
-  //       }
-
-  //       .speed-text {
-  //         flex: 2;
-  //         display: flex;
-  //         flex-direction: column;
-  //         justify-content: center;
-  //         align-items: center;
-
-  //         div:first-child {
-  //           font-size: 20px;
-  //           color: #00ee8b;
-  //           font-weight: bolder;
-  //         }
-  //       }
-  //     }
-  //   }
-  // }
-
-  // .right {
-  //   .rightbutton {
-  //     // padding: 0px 0px;
-  //     // // width: 150px;
-  //     // margin-right: 0px;
-
-  //     .center {
-  //       height: 45px;
-  //       margin: 5px 0px;
-  //       display: flex;
-  //       flex-direction: column;
-
-  //       .top_in {
-  //         display: flex;
-  //         width: 100%;
-
-  //         .top_in_left {
-  //           min-width: 70px;
-  //           text-align: right;
-  //           font-size: 22px;
-  //           color: #00ee8b;
-  //           margin-right: 5px;
-  //           margin-left: auto;
-  //         }
-
-  //         .top_in_right {
-  //           p {
-  //             font-size: 14px;
-  //             line-height: 14px;
-  //             text-align: right;
-  //           }
-  //         }
-  //       }
-
-  //       .top_in_ASL {
-  //         font-size: 12px;
-  //         line-height: 12px;
-  //         text-align: right;
-  //       }
-  //     }
-
-  //     .top {
-  //       margin-left: auto;
-  //       width: 43px;
-  //       background: rgba(0, 0, 0, 0.5);
-  //       display: flex;
-  //       flex-direction: column;
-  //       border-radius: 5px;
-  //       height: 80px;
-  //       margin-bottom: 10px;
-
-  //       img {
-  //         width: 25px;
-  //         height: 25px;
-  //         margin: 5px auto 0px;
-  //       }
-
-  //       .el-button {
-  //         padding: 4px;
-  //         font-size: 16px;
-  //         background: #3c3c3c;
-  //         color: white;
-  //         width: 25px;
-  //         height: 30px;
-  //         margin: 10px auto 12px;
-  //         -webkit-touch-callout: none;
-  //         -webkit-user-select: none;
-  //         -khtml-user-select: none;
-  //         -moz-user-select: none;
-  //         -ms-user-select: none;
-  //         user-select: none;
-  //       }
-  //     }
-
-  //     .bottom {
-  //       margin-left: auto;
-  //       width: 40px;
-  //       background: rgba(0, 0, 0, 0.5);
-  //       display: flex;
-  //       flex-direction: column;
-  //       border-radius: 5px;
-  //       height: 80px;
-
-  //       img {
-  //         width: 25px;
-  //         height: 25px;
-  //         margin: 0px auto 5px;
-  //       }
-
-  //       .el-button {
-  //         padding: 4px;
-  //         font-size: 20px;
-  //         background: #3c3c3c;
-  //         color: white;
-  //         width: 25px;
-  //         margin: 10px auto 10px;
-  //       }
-  //     }
-  //   }
-  // }
-
-  // .instrument-panel {
-  //   position: relative;
-
-  //   .title {
-  //     position: absolute;
-  //     font-size: 12px;
-  //     font-weight: 400;
-  //     top: -5px;
-  //     left: 10px;
-  //     color: #ffffff;
-  //     z-index: 1;
-  //   }
-  // }
-
-  // .camera-load {
-
-  //   // background: rgba(6, 25, 39, 0.5);
-  //   // height: 245px;
-  //   // padding: 10px;
-  //   // position: relative;
-  //   // border: 1px solid red;
-  //   .title {
-  //     position: absolute;
-  //     font-size: 12px;
-  //     font-weight: 400;
-  //     top: -5px;
-  //     left: 10px;
-  //     color: #ffffff;
-  //     z-index: 1;
-  //   }
-
-  //   .camera-control {
-  //     width: 100%;
-  //     margin-bottom: 10px;
-  //     display: flex;
-  //     justify-content: center;
-
-  //     .promptInformation {
-  //       position: absolute;
-  //       width: 30px;
-  //       height: 30px;
-  //       right: 10px;
-  //       top: 10px;
-  //     }
-
-  //     .circle-box {
-  //       width: 90px;
-  //       height: 90px;
-  //       border-radius: 50%;
-  //       background-color: rgba(0, 0, 0, 0.5);
-  //       -webkit-mask-image: radial-gradient(circle,
-  //           transparent 35%,
-  //           white 35%);
-  //       mask-image: radial-gradient(circle, transparent 35%, white 35%);
-  //       position: relative;
-
-  //       .top,
-  //       .left,
-  //       .bottom,
-  //       .right {
-  //         width: 10px;
-  //         height: 10px;
-  //         position: absolute;
-  //         cursor: pointer;
-  //         z-index: 2;
-  //       }
-
-  //       .top {
-  //         top: -2px;
-  //         left: 50%;
-  //         transform: translateX(-50%);
-  //         border-top: 10px solid transparent;
-  //         border-right: 10px solid transparent;
-  //         border-left: 10px solid transparent;
-  //         border-bottom: 10px solid #fff;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-top: 45px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .left {
-  //         top: 50%;
-  //         left: -2px;
-  //         transform: translateY(-50%);
-  //         border-top: 10px solid transparent;
-  //         border-right: 10px solid #fff;
-  //         border-left: 10px solid transparent;
-  //         border-bottom: 10px solid transparent;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-left: 45px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .bottom {
-  //         bottom: -2px;
-  //         left: 50%;
-  //         transform: translateX(-50%);
-  //         border-top: 10px solid #fff;
-  //         border-right: 10px solid transparent;
-  //         border-left: 10px solid transparent;
-  //         border-bottom: 10px solid transparent;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-bottom: 45px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .right {
-  //         top: 50%;
-  //         right: -2px;
-  //         transform: translateY(-50%);
-  //         border-top: 10px solid transparent;
-  //         border-right: 10px solid transparent;
-  //         border-left: 10px solid #fff;
-  //         border-bottom: 10px solid transparent;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-right: 45px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .blue-bgc {
-  //         width: 90px;
-  //         height: 90px;
-  //         position: absolute;
-  //         top: 0;
-  //         left: 0;
-  //         z-index: 1;
-  //         border-top: 45px solid transparent;
-  //         border-right: 45px solid transparent;
-  //         border-left: 45px solid transparent;
-  //         border-bottom: 45px solid transparent;
-  //       }
-  //     }
-  //   }
-
-  //   .camera-select {
-  //     display: flex;
-  //     display: flex;
-  //     justify-content: center;
-
-  //     :deep() {
-  //       .el-select {
-  //         width: 250px;
-  //         height: 40px;
-  //         line-height: 40px;
-  //         background-color: rgba(0, 0, 0, 0.5);
-  //         border-radius: 5px;
-
-  //         .el-input {
-  //           width: auto;
-  //           height: auto;
-
-  //           .el-input__inner {
-  //             background-color: transparent;
-  //             box-shadow: none;
-  //             border: 0;
-  //             color: #fff;
-  //           }
-
-  //           .el-input__suffix {
-  //             display: flex;
-  //             align-items: center;
-  //           }
-  //         }
-  //       }
-  //     }
-
-  //     .load-button {
-  //       font-style: normal;
-  //       background: rgba(21, 138, 255, 0.5);
-  //       margin-left: 10px;
-  //       padding: 0 5px;
-
-  //       &:hover {
-  //         color: #409eff;
-  //       }
-  //     }
-  //   }
-
-  //   .btn-group {
-  //     display: flex;
-  //     flex-wrap: wrap;
-  //     margin-top: 10px;
-  //     width: 300px;
-  //     padding: 0px 20px;
-
-  //     .btn-item {
-  //       display: flex;
-  //       // width: 140px;
-  //       box-sizing: border-box;
-  //       margin: 2px 10px;
-  //       cursor: pointer;
-
-  //       img {
-  //         width: 30px;
-  //         height: 30px;
-  //         margin-right: 3px;
-  //       }
-
-  //       div {
-  //         font-size: 18px;
-  //         font-style: normal;
-  //       }
-  //     }
-  //   }
-  // }
-
-  // .payload-control {
-  //   height: 100%;
-  //   display: flex;
-  //   justify-content: center;
-  //   flex-direction: column;
-  //   gap: 15px;
-
-  //   .left-box {
-  //     display: flex;
-  //     // flex-direction: column;
-  //     align-items: center;
-  //     justify-content: center;
-  //     gap: 10px;
-
-  //     .circle-box {
-  //       width: 100px;
-  //       height: 100px;
-  //       border-radius: 50%;
-  //       overflow: hidden;
-  //       background-color: rgba(0, 0, 0, 0.5);
-  //       // -webkit-mask-image: radial-gradient(
-  //       //   circle,
-  //       //   transparent 35%,
-  //       //   white 35%
-  //       // );
-  //       // mask-image: radial-gradient(circle, transparent 35%, white 35%);
-  //       position: relative;
-  //       // border: 1px solid red;
-
-  //       .top,
-  //       .left,
-  //       .bottom,
-  //       .right {
-  //         width: 10px;
-  //         height: 10px;
-  //         position: absolute;
-  //         cursor: pointer;
-  //         z-index: 2;
-  //       }
-
-  //       .top {
-  //         top: -2px;
-  //         left: 50%;
-  //         transform: translateX(-50%);
-  //         border-top: 10px solid transparent;
-  //         border-right: 10px solid transparent;
-  //         border-left: 10px solid transparent;
-  //         border-bottom: 10px solid #fff;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-top: 50px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .left {
-  //         top: 50%;
-  //         left: -2px;
-  //         transform: translateY(-50%);
-  //         border-top: 10px solid transparent;
-  //         border-right: 10px solid #fff;
-  //         border-left: 10px solid transparent;
-  //         border-bottom: 10px solid transparent;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-left: 50px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .bottom {
-  //         bottom: -2px;
-  //         left: 50%;
-  //         transform: translateX(-50%);
-  //         border-top: 10px solid #fff;
-  //         border-right: 10px solid transparent;
-  //         border-left: 10px solid transparent;
-  //         border-bottom: 10px solid transparent;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-bottom: 50px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .right {
-  //         top: 50%;
-  //         right: -2px;
-  //         transform: translateY(-50%);
-  //         border-top: 10px solid transparent;
-  //         border-right: 10px solid transparent;
-  //         border-left: 10px solid #fff;
-  //         border-bottom: 10px solid transparent;
-
-  //         &:hover {
-  //           &~.blue-bgc {
-  //             border-right: 50px solid #409eff;
-  //           }
-  //         }
-  //       }
-
-  //       .reset-center {
-  //         position: absolute;
-  //         width: 40%;
-  //         height: 40%;
-  //         left: 50%;
-  //         top: 50%;
-  //         transform: translate(-50%, -50%);
-  //         border-radius: 50%;
-  //         background-color: rgb(63, 66, 68);
-  //         z-index: 2;
-  //         cursor: pointer;
-  //         display: flex;
-  //         justify-content: center;
-  //         align-items: center;
-
-  //         i {
-  //           color: #fff;
-  //           font-size: 20px;
-  //           font-weight: bolder;
-  //         }
-
-  //         &:hover {
-  //           background-color: #409eff;
-  //         }
-  //       }
-
-  //       .blue-bgc {
-  //         width: 100px;
-  //         height: 100px;
-  //         position: absolute;
-  //         top: 0;
-  //         left: 0;
-  //         z-index: 1;
-  //         border-top: 50px solid transparent;
-  //         border-right: 50px solid transparent;
-  //         border-left: 50px solid transparent;
-  //         border-bottom: 50px solid transparent;
-  //       }
-  //     }
-
-  //     .payload-info {
-  //       font-size: 14px;
-  //     }
-
-  //     .btn-group {
-  //       width: auto;
-  //       display: flex;
-  //       flex-wrap: wrap;
-  //       width: 200px;
-
-  //       // flex-direction: column;
-  //       // justify-content: center;
-  //       .btn-item {
-  //         width: 100px;
-  //         display: flex;
-  //         box-sizing: border-box;
-  //         cursor: pointer;
-
-  //         img {
-  //           width: 30px;
-  //           height: 30px;
-  //           margin-right: 3px;
-  //         }
-
-  //         div {
-  //           height: 100%;
-  //           font-size: 17px;
-  //           line-height: 30px;
-  //           font-style: normal;
-  //         }
-  //       }
-  //     }
-  //   }
-
-  //   .right-box {
-  //     position: relative;
-  //     flex-shrink: 0;
-  //     display: flex;
-
-  //     // justify-content: center;
-  //     .btn-group {
-  //       width: auto;
-  //       display: flex;
-  //       flex-wrap: wrap;
-  //       width: 290px;
-  //       justify-content: center;
-
-  //       .btn-item {
-  //         width: 140px;
-  //         display: flex;
-  //         box-sizing: border-box;
-  //         cursor: pointer;
-
-  //         img {
-  //           width: 30px;
-  //           height: 30px;
-  //           margin-right: 3px;
-  //         }
-
-  //         div {
-  //           width: 100px;
-  //           height: 100%;
-  //           font-size: 17px;
-  //           line-height: 30px;
-  //           font-style: normal;
-  //         }
-  //       }
-  //     }
-
-  //     .payload-info {
-  //       font-size: 14px;
-
-  //       .info-item {
-  //         display: flex;
-  //         align-items: center;
-  //         gap: 10px;
-  //         height: 25px;
-
-  //         div:first-child {
-  //           width: 170px;
-  //         }
-
-  //         div:nth-child(2) {
-  //           :deep() {
-  //             .el-input-number {
-  //               width: 70px;
-  //               height: 20px;
-
-  //               &__decrease,
-  //               &__increase {
-  //                 width: 18px;
-  //                 height: 18px;
-  //                 line-height: 18px;
-  //                 background-color: transparent;
-  //                 border-right: 0;
-  //                 border-left: 0;
-
-  //                 i {
-  //                   color: #fff;
-  //                   font-size: 17px;
-  //                   font-weight: bold;
-  //                 }
-  //               }
-
-  //               .el-input {
-  //                 margin: 0;
-  //                 padding: 0;
-  //                 height: 18px;
-  //                 display: flex;
-  //                 justify-content: center;
-
-  //                 &__inner {
-  //                   padding: 0;
-  //                 }
-
-  //                 input {
-  //                   width: 80px;
-  //                   height: 18px;
-  //                   overflow: hidden;
-  //                   font-size: 14px;
-  //                   font-weight: bold;
-  //                 }
-  //               }
-  //             }
-  //           }
-  //         }
-  //       }
-  //     }
-  //   }
-  // }
 }
 </style>
\ No newline at end of file
diff --git a/src/views/hooks/droneFly.ts b/src/views/hooks/droneFly.ts
index 4990445..3cfebf3 100644
--- a/src/views/hooks/droneFly.ts
+++ b/src/views/hooks/droneFly.ts
@@ -80,11 +80,11 @@
             ssLinePath
           )
           let domain = sessionStorage.getItem('domain')
-          if (domain !== '0') {
-            addFlyLaser(
-              deviceInfo.payloads[0]
-            )
-          }
+          // if (domain !== '0') {
+          //   addFlyLaser(
+          //     deviceInfo.payloads[0]
+          //   )
+          // }
           setelCamera(
             viewDroneInfo.longitude,
             viewDroneInfo.latitude,
@@ -109,7 +109,6 @@
         }
       } else {
         if (deviceInfo.mode_code && [3, 4, 5, 9, 10, 17].includes(deviceInfo.mode_code)) {
-          // 暂时把视锥代码注释掉
           initCreateFrustum(deviceInfo, viewDroneInfo)
           addFlyGltf(
             viewDroneInfo.longitude,
@@ -122,11 +121,11 @@
             ssLinePath
           )
           let domain = sessionStorage.getItem('domain')
-          if (domain !== '0') {
-            addFlyLaser(
-              deviceInfo.payloads[0]
-            )
-          }
+          // if (domain !== '0') {
+          //   addFlyLaser(
+          //     deviceInfo.payloads[0]
+          //   )
+          // }
         }
       }
       const imgRightBlue = new URL('@/assets/images/arrow-right-pink.png', import.meta.url).href
@@ -149,7 +148,7 @@
         })
       }
       
-      if (data.deviceInfo[data.currentSn].mode_code && [3, 4, 5, 9, 10, 17].includes(deviceInfo.mode_code)) {
+      if (data.deviceInfo[data.currentSn].mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) {
         if (switchSaving) return (switchSaving = false)
         const newPositions = globalCesium.Cartesian3.fromDegrees(
           data.deviceInfo[data.currentSn].longitude,
diff --git a/tsconfig.json b/tsconfig.json
index aea4801..8a1e4db 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -17,7 +17,7 @@
       "dom",
     ],
     "paths": {
-      "/@/*": [
+      "@/*": [
         "src/*"
       ],
     }
diff --git a/vite.config.ts b/vite.config.ts
index 455268f..8d9d12b 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -20,8 +20,8 @@
   },
   server: {
     open: true,
-    // host: '192.168.1.79',
-    // port: 5173,
+    host: '192.168.1.178',
+    port: 5173,
     proxy: {
       '/index/api': {
         target: 'https://wrj.shuixiongit.com/index/api',

--
Gitblit v1.9.3