Browse Source

文件 文件夹删除

S0025136190 1 year ago
parent
commit
9aef67cf77

+ 16 - 0
Backend/sample/src/main/java/com/dji/sample/media/controller/FileController.java

@@ -244,4 +244,20 @@ public class FileController {
         fileService.deleteMediaElement(workspaceId,mediaFile);
         return HttpResultResponse.success();
     }
+
+    @DeleteMapping("/{workspace_id}/deleteDir")
+    public HttpResultResponse deleteDir(@PathVariable(name = "workspace_id") String workspaceId,
+                                          @NotNull @Size(min = 1) @RequestParam(name = "id") String id,
+                                          HttpServletResponse response) throws Exception {
+        fileService.deleteByDirId(id);
+        return HttpResultResponse.success();
+    }
+
+    @DeleteMapping("/{workspace_id}/deleteFileById")
+    public HttpResultResponse deleteFileById(@PathVariable(name = "workspace_id") String workspaceId,
+                                        @NotNull @Size(min = 1) @RequestParam(name = "id") String id,
+                                        HttpServletResponse response) throws Exception {
+        fileService.deleteFileById(id);
+        return HttpResultResponse.success();
+    }
 }

+ 4 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/IFileService.java

@@ -111,4 +111,8 @@ public interface IFileService {
     PaginationData<UpstreamMediaFileDTO> getMediaFilesPagination(String workspaceName, Long startTime, Long endTime, long page, long pageSize,String workspaceId);
 
     UploadResultDTO uploadFile(MultipartFile file,String creator);
+
+    void deleteByDirId(String dirId);
+
+    void deleteFileById(String id);
 }

+ 3 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/IMediaDirService.java

@@ -45,4 +45,7 @@ public interface IMediaDirService {
      * @return
      */
     MediaDirDTO createDir(MediaDirEntity dirEntity);
+
+    void deleteDir(String dirId);
+
 }

+ 28 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java

@@ -3,6 +3,7 @@ package com.dji.sample.media.service.impl;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ZipUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dji.sample.common.util.*;
@@ -879,4 +880,31 @@ public class FileServiceImpl implements IFileService {
         }
     }
 
+    @Override
+    public void deleteByDirId(String dirId) {
+        mediaDirService.deleteDir(dirId);
+        QueryWrapper<MediaFileEntity> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(MediaFileEntity::getDirId,dirId);
+        List<MediaFileEntity> list = mapper.selectList(wrapper);
+        for(MediaFileEntity entity : list) {
+            deleteFileById(String.valueOf(entity.getId()));
+        }
+    }
+
+    @Override
+    public void deleteFileById(String id) {
+        List<MediaFileEntity> listData = mapper.selectList(
+                new LambdaQueryWrapper<MediaFileEntity>()
+                        .eq(MediaFileEntity::getId, id));
+        for(MediaFileEntity entity : listData) {
+            try {
+                mapper.deleteById(id);
+                ossService.deleteObject(OssConfiguration.bucket, entity.getObjectKey());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
 }

+ 8 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/impl/MediaDirServiceImpl.java

@@ -8,6 +8,7 @@ import com.dji.sample.media.model.MediaDirDTO;
 import com.dji.sample.media.model.MediaDirEntity;
 import com.dji.sample.media.model.MediaFileDTO;
 import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.media.service.IFileService;
 import com.dji.sample.media.service.IMediaDirService;
 import com.dji.sample.wayline.model.enums.WaylineTemplateTypeEnum;
 import com.dji.sdk.common.Pagination;
@@ -94,6 +95,13 @@ public class MediaDirServiceImpl implements IMediaDirService {
         return null;
     }
 
+    @Override
+    public void deleteDir(String dirId) {
+        mapper.deleteById(dirId);
+    }
+
+
+
     private MediaDirEntity dtoToEntity(MediaDirDTO mediaDir) {
         MediaDirEntity.MediaDirEntityBuilder builder = MediaDirEntity.builder();
 

+ 1 - 1
Backend/sample/src/main/resources/application.yml

@@ -2,7 +2,7 @@ server:
   port: 6789
 spring:
   profiles:
-    active: prd
+    active: test
   main:
     allow-bean-definition-overriding: true
   application:

+ 12 - 0
Web/src/api/custom/index.ts

@@ -101,6 +101,10 @@ export type FetchPilotPasswordApiParams = {
     userId: string,
 };
 
+export type DeleteDirApiParams = {
+    id: string
+};
+
 // Api函数类型
 export type FetchDeviceLogListApi = (sn: string, params: { domain_list: string }) => Promise<any>;
 export type FetchDeviceFeedbackRecordListApi = (sn: string, params: FetchDeviceFeedbackRecordListApiParams) => Promise<any>;
@@ -126,6 +130,7 @@ export type FetchTrajectoryListApi = (params: FetchTrajectoryListApiParams) => P
 export type FetchTrajectoryMapApi = (taskId: string) => Promise<any>;
 export type AddPilotApi = (data: AddPilotApiParams) => Promise<any>;
 export type FetchPilotPasswordApi = (params: FetchPilotPasswordApiParams) => Promise<any>;
+export type DeleteDirApi = (params: DeleteDirApiParams) => Promise<any>;
 
 export const getUploadPath = () => {
     return `api/media/api/v1/files/${getWorkspaceId()}/file/upload`;
@@ -288,6 +293,12 @@ const fetchPilotPasswordApi: FetchPilotPasswordApi = async (params) => {
     return res.data;
 };
 
+// 删除文件夹
+const deleteDirApi: DeleteDirApi = async (params) => {
+    const res = await request.delete(`/media/api/v1/files/${getWorkspaceId()}/deleteDir`, { params: params });
+    return res.data;
+};
+
 export const apis = {
     fetchDeviceLogList: fetchDeviceLogListApi,
     fetchDeviceFeedbackRecordList: fetchDeviceFeedbackRecordListApi,
@@ -313,4 +324,5 @@ export const apis = {
     fetchTrajectoryMap: fetchTrajectoryMapApi,
     AddPilot: addPilotApi,
     fetchPilotPassword: fetchPilotPasswordApi,
+    deleteDir: deleteDirApi,
 };

+ 33 - 7
Web/src/pages/page-web/projects/media/detail/index.vue

@@ -74,7 +74,7 @@
               <a-tooltip title="重命名" v-else-if="record.media_type === 4">
                 <EditOutlined style="margin-right: 10px;" @click="onClickRechristen(record)" />
               </a-tooltip>
-              <a-tooltip title="删除" v-else-if="record.media_type === 2">
+              <a-tooltip title="删除" >
                 <DeleteOutlined style="margin-right: 10px;" @click="onClickDelete(record)" />
               </a-tooltip>
               <a-tooltip title="压缩下载">
@@ -92,7 +92,7 @@
 
 <script lang="ts" setup>
 import { reactive, onMounted } from 'vue';
-import { message } from 'ant-design-vue';
+import { message ,Modal} from 'ant-design-vue';
 import { EditOutlined, DeleteOutlined, DownloadOutlined, AimOutlined, CheckOutlined, CloseOutlined } from '@ant-design/icons-vue';
 import Search from './components/Search.vue';
 import FileInfo from './components/FileInfo.vue';
@@ -102,7 +102,7 @@ import { apis } from '/@/api/custom';
 import router from '/@/router/index';
 import { downloadFile } from '/@/utils/common';
 import { downloadMediaFile } from '/@/api/media';
-import { getWorkspaceId } from '/@/utils/index'
+import { getWorkspaceId } from '/@/utils/index';
 
 interface State {
   query: any,
@@ -253,12 +253,24 @@ const onClickBatchDownload = async () => {
 
 // 点击批量删除
 const onClickBatchDelete = async () => {
-  const canDeleteList = state.list.filter(item => state.selectedRowKeys.includes(item.file_id) && item.media_type === 2);
+  const canDeleteList = state.list.filter(item => state.selectedRowKeys.includes(item.file_id));
   const data = {
     id: canDeleteList.map(item => item.file_id).join(',')
   }
-  await apis.batchDeletePicture(data);
-  await fetchList()
+  Modal.confirm({
+    title: '删除',
+    content: '您确认删除文件吗?',
+    okType: 'danger',
+    onOk: async () => {
+      try {
+        await apis.batchDeletePicture(data);
+        message.success('删除成功');
+        await fetchList();
+      } catch (error) {
+        message.error('删除失败: ' + error);
+      }
+    },
+  })
 }
 
 // 点击搜索
@@ -332,10 +344,24 @@ const onClickSave = async (record: any) => {
 
 // 点击删除
 const onClickDelete = async (record: any) => {
+  console.log(record,"record");
   const data = {
     id: record.file_id
   }
-  await apis.batchDeletePicture(data);
+  Modal.confirm({
+    title: '删除',
+    content: '您确认删除文件吗?',
+    okType: 'danger',
+    onOk: async () => {
+      try {
+        await apis.batchDeletePicture(data);
+        message.success('删除成功');
+        await fetchList();
+      } catch (error) {
+        message.error('删除失败: ' + error);
+      }
+    },
+  })
 }
 
 // 点击下载

+ 27 - 1
Web/src/pages/page-web/projects/media/index/index.vue

@@ -47,6 +47,9 @@
               <a-tooltip title="压缩下载">
                 <DownloadOutlined style="color: #2d8cf0;" @click="onClickDownload(record)" />
               </a-tooltip>
+              <a-tooltip title="删除">
+                <DeleteOutlined style="color: #2d8cf0;" @click="onClickDelete(record)" />
+              </a-tooltip>
             </template>
           </a-table>
         </div>
@@ -82,13 +85,14 @@
 
 <script lang="ts" setup>
 import { reactive, onMounted } from 'vue';
-import { MenuOutlined, AppstoreOutlined, DownloadOutlined, EnvironmentOutlined } from '@ant-design/icons-vue';
+import { MenuOutlined, AppstoreOutlined, DownloadOutlined, EnvironmentOutlined,DeleteOutlined } from '@ant-design/icons-vue';
 import Search from './components/Search.vue';
 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';
+import { Modal,message } from 'ant-design-vue'
 
 interface State {
   query: any,
@@ -291,6 +295,28 @@ const onClickDownload = async (record: any) => {
     state.downloadLoading = false;
   }
 }
+
+const onClickDelete = async (record: any) => {
+  const data = {
+    id: record.id
+  }
+  Modal.confirm({
+    title: '删除文件夹',
+    content: '您确认删除该文件夹吗?',
+    okType: 'danger',
+    onOk: async () => {
+      try {
+        await apis.deleteDir(data);
+        message.success('删除成功');
+        fetchList();
+      } catch (error) {
+        message.error('删除失败: ' + error);
+      }
+    },
+  })
+  
+  
+}
 </script>
 
 <style lang="scss">