mirror of
https://github.com/LiuYuYang01/ThriveX-Blog.git
synced 2026-06-08 16:22:49 +08:00
完成rss订阅功能
This commit is contained in:
31
package-lock.json
generated
31
package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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
51
src/app/api/rss/route.ts
Normal 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',
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -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`}>
|
||||
{/* 进度条组件 */}
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user