easypan项目实战---回收站,还原,彻底删除
·
回收站列表信息展示:
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>更多推荐
所有评论(0)