阶段性代码提交
This commit is contained in:
parent
4b3804fce8
commit
a1770d8544
|
|
@ -16,9 +16,11 @@ declare module 'vue' {
|
|||
APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
|
||||
AProgress: typeof import('ant-design-vue/es')['Progress']
|
||||
ARadio: typeof import('ant-design-vue/es')['Radio']
|
||||
ARadioButton: typeof import('ant-design-vue/es')['RadioButton']
|
||||
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
|
||||
ARow: typeof import('ant-design-vue/es')['Row']
|
||||
ASpin: typeof import('ant-design-vue/es')['Spin']
|
||||
ASwitch: typeof import('ant-design-vue/es')['Switch']
|
||||
ATooltip: typeof import('ant-design-vue/es')['Tooltip']
|
||||
ElButton: typeof import('element-plus/es')['ElButton']
|
||||
ElCol: typeof import('element-plus/es')['ElCol']
|
||||
|
|
|
|||
|
|
@ -83,3 +83,11 @@ export async function getAirWayPointsToJson(url) {
|
|||
return mapPointList
|
||||
}
|
||||
}
|
||||
//获取天气
|
||||
export function getweatherApi(params) {
|
||||
return request({
|
||||
url: `/api/airportLog/getCallback`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
//无人机指令
|
||||
import request from '@/utils/request'
|
||||
import axios from 'axios'
|
||||
|
||||
//检查无人机状态
|
||||
export function checkAirportRunStatusApi(params) {
|
||||
return request({
|
||||
url: `/api/airport/queryAirportRunStatus`,
|
||||
method: 'get',
|
||||
params: params,
|
||||
})
|
||||
}
|
||||
|
||||
//指令操作
|
||||
export function droneCommandExecuteApi(data) {
|
||||
return request({
|
||||
url: `/api/command/droneCommandExecute`,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
|
|
@ -41,7 +41,7 @@ if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
|
|||
id_token:
|
||||
'eyJraWQiOiI3M2I5NTI0Ni02NjI2LTQ3N2YtYWFmYS1kMDJiODFhNjFkZmYiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjc2FkbWluIiwiYXVkIjoidHVvaGVuZy1haXJwb3J0LWFkbWluIiwicm9sZSI6WyJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tbXAiLCJ0dW9oZW5nLXBpbG90LW1wIiwidHVvaGVuZy13YXRlcndheS1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLW1wIiwidHVvaGVuZy1haXJwb3J0U2NyZWVuLWFkbWluIiwidHVvaGVuZy1kbXAtbXAiLCJ0dW9oZW5nLWZseXBvcnRhbC1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLWFkbWluIiwidHVvaGVuZy1oaHotYWRtaW4iLCJ0dW9oZW5nLWhoei1tcCIsInR1b2hlbmctZnJlZXdheS1hZG1pbiIsInR1b2hlbmctd2VwdHNwLW1wIiwidHVvaGVuZy1waWxvdC1hZG1pbiIsInR1b2hlbmctc3BhY2V0aW1lLWFkbWluIiwidHVvaGVuZy1hbGVydC1tcCIsInR1b2hlbmctYnVzaW5lc3MtYWRtaW4iLCJ0dW9oZW5nLWJ1c2luZXNzLW1wIiwidHVvaGVuZy13ZXB0c3AtYWRtaW4iLCJ0dW9oZW5nLWFpcm1vbml0b3ItbXAiLCJ0dW9oZW5nLWFpcnBvcnQtbXAiLCJ0dW9oZW5nLWFpcm1vbml0b3ItYWRtaW4iLCJ0dW9oZW5nLWFsZXJ0LWFkbWluIiwidHVvaGVuZy1haXJwb3J0LWFkbWluIiwidHVvaGVuZy13YXRlcndheS1tcCIsInR1b2hlbmctZnJlZXdheS1tcCIsInR1b2hlbmctZG1wLWFkbWluIiwidHVvaGVuZy1zcGFjZXRpbWUtbXAiXSwiYXpwIjoidHVvaGVuZy1haXJwb3J0LWFkbWluIiwiaXNzIjoiaHR0cHM6XC9cL2xvZ2luLXRlc3QudC1hYXJvbi5jb20iLCJleHAiOjE3NTUwNzA3MjMsImlhdCI6MTc1NTA2ODkyM30.deCJZsyu2dgLrbl-rnnoYTBhZD59zUJoLzFkadL7m_RJ_jWlvQvLXjQn2h0tuba0HRN7ZT2COVmNxTgLLATbdJU2SQ-_wVt30XwyX1hauDV1DALzdk5UiRelP2lIJlPWZKhpqMX52gYsGZXyliErbORBLMc_920vTZDHKeuiriuODXlT7__5MnKFTCGXDegZRPALY7kLwpQfL4DSn3ILeSGMIqU7dPx3kM4CV1iIJs2f2jEZT4HOzXy51o_GjCW7enY2qWERRfvsLIX8a8DPg0YvN-j3AHoUoKWYX_1ZCmD3eGHhqQbEvZsLJV2J6MlwF6eZOkz08M-mdkyU2_Trpg',
|
||||
access_token:
|
||||
'eyJraWQiOiI3M2I5NTI0Ni02NjI2LTQ3N2YtYWFmYS1kMDJiODFhNjFkZmYiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjc2FkbWluIiwiaXNBYmxlIjoxLCJpc3MiOiJodHRwczpcL1wvbG9naW4tdGVzdC50LWFhcm9uLmNvbSIsImF1ZCI6InR1b2hlbmctYWlycG9ydC1hZG1pbiIsIm5iZiI6MTc1NjA4MjkxNiwib1VzZXJJZCI6NTQzLCJzY29wZSI6WyJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tbXAiLCJ0dW9oZW5nLXBpbG90LW1wIiwidHVvaGVuZy13YXRlcndheS1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLW1wIiwidHVvaGVuZy1haXJwb3J0U2NyZWVuLWFkbWluIiwidHVvaGVuZy1kbXAtbXAiLCJ0dW9oZW5nLWZseXBvcnRhbC1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLWFkbWluIiwidHVvaGVuZy1oaHotYWRtaW4iLCJ0dW9oZW5nLWhoei1tcCIsInR1b2hlbmctZnJlZXdheS1hZG1pbiIsInR1b2hlbmctd2VwdHNwLW1wIiwidHVvaGVuZy1waWxvdC1hZG1pbiIsInR1b2hlbmctc3BhY2V0aW1lLWFkbWluIiwidHVvaGVuZy1hbGVydC1tcCIsInR1b2hlbmctYnVzaW5lc3MtYWRtaW4iLCJ0dW9oZW5nLWJ1c2luZXNzLW1wIiwidHVvaGVuZy13ZXB0c3AtYWRtaW4iLCJ0dW9oZW5nLWFpcm1vbml0b3ItbXAiLCJ0dW9oZW5nLWFpcnBvcnQtbXAiLCJ0dW9oZW5nLWFpcm1vbml0b3ItYWRtaW4iLCJ0dW9oZW5nLWFsZXJ0LWFkbWluIiwidHVvaGVuZy1haXJwb3J0LWFkbWluIiwidHVvaGVuZy13YXRlcndheS1tcCIsInR1b2hlbmctZnJlZXdheS1tcCIsInR1b2hlbmctZG1wLWFkbWluIiwidHVvaGVuZy1zcGFjZXRpbWUtbXAiXSwiY2xpZW50Um9sZUxpc3QiOiJbe1wiY2xpZW50SWRcIjpcInR1b2hlbmctZmx5cG9ydGFsLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1idXNpbmVzcy1tcFwiLFwicm9sZUlkXCI6MTE0NX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYnVzaW5lc3MtYWRtaW5cIixcInJvbGVJZFwiOjExNDV9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXNwYWNldGltZS1hZG1pblwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctc3BhY2V0aW1lLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1oaHotYWRtaW5cIixcInJvbGVJZFwiOjEwMDN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWhoei1tcFwiLFwicm9sZUlkXCI6MTAwM30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctd2F0ZXJ3YXktYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXdhdGVyd2F5LW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1kbXAtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWRtcC1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWlycG9ydC1hZG1pblwiLFwicm9sZUlkXCI6NjYzfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJwb3J0LW1wXCIsXCJyb2xlSWRcIjo2NjN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFsZXJ0LWFkbWluXCIsXCJyb2xlSWRcIjoyN30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWxlcnQtbXBcIixcInJvbGVJZFwiOjI3fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtYWRtaW5cIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtbXBcIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy10ZWxlY29tdW1hbGUtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXRlbGVjb211bWFsZS1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctcGlsb3QtbXBcIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXBpbG90LWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1mcmVld2F5LW1wXCIsXCJyb2xlSWRcIjo1OH0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctZnJlZXdheS1hZG1pblwiLFwicm9sZUlkXCI6NTh9XSIsImV4cCI6MTc1NjE2OTMxNiwiaXNFeHBpcmUiOjEsImlhdCI6MTc1NjA4MjkxNiwidXNlcm5hbWUiOiJjc2FkbWluIn0.cU4vIbNjPppa9Mvyhc5uFXcVHum8xjf-B3HTjHuI8M_smFlUsOj8WFoLkxrB0GZmX_8fspxlcXoQaQ0ukFk1jF1Eyn1upL5mKVi8y_PCZPKJzXGU-67U2pA3MMWrztGQEmmDn_zi33Qi8BiG4cqB9nfqj4cqes50Nrq_LNPCgLjAcnfnYnZss9--3-SQqD15rLT7juVj9GfBhIphtVtAXoaftsQiccEW8NXTUH49Knpw8YlhTWN4Ibi92sQ353EcCVAqZ1iDuqlX4WcT4IRRzz5y248Bbp6R-lbJm92NjhAeQepb67io7muSAOrpTDZ2cfgd0bUCwooCD-QixNxWNw',
|
||||
'eyJraWQiOiI3M2I5NTI0Ni02NjI2LTQ3N2YtYWFmYS1kMDJiODFhNjFkZmYiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjc2FkbWluIiwiaXNBYmxlIjoxLCJpc3MiOiJodHRwczpcL1wvbG9naW4tdGVzdC50LWFhcm9uLmNvbSIsImF1ZCI6InR1b2hlbmctYWlycG9ydC1hZG1pbiIsIm5iZiI6MTc1NjE5MjU5Mywib1VzZXJJZCI6NTQzLCJzY29wZSI6WyJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tbXAiLCJ0dW9oZW5nLXBpbG90LW1wIiwidHVvaGVuZy13YXRlcndheS1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLW1wIiwidHVvaGVuZy1haXJwb3J0U2NyZWVuLWFkbWluIiwidHVvaGVuZy1kbXAtbXAiLCJ0dW9oZW5nLWZseXBvcnRhbC1hZG1pbiIsInR1b2hlbmctdGVsZWNvbXVtYWxlLWFkbWluIiwidHVvaGVuZy1oaHotYWRtaW4iLCJ0dW9oZW5nLWhoei1tcCIsInR1b2hlbmctZnJlZXdheS1hZG1pbiIsInR1b2hlbmctd2VwdHNwLW1wIiwidHVvaGVuZy1waWxvdC1hZG1pbiIsInR1b2hlbmctc3BhY2V0aW1lLWFkbWluIiwidHVvaGVuZy1hbGVydC1tcCIsInR1b2hlbmctYnVzaW5lc3MtYWRtaW4iLCJ0dW9oZW5nLWJ1c2luZXNzLW1wIiwidHVvaGVuZy13ZXB0c3AtYWRtaW4iLCJ0dW9oZW5nLWFpcm1vbml0b3ItbXAiLCJ0dW9oZW5nLWFpcnBvcnQtbXAiLCJ0dW9oZW5nLWFpcm1vbml0b3ItYWRtaW4iLCJ0dW9oZW5nLWFsZXJ0LWFkbWluIiwidHVvaGVuZy1haXJwb3J0LWFkbWluIiwidHVvaGVuZy13YXRlcndheS1tcCIsInR1b2hlbmctZnJlZXdheS1tcCIsInR1b2hlbmctZG1wLWFkbWluIiwidHVvaGVuZy1zcGFjZXRpbWUtbXAiXSwiY2xpZW50Um9sZUxpc3QiOiJbe1wiY2xpZW50SWRcIjpcInR1b2hlbmctZmx5cG9ydGFsLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1idXNpbmVzcy1tcFwiLFwicm9sZUlkXCI6MTE0NX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYnVzaW5lc3MtYWRtaW5cIixcInJvbGVJZFwiOjExNDV9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFpcnBvcnRTY3JlZW4tYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXNwYWNldGltZS1hZG1pblwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctc3BhY2V0aW1lLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1oaHotYWRtaW5cIixcInJvbGVJZFwiOjEwMDN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWhoei1tcFwiLFwicm9sZUlkXCI6MTAwM30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctd2F0ZXJ3YXktYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXdhdGVyd2F5LW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1kbXAtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWRtcC1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWlycG9ydC1hZG1pblwiLFwicm9sZUlkXCI6NjYzfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJwb3J0LW1wXCIsXCJyb2xlSWRcIjo2NjN9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLWFsZXJ0LWFkbWluXCIsXCJyb2xlSWRcIjoyN30se1wiY2xpZW50SWRcIjpcInR1b2hlbmctYWxlcnQtbXBcIixcInJvbGVJZFwiOjI3fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1haXJtb25pdG9yLW1wXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtYWRtaW5cIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy13ZXB0c3AtbXBcIixcInJvbGVJZFwiOjI1fSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy10ZWxlY29tdW1hbGUtYWRtaW5cIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXRlbGVjb211bWFsZS1tcFwiLFwicm9sZUlkXCI6MX0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctcGlsb3QtbXBcIixcInJvbGVJZFwiOjF9LHtcImNsaWVudElkXCI6XCJ0dW9oZW5nLXBpbG90LWFkbWluXCIsXCJyb2xlSWRcIjoxfSx7XCJjbGllbnRJZFwiOlwidHVvaGVuZy1mcmVld2F5LW1wXCIsXCJyb2xlSWRcIjo1OH0se1wiY2xpZW50SWRcIjpcInR1b2hlbmctZnJlZXdheS1hZG1pblwiLFwicm9sZUlkXCI6NTh9XSIsImV4cCI6MTc1NjI3ODk5MywiaXNFeHBpcmUiOjEsImlhdCI6MTc1NjE5MjU5MywidXNlcm5hbWUiOiJjc2FkbWluIn0.gsi2ikNb2s-X4mpePoQfrSv-Z7j-fyXdVCR00EbvJDIhzy3cXbWF59blPF5KX3h2hFtbLeb37UxeTOvXIYSx0cuRAPGoe5IIznTmy8yWkRLrEH4LKLdBYqRDKLerTOFLfrQ3C5I87ziFNGwlaGWlFSokf4rFbcaBX9pSTu9OECJUSd1sb-bfliaN9XbxXnEfjdBpbjD_PF-r6utqveyzgOR5r8rgguCz0BZ6aUYLDhpUa7elAh6GR9i0l5sdYIiGjhN4JJ1362C8V8EZDoiWFO8SgPqjznNceUwZ8Kkd-7hDjnBfHaX0mONai78vihN2-pm1C5bKFmJ8da35iarilA',
|
||||
refresh_token:
|
||||
'HNyAXnoDhR2kgjXUSVwqMldvgzazvaY3tVlCodSiDon7fA7P8Ci3BMsnk31cjeSKwcbsPzUaMdCdBilBhSqQ1dZLk-Md-ERqh5mbbeu7rJDWX4MexO0eKtRBwz-mbnbR',
|
||||
token_type: 'Bearer',
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ onUnmounted(() => {
|
|||
<span v-if="processStatus == 'success' && precent == 100" class="success_text">SUCCESS</span>
|
||||
<span v-if="processStatus == 'error'" class="fail_text">FAILED</span>
|
||||
|
||||
<a-spin :indicator="indicator" v-if="processStatus == null" />
|
||||
<a-spin :indicator="indicator" v-if="precent != 100" />
|
||||
</div>
|
||||
<a-progress :percent="precent" :show-info="false" trailColor="#ffffff" />
|
||||
|
||||
|
|
|
|||
|
|
@ -14,14 +14,23 @@ import {
|
|||
import { useAirPortSocketStore } from '@/stores/airportSocket.js'
|
||||
const ScreenComp = defineAsyncComponent(() => import('@/views/carbin/toolComp/screen.vue'))
|
||||
|
||||
const emits = defineEmits(['switchView'])
|
||||
const props = defineProps({
|
||||
big_area_showType: String,
|
||||
})
|
||||
|
||||
const emits = defineEmits(['switchView', 'switchScreenVideo'])
|
||||
|
||||
const airPortSocketStore = useAirPortSocketStore()
|
||||
let size1Img = ref(new URL(`@/assets/icons/size1active.png`, import.meta.url).href)
|
||||
let size2Img = ref(new URL(`@/assets/icons/size2.png`, import.meta.url).href)
|
||||
let viewMode = ref(1) //1-1/4方式 2-对半方式
|
||||
let littleViewMode = ref(1) //1-舱外视频 2-舱内视频 3-无人机视频
|
||||
let littleViewModeName = ref('舱外画面')
|
||||
let littleViewMode = ref(2) //1-舱外视频 2-舱内视频 3-无人机视频
|
||||
let littleViewModeName = ref('舱内画面')
|
||||
|
||||
//飞机高度
|
||||
let planeAlt = 0
|
||||
//已修改过小窗的视频类型
|
||||
let isModifedSmallScreen = ref(false)
|
||||
let planeStateList = reactive({
|
||||
vspeed: {
|
||||
id: 1,
|
||||
|
|
@ -76,6 +85,7 @@ let planeStateList = reactive({
|
|||
value: '-',
|
||||
content: '无人机<br>偏航角',
|
||||
touch: false,
|
||||
unit: '°',
|
||||
},
|
||||
camerapitch: {
|
||||
id: 7,
|
||||
|
|
@ -84,6 +94,7 @@ let planeStateList = reactive({
|
|||
value: '-',
|
||||
content: '云台<br>俯仰角',
|
||||
touch: false,
|
||||
unit: '°',
|
||||
},
|
||||
camerayaw: {
|
||||
id: 8,
|
||||
|
|
@ -92,6 +103,7 @@ let planeStateList = reactive({
|
|||
value: '-',
|
||||
content: '云台<br>偏航角',
|
||||
touch: false,
|
||||
unit: '°',
|
||||
},
|
||||
})
|
||||
let selectedAirPort = ref(1)
|
||||
|
|
@ -117,35 +129,75 @@ const switchPlaneVideo = (viewtype) => {
|
|||
switch (viewtype) {
|
||||
case 1:
|
||||
littleViewModeName.value = '舱外画面'
|
||||
small_area_showType.value = 'video_out'
|
||||
break
|
||||
case 2:
|
||||
littleViewModeName.value = '舱内画面'
|
||||
small_area_showType.value = 'video_in'
|
||||
break
|
||||
case 3:
|
||||
littleViewModeName.value = '无人机画面'
|
||||
small_area_showType.value = 'video_plane'
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
//切换小窗/大窗
|
||||
const switch_screen_fn = () => {
|
||||
let current_small_area_showType = toRaw(small_area_showType.value)
|
||||
if (props.big_area_showType == 'video_out') {
|
||||
littleViewModeName.value = '舱外画面'
|
||||
littleViewMode.value = 1
|
||||
} else if (props.big_area_showType == 'video_in') {
|
||||
littleViewModeName.value = '舱内画面'
|
||||
littleViewMode.value = 2
|
||||
} else if (props.big_area_showType == 'video_plane') {
|
||||
littleViewModeName.value = '无人机画面'
|
||||
littleViewMode.value = 3
|
||||
}
|
||||
small_area_showType.value = props.big_area_showType
|
||||
|
||||
emits('switchScreenVideo', current_small_area_showType)
|
||||
// if(small_area_showType.value=='')
|
||||
}
|
||||
|
||||
//设置socket的值
|
||||
const setCurrentData = (data) => {
|
||||
// console.log(data)
|
||||
// console.log(data.alt)
|
||||
|
||||
if (data.alt > 0 && !isModifedSmallScreen) {
|
||||
//飞行中
|
||||
littleViewMode.value = 1
|
||||
littleViewModeName.value = '舱外画面'
|
||||
small_area_showType.value = 'video_in'
|
||||
//不允许再修改了
|
||||
isModifedSmallScreen.value = true
|
||||
}
|
||||
|
||||
//飞机高度
|
||||
// planeAlt = data.alt ? data.alt : 0
|
||||
//爬升速度
|
||||
planeStateList.vspeed.value = data.vspeed
|
||||
planeStateList.vspeed.value = Number(data.vspeed) ? Number(data.vspeed).toFixed(1) : '-'
|
||||
//平飞速度
|
||||
planeStateList.hspeed.value = data.hspeed
|
||||
planeStateList.hspeed.value = Number(data.hspeed) ? Number(data.hspeed).toFixed(1) : '-'
|
||||
//距离机场
|
||||
planeStateList.distToHome.value = data.distToHome
|
||||
planeStateList.distToHome.value = Number(data.distToHome)
|
||||
? Number(data.distToHome).toFixed(1)
|
||||
: '-'
|
||||
//海拔高度
|
||||
planeStateList.altitude.value = data.altitude
|
||||
planeStateList.altitude.value = Number(data.altitude) ? Number(data.altitude).toFixed(1) : '-'
|
||||
//无人机俯仰角
|
||||
planeStateList.pitch.value = data.pitch
|
||||
planeStateList.pitch.value = Number(data.pitch) ? Number(data.pitch).toFixed(1) : '-'
|
||||
//无人机偏航角
|
||||
planeStateList.yaw.value = data.yaw
|
||||
planeStateList.yaw.value = Number(data.yaw) ? Number(data.yaw).toFixed(1) : '-'
|
||||
//云台俯仰角
|
||||
planeStateList.camerapitch.value = data.camerapitch
|
||||
planeStateList.camerapitch.value = Number(data.camerapitch)
|
||||
? Number(data.camerapitch).toFixed(1)
|
||||
: '-'
|
||||
//云台偏航角
|
||||
planeStateList.camerayaw.value = data.camerayaw
|
||||
planeStateList.camerayaw.value = Number(data.camerayaw) ? Number(data.camerayaw).toFixed(1) : '-'
|
||||
}
|
||||
|
||||
//切换视频位置
|
||||
|
|
@ -240,6 +292,7 @@ airPortSocketStore.$subscribe((mutate, state) => {
|
|||
</div>
|
||||
<div
|
||||
class="w-[26px] h-[24px] bg-[rgba(25,27,36,0.59)] border border-[#191B24] rounded-sm text-center"
|
||||
@click="switch_screen_fn"
|
||||
>
|
||||
<span
|
||||
class="iconfont icon-qiehuan text-[#ffffff] cursor-pointer"
|
||||
|
|
@ -285,9 +338,9 @@ airPortSocketStore.$subscribe((mutate, state) => {
|
|||
v-html="item.content"
|
||||
></span>
|
||||
|
||||
<span class="absolute bottom-0.5 left-0 right-0 m-auto text-[#ffffff]">{{
|
||||
item.value
|
||||
}}</span>
|
||||
<span class="absolute bottom-0.5 left-0 right-0 m-auto text-[#ffffff]"
|
||||
>{{ item.value }}<span v-if="item.value != '-'">{{ item.unit }}</span></span
|
||||
>
|
||||
</div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<script setup>
|
||||
import { ref, defineAsyncComponent, onMounted, watch, toRaw, defineProps, reactive } from 'vue'
|
||||
import { message } from 'ant-design-vue'
|
||||
import { useAirPortSocketStore } from '@/stores/airportSocket.js'
|
||||
//播放器-组件
|
||||
const ScreenComp = defineAsyncComponent(() => import('@/views/carbin/toolComp/screen.vue'))
|
||||
|
|
@ -24,7 +25,13 @@ const rightSwitchVideo = defineAsyncComponent(
|
|||
//飞机控制器
|
||||
const planeControl = defineAsyncComponent(() => import('@/views/carbin/toolComp/planeControl.vue'))
|
||||
//接口
|
||||
import { queryAirportApi, queryAirLineApi, getAirWayPointsToJson } from '@/apis/common'
|
||||
import {
|
||||
queryAirportApi,
|
||||
queryAirLineApi,
|
||||
getAirWayPointsToJson,
|
||||
getweatherApi,
|
||||
} from '@/apis/common'
|
||||
import { checkAirportRunStatusApi, droneCommandExecuteApi } from '@/apis/droneCommand.js'
|
||||
|
||||
let leftPlaneWidth = ref('25%')
|
||||
let rightPlaneWidth = ref('75%')
|
||||
|
|
@ -43,6 +50,12 @@ const airPortSocketStore = useAirPortSocketStore()
|
|||
let isUsedSocket = ref(false)
|
||||
//卫星数量
|
||||
let statelliteCount = ref(0)
|
||||
let taskStatus = ref('continue')
|
||||
//是否显示继续按钮(针对急停操作)
|
||||
let command5 = ref(false)
|
||||
|
||||
//timeout
|
||||
let weatherTimeOut = null
|
||||
|
||||
//当前机场数据
|
||||
let currentAirPortInfo = ref(null)
|
||||
|
|
@ -79,6 +92,11 @@ const switchViewFn = (viewPrecent) => {
|
|||
}
|
||||
sendGisMessage(params)
|
||||
}
|
||||
//底部切换小屏和大屏的视频
|
||||
const bottom_switchScreenVideo = (smallVideoType) => {
|
||||
big_area_showType.value = smallVideoType
|
||||
}
|
||||
|
||||
//请求机场数据和航线数据
|
||||
const queryAirLine_AirPort = async () => {
|
||||
let params = {
|
||||
|
|
@ -148,6 +166,7 @@ const queryAirPort = async () => {
|
|||
if (res.code == 0) {
|
||||
currentAirPortInfo.value = res.data[0]
|
||||
airPortSocketStore.ceurrentAirPortData = currentAirPortInfo.value
|
||||
// console.log(currentAirPortInfo.value)
|
||||
|
||||
// currentAirPortInfo.value.status = 2
|
||||
|
||||
|
|
@ -162,12 +181,26 @@ const queryAirPort = async () => {
|
|||
|
||||
resetScreen()
|
||||
}
|
||||
console.log('现在的状态是:', currentAirPortStatus.value, statusList[currentAirPortStatus.value])
|
||||
}
|
||||
//轮询
|
||||
setTimeout(() => {
|
||||
queryAirPort()
|
||||
}, 6000)
|
||||
}
|
||||
//获取天气
|
||||
// const getweatherFn = async () => {
|
||||
// let params = {
|
||||
// topic: `/v1/${edgeId}/data/WTH`,
|
||||
// }
|
||||
// let res = await getweatherApi(params)
|
||||
// if (res.code == 0) {
|
||||
// }
|
||||
|
||||
// weatherTimeOut = setTimeout(() => {
|
||||
// getweatherFn()
|
||||
// }, 30000)
|
||||
// }
|
||||
//socket线程
|
||||
const socketFn = (workParams) => {
|
||||
//创建线程,一定要使用type:module的方式引入,否则worker不允许import外部js
|
||||
|
|
@ -176,6 +209,15 @@ const socketFn = (workParams) => {
|
|||
worker.onmessage = function (event) {
|
||||
//来自线程Worker的消息
|
||||
let data = JSON.parse(event.data)
|
||||
|
||||
//判断
|
||||
if (currentAirPortStatus.value == 2) {
|
||||
if (data.alt > 0) {
|
||||
//向gis地图发送飞行消息
|
||||
sendPosToPlane(data)
|
||||
}
|
||||
}
|
||||
|
||||
currentAirPortSocket.value = data
|
||||
//pinia赋值
|
||||
airPortSocketStore.currentAirPort = data
|
||||
|
|
@ -187,76 +229,60 @@ const socketFn = (workParams) => {
|
|||
//iframe map加载完成
|
||||
const iframeLoaded = (iframeContent) => {
|
||||
setTimeout(() => {
|
||||
map_iframeContent = iframeContent
|
||||
let data = JSON.stringify(iframeData)
|
||||
console.log(iframeContent)
|
||||
iframeContent.postMessage(data, '*')
|
||||
}, 0)
|
||||
|
||||
//向无人机发送实时数据
|
||||
// setTimeout(() => {
|
||||
// sendPosToPlane()
|
||||
// }, 2000)
|
||||
}
|
||||
//无人机实时飞机发送消息
|
||||
const sendPosToPlane = () => {
|
||||
const sendPosToPlane = (socketData) => {
|
||||
if (currentAirPortStatus.value != 2) {
|
||||
return
|
||||
}
|
||||
// console.log('开始发送无人机移动数据..................................')
|
||||
let pathArr = iframeData.flyPath
|
||||
|
||||
let len = pathArr.length
|
||||
let startCount = 0
|
||||
// console.log(pathArr)
|
||||
//lngLat
|
||||
//alt
|
||||
function sendPosFn() {
|
||||
if (startCount >= len) {
|
||||
startCount = 0
|
||||
}
|
||||
|
||||
// console.log('当前点是:', startCount)
|
||||
|
||||
let t = {
|
||||
currentPos: 1, //发送的是无人机移动数据
|
||||
currentPos_lon: pathArr[startCount].lngLat[0],
|
||||
currentPos_lat: pathArr[startCount].lngLat[1],
|
||||
currentPos_height: pathArr[startCount].alt,
|
||||
}
|
||||
|
||||
let data = JSON.stringify(t)
|
||||
// console.log(data)
|
||||
map_iframeContent.postMessage(data, '*')
|
||||
|
||||
startCount++
|
||||
setTimeout(() => {
|
||||
sendPosFn()
|
||||
}, 2000)
|
||||
// let pathArr = iframeData.flyPath
|
||||
let virturalDrive_iframe = document.getElementById('virturalDrive_iframe_full')
|
||||
if (!virturalDrive_iframe) {
|
||||
return
|
||||
}
|
||||
let contentWindow = document.getElementById('virturalDrive_iframe_full').contentWindow
|
||||
let t = {
|
||||
currentPos: 1, //发送的是无人机移动数据
|
||||
currentPos_lon: socketData.lon,
|
||||
currentPos_lat: socketData.lat,
|
||||
currentPos_height: socketData.alt,
|
||||
}
|
||||
|
||||
let data = JSON.stringify(t)
|
||||
// console.log(data)
|
||||
if (contentWindow) {
|
||||
contentWindow.postMessage(data, '*')
|
||||
}
|
||||
sendPosFn()
|
||||
}
|
||||
//给gis发送消息
|
||||
const sendGisMessage = (params) => {
|
||||
let contentWindow = document.getElementById('virturalDrive_iframe_full').contentWindow
|
||||
let data = JSON.stringify(params)
|
||||
console.log(data)
|
||||
map_iframeContent.postMessage(data, '*')
|
||||
// console.log(data)
|
||||
contentWindow.postMessage(data, '*')
|
||||
}
|
||||
|
||||
//重置screen
|
||||
const resetScreen = () => {
|
||||
if (currentAirPortStatus.value == 3 || currentAirPortStatus.value == 2) {
|
||||
//准备中 飞行中
|
||||
if (currentAirPortStatus.value == 1) {
|
||||
//空闲状态
|
||||
big_area_showType.value = 'map'
|
||||
leftPlaneWidth.value = '25%'
|
||||
rightPlaneWidth.value = '75%'
|
||||
} else if (currentAirPortStatus.value == 3) {
|
||||
//准备中
|
||||
big_area_showType.value = 'video_out'
|
||||
|
||||
} else if (currentAirPortStatus.value == 2) {
|
||||
//飞行中
|
||||
if (currentAirPortStatus.value == 2) {
|
||||
rightPlaneHeight.value = 'calc(100% - 150px)'
|
||||
rightPlaneBottom.value = '150px'
|
||||
left_flying_area_showType.value = 'map'
|
||||
|
||||
//飞前是舱外 飞中是无人机视角
|
||||
big_area_showType.value = 'video_out'
|
||||
}
|
||||
left_flying_area_showType.value = 'map'
|
||||
//飞前是舱外 飞中是无人机视角
|
||||
big_area_showType.value = 'video_plane'
|
||||
}
|
||||
}
|
||||
//右侧面板切换视频
|
||||
|
|
@ -298,6 +324,72 @@ const switchScreenFn = (type, title) => {
|
|||
switchType = type
|
||||
}
|
||||
|
||||
//无人机指令
|
||||
const droneCommandExecute = async (zhilin) => {
|
||||
//判断无人机状态
|
||||
let checkParams = {
|
||||
droneId: currentAirPortInfo.value.did,
|
||||
}
|
||||
let checkRes = await checkAirportRunStatusApi(checkParams)
|
||||
|
||||
if (checkRes.code != 0) {
|
||||
return
|
||||
}
|
||||
|
||||
let msg = ''
|
||||
switch (zhilin) {
|
||||
case '01':
|
||||
msg = '暂停飞行任务'
|
||||
break
|
||||
case '03':
|
||||
msg = '终止飞行任务'
|
||||
break
|
||||
case '04':
|
||||
msg = '继续飞行任务'
|
||||
break
|
||||
case '5':
|
||||
msg = '机场急停'
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
let params = {}
|
||||
if (zhilin == '5') {
|
||||
params = {
|
||||
command: zhilin,
|
||||
edgeId: currentAirPortInfo.value.code,
|
||||
sensor: 'DroneStop',
|
||||
msg,
|
||||
}
|
||||
} else {
|
||||
params = {
|
||||
airportCode: currentAirPortInfo.value.code,
|
||||
airportId: currentAirPortInfo.value.id,
|
||||
airportType: currentAirPortInfo.value.airport_type,
|
||||
droneId: currentAirPortInfo.value.did,
|
||||
msg,
|
||||
order: {
|
||||
zhilin,
|
||||
taskId: currentAirPortInfo.value.task[0].taskId,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
let res = await droneCommandExecuteApi(params)
|
||||
if (res.code == 0) {
|
||||
if (zhilin == '01') {
|
||||
//悬停 显示继续按钮
|
||||
command5.value = true
|
||||
} else if (zhilin == '04') {
|
||||
//继续飞行任务,隐藏继续按钮
|
||||
command5.value = false
|
||||
}
|
||||
message.success('任务下发成功')
|
||||
} else {
|
||||
message.error(res.msg)
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
//请求航线数据 & 请求机场数据
|
||||
queryAirLine_AirPort()
|
||||
|
|
@ -343,7 +435,7 @@ onMounted(() => {
|
|||
<leftPlaneCheck v-if="currentAirPortStatus == 3" :row="currentAirPortInfo" />
|
||||
|
||||
<!-- 飞行中 地图 -->
|
||||
<div id="left_flying_map" class="leftPlane-area w-full">
|
||||
<div id="left_flying_map" class="leftPlane-area w-full" v-if="currentAirPortStatus == 2">
|
||||
<ScreenComp :showType="left_flying_area_showType" @iframeLoaded="iframeLoaded" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -356,10 +448,34 @@ onMounted(() => {
|
|||
@switchVideo="switchRightVideoFn"
|
||||
/>
|
||||
|
||||
<div class="fullScreen w-full absolute right-0">
|
||||
<!-- <div class="w-full h-10 absolute right-0 bottom-[20px]">
|
||||
<planeControl class="absolute left-0 right-0 top-0 bottom-0 m-auto" />
|
||||
</div> -->
|
||||
<!-- 任务暂停继续 -->
|
||||
<a-radio-group
|
||||
v-if="currentAirPortStatus == 2 && command5"
|
||||
v-model:value="taskStatus"
|
||||
button-style="solid"
|
||||
class="taskBtns absolute left-3 top-5 z-10"
|
||||
size="small"
|
||||
>
|
||||
<a-radio-button value="stop" disabled>任务已暂停</a-radio-button>
|
||||
<a-radio-button value="continue" @click="droneCommandExecute('04')">继续</a-radio-button>
|
||||
</a-radio-group>
|
||||
|
||||
<div
|
||||
:class="
|
||||
currentAirPortStatus == 2
|
||||
? 'fullScreen w-full absolute right-0 lg:h-c150 xk:h-c150 x1k:h-c212 x2k:h-c282'
|
||||
: 'fullScreen w-full absolute right-0 h-full'
|
||||
"
|
||||
>
|
||||
<div
|
||||
class="w-full h-10 absolute right-0 bottom-[20px] z-20"
|
||||
v-if="currentAirPortStatus == 2"
|
||||
>
|
||||
<planeControl
|
||||
class="absolute left-0 right-0 top-0 bottom-0 m-auto"
|
||||
@droneCommandExecute="droneCommandExecute"
|
||||
/>
|
||||
</div>
|
||||
<div id="big_area" class="relative w-full h-full overflow-hidden">
|
||||
<ScreenComp :showType="big_area_showType" @iframeLoaded="iframeLoaded" />
|
||||
</div>
|
||||
|
|
@ -371,14 +487,26 @@ onMounted(() => {
|
|||
v-if="currentAirPortStatus == 2"
|
||||
class="bottomPlane w-full lg:h-[150px] xk:h-[150px] x1k:h-[212px] x2k:h-[282px] bg-[#0B2038] absolute bottom-0 left-0 z-[3]"
|
||||
>
|
||||
<bottomPlaneFlying v-if="currentAirPortStatus == 2" @switchView="switchViewFn" />
|
||||
<bottomPlaneFlying
|
||||
v-if="currentAirPortStatus == 2"
|
||||
:big_area_showType="big_area_showType"
|
||||
@switchView="switchViewFn"
|
||||
@switchScreenVideo="bottom_switchScreenVideo"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
#big_area {
|
||||
.taskBtns {
|
||||
.ant-radio-button-disabled {
|
||||
background: #555a63 !important;
|
||||
}
|
||||
.ant-radio-button-wrapper-disabled {
|
||||
color: #d5f1ff !important;
|
||||
border-color: #555a63 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style lang="scss" scoped>
|
||||
|
|
@ -392,7 +520,10 @@ onMounted(() => {
|
|||
height: 100%;
|
||||
}
|
||||
:deep(.vjs-control-bar) {
|
||||
display: none !important;
|
||||
// display: none !important;
|
||||
}
|
||||
:deep(.live-player-stretch-btn) {
|
||||
// display: none !important;
|
||||
}
|
||||
|
||||
.rem-header {
|
||||
|
|
@ -412,10 +543,10 @@ onMounted(() => {
|
|||
width: var(--rightPlaneWidth);
|
||||
}
|
||||
.fullScreen {
|
||||
--rightPlaneHeight: v-bind(rightPlaneHeight);
|
||||
--rightPlaneBottom: v-bind(rightPlaneBottom);
|
||||
height: var(--rightPlaneHeight);
|
||||
bottom: var(--rightPlaneBottom);
|
||||
// --rightPlaneHeight: v-bind(rightPlaneHeight);
|
||||
// --rightPlaneBottom: v-bind(rightPlaneBottom);
|
||||
// height: var(--rightPlaneHeight);
|
||||
// bottom: var(--rightPlaneBottom);
|
||||
background: #ffffff;
|
||||
}
|
||||
#virturalDrive_iframe_full {
|
||||
|
|
|
|||
|
|
@ -1,12 +1,136 @@
|
|||
<script setup>
|
||||
//飞机控制器
|
||||
import { ref, defineAsyncComponent, onMounted, watch, toRaw, defineProps, reactive } from 'vue'
|
||||
import { useAirPortSocketStore } from '@/stores/airportSocket.js'
|
||||
|
||||
const airPortSocketStore = useAirPortSocketStore()
|
||||
|
||||
const emits = defineEmits(['droneCommandExecute'])
|
||||
|
||||
let items = reactive({
|
||||
battery: {
|
||||
label: '电池循环次数',
|
||||
value: '-',
|
||||
},
|
||||
version: {
|
||||
label: '无人机版本',
|
||||
value: '-',
|
||||
},
|
||||
temperature: {
|
||||
label: '电池温度',
|
||||
value: '-',
|
||||
},
|
||||
})
|
||||
|
||||
//电池百分比
|
||||
let precent = ref('-')
|
||||
//电池剩余时间
|
||||
let lastTime = ref('-')
|
||||
|
||||
const setCurrentData = (data) => {
|
||||
// console.log(data)
|
||||
//电池循环次数
|
||||
items.battery.value = data ? data.batLoopTimes : '-'
|
||||
//无人机版本
|
||||
items.version.value = '-'
|
||||
//电池温度
|
||||
items.temperature.value = '30℃'
|
||||
|
||||
precent.value = data ? Number(data.battery) * 100 : '-'
|
||||
lastTime.value = data ? data.allflytime : '-'
|
||||
}
|
||||
|
||||
const droneCommand = async (type) => {
|
||||
if (type == 'back') {
|
||||
//返航
|
||||
emits('droneCommandExecute', '03')
|
||||
} else if (type == 'DroneStop') {
|
||||
//悬停
|
||||
emits('droneCommandExecute', '01')
|
||||
}
|
||||
}
|
||||
|
||||
//监听pinia
|
||||
airPortSocketStore.$subscribe((mutate, state) => {
|
||||
//设置socket的值
|
||||
setCurrentData(state.currentAirPort)
|
||||
})
|
||||
|
||||
onMounted(() => {})
|
||||
</script>
|
||||
<template>
|
||||
<div class="w-[506px] flex flex-row items-center">
|
||||
<div class="w-[136px] h-[46px] bg-[#ff0000]"></div>
|
||||
<div class="w-[136px] h-[46px] cursor-pointer relative" @click="droneCommand('back')">
|
||||
<img src="@/assets/icons/leftplane.png" alt="" />
|
||||
<div class="absolute left-1/3 top-2 text-[#ffffff] text-base flex flex-row items-center">
|
||||
<span class="iconfont icon-fanhang text-[#ffffff] text-2xl"></span>
|
||||
<span class="ml-1">返航</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-[210px] h-[46px] bg-[#8a1515] mx-3"></div>
|
||||
<a-tooltip
|
||||
overlayClassName="blackToolTip"
|
||||
placement="top"
|
||||
:getPopupContainer="(triggerNode) => triggerNode.parentElement"
|
||||
>
|
||||
<template #title>
|
||||
<!-- <a-menu v-model:selectedKeys="current" :items="items" @select="selectFn"> </a-menu> -->
|
||||
<div class="flex flex-col divide-y divide-slate-700">
|
||||
<div
|
||||
v-for="(item, index) in items"
|
||||
:key="index"
|
||||
class="w-[200px] py-[20px] bg-[#00000040] flex flex-row justify-between"
|
||||
>
|
||||
<span>{{ item.label }}</span
|
||||
><span>{{ item.value }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="middlePlane w-[210px] h-[46px] mx-3 flex flex-row items-center justify-around">
|
||||
<div
|
||||
class="w-[23px] h-[23px] bg-[#ffffff50] rounded-[6px] flex-row items-center justify-center text-center"
|
||||
>
|
||||
<span class="iconfont icon-xudianchi text-[#ffffff] text-base"></span>
|
||||
</div>
|
||||
<span class="text-sm text-[#B4D5FF]">电池电量</span>
|
||||
<div class="lastTime text-sm font-bold">{{ precent }}%/{{ lastTime }}min</div>
|
||||
<span class="iconfont icon-xiashuangjiantou text-[#ffffff50]"></span>
|
||||
</div>
|
||||
</a-tooltip>
|
||||
<!-- <div class="middlePlane w-[210px] h-[46px] mx-3 flex flex-row items-center justify-around">
|
||||
<div
|
||||
class="w-[23px] h-[23px] bg-[#ffffff50] rounded-[6px] flex-row items-center justify-center text-center"
|
||||
>
|
||||
<span class="iconfont icon-xudianchi text-[#ffffff] text-base"></span>
|
||||
</div>
|
||||
<span class="text-sm text-[#B4D5FF]">电池电量</span>
|
||||
<div class="lastTime text-sm font-bold">{{ precent }}%/{{ lastTime }}min</div>
|
||||
<span class="iconfont icon-xiashuangjiantou text-[#ffffff50]"></span>
|
||||
</div> -->
|
||||
|
||||
<div class="w-[136px] h-[46px] bg-[#8a1515]"></div>
|
||||
<div class="w-[136px] h-[46px] cursor-pointer relative" @click="droneCommand('DroneStop')">
|
||||
<img src="@/assets/icons/rightplane.png" alt="" />
|
||||
<div class="absolute right-1/3 top-2 text-[#ffffff] text-base flex flex-row items-center">
|
||||
<span class="iconfont icon-zanting text-[#ffffff] text-2xl"></span>
|
||||
<span class="ml-1">急停</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.middlePlane {
|
||||
background: linear-gradient(270deg, #006ffe, #3ca4fb);
|
||||
border-radius: 2px;
|
||||
border: 2px solid #75a9d6;
|
||||
}
|
||||
.lastTime {
|
||||
background: linear-gradient(
|
||||
0deg,
|
||||
rgba(79, 255, 208, 0.44) 0%,
|
||||
rgba(20, 255, 50, 0.44) 98.779296875%
|
||||
);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -17,6 +17,9 @@ export default {
|
|||
//自定义高度
|
||||
height: {
|
||||
200: '200px',
|
||||
c150: 'calc(100% - 150px)',
|
||||
c212: 'calc(100% - 212px)',
|
||||
c282: 'calc(100% - 282px)',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in New Issue