Skip to content

Commit b80bbf3

Browse files
committed
feat(回收站): 实现画板和元素的回收站功能
添加回收站相关API接口和前端界面,支持查看、恢复和永久删除功能 - 后端新增查询回收站、恢复和永久删除接口 - 前端添加回收站面板和相关操作按钮 - 修改删除提示信息为"移至回收站"
1 parent 9b1135a commit b80bbf3

6 files changed

Lines changed: 371 additions & 5 deletions

File tree

backend/src/main/java/com/easydraw/controller/BoardController.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,25 @@ public Map<String, Object> deleteBoard(@PathVariable String id) {
6868
return ResponseUtils.buildSuccessResponse(null);
6969
}
7070

71+
@GetMapping("/trash")
72+
public Map<String, Object> getTrashBoards() {
73+
UUID creatorId = this.getSecurityUUID();
74+
List<BoardDto> boards = boardService.getTrashBoards(creatorId);
75+
return ResponseUtils.buildSuccessResponse(boards);
76+
}
77+
78+
@PostMapping("/{id}/restore")
79+
public Map<String, Object> restoreBoard(@PathVariable String id) {
80+
BoardDto boardDto = boardService.restoreBoard(id);
81+
return ResponseUtils.buildSuccessResponse(boardDto);
82+
}
83+
84+
@DeleteMapping("/{id}/permanent")
85+
public Map<String, Object> permanentDeleteBoard(@PathVariable String id) {
86+
boardService.permanentDeleteBoard(id);
87+
return ResponseUtils.buildSuccessResponse(null);
88+
}
89+
7190
// 内部类,用于接收请求参数
7291
public static class BoardRequest {
7392
private String name;

backend/src/main/java/com/easydraw/repository/BoardRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ public interface BoardRepository extends JpaRepository<Board, UUID> {
1414

1515
Board findByIdAndIsDeletedFalse(UUID id);
1616

17+
List<Board> findByCreatorIdAndIsDeletedTrue(UUID creatorId);
18+
19+
Board findByIdAndIsDeletedTrue(UUID id);
20+
1721
}

backend/src/main/java/com/easydraw/repository/ElementRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ public interface ElementRepository extends JpaRepository<Element, UUID> {
1414

1515
Element findByIdAndBoardIdAndIsDeletedFalse(UUID id, UUID boardId);
1616

17+
List<Element> findByBoardIdAndIsDeletedTrue(UUID boardId);
18+
19+
List<Element> findByBoardId(UUID boardId);
20+
1721
}

backend/src/main/java/com/easydraw/service/BoardService.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,62 @@ public void deleteBoard(String boardId) {
127127
elementHistoryRepository.deleteAll(histories);
128128
}
129129

130+
public List<BoardDto> getTrashBoards(UUID creatorId) {
131+
List<Board> boards = boardRepository.findByCreatorIdAndIsDeletedTrue(creatorId);
132+
return boards.stream()
133+
.map(board -> new BoardDto(
134+
board.getId().toString(),
135+
board.getName(),
136+
board.getCategory(),
137+
board.getCreatedAt(),
138+
board.getUpdatedAt(),
139+
List.of()
140+
))
141+
.collect(Collectors.toList());
142+
}
143+
144+
public BoardDto restoreBoard(String boardId) {
145+
Board board = boardRepository.findByIdAndIsDeletedTrue(UUID.fromString(boardId));
146+
if (board == null) {
147+
throw new RuntimeException("Board not found in trash");
148+
}
149+
150+
board.setDeleted(false);
151+
Board restoredBoard = boardRepository.save(board);
152+
153+
// 恢复画板下的所有组件
154+
List<Element> elements = elementRepository.findByBoardIdAndIsDeletedTrue(UUID.fromString(boardId));
155+
elements.forEach(element -> {
156+
element.setDeleted(false);
157+
elementRepository.save(element);
158+
});
159+
160+
return new BoardDto(
161+
restoredBoard.getId().toString(),
162+
restoredBoard.getName(),
163+
restoredBoard.getCategory(),
164+
restoredBoard.getCreatedAt(),
165+
restoredBoard.getUpdatedAt(),
166+
List.of()
167+
);
168+
}
169+
170+
public void permanentDeleteBoard(String boardId) {
171+
Board board = boardRepository.findByIdAndIsDeletedTrue(UUID.fromString(boardId));
172+
if (board == null) {
173+
throw new RuntimeException("Board not found in trash");
174+
}
175+
176+
// 永久删除画板下的所有组件
177+
List<Element> elements = elementRepository.findByBoardId(UUID.fromString(boardId));
178+
elementRepository.deleteAll(elements);
179+
180+
// 永久删除画板相关的历史记录
181+
List<ElementHistory> histories = elementHistoryRepository.findByBoardIdOrderByOperationAtDesc(UUID.fromString(boardId));
182+
elementHistoryRepository.deleteAll(histories);
183+
184+
// 永久删除画板
185+
boardRepository.delete(board);
186+
}
187+
130188
}

docs/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<link rel="icon" type="image/png" href="./favicon.png" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>EasyDraw</title>
8-
<script type="module" crossorigin src="./assets/index-DDu4Zo5n.js"></script>
8+
<script type="module" crossorigin src="./assets/index-uOZnOc04.js"></script>
99
<link rel="modulepreload" crossorigin href="./assets/vue-DcXecXgS.js">
1010
<link rel="modulepreload" crossorigin href="./assets/element-C4pldAgc.js">
1111
<link rel="modulepreload" crossorigin href="./assets/lodash-CATZ7J7c.js">

0 commit comments

Comments
 (0)