彻底删除不同于移入回收站,其会恢复用户的使用空间,并直接从数据库删除。当然这里也可以将状态置为DEL,回收站也无法查询到。

定义Mapper

找到 FileInfoMapper 接口,在其中添加如下方法定义,批量更新文件的删除和回收状态

FileInfoMapper
Integer delFileBatch(@Param("userId") String userId,
@Param("pidList") List<String> delFilePidList,
@Param("idList") List<String> idList,
@Param("oldDelFlag") Integer oldDelFlag);

找到 FileInfoMapper.xml 文件,实现上述方法

FileInfoMapper.xml
<delete id="delFileBatch">
delete from file_info
<where>
<if test="userId != null">
and user_id = #{userId}
</if>
<if test="pidList != null">
and file_pid in(<foreach collection="pidList" separator="," item="item">#{item}</foreach>)
</if>
<if test="idList != null">
and id in(<foreach collection="idList" separator="," item="item">#{item}</foreach>)
</if>
<if test="oldDelFlag != null">
and deleted = #{oldDelFlag}
</if>
</where>
</delete>

定义Service

FileInfoService

这里定义批量删除文件的方法,找到 FileInfoService 接口,在其中添加:

FileInfoService
/**
* 批量删除文件
*
* @param userId 用户ID
* @param delFilePidList 根据pid删除
* @param idList 根据id删除
* @param oldDelFlag 旧状态
*/
Boolean delFileBatch(String userId, List<String> delFilePidList, List<String> idList, Integer oldDelFlag);

在 UserInfoServiceImpl 中实现该方法

@Override
public Boolean delFileBatch(String userId, List<String> delFilePidList, List<String> idList, Integer oldDelFlag) {
Integer deleted = baseMapper.delFileBatch(userId, delFilePidList, idList, oldDelFlag);
return deleted != null && deleted > 0;
}

UserFileService

彻底删除设计到更新用户信息表,这里将方法写在 UserFileService 中:

UserFileService
/**
* 批量删除文件
*
* @param userId 用户ID
* @param ids 需要删除的文件ID,逗号分隔
* @param isAdmin 是否是管理员
*/
void delFileBatch(String userId, String ids, Boolean isAdmin);

在 UserFileServiceImpl 中实现该方法。

UserFileServiceImpl
@Override
@Transactional(rollbackFor = Exception.class)
public void delFileBatch(String userId, String ids, Boolean isAdmin) {
List<String> idList = Arrays.asList(ids.split(","));
LambdaQueryWrapper<FileInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(FileInfo::getUserId, userId)
.eq(FileInfo::getDeleted, FileDelFlagEnums.RECYCLE.getFlag())
.in(!idList.isEmpty(), FileInfo::getId, idList);
List<FileInfo> fileInfoList = fileInfoService.list(wrapper);

List<String> delFileSubFolderFileList = new ArrayList<>();
// 找到所选文件子目录文件ID
for (FileInfo fileInfo : fileInfoList) {
if (FileFolderTypeEnums.FOLDER.getType().equals(fileInfo.getFolderType())) {
fileInfoServiceImpl.findAllSubFolderList(delFileSubFolderFileList, userId, fileInfo.getId(), FileDelFlagEnums.DEL.getFlag());
}
}
// 删除所选文件子目录中的文件
if (!delFileSubFolderFileList.isEmpty()) {
fileInfoService.delFileBatch(userId, delFileSubFolderFileList, null, isAdmin ? null : FileDelFlagEnums.DEL.getFlag());
}
// 删除所选文件
fileInfoService.delFileBatch(userId, null, idList, isAdmin ? null : FileDelFlagEnums.RECYCLE.getFlag());

// 更新数据库
Long useSpace = fileInfoService.getUseSpace(userId);
UserInfo userInfo = new UserInfo();
userInfo.setId(userId);
userInfo.setUseSpace(useSpace);
userInfoService.updateById(userInfo);

// 更新Redis
UserSpaceDTO userSpaceUse = redisComponent.getUserSpaceUse(userId);
userSpaceUse.setUseSpace(useSpace);
redisComponent.saveUserSpaceUse(userId, userSpaceUse);
}

定义Controller

在 RecycleController 下定义彻底删除文件方法。

RecycleController
// 彻底删除文件
@DeleteMapping ("/delFile/{ids}")
public void delFile(HttpSession session,
@PathVariable("ids") @NotEmpty String ids) {
SessionWebUserVO user = (SessionWebUserVO) session.getAttribute(Constants.SESSION_KEY);
userFileService.delFileBatch(user.getId(), ids, false);
}