完善站点运营设置:分路由管理、登录可见评论、邮件模板内联与关闭注册 SSR。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-23 00:17:00 +08:00
parent acde7ee288
commit 6f054a903c
98 changed files with 8239 additions and 2073 deletions

View File

@@ -1,5 +1,5 @@
import pkg from "../package.json";
import type { FooterLink } from "@/lib/brand";
import type { FooterLink, FooterLinksAlign } from "@/lib/brand";
import FooterTiming from "./FooterTiming";
// 官方镜像构建会写入 NEXT_PUBLIC_APP_VERSION(可与脚手架 0.1.0 相同)。
@@ -10,7 +10,29 @@ function realVersion(pkgVersion: string): string {
return !pkgVersion || pkgVersion === "0.0.0" || pkgVersion === "0.1.0" ? "" : pkgVersion;
}
// 极简页脚:左侧版权 / 版本 / 耗时,右侧备案等链接
function zoneLinks(links: FooterLink[], align: FooterLinksAlign): FooterLink[] {
return links.filter((item) => (item.align || "right") === align);
}
function LinkGroup({ items }: { items: FooterLink[] }) {
if (items.length === 0) return null;
return (
<div className="site-footer-links">
{items.map((item) => (
<a
key={`${item.align}-${item.label}-${item.url}`}
href={item.url}
className="meta text-[12px] hover:underline"
{...(item.new_tab ? { target: "_blank", rel: "noopener noreferrer" } : {})}
>
{item.label}
</a>
))}
</div>
);
}
// 极简页脚:版权 / 版本 / 耗时 + 左 / 中 / 右三栏链接
export default function Footer({
siteName = "姜十三社区",
links = [],
@@ -20,34 +42,33 @@ export default function Footer({
}) {
const year = new Date().getFullYear();
const brand = siteName.trim() || "姜十三社区";
const visibleLinks = links.filter((item) => item.label.trim() && item.url.trim());
const visible = links.filter((item) => item.label.trim() && item.url.trim());
const left = zoneLinks(visible, "left");
const center = zoneLinks(visible, "center");
const right = zoneLinks(visible, "right");
return (
<footer
className="site-footer"
style={{
borderTop: "1px solid var(--line)",
background: "var(--panel)",
}}
>
<div className="max-w-[1440px] mx-auto px-4 sm:px-6 py-4 flex items-center justify-between gap-x-4 gap-y-2 flex-wrap">
<div className="flex items-center gap-x-3 gap-y-1 flex-wrap min-w-0">
<span className="meta text-[12px] whitespace-nowrap">© {year} {brand}</span>
<FooterTiming version={realVersion(pkg.version)} />
<div className="site-footer-inner max-w-[1440px] mx-auto px-4 sm:px-6 py-4">
<div className="site-footer-zone site-footer-zone-left">
<div className="site-footer-meta">
<span className="meta text-[12px] whitespace-nowrap">© {year} {brand}</span>
<FooterTiming version={realVersion(pkg.version)} />
</div>
<LinkGroup items={left} />
</div>
<div className="site-footer-zone site-footer-zone-center">
<LinkGroup items={center} />
</div>
<div className="site-footer-zone site-footer-zone-right">
<LinkGroup items={right} />
</div>
{visibleLinks.length > 0 ? (
<nav aria-label="页脚链接" className="flex flex-wrap items-center justify-end gap-x-3 gap-y-1 min-w-0 ml-auto">
{visibleLinks.map((item) => (
<a
key={`${item.label}-${item.url}`}
href={item.url}
className="meta text-[12px] hover:underline"
{...(item.new_tab ? { target: "_blank", rel: "noopener noreferrer" } : {})}
>
{item.label}
</a>
))}
</nav>
) : null}
</div>
</footer>
);