feat: 接入玩家入口与API代理
- 新增 /api 重写代理,支持 LOTTERY_API_PROXY_TARGET 配置 - 玩家首页切换为 EntryGate,并移除 layout 对 PlayerAppShell 的包裹 - 请求层拆分语言头与玩家鉴权注入逻辑,引入 zustand 依赖 - 允许提交 .env.example 供本地配置参考
This commit is contained in:
24
src/app/(player)/(main)/hall/page.tsx
Normal file
24
src/app/(player)/(main)/hall/page.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardDescription,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
} from "@/components/ui/card";
|
||||
|
||||
/** 下注大厅占位(§4.2 再接表格与期号) */
|
||||
export default function LotteryHallPlaceholderPage() {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>下注大厅</CardTitle>
|
||||
<CardDescription>
|
||||
路由已打通;玩法表格、期号与余额将在此页迭代。
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent className="text-sm text-muted-foreground">
|
||||
从入口页授权成功后可刷新本页;鉴权头会从会话存储恢复。
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
15
src/app/(player)/(main)/layout.tsx
Normal file
15
src/app/(player)/(main)/layout.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
import { PlayerAppShell } from "@/components/layout/player-app-shell";
|
||||
import { HydratePlayerAuth } from "@/features/player/hydrate-player-auth";
|
||||
|
||||
export default function PlayerMainLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
return (
|
||||
<>
|
||||
<HydratePlayerAuth />
|
||||
<PlayerAppShell>{children}</PlayerAppShell>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,9 +1,7 @@
|
||||
import { PlayerAppShell } from "@/components/layout/player-app-shell";
|
||||
|
||||
export default function PlayerLayout({
|
||||
export default function PlayerRootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
return <PlayerAppShell>{children}</PlayerAppShell>;
|
||||
return children;
|
||||
}
|
||||
|
||||
@@ -1,23 +1,20 @@
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardDescription,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
} from "@/components/ui/card";
|
||||
import type { ReactNode } from "react";
|
||||
import { Suspense } from "react";
|
||||
|
||||
export default function PlayerHomePage() {
|
||||
import { EntryGate } from "@/features/player/entry-gate";
|
||||
|
||||
function EntryFallback(): ReactNode {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>玩家端</CardTitle>
|
||||
<CardDescription>
|
||||
基础 layout 已就绪;后续在此挂钱包、大厅等路由。
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent className="text-sm text-muted-foreground">
|
||||
顶栏与主区域宽度由 PlayerAppShell 统一控制。
|
||||
</CardContent>
|
||||
</Card>
|
||||
<div className="flex min-h-dvh flex-col items-center justify-center bg-gradient-to-b from-red-800 to-red-950 px-4 text-sm text-white/90">
|
||||
<p>加载入口页…</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default function EntryPage() {
|
||||
return (
|
||||
<Suspense fallback={<EntryFallback />}>
|
||||
<EntryGate />
|
||||
</Suspense>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user