feat(config): 重构配置模块导航与版本切换,新增版本删除能力
This commit is contained in:
@@ -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>;
|
||||
}
|
||||
|
||||
@@ -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 />;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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 />;
|
||||
}
|
||||
|
||||
@@ -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 />;
|
||||
}
|
||||
|
||||
@@ -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 />;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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 />;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user