refactor(biji): 重构笔记保存逻辑并修复相关BUG

- 后端:将笔记创建和更新逻辑合并为一个接口,根据ID是否存在自动判断操作类型
- 前端:修复了新建笔记时自动保存导致数据重复创建的问题
- 优化了与后端的数据同步,确保本地状态与服务器保持一致
This commit is contained in:
2025-07-31 11:40:50 +08:00
parent a5c3ca482f
commit b38e97b8c3
6 changed files with 28 additions and 49 deletions

View File

@@ -41,25 +41,6 @@ public class MarkdownController {
return R.fail(); 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<MarkdownFile> 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文件") @Operation(summary = "更新Markdown文件")
@PostMapping("/updateMarkdown") @PostMapping("/updateMarkdown")

View File

@@ -6,15 +6,6 @@ import com.test.bijihoudaun.entity.MarkdownFile;
import java.util.List; import java.util.List;
public interface MarkdownFileService extends IService<MarkdownFile> { public interface MarkdownFileService extends IService<MarkdownFile> {
/**
* 创建Markdown文件
* @param groupingId 分组ID
* @param title 文件标题
* @param fileName 文件名
* @param content 文件内容
* @return 创建的文件对象
*/
MarkdownFile createMarkdownFile(Long groupingId, String title, String fileName, String content);
/** /**
* 更新Markdown内容 * 更新Markdown内容

View File

@@ -24,30 +24,17 @@ public class MarkdownFileServiceImpl
@Resource @Resource
SnowflakeIdGenerator snowflakeIdGenerator; 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 @Override
public MarkdownFile updateMarkdownContent(MarkdownFile markdownFile) { public MarkdownFile updateMarkdownContent(MarkdownFile markdownFile) {
markdownFile.setUpdatedAt(new Date()); markdownFile.setUpdatedAt(new Date());
if (markdownFile.getId() != null){ // 如果ID为空或0则视为新文件
markdownFileMapper.update(markdownFile, new QueryWrapper<MarkdownFile>().eq("id", markdownFile.getId())); if (markdownFile.getId() == null || markdownFile.getId() == 0L) {
}else {
markdownFile.setId(snowflakeIdGenerator.nextId()); markdownFile.setId(snowflakeIdGenerator.nextId());
markdownFile.setCreatedAt(new Date()); markdownFile.setCreatedAt(new Date());
markdownFileMapper.insert(markdownFile); this.save(markdownFile); // 使用MyBatis-Plus的save方法
} else {
this.updateById(markdownFile); // 使用MyBatis-Plus的updateById方法
} }
return markdownFile; return markdownFile;
} }

View File

@@ -461,10 +461,16 @@ const handleSave= async (content, isAutoSave = false) => {
editData.value.content = content editData.value.content = content
const filesRes = await updateMarkdown(editData.value); 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) { if (!isAutoSave) {
ElMessage.success(filesRes.msg); ElMessage.success(filesRes.msg);
} }
await chushihua() await chushihua();
} else { } else {
if (!isAutoSave) { if (!isAutoSave) {
ElMessage.error(filesRes.msg); ElMessage.error(filesRes.msg);

View File

@@ -64,3 +64,17 @@
- 移除了批量导入/导出的UI。 - 移除了批量导入/导出的UI。
- 在笔记预览页面添加了“导出为.md”按钮可将当前笔记内容直接下载为 Markdown 文件。 - 在笔记预览页面添加了“导出为.md”按钮可将当前笔记内容直接下载为 Markdown 文件。
- 优化了“上传Markdown”功能用户上传文件后会弹出对话框让用户选择要导入的分类。 - 优化了“上传Markdown”功能用户上传文件后会弹出对话框让用户选择要导入的分类。
## 第五阶段系统优化与BUG修复 (已完成)
这个阶段我们对系统进行了深入的优化和问题修复,提升了应用的稳定性和健壮性。
- **任务5.1修复JWT安全漏洞 (已完成)**
- **后端**: 解决了因签名密钥长度不足而导致的安全风险。通过更新密钥并采用 `jjwt` 库的最佳实践重构了 `JwtTokenUtil`,确保了认证系统的安全性。
- **任务5.2:重构分类系统 (已完成)**
- **前端**: 彻底重构了分类的数据结构和UI实现了支持无限层级的树状分类系统。使用级联选择器 (`el-cascader`) 优化了新建笔记和分类的体验。
- **任务5.3:修复笔记保存逻辑 (已完成)**
- **后端**: 重构了笔记保存的业务逻辑将“新建”和“更新”操作统一到一个接口中通过判断笔记ID是否存在来智能执行插入或更新解决了数据重复创建的问题。
- **前端**: 修复了新建笔记时后续自动保存操作会重复创建记录的BUG。
- **任务5.4修复Markdown预览问题 (已完成)**
- **前端**: 解决了Vditor预览时因DOM异步更新和数据处理不当导致的渲染崩溃及内容截断问题确保了预览功能的稳定性。

Binary file not shown.