From 431e3dea1c1dc7a8698e1c2771c3a91ef449a233 Mon Sep 17 00:00:00 2001 From: ikmkj <1@qq,com> Date: Fri, 20 Jun 2025 15:35:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(qianduan):=20=E4=BC=98=E5=8C=96=E7=AC=94?= =?UTF-8?q?=E8=AE=B0=E5=8A=9F=E8=83=BD=E5=92=8C=E5=9B=BE=E7=89=87=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增批量删除图片接口和功能- 实现笔记中图片的上传和删除 - 优化笔记保存时的图片处理逻辑 -调整分组展示和Markdown文件加载方式 --- .../controller/GroupingController.java | 13 +- .../controller/ImageController.java | 20 +- .../controller/MarkdownController.java | 10 +- .../com/test/bijihoudaun/entity/Grouping.java | 7 + .../bijihoudaun/service/GroupingService.java | 22 +- .../bijihoudaun/service/ImageService.java | 18 +- .../service/impl/GroupingServiceImpl.java | 12 +- .../service/impl/ImageServiceImpl.java | 21 +- biji-qianduan/src/api/CommonApi.js | 29 ++- biji-qianduan/src/components/HomePage.vue | 225 ++++++++++-------- mydatabase.db | Bin 36864 -> 36864 bytes 11 files changed, 239 insertions(+), 138 deletions(-) diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/GroupingController.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/GroupingController.java index 31cae62..8dc7072 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/GroupingController.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/GroupingController.java @@ -4,6 +4,8 @@ import com.test.bijihoudaun.common.response.R; import com.test.bijihoudaun.entity.Grouping; import com.test.bijihoudaun.service.GroupingService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -26,9 +28,16 @@ public class GroupingController { } @Operation(summary = "获取全部分组") + @Parameters({ + @Parameter(name = "parentId", description = "0是一级,其他的是看它的父级id", required = true) + }) @GetMapping - public R> getAllGroupings() { - List groupings = groupingService.getAllGroupings(); + public R> getAllGroupings(String parentId) { + if (parentId == null) { + return R.fail("参数不能为空"); + } + long l = Long.parseLong(parentId); + List groupings = groupingService.getAllGroupings(l); return R.success(groupings); } diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/ImageController.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/ImageController.java index f9bf92d..d32eda0 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/ImageController.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/ImageController.java @@ -25,17 +25,14 @@ public class ImageController { @Operation(summary = "上传图片") @Parameters({ - @Parameter(name = "markdownId", description = "markdownid", required = true), @Parameter(name = "file", description = "图片文件", required = true) }) @PostMapping public R uploadImage( - @RequestParam(required = false) String markdownId, @RequestParam("file") MultipartFile file) { try { - Long markdownIdLong = Long.parseLong(markdownId); - Image image = imageService.uploadImage(markdownIdLong, file); + Image image = imageService.uploadImage(file); return R.success(image); } catch (IOException e) { return R.fail(); @@ -43,7 +40,7 @@ public class ImageController { } @Operation(summary = "根据id删除图片") - @DeleteMapping("/{id}") + @PostMapping("/{id}") public R deleteImage(@PathVariable Long id) { boolean result = imageService.deleteImage(id); if (result) { @@ -54,7 +51,7 @@ public class ImageController { } @Operation(summary = "根据url删除图片") - @DeleteMapping + @PostMapping("/deleteByUrl") public R deleteImageByUrl(@RequestParam String url) { boolean result = imageService.deleteImageByUrl(url); if (result) { @@ -64,5 +61,16 @@ public class ImageController { } } + @Operation(summary = "根据url批量删除图片") + @PostMapping("/batch") + public R deleteImageByUrls(@RequestBody List urls) { + boolean result = imageService.deleteImageByUrls(urls); + if (result) { + return R.success(); + } else { + return R.fail(); + } + } + } diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/MarkdownController.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/MarkdownController.java index 9fbee23..89c17e9 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/MarkdownController.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/MarkdownController.java @@ -86,9 +86,13 @@ public class MarkdownController { } @Operation(summary = "删除Markdown文件") - @DeleteMapping("/{id}") - public R deleteMarkdown(@PathVariable Long id) { - if (markdownFileService.deleteMarkdownFile(id)) { + @Parameters({ + @Parameter(name = "id", description = "Markdown文件ID", required = true), + }) + @PostMapping("/delete") + public R deleteMarkdown(String id) { + long l = Long.parseLong(id); + if (markdownFileService.deleteMarkdownFile(l)) { return R.success(); } return R.fail(); diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java index e80d08f..e5a81b3 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java @@ -1,6 +1,7 @@ package com.test.bijihoudaun.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -15,6 +16,12 @@ public class Grouping { @TableId(type = IdType.AUTO) @JsonFormat(shape = JsonFormat.Shape.STRING) // 仅作用于此字段 private Long id; + + @Schema(description ="上级id",implementation = Long.class) + @JsonFormat(shape = JsonFormat.Shape.STRING) + @TableField("parentId") + private Long parentId; + @Schema(description = "分组名称",implementation = String.class) private String grouping; } diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/GroupingService.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/GroupingService.java index 0ae2f15..65cffd1 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/GroupingService.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/GroupingService.java @@ -5,8 +5,28 @@ import com.test.bijihoudaun.entity.Grouping; import java.util.List; public interface GroupingService { + /** + * 创建分组 + * @param grouping + * @return + */ Grouping createGrouping(Grouping grouping); - List getAllGroupings(); + + /** + * 获取所有分组 + * @param parentId + * @return + */ + List getAllGroupings(Long parentId); + /** + * 更新分组名称 + * @param grouping + * @return + */ Grouping updateGrouping(Grouping grouping); + /** + * 删除分组 + * @param id + */ void deleteGrouping(Long id); } diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/ImageService.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/ImageService.java index 1ae546e..89dfe0c 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/ImageService.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/ImageService.java @@ -10,12 +10,11 @@ import java.util.List; public interface ImageService extends IService { /** * 上传图片 - * @param markdownId Markdown文件ID(可选) * @param file 图片文件 * @return 上传的图片对象 * @throws IOException 文件操作异常 */ - Image uploadImage(Long markdownId, MultipartFile file) throws IOException; + Image uploadImage(MultipartFile file) throws IOException; /** * 删除图片 @@ -24,14 +23,6 @@ public interface ImageService extends IService { */ boolean deleteImage(Long id); - - /** - * 获取Markdown文件关联的图片 - * @param markdownId Markdown文件ID - * @return 图片列表 - */ - List getMarkdownImages(Long markdownId); - /** * 根据URL删除图片 * @param url @@ -40,10 +31,9 @@ public interface ImageService extends IService { boolean deleteImageByUrl(String url); /** - * 根据URL批量更新图片ID - * @param list - * @param markdownId + * 根据URL批量删除图片 + * @param urls * @return */ - boolean updateImageId(List list, Long markdownId); + boolean deleteImageByUrls(List urls); } diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java index 19861a5..63ab582 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java @@ -1,9 +1,11 @@ package com.test.bijihoudaun.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.test.bijihoudaun.entity.Grouping; import com.test.bijihoudaun.mapper.GroupingMapper; import com.test.bijihoudaun.service.GroupingService; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.List; @@ -13,6 +15,10 @@ public class GroupingServiceImpl extends ServiceImpl implements GroupingService { + @Resource + private GroupingMapper groupingMapper; + + @Override public Grouping createGrouping(Grouping grouping) { this.save(grouping); @@ -20,8 +26,10 @@ public class GroupingServiceImpl } @Override - public List getAllGroupings() { - return this.list(); + public List getAllGroupings(Long parentId) { +// return groupingMapper.selectList(new LambdaQueryWrapper() +// .eq(Grouping::getParentId, parentId)); + return groupingMapper.selectList(null); } @Override diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/ImageServiceImpl.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/ImageServiceImpl.java index 08a2baf..9bcfa7b 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/ImageServiceImpl.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/ImageServiceImpl.java @@ -33,7 +33,7 @@ public class ImageServiceImpl private ImageMapper imageMapper; @Override - public Image uploadImage(Long markdownId, MultipartFile file) throws IOException { + public Image uploadImage( MultipartFile file) throws IOException { // 创建上传目录 Path uploadPath = Paths.get(uploadDir); if (!Files.exists(uploadPath)) { @@ -51,7 +51,6 @@ public class ImageServiceImpl // 创建图片实体 Image image = new Image(); - image.setMarkdownId(markdownId); image.setOriginalName(originalFilename); image.setStoredName(storedName); image.setUrl("/uploads/" + storedName); @@ -82,14 +81,6 @@ public class ImageServiceImpl } } - @Override - public List getMarkdownImages(Long markdownId) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("markdown_id", markdownId) - .orderByDesc("created_at"); - return this.list(queryWrapper); - } - @Override public boolean deleteImageByUrl(String url) { Image image = imageMapper.selectOne(new QueryWrapper().eq("url", url)); @@ -108,17 +99,15 @@ public class ImageServiceImpl throw new RuntimeException("删除图片失败", e); } } - @Override - public boolean updateImageId(List list, Long markdownId) { - if (CollUtil.isEmpty( list)) { + public boolean deleteImageByUrls(List urls) { + if (CollUtil.isEmpty(urls)) { return false; } - for (String url : list) { + for (String url : urls) { Image image = imageMapper.selectOne(new QueryWrapper().eq("url", url)); if (image != null) { - image.setMarkdownId(markdownId); - this.updateById(image); + this.deleteImageByUrl(url); } } return true; diff --git a/biji-qianduan/src/api/CommonApi.js b/biji-qianduan/src/api/CommonApi.js index 0612e9f..991c20e 100644 --- a/biji-qianduan/src/api/CommonApi.js +++ b/biji-qianduan/src/api/CommonApi.js @@ -4,7 +4,7 @@ import axiosApi from '@/utils/axios.js' export const groupingId = (data) => axiosApi.get(`/api/markdown/grouping/${data}`) // 获取所有分组 -export const groupingAll = () => axiosApi.get(`/api/groupings`) +export const groupingAll = (data) => axiosApi.get(`/api/groupings?parentId=${data}`); // 获取所有Markdown文件 export const markdownAll = () => axiosApi.get(`/api/markdown`); // 预览markdown文件 @@ -30,6 +30,33 @@ export const updateMarkdown = (id, data) => { } }) } +// 批量删除图片 +export const deleteImages = (list) => { + const formData = new FormData() + formData.append('urls', list) + return axiosApi.post('/api/images/batch', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} +// 上传图片 +export const uploadImage = (file) => { + const formData = new FormData() + if (file) formData.append('file', file) + return axiosApi.post('/api/images?markdownId', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +// 删除Markdown文件 +export const deleteMarkdown = (id) => axiosApi.post(`/api/markdown/delete?id=${id}`); +// 根据分组ID获取Markdown文件列表 +export const markdownList = (groupingId) => axiosApi.get(`/api/markdown/grouping/${groupingId}`); + + // MD5哈希 diff --git a/biji-qianduan/src/components/HomePage.vue b/biji-qianduan/src/components/HomePage.vue index cf4a23e..eb5cb81 100644 --- a/biji-qianduan/src/components/HomePage.vue +++ b/biji-qianduan/src/components/HomePage.vue @@ -18,24 +18,20 @@ :default-active="activeMenu" class="el-menu-vertical-demo" :collapse="isCollapsed" - @select="handleMenuSelect" popper-effect="light" collapse-transition > -