Browse Source

在线直播协议传参

李富豪 1 year ago
parent
commit
305645c31f

+ 1 - 1
Web/env/.env.production

@@ -2,7 +2,7 @@
 VITE_ENV = 'production'
 
 # Api 地址
-VITE_API_URL = 'http://118.195.177.247:6789'
+VITE_API_URL = 'https://uas.ryuiso.com/api'
 
 # WebSocket 地址
 VITE_WEBSOCKET_URL = 'wss://uas.ryuiso.com:443/api/v1/ws'

+ 1 - 1
Web/env/.env.subsystem

@@ -2,7 +2,7 @@
 VITE_ENV = 'subsystem'
 
 # Api 地址
-VITE_API_URL = 'http://118.195.177.247:6789'
+VITE_API_URL = 'https://uas.ryuiso.com/api'
 
 # WebSocket 地址
 VITE_WEBSOCKET_URL = 'wss://uas.ryuiso.com:443/api/v1/ws'

+ 2 - 0
Web/src/components/airport/components/InfoModal.vue

@@ -744,6 +744,7 @@ const onDockStartLive = async () => {
   airportLive.videoId = videoId;
   try {
     const res = await startLivestream({
+      protocol: location.protocol.slice(0, -1),
       video_id: videoId,
       url_type: 1,// RTMP 
       video_quality: airportLive.clarityValue
@@ -806,6 +807,7 @@ const onDeviceStartLive = async () => {
   deviceLive.videoId = videoId;
   try {
     const res = await startLivestream({
+      protocol: location.protocol.slice(0, -1),
       video_id: videoId,
       url_type: 1,// RTMP 
       video_quality: deviceLive.clarityValue

+ 1 - 0
Web/src/components/onLineDevice/components/InfoModal.vue

@@ -470,6 +470,7 @@ const onStartLive = async () => {
   state.videoId = videoId;
   try {
     const res = await startLivestream({
+      protocol: location.protocol.slice(0, -1),
       video_id: videoId,
       url_type: 1,// RTMP 
       video_quality: state.clarityValue

+ 28 - 31
Web/src/pages/page-web/projects/task/waylineList/components/Search.vue

@@ -51,6 +51,7 @@ import { ref, reactive } from 'vue';
 import { SearchOutlined, ReloadOutlined } from '@ant-design/icons-vue';
 
 interface Props {
+  importWayline: (data: FormData) => Promise<any>,
   onClickSearch: (query: any) => Promise<any>,
   onClickReset: (query: any) => Promise<any>,
 };
@@ -61,54 +62,50 @@ const props = withDefaults(defineProps<Props>(), {
 
 const formRef = ref();
 
-interface FileInfo {
-  file: FileItem;
-  fileList: FileItem[];
-}
-
-const fileList = ref<FileItem[]>([])
-
-
 const formModel = reactive({
   template_type: undefined,
   key: undefined,
 })
 
+interface FileItem {
+  uid: string;
+  name?: string;
+  status?: string;
+  response?: string;
+  url?: string;
+}
+
+interface State {
+  buttonLoading: boolean,
+  fileList: FileItem[];
+}
 
-const state = reactive({
+const state: State = reactive({
   buttonLoading: false,
   fileList: []
 })
 
-
-
 const beforeUpload = (file: FileItem) => {
-  fileList.value = [file]
-  loading.value = true
+  state.fileList = [file];
+  state.buttonLoading = true;
   return true
 }
+
 const uploadFile = async () => {
-  fileList.value.forEach(async (file: FileItem) => {
-    const fileData = new FormData()
-    fileData.append('file', file, file.name)
-    await importKmzFile(getWorkspaceId(), fileData).then((res) => {
-      if (res.code === 0) {
-        message.success(`${file.name} file uploaded successfully`)
-        canRefresh.value = true
-        pagination.total = 0
-        pagination.page = 1
-        waylinesData.data = []
-        getWaylines()
-      }
-    }).finally(() => {
-      loading.value = false
-      fileList.value = []
-    })
+  state.fileList.forEach(async (file: any) => {
+    const fileData = new FormData();
+    fileData.append('file', file, file.name);
+    try {
+      await props.importWayline(fileData);
+    } catch (error) {
+      console.error(error);
+    } finally {
+      state.buttonLoading = false;
+      state.fileList = [];
+    }
   })
 }
 
-
-
 // 点击查询
 const handleClickSearch = async () => {
   const values = formRef.value?.getFieldsValue();

+ 15 - 2
Web/src/pages/page-web/projects/task/waylineList/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="waylineList">
-    <Search :onClickSearch="onClickSearch" :onClickReset="onClickReset" />
+    <Search :importWayline="importWayline" :onClickSearch="onClickSearch" :onClickReset="onClickReset" />
     <a-table :scroll="{ x: '100%', y: 500 }" rowKey="id" :loading="state.listLoading" :columns="columns"
       :dataSource="state.list" @change="refreshData" :rowClassName="rowClassName" :pagination="paginationConfig">
       <!-- 航线名称 -->
@@ -26,7 +26,7 @@
 
 <script lang="ts" setup>
 import { reactive, onMounted } from 'vue';
-import { Modal } from 'ant-design-vue';
+import { Modal, message } from 'ant-design-vue';
 import { DownloadOutlined, DeleteOutlined } from '@ant-design/icons-vue';
 import Search from './components/Search.vue';
 import { apis } from '/@/api/custom'
@@ -182,6 +182,19 @@ const onClickReset = async (query: any) => {
   await fetchList();
 }
 
+// 上传航线
+const importWayline = async (fileData: FormData) => {
+  try {
+    const res = await importKmzFile(getWorkspaceId(), fileData);
+    if (res.code === 0) {
+      message.success('上传成功')
+      await fetchList();
+    }
+  } catch (error) {
+    console.error(error);
+  }
+}
+
 // 点击下载
 const onClickDownload = async (id: string, name: string) => {
   state.listLoading = true;

+ 0 - 272
Web/src/pages/page-web/projects/task/waylineList/index22.vue

@@ -1,272 +0,0 @@
-<template>
-  <div class="project-wayline-wrapper height-100">
-    <a-spin :spinning="loading" :delay="300" tip="downloading" size="large">
-      <div style="height: 50px; line-height: 50px; border-bottom: 1px solid #4f4f4f; font-weight: 450;">
-        <a-row>
-          <a-col :span="1"></a-col>
-          <a-col :span="14">Flight Route Library</a-col>
-          <a-col :span="8" v-if="importVisible" class="flex-row flex-justify-end flex-align-center">
-            <a-upload name="file" :multiple="false" :before-upload="beforeUpload" :show-upload-list="false"
-              :customRequest="uploadFile">
-              <a-button type="primary">
-                上传
-              </a-button>
-            </a-upload>
-          </a-col>
-          <a-col :span="1"></a-col>
-        </a-row>
-      </div>
-      <div :style="{ height: height + 'px' }" class="scrollbar">
-        <div id="data" class="height-100 uranus-scrollbar" v-if="waylinesData.data.length !== 0" @scroll="onScroll">
-          <div v-for="wayline in waylinesData.data" :key="wayline.id">
-            <div class="wayline-panel" style="padding-top: 5px;" @click="selectRoute(wayline)">
-              <div class="title">
-                <a-tooltip :title="wayline.name">
-                  <div class="pr10"
-                    style="width: 120px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;">
-                    {{ wayline.name }}</div>
-                </a-tooltip>
-                <div class="ml10">
-                  <UserOutlined />
-                </div>
-                <a-tooltip :title="wayline.user_name">
-                  <div class="ml5 pr10"
-                    style="width: 80px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;">
-                    {{ wayline.user_name }}</div>
-                </a-tooltip>
-                <div class="fz20">
-                  <a-dropdown>
-                    <a style="color: white;">
-                      <EllipsisOutlined />
-                    </a>
-                    <template #overlay>
-                      <a-menu theme="dark" class="more" style="background: #3c3c3c;">
-                        <a-menu-item @click="downloadWayline(wayline.id, wayline.name)">
-                          <span>Download</span>
-                        </a-menu-item>
-                        <a-menu-item @click="showWaylineTip(wayline.id)">
-                          <span>Delete</span>
-                        </a-menu-item>
-                      </a-menu>
-                    </template>
-                  </a-dropdown>
-                </div>
-              </div>
-              <div class="ml10 mt5" style="color: hsla(0,0%,100%,0.65);">
-                <span>
-                  <RocketOutlined />
-                </span>
-                <span class="ml5">{{ DEVICE_NAME[wayline.drone_model_key] }}</span>
-                <span class="ml10">
-                  <CameraFilled style="border-top: 1px solid; padding-top: -3px;" />
-                </span>
-                <span class="ml5" v-for="payload in wayline.payload_model_keys" :key="payload.id">
-                  {{ DEVICE_NAME[payload] }}
-                </span>
-              </div>
-              <div class="mt5 ml10" style="color: hsla(0,0%,100%,0.35);">
-                <span class="mr10">Update at {{ new Date(wayline.update_time).toLocaleString() }}</span>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div v-else>
-          <a-empty :image-style="{ height: '60px', marginTop: '60px' }" />
-        </div>
-        <a-modal v-model:visible="deleteTip" width="450px" :closable="false" :maskClosable="false" centered
-          :okButtonProps="{ danger: true }" @ok="deleteWayline">
-          <p class="pt10 pl20" style="height: 50px;">Wayline file is unrecoverable once deleted. Continue?</p>
-          <template #title>
-            <div class="flex-row flex-justify-center">
-              <span>Delete</span>
-            </div>
-          </template>
-        </a-modal>
-      </div>
-    </a-spin>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { message } from 'ant-design-vue'
-import { onMounted, reactive, ref } from 'vue'
-import { deleteWaylineFile, downloadWaylineFile, getWaylineFiles, importKmzFile } from '/@/api/wayline'
-import { ERouterName } from '/@/types'
-import { EllipsisOutlined, RocketOutlined, CameraFilled, UserOutlined, SelectOutlined } from '@ant-design/icons-vue'
-import { DEVICE_NAME } from '/@/types/device'
-import { useMyStore } from '/@/store'
-import { WaylineFile } from '/@/types/wayline'
-import { downloadFile } from '/@/utils/common'
-import { IPage } from '/@/api/http/type'
-import { getRoot } from '/@/root'
-import { getWorkspaceId } from '/@/utils/index'
-
-const loading = ref(false)
-const store = useMyStore()
-const pagination: IPage = {
-  page: 1,
-  total: -1,
-  page_size: 10
-}
-
-const waylinesData = reactive({
-  data: [] as WaylineFile[]
-})
-
-const root = getRoot()
-const deleteTip = ref(false)
-const deleteWaylineId = ref<string>('')
-const canRefresh = ref(true)
-const importVisible = ref<boolean>(true)
-const height = ref()
-
-onMounted(() => {
-  const parent = document.getElementsByClassName('scrollbar').item(0)?.parentNode as HTMLDivElement
-  height.value = document.body.clientHeight - parent.firstElementChild!.clientHeight
-  getWaylines()
-
-  const key = setInterval(() => {
-    const data = document.getElementById('data')?.lastElementChild as HTMLDivElement
-    if (pagination.total === 0 || Math.ceil(pagination.total / pagination.page_size) <= pagination.page || height.value <= data?.clientHeight + data?.offsetTop) {
-      clearInterval(key)
-      return
-    }
-    pagination.page++
-    getWaylines()
-  }, 1000)
-})
-
-function getWaylines() {
-  if (!canRefresh.value) {
-    return
-  }
-  canRefresh.value = false
-  getWaylineFiles(getWorkspaceId(), {
-    page: pagination.page,
-    page_size: pagination.page_size,
-    order_by: 'update_time desc'
-  }).then(res => {
-    if (res.code !== 0) {
-      return
-    }
-    waylinesData.data = [...waylinesData.data, ...res.data.list]
-    pagination.total = res.data.pagination.total
-    pagination.page = res.data.pagination.page
-  }).finally(() => {
-    canRefresh.value = true
-  })
-}
-
-function showWaylineTip(waylineId: string) {
-  deleteWaylineId.value = waylineId
-  deleteTip.value = true
-}
-
-function deleteWayline() {
-  deleteWaylineFile(getWorkspaceId(), deleteWaylineId.value).then(res => {
-    if (res.code === 0) {
-      message.success('Wayline file deleted')
-    }
-    deleteWaylineId.value = ''
-    deleteTip.value = false
-    pagination.total = 0
-    pagination.page = 1
-    waylinesData.data = []
-    getWaylines()
-  })
-}
-
-function downloadWayline(waylineId: string, fileName: string) {
-  loading.value = true
-  downloadWaylineFile(getWorkspaceId(), waylineId).then(res => {
-    if (!res) {
-      return
-    }
-    const data = new Blob([res], { type: 'application/zip' })
-    downloadFile(data, fileName + '.kmz')
-  }).finally(() => {
-    loading.value = false
-  })
-}
-
-function selectRoute(wayline: WaylineFile) {
-  store.commit('SET_SELECT_WAYLINE_INFO', wayline)
-}
-
-function onScroll(e: any) {
-  const element = e.srcElement
-  if (element.scrollTop + element.clientHeight >= element.scrollHeight - 5 && Math.ceil(pagination.total / pagination.page_size) > pagination.page && canRefresh.value) {
-    pagination.page++
-    getWaylines()
-  }
-}
-
-interface FileItem {
-  uid: string;
-  name?: string;
-  status?: string;
-  response?: string;
-  url?: string;
-}
-
-interface FileInfo {
-  file: FileItem;
-  fileList: FileItem[];
-}
-const fileList = ref<FileItem[]>([])
-
-function beforeUpload(file: FileItem) {
-  fileList.value = [file]
-  loading.value = true
-  return true
-}
-const uploadFile = async () => {
-  fileList.value.forEach(async (file: FileItem) => {
-    const fileData = new FormData()
-    fileData.append('file', file, file.name)
-    await importKmzFile(getWorkspaceId(), fileData).then((res) => {
-      if (res.code === 0) {
-        message.success(`${file.name} file uploaded successfully`)
-        canRefresh.value = true
-        pagination.total = 0
-        pagination.page = 1
-        waylinesData.data = []
-        getWaylines()
-      }
-    }).finally(() => {
-      loading.value = false
-      fileList.value = []
-    })
-  })
-}
-
-</script>
-
-<style lang="scss" scoped>
-.wayline-panel {
-  background: #3c3c3c;
-  margin-left: auto;
-  margin-right: auto;
-  margin-top: 10px;
-  height: 90px;
-  width: 95%;
-  font-size: 13px;
-  border-radius: 2px;
-  cursor: pointer;
-
-  .title {
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-    height: 30px;
-    font-weight: bold;
-    margin: 0px 10px 0 10px;
-  }
-}
-
-.uranus-scrollbar {
-  overflow: auto;
-  scrollbar-width: thin;
-  scrollbar-color: #c5c8cc transparent;
-}
-</style>

+ 8 - 8
Web/src/utils/index.ts

@@ -133,28 +133,28 @@ export const getWindDirection = (code: number) => {
     let text = '';
     switch (code) {
         case 1:
-            text = '正北';
+            text = 'N';
             break;
         case 2:
-            text = '东北';
+            text = 'NE';
             break;
         case 3:
-            text = '';
+            text = 'E';
             break;
         case 4:
-            text = '东南';
+            text = 'SE';
             break;
         case 5:
-            text = '';
+            text = 'S';
             break;
         case 6:
-            text = '西南';
+            text = 'SW';
             break;
         case 7:
-            text = '西';
+            text = 'W';
             break;
         case 8:
-            text = '西北';
+            text = 'NW';
             break;
         default:
             break;