From c5bcbaa8403b748236558f8d62b2eedbb7045d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E9=98=B3?= <3311118881@qq.com> Date: Sat, 19 Oct 2024 13:10:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90rss=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 31 ++++++++++++++++++++++++ package.json | 1 + src/app/api/rss/route.ts | 51 +++++++++++++++++++++++++++++++++++++++ src/app/layout.tsx | 4 ++-- src/app/my/page.tsx | 52 ++++++++++++++++++++-------------------- 5 files changed, 111 insertions(+), 28 deletions(-) create mode 100644 src/app/api/rss/route.ts diff --git a/package-lock.json b/package-lock.json index f511d2f..cdb6707 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "ahooks": "^3.8.1", "aos": "^3.0.0-beta.6", "dayjs": "^1.11.13", + "feed": "^4.2.2", "github-markdown-css": "^5.6.1", "next": "^14.2.5", "next-nprogress-bar": "^2.3.13", @@ -5061,6 +5062,18 @@ "reusify": "^1.0.4" } }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", @@ -7271,6 +7284,12 @@ "node": ">=14.0.0" } }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", @@ -8067,6 +8086,18 @@ "node": ">=8" } }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmmirror.com/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, "node_modules/yaml": { "version": "2.4.5", "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.4.5.tgz", diff --git a/package.json b/package.json index 16ed965..d088eee 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "ahooks": "^3.8.1", "aos": "^3.0.0-beta.6", "dayjs": "^1.11.13", + "feed": "^4.2.2", "github-markdown-css": "^5.6.1", "next": "^14.2.5", "next-nprogress-bar": "^2.3.13", diff --git a/src/app/api/rss/route.ts b/src/app/api/rss/route.ts new file mode 100644 index 0000000..fd39d3b --- /dev/null +++ b/src/app/api/rss/route.ts @@ -0,0 +1,51 @@ +import { Feed } from 'feed'; +import { NextResponse } from 'next/server'; + +import { getArticleListAPI } from '@/api/article' +import { getWebDataAPI } from '@/api/project' +import { getUserDataAPI } from '@/api/user' + +export async function GET() { + const { data: web } = await getWebDataAPI() + const { data: user } = await getUserDataAPI() + const { data: article } = await getArticleListAPI({ pagination: { page: 1, size: 8 } }) + const list = article?.result || [] + + const feed = new Feed({ + title: `${web.title} - ${web.subhead}`, + description: web.description, + id: web.url, + link: web.url, + language: 'zh-CN', + copyright: 'ThriveX 现代化博客管理系统', + updated: new Date(), + generator: '为爱发电', + docs: "https://github.com/LiuYuYang01/ThriveX-Blog", + author: { + name: user.name, + email: user.email, + link: web.url + }, + image: user.avatar, + feed: web.url + '/api/rss' + }); + + list.forEach(item => { + feed.addItem({ + id: item.id + '', + title: item.title, + link: web.url + '/article/' + item.id, + description: item.description, + content: item.content, + copyright: 'ThriveX 现代化博客管理系统', + date: new Date() + }); + }); + + const xml = feed.rss2(); + return new NextResponse(xml, { + headers: { + 'Content-Type': 'application/xml', + }, + }); +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4f3309e..9ed7c68 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -29,7 +29,7 @@ export default async function RootLayout({ children }: Readonly<{ children: Reac -