Browse Source

媒体管理api对接

李富豪 1 year ago
parent
commit
092bc8595f

+ 58 - 7
Web/src/api/custom/index.ts

@@ -18,24 +18,54 @@ export type FetchChangeRecordListApiParams = {
     logsInformation?: string,//模糊查询内容
 };
 
-export type FetchMediaFileListApiParams = {
+export type FetchMediaFileListApiParams = Partial<{
+    begin_time: number,
+    end_time: number,
+    template_type: number,
+    payload: string,
+    search_info: string,
     page: number,
     page_size: number,
+}>;
+
+export type BatchDownloadMediaFileApiParams = {
+    id: string
 };
 
-export type FetchFileListByFolderApiParams = {
+export type FetchFileListByFolderApiParams = Partial<{
+    begin_time: number,
+    end_time: number,
+    media_type: number,
+    search_info: string,
     page: number,
     page_size: number,
+}>;
+
+export type BatchDownloadFileApiParams = {
+    id: string
+};
+
+export type BatchDeletePictureApiParams = {
+    id: string
 };
 
 // Api函数类型
+export type FetchPayloadListApi = () => Promise<any>;
 export type FetchFeedbackRecordListApi = (data: FetchFeedbackRecordListApiParams) => Promise<any>;
 export type FetchChangeRecordListApi = (params: FetchFeedbackRecordListApiParams) => Promise<any>;
 export type FetchProjectListApi = () => Promise<any>;
 export type FetchMediaFileListApi = (params: FetchMediaFileListApiParams) => Promise<any>;
-export type DownloadMediaFileApi = (dirId: string) => Promise<any>;
+export type BatchDownloadMediaFileApi = (params: BatchDownloadMediaFileApiParams) => Promise<any>;
 export type FetchFileListByFolderApi = (dirId: string, params: FetchFileListByFolderApiParams) => Promise<any>;
 export type FetchFileDetailApi = (fileId: string) => Promise<any>;
+export type BatchDownloadFileApi = (params: BatchDownloadFileApiParams) => Promise<any>;
+export type BatchDeletePictureApi = (params: BatchDeletePictureApiParams) => Promise<any>;
+
+// 获取负载列表
+const fetchPayloadListApi: FetchPayloadListApi = async () => {
+    const res = await request.get(`/manage/api/v1/devices/${workspaceId}/payloads`);
+    return res.data;
+};
 
 // 获取反馈记录列表
 const fetchFeedbackRecordListApi: FetchFeedbackRecordListApi = async (data) => {
@@ -61,9 +91,12 @@ const fetchMediaFileListApi: FetchMediaFileListApi = async (params) => {
     return res.data;
 };
 
-// 下载文件夹
-const downloadMediaFileApi: DownloadMediaFileApi = async (dirId) => {
-    const res = await request.get(`/media/api/v1/files/${workspaceId}/fileDownList/${dirId}`);
+// 批量下载文件夹
+const batchDownloadMediaFileApi: BatchDownloadMediaFileApi = async (params) => {
+    const res = await request.get(`/media/api/v1/files/${workspaceId}/fileDownList`, {
+        responseType: 'blob',
+        params: params
+    });
     return res.data;
 };
 
@@ -79,12 +112,30 @@ const fetchFileDetailApi: FetchFileDetailApi = async (fileId) => {
     return res.data;
 };
 
+// 批量下载文件
+const batchDownloadFileApi: BatchDownloadFileApi = async (params) => {
+    const res = await request.get(`/media/api/v1/files/${workspaceId}/downloadFiles`, {
+        responseType: 'blob',
+        params: params
+    });
+    return res.data;
+};
+
+// 批量删除图片
+const batchDeletePictureApi: BatchDeletePictureApi = async (data) => {
+    const res = await request.delete(`/media/api/v1/files/${workspaceId}/deleteFiles`, { params: data });
+    return res.data;
+};
+
 export const apis = {
+    fetchPayloadList: fetchPayloadListApi,
     fetchFeedbackRecordList: fetchFeedbackRecordListApi,
     fetchChangeRecordList: fetchChangeRecordListApi,
     fetchProjectList: fetchProjectListApi,
     fetchMediaFileList: fetchMediaFileListApi,
-    downloadMediaFile: downloadMediaFileApi,
+    batchDownloadMediaFile: batchDownloadMediaFileApi,
     fetchFileListByFolder: fetchFileListByFolderApi,
     fetchFileDetail: fetchFileDetailApi,
+    batchDownloadFile: batchDownloadFileApi,
+    batchDeletePicture: batchDeletePictureApi,
 };

File diff suppressed because it is too large
+ 0 - 0
Web/src/assets/media/panorama.svg


+ 162 - 136
Web/src/pages/page-web/projects/media/detail/components/FileInfo.vue

@@ -1,155 +1,143 @@
 <template>
   <div class="fileInfo">
-    <div class="fileInfo-detail">
-      <a-row>
-        <a-col flex="auto">
-          <div class="fileInfo-detail-left">
-            <div class="fileInfo-detail-left-background" v-if="state.imgLoading">
-              <a-spin tip="加载中..." />
-            </div>
-            <a-image width="100%" height="100%" :src="state.info.url" v-else-if="1" />
-            <Panoramic :src="state.info.url" v-else-if="2" />
-          </div>
-        </a-col>
-        <a-col flex="420px">
-          <div class="fileInfo-detail-info">
-            <CloseOutlined class="fileInfo-detail-info-close" @click="onClose" />
-            <div class="fileInfo-detail-info-title">
-              详细信息
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                照片名称
-              </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.file_name || '--' }}
+    <a-spin :spinning="state.downloadLoading" tip="下载中...">
+      <div class="fileInfo-detail">
+        <a-row>
+          <a-col flex="auto">
+            <div class="fileInfo-detail-left">
+              <div class="fileInfo-detail-left-background" v-if="state.imgLoading">
+                <a-spin tip="加载中..." />
               </div>
+              <Panoramic :src="state.info.url" v-if="state.info.media_type === 3" />
+              <video style="width: 100%;height: 100%;" controls :src="state.info.url"
+                v-else-if="state.info.media_type === 4"></video>
+              <a-image width="100%" height="100%" :src="state.info.url" v-else />
             </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                照片类型
-              </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.file_type || '--' }}
-              </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                任务名称
-              </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.task_name || '--' }}
+          </a-col>
+          <a-col flex="420px">
+            <div class="fileInfo-detail-info">
+              <CloseOutlined class="fileInfo-detail-info-close" @click="onClose" />
+              <div class="fileInfo-detail-info-title">
+                详细信息
               </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                航线名称
-              </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.wayline_name || '--' }}
-              </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                照片分辨率
-              </div>
-              <div class="fileInfo-detail-info-item-content">
-                <div class="fileInfo-detail-info-item-content-line"
-                  v-if="state.info.image_width && state.info.image_height">
-                  {{ state.info.image_width }}*{{ state.info.image_height }}
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  文件名称
                 </div>
-                <div v-else>
-                  --
+                <div class="fileInfo-detail-info-item-content">
+                  {{ state.info.file_name || '--' }}
                 </div>
               </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                照片大小
-              </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.size || '--' }}
-              </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                拍摄负载
-              </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.payload || '--' }}
-              </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                拍摄来源
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  文件类型
+                </div>
+                <div class="fileInfo-detail-info-item-content">
+                  {{ state.info.picture_type || '--' }}
+                </div>
               </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.source_from || '--' }}
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  任务名称
+                </div>
+                <div class="fileInfo-detail-info-item-content">
+                  {{ state.info.task_name || '--' }}
+                </div>
               </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                拍摄时间
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  航线名称
+                </div>
+                <div class="fileInfo-detail-info-item-content">
+                  {{ state.info.wayline_name || '--' }}
+                </div>
               </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.picture_time || '--' }}
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  分辨率
+                </div>
+                <div class="fileInfo-detail-info-item-content">
+                  <div class="fileInfo-detail-info-item-content-line"
+                    v-if="state.info.image_width && state.info.image_height">
+                    {{ state.info.image_width }}*{{ state.info.image_height }}
+                  </div>
+                  <div v-else>
+                    --
+                  </div>
+                </div>
               </div>
-            </div>
-            <div class="fileInfo-detail-info-item">
-              <div class="fileInfo-detail-info-item-title">
-                已关注进度
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  文件大小
+                </div>
+                <div class="fileInfo-detail-info-item-content">
+                  {{ state.info.size || '--' }}
+                </div>
               </div>
-              <div class="fileInfo-detail-info-item-content">
-                {{ state.info.hot || '--' }}
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  拍摄负载
+                </div>
+                <div class="fileInfo-detail-info-item-content">
+                  {{ state.info.payload || '--' }}
+                </div>
               </div>
-            </div>
-            <div class="fileInfo-detail-info-map">
-              <div class="fileInfo-detail-info-map-title">
-                <div class="fileInfo-detail-info-map-title-text">
-                  照片位置
+              <div class="fileInfo-detail-info-item">
+                <div class="fileInfo-detail-info-item-title">
+                  拍摄时间
                 </div>
-                <div class="fileInfo-detail-info-map-title-icon">
-                  <EnvironmentOutlined />
+                <div class="fileInfo-detail-info-item-content">
+                  {{ state.info.picture_time || '--' }}
                 </div>
               </div>
-              <div class="fileInfo-detail-info-map-content">
-                <div id="photoPositionMap" :style="{ width: '100%', height: '100%' }"></div>
-                <div class="fileInfo-detail-info-map-content-title">
-                  <span>
-                    {{ state.info.latitude }}° N
-                  </span>
-                  <span>
-                    {{ state.info.longitude }}° E
-                  </span>
+              <div class="fileInfo-detail-info-map">
+                <div class="fileInfo-detail-info-map-title">
+                  <div class="fileInfo-detail-info-map-title-text">
+                    照片位置
+                  </div>
+                  <div class="fileInfo-detail-info-map-title-icon">
+                    <EnvironmentOutlined @click="onClickMapLocationReset" />
+                  </div>
+                </div>
+                <div class="fileInfo-detail-info-map-content">
+                  <div id="photoPositionMap" :style="{ width: '100%', height: '100%' }"></div>
+                  <div class="fileInfo-detail-info-map-content-title">
+                    <span>
+                      {{ state.info.latitude }}° N
+                    </span>
+                    <span>
+                      {{ state.info.longitude }}° E
+                    </span>
+                  </div>
                 </div>
               </div>
             </div>
-          </div>
-        </a-col>
-      </a-row>
-    </div>
-    <div class="fileInfo-area">
-      <a-tooltip placement="bottom" title="下载">
-        <DownloadOutlined style="font-size: 20px;margin-right: 20px;" />
-      </a-tooltip>
-      <a-tooltip placement="bottom" title="删除">
-        <DeleteOutlined style="font-size: 20px;" />
-      </a-tooltip>
-    </div>
-    <div class="fileInfo-previewList">
-      <div class="fileInfo-previewList-item">
-        <img :src="state.info.url" />
+          </a-col>
+        </a-row>
       </div>
-    </div>
+      <div class="fileInfo-area">
+        <a-tooltip placement="bottom" title="下载">
+          <DownloadOutlined style="font-size: 20px;margin-right: 20px;" @click="onClickDownload" />
+        </a-tooltip>
+      </div>
+      <div class="fileInfo-previewList">
+        <div class="fileInfo-previewList-item">
+          <img :src="state.info.url" />
+        </div>
+      </div>
+    </a-spin>
   </div>
 </template>
 
 <script lang="ts" setup>
 import { reactive, onMounted } from 'vue';
-import { CloseOutlined, EnvironmentOutlined, DownloadOutlined, DeleteOutlined } from '@ant-design/icons-vue';
+import { CloseOutlined, EnvironmentOutlined, DownloadOutlined } from '@ant-design/icons-vue';
 import Panoramic from '/@/components/panoramic/index.vue';
 import { useGMapManage } from '/@/hooks/use-g-map';
 import { apis } from '/@/api/custom';
+import { downloadFile } from '/@/utils/common';
+import { ELocalStorageKey } from '/@/types';
+import { downloadMediaFile } from '/@/api/media';
 
 interface Props {
   fileId: string,
@@ -161,23 +149,25 @@ const props = withDefaults(defineProps<Props>(), {
 });
 
 const state = reactive({
-  imgLoading: true,// 图片加载
+  downloadLoading: false,
+  imgLoading: false,// 图片加载
   info: {
     url: '',
+    media_type: null,
+    file_id: '',
     file_name: '',
-    file_type: '',
+    picture_type: '',
     task_name: '',
     wayline_name: '',
     image_width: '',// 照片分辨率-宽度
     image_height: '',// 照片分辨率-高度
     size: '',
     payload: '',
-    source_from: '',
     picture_time: '',
-    hot: '',// 已关注度
     longitude: '',// 经度
     latitude: '',// 纬度
-  }
+  },
+  map: null, // 高德地图实例
 })
 
 // 高德地图Hook
@@ -187,14 +177,17 @@ onMounted(async () => {
   try {
     const res = await apis.fetchFileDetail(props.fileId);
     state.info = res.data;
-    const img = new Image();
-    img.src = state.info.url;
-    img.onload = () => {
-      state.imgLoading = false;
-    };
+    if (res.data.media_type !== 4) {
+      state.imgLoading = true;
+      const img = new Image();
+      img.src = state.info.url;
+      img.onload = () => {
+        state.imgLoading = false;
+      };
+    }
     if (state.info.longitude && state.info.latitude) {
       const AMap = await AmapHook.asyncInitMap();
-      new AMap.Map('photoPositionMap', {
+      const map = new AMap.Map('photoPositionMap', {
         layers: [new AMap.TileLayer.Satellite()],// 卫星图-图层
         viewMode: '3D',// 3D地图
         rotateEnable: true,// 开启地图旋转交互
@@ -202,11 +195,44 @@ onMounted(async () => {
         zoom: 17, // 初始化地图层级
         center: [state.info.longitude, state.info.latitude],// 中心点
       })
+      state.map = map;
+      // 创建一个标记并将其添加到地图上
+      new AMap.Marker({
+        map: map,
+        cursor: 'pointer',
+        position: [state.info.longitude, state.info.latitude],
+      });
     }
   } catch (e) {
     console.error(e);
   }
 })
+
+// 点击下载
+const onClickDownload = async () => {
+  state.downloadLoading = true;
+  try {
+    const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '';
+    const res = await downloadMediaFile(workspaceId, state.info.file_id)
+    if (!res) {
+      return
+    }
+    const data = new Blob([res])
+    downloadFile(data, state.info.file_name)
+  } catch (e) {
+    console.error(e);
+  } finally {
+    state.downloadLoading = false;
+  }
+}
+
+// 点击地图位置重置
+const onClickMapLocationReset = () => {
+  const markerPosition = [state.info.longitude, state.info.latitude];
+  const map: any = state.map;
+  map.setCenter(markerPosition);
+  map.setZoom(17);
+}
 </script>
 
 <style lang="scss">
@@ -235,13 +261,13 @@ onMounted(async () => {
 
   &-detail {
     &-left {
-      width: 100%;
+      width: calc(100vw - 420px);
       height: calc(100vh - 120px);
       overflow: hidden;
 
       &-background {
         width: 100%;
-        height: calc(100vh - 120px);
+        height: 100%;
         padding: 100px;
         display: flex;
         justify-content: center;

+ 36 - 49
Web/src/pages/page-web/projects/media/detail/components/Search.vue

@@ -20,21 +20,30 @@
     </a-col>
     <a-col>
       <a-form ref="formRef" layout="inline" :model="formModel" :colon="false">
-        <a-form-item name="date">
-          <a-range-picker style="width: 250px;" v-model:value="formModel.date" />
+        <a-form-item name="rangeDate">
+          <a-range-picker style="width: 250px;" v-model:value="formModel.rangeDate" />
         </a-form-item>
-        <a-form-item name="status">
-          <a-select style="width: 200px;" placeholder="请选择媒体类型" v-model:value="formModel.status">
-            <a-select-option value="1">
+        <a-form-item name="media_type">
+          <a-select style="width: 200px;" placeholder="请选择媒体类型" v-model:value="formModel.media_type">
+            <a-select-option :value="1">
               原图
             </a-select-option>
-            <a-select-option value="2">
+            <a-select-option :value="2">
               截图
             </a-select-option>
+            <a-select-option :value="3">
+              全景图
+            </a-select-option>
+            <a-select-option :value="4">
+              视频
+            </a-select-option>
+            <a-select-option :value="-1">
+              其他
+            </a-select-option>
           </a-select>
         </a-form-item>
-        <a-form-item name="keyword">
-          <a-input style="width: 200px;" placeholder="文件名称" v-model:value="formModel.keyword" />
+        <a-form-item name="search_info">
+          <a-input style="width: 200px;" placeholder="文件名称" v-model:value="formModel.search_info" />
         </a-form-item>
         <a-form-item>
           <a-button style="margin-right: 10px;" @click="handleClicSekarch">
@@ -51,27 +60,6 @@
       </a-form>
     </a-col>
   </a-row>
-  <a-modal v-model:visible="state.visible" title="设备绑定码" :footer="null">
-    <div>
-      请在 Pilot2 机场部署流程-云服务配置中,以组织ID和设备绑定码来绑定机场设备。
-    </div>
-    <div class="modal-item">
-      <div class="modal-item-title">
-        项目名称
-      </div>
-      <div>
-        上海展域航空技术有限公司
-      </div>
-    </div>
-    <div class="modal-item">
-      <div class="modal-item-title">
-        设备绑定码
-      </div>
-      <div>
-        PB97VR
-      </div>
-    </div>
-  </a-modal>
 </template>
 
 <script lang="ts" setup>
@@ -80,6 +68,7 @@ import { message } from 'ant-design-vue'
 import { SearchOutlined, ReloadOutlined } from '@ant-design/icons-vue';
 import router from '/@/router';
 import { ELocalStorageKey } from '/@/types'
+import moment from 'moment';
 
 interface Props {
   mode: 'table' | 'list',
@@ -98,10 +87,10 @@ const props = withDefaults(defineProps<Props>(), {
 const formRef = ref();
 
 const formModel = reactive({
-  date: [],
-  status: undefined,
+  rangeDate: [],
+  media_type: undefined,
   device_name: undefined,
-  keyword: '',
+  search_info: '',
 })
 
 const state = reactive({
@@ -132,29 +121,27 @@ const handleChangeUploadFile = async (info: any) => {
 // 点击查询
 const handleClicSekarch = async () => {
   const values = formRef.value?.getFieldsValue();
-  await props.onClickSearch(values);
+  const data = {
+    ...values,
+  };
+  delete data.rangeDate;
+  if (values.rangeDate.length === 2) {
+    data.begin_time = moment(values.rangeDate[0]).valueOf();
+    data.end_time = moment(values.rangeDate[1]).valueOf();
+  }
+  await props.onClickSearch(data);
 }
 
 // 点击重置
 const handleClickReset = async () => {
   formRef.value?.resetFields();
   const values = formRef.value?.getFieldsValue();
-  await props.onClickReset(values);
+  const data = {
+    ...values,
+  };
+  delete data.rangeDate;
+  await props.onClickReset(data);
 }
 </script>
 
-<style lang="scss" scoped>
-.popover {
-  width: 200px;
-}
-
-.modal-item {
-  display: flex;
-  margin-top: 20px;
-
-  &-title {
-    width: 100px;
-    font-weight: bold;
-  }
-}
-</style>
+<style lang="scss" scoped></style>

+ 149 - 106
Web/src/pages/page-web/projects/media/detail/index.vue

@@ -1,102 +1,106 @@
 <template>
-  <div class="mediaDetail">
-    <Search :mode="state.mode" :fetchList="fetchList" :selectedRowKeys="state.selectedRowKeys"
-      :onClickDownload="onClickBatchDownload" :onClickDelete="onClickBatchDelete" :onClickSearch="onClickSearch"
-      :onClickReset="onClickReset" />
-    <div style="background: #FFFFFF;padding: 20px;">
-      <div class="mediaDetail-info">
-        <div class="mediaDetail-info-left">
-          <div style="color: #7C7C7C;cursor: pointer;" @click="onClickGoBack">
-            媒体文件
-          </div>
-          <div style="margin: 0 10px;">
-            /
-          </div>
-          <div>
-            {{ 'DJI_20240624143929_0112_V.JPG' }}
-          </div>
-        </div>
-        <div class="mediaDetail-info-right">
-          <div class="mediaDetail-info-right-text">
-            <div>
-              已选/全部:
+  <a-spin :spinning="state.downloadLoading" tip="下载中...">
+    <div class="mediaDetail">
+      <Search :mode="state.mode" :fetchList="fetchList" :selectedRowKeys="state.selectedRowKeys"
+        :onClickDownload="onClickBatchDownload" :onClickDelete="onClickBatchDelete" :onClickSearch="onClickSearch"
+        :onClickReset="onClickReset" />
+      <div style="background: #FFFFFF;padding: 20px;">
+        <div class="mediaDetail-info">
+          <div class="mediaDetail-info-left">
+            <div style="color: #7C7C7C;cursor: pointer;" @click="onClickGoBack">
+              媒体文件
+            </div>
+            <div style="margin: 0 10px;">
+              /
             </div>
             <div>
-              {{ state.selectedRowKeys.length }}/{{ paginationConfig.total }}
+              {{ state.dirName }}
             </div>
           </div>
-          <a-button style="padding:0 5px;" :type="state.mode === 'table' ? 'primary' : 'default'"
-            :ghost="state.mode === 'table'" size="small" @click="state.mode = 'table'">
-            <MenuOutlined />
-          </a-button>
-          <a-button style="padding:0 5px;" :type="state.mode === 'list' ? 'primary' : 'default'"
-            :ghost="state.mode === 'list'" size="small" @click="state.mode = 'list'">
-            <AppstoreOutlined />
-          </a-button>
-        </div>
-      </div>
-      <div class="mediaDetail-table" v-if="state.mode === 'table'">
-        <a-table :scroll="{ x: '100%', y: 500 }" :childrenColumnName="null" rowKey="file_id"
-          :loading="state.listLoading" :columns="columns" :dataSource="state.list" :rowClassName="rowClassName"
-          :pagination="paginationConfig"
-          :rowSelection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }">
-          <!-- 文件夹名称 -->
-          <template #file_name="{ record }">
-            <a-tooltip :title="record.file_name">
-              <div class="fileName" @click="onClickLookFile(record)">
-                <div>
-                  <img :src="pictureSrc">
-                </div>
-                <div>
-                  {{ record.file_name }}
-                </div>
+          <div class="mediaDetail-info-right">
+            <div class="mediaDetail-info-right-text">
+              <div>
+                已选/全部:
+              </div>
+              <div>
+                {{ state.selectedRowKeys.length }}/{{ paginationConfig.total }}
               </div>
-            </a-tooltip>
-          </template>
-          <!-- 操作 -->
-          <template #action="{ record }">
-            <div class="flex-align-center flex-row" style="color: #2d8cf0">
-              <a-tooltip title="照片位置" v-if="1">
-                <EnvironmentOutlined style="margin-right: 10px;" @click="onClickPhotoPosition" />
-              </a-tooltip>
-              <a-tooltip title="重命名" v-else-if="1">
-                <EditOutlined style="margin-right: 10px;" @click="onClickRechristen" />
-              </a-tooltip>
-              <a-tooltip title="删除" v-else-if="1">
-                <DeleteOutlined style="margin-right: 10px;" @click="onClickDelete" />
-              </a-tooltip>
-              <a-tooltip title="压缩下载">
-                <DownloadOutlined @click="onClickDownload(record)" />
-              </a-tooltip>
             </div>
-          </template>
-        </a-table>
-      </div>
-      <div class="mediaDetail-list" v-else>
-        <a-list :grid="{ gutter: 16, xs: 1, sm: 2, md: 3, lg: 4, xl: 8, xxl: 12 }" :loading="state.listLoading"
-          :dataSource="state.list" :pagination="paginationConfig">
-          <template #renderItem="{ item }">
-            <a-list-item>
-              <a-card hoverable @click="onClickLookFile(item)">
-                <template #cover>
-                  <div style="display: flex;justify-content:center;align-items: center;">
-                    <img style="width: 70%;margin: 10px;" :src="pictureSrc" />
+            <a-button style="padding:0 5px;" :type="state.mode === 'table' ? 'primary' : 'default'"
+              :ghost="state.mode === 'table'" size="small" @click="state.mode = 'table'">
+              <MenuOutlined />
+            </a-button>
+            <a-button style="padding:0 5px;" :type="state.mode === 'list' ? 'primary' : 'default'"
+              :ghost="state.mode === 'list'" size="small" @click="state.mode = 'list'">
+              <AppstoreOutlined />
+            </a-button>
+          </div>
+        </div>
+        <div class="mediaDetail-table" v-if="state.mode === 'table'">
+          <a-table :scroll="{ x: '100%', y: 500 }" :childrenColumnName="null" rowKey="file_id"
+            :loading="state.listLoading" :columns="columns" :dataSource="state.list" :rowClassName="rowClassName"
+            :pagination="paginationConfig"
+            :rowSelection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }">
+            <!-- 文件夹名称 -->
+            <template #file_name="{ record }">
+              <a-tooltip :title="record.file_name">
+                <div class="fileName" @click="onClickLookFile(record)">
+                  <div>
+                    <img :src="panoramaSrc" v-if="record.media_type === 3" />
+                    <img :src="videoSrc" v-else-if="record.media_type === 4" />
+                    <img :src="pictureSrc" v-else />
                   </div>
-                </template>
-                <a-card-meta>
-                  <template #description>
-                    <div class="mediaDetail-list-name">
-                      {{ item.file_name }}
+                  <div>
+                    {{ record.file_name }}
+                  </div>
+                </div>
+              </a-tooltip>
+            </template>
+            <!-- 操作 -->
+            <template #action="{ record }">
+              <div class="flex-align-center flex-row" style="color: #2d8cf0">
+                <a-tooltip title="照片位置" v-if="[1, 3].includes(record.media_type)">
+                  <EnvironmentOutlined style="margin-right: 10px;" @click="onClickPhotoPosition" />
+                </a-tooltip>
+                <a-tooltip title="重命名" v-else-if="record.media_type === 4">
+                  <EditOutlined style="margin-right: 10px;" @click="onClickRechristen" />
+                </a-tooltip>
+                <a-tooltip title="删除" v-else-if="record.media_type === 2">
+                  <DeleteOutlined style="margin-right: 10px;" @click="onClickDelete(record)" />
+                </a-tooltip>
+                <a-tooltip title="压缩下载">
+                  <DownloadOutlined @click="onClickDownload(record)" />
+                </a-tooltip>
+              </div>
+            </template>
+          </a-table>
+        </div>
+        <div class="mediaDetail-list" v-else>
+          <a-list :grid="{ gutter: 16, xs: 1, sm: 2, md: 3, lg: 4, xl: 8, xxl: 12 }" :loading="state.listLoading"
+            :dataSource="state.list" :pagination="paginationConfig">
+            <template #renderItem="{ item }">
+              <a-list-item>
+                <a-card hoverable @click="onClickLookFile(item)">
+                  <template #cover>
+                    <div style="display: flex;justify-content:center;align-items: center;">
+                      <img style="width: 70%;margin: 10px;" :src="pictureSrc" />
                     </div>
                   </template>
-                </a-card-meta>
-              </a-card>
-            </a-list-item>
-          </template>
-        </a-list>
+                  <a-card-meta>
+                    <template #description>
+                      <div class="mediaDetail-list-name">
+                        {{ item.file_name }}
+                      </div>
+                    </template>
+                  </a-card-meta>
+                </a-card>
+              </a-list-item>
+            </template>
+          </a-list>
+        </div>
       </div>
     </div>
-  </div>
+  </a-spin>
   <FileInfo :fileId="state.fileId" :onClose="fileInfoOnClickClose" v-if="state.fileInfoVisible" />
 </template>
 
@@ -106,13 +110,20 @@ import { MenuOutlined, AppstoreOutlined, EditOutlined, DeleteOutlined, DownloadO
 import Search from './components/Search.vue';
 import FileInfo from './components/FileInfo.vue';
 import pictureSrc from '/@/assets/media/picture.svg';
+import panoramaSrc from '/@/assets/media/panorama.svg';
+import videoSrc from '/@/assets/media/video.svg';
 import { apis } from '/@/api/custom';
 import router from '/@/router/index';
+import { downloadFile } from '/@/utils/common';
+import { downloadMediaFile } from '/@/api/media';
+import { ELocalStorageKey } from '/@/types';
 
 interface State {
   listLoading: boolean,
   list: any[],
+  dirName: string,
   selectedRowKeys: string[],
+  downloadLoading: boolean,
   mode: 'table' | 'list',
   fileId: string,
   fileInfoVisible: boolean,
@@ -121,7 +132,9 @@ interface State {
 const state: State = reactive({
   listLoading: false,
   list: [],
+  dirName: '',
   selectedRowKeys: [],
+  downloadLoading: false,
   mode: 'table',
   fileId: '',
   fileInfoVisible: false,
@@ -144,11 +157,16 @@ const paginationConfig = reactive({
   }
 })
 
-const fetchList = async () => {
+const fetchList = async (query?: any) => {
   state.listLoading = true;
   try {
     const dirId = router.currentRoute.value.params?.id;
-    const res = await apis.fetchFileListByFolder(dirId as string, { page: paginationConfig.current, page_size: paginationConfig.pageSize });
+    const res = await apis.fetchFileListByFolder(dirId as string, {
+      ...query,
+      page: paginationConfig.current,
+      page_size: paginationConfig.pageSize,
+    });
+    state.dirName = res.data.group_name;
     state.list = res.data.list;
     paginationConfig.current = res.data.pagination.page;
     paginationConfig.pageSize = res.data.pagination.page_size;
@@ -185,7 +203,7 @@ const columns = [
     width: 150,
     ellipsis: true,
     customRender: ({ text }: any) => {
-      return text || '--';
+      return text > 0 ? (text / 1024 / 1024).toFixed(1) + 'M' : '--';
     }
   },
   {
@@ -196,16 +214,16 @@ const columns = [
   },
   {
     title: '媒体类型',
-    dataIndex: 'media_name',
-    width: 150,
+    dataIndex: 'media_type_text',
+    width: 100,
     customRender: ({ text }: any) => {
       return text || '--';
     }
   },
   {
-    title: '照片类型',
+    title: '文件类型',
     dataIndex: 'picture_type',
-    width: 150,
+    width: 100,
     customRender: ({ text }: any) => {
       return text || '--';
     }
@@ -229,22 +247,38 @@ const rowClassName = (record: any, index: number) => {
 
 // 点击批量下载
 const onClickBatchDownload = async () => {
-  console.log(state.selectedRowKeys, '点击批量下载');
+  state.downloadLoading = true;
+  try {
+    const bold = await apis.batchDownloadFile({
+      id: state.selectedRowKeys.join(',')
+    });
+    const data = new Blob([bold], { type: 'application/zip' });
+    downloadFile(data, state.dirName);
+  } catch (e) {
+    console.error(e);
+  } finally {
+    state.downloadLoading = false;
+  }
 }
 
 // 点击批量删除
 const onClickBatchDelete = async () => {
-  console.log(state.selectedRowKeys, '点击批量删除');
+  const canDeleteList = state.list.filter(item => state.selectedRowKeys.includes(item.file_id) && item.media_type === 2);
+  const data = {
+    id: canDeleteList.map(item => item.file_id).join(',')
+  }
+  await apis.batchDeletePicture(data);
+  await fetchList()
 }
 
 // 点击搜索
-const onClickSearch = async () => {
-  console.log('点击搜索');
+const onClickSearch = async (query: any) => {
+  await fetchList(query);
 }
 
 // 点击重置
-const onClickReset = async () => {
-  console.log('点击重置');
+const onClickReset = async (query: any) => {
+  await fetchList(query);
 }
 
 // 点击返回
@@ -271,7 +305,7 @@ const fileInfoOnClickClose = () => {
 
 // 点击照片位置
 const onClickPhotoPosition = () => {
-
+  console.log('点击之后,在地图上显示这个图片的点标记信息');
 }
 
 // 点击重命名
@@ -280,19 +314,28 @@ const onClickRechristen = () => {
 }
 
 // 点击删除
-const onClickDelete = () => {
-
+const onClickDelete = async (record: any) => {
+  const data = {
+    id: record.file_id
+  }
+  await apis.batchDeletePicture(data);
 }
 
 // 点击下载
 const onClickDownload = async (record: any) => {
-  state.listLoading = true;
+  state.downloadLoading = true;
   try {
-
+    const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '';
+    const res = await downloadMediaFile(workspaceId, record.file_id)
+    if (!res) {
+      return
+    }
+    const data = new Blob([res])
+    downloadFile(data, record.file_name)
   } catch (e) {
     console.error(e);
   } finally {
-    state.listLoading = false;
+    state.downloadLoading = false;
   }
 }
 </script>

+ 69 - 59
Web/src/pages/page-web/projects/media/index/components/Search.vue

@@ -7,28 +7,37 @@
     </a-col>
     <a-col>
       <a-form ref="formRef" layout="inline" :model="formModel" :colon="false">
-        <a-form-item name="date">
-          <a-range-picker style="width: 250px;" v-model:value="formModel.date" />
+        <a-form-item name="rangeDate">
+          <a-range-picker style="width: 250px;" v-model:value="formModel.rangeDate" />
         </a-form-item>
-        <a-form-item name="status">
-          <a-select style="width: 200px;" placeholder="请选择任务类型" v-model:value="formModel.status">
-            <a-select-option value="1">
-              飞行类型
+        <a-form-item name="template_type">
+          <a-select style="width: 200px;" placeholder="任务类型" v-model:value="formModel.template_type">
+            <a-select-option :value="0">
+              航点航线
             </a-select-option>
-            <a-select-option value="2">
-              航拍类型
+            <a-select-option :value="1">
+              二维正射
+            </a-select-option>
+            <a-select-option :value="2">
+              倾斜摄影
+            </a-select-option>
+            <a-select-option :value="3">
+              带状航线
+            </a-select-option>
+            <a-select-option :value="4">
+              无
             </a-select-option>
           </a-select>
         </a-form-item>
-        <a-form-item name="device_name">
-          <a-select style="width: 200px;" placeholder="请选择拍摄负载" v-model:value="formModel.device_name">
-            <a-select-option value="1">
-              Mavic 3E Camera
+        <a-form-item name="payload">
+          <a-select style="width: 200px;" placeholder="拍摄负载" v-model:value="formModel.payload">
+            <a-select-option v-for="item in state.payloadList" :value="item.value">
+              {{ item.label }}
             </a-select-option>
           </a-select>
         </a-form-item>
-        <a-form-item name="keyword">
-          <a-input style="width: 200px;" placeholder="文件夹名称" v-model:value="formModel.keyword" />
+        <a-form-item name="search_info">
+          <a-input style="width: 200px;" placeholder="文件夹名称" v-model:value="formModel.search_info" />
         </a-form-item>
         <a-form-item>
           <a-button style="margin-right: 10px;" @click="handleClicSekarch">
@@ -45,32 +54,13 @@
       </a-form>
     </a-col>
   </a-row>
-  <a-modal v-model:visible="state.visible" title="设备绑定码" :footer="null">
-    <div>
-      请在 Pilot2 机场部署流程-云服务配置中,以组织ID和设备绑定码来绑定机场设备。
-    </div>
-    <div class="modal-item">
-      <div class="modal-item-title">
-        项目名称
-      </div>
-      <div>
-        上海展域航空技术有限公司
-      </div>
-    </div>
-    <div class="modal-item">
-      <div class="modal-item-title">
-        设备绑定码
-      </div>
-      <div>
-        PB97VR
-      </div>
-    </div>
-  </a-modal>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue';
+import { ref, reactive, onMounted } from 'vue';
 import { SearchOutlined, ReloadOutlined } from '@ant-design/icons-vue';
+import { apis } from '/@/api/custom';
+import moment from 'moment';
 
 interface Props {
   mode: 'table' | 'list',
@@ -87,42 +77,62 @@ const props = withDefaults(defineProps<Props>(), {
 const formRef = ref();
 
 const formModel = reactive({
-  date: [],
-  status: undefined,
-  device_name: undefined,
-  keyword: '',
+  rangeDate: [],
+  template_type: undefined,
+  payload: undefined,
+  search_info: undefined,
+})
+
+interface State {
+  payloadList: {
+    value: string,
+    label: string,
+  }[],
+};
+
+const state: State = reactive({
+  payloadList: [],
 })
 
-const state = reactive({
-  visible: false,
+onMounted(async () => {
+  try {
+    const res = await apis.fetchPayloadList();
+    const list = res.data.map((item: any) => {
+      return {
+        value: item.payload_name,
+        label: item.payload_name,
+      }
+    })
+    state.payloadList = list;
+  } catch (e) {
+    console.error(e);
+  }
 })
 
 // 点击查询
 const handleClicSekarch = async () => {
   const values = formRef.value?.getFieldsValue();
-  await props.onClickSearch(values);
+  const data = {
+    ...values,
+  };
+  delete data.rangeDate;
+  if (values.rangeDate.length === 2) {
+    data.begin_time = moment(values.rangeDate[0]).valueOf();
+    data.end_time = moment(values.rangeDate[1]).valueOf();
+  }
+  await props.onClickSearch(data);
 }
 
 // 点击重置
 const handleClickReset = async () => {
   formRef.value?.resetFields();
   const values = formRef.value?.getFieldsValue();
-  await props.onClickReset(values);
+  const data = {
+    ...values,
+  };
+  delete data.rangeDate;
+  await props.onClickReset(data);
 }
 </script>
 
-<style lang="scss" scoped>
-.popover {
-  width: 200px;
-}
-
-.modal-item {
-  display: flex;
-  margin-top: 20px;
-
-  &-title {
-    width: 100px;
-    font-weight: bold;
-  }
-}
-</style>
+<style lang="scss" scoped></style>

+ 107 - 87
Web/src/pages/page-web/projects/media/index/index.vue

@@ -1,86 +1,88 @@
 <template>
-  <div class="mediaList">
-    <Search :mode="state.mode" :selectedRowKeys="state.selectedRowKeys" :onClickDownload="onClickBatchDownload"
-      :onClickSearch="onClickSearch" :onClickReset="onClickReset" />
-    <div style="background: #FFFFFF;padding: 20px;">
-      <div class="mediaList-info">
-        <div>
-          媒体文件
-        </div>
-        <div class="mediaList-info-right">
-          <div class="mediaList-info-right-text">
-            <div>
-              已选/全部:
-            </div>
-            <div>
-              {{ state.selectedRowKeys.length }}/{{ paginationConfig.total }}
+  <a-spin :spinning="state.downloadLoading" tip="下载中...">
+    <div class="mediaList">
+      <Search :mode="state.mode" :selectedRowKeys="state.selectedRowKeys" :onClickDownload="onClickBatchDownload"
+        :onClickSearch="onClickSearch" :onClickReset="onClickReset" />
+      <div style="background: #FFFFFF;padding: 20px;">
+        <div class="mediaList-info">
+          <div>
+            媒体文件
+          </div>
+          <div class="mediaList-info-right">
+            <div class="mediaList-info-right-text">
+              <div>
+                已选/全部:
+              </div>
+              <div>
+                {{ state.selectedRowKeys.length }}/{{ paginationConfig.total }}
+              </div>
             </div>
+            <a-button style="padding:0 5px;" :type="state.mode === 'table' ? 'primary' : 'default'"
+              :ghost="state.mode === 'table'" size="small" @click="state.mode = 'table'">
+              <MenuOutlined />
+            </a-button>
+            <a-button style="padding:0 5px;" :type="state.mode === 'list' ? 'primary' : 'default'"
+              :ghost="state.mode === 'list'" size="small" @click="state.mode = 'list'">
+              <AppstoreOutlined />
+            </a-button>
           </div>
-          <a-button style="padding:0 5px;" :type="state.mode === 'table' ? 'primary' : 'default'"
-            :ghost="state.mode === 'table'" size="small" @click="state.mode = 'table'">
-            <MenuOutlined />
-          </a-button>
-          <a-button style="padding:0 5px;" :type="state.mode === 'list' ? 'primary' : 'default'"
-            :ghost="state.mode === 'list'" size="small" @click="state.mode = 'list'">
-            <AppstoreOutlined />
-          </a-button>
         </div>
-      </div>
-      <div class="mediaList-table" v-if="state.mode === 'table'">
-        <a-table :scroll="{ x: '100%', y: 500 }" :childrenColumnName="null" rowKey="id" :loading="state.listLoading"
-          :columns="columns" :dataSource="state.list" :rowClassName="rowClassName" :pagination="paginationConfig"
-          :rowSelection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }">
-          <!-- 文件夹名称 -->
-          <template #dir_name="{ record }">
-            <a-tooltip :title="record.dir_name">
-              <div class="fileName" @click="onClickFile(record)">
-                <img :src="fileSrc">
-                <div>
-                  {{ record.dir_name }}
+        <div class="mediaList-table" v-if="state.mode === 'table'">
+          <a-table :scroll="{ x: '100%', y: 500 }" :childrenColumnName="null" rowKey="id" :loading="state.listLoading"
+            :columns="columns" :dataSource="state.list" :rowClassName="rowClassName" :pagination="paginationConfig"
+            :rowSelection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }">
+            <!-- 文件夹名称 -->
+            <template #dir_name="{ record }">
+              <a-tooltip :title="record.dir_name">
+                <div class="fileName" @click="onClickFile(record)">
+                  <img :src="fileSrc">
+                  <div>
+                    {{ record.dir_name }}
+                  </div>
                 </div>
-              </div>
-            </a-tooltip>
-          </template>
-          <!-- 操作 -->
-          <template #action="{ record }">
-            <div class="flex-align-center flex-row" style="color: #2d8cf0">
-              <a-tooltip title="压缩下载">
-                <DownloadOutlined style="margin-right: 10px;" @click="onClickDownload(record)" />
-              </a-tooltip>
-              <a-tooltip title="轨迹回放">
-                <EnvironmentOutlined @click="onClickTrajectory" />
               </a-tooltip>
-            </div>
-          </template>
-        </a-table>
-      </div>
-      <div class="mediaList-list" v-else>
-        <a-list :grid="{ gutter: 16, xs: 1, sm: 2, md: 3, lg: 4, xl: 8, xxl: 12 }" :loading="state.listLoading"
-          :dataSource="state.list" :pagination="paginationConfig">
-          <template #renderItem="{ item }">
-            <a-list-item>
-              <a-card hoverable @click="onClickFile(item)">
-                <template #cover>
-                  <div style="display: flex;justify-content:center;align-items: center;">
-                    <img style="width: 70%;" :src="fileSrc" />
-                  </div>
-                </template>
-                <a-card-meta>
-                  <template #description>
-                    <a-tooltip placement="bottom" :title="item.dir_name">
-                      <div class="mediaList-list-name">
-                        {{ item.dir_name }}
-                      </div>
-                    </a-tooltip>
+            </template>
+            <!-- 操作 -->
+            <template #action="{ record }">
+              <div class="flex-align-center flex-row" style="color: #2d8cf0">
+                <a-tooltip title="压缩下载">
+                  <DownloadOutlined style="margin-right: 10px;" @click="onClickDownload(record)" />
+                </a-tooltip>
+                <a-tooltip title="轨迹回放">
+                  <EnvironmentOutlined @click="onClickTrajectory" />
+                </a-tooltip>
+              </div>
+            </template>
+          </a-table>
+        </div>
+        <div class="mediaList-list" v-else>
+          <a-list :grid="{ gutter: 16, xs: 1, sm: 2, md: 3, lg: 4, xl: 8, xxl: 12 }" :loading="state.listLoading"
+            :dataSource="state.list" :pagination="paginationConfig">
+            <template #renderItem="{ item }">
+              <a-list-item>
+                <a-card hoverable @click="onClickFile(item)">
+                  <template #cover>
+                    <div style="display: flex;justify-content:center;align-items: center;">
+                      <img style="width: 70%;" :src="fileSrc" />
+                    </div>
                   </template>
-                </a-card-meta>
-              </a-card>
-            </a-list-item>
-          </template>
-        </a-list>
+                  <a-card-meta>
+                    <template #description>
+                      <a-tooltip placement="bottom" :title="item.dir_name">
+                        <div class="mediaList-list-name">
+                          {{ item.dir_name }}
+                        </div>
+                      </a-tooltip>
+                    </template>
+                  </a-card-meta>
+                </a-card>
+              </a-list-item>
+            </template>
+          </a-list>
+        </div>
       </div>
     </div>
-  </div>
+  </a-spin>
 </template>
 
 <script lang="ts" setup>
@@ -91,11 +93,13 @@ import fileSrc from '/@/assets/media/file.svg';
 import { apis } from '/@/api/custom';
 import router from '/@/router/index';
 import { downloadFile } from '/@/utils/common';
+import moment from 'moment';
 
 interface State {
   listLoading: boolean,
   list: any[],
   selectedRowKeys: string[],
+  downloadLoading: boolean,
   mode: 'table' | 'list',
 };
 
@@ -103,6 +107,7 @@ const state: State = reactive({
   listLoading: false,
   list: [],
   selectedRowKeys: [],
+  downloadLoading: false,
   mode: 'table',
 })
 
@@ -123,10 +128,14 @@ const paginationConfig = reactive({
   }
 })
 
-const fetchList = async () => {
+const fetchList = async (query?: any) => {
   state.listLoading = true;
   try {
-    const res = await apis.fetchMediaFileList({ page: paginationConfig.current, page_size: paginationConfig.pageSize });
+    const res = await apis.fetchMediaFileList({
+      ...query,
+      page: paginationConfig.current,
+      page_size: paginationConfig.pageSize,
+    });
     state.list = res.data.list;
     paginationConfig.current = res.data.pagination.page;
     paginationConfig.pageSize = res.data.pagination.page_size;
@@ -165,11 +174,11 @@ const columns = [
   },
   {
     title: '容量大小',
-    dataIndex: 'is_original',
+    dataIndex: 'size',
     width: 150,
     ellipsis: true,
     customRender: ({ text }: any) => {
-      return text || '--';
+      return text > 0 ? (text / 1024 / 1024).toFixed(1) + 'M' : '--';
     }
   },
   {
@@ -215,17 +224,28 @@ const rowClassName = (record: any, index: number) => {
 
 // 点击批量下载
 const onClickBatchDownload = async () => {
-  console.log(state.selectedRowKeys, '点击批量下载');
+  state.downloadLoading = true;
+  try {
+    const bold = await apis.batchDownloadMediaFile({
+      id: state.selectedRowKeys.join(',')
+    });
+    const data = new Blob([bold], { type: 'application/zip' });
+    downloadFile(data, moment().format('YYYY-MM-DD HH:mm:ss'));
+  } catch (e) {
+    console.error(e);
+  } finally {
+    state.downloadLoading = false;
+  }
 }
 
 // 点击搜索
-const onClickSearch = async () => {
-  console.log('点击搜索');
+const onClickSearch = async (query: any) => {
+  await fetchList(query);
 }
 
 // 点击重置
-const onClickReset = async () => {
-  console.log('点击重置');
+const onClickReset = async (query: any) => {
+  await fetchList(query);
 }
 
 // 点击文件夹
@@ -240,15 +260,15 @@ const onSelectChange = (selectedRowKeys: string[]) => {
 
 // 点击下载
 const onClickDownload = async (record: any) => {
-  state.listLoading = true;
+  state.downloadLoading = true;
   try {
-    const bold = await apis.downloadMediaFile(record.id);
+    const bold = await apis.batchDownloadMediaFile({ id: record.id });
     const data = new Blob([bold], { type: 'application/zip' });
-    downloadFile(data, record.dir_name)
+    downloadFile(data, record.dir_name);
   } catch (e) {
     console.error(e);
   } finally {
-    state.listLoading = false;
+    state.downloadLoading = false;
   }
 }
 

Some files were not shown because too many files changed in this diff