feat: 关于本站对齐站点公告,增加全部与管理入口

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-18 01:47:39 +08:00
parent 184489bca2
commit 2ccfb5f330
15 changed files with 384 additions and 80 deletions

View File

@@ -1,8 +1,11 @@
import type { Metadata } from "next";
import { cookies } from "next/headers";
import { notFound } from "next/navigation";
import { Megaphone } from "lucide-react";
import { fetchSitePageBySlug, fetchOverview } from "@/lib/api";
import { getPublicSettingsCached } from "@/lib/serverData";
import { authCookieHeader } from "@/lib/cookies";
import { getMeCached, getPublicSettingsCached } from "@/lib/serverData";
import { isAdminOrAbove } from "@/lib/roles";
import { extractToc, estimateReadingMinutes, markdownHeadingToc } from "@/lib/toc";
import MarkdownBody from "@/components/MarkdownBody";
import PostToc from "@/components/PostToc";
@@ -38,16 +41,19 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
export default async function SitePagePublic({ params }: PageProps) {
const { slug } = await params;
const [data, overview, settings] = await Promise.all([
const cookie = authCookieHeader(await cookies());
const [data, overview, settings, me] = await Promise.all([
fetchSitePageBySlug(slug).catch(() => null),
fetchOverview().catch(() => null),
getPublicSettingsCached(),
getMeCached(cookie || undefined),
]);
if (!data) notFound();
const p = data.page;
const sidebarPages = overview?.sidebar_pages ?? [];
const announcements = overview?.announcements ?? [];
const canManagePages = !!me.user && isAdminOrAbove(me.user.role);
const siteLead = settings.site_description?.trim() || undefined;
const toc = extractToc(p.content);
const headingToc = markdownHeadingToc(toc);
@@ -76,7 +82,11 @@ export default async function SitePagePublic({ params }: PageProps) {
const left = (
<>
<SiteDocIdentity kind="about" lead={siteLead} />
<SiteDocPageNav pages={sidebarPages} currentSlug={slug} />
<SiteDocPageNav
pages={sidebarPages}
currentSlug={slug}
canManage={canManagePages}
/>
</>
);
@@ -101,7 +111,7 @@ export default async function SitePagePublic({ params }: PageProps) {
<SiteDocBreadcrumb
items={[
{ href: "/", label: "首页" },
{ label: "关于本站" },
{ href: "/about", label: "关于本站" },
{ label: p.title },
]}
/>
@@ -109,7 +119,12 @@ export default async function SitePagePublic({ params }: PageProps) {
mobileExtras={
<>
{toc.length > 0 ? <PostToc items={toc} /> : null}
<SiteDocPageNav pages={sidebarPages} currentSlug={slug} title="文档目录" />
<SiteDocPageNav
pages={sidebarPages}
currentSlug={slug}
title="文档目录"
canManage={canManagePages}
/>
{toc.length === 0 && announcements.length > 0 ? (
<SiteDocAnnoNav items={announcements} />
) : null}