修改长效套餐号跳转问题

This commit is contained in:
Eamon
2026-05-20 15:42:51 +08:00
parent fc25858e72
commit 05c927111b
9 changed files with 142 additions and 35 deletions

View File

@@ -275,9 +275,10 @@ export default function BatchPage() {
accessorKey: "resource.resource_no",
cell: ({ row }) => {
const resourceNo = row.original.resource?.resource_no
const type = row.original.resource?.type
return (
<Link
href={`/resources?resource_no=${resourceNo}`}
href={`/resources?resource_no=${resourceNo}&type=${type}`}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600"

View File

@@ -175,6 +175,7 @@ export default function BillingPage() {
}
const table = useDataTable<Billing>(loadData)
console.log(table, "table")
const onFilter = handleSubmit(() => {
table.pagination.onPageChange(1)
@@ -353,24 +354,24 @@ export default function BillingPage() {
header: "创建时间",
accessorKey: "created_at",
cell: ({ row }) => {
const createdAt = row.original.created_at;
if (!createdAt) return <span>-</span>;
const date = new Date(createdAt);
if (isNaN(date.getTime())) return <span>-</span>;
return format(date, "yyyy-MM-dd HH:mm:ss");
const createdAt = row.original.created_at
if (!createdAt) return <span>-</span>
const date = new Date(createdAt)
if (isNaN(date.getTime())) return <span>-</span>
return format(date, "yyyy-MM-dd HH:mm:ss")
},
},
{
header: "套餐号",
accessorKey: "resource.resource_no",
cell: ({ row }) => {
const resource_no = row.original.resource?.resource_no
const type = row.original.resource?.type
return resource_no ? (
<Link
href={`/resources?resource_no=${resource_no}`}
href={`/resources?resource_no=${resource_no}&type=${type}`}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600"

View File

@@ -295,9 +295,10 @@ export default function ChannelPage() {
accessorKey: "resource.resource_no",
cell: ({ row }) => {
const resource_no = row.original.resource?.resource_no
const type = row.original.resource?.type
return (
<Link
href={`./resources?resource_no=${resource_no}`}
href={`./resources?resource_no=${resource_no}&type=${type}`}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600"
@@ -392,30 +393,30 @@ export default function ChannelPage() {
)
},
},
{
{
header: "提取时间",
accessorKey: "created_at",
cell: ({ row }) => {
const createdAt = row.original.created_at;
if (!createdAt) return <span>-</span>;
const date = new Date(createdAt);
if (isNaN(date.getTime())) return <span>-</span>;
return format(date, "yyyy-MM-dd HH:mm:ss");
const createdAt = row.original.created_at
if (!createdAt) return <span>-</span>
const date = new Date(createdAt)
if (isNaN(date.getTime())) return <span>-</span>
return format(date, "yyyy-MM-dd HH:mm:ss")
},
},
{
header: "过期时间",
accessorKey: "expired_at",
cell: ({ row }) => {
const expiredAt = row.original.expired_at;
if (!expiredAt) return <span>-</span>;
const date = new Date(expiredAt);
if (isNaN(date.getTime())) return <span>-</span>;
return format(date, "yyyy-MM-dd HH:mm:ss");
const expiredAt = row.original.expired_at
if (!expiredAt) return <span>-</span>
const date = new Date(expiredAt)
if (isNaN(date.getTime())) return <span>-</span>
return format(date, "yyyy-MM-dd HH:mm:ss")
},
},
]}

View File

@@ -1,6 +1,7 @@
"use client"
import { zodResolver } from "@hookform/resolvers/zod"
import { format } from "date-fns"
import Link from "next/link"
import { useRouter, useSearchParams } from "next/navigation"
import { Suspense, useState } from "react"
import { Controller, useForm } from "react-hook-form"
@@ -250,7 +251,24 @@ export default function BatchPage() {
header: "会员号",
accessorFn: row => row.user?.phone || "",
},
{ header: "套餐号", accessorKey: "resource.resource_no" },
{
header: "套餐号",
accessorKey: "resource.resource_no",
cell: ({ row }) => {
const resourceNo = row.original.resource?.resource_no
const type = row.original.resource?.type
return (
<Link
href={`/resources?resource_no=${resourceNo}&type=${type}`}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600"
>
{resourceNo}
</Link>
)
},
},
{ header: "批次号", accessorKey: "batch_no" },
{ header: "省份", accessorKey: "prov" },
{ header: "城市", accessorKey: "city" },

View File

@@ -2,6 +2,7 @@
import { zodResolver } from "@hookform/resolvers/zod"
import { format } from "date-fns"
import { CreditCard, Wallet } from "lucide-react"
import Link from "next/link"
import { useRouter, useSearchParams } from "next/navigation"
import { Suspense, useEffect, useState } from "react"
import { Controller, useForm } from "react-hook-form"
@@ -340,13 +341,31 @@ export default function BillingPage() {
"yyyy-MM-dd HH:mm:ss",
),
},
{ header: "套餐号", accessorKey: "resource.resource_no" },
{
header: "套餐号",
accessorKey: "resource.resource_no",
cell: ({ row }) => {
const resource_no = row.original.resource?.resource_no
const type = row.original.resource?.type
return resource_no ? (
<Link
href={`/resources?resource_no=${resource_no}&type=${type}`}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600"
>
{resource_no}
</Link>
) : (
<span></span>
)
},
},
{
header: "账单详情",
accessorKey: "info",
cell: ({ row }) => {
const bill = row.original
return (
<div className="flex items-center gap-2">
<div className="shrink-0">

View File

@@ -1,6 +1,7 @@
"use client"
import { zodResolver } from "@hookform/resolvers/zod"
import { format } from "date-fns"
import Link from "next/link"
import { useRouter, useSearchParams } from "next/navigation"
import { Suspense, useState } from "react"
import { Controller, useForm } from "react-hook-form"
@@ -244,7 +245,24 @@ export default function ChannelPage() {
header: "会员号",
accessorFn: row => row.user?.phone || "",
},
{ header: "套餐号", accessorKey: "resource.resource_no" },
{
header: "套餐号",
accessorKey: "resource.resource_no",
cell: ({ row }) => {
const resource_no = row.original.resource?.resource_no
const type = row.original.resource?.type
return (
<Link
href={`./resources?resource_no=${resource_no}&type=${type}`}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600"
>
{resource_no}
</Link>
)
},
},
{ header: "批次号", accessorKey: "batch_no" },
{
header: "节点",

View File

@@ -16,6 +16,12 @@ import { DataTable, useDataTable } from "@/components/data-table"
import { Page } from "@/components/page"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import {
Field,
FieldError,
@@ -224,6 +230,7 @@ function ResourceList({ resourceType }: ResourceListProps) {
const isLong = resourceType === "long"
const listFn = isLong ? ResourceLong : ResourceShort
const [updatingId, setUpdatingId] = useState<number | null>(null)
const router = useRouter()
const { control, handleSubmit, reset } = useForm<FormValues>({
resolver: zodResolver(filterSchema),
defaultValues: {
@@ -313,7 +320,34 @@ function ResourceList({ resourceType }: ResourceListProps) {
<div className="flex flex-col gap-1">
<div>{name}</div>
<div className="flex items-center gap-2">
<span className="text-xs text-gray-500">{resourceNo}</span>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<span className="text-xs text-gray-500">{resourceNo}</span>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="w-40">
<DropdownMenuItem
onClick={() => {
router.push(`/billing?resource_no=${resourceNo}`)
}}
>
</DropdownMenuItem>
<DropdownMenuItem
onClick={() => {
router.push(`/batch?resource_no=${resourceNo}`)
}}
>
</DropdownMenuItem>
<DropdownMenuItem
onClick={() => {
router.push(`/channel?resource_no=${resourceNo}`)
}}
>
IP管理
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
<ExpireBadge expireAt={expireAt} />
</div>
</div>
@@ -435,7 +469,7 @@ function ResourceList({ resourceType }: ResourceListProps) {
},
},
],
[isLong, updatingId, handleStatusChange],
[isLong, updatingId, handleStatusChange, router],
)
return (

View File

@@ -99,7 +99,6 @@ export default function CustPage() {
(page: number, size: number) => {
const result: FilterValues = {}
const filters = getValues()
console.log(filters, "filters")
if (filters.account?.trim()) result.account = filters.account.trim()
if (filters.name?.trim()) result.name = filters.name.trim()

View File

@@ -176,9 +176,24 @@ function getTodayUsage(lastAt: Date | null | undefined, daily: number) {
}
export default function ResourcesPage() {
const searchParams = useSearchParams()
const typeParam = searchParams.get("type")
const defaultTab = useMemo(() => {
if (typeParam === "1") return "short"
if (typeParam === "2") return "long"
return "short"
}, [typeParam])
const [activeTab, setActiveTab] = useState(defaultTab)
return (
<Page>
<Tabs defaultValue="short" className="overflow-hidden">
<Tabs
value={activeTab}
onValueChange={setActiveTab}
className="overflow-hidden"
>
<TabsList className="bg-card">
<TabsTrigger value="short" className="h-10 px-4 shadow-none">
@@ -253,6 +268,7 @@ function ResourceList({ resourceType }: ResourceListProps) {
)
const table = useDataTable<Resources>(fetchResources)
console.log(table, "table")
const handleStatusChange = useCallback(
async (resource: Resources, newStatusValue: string) => {
@@ -369,7 +385,7 @@ function ResourceList({ resourceType }: ResourceListProps) {
const detail = getResourceDetail(row.original)
const live = detail?.live
if (live === undefined) return "-"
return <span>{isLong ? `${live}小时` : `${live}分钟`}</span>
return <span>{isLong ? `${live}分钟` : `${live}分钟`}</span>
},
},
{