feat: 移除服务台模块,更新管理员导航以重定向至菜单权限页面

This commit is contained in:
2026-05-13 09:52:36 +08:00
parent 5dd7aa1185
commit 188c6a04cf
10 changed files with 101 additions and 94 deletions

View File

@@ -0,0 +1,19 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { MenuPermissionsConsole } from "@/modules/menu-permissions/menu-permissions-console";
import { menuPermissionsModuleMeta } from "@/modules/menu-permissions/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: menuPermissionsModuleMeta.title,
};
export default function AdminMenuPermissionsPage() {
return (
<ModuleScaffold className="w-full max-w-none">
<div className="mb-8">
<h1 className="text-2xl font-semibold tracking-tight">{menuPermissionsModuleMeta.title}</h1>
</div>
<MenuPermissionsConsole />
</ModuleScaffold>
);
}

View File

@@ -1,19 +0,0 @@
import { ModuleScaffold } from "@/components/admin/module-scaffold";
import { ServiceDeskConsole } from "@/modules/service-desk/service-desk-console";
import { serviceDeskModuleMeta } from "@/modules/service-desk/meta";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: serviceDeskModuleMeta.title,
};
export default function AdminServiceDeskPage() {
return (
<ModuleScaffold className="w-full max-w-none">
<div className="mb-8">
<h1 className="text-2xl font-semibold tracking-tight">{serviceDeskModuleMeta.title}</h1>
</div>
<ServiceDeskConsole />
</ModuleScaffold>
);
}

View File

@@ -8,7 +8,6 @@ import { SparklesIcon } from "lucide-react";
import {
Sidebar,
SidebarContent,
SidebarFooter,
SidebarGroup,
SidebarGroupContent,
SidebarGroupLabel,
@@ -19,10 +18,7 @@ import {
SidebarRail,
SidebarSeparator,
} from "@/components/ui/sidebar";
import {
adminNavIconBySegment,
LogIn,
} from "@/modules/_config/admin-nav-icons";
import { adminNavIconBySegment } from "@/modules/_config/admin-nav-icons";
import { adminNavItemVisible } from "@/lib/admin-nav-visibility";
import { adminShellNavItems, ADMIN_BASE } from "@/modules/_config/admin-nav";
import { useAdminProfile } from "@/stores/admin-session";
@@ -94,19 +90,6 @@ export function AdminAppSidebar() {
</SidebarGroup>
</SidebarContent>
<SidebarSeparator />
<SidebarFooter className="border-t border-sidebar-border">
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton
tooltip="登录"
render={<Link href="/admin/login" />}
>
<LogIn data-icon="inline-start" aria-hidden />
<span></span>
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarFooter>
<SidebarRail />
</Sidebar>
);

View File

@@ -3,9 +3,9 @@ import {
CalendarClock,
CircleDollarSign,
FileSpreadsheet,
Headphones,
Landmark,
LayoutDashboard,
ListTree,
LogIn,
Scale,
ScrollText,
@@ -24,7 +24,7 @@ import type { AdminNavItem } from "@/modules/_config/admin-nav";
export const adminNavIconBySegment: Record<AdminNavItem["segment"], LucideIcon> =
{
dashboard: LayoutDashboard,
service_desk: Headphones,
menu_permissions: ListTree,
players: Users,
draws: CalendarClock,
config: SlidersHorizontal,

View File

@@ -10,7 +10,7 @@ export type AdminNavItem = {
href: string;
segment:
| "dashboard"
| "service_desk"
| "menu_permissions"
| "players"
| "draws"
| "config"
@@ -126,20 +126,9 @@ export const adminShellNavItems: AdminNavItem[] = [
],
},
{
segment: "service_desk",
label: "客服 / 财务",
href: "/admin/service-desk",
requiredAny: [
"prd.users.view_cs",
"prd.users.view_finance",
"prd.users.manage",
"prd.wallet_reconcile.view_cs",
"prd.wallet_reconcile.view",
"prd.wallet_reconcile.manage",
"prd.report.finance",
"prd.report.player",
"prd.draw_result.view",
],
segment: "menu_permissions",
label: "菜单权限",
href: "/admin/menu-permissions",
},
{
segment: "reports",

View File

@@ -0,0 +1,61 @@
import Link from "next/link";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import { adminShellNavItems } from "@/modules/_config/admin-nav";
export function MenuPermissionsConsole() {
return (
<div className="space-y-6">
<p className="text-muted-foreground text-sm leading-relaxed">
Laravel slug<code className="text-foreground">prd.*</code>
<strong className="text-foreground font-medium"></strong>
</p>
<Table>
<TableHeader>
<TableRow>
<TableHead className="w-[160px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{adminShellNavItems.map((item) => {
const req = item.requiredAny;
const permCell =
req === undefined || req.length === 0 ? (
<span className="text-muted-foreground"></span>
) : (
<ul className="font-mono text-xs leading-relaxed">
{req.map((slug) => (
<li key={slug}>{slug}</li>
))}
</ul>
);
return (
<TableRow key={item.segment}>
<TableCell className="font-medium">{item.label}</TableCell>
<TableCell>
<Link
href={item.href}
className="text-primary font-mono text-xs underline-offset-4 hover:underline"
>
{item.href}
</Link>
</TableCell>
<TableCell>{permCell}</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</div>
);
}

View File

@@ -0,0 +1,5 @@
export const menuPermissionsModuleMeta = {
segment: "menu_permissions",
title: "菜单权限",
description: "",
} as const;

View File

@@ -1,5 +0,0 @@
export const serviceDeskModuleMeta = {
segment: "service-desk",
title: "服务台",
description: "",
} as const;

View File

@@ -1,35 +0,0 @@
"use client";
import type { ReactElement } from "react";
import Link from "next/link";
import { buttonVariants } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { cn } from "@/lib/utils";
const items: { title: string; href: string }[] = [
{ title: "玩家注单", href: "/admin/tickets" },
{ title: "钱包流水", href: "/admin/wallet/transactions" },
{ title: "转账单", href: "/admin/wallet/transfer-orders" },
{ title: "期号列表", href: "/admin/draws" },
{ title: "报表导出", href: "/admin/reports" },
];
export function ServiceDeskConsole(): ReactElement {
return (
<div className="grid gap-6 md:grid-cols-2">
{items.map((it) => (
<Card key={it.href}>
<CardHeader>
<CardTitle className="text-base">{it.title}</CardTitle>
</CardHeader>
<CardContent>
<Link href={it.href} className={cn(buttonVariants({ size: "sm" }), "w-fit")}>
</Link>
</CardContent>
</Card>
))}
</div>
);
}