完成rss订阅功能

This commit is contained in:
宇阳
2024-10-19 13:10:45 +08:00
parent 8ab8a727fa
commit c5bcbaa840
5 changed files with 111 additions and 28 deletions

31
package-lock.json generated
View File

@@ -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",

View File

@@ -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",

51
src/app/api/rss/route.ts Normal file
View File

@@ -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',
},
});
}

View File

@@ -29,7 +29,7 @@ export default async function RootLayout({ children }: Readonly<{ children: Reac
<meta name="keywords" content={data?.keyword} />
<link rel="icon" href={data?.favicon} />
<script dangerouslySetInnerHTML={{
{/* <script dangerouslySetInnerHTML={{
__html: `
var _hmt = _hmt || [];
(function() {
@@ -39,7 +39,7 @@ export default async function RootLayout({ children }: Readonly<{ children: Reac
s.parentNode.insertBefore(hm, s);
})();
`
}} />
}} /> */}
<body className={`${LXGWWenKai.className} dark:!bg-black-a transition-colors`}>
{/* 进度条组件 */}

View File

@@ -1,6 +1,6 @@
import bg from '@/assets/image/bg.png'
import avatar from '@/assets/image/avatar.jpg'
import {MyData} from '@/types/app/my'
import { MyData } from '@/types/app/my'
import Goals from './component/Goals'
import Character from './component/Character'
@@ -147,32 +147,32 @@ export default () => {
}
return (
<>
<title></title>
<meta name="description" content="关于我"/>
<>
<title></title>
<meta name="description" content="关于我" />
<div className="bg-white dark:bg-black-a pt-20 bg-cover bg-center bg-fixed"
style={{backgroundImage: `url(${bg.src})`}}>
<div className="w-[90%] lg:w-[950px] mx-auto">
<Info data={data?.info}/>
</div>
<div className="flex flex-col md:flex-row w-[90%] sm:w-9/12 mt-16 mx-auto">
<Character data={data?.character}/>
<Goals data={data?.goals}/>
</div>
<div className="flex flex-col md:flex-row w-[90%] sm:w-9/12 mt-16 mx-auto">
<Map/>
<Technology/>
</div>
<Project data={data?.project}/>
<div className="mt-16">
<CurriculumVitae/>
</div>
<div className="bg-white dark:bg-black-a pt-20 bg-cover bg-center bg-fixed"
style={{ backgroundImage: `url(${bg.src})` }}>
<div className="w-[90%] lg:w-[950px] mx-auto">
<Info data={data?.info} />
</div>
</>
<div className="flex flex-col md:flex-row w-[90%] sm:w-9/12 mt-16 mx-auto">
<Character data={data?.character} />
<Goals data={data?.goals} />
</div>
<div className="flex flex-col md:flex-row w-[90%] sm:w-9/12 mt-16 mx-auto">
<Map />
<Technology />
</div>
<Project data={data?.project} />
<div className="mt-16">
<CurriculumVitae />
</div>
</div>
</>
)
}