feat(biji-houdaun): 支持 Markdown 文件上传、预览、编辑和创建

- 新增 Markdown 文件预览功能
- 更新 Markdown 文件创建和编辑接口,使用 Long 类型的 ID
- 优化图片上传接口,支持 Long 类型的用户 ID 和 Markdown ID
- 重构 MarkdownFileService接口,增加获取 Markdown 文件的方法
- 修改 MarkdownFileServiceImpl 实现类,支持新的 Markdown 文件操作
This commit is contained in:
ikmkj
2025-06-16 21:21:03 +08:00
parent 764184047f
commit e8c460398c
7 changed files with 59 additions and 24 deletions

View File

@@ -31,8 +31,8 @@ public class ImageController {
}) })
@PostMapping @PostMapping
public ResponseEntity<Image> uploadImage( public ResponseEntity<Image> uploadImage(
@RequestParam Integer userId, @RequestParam Long userId,
@RequestParam(required = false) Integer markdownId, @RequestParam(required = false) Long markdownId,
@RequestParam("file") MultipartFile file) { @RequestParam("file") MultipartFile file) {
try { try {
@@ -42,4 +42,4 @@ public class ImageController {
return ResponseEntity.status(500).build(); return ResponseEntity.status(500).build();
} }
} }
} }

View File

@@ -17,6 +17,19 @@ public class MarkdownController {
@Autowired @Autowired
private MarkdownFileService markdownFileService; private MarkdownFileService markdownFileService;
@Operation(summary = "预览markdown文件")
@Parameters({
@Parameter(name = "id", description = "文件ID", required = true)
})
@GetMapping("/{id}")
public ResponseEntity<String> getMarkdownContent(@PathVariable Long id) {
MarkdownFile file = markdownFileService.getMarkdownById(id);
if (file != null) {
return ResponseEntity.ok(file.getContent());
}
return ResponseEntity.notFound().build();
}
@Operation(summary = "创建markdown文件") @Operation(summary = "创建markdown文件")
@Parameters({ @Parameters({
@Parameter(name = "userId", description = "用户id",required = true), @Parameter(name = "userId", description = "用户id",required = true),
@@ -26,7 +39,7 @@ public class MarkdownController {
}) })
@PostMapping @PostMapping
public ResponseEntity<MarkdownFile> createMarkdown( public ResponseEntity<MarkdownFile> createMarkdown(
@RequestParam Integer userId, @RequestParam Long userId,
@RequestParam String title, @RequestParam String title,
@RequestParam String fileName, @RequestParam String fileName,
@RequestBody String content) { @RequestBody String content) {
@@ -44,7 +57,7 @@ public class MarkdownController {
}) })
@PostMapping("/{id}") @PostMapping("/{id}")
public ResponseEntity<MarkdownFile> updateMarkdown( public ResponseEntity<MarkdownFile> updateMarkdown(
@PathVariable Integer id, @PathVariable Long id,
@RequestBody String content) { @RequestBody String content) {
MarkdownFile file = markdownFileService.updateMarkdownContent(id, content); MarkdownFile file = markdownFileService.updateMarkdownContent(id, content);

View File

@@ -16,7 +16,7 @@ public interface ImageService extends IService<Image> {
* @return 上传的图片对象 * @return 上传的图片对象
* @throws IOException 文件操作异常 * @throws IOException 文件操作异常
*/ */
Image uploadImage(Integer userId, Integer markdownId, MultipartFile file) throws IOException; Image uploadImage(Long userId, Long markdownId, MultipartFile file) throws IOException;
/** /**
* 删除图片 * 删除图片
@@ -24,19 +24,19 @@ public interface ImageService extends IService<Image> {
* @param userId 用户ID用于权限验证 * @param userId 用户ID用于权限验证
* @return 是否删除成功 * @return 是否删除成功
*/ */
boolean deleteImage(Integer id, Integer userId); boolean deleteImage(Long id, Long userId);
/** /**
* 获取用户的图片列表 * 获取用户的图片列表
* @param userId 用户ID * @param userId 用户ID
* @return 图片列表 * @return 图片列表
*/ */
List<Image> getUserImages(Integer userId); List<Image> getUserImages(Long userId);
/** /**
* 获取Markdown文件关联的图片 * 获取Markdown文件关联的图片
* @param markdownId Markdown文件ID * @param markdownId Markdown文件ID
* @return 图片列表 * @return 图片列表
*/ */
List<Image> getMarkdownImages(Integer markdownId); List<Image> getMarkdownImages(Long markdownId);
} }

View File

@@ -14,7 +14,7 @@ public interface MarkdownFileService extends IService<MarkdownFile> {
* @param content 文件内容 * @param content 文件内容
* @return 创建的文件对象 * @return 创建的文件对象
*/ */
MarkdownFile createMarkdownFile(Integer userId, String title, String fileName, String content); MarkdownFile createMarkdownFile(Long userId, String title, String fileName, String content);
/** /**
* 更新Markdown内容 * 更新Markdown内容
@@ -22,12 +22,19 @@ public interface MarkdownFileService extends IService<MarkdownFile> {
* @param content 新内容 * @param content 新内容
* @return 更新后的文件对象 * @return 更新后的文件对象
*/ */
MarkdownFile updateMarkdownContent(Integer id, String content); MarkdownFile updateMarkdownContent(Long id, String content);
/**
* 根据ID获取Markdown文件
* @param id 文件ID
* @return Markdown文件对象
*/
MarkdownFile getMarkdownById(Long id);
/** /**
* 获取用户的所有Markdown文件 * 获取用户的所有Markdown文件
* @param userId 用户ID * @param userId 用户ID
* @return 文件列表 * @return 文件列表
*/ */
List<MarkdownFile> getUserFiles(Integer userId); List<MarkdownFile> getUserFiles(Long userId);
} }

View File

@@ -27,7 +27,7 @@ public class ImageServiceImpl
private String uploadDir; private String uploadDir;
@Override @Override
public Image uploadImage(Integer userId, Integer markdownId, MultipartFile file) throws IOException { public Image uploadImage(Long userId, Long markdownId, MultipartFile file) throws IOException {
// 创建上传目录 // 创建上传目录
Path uploadPath = Paths.get(uploadDir); Path uploadPath = Paths.get(uploadDir);
if (!Files.exists(uploadPath)) { if (!Files.exists(uploadPath)) {
@@ -50,7 +50,7 @@ public class ImageServiceImpl
image.setOriginalName(originalFilename); image.setOriginalName(originalFilename);
image.setStoredName(storedName); image.setStoredName(storedName);
image.setUrl("/uploads/" + storedName); image.setUrl("/uploads/" + storedName);
image.setSize((int) file.getSize()); image.setSize(file.getSize());
image.setContentType(file.getContentType()); image.setContentType(file.getContentType());
image.setCreatedAt(LocalDateTime.now()); image.setCreatedAt(LocalDateTime.now());
@@ -59,7 +59,7 @@ public class ImageServiceImpl
} }
@Override @Override
public boolean deleteImage(Integer id, Integer userId) { public boolean deleteImage(Long id, Long userId) {
QueryWrapper<Image> queryWrapper = new QueryWrapper<>(); QueryWrapper<Image> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", id) queryWrapper.eq("id", id)
.eq("user_id", userId); .eq("user_id", userId);
@@ -83,7 +83,7 @@ public class ImageServiceImpl
} }
@Override @Override
public List<Image> getUserImages(Integer userId) { public List<Image> getUserImages(Long userId) {
QueryWrapper<Image> queryWrapper = new QueryWrapper<>(); QueryWrapper<Image> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId) queryWrapper.eq("user_id", userId)
.orderByDesc("created_at"); .orderByDesc("created_at");
@@ -91,10 +91,10 @@ public class ImageServiceImpl
} }
@Override @Override
public List<Image> getMarkdownImages(Integer markdownId) { public List<Image> getMarkdownImages(Long markdownId) {
QueryWrapper<Image> queryWrapper = new QueryWrapper<>(); QueryWrapper<Image> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("markdown_id", markdownId) queryWrapper.eq("markdown_id", markdownId)
.orderByDesc("created_at"); .orderByDesc("created_at");
return this.list(queryWrapper); return this.list(queryWrapper);
} }
} }

View File

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.test.bijihoudaun.entity.MarkdownFile; import com.test.bijihoudaun.entity.MarkdownFile;
import com.test.bijihoudaun.mapper.MarkdownFileMapper; import com.test.bijihoudaun.mapper.MarkdownFileMapper;
import com.test.bijihoudaun.service.MarkdownFileService; import com.test.bijihoudaun.service.MarkdownFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -17,7 +18,7 @@ public class MarkdownFileServiceImpl
implements MarkdownFileService { implements MarkdownFileService {
@Override @Override
public MarkdownFile createMarkdownFile(Integer userId, String title, String fileName, String content) { public MarkdownFile createMarkdownFile(Long userId, String title, String fileName, String content) {
MarkdownFile file = new MarkdownFile(); MarkdownFile file = new MarkdownFile();
file.setUserId(userId); file.setUserId(userId);
file.setTitle(title); file.setTitle(title);
@@ -31,7 +32,7 @@ public class MarkdownFileServiceImpl
} }
@Override @Override
public MarkdownFile updateMarkdownContent(Integer id, String content) { public MarkdownFile updateMarkdownContent(Long id, String content) {
MarkdownFile file = this.getById(id); MarkdownFile file = this.getById(id);
if (file != null) { if (file != null) {
file.setContent(content); file.setContent(content);
@@ -40,12 +41,17 @@ public class MarkdownFileServiceImpl
} }
return file; return file;
} }
@Override
public MarkdownFile getMarkdownById(Long id) {
return this.getById(id);
}
@Override @Override
public List<MarkdownFile> getUserFiles(Integer userId) { public List<MarkdownFile> getUserFiles(Long userId) {
QueryWrapper<MarkdownFile> queryWrapper = new QueryWrapper<>(); QueryWrapper<MarkdownFile> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId) queryWrapper.eq("user_id", userId)
.orderByDesc("updated_at"); .orderByDesc("updated_at");
return this.list(queryWrapper); return this.list(queryWrapper);
} }
} }

9
doc/111.md Normal file
View File

@@ -0,0 +1,9 @@
vite+vue3.js怎么支持markdown文件的上传预览、编辑、创建呢我使用springboot3作为后端
前端怎么创建markdown文件并且编写后传给后端是传文件还是直接传字符保存到数据库中的给我详细的代码并且带上注释
1、首先分析本项目的后端了解项目所使用的技术和版本之后查看项目中各个部分的代码了解各个部分的功能和实现方式。
2、分析好项目我要实现其中的markdown文件的上传预览、编辑、创建并且是带有图片的能在前端实现上传预览、编辑、创建等功能要符合项目用到的技术、版本和业务不要修改无关的文件。 要求使用MCP服务器中的context7工具来查询最新的文档
3、现在开始实现上述的功能不要去分析前端现在先弄好后端先实现上传、预览、编辑、创建等功能要符合项目用到的技术、版本和业务不要修改无关的文件。 要求使用MCP服务器中的context7工具用来查询最新的文档确保我想要的功能是符合项目的要求并且是符合项目的业务逻辑。