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

@@ -4,7 +4,7 @@ import { useState, useEffect } from "react";
import { useRouter } from "next/navigation";
import Link from "next/link";
import { UserPlus } from "lucide-react";
import { apiRegister, apiMe } from "@/lib/api";
import { apiRegister, apiMe, apiGetSettings } from "@/lib/api";
import { hasAuthCookieHint } from "@/lib/cookies";
export default function RegisterPage() {
@@ -14,6 +14,7 @@ export default function RegisterPage() {
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const [loading, setLoading] = useState(false);
const [registerClosed, setRegisterClosed] = useState(false);
// 已登录用户不必再注册,直接回首页
useEffect(() => {
@@ -25,6 +26,14 @@ export default function RegisterPage() {
.catch(() => {});
}, [router]);
useEffect(() => {
apiGetSettings()
.then((s) => {
if (!s.allow_register) setRegisterClosed(true);
})
.catch(() => {});
}, []);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError("");
@@ -39,13 +48,31 @@ export default function RegisterPage() {
// 极端情况:注册成功但自动签发失败,引导去登录
router.push("/login");
} else {
setError(res.error || "注册失败");
const msg = res.error || "注册失败";
if (msg.includes("关闭注册")) setRegisterClosed(true);
setError(msg);
}
} finally {
setLoading(false);
}
};
if (registerClosed) {
return (
<div className="max-w-md mx-auto pt-8 sm:pt-14">
<div className="panel p-8 text-center">
<h1 className="text-lg font-extrabold" style={{ color: "var(--ink)" }}>
暂不开放注册
</h1>
<p className="meta mt-2 text-[13px]">站点当前已关闭新用户注册,已有账号可直接登录。</p>
<Link href="/login" className="btn btn-primary mt-6">
去登录
</Link>
</div>
</div>
);
}
return (
<div className="max-w-md mx-auto pt-8 sm:pt-14">
<div className="mb-7 text-center">
@@ -59,7 +86,7 @@ export default function RegisterPage() {
创建账号
</h1>
<p className="text-sm mt-2" style={{ color: "var(--ink-2)" }}>
加入姜十三,开始你的第一帖
加入社区,开始你的第一帖
</p>
</div>