diff --git a/next.config.ts b/next.config.ts index 66e1566..4564f99 100644 --- a/next.config.ts +++ b/next.config.ts @@ -3,6 +3,15 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { /* config options here */ reactCompiler: true, + async redirects() { + return [ + { + source: "/admin/service-desk", + destination: "/admin/menu-permissions", + permanent: true, + }, + ]; + }, }; export default nextConfig; diff --git a/src/app/admin/(shell)/menu-permissions/page.tsx b/src/app/admin/(shell)/menu-permissions/page.tsx new file mode 100644 index 0000000..bab5219 --- /dev/null +++ b/src/app/admin/(shell)/menu-permissions/page.tsx @@ -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 ( + +
+

{menuPermissionsModuleMeta.title}

+
+ +
+ ); +} diff --git a/src/app/admin/(shell)/service-desk/page.tsx b/src/app/admin/(shell)/service-desk/page.tsx deleted file mode 100644 index bdf65b5..0000000 --- a/src/app/admin/(shell)/service-desk/page.tsx +++ /dev/null @@ -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 ( - -
-

{serviceDeskModuleMeta.title}

-
- -
- ); -} diff --git a/src/components/admin/admin-sidebar.tsx b/src/components/admin/admin-sidebar.tsx index 56e36d5..2fd3327 100644 --- a/src/components/admin/admin-sidebar.tsx +++ b/src/components/admin/admin-sidebar.tsx @@ -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() { - - - - } - > - - 登录入口 - - - - ); diff --git a/src/modules/_config/admin-nav-icons.tsx b/src/modules/_config/admin-nav-icons.tsx index ad06537..2f56690 100644 --- a/src/modules/_config/admin-nav-icons.tsx +++ b/src/modules/_config/admin-nav-icons.tsx @@ -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 = { dashboard: LayoutDashboard, - service_desk: Headphones, + menu_permissions: ListTree, players: Users, draws: CalendarClock, config: SlidersHorizontal, diff --git a/src/modules/_config/admin-nav.ts b/src/modules/_config/admin-nav.ts index dd48b63..3a557f8 100644 --- a/src/modules/_config/admin-nav.ts +++ b/src/modules/_config/admin-nav.ts @@ -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", diff --git a/src/modules/menu-permissions/menu-permissions-console.tsx b/src/modules/menu-permissions/menu-permissions-console.tsx new file mode 100644 index 0000000..e0d5d03 --- /dev/null +++ b/src/modules/menu-permissions/menu-permissions-console.tsx @@ -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 ( +
+

+ 以下为侧栏各菜单与 Laravel 功能权限 slug(prd.* + )的对应关系。未配置「所需权限」的项对任意已登录管理员显示;已配置的项需拥有所列权限中的至少一项 + 才会出现在侧栏。 +

+ + + + 菜单 + 路径 + 所需权限(任一) + + + + {adminShellNavItems.map((item) => { + const req = item.requiredAny; + const permCell = + req === undefined || req.length === 0 ? ( + —(任意已登录) + ) : ( +
    + {req.map((slug) => ( +
  • {slug}
  • + ))} +
+ ); + return ( + + {item.label} + + + {item.href} + + + {permCell} + + ); + })} +
+
+
+ ); +} diff --git a/src/modules/menu-permissions/meta.ts b/src/modules/menu-permissions/meta.ts new file mode 100644 index 0000000..7e01926 --- /dev/null +++ b/src/modules/menu-permissions/meta.ts @@ -0,0 +1,5 @@ +export const menuPermissionsModuleMeta = { + segment: "menu_permissions", + title: "菜单权限", + description: "", +} as const; diff --git a/src/modules/service-desk/meta.ts b/src/modules/service-desk/meta.ts deleted file mode 100644 index c7d44a5..0000000 --- a/src/modules/service-desk/meta.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const serviceDeskModuleMeta = { - segment: "service-desk", - title: "服务台", - description: "", -} as const; diff --git a/src/modules/service-desk/service-desk-console.tsx b/src/modules/service-desk/service-desk-console.tsx deleted file mode 100644 index 2220332..0000000 --- a/src/modules/service-desk/service-desk-console.tsx +++ /dev/null @@ -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 ( -
- {items.map((it) => ( - - - {it.title} - - - - 打开 - - - - ))} -
- ); -}