From effdee935a1339fba6f24449811fd252eaf31171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Thu, 27 Nov 2025 13:10:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(blog):=20=E6=B7=BB=E5=8A=A0=E5=8D=9A?= =?UTF-8?q?=E5=AE=A2=E7=9B=AE=E5=BD=95=E5=8A=9F=E8=83=BD=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0logo=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为博客和关于页面添加可交互的目录组件,方便用户导航 将网站logo从svg格式统一改为png格式 移除generateStaticParams函数以简化构建流程 新增getBlogDetail.ts用于获取博客详情数据 --- app/[locale]/about/page.tsx | 84 ++++++++++-- app/[locale]/blog/[slug]/page.tsx | 155 +++++++++++++++------- app/[locale]/page.tsx | 16 +-- components/WebsiteLogo.tsx | 9 +- components/header/Header.tsx | 2 +- components/mdx/TableOfContents.client.tsx | 104 +++++++++++++++ lib/getBlogDetail.ts | 23 ++++ next-env.d.ts | 2 +- public/logo.png | Bin 26916 -> 1716 bytes 9 files changed, 326 insertions(+), 69 deletions(-) create mode 100644 components/mdx/TableOfContents.client.tsx create mode 100644 lib/getBlogDetail.ts diff --git a/app/[locale]/about/page.tsx b/app/[locale]/about/page.tsx index 83441af..aa95c77 100644 --- a/app/[locale]/about/page.tsx +++ b/app/[locale]/about/page.tsx @@ -1,4 +1,5 @@ import MDXComponents from "@/components/mdx/MDXComponents"; +import TableOfContents from "@/components/mdx/TableOfContents.client"; import { Locale, LOCALES } from "@/i18n/routing"; import { constructMetadata } from "@/lib/metadata"; import fs from "fs/promises"; @@ -16,7 +17,52 @@ const options = { }, }; -async function getMDXContent(locale: string, section: string) { +interface TableOfContentsItem { + id: string; + text: string; + level: number; +} + +// 解析MDX内容并提取标题 +async function parseMDXContent(content: string): Promise { + if (!content) { + return []; + } + + try { + const headingRegex = /^#{2,4}\s+(.+)$/gm; + const headings: TableOfContentsItem[] = []; + let match; + + while ((match = headingRegex.exec(content)) !== null) { + const fullMatch = match[0]; + const text = match[1]?.trim(); + + if (!text) continue; + + // 确定标题级别 + let level = 2; + if (fullMatch.startsWith("###")) { + level = fullMatch.startsWith("####") ? 4 : 3; + } + + // 生成ID(将文本转换为URL友好的格式) + const id = text + .toLowerCase() + .replace(/[^a-z0-9\u4e00-\u9fa5\s-]/g, "") + .replace(/\s+/g, "-"); + + headings.push({ id, text, level }); + } + + return headings; + } catch (error) { + console.error("Error parsing MDX content for TOC:", error); + return []; + } +} + +async function getMDXContent(locale: string, section: string): Promise { const filePath = path.join( process.cwd(), "content", @@ -69,15 +115,37 @@ export default async function AboutPage({ const section = (resolvedSearchParams.section as string) || "company"; const content = await getMDXContent(locale, section); + const tocItems = await parseMDXContent(content); + + // 获取多语言目录标题 + const t = await getTranslations({ locale, namespace: "Common" }); + const tocTitle = t("tableOfContents") || "目录"; return ( -
- -
+
+ {/* 侧边目录 - 在移动端显示在内容上方 */} +
+ +
+ + {/* 主要内容 */} +
+ {content ? ( + + ) : ( +
+

内容加载中...

+
+ )} +
+
); } diff --git a/app/[locale]/blog/[slug]/page.tsx b/app/[locale]/blog/[slug]/page.tsx index ce36de0..962c472 100644 --- a/app/[locale]/blog/[slug]/page.tsx +++ b/app/[locale]/blog/[slug]/page.tsx @@ -1,13 +1,59 @@ import { Callout } from "@/components/mdx/Callout"; import MDXComponents from "@/components/mdx/MDXComponents"; -import { Locale, LOCALES } from "@/i18n/routing"; -import { getPosts } from "@/lib/getBlogs"; +import TableOfContents from "@/components/mdx/TableOfContents.client"; +import { Locale } from "@/i18n/routing"; +import { getPostDetail } from "@/lib/getBlogDetail"; import { constructMetadata } from "@/lib/metadata"; import { BlogPost } from "@/types/blog"; import { Metadata } from "next"; import { MDXRemote } from "next-mdx-remote-client/rsc"; import { notFound } from "next/navigation"; +interface TableOfContentsItem { + id: string; + text: string; + level: number; +} + +// 解析MDX内容并提取标题 +async function parseMDXContent(content: string): Promise { + if (!content) { + return []; + } + + try { + const headingRegex = /^#{2,4}\s+(.+)$/gm; + const headings: TableOfContentsItem[] = []; + let match; + + while ((match = headingRegex.exec(content)) !== null) { + const fullMatch = match[0]; + const text = match[1]?.trim(); + + if (!text) continue; + + // 确定标题级别 + let level = 2; + if (fullMatch.startsWith("###")) { + level = fullMatch.startsWith("####") ? 4 : 3; + } + + // 生成ID(将文本转换为URL友好的格式) + const id = text + .toLowerCase() + .replace(/[^a-z0-9\u4e00-\u9fa5\s-]/g, "") + .replace(/\s+/g, "-"); + + headings.push({ id, text, level }); + } + + return headings; + } catch (error) { + console.error("Error parsing MDX content for TOC:", error); + return []; + } +} + type Params = Promise<{ locale: string; slug: string; @@ -21,10 +67,10 @@ export async function generateMetadata({ params, }: MetadataProps): Promise { const { locale, slug } = await params; - let { posts }: { posts: BlogPost[] } = await getPosts(locale); - const post = posts.find((post) => post.slug === slug); + let post: BlogPost = await getPostDetail(slug); + + console.log(post); - console.log(post, posts); if (!post) { return constructMetadata({ title: "404", @@ -49,56 +95,73 @@ export async function generateMetadata({ export default async function BlogPage({ params }: { params: Params }) { const { locale, slug } = await params; - let { posts }: { posts: BlogPost[] } = await getPosts(locale); - - const post = posts.find((item) => item.slug === slug); + let post: BlogPost = await getPostDetail(slug); if (!post) { return notFound(); } + console.log(post); + + // 提取博客内容中的标题用于目录 + const tocItems = await parseMDXContent(post.content || ""); + + // 使用默认目录标题 + const tocTitle = "目录"; + return ( -
-

{post.title}

- {post.image && ( - {post.title} - )} - {post.tags && post.tags.split(",").length ? ( -
- {post.tags.split(",").map((tag) => { - return ( -
- {tag.trim()} -
- ); - })} -
- ) : ( - <> - )} - {post.description && {post.description}} - +
+ {/* 侧边目录 - 在移动端显示在内容上方 */} +
+ +
+ + {/* 主要内容 */} +
+

{post.title}

+ {post.image && ( + {post.title} + )} + {post.tags && post.tags.split(",").length ? ( +
+ {post.tags.split(",").map((tag) => { + return ( +
+ {tag.trim()} +
+ ); + })} +
+ ) : ( + <> + )} + {post.description && {post.description}} + +
); } -export async function generateStaticParams() { - let posts = (await getPosts()).posts; +// export async function generateStaticParams() { +// let post = (await getPostDetail()); + +// // Filter out posts without a slug +// posts = posts.filter((post) => post.slug); - // Filter out posts without a slug - posts = posts.filter((post) => post.slug); +// return LOCALES.flatMap((locale) => +// posts.map((post) => { +// const slugPart = post.slug.replace(/^\//, "").replace(/^blog\//, ""); - return LOCALES.flatMap((locale) => - posts.map((post) => { - const slugPart = post.slug.replace(/^\//, "").replace(/^blog\//, ""); - - return { - locale, - slug: slugPart, - }; - }) - ); -} +// return { +// locale, +// slug: slugPart, +// }; +// }) +// ); +// } diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 0ed1e0b..eb99d87 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -6,11 +6,11 @@ export default function Home() { return ; } -export async function generateStaticParams() { - return [ - { locale: 'en' }, - { locale: 'zh' }, - { locale: 'vi' }, - // { locale: 'ja' }, - ] -} +// export async function generateStaticParams() { +// return [ +// { locale: 'en' }, +// { locale: 'zh' }, +// { locale: 'vi' }, +// // { locale: 'ja' }, +// ] +// } diff --git a/components/WebsiteLogo.tsx b/components/WebsiteLogo.tsx index 3cf5858..d8319fe 100644 --- a/components/WebsiteLogo.tsx +++ b/components/WebsiteLogo.tsx @@ -16,13 +16,13 @@ const WebsiteLogo = ({ timeout = 1000, // 1 second }: IProps) => { const domain = getDomain(url); - const [imgSrc, setImgSrc] = useState(`https://${domain}/logo.svg`); + const [imgSrc, setImgSrc] = useState(`https://${domain}/logo.png`); const [fallbackIndex, setFallbackIndex] = useState(0); const [isLoading, setIsLoading] = useState(true); const [hasError, setHasError] = useState(false); const fallbackSources = [ - `https://${domain}/logo.svg`, + `https://${domain}/logo.png`, `https://${domain}/logo.png`, `https://${domain}/apple-touch-icon.png`, `https://${domain}/apple-touch-icon-precomposed.png`, @@ -83,9 +83,8 @@ const WebsiteLogo = ({ height={size} onError={handleError} onLoad={handleLoad} - className={`inline-block transition-opacity duration-300 ${ - isLoading ? "opacity-0" : "opacity-100" - }`} + className={`inline-block transition-opacity duration-300 ${isLoading ? "opacity-0" : "opacity-100" + }`} style={{ objectFit: "contain", display: hasError ? "none" : "inline-block", diff --git a/components/header/Header.tsx b/components/header/Header.tsx index d056865..a9817ef 100644 --- a/components/header/Header.tsx +++ b/components/header/Header.tsx @@ -20,7 +20,7 @@ const Header = () => { > {siteConfig.name}(""); + + useEffect(() => { + if (items.length === 0) return; + + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + setActiveId(entry.target.id); + } + }); + }, + { rootMargin: "0% 0% -80% 0%" } + ); + + // 观察所有标题元素 + items.forEach((item) => { + const element = document.getElementById(item.id); + if (element) { + observer.observe(element); + } + }); + + return () => { + items.forEach((item) => { + const element = document.getElementById(item.id); + if (element) { + observer.unobserve(element); + } + }); + }; + }, [items]); + + const handleClick = (e: React.MouseEvent, id: string) => { + e.preventDefault(); + const element = document.getElementById(id); + if (element) { + element.scrollIntoView({ behavior: "smooth" }); + window.history.pushState(null, "", `#${id}`); + setActiveId(id); + } + }; + + if (!items || items.length === 0) { + return null; + } + + return ( + + ); +} \ No newline at end of file diff --git a/lib/getBlogDetail.ts b/lib/getBlogDetail.ts new file mode 100644 index 0000000..523facf --- /dev/null +++ b/lib/getBlogDetail.ts @@ -0,0 +1,23 @@ +import { BlogPost } from '@/types/blog'; + +export async function getPostDetail(articleId: string): Promise { + let url = 'http://49.232.154.205:18081/export/article/' + articleId + + const response = await fetch(url); + const json = await response.json(); + const data = json.data; + const post = { + locale: data.langCode, + title: data.title, + description: data.summary, + image: data.cover || '', + slug: data.articleId, + tags: '', + date: data.publishedTime, + // visible: data.visible || 'published', + pin: false, + content: data.content, + metadata: data, + } + return post; +} \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts index c4b7818..9edff1c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/public/logo.png b/public/logo.png index cf1be82a7c1169f5145b2c3856d4fd313c957876..2270d8a4f48cafc5e467f79fbf2f226c2cd6e922 100644 GIT binary patch literal 1716 zcmV;l221&gP)00009a7bBm001r{ z001r{0eGc9b^rhdW=TXrRCt{2ow1J{H4ukqQ3~jg2%)5j6zQO*K_X6rL;>BUqom;v zpxq!ULHDpS1Od+**`d+qhic*bvj(kMDz)*jEd zV|#7y9zgT*J%INI*4OsRgd%?q;4fwXPd1Dv8ok_U7TLIT#>(T7E zYq0gpyAkey4A@}H5PIesY&r7h#F=Zb>#BHCWw2$-p9=tMu<0c#lMObVs*lMAn@{Ys zYlB@!C@WkB8($O+UbR-uZ3DEw8FB*zQG->$ZZW$TyHtV(8*D~pO^yt z4W_}CCDPzg!5##_)Bu|`Gbmv90zgWIUA5aoZm^046;9Zq#x!i$lG;`Sw&=UvU?ViT z7tk1kP1ANYGf;zlv+b_6Mj7mR>sx4q!CtoE&~Xh;BQzRw=S#(K*6%x9+Zk>{%x>`$ zQ+KM6kzq@J#02QJKb*8STkAGu#rSgom`su$8RVUsg>8_J)f{Yt99A>14f3+o!#2q2 zQVZK4=L-||1%^XQGRW(N0GkK2K`vJzY<~p+cQGA0)Jv3w?`Z=74@WEP=EP~t#?>om zSJ)2Ch-Yc-piV8jIY{k|#{X+-pExpkCUd(DK-X|)XMt9q$wQ(KEoOFN*X=)`_l35C zKJ$iiK>uwn4$H`7e^)zXmk0Sq2%-bFp4 zpHefs@bCfs>>7wG7|__(K5td zeI^_Q4LiFVcp;u2@?-;$ef9_?hz-E451BZitApAQTv?DMz-|z(Ovu!*9UM>6DBwC7 zaAiX#h7GVSm*ht31;kAiWCqw+lKc`}bqBP=mNM>!P3sviq!W`Rs()xcRazlWssLLL z+&$IrPIPqR(q_y#R^0&&uqDozPZu&WZ0|tqjM*R~z}B9%0r%?|+J2>oHz zsX(4|2cUZ%|1Z7=fJYq8a7pk%J`%ki|Fw6}7+`?YgM4S<_n)$O!K_n*9LZ#V2D%nF zl4X#0dW+2qW*Ow2&e*(Q)~P{`jmehDg_>SMul>5qNoF!IthgLZW~%PL4uKe))n1j- zyyEo&pnD|{*cw}QPXW5O1HMpxpyhJ3$K%iUVY{N{20R`1Lj9bX{a3(;o~XWs zwevRKp!hT6X5)Yzf?V;f3yxhb+6w+ihs*-|NubUr{BW=9?zKaHmJgW}_CN%=WJ}Xg zL#BR&`fvTEBwrc`?Lhs$vb?>o3#>k8c7Nq{$)bk*qPz%H*dfSIGt0q%JINJZpCZz( z;_-6*+5VPv<9(z|;%>R9-a@0T;Agym%myeIc3>-UaWO>k3+VKaf5Z(;Fj%RuW6!K} zWl;Pn-yYZx2hvu+@;&D1X^|IOBy@w-C5IkiUrp;&$K~%s;c|fTa5k)+Y?^4)WX`k7Zv)0&;KRT7j>rh9nj4 zHDmw)|0_`iUqk})ZekgNVM~X*wQ0rcH=-!SmNj2XETi=E{{))g!UZTe;dyKPmkM%h zS@U*gS>pi%e+kzc@ZIG)x7JGKyUD5`PjYa*-s_oOLe~j*MkHg)Cz1NTM65^B$KIsb z#bJZ6EBH7P!0%`pgz{c;3vhiP7U&I&trh=3*tnIjn}IvVV7`$KxuOpv0sV!ip((JN zf;(BP-KdKr??>u+#@OHiX1~bWBwP<^8$)PYVeduicwR36&B7fZZK=ywD{Zq@ow zq$6j%y3YaN0hFDqimiD4Q&6sHrwsr+7BFnwptrBi?CmfT#LD^*|JI5eG9^VIdaWs0s<)6(BR%${x2!&#@!&l zzf-dT=wiE2f8*5MoCJK!8%_Qr0ofwS$hu{uOkO2>PTq<kWfm--7yunRSlNoJrkEQvqwHVw?sol^wxcO28+u)WQ{7KyszyYhyDkfOm_0ZvCnG&0000< KMNUMnLSTaScQ)1l literal 26916 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 s3l$5CSj}For8^Yg4K);M2ic~dpS6P_