From 9132feb8707f31b2fd94442d12b715e8768bde0e Mon Sep 17 00:00:00 2001 From: qingfeng1121 Date: Sun, 26 Oct 2025 20:18:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor(service):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=8E=A5=E5=8F=A3=E5=92=8C=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=B1=BB=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将服务接口从service包移动到service.imp包 修复ArticleRepository中viewCount的COALESCE处理 添加getPublishedArticles方法获取已发布文章 优化incrementViewCount方法使用仓库直接更新 修正HelpController中README_API.md路径 --- .../controller/ArticleController.java | 30 +++++------- .../CategoryAttributeController.java | 3 +- .../controller/CategoryController.java | 3 +- .../controller/HelpController.java | 46 ++++++++++--------- .../controller/MessageController.java | 3 +- .../repository/ArticleRepository.java | 9 +++- .../runner/MessageDataChecker.java | 3 +- .../service/ArticleService.java | 23 ++++++++-- .../service/CategoryAttributeService.java | 2 + .../service/CategoryService.java | 2 + .../service/MessageService.java | 2 + .../service/{ => imp}/IArticleService.java | 9 +++- .../{ => imp}/ICategoryAttributeService.java | 2 +- .../service/{ => imp}/ICategoryService.java | 2 +- .../service/{ => imp}/IMessageService.java | 2 +- 15 files changed, 87 insertions(+), 54 deletions(-) rename src/main/java/com/qf/myafterprojecy/service/{ => imp}/IArticleService.java (90%) rename src/main/java/com/qf/myafterprojecy/service/{ => imp}/ICategoryAttributeService.java (97%) rename src/main/java/com/qf/myafterprojecy/service/{ => imp}/ICategoryService.java (96%) rename src/main/java/com/qf/myafterprojecy/service/{ => imp}/IMessageService.java (98%) diff --git a/src/main/java/com/qf/myafterprojecy/controller/ArticleController.java b/src/main/java/com/qf/myafterprojecy/controller/ArticleController.java index 1fb5bce..8c37c58 100644 --- a/src/main/java/com/qf/myafterprojecy/controller/ArticleController.java +++ b/src/main/java/com/qf/myafterprojecy/controller/ArticleController.java @@ -3,7 +3,8 @@ package com.qf.myafterprojecy.controller; import com.qf.myafterprojecy.pojo.Article; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.ArticleDto; -import com.qf.myafterprojecy.service.IArticleService; +import com.qf.myafterprojecy.service.imp.IArticleService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -33,7 +34,14 @@ public class ArticleController { public ResponseMessage
getArticle(@PathVariable String id) { return articleService.getArticleById(id); } - + /** + * 获取已发布的文章列表 + * @return 返回包含已发布文章列表的ResponseMessage对象 + */ + @GetMapping("/published") + public ResponseMessage> getPublishedArticles() { + return articleService.getPublishedArticles(); + } /** * 获取所有文章列表 * @return 返回包含文章列表的ResponseMessage对象 @@ -61,17 +69,8 @@ public class ArticleController { public ResponseMessage> getArticlesByAttribute(@PathVariable Integer attributeId) { return articleService.getArticlesByAttribute(attributeId); } - /** - * 根据分类ID获取该分类下的所有文章(兼容旧接口) - * @param categoryId 分类ID - * @return 返回包含文章列表的ResponseMessage对象 - */ - @GetMapping("/category/{categoryId}") - public ResponseMessage> getArticlesByCategory(@PathVariable Integer categoryId) { - return articleService.getArticlesByCategory(categoryId); - } /** * 根据属性ID获取最新文章(按创建时间降序) * @param attributeId 属性ID @@ -81,14 +80,7 @@ public class ArticleController { public ResponseMessage> getLatestArticlesByAttribute(@PathVariable Integer attributeId) { return articleService.getLatestArticlesByAttribute(attributeId); } - /** - * 获取浏览量最高的文章列表 - * @return 返回包含热门文章列表的ResponseMessage对象 - */ - @GetMapping("/popular") - public ResponseMessage> getMostViewedArticles() { - return articleService.getMostViewedArticles(); - } + /** * 创建新文章 * 仅限AUTHOR角色用户访问 diff --git a/src/main/java/com/qf/myafterprojecy/controller/CategoryAttributeController.java b/src/main/java/com/qf/myafterprojecy/controller/CategoryAttributeController.java index fa52fc7..ccd6ea4 100644 --- a/src/main/java/com/qf/myafterprojecy/controller/CategoryAttributeController.java +++ b/src/main/java/com/qf/myafterprojecy/controller/CategoryAttributeController.java @@ -3,7 +3,8 @@ package com.qf.myafterprojecy.controller; import com.qf.myafterprojecy.pojo.Category_attribute; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto; -import com.qf.myafterprojecy.service.ICategoryAttributeService; +import com.qf.myafterprojecy.service.imp.ICategoryAttributeService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/qf/myafterprojecy/controller/CategoryController.java b/src/main/java/com/qf/myafterprojecy/controller/CategoryController.java index cdc579c..cb1f8e9 100644 --- a/src/main/java/com/qf/myafterprojecy/controller/CategoryController.java +++ b/src/main/java/com/qf/myafterprojecy/controller/CategoryController.java @@ -3,7 +3,8 @@ package com.qf.myafterprojecy.controller; import com.qf.myafterprojecy.pojo.Category; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.CategoryDto; -import com.qf.myafterprojecy.service.ICategoryService; +import com.qf.myafterprojecy.service.imp.ICategoryService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/qf/myafterprojecy/controller/HelpController.java b/src/main/java/com/qf/myafterprojecy/controller/HelpController.java index 9beefbe..202b0a8 100644 --- a/src/main/java/com/qf/myafterprojecy/controller/HelpController.java +++ b/src/main/java/com/qf/myafterprojecy/controller/HelpController.java @@ -30,31 +30,35 @@ public class HelpController { @GetMapping public ResponseMessage getReadmeApi() { try { - // 获取项目根目录 - String rootPath = System.getProperty("user.dir"); - // 构建README_API.md文件路径 - File readmeFile = new File(rootPath, "README_API.md"); + // 获取README_API.md文件的绝对路径 + String readmePath = "e:\\MyWebProject\\MyAfterProjecy\\README_API.md"; + File readmeFile = new File(readmePath); // 检查文件是否存在 - if (!readmeFile.exists() || !readmeFile.isFile()) { - // 如果不存在,尝试使用类路径资源加载 - try { - ClassPathResource resource = new ClassPathResource("README_API.md"); - String markdownContent = new String(FileCopyUtils.copyToByteArray(resource.getInputStream()), StandardCharsets.UTF_8); - // 将Markdown转换为HTML - String htmlContent = convertMarkdownToHtml(markdownContent); - return ResponseMessage.success(htmlContent, "获取API文档成功"); - } catch (IOException e) { - return ResponseMessage.error("未找到README_API.md文件"); - } + if (readmeFile.exists() && readmeFile.isFile()) { + // 读取文件内容 + String markdownContent = new String(FileCopyUtils.copyToByteArray(new FileInputStream(readmeFile)), StandardCharsets.UTF_8); + // 将Markdown转换为HTML + String htmlContent = convertMarkdownToHtml(markdownContent); + return ResponseMessage.success(htmlContent, "获取API文档成功"); } - // 读取文件内容 - String markdownContent = new String(FileCopyUtils.copyToByteArray(new FileInputStream(readmeFile)), StandardCharsets.UTF_8); - // 将Markdown转换为HTML - String htmlContent = convertMarkdownToHtml(markdownContent); - return ResponseMessage.success(htmlContent, "获取API文档成功"); - } catch (IOException e) { + // 如果直接路径不存在,尝试从类路径加载 + try { + ClassPathResource resource = new ClassPathResource("README_API.md"); + String markdownContent = new String(FileCopyUtils.copyToByteArray(resource.getInputStream()), StandardCharsets.UTF_8); + // 将Markdown转换为HTML + String htmlContent = convertMarkdownToHtml(markdownContent); + return ResponseMessage.success(htmlContent, "获取API文档成功"); + } catch (IOException e) { + // 记录详细错误信息以便调试 + System.err.println("无法从类路径加载README_API.md: " + e.getMessage()); + return ResponseMessage.error("未找到README_API.md文件"); + } + } catch (Exception e) { + // 捕获所有异常并记录详细错误信息 + System.err.println("处理README_API.md时出错: " + e.getMessage()); + e.printStackTrace(); return ResponseMessage.error("读取README_API.md文件失败: " + e.getMessage()); } } diff --git a/src/main/java/com/qf/myafterprojecy/controller/MessageController.java b/src/main/java/com/qf/myafterprojecy/controller/MessageController.java index 2e29a89..2ea61ee 100644 --- a/src/main/java/com/qf/myafterprojecy/controller/MessageController.java +++ b/src/main/java/com/qf/myafterprojecy/controller/MessageController.java @@ -3,7 +3,8 @@ package com.qf.myafterprojecy.controller; import com.qf.myafterprojecy.pojo.Message; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.MessageDto; -import com.qf.myafterprojecy.service.IMessageService; +import com.qf.myafterprojecy.service.imp.IMessageService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/qf/myafterprojecy/repository/ArticleRepository.java b/src/main/java/com/qf/myafterprojecy/repository/ArticleRepository.java index 967a5c9..6832e73 100644 --- a/src/main/java/com/qf/myafterprojecy/repository/ArticleRepository.java +++ b/src/main/java/com/qf/myafterprojecy/repository/ArticleRepository.java @@ -68,7 +68,7 @@ public interface ArticleRepository extends JpaRepository { * @param articleid 文章的唯一标识符,通过@Param注解将方法参数与查询参数绑定 */ @Modifying - @Query("UPDATE Article a SET a.viewCount = a.viewCount + 1 WHERE a.articleid = :articleid") + @Query("UPDATE Article a SET a.viewCount = COALESCE(a.viewCount, 0) + 1 WHERE a.articleid = :articleid") void incrementViewCount(@Param("articleid") Integer articleid); /** @@ -79,4 +79,11 @@ public interface ArticleRepository extends JpaRepository { */ @Query("SELECT a FROM Article a WHERE a.status = 1 ORDER BY a.viewCount DESC") List
findMostViewed(); + /** + * 根据状态查询文章列表 + * @param status 文章状态,0-草稿,1-已发布,2-已删除 + * @return 返回符合状态条件的文章列表 + */ + @Query("SELECT a FROM Article a WHERE a.status = :status") + List
findByStatus(@Param("status") Integer status); } diff --git a/src/main/java/com/qf/myafterprojecy/runner/MessageDataChecker.java b/src/main/java/com/qf/myafterprojecy/runner/MessageDataChecker.java index 8f2000a..49a72dc 100644 --- a/src/main/java/com/qf/myafterprojecy/runner/MessageDataChecker.java +++ b/src/main/java/com/qf/myafterprojecy/runner/MessageDataChecker.java @@ -4,7 +4,8 @@ import com.qf.myafterprojecy.pojo.Message; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.MessageDto; import com.qf.myafterprojecy.repository.MessageRepository; -import com.qf.myafterprojecy.service.IMessageService; +import com.qf.myafterprojecy.service.imp.IMessageService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/qf/myafterprojecy/service/ArticleService.java b/src/main/java/com/qf/myafterprojecy/service/ArticleService.java index d455bc4..174a6a4 100644 --- a/src/main/java/com/qf/myafterprojecy/service/ArticleService.java +++ b/src/main/java/com/qf/myafterprojecy/service/ArticleService.java @@ -5,6 +5,8 @@ import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.ArticleDto; import com.qf.myafterprojecy.repository.ArticleRepository; import com.qf.myafterprojecy.repository.CategoryAttributeRepository; +import com.qf.myafterprojecy.service.imp.IArticleService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -46,7 +48,21 @@ public class ArticleService implements IArticleService { return ResponseMessage.failure("获取文章失败"); } } - + /** + * 获取已发布的文章列表 + * @return 返回包含已发布文章列表的ResponseMessage对象 + */ + @Override + @Transactional(readOnly = true) + public ResponseMessage> getPublishedArticles() { + try { + List
articles = articleRepository.findByStatus(1); + return ResponseMessage.success(articles); + } catch (Exception e) { + log.error("获取已发布文章列表失败: {}", e.getMessage()); + return ResponseMessage.failure("获取已发布文章列表失败"); + } + } @Override @Transactional(readOnly = true) public ResponseMessage> getArticlesByTitle(String title) { @@ -178,10 +194,9 @@ public class ArticleService implements IArticleService { Article article = articleRepository.findById(id) .orElseThrow(() -> new RuntimeException("文章不存在")); - article.setViewCount(article.getViewCount() + 1); - Article updatedArticle = articleRepository.save(article); + articleRepository.incrementViewCount(id); - return ResponseMessage.success(updatedArticle); + return ResponseMessage.success(article); } catch (Exception e) { log.error("增加文章浏览量失败: {}", e.getMessage()); return ResponseMessage.failure("增加文章浏览量失败"); diff --git a/src/main/java/com/qf/myafterprojecy/service/CategoryAttributeService.java b/src/main/java/com/qf/myafterprojecy/service/CategoryAttributeService.java index 2e70303..eebe780 100644 --- a/src/main/java/com/qf/myafterprojecy/service/CategoryAttributeService.java +++ b/src/main/java/com/qf/myafterprojecy/service/CategoryAttributeService.java @@ -4,6 +4,8 @@ import com.qf.myafterprojecy.pojo.Category_attribute; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.CategoryAttributeDto; import com.qf.myafterprojecy.repository.CategoryAttributeRepository; +import com.qf.myafterprojecy.service.imp.ICategoryAttributeService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; diff --git a/src/main/java/com/qf/myafterprojecy/service/CategoryService.java b/src/main/java/com/qf/myafterprojecy/service/CategoryService.java index ed291d2..4b5a906 100644 --- a/src/main/java/com/qf/myafterprojecy/service/CategoryService.java +++ b/src/main/java/com/qf/myafterprojecy/service/CategoryService.java @@ -4,6 +4,8 @@ import com.qf.myafterprojecy.pojo.Category; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.CategoryDto; import com.qf.myafterprojecy.repository.CategoryRepository; +import com.qf.myafterprojecy.service.imp.ICategoryService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; diff --git a/src/main/java/com/qf/myafterprojecy/service/MessageService.java b/src/main/java/com/qf/myafterprojecy/service/MessageService.java index 3ca2422..55e4865 100644 --- a/src/main/java/com/qf/myafterprojecy/service/MessageService.java +++ b/src/main/java/com/qf/myafterprojecy/service/MessageService.java @@ -4,6 +4,8 @@ import com.qf.myafterprojecy.pojo.Message; import com.qf.myafterprojecy.pojo.ResponseMessage; import com.qf.myafterprojecy.pojo.dto.MessageDto; import com.qf.myafterprojecy.repository.MessageRepository; +import com.qf.myafterprojecy.service.imp.IMessageService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; diff --git a/src/main/java/com/qf/myafterprojecy/service/IArticleService.java b/src/main/java/com/qf/myafterprojecy/service/imp/IArticleService.java similarity index 90% rename from src/main/java/com/qf/myafterprojecy/service/IArticleService.java rename to src/main/java/com/qf/myafterprojecy/service/imp/IArticleService.java index 2236bb8..75c2fac 100644 --- a/src/main/java/com/qf/myafterprojecy/service/IArticleService.java +++ b/src/main/java/com/qf/myafterprojecy/service/imp/IArticleService.java @@ -1,4 +1,4 @@ -package com.qf.myafterprojecy.service; +package com.qf.myafterprojecy.service.imp; import com.qf.myafterprojecy.pojo.Article; import com.qf.myafterprojecy.pojo.ResponseMessage; @@ -68,7 +68,7 @@ public interface IArticleService { * @return 返回符合查询条件的最新文章列表 */ ResponseMessage> getLatestArticlesByAttribute(Integer attributeid); - + ResponseMessage> getMostViewedArticles(); /** @@ -78,4 +78,9 @@ public interface IArticleService { * @return 返回包含更新后文章信息的ResponseMessage对象 */ ResponseMessage
incrementViewCount(Integer id); + /** + * 获取已发布的文章列表 + * @return 返回包含已发布文章列表的ResponseMessage对象 + */ + ResponseMessage> getPublishedArticles(); } diff --git a/src/main/java/com/qf/myafterprojecy/service/ICategoryAttributeService.java b/src/main/java/com/qf/myafterprojecy/service/imp/ICategoryAttributeService.java similarity index 97% rename from src/main/java/com/qf/myafterprojecy/service/ICategoryAttributeService.java rename to src/main/java/com/qf/myafterprojecy/service/imp/ICategoryAttributeService.java index ba3387f..be8471f 100644 --- a/src/main/java/com/qf/myafterprojecy/service/ICategoryAttributeService.java +++ b/src/main/java/com/qf/myafterprojecy/service/imp/ICategoryAttributeService.java @@ -1,4 +1,4 @@ -package com.qf.myafterprojecy.service; +package com.qf.myafterprojecy.service.imp; import com.qf.myafterprojecy.pojo.Category_attribute; import com.qf.myafterprojecy.pojo.ResponseMessage; diff --git a/src/main/java/com/qf/myafterprojecy/service/ICategoryService.java b/src/main/java/com/qf/myafterprojecy/service/imp/ICategoryService.java similarity index 96% rename from src/main/java/com/qf/myafterprojecy/service/ICategoryService.java rename to src/main/java/com/qf/myafterprojecy/service/imp/ICategoryService.java index 0ad3ef2..94c9a34 100644 --- a/src/main/java/com/qf/myafterprojecy/service/ICategoryService.java +++ b/src/main/java/com/qf/myafterprojecy/service/imp/ICategoryService.java @@ -1,4 +1,4 @@ -package com.qf.myafterprojecy.service; +package com.qf.myafterprojecy.service.imp; import com.qf.myafterprojecy.pojo.Category; import com.qf.myafterprojecy.pojo.ResponseMessage; diff --git a/src/main/java/com/qf/myafterprojecy/service/IMessageService.java b/src/main/java/com/qf/myafterprojecy/service/imp/IMessageService.java similarity index 98% rename from src/main/java/com/qf/myafterprojecy/service/IMessageService.java rename to src/main/java/com/qf/myafterprojecy/service/imp/IMessageService.java index 646b100..50dd909 100644 --- a/src/main/java/com/qf/myafterprojecy/service/IMessageService.java +++ b/src/main/java/com/qf/myafterprojecy/service/imp/IMessageService.java @@ -1,4 +1,4 @@ -package com.qf.myafterprojecy.service; +package com.qf.myafterprojecy.service.imp; import com.qf.myafterprojecy.pojo.Message; import com.qf.myafterprojecy.pojo.ResponseMessage;