feat: 添加配置模块和更新管理员导航,优化钱包控制台加载逻辑

This commit is contained in:
2026-05-11 10:08:56 +08:00
parent ac3f28459b
commit 78045de9a3
25 changed files with 2705 additions and 2 deletions

View File

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

View File

@@ -0,0 +1,16 @@
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";
export const metadata: Metadata = {
title: configOddsMeta.title,
};
export default function AdminConfigOddsPage() {
return (
<ModuleScaffold className="max-w-6xl">
<OddsConfigDocScreen />
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,66 @@
import Link from "next/link";
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import {
Card,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { configHubMeta } from "@/modules/config/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: configHubMeta.title,
};
const SECTIONS = [
{
href: "/admin/config/plays",
title: "玩法配置",
description: "§5.4:目录开关、显示名与排序、限额、规则说明(玩法配置版本)。",
},
{
href: "/admin/config/odds",
title: "赔率配置",
description: "§5.5:按维度 / 玩法编辑五档赔率、回水率、历史版本与回滚。",
},
{
href: "/admin/config/rebate",
title: "佣金 / 回水",
description: "§5.6:按 2D / 3D / 4D 批量写入 rebate_rate共用赔率版本。",
},
{
href: "/admin/config/risk-cap",
title: "风控封顶",
description: "§5.7:默认封顶、特殊号码封顶;占用列为占位,待注单汇总接入。",
},
{
href: "/admin/config/versions",
title: "配置版本历史",
description: "三套流水线的版本列表(玩法配置 / 赔率 / 风控封顶)。",
},
] as const;
export default function AdminConfigHubPage() {
return (
<ModuleScaffold className="max-w-4xl">
<div className="mb-6 space-y-1">
<h1 className="text-xl font-semibold tracking-tight">{configHubMeta.title}</h1>
<p className="text-sm text-muted-foreground">{configHubMeta.description}</p>
</div>
<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>
<CardDescription>{s.description}</CardDescription>
</CardHeader>
</Card>
</Link>
))}
</div>
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,5 @@
import { redirect } from "next/navigation";
export default function AdminConfigPlayLimitsRedirectPage() {
redirect("/admin/config/plays");
}

View File

@@ -0,0 +1,5 @@
import { redirect } from "next/navigation";
export default function AdminConfigPlaySwitchesRedirectPage() {
redirect("/admin/config/plays");
}

View File

@@ -0,0 +1,16 @@
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";
export const metadata: Metadata = {
title: configPlayConfigMeta.title,
};
export default function AdminConfigPlaysPage() {
return (
<ModuleScaffold className="max-w-6xl">
<PlayConfigDocScreen />
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,5 @@
import { redirect } from "next/navigation";
export default function AdminConfigRebateCommissionRedirectPage() {
redirect("/admin/config/rebate");
}

View File

@@ -0,0 +1,16 @@
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";
export const metadata: Metadata = {
title: configRebateMeta.title,
};
export default function AdminConfigRebateDedicatedPage() {
return (
<ModuleScaffold className="max-w-5xl">
<RebateConfigDocScreen />
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,16 @@
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";
export const metadata: Metadata = {
title: configRiskCapMeta.title,
};
export default function AdminConfigRiskCapPage() {
return (
<ModuleScaffold className="max-w-5xl">
<RiskCapDocScreen />
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,16 @@
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>
);
}