feat:初始化业务目录
This commit is contained in:
24
src/app/admin/(shell)/draws/page.tsx
Normal file
24
src/app/admin/(shell)/draws/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
9
src/app/admin/(shell)/layout.tsx
Normal file
9
src/app/admin/(shell)/layout.tsx
Normal file
@@ -0,0 +1,9 @@
|
||||
import { AdminShell } from "@/components/admin/admin-shell";
|
||||
|
||||
export default function AdminShellLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return <AdminShell>{children}</AdminShell>;
|
||||
}
|
||||
54
src/app/admin/(shell)/page.tsx
Normal file
54
src/app/admin/(shell)/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
24
src/app/admin/(shell)/players/page.tsx
Normal file
24
src/app/admin/(shell)/players/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
24
src/app/admin/(shell)/risk/page.tsx
Normal file
24
src/app/admin/(shell)/risk/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
24
src/app/admin/(shell)/settings/page.tsx
Normal file
24
src/app/admin/(shell)/settings/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
24
src/app/admin/(shell)/tickets/page.tsx
Normal file
24
src/app/admin/(shell)/tickets/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
24
src/app/admin/(shell)/wallet/page.tsx
Normal file
24
src/app/admin/(shell)/wallet/page.tsx
Normal 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
9
src/app/admin/layout.tsx
Normal 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>;
|
||||
}
|
||||
32
src/app/admin/login/page.tsx
Normal file
32
src/app/admin/login/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user