feat(config): 重构配置模块导航与版本切换,新增版本删除能力

This commit is contained in:
2026-05-15 15:30:52 +08:00
parent 000295ae2b
commit 8bd7cc3d73
20 changed files with 669 additions and 377 deletions

View File

@@ -1,14 +1,7 @@
import { ConfigSubNav } from "@/modules/config/config-subnav";
import type { ReactNode } from "react";
export default function AdminConfigLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<div className="w-full max-w-none px-1">
<ConfigSubNav />
{children}
</div>
);
import { ConfigWorkspaceShell } from "@/modules/config/config-workspace-shell";
export default function AdminConfigLayout({ children }: { children: ReactNode }) {
return <ConfigWorkspaceShell>{children}</ConfigWorkspaceShell>;
}

View File

@@ -1,4 +1,3 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { OddsConfigDocScreen } from "@/modules/config/doc/odds-config-doc-screen";
import { configOddsMeta } from "@/modules/config/meta";
import type { Metadata } from "next";
@@ -8,9 +7,5 @@ export const metadata: Metadata = {
};
export default function AdminConfigOddsPage() {
return (
<ModuleScaffold className="max-w-6xl">
<OddsConfigDocScreen />
</ModuleScaffold>
);
return <OddsConfigDocScreen />;
}

View File

@@ -1,7 +1,9 @@
import Link from "next/link";
import { Layers, Shield, Wrench } from "lucide-react";
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { Card, CardHeader, CardTitle } from "@/components/ui/card";
import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { CONFIG_NAV_GROUPS } from "@/modules/config/config-nav-model";
import { configHubMeta } from "@/modules/config/meta";
import type { Metadata } from "next";
@@ -9,33 +11,53 @@ export const metadata: Metadata = {
title: configHubMeta.title,
};
const SECTIONS = [
{ href: "/admin/config/plays", title: "玩法配置" },
{ href: "/admin/config/odds", title: "赔率配置" },
{ href: "/admin/config/rebate", title: "佣金 / 回水" },
{ href: "/admin/config/risk-cap", title: "风控封顶" },
{ href: "/admin/config/versions", title: "配置版本历史" },
{ href: "/admin/config/wallet", title: "钱包配置" },
] as const;
const GROUP_ICONS = {
betting: Layers,
risk_wallet: Shield,
ops: Wrench,
} as const;
export default function AdminConfigHubPage() {
return (
<ModuleScaffold className="max-w-4xl">
<h1 className="mb-6 text-xl font-semibold tracking-tight">{configHubMeta.title}</h1>
<div className="grid gap-4 sm:grid-cols-2">
{SECTIONS.map((s) => (
<Link
key={s.href}
href={s.href}
className="block rounded-lg outline-none ring-offset-background focus-visible:ring-2 focus-visible:ring-ring"
>
<Card className="h-full transition-colors hover:bg-muted/40">
<CardHeader>
<CardTitle className="text-base">{s.title}</CardTitle>
</CardHeader>
</Card>
</Link>
))}
<header className="mb-8 space-y-2">
<h1 className="text-2xl font-semibold tracking-tight">{configHubMeta.title}</h1>
<p className="max-w-2xl text-sm leading-relaxed text-muted-foreground">
稿 {" "}
<span className="font-medium text-foreground">active</span>
</p>
</header>
<div className="space-y-10">
{CONFIG_NAV_GROUPS.map((group) => {
const Icon = GROUP_ICONS[group.id as keyof typeof GROUP_ICONS] ?? Layers;
return (
<section key={group.id} className="space-y-4">
<div className="flex items-center gap-2 border-b border-border pb-2">
<Icon className="size-4 text-muted-foreground" aria-hidden />
<h2 className="text-sm font-semibold tracking-wide text-muted-foreground uppercase">
{group.label}
</h2>
</div>
<div className="grid gap-4 sm:grid-cols-2">
{group.items.map((item) => (
<Link
key={item.href}
href={item.href}
className="block rounded-xl outline-none ring-offset-background focus-visible:ring-2 focus-visible:ring-ring"
>
<Card className="h-full transition-colors hover:border-primary/30 hover:bg-muted/30">
<CardHeader className="space-y-2">
<CardTitle className="text-base">{item.title}</CardTitle>
<CardDescription className="text-sm leading-snug">{item.description}</CardDescription>
</CardHeader>
</Card>
</Link>
))}
</div>
</section>
);
})}
</div>
</ModuleScaffold>
);

View File

@@ -1,4 +1,3 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { PlayConfigDocScreen } from "@/modules/config/doc/play-config-doc-screen";
import { configPlayConfigMeta } from "@/modules/config/meta";
import type { Metadata } from "next";
@@ -8,9 +7,5 @@ export const metadata: Metadata = {
};
export default function AdminConfigPlaysPage() {
return (
<ModuleScaffold className="max-w-6xl">
<PlayConfigDocScreen />
</ModuleScaffold>
);
return <PlayConfigDocScreen />;
}

View File

@@ -1,4 +1,3 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { RebateConfigDocScreen } from "@/modules/config/doc/rebate-config-doc-screen";
import { configRebateMeta } from "@/modules/config/meta";
import type { Metadata } from "next";
@@ -8,9 +7,5 @@ export const metadata: Metadata = {
};
export default function AdminConfigRebateDedicatedPage() {
return (
<ModuleScaffold className="max-w-5xl">
<RebateConfigDocScreen />
</ModuleScaffold>
);
return <RebateConfigDocScreen />;
}

View File

@@ -1,4 +1,3 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { configRiskCapMeta } from "@/modules/config/meta";
import { RiskCapDocScreen } from "@/modules/config/doc/risk-cap-doc-screen";
import type { Metadata } from "next";
@@ -8,9 +7,5 @@ export const metadata: Metadata = {
};
export default function AdminConfigRiskCapPage() {
return (
<ModuleScaffold className="max-w-5xl">
<RiskCapDocScreen />
</ModuleScaffold>
);
return <RiskCapDocScreen />;
}

View File

@@ -1,16 +0,0 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { ConfigVersionsConsole } from "@/modules/config/config-versions-console";
import { configVersionsMeta } from "@/modules/config/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: configVersionsMeta.title,
};
export default function AdminConfigVersionsPage() {
return (
<ModuleScaffold className="max-w-5xl">
<ConfigVersionsConsole />
</ModuleScaffold>
);
}

View File

@@ -1,4 +1,3 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { configWalletMeta } from "@/modules/config/meta";
import { WalletConfigDocScreen } from "@/modules/config/doc/wallet-config-doc-screen";
import type { Metadata } from "next";
@@ -8,9 +7,5 @@ export const metadata: Metadata = {
};
export default function AdminConfigWalletPage() {
return (
<ModuleScaffold className="max-w-3xl">
<WalletConfigDocScreen />
</ModuleScaffold>
);
return <WalletConfigDocScreen />;
}