feat: 添加配置模块和更新管理员导航,优化钱包控制台加载逻辑
This commit is contained in:
14
src/app/admin/(shell)/config/layout.tsx
Normal file
14
src/app/admin/(shell)/config/layout.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
16
src/app/admin/(shell)/config/odds/page.tsx
Normal file
16
src/app/admin/(shell)/config/odds/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
66
src/app/admin/(shell)/config/page.tsx
Normal file
66
src/app/admin/(shell)/config/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
5
src/app/admin/(shell)/config/play-limits/page.tsx
Normal file
5
src/app/admin/(shell)/config/play-limits/page.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default function AdminConfigPlayLimitsRedirectPage() {
|
||||
redirect("/admin/config/plays");
|
||||
}
|
||||
5
src/app/admin/(shell)/config/play-switches/page.tsx
Normal file
5
src/app/admin/(shell)/config/play-switches/page.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default function AdminConfigPlaySwitchesRedirectPage() {
|
||||
redirect("/admin/config/plays");
|
||||
}
|
||||
16
src/app/admin/(shell)/config/plays/page.tsx
Normal file
16
src/app/admin/(shell)/config/plays/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
5
src/app/admin/(shell)/config/rebate-commission/page.tsx
Normal file
5
src/app/admin/(shell)/config/rebate-commission/page.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export default function AdminConfigRebateCommissionRedirectPage() {
|
||||
redirect("/admin/config/rebate");
|
||||
}
|
||||
16
src/app/admin/(shell)/config/rebate/page.tsx
Normal file
16
src/app/admin/(shell)/config/rebate/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
16
src/app/admin/(shell)/config/risk-cap/page.tsx
Normal file
16
src/app/admin/(shell)/config/risk-cap/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
16
src/app/admin/(shell)/config/versions/page.tsx
Normal file
16
src/app/admin/(shell)/config/versions/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user