From b38e97b8c3b221404166ad2a07cada65814f4a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=9F?= <3111696955@qq.com> Date: Thu, 31 Jul 2025 11:40:50 +0800 Subject: [PATCH] =?UTF-8?q?refactor(biji):=20=E9=87=8D=E6=9E=84=E7=AC=94?= =?UTF-8?q?=E8=AE=B0=E4=BF=9D=E5=AD=98=E9=80=BB=E8=BE=91=E5=B9=B6=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=9B=B8=E5=85=B3BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端:将笔记创建和更新逻辑合并为一个接口,根据ID是否存在自动判断操作类型 - 前端:修复了新建笔记时自动保存导致数据重复创建的问题 - 优化了与后端的数据同步,确保本地状态与服务器保持一致 --- .../controller/MarkdownController.java | 19 --------------- .../service/MarkdownFileService.java | 9 ------- .../service/impl/MarkdownFileServiceImpl.java | 23 ++++-------------- biji-qianduan/src/components/HomePage.vue | 12 ++++++--- doc/development_plan.md | 14 +++++++++++ mydatabase.db | Bin 36864 -> 49152 bytes 6 files changed, 28 insertions(+), 49 deletions(-) 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 3883b6d..e280d8b 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 @@ -41,25 +41,6 @@ public class MarkdownController { return R.fail(); } - @Operation(summary = "创建markdown文件") - @Parameters({ - @Parameter(name = "groupingId", description = "分组id",required = true), - @Parameter(name = "title", description = "标题",required = true), - @Parameter(name = "fileName", description = "文件名",required = true), - @Parameter(name = "content", description = "内容",required = true) - }) - @PostMapping - public R createMarkdown( - @RequestParam Long groupingId, - @RequestParam String title, - @RequestParam String fileName, - @RequestBody String content) { - - MarkdownFile file = markdownFileService.createMarkdownFile( - groupingId, title, fileName, content); - - return R.success(file); - } @Operation(summary = "更新Markdown文件") @PostMapping("/updateMarkdown") diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/MarkdownFileService.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/MarkdownFileService.java index 4c3527c..3aa0a73 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/MarkdownFileService.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/MarkdownFileService.java @@ -6,15 +6,6 @@ import com.test.bijihoudaun.entity.MarkdownFile; import java.util.List; public interface MarkdownFileService extends IService { - /** - * 创建Markdown文件 - * @param groupingId 分组ID - * @param title 文件标题 - * @param fileName 文件名 - * @param content 文件内容 - * @return 创建的文件对象 - */ - MarkdownFile createMarkdownFile(Long groupingId, String title, String fileName, String content); /** * 更新Markdown内容 diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/MarkdownFileServiceImpl.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/MarkdownFileServiceImpl.java index fcc3f9f..4fe9ab9 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/MarkdownFileServiceImpl.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/MarkdownFileServiceImpl.java @@ -24,30 +24,17 @@ public class MarkdownFileServiceImpl @Resource SnowflakeIdGenerator snowflakeIdGenerator; - @Override - public MarkdownFile createMarkdownFile(Long groupingId, String title, String fileName, String content) { - MarkdownFile file = new MarkdownFile(); - file.setId(snowflakeIdGenerator.nextId()); - file.setGroupingId(groupingId); - file.setTitle(title); - file.setFileName(fileName); - file.setContent(content); - file.setCreatedAt(new Date()); - file.setUpdatedAt(new Date()); - - markdownFileMapper.insert(file); - return file; - } @Override public MarkdownFile updateMarkdownContent(MarkdownFile markdownFile) { markdownFile.setUpdatedAt(new Date()); - if (markdownFile.getId() != null){ - markdownFileMapper.update(markdownFile, new QueryWrapper().eq("id", markdownFile.getId())); - }else { + // 如果ID为空或0,则视为新文件 + if (markdownFile.getId() == null || markdownFile.getId() == 0L) { markdownFile.setId(snowflakeIdGenerator.nextId()); markdownFile.setCreatedAt(new Date()); - markdownFileMapper.insert(markdownFile); + this.save(markdownFile); // 使用MyBatis-Plus的save方法 + } else { + this.updateById(markdownFile); // 使用MyBatis-Plus的updateById方法 } return markdownFile; } diff --git a/biji-qianduan/src/components/HomePage.vue b/biji-qianduan/src/components/HomePage.vue index 8cfdf44..844901d 100644 --- a/biji-qianduan/src/components/HomePage.vue +++ b/biji-qianduan/src/components/HomePage.vue @@ -460,12 +460,18 @@ const handleSave= async (content, isAutoSave = false) => { extractDeletedImageUrls(imageUrls.value) editData.value.content = content const filesRes = await updateMarkdown(editData.value); - if (filesRes.code===200){ + if (filesRes.code === 200) { + // 关键修复:用后端返回的、带有ID的最新数据更新本地状态 + editData.value = filesRes.data; + if (selectedFile.value) { + selectedFile.value.id = filesRes.data.id; // 确保预览对象也有ID + } + if (!isAutoSave) { ElMessage.success(filesRes.msg); } - await chushihua() - }else { + await chushihua(); + } else { if (!isAutoSave) { ElMessage.error(filesRes.msg); } diff --git a/doc/development_plan.md b/doc/development_plan.md index 5cb0042..2ad6ffd 100644 --- a/doc/development_plan.md +++ b/doc/development_plan.md @@ -64,3 +64,17 @@ - 移除了批量导入/导出的UI。 - 在笔记预览页面添加了“导出为.md”按钮,可将当前笔记内容直接下载为 Markdown 文件。 - 优化了“上传Markdown”功能,用户上传文件后会弹出对话框,让用户选择要导入的分类。 + +## 第五阶段:系统优化与BUG修复 (已完成) + +这个阶段我们对系统进行了深入的优化和问题修复,提升了应用的稳定性和健壮性。 + +- **任务5.1:修复JWT安全漏洞 (已完成)** + - **后端**: 解决了因签名密钥长度不足而导致的安全风险。通过更新密钥并采用 `jjwt` 库的最佳实践重构了 `JwtTokenUtil`,确保了认证系统的安全性。 +- **任务5.2:重构分类系统 (已完成)** + - **前端**: 彻底重构了分类的数据结构和UI,实现了支持无限层级的树状分类系统。使用级联选择器 (`el-cascader`) 优化了新建笔记和分类的体验。 +- **任务5.3:修复笔记保存逻辑 (已完成)** + - **后端**: 重构了笔记保存的业务逻辑,将“新建”和“更新”操作统一到一个接口中,通过判断笔记ID是否存在来智能执行插入或更新,解决了数据重复创建的问题。 + - **前端**: 修复了新建笔记时,后续自动保存操作会重复创建记录的BUG。 +- **任务5.4:修复Markdown预览问题 (已完成)** + - **前端**: 解决了Vditor预览时因DOM异步更新和数据处理不当导致的渲染崩溃及内容截断问题,确保了预览功能的稳定性。 diff --git a/mydatabase.db b/mydatabase.db index a4bfdf7dc404d5bc06520a19d596ac5760f182c5..5db0b01e9b1bfa36891688288d3084bb9ecad010 100644 GIT binary patch literal 49152 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 B_l^Jn delta 635 zcmZo@U~X8zG(nm-oPmLX6Ns6Cm~oE^n`C(so%LGPXnvj+jo;<-{gq1<#fcuuo4gMyJ0vrHlVAJpb