From b8a7cab1afdbff7dfad4dbbd2fdbb55efe48022f Mon Sep 17 00:00:00 2001 From: JetSprow Date: Thu, 30 Apr 2026 22:29:25 +1000 Subject: [PATCH] polish: clarify record detail actions --- .../nodes/_components/node-card-list.tsx | 17 ++++--- .../_components/subscription-risk-table.tsx | 29 ++++++++---- .../subscription-access-risk-section.tsx | 11 ++++- .../_components/subscriptions-table.tsx | 34 ++++++++------ .../_components/admin-support-table.tsx | 8 +--- src/app/(admin)/admin/users/[id]/page.tsx | 44 ++++++++++++++++--- .../orders/_components/user-orders-table.tsx | 7 +-- .../_components/active-subscription-card.tsx | 13 ++---- .../_components/user-support-ticket-table.tsx | 4 +- 9 files changed, 108 insertions(+), 59 deletions(-) diff --git a/src/app/(admin)/admin/nodes/_components/node-card-list.tsx b/src/app/(admin)/admin/nodes/_components/node-card-list.tsx index 987584d..acd6251 100644 --- a/src/app/(admin)/admin/nodes/_components/node-card-list.tsx +++ b/src/app/(admin)/admin/nodes/_components/node-card-list.tsx @@ -1,9 +1,10 @@ -import { KeyRound, Server, UserRound, Waypoints } from "lucide-react"; +import { Eye, KeyRound, Server, UserRound, Waypoints } from "lucide-react"; import Link from "next/link"; import { batchTestNodeConnections } from "@/actions/admin/nodes"; import { BatchActionBar, BatchActionButton } from "@/components/admin/batch-action-bar"; import { EmptyState } from "@/components/shared/page-shell"; import { StatusBadge } from "@/components/shared/status-badge"; +import { buttonVariants } from "@/components/ui/button"; import { getNodeStatusLabel } from "@/lib/domain-labels"; import { NodeActions } from "../node-actions"; import { NodeForm } from "../node-form"; @@ -43,7 +44,6 @@ function InboundPreview({ node }: { node: NodeServerRow }) {

可售入站

- {node._count.inbounds} 个
{preview.map((inbound) => ( @@ -58,7 +58,7 @@ function InboundPreview({ node }: { node: NodeServerRow }) { ))} {hiddenCount > 0 && ( - +{hiddenCount} + 更多 )}
@@ -84,9 +84,7 @@ function NodeCard({ node, siteUrl }: { node: NodeServerRow; siteUrl: string | nu

- - {node.name} - + {node.name}

{getNodeStatusLabel(node.status)} @@ -99,6 +97,13 @@ function NodeCard({ node, siteUrl }: { node: NodeServerRow; siteUrl: string | nu
+ + + 详情 + - - {event.subscription.plan.name} - +

{event.subscription.plan.name}

到期:{formatDateShort(event.subscription.endDate)}

+ + + 订阅详情 +
); } @@ -133,11 +139,18 @@ function UserBlock({ event }: { event: SubscriptionRiskEventRow }) { return (
- - {event.user.email} - +

{event.user.email}

{event.user.name || "未设置昵称"}

- +
+ + + + 用户详情 + +
); } diff --git a/src/app/(admin)/admin/subscriptions/[id]/_components/subscription-access-risk-section.tsx b/src/app/(admin)/admin/subscriptions/[id]/_components/subscription-access-risk-section.tsx index 9c77903..35e112c 100644 --- a/src/app/(admin)/admin/subscriptions/[id]/_components/subscription-access-risk-section.tsx +++ b/src/app/(admin)/admin/subscriptions/[id]/_components/subscription-access-risk-section.tsx @@ -6,7 +6,7 @@ import type { SubscriptionType, UserStatus, } from "@prisma/client"; -import { AlertTriangle, ShieldCheck, UserRound } from "lucide-react"; +import { AlertTriangle, Eye, ShieldCheck, UserRound } from "lucide-react"; import { DataTableShell } from "@/components/admin/data-table-shell"; import { DataTable, @@ -137,8 +137,15 @@ export function SubscriptionAccessRiskSection({
- {owner.email} + {owner.email} + + + 用户详情 +

{owner.name || "未设置昵称"}

{owner.id}

diff --git a/src/app/(admin)/admin/subscriptions/_components/subscriptions-table.tsx b/src/app/(admin)/admin/subscriptions/_components/subscriptions-table.tsx index 87873d9..c61445e 100644 --- a/src/app/(admin)/admin/subscriptions/_components/subscriptions-table.tsx +++ b/src/app/(admin)/admin/subscriptions/_components/subscriptions-table.tsx @@ -1,4 +1,5 @@ import Link from "next/link"; +import { Eye } from "lucide-react"; import { batchSubscriptionOperation } from "@/actions/admin/subscriptions"; import { BatchActionBar, BatchActionButton } from "@/components/admin/batch-action-bar"; import { DataTableShell } from "@/components/admin/data-table-shell"; @@ -15,6 +16,7 @@ import { SubscriptionStatusBadge, SubscriptionTypeBadge, } from "@/components/shared/domain-badges"; +import { buttonVariants } from "@/components/ui/button"; import { formatBytes, formatDateShort } from "@/lib/utils"; import { AdminSubscriptionActions } from "../subscription-actions"; import type { StreamingServiceOption } from "../streaming-slot-dialog"; @@ -92,12 +94,7 @@ export function SubscriptionsTable({ className="mt-1 size-4 rounded border-border accent-primary" />
- - {subscription.plan.name} - +

{subscription.plan.name}

{subscription.user.email}

@@ -118,7 +115,14 @@ export function SubscriptionsTable({
-
+
+ + + 详情 + - - {subscription.plan.name} - +

{subscription.plan.name}

@@ -188,7 +187,14 @@ export function SubscriptionsTable({ -
+
+ + + 详情 + (
- - {ticket.subject} - +

{ticket.subject}

{ticket.user.email}

@@ -72,9 +70,7 @@ export function AdminSupportTable({ tickets }: AdminSupportTableProps) { {tickets.map((ticket) => ( - - {ticket.subject} - +

{ticket.subject}

{ticket.category && (

{ticket.category}

)} diff --git a/src/app/(admin)/admin/users/[id]/page.tsx b/src/app/(admin)/admin/users/[id]/page.tsx index c1a87b9..ab93090 100644 --- a/src/app/(admin)/admin/users/[id]/page.tsx +++ b/src/app/(admin)/admin/users/[id]/page.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import type { ReactNode } from "react"; import Link from "next/link"; import { notFound } from "next/navigation"; +import { Eye } from "lucide-react"; import { PageHeader, PageShell, SectionHeader } from "@/components/shared/page-shell"; import { DataTableShell } from "@/components/admin/data-table-shell"; import { @@ -22,6 +23,7 @@ import { orderKindLabels, } from "@/components/shared/domain-badges"; import { StatusBadge, type StatusTone } from "@/components/shared/status-badge"; +import { buttonVariants } from "@/components/ui/button"; import { SupportTicketPriorityBadge, SupportTicketStatusBadge, @@ -102,7 +104,15 @@ export default async function AdminUserDetailPage({ 查看该用户风控} + actions={ + + + 查看风控 + + } />
@@ -136,15 +146,14 @@ export default async function AdminUserDetailPage({ 流量 到期 创建时间 + 操作 {subscriptions.map((subscription) => ( - - {subscription.plan.name} - +

{subscription.plan.name}

@@ -153,6 +162,17 @@ export default async function AdminUserDetailPage({ {formatDateShort(subscription.endDate)} {formatDateShort(subscription.createdAt)} + +
+ + + 详情 + +
+
))}
@@ -235,19 +255,29 @@ export default async function AdminUserDetailPage({ 状态 优先级 更新 + 操作 {supportTickets.map((ticket) => ( - - {ticket.subject} - +

{ticket.subject}

{formatDateShort(ticket.updatedAt)} + +
+ + + 详情 + +
+
))}
diff --git a/src/app/(user)/orders/_components/user-orders-table.tsx b/src/app/(user)/orders/_components/user-orders-table.tsx index a476fe1..535ec2a 100644 --- a/src/app/(user)/orders/_components/user-orders-table.tsx +++ b/src/app/(user)/orders/_components/user-orders-table.tsx @@ -1,5 +1,5 @@ import Link from "next/link"; -import { ShoppingBag } from "lucide-react"; +import { CreditCard, ShoppingBag } from "lucide-react"; import { DataTableShell } from "@/components/shared/data-table-shell"; import { DataTable, @@ -66,12 +66,13 @@ export function UserOrdersTable({ orders }: UserOrdersTableProps) { {formatDateShort(order.createdAt)} -
+
{order.status === "PENDING" && ( + 去支付 )} diff --git a/src/app/(user)/subscriptions/_components/active-subscription-card.tsx b/src/app/(user)/subscriptions/_components/active-subscription-card.tsx index fcc9fde..11f397c 100644 --- a/src/app/(user)/subscriptions/_components/active-subscription-card.tsx +++ b/src/app/(user)/subscriptions/_components/active-subscription-card.tsx @@ -1,7 +1,6 @@ -import Link from "next/link"; import { format } from "date-fns"; import { zhCN } from "date-fns/locale"; -import { ArrowUpRight, CalendarClock, Database, Radio, Server, Tv } from "lucide-react"; +import { CalendarClock, Database, Radio, Server, Tv } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { StatusBadge } from "@/components/shared/status-badge"; @@ -104,14 +103,8 @@ export function ActiveSubscriptionCard({ sub, poolMap }: ActiveSubscriptionCardP {sub.plan.type === "PROXY" ? : }
- - - {sub.plan.name} - - + + {sub.plan.name}

diff --git a/src/app/(user)/support/_components/user-support-ticket-table.tsx b/src/app/(user)/support/_components/user-support-ticket-table.tsx index accc4a9..e03a3a9 100644 --- a/src/app/(user)/support/_components/user-support-ticket-table.tsx +++ b/src/app/(user)/support/_components/user-support-ticket-table.tsx @@ -50,9 +50,7 @@ export function UserSupportTicketTable({ tickets }: UserSupportTicketTableProps) {tickets.map((ticket) => ( - - {ticket.subject} - +

{ticket.subject}

{ticket.category && (

{ticket.category}

)}