feat(admin): 完善站点设置、内容回收站与后台菜单分组
新增站点设置与内容管理(含已删除恢复/清除),用户页改用独有运营指标,并按概览/内容/成员与经济/站点重组侧栏。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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("太快")) {
|
||||
|
||||
Reference in New Issue
Block a user