feat(admin): 完善站点设置、内容回收站与后台菜单分组

新增站点设置与内容管理(含已删除恢复/清除),用户页改用独有运营指标,并按概览/内容/成员与经济/站点重组侧栏。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-16 05:56:27 +08:00
parent be47b38370
commit dd7bd010b8
25 changed files with 2193 additions and 323 deletions

View File

@@ -7,13 +7,14 @@ function realVersion(v: string): string {
}
// 极简页脚:版权 + 实时性能指标(版本 / 页面加载 / 模板生成)
export default function Footer() {
export default function Footer({ siteName = "姜十三社区" }: { siteName?: string }) {
const year = new Date().getFullYear();
const brand = siteName.trim() || "姜十三社区";
return (
<footer className="mt-14" style={{ borderTop: "1px solid var(--line)" }}>
<div className="max-w-[1440px] mx-auto px-4 sm:px-6 py-4 flex items-center justify-between gap-4">
<span className="meta text-[12px] whitespace-nowrap">© {year} 姜十三社区</span>
<span className="meta text-[12px] whitespace-nowrap">© {year} {brand}</span>
<FooterTiming version={realVersion(pkg.version)} />
</div>
</footer>

View File

@@ -36,11 +36,15 @@ export default function Header({
initialUnread = 0,
initialChatUnread = 0,
initialTheme = "light",
siteName = "姜十三",
allowRegister = true,
}: {
initialUser: User | null;
initialUnread?: number;
initialChatUnread?: number;
initialTheme?: "light" | "dark";
siteName?: string;
allowRegister?: boolean;
}) {
const router = useRouter();
const pathname = usePathname();
@@ -226,7 +230,7 @@ export default function Header({
</span>
<span className="leading-none">
<span className="block font-extrabold text-[17px] tracking-tight" style={{ color: "var(--ink)" }}>
姜十三
{siteName}
</span>
<span className="block text-[10.5px] mt-0.5" style={{ color: "var(--ink-3)" }}>
J13 社区
@@ -332,9 +336,11 @@ export default function Header({
<Link href="/login" className="btn btn-line btn-sm">
<LogIn size={14} /> 登录
</Link>
<Link href="/register" className="btn btn-primary btn-sm">
<UserPlus size={14} /> 注册
</Link>
{allowRegister && (
<Link href="/register" className="btn btn-primary btn-sm">
<UserPlus size={14} /> 注册
</Link>
)}
</div>
)}
<button
@@ -398,7 +404,7 @@ export default function Header({
</MobileLink>
)}
{!user && <MobileLink href="/login">登录</MobileLink>}
{!user && <MobileLink href="/register">注册</MobileLink>}
{!user && allowRegister && <MobileLink href="/register">注册</MobileLink>}
</div>
<div className="pt-3 mt-2 border-t flex items-center justify-between" style={{ borderColor: "var(--line)" }}>
<button onClick={toggleTheme} className="btn btn-line btn-sm">

View File

@@ -60,8 +60,12 @@ function serializeTags(tags: string[]): string {
function mapPostError(msg: string): string {
if (!msg) return "操作失败";
const cooldown = msg.match(/新用户注册\s*(\d+)\s*小时后才能发帖/);
if (cooldown) {
return `新用户注册满 ${cooldown[1]} 小时后才能发帖,请稍后再试`;
}
if (msg.includes("24 小时") || msg.includes("24小时") || msg.includes("冷静")) {
return "新用户注册满 24 小时后才能发帖,请稍后再试";
return "新用户尚在发帖冷静期内,请稍后再试";
}
if (msg.includes("积分")) return msg;
if (msg.includes("rate") || msg.includes("频繁") || msg.includes("太快")) {