回收站列表信息展示:
controller层:

最后选择转成FileInfoVO看前端  直接传递result也可以 思路简单不赘述 前面多篇里面提及分页展示 这里也不赘述
 

@RequestMapping("/loadRecycleList")
@GlobalInterceptor
public ResponseVO loadRecycleList(HttpSession session, Integer pageNo, Integer pageSize){
    FileInfoQuery query = new FileInfoQuery();
    query.setPageSize(pageSize);
    query.setPageNo(pageNo);
    query.setUserId(getUserInfoFromSession(session).getUserId());
    query.setOrderBy("recovery_time desc");
    query.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag());
    PaginationResultVO result = fileInfoService.findListByPage(query);
    return getSuccessResponseVO(convert2PaginationVO(result, FileInfoVO.class));
}
protected <S, T> PaginationResultVO<T> convert2PaginationVO(PaginationResultVO<S> result, Class<T> classz) {
    PaginationResultVO<T> resultVO = new PaginationResultVO<>();
    resultVO.setList(CopyTools.copyList(result.getList(), classz));
    resultVO.setPageNo(result.getPageNo());
    resultVO.setPageSize(result.getPageSize());
    resultVO.setPageTotal(result.getPageTotal());
    resultVO.setTotalCount(result.getTotalCount());
    return resultVO;
}

还原文件:
controller层:
 

@RequestMapping("/recoverFile")
@GlobalInterceptor
public ResponseVO recoverFile(HttpSession session, @VerifyParam(required = true) String fileIds) {
    SessionWebUserDto webUserDto = getUserInfoFromSession(session);
    fileInfoService.recoverFileBatch(webUserDto.getUserId(), fileIds);
    return getSuccessResponseVO(null);
}

实现层:findAllSubFolderFileList作用是找出文件夹下的子文件夹 这段代码我个人理解是先找出所有文件夹将他们变回使用中 再找出所有的文件 最后检查重命名 但是这一段代码中包含对根目录的查询 我个人是不太理解这一段代码的 但是ai给出的结果是这段代码必不可少(注释带有查询所有根目录的文件)  感兴趣可以思考下为什么
 

@Override
@Transactional(rollbackFor = Exception.class)
public void recoverFileBatch(String userId, String fileIds) {
   String[] fileIdArray = fileIds.split(",");
   FileInfoQuery query = new FileInfoQuery();
   query.setUserId(userId);
   query.setFileIdArray(fileIdArray);
   query.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag());
   List<FileInfo> fileInfoList = this.fileInfoMapper.selectList(query);
   List<String> delFileSubFloderFileIdList = new ArrayList<>();
   for (FileInfo fileInfo : fileInfoList) {
      if (FileFolderTypeEnums.FOLDER.getType().equals(fileInfo.getFolderType())) {
         findAllSubFolderFileList(delFileSubFloderFileIdList, userId, fileInfo.getFileId(), FileDelFlagEnums.DEL.getFlag());
      }
   }
   //查询所有根目录的文件
   query = new FileInfoQuery();
   query.setUserId(userId);
   query.setDelFlag(FileDelFlagEnums.USING.getFlag());
   query.setFilePid(Constants.ZERO_STR);
   List<FileInfo> allRootFileList = this.findListByParam(query);
   Map<String, FileInfo> rootFileMap = allRootFileList.stream().collect(Collectors.toMap(FileInfo::getFileName, Function.identity(), (data1, data2) -> data2));
   //查询所有所选文件 将目录下的所有删除的文件给你更新为使用中
   if (!delFileSubFloderFileIdList.isEmpty()) {
      FileInfo fileInfo = new FileInfo();
      fileInfo.setDelFlag(FileDelFlagEnums.USING.getFlag());
      this.fileInfoMapper.updateFileDelFlagBatch(fileInfo, userId, delFileSubFloderFileIdList, null, FileDelFlagEnums.DEL.getFlag());
   }
   //将选中文件更新为正常且父级文件目录到根目录
   List<String> delFileIdList = Arrays.asList(fileIdArray);
   FileInfo fileInfo = new FileInfo();
   fileInfo.setDelFlag(FileDelFlagEnums.USING.getFlag());
   fileInfo.setFilePid(Constants.ZERO_STR);
   fileInfo.setLastUpdateTime(new Date());
   this.fileInfoMapper.updateFileDelFlagBatch(fileInfo, userId, null, delFileIdList, FileDelFlagEnums.RECYCLE.getFlag());
   //将所选文件重命名
   for (FileInfo item : fileInfoList) {
      FileInfo rootFileInfo = rootFileMap.get(item.getFileName());
      //文件名已经存在,重命名被还原到额文件名
      if (rootFileInfo != null) {
         String fileName = StringTools.rename(item.getFileName());
         FileInfo updateInfo = new FileInfo();
         updateInfo.setFileName(fileName);
         this.fileInfoMapper.updateByFileIdAndUserId(updateInfo, item.getFileId(), userId);
      }
   }
}

彻底删除:
controller层:
 

@RequestMapping("/delFile")
@GlobalInterceptor
public ResponseVO delFile(HttpSession session, @VerifyParam(required = true) String fileIds) {
    SessionWebUserDto webUserDto = getUserInfoFromSession(session);
    fileInfoService.delFileBatch(webUserDto.getUserId(), fileIds, false);
    return getSuccessResponseVO(null);
}

实现层:

这一段代码逻辑与上述的代码逻辑类似 唯一值得注意的就是adminOp参数 这个参数是区分普通用户删除与管理员删除 若是false则为普通用户删除 只会删除在回收站内的数据 而为true 为管理者删除 不会在乎文件是否在可使用中还是回收站状态 都直接删除
 

@Override
@Transactional(rollbackFor = Exception.class)
public void delFileBatch(String userId, String fileIds, Boolean adminOp) {
   String[] fileIdArray = fileIds.split(",");
   FileInfoQuery query = new FileInfoQuery();
   query.setUserId(userId);
   query.setFileIdArray(fileIdArray);
   query.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag());
   List<FileInfo> fileInfoList = this.fileInfoMapper.selectList(query);
   List<String> delFileSubFileFolderFileIdList = new ArrayList<>();
   //找到所选文件子目录文件ID
   for (FileInfo fileInfo : fileInfoList) {
      if (FileFolderTypeEnums.FOLDER.getType().equals(fileInfo.getFolderType())) {
         findAllSubFolderFileList(delFileSubFileFolderFileIdList, userId, fileInfo.getFileId(), FileDelFlagEnums.DEL.getFlag());
      }
   }
   //删除所有选文件,子目录中的文件
   if (!delFileSubFileFolderFileIdList.isEmpty()) {
      this.fileInfoMapper.delFileBatch(userId, delFileSubFileFolderFileIdList, null, adminOp ? null : FileDelFlagEnums.DEL.getFlag());
   }
   //删除所选文件
   this.fileInfoMapper.delFileBatch(userId, null, Arrays.asList(fileIdArray), adminOp ? null : FileDelFlagEnums.RECYCLE.getFlag());

   Long useSpace = this.fileInfoMapper.selectUseSpace(userId);
   UserInfo userInfo = new UserInfo();
   userInfo.setUseSpace(useSpace);
   this.userInfoMapper.updateByUserId(userInfo, userId);

   //设置缓存
   UserSpaceDto userSpaceDto = redisComponent.getUserSpaceUse(userId);
   userSpaceDto.setUseSpace(useSpace);
   redisComponent.saveUserSpaceUse(userId, userSpaceDto);
}

方法mapper层:
 

<delete id="delFileBatch">
   delete from file_info where user_id = #{userId}
   <if test="filePidList!=null">
      and file_pid in (<foreach collection="filePidList" separator="," item="item">#{item}</foreach>)
   </if>
   <if test="fileIdList!=null">
      and file_id in (<foreach collection="fileIdList" separator="," item="item">#{item}</foreach>)
   </if>
   <if test="oldDelFlag!=null">
      and del_flag = #{oldDelFlag}
   </if>
</delete>
Logo

分享最新、最前沿的AI大模型技术,吸纳国内前几批AI大模型开发者

更多推荐