From 2ddbd99aa5b2e396f96c6daba60fe1ac2573d9fb Mon Sep 17 00:00:00 2001 From: inleft <inleft@qq.com> Date: Sat, 18 May 2024 11:53:54 +0800 Subject: [PATCH] 新增RSS 订阅链接 --- snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/SpringSecurityConstant.java | 1 snowy-main/src/main/java/vip/xiaonuo/modular/xmlFeed/BlogFeedController.java | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ snowy-main/pom.xml | 13 ++++ 3 files changed, 176 insertions(+), 0 deletions(-) diff --git a/snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/SpringSecurityConstant.java b/snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/SpringSecurityConstant.java index 4c2fb72..5ef7815 100644 --- a/snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/SpringSecurityConstant.java +++ b/snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/SpringSecurityConstant.java @@ -39,6 +39,7 @@ //对外开发的接口 "/outside/**", + "/feed", //前端的 "/favicon.ico", diff --git a/snowy-main/pom.xml b/snowy-main/pom.xml index 5f9a1ce..ba85a34 100644 --- a/snowy-main/pom.xml +++ b/snowy-main/pom.xml @@ -52,6 +52,19 @@ <version>2.3.31</version> </dependency> + <!--xml feed--> + <dependency> + <groupId>com.rometools</groupId> + <artifactId>rome</artifactId> + <version>1.8.0</version> + </dependency> + + <!--<dependency> + <groupId>rome</groupId> + <artifactId>rome</artifactId> + <version>1.0</version> + </dependency>--> + </dependencies> <build> diff --git a/snowy-main/src/main/java/vip/xiaonuo/modular/xmlFeed/BlogFeedController.java b/snowy-main/src/main/java/vip/xiaonuo/modular/xmlFeed/BlogFeedController.java new file mode 100644 index 0000000..574d0b8 --- /dev/null +++ b/snowy-main/src/main/java/vip/xiaonuo/modular/xmlFeed/BlogFeedController.java @@ -0,0 +1,162 @@ +/* +Copyright [2020] [https://www.xiaonuo.vip] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + +1.请不要删除和修改根目录下的LICENSE文件。 +2.请不要删除和修改Snowy源码头部的版权声明。 +3.请保留源码和相关描述文件的项目出处,作者声明等。 +4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy +5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy +6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.modular.xmlFeed; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.rometools.rome.feed.rss.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.core.annotion.BusinessLog; +import vip.xiaonuo.core.consts.MyConstant; +import vip.xiaonuo.core.context.constant.ConstantContextHolder; +import vip.xiaonuo.core.enums.LogAnnotionOpTypeEnum; +import vip.xiaonuo.modular.blogarticle.entity.BlogArticle; +import vip.xiaonuo.modular.blogarticle.service.BlogArticleService; +import vip.xiaonuo.sys.modular.file.service.SysFileInfoService; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * blog文章控制器 (提供给外部blog系统查询) + * + * @author inleft + * @date 2024-05-18 09:23:00 + */ +@RestController +@RequestMapping +@Slf4j +public class BlogFeedController { + + @Resource + private BlogArticleService blogArticleService; + + + @Resource + private SysFileInfoService fileInfoService; + + + /** + * 获取订阅列表,返回最新的10条 + * + * @author inleft + * @date 2024-05-18 09:23:00 + */ + @GetMapping("/feed") + @BusinessLog(title = "获取订阅列表", opType = LogAnnotionOpTypeEnum.QUERY) + public Channel queryBlogArticleList() { + + + Map<String, Object> param = new HashMap<>(16); + param.put("pageNo", 0); + param.put("pageSize", 10); + + param.put("faceExcludeFile", MyConstant.faceExcludeFile); + String blogSourcePrefix = ConstantContextHolder.getBlogSourcePrefix(); + + + Channel channel = new Channel(); + channel.setFeedType("rss_2.0"); + channel.setTitle("inleft"); + channel.setDescription("在你左边,听风及雨"); + channel.setLink("http://blog.inleft.com"); + channel.setUri("http://blog.inleft.com"); + channel.setGenerator("inleft"); + + Image image = new Image(); + image.setUrl("http://t.inleft.com/share/media_photo/xigong.png"); + image.setTitle("inleft"); + image.setHeight(32); + image.setWidth(32); + channel.setImage(image); + + //更新明细 + + Date now = DateUtil.date(); + //空类型查询条件,排除笔记系列,按更新时间倒序 + //含有类型查询,按发布时间倒序 + List<Item> resList = blogArticleService.searchList(param).stream().map(e -> { + + Source source = new Source(); + if (StrUtil.isNotEmpty(e.getCoverFileURL())) { + if (!e.getCoverFileURL().startsWith("http")) { + //补上访问参数 + source.setUrl(blogSourcePrefix + e.getCoverFileURL()); + source.setValue(blogSourcePrefix + e.getCoverFileURL()); + } + }else { + source.setUrl("http://t.inleft.com/share/media_photo/1.jpg"); + source.setValue("http://t.inleft.com/share/media_photo/1.jpg"); + } + + Category category = new com.rometools.rome.feed.rss.Category(); + category.setValue(e.getArticleTypeName()); + + + Description descr = new Description(); + descr.setValue(e.getIntroduce()); + + Item item = new Item(); + item.setAuthor("inleft"); + + item.setUri("http://blog.inleft.com"); + + item.setComments("http://blog.inleft.com/mdDetail?id=" + e.getId()); + + item.setTitle(e.getTitle()); + item.setLink("http://blog.inleft.com/mdDetail?id=" + e.getId()); + item.setDescription(descr); + item.setCategories(Collections.singletonList(category)); + item.setSource(source); + item.setPubDate(e.getUpdateDate()); + + //前端根据条件标注小红点(发布时间小于更新时间,且在7天内) + /*if (e.getPublishDate().before(e.getUpdateDate()) + && DateUtil.between(e.getUpdateDate(), now, DateUnit.DAY) <= 7) { + e.setIsAnyUpdate(MyConstant.Yes); + item.setTitle(e.getTitle()+"(最近翻新)"); + }*/ + + return item; + }).collect(Collectors.toList()); + + + //最后更新时间 + BlogArticle lastUpdateBlog = blogArticleService.lambdaQuery().orderByDesc(BlogArticle::getUpdateDate).last(MyConstant.limit).one(); + if (lastUpdateBlog != null && lastUpdateBlog.getUpdateDate() != null) { + channel.setLastBuildDate(lastUpdateBlog.getUpdateDate()); + } + channel.setPubDate(now); + + channel.setItems(resList); + + return channel; + } + +} -- Gitblit v1.9.1