From 000bc6f2458c09af41df8a9b654df72073200241 Mon Sep 17 00:00:00 2001 From: ruibaby Date: Thu, 21 Mar 2019 20:56:18 +0800 Subject: [PATCH] Create ContentFeedController --- .../controller/admin/api/ThemeController.java | 2 +- .../content/ContentCategoryController.java | 4 +- .../content/ContentFeedController.java | 161 ++++++++++++++++++ .../content/ContentIndexController.java | 2 +- .../content/ContentTagController.java | 4 +- 5 files changed, 167 insertions(+), 6 deletions(-) create mode 100644 src/main/java/cc/ryanc/halo/web/controller/content/ContentFeedController.java diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/api/ThemeController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/api/ThemeController.java index 3f2bb04e9..6d0fec892 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/api/ThemeController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/api/ThemeController.java @@ -29,7 +29,7 @@ public class ThemeController { private final OptionService optionService; - private Configuration configuration; + private final Configuration configuration; public ThemeController(OptionService optionService, Configuration configuration) { diff --git a/src/main/java/cc/ryanc/halo/web/controller/content/ContentCategoryController.java b/src/main/java/cc/ryanc/halo/web/controller/content/ContentCategoryController.java index 4330357c9..7cf990f2c 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/content/ContentCategoryController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/content/ContentCategoryController.java @@ -24,9 +24,9 @@ import static org.springframework.data.domain.Sort.Direction.DESC; @RequestMapping(value = "/categories") public class ContentCategoryController extends BaseContentController { - private CategoryService categoryService; + private final CategoryService categoryService; - private PostService postService; + private final PostService postService; public ContentCategoryController(CategoryService categoryService, PostService postService) { diff --git a/src/main/java/cc/ryanc/halo/web/controller/content/ContentFeedController.java b/src/main/java/cc/ryanc/halo/web/controller/content/ContentFeedController.java new file mode 100644 index 000000000..4223211f6 --- /dev/null +++ b/src/main/java/cc/ryanc/halo/web/controller/content/ContentFeedController.java @@ -0,0 +1,161 @@ +package cc.ryanc.halo.web.controller.content; + +import cc.ryanc.halo.model.entity.Post; +import cc.ryanc.halo.model.enums.BlogProperties; +import cc.ryanc.halo.model.enums.PostStatus; +import cc.ryanc.halo.model.enums.PostType; +import cc.ryanc.halo.service.PostService; +import cn.hutool.core.util.StrUtil; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; + +import java.io.IOException; +import java.util.List; + +import static cc.ryanc.halo.model.support.HaloConst.OPTIONS; + +/** + * @author : RYAN0UP + * @date : 2019-03-21 + */ +@Controller +public class ContentFeedController { + + private final PostService postService; + + private final FreeMarkerConfigurer freeMarker; + + public ContentFeedController(PostService postService, FreeMarkerConfigurer freeMarker) { + this.postService = postService; + this.freeMarker = freeMarker; + } + + /** + * Get post rss + * + * @param model model + * @return String + * @throws IOException IOException + * @throws TemplateException TemplateException + */ + @GetMapping(value = {"feed", "feed.xml", "rss", "rss.xml"}, produces = "application/xml;charset=UTF-8") + @ResponseBody + public String feed(Model model) throws IOException, TemplateException { + String rssPosts = OPTIONS.get(BlogProperties.RSS_POSTS.getValue()); + if (StrUtil.isBlank(rssPosts)) { + rssPosts = "20"; + } + final Sort sort = new Sort(Sort.Direction.DESC, "postDate"); + final Pageable pageable = PageRequest.of(0, Integer.parseInt(rssPosts), sort); + final Page postsPage = postService.pageBy(PostStatus.PUBLISHED, PostType.POST, pageable).map(post -> { + if (StrUtil.isNotEmpty(post.getPassword())) { + post.setFormatContent("该文章为加密文章"); + post.setSummary("该文章为加密文章"); + } + return post; + }); + final List posts = postsPage.getContent(); + model.addAttribute("posts", posts); + final Template template = freeMarker.getConfiguration().getTemplate("common/web/rss.ftl"); + return FreeMarkerTemplateUtils.processTemplateIntoString(template, model); + } + + /** + * Get atom.xml + * + * @param model model + * @return String + * @throws IOException IOException + * @throws TemplateException TemplateException + */ + @GetMapping(value = {"atom", "atom.xml"}, produces = "application/xml;charset=UTF-8") + @ResponseBody + public String atom(Model model) throws IOException, TemplateException { + String rssPosts = OPTIONS.get(BlogProperties.RSS_POSTS.getValue()); + if (StrUtil.isBlank(rssPosts)) { + rssPosts = "20"; + } + final Sort sort = new Sort(Sort.Direction.DESC, "postDate"); + final Pageable pageable = PageRequest.of(0, Integer.parseInt(rssPosts), sort); + final Page postsPage = postService.pageBy(PostStatus.PUBLISHED, PostType.POST, pageable).map(post -> { + if (StrUtil.isNotEmpty(post.getPassword())) { + post.setFormatContent("该文章为加密文章"); + post.setSummary("该文章为加密文章"); + } + return post; + }); + final List posts = postsPage.getContent(); + model.addAttribute("posts", posts); + final Template template = freeMarker.getConfiguration().getTemplate("common/web/atom.ftl"); + return FreeMarkerTemplateUtils.processTemplateIntoString(template, model); + } + + /** + * Get sitemap.xml. + * + * @param model model + * @return String + * @throws IOException IOException + * @throws TemplateException TemplateException + */ + @GetMapping(value = {"sitemap", "sitemap.xml"}, produces = "application/xml;charset=UTF-8") + @ResponseBody + public String sitemapXml(Model model) throws IOException, TemplateException { + final Page postsPage = postService.pageBy(PostStatus.PUBLISHED, PostType.POST, null).map(post -> { + if (StrUtil.isNotEmpty(post.getPassword())) { + post.setFormatContent("该文章为加密文章"); + post.setSummary("该文章为加密文章"); + } + return post; + }); + final List posts = postsPage.getContent(); + model.addAttribute("posts", posts); + final Template template = freeMarker.getConfiguration().getTemplate("common/web/sitemap_xml.ftl"); + return FreeMarkerTemplateUtils.processTemplateIntoString(template, model); + } + + /** + * Get sitemap.html. + * + * @param model model + * @return String + */ + @GetMapping(value = "sitemap.html", produces = {"text/html"}) + public String sitemapHtml(Model model) { + final Page postsPage = postService.pageBy(PostStatus.PUBLISHED, PostType.POST, null).map(post -> { + if (StrUtil.isNotEmpty(post.getPassword())) { + post.setFormatContent("该文章为加密文章"); + post.setSummary("该文章为加密文章"); + } + return post; + }); + final List posts = postsPage.getContent(); + model.addAttribute("posts", posts); + return "common/web/sitemap_html"; + } + + /** + * Get robots. + * + * @param model model + * @return String + * @throws IOException IOException + * @throws TemplateException TemplateException + */ + @GetMapping(value = "robots.txt", produces = {"text/plain"}) + @ResponseBody + public String robots(Model model) throws IOException, TemplateException { + final Template template = freeMarker.getConfiguration().getTemplate("common/web/robots.ftl"); + return FreeMarkerTemplateUtils.processTemplateIntoString(template, model); + } +} diff --git a/src/main/java/cc/ryanc/halo/web/controller/content/ContentIndexController.java b/src/main/java/cc/ryanc/halo/web/controller/content/ContentIndexController.java index a2970763c..d64500a89 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/content/ContentIndexController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/content/ContentIndexController.java @@ -34,7 +34,7 @@ import static org.springframework.data.domain.Sort.Direction.DESC; @RequestMapping public class ContentIndexController extends BaseContentController { - private PostService postService; + private final PostService postService; public ContentIndexController(PostService postService) { this.postService = postService; diff --git a/src/main/java/cc/ryanc/halo/web/controller/content/ContentTagController.java b/src/main/java/cc/ryanc/halo/web/controller/content/ContentTagController.java index f7a28edb5..a3aba0538 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/content/ContentTagController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/content/ContentTagController.java @@ -31,9 +31,9 @@ import static org.springframework.data.domain.Sort.Direction.DESC; @RequestMapping(value = "/tags") public class ContentTagController extends BaseContentController { - private TagService tagService; + private final TagService tagService; - private PostService postService; + private final PostService postService; public ContentTagController(TagService tagService, PostService postService) { this.tagService = tagService;