From 45e1fe52605805ed4f2460c245fbffa6eb1edead Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Thu, 2 Apr 2026 15:02:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=91=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filesystem/controller/UserController.java | 22 ++++ .../com/filesystem/service/FileService.java | 69 ++++++----- .../com/filesystem/service/UserService.java | 21 ++++ web-vue/src/components/FileTable.vue | 112 +++++++++--------- web-vue/src/components/FileToolbar.vue | 2 +- web-vue/src/components/PreviewDialog.vue | 4 +- web-vue/src/components/ShareDialog.vue | 2 +- web-vue/src/components/TopNavbar.vue | 93 ++++++++++----- web-vue/src/views/files/index.vue | 2 + 9 files changed, 206 insertions(+), 121 deletions(-) diff --git a/src/main/java/com/filesystem/controller/UserController.java b/src/main/java/com/filesystem/controller/UserController.java index 75a8ff6..393dc05 100644 --- a/src/main/java/com/filesystem/controller/UserController.java +++ b/src/main/java/com/filesystem/controller/UserController.java @@ -122,4 +122,26 @@ public class UserController { userService.updateProfile(principal.getUserId(), nickname, signature, phone, email); return ResponseEntity.ok(Map.of("message", "更新成功")); } + + /** + * 修改密码 + */ + @PutMapping("/password") + public ResponseEntity changePassword( + @AuthenticationPrincipal UserPrincipal principal, + @RequestBody Map request) { + String oldPassword = request.get("oldPassword"); + String newPassword = request.get("newPassword"); + + if (oldPassword == null || oldPassword.isEmpty() || newPassword == null || newPassword.isEmpty()) { + return ResponseEntity.badRequest().body(Map.of("message", "请填写完整信息")); + } + + try { + userService.changePassword(principal.getUserId(), oldPassword, newPassword); + return ResponseEntity.ok(Map.of("message", "密码修改成功")); + } catch (Exception e) { + return ResponseEntity.badRequest().body(Map.of("message", e.getMessage())); + } + } } diff --git a/src/main/java/com/filesystem/service/FileService.java b/src/main/java/com/filesystem/service/FileService.java index ed405f9..7344f06 100644 --- a/src/main/java/com/filesystem/service/FileService.java +++ b/src/main/java/com/filesystem/service/FileService.java @@ -69,6 +69,13 @@ public class FileService { wrapper.eq(FileEntity::getUserId, userId) .eq(FileEntity::getIsDeleted, 1) .orderByDesc(FileEntity::getDeletedAt); + + if (folderId != null) { + wrapper.eq(FileEntity::getFolderId, folderId); + } else { + wrapper.isNull(FileEntity::getFolderId); + } + return fileMapper.selectList(wrapper); } @@ -107,10 +114,21 @@ public class FileService { FileEntity file = fileMapper.selectById(id); if (file == null || !file.getUserId().equals(userId)) return; + // 检查父文件夹是否在回收站,如果是,将文件移到根目录 + Long folderId = file.getFolderId(); + if (folderId != null) { + FileEntity parentFolder = fileMapper.selectById(folderId); + if (parentFolder != null && parentFolder.getIsDeleted() == 1) { + // 父文件夹在回收站,将文件移到根目录 + folderId = null; + } + } + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(FileEntity::getId, id) .set(FileEntity::getIsDeleted, 0) - .set(FileEntity::getDeletedAt, null); + .set(FileEntity::getDeletedAt, null) + .set(FileEntity::getFolderId, folderId); fileMapper.update(null, wrapper); // 如果是文件夹,递归还原所有子文件 @@ -144,9 +162,28 @@ public class FileService { FileEntity file = fileMapper.selectById(id); if (file == null || !file.getUserId().equals(userId)) return; - // 如果是文件夹,先递归删除所有子文件 + // 如果是文件夹,检查是否有未删除的子文件 if (file.getIsFolder() != null && file.getIsFolder() == 1) { - deleteChildrenPermanently(id, userId); + Long undeletedCount = fileMapper.selectCount( + new LambdaQueryWrapper() + .eq(FileEntity::getFolderId, id) + .eq(FileEntity::getIsDeleted, 0) + .eq(FileEntity::getUserId, userId) + ); + if (undeletedCount != null && undeletedCount > 0) { + throw new RuntimeException("请先处理该目录下的子文件后重试"); + } + + // 检查是否有已删除的子文件(在回收站里的) + Long deletedChildrenCount = fileMapper.selectCount( + new LambdaQueryWrapper() + .eq(FileEntity::getFolderId, id) + .eq(FileEntity::getIsDeleted, 1) + .eq(FileEntity::getUserId, userId) + ); + if (deletedChildrenCount != null && deletedChildrenCount > 0) { + throw new RuntimeException("请先处理该目录下的子文件后重试"); + } } // 删除当前文件的物理文件并扣减存储 @@ -164,32 +201,6 @@ public class FileService { fileMapper.deleteById(id); } - private void deleteChildrenPermanently(Long parentFolderId, Long userId) { - List children = fileMapper.selectList( - new LambdaQueryWrapper() - .eq(FileEntity::getFolderId, parentFolderId) - .eq(FileEntity::getIsDeleted, 1) - .eq(FileEntity::getUserId, userId) - ); - for (FileEntity child : children) { - if (child.getIsFolder() != null && child.getIsFolder() == 1) { - deleteChildrenPermanently(child.getId(), userId); - } - if (child.getPath() != null && !child.getPath().isEmpty()) { - try { - Path filePath = Paths.get(storagePath).toAbsolutePath().resolve("files").resolve(child.getPath()); - Files.deleteIfExists(filePath); - } catch (IOException e) { - // ignore - } - if (child.getSize() != null && child.getSize() > 0) { - userService.decreaseStorage(userId, child.getSize()); - } - } - fileMapper.deleteById(child.getId()); - } - } - @Transactional public void emptyTrash(Long userId) { List trashFiles = getTrashFiles(userId, null); diff --git a/src/main/java/com/filesystem/service/UserService.java b/src/main/java/com/filesystem/service/UserService.java index 043ffb2..adbdfc4 100644 --- a/src/main/java/com/filesystem/service/UserService.java +++ b/src/main/java/com/filesystem/service/UserService.java @@ -147,4 +147,25 @@ public class UserService { userMapper.updateById(user); } } + + public void changePassword(Long userId, String oldPassword, String newPassword) { + User user = userMapper.selectById(userId); + if (user == null) { + throw new RuntimeException("用户不存在"); + } + + // 验证旧密码 + if (!passwordEncoder.matches(oldPassword, user.getPassword())) { + throw new RuntimeException("原密码错误"); + } + + // 检查新密码长度 + if (newPassword == null || newPassword.length() < 6) { + throw new RuntimeException("新密码长度不能少于6位"); + } + + // 更新密码 + user.setPassword(passwordEncoder.encode(newPassword)); + userMapper.updateById(user); + } } diff --git a/web-vue/src/components/FileTable.vue b/web-vue/src/components/FileTable.vue index 48b5274..b4ab4f5 100644 --- a/web-vue/src/components/FileTable.vue +++ b/web-vue/src/components/FileTable.vue @@ -34,69 +34,67 @@ @@ -107,7 +105,7 @@