feat:初始化业务目录

This commit is contained in:
2026-05-09 10:36:20 +08:00
parent 881506655d
commit 56951c0383
60 changed files with 6955 additions and 184 deletions

View File

@@ -0,0 +1,24 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { drawsModuleMeta } from "@/modules/draws/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: drawsModuleMeta.title,
};
export default function AdminDrawsPage() {
return (
<ModuleScaffold
title={drawsModuleMeta.title}
description={drawsModuleMeta.description}
>
<p className="text-sm text-zinc-500 dark:text-zinc-400">
{" "}
<code className="rounded bg-zinc-100 px-1 py-0.5 font-mono text-xs dark:bg-zinc-800">
src/modules/draws
</code>{" "}
</p>
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,9 @@
import { AdminShell } from "@/components/admin/admin-shell";
export default function AdminShellLayout({
children,
}: {
children: React.ReactNode;
}) {
return <AdminShell>{children}</AdminShell>;
}

View File

@@ -0,0 +1,54 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { getAdminPing } from "@/lib/admin-http";
import { dashboardModuleMeta } from "@/modules/dashboard/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "总览",
};
export default async function AdminDashboardPage() {
const ping = await getAdminPing();
const apiReady = process.env.NEXT_PUBLIC_LOTTERY_API_BASE_URL?.trim() !== "";
return (
<ModuleScaffold
title={dashboardModuleMeta.title}
description={dashboardModuleMeta.description}
>
<div className="grid gap-4 sm:grid-cols-2">
<div className="rounded-xl border border-black/10 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-zinc-900">
<h2 className="text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400">
API
</h2>
<p className="mt-2 text-sm text-foreground">
{apiReady ? (
<span className="font-medium text-emerald-600 dark:text-emerald-400">
NEXT_PUBLIC_LOTTERY_API_BASE_URL
</span>
) : (
<span className="font-medium text-amber-600 dark:text-amber-400">
Laravel
</span>
)}
</p>
<p className="mt-3 text-xs leading-relaxed text-zinc-500 dark:text-zinc-400">
Laravel {" "}
<code className="rounded bg-zinc-100 px-1 py-0.5 dark:bg-zinc-800">
/api/v1/admin/ping
</code>
</p>
</div>
<div className="rounded-xl border border-black/10 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-zinc-900">
<h2 className="text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400">
Admin Ping
</h2>
<p className="mt-2 font-mono text-sm text-foreground">
{!apiReady ? "—" : ping ? JSON.stringify(ping) : "请求失败或未返回信封"}
</p>
</div>
</div>
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,24 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { playersModuleMeta } from "@/modules/players/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: playersModuleMeta.title,
};
export default function AdminPlayersPage() {
return (
<ModuleScaffold
title={playersModuleMeta.title}
description={playersModuleMeta.description}
>
<p className="text-sm text-zinc-500 dark:text-zinc-400">
{" "}
<code className="rounded bg-zinc-100 px-1 py-0.5 font-mono text-xs dark:bg-zinc-800">
src/modules/players
</code>{" "}
</p>
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,24 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { riskModuleMeta } from "@/modules/risk/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: riskModuleMeta.title,
};
export default function AdminRiskPage() {
return (
<ModuleScaffold
title={riskModuleMeta.title}
description={riskModuleMeta.description}
>
<p className="text-sm text-zinc-500 dark:text-zinc-400">
{" "}
<code className="rounded bg-zinc-100 px-1 py-0.5 font-mono text-xs dark:bg-zinc-800">
src/modules/risk
</code>{" "}
</p>
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,24 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { settingsModuleMeta } from "@/modules/settings/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: settingsModuleMeta.title,
};
export default function AdminSettingsPage() {
return (
<ModuleScaffold
title={settingsModuleMeta.title}
description={settingsModuleMeta.description}
>
<p className="text-sm text-zinc-500 dark:text-zinc-400">
{" "}
<code className="rounded bg-zinc-100 px-1 py-0.5 font-mono text-xs dark:bg-zinc-800">
src/modules/settings
</code>{" "}
</p>
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,24 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { ticketsModuleMeta } from "@/modules/tickets/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: ticketsModuleMeta.title,
};
export default function AdminTicketsPage() {
return (
<ModuleScaffold
title={ticketsModuleMeta.title}
description={ticketsModuleMeta.description}
>
<p className="text-sm text-zinc-500 dark:text-zinc-400">
{" "}
<code className="rounded bg-zinc-100 px-1 py-0.5 font-mono text-xs dark:bg-zinc-800">
src/modules/tickets
</code>{" "}
</p>
</ModuleScaffold>
);
}

View File

@@ -0,0 +1,24 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { walletModuleMeta } from "@/modules/wallet/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: walletModuleMeta.title,
};
export default function AdminWalletPage() {
return (
<ModuleScaffold
title={walletModuleMeta.title}
description={walletModuleMeta.description}
>
<p className="text-sm text-zinc-500 dark:text-zinc-400">
{" "}
<code className="rounded bg-zinc-100 px-1 py-0.5 font-mono text-xs dark:bg-zinc-800">
src/modules/wallet
</code>{" "}
</p>
</ModuleScaffold>
);
}

9
src/app/admin/layout.tsx Normal file
View File

@@ -0,0 +1,9 @@
import type { ReactNode } from "react";
export default function AdminSegmentLayout({
children,
}: {
children: ReactNode;
}) {
return <div className="flex min-h-full flex-1 flex-col">{children}</div>;
}

View File

@@ -0,0 +1,32 @@
import Link from "next/link";
import { authModuleMeta } from "@/modules/auth/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: authModuleMeta.title,
};
export default function AdminLoginPage() {
return (
<div className="flex min-h-full flex-1 flex-col items-center justify-center px-4 py-16">
<div className="w-full max-w-md rounded-2xl border border-black/10 bg-white p-8 shadow-sm dark:border-white/10 dark:bg-zinc-900">
<h1 className="text-xl font-semibold text-foreground">
{authModuleMeta.title}
</h1>
<p className="mt-2 text-sm text-zinc-600 dark:text-zinc-400">
{authModuleMeta.description}
</p>
<p className="mt-6 text-sm text-zinc-500 dark:text-zinc-400">
</p>
<Link
href="/admin"
className="mt-8 inline-flex text-sm font-medium text-foreground underline-offset-4 hover:underline"
>
</Link>
</div>
</div>
);
}