IP管理时间筛选精确到秒添加过期筛选和显示提取时间字段

This commit is contained in:
Eamon
2026-05-15 16:54:58 +08:00
parent 616901acdd
commit bca2f96bf3
8 changed files with 68 additions and 27 deletions

View File

@@ -13,6 +13,7 @@ export async function getPageChannel(params: {
node_ip?: string
expired_at_start?: Date
expired_at_end?: Date
expired?: boolean
}) {
return callByUser<PageRecord<Channel>>("/api/admin/channel/page", params)
}

View File

@@ -124,7 +124,7 @@ export default function BalancePage() {
className="w-40 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
@@ -138,7 +138,7 @@ export default function BalancePage() {
className="w-40 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}

View File

@@ -215,7 +215,7 @@ export default function BatchPage() {
className="w-40 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
@@ -230,7 +230,7 @@ export default function BatchPage() {
className="w-40 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}

View File

@@ -315,7 +315,7 @@ export default function BillingPage() {
className="w-40 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
@@ -330,7 +330,7 @@ export default function BillingPage() {
className="w-40 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}

View File

@@ -11,13 +11,15 @@ 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 {
Field,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field"
import { Field, FieldError, FieldLabel } from "@/components/ui/field"
import { Input } from "@/components/ui/input"
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
import type { Channel } from "@/models/channel"
type FilterValues = {
@@ -29,6 +31,7 @@ type FilterValues = {
node_ip?: string
expired_at_start?: Date
expired_at_end?: Date
expired?: boolean
}
const filterSchema = z
@@ -41,6 +44,7 @@ const filterSchema = z
node_ip: z.string().optional(),
expired_at_start: z.string().optional(),
expired_at_end: z.string().optional(),
expired: z.enum(["all", "expired", "not_expired"]).optional(),
})
.superRefine((data, ctx) => {
if (data.expired_at_start && data.expired_at_end) {
@@ -81,6 +85,7 @@ export default function ChannelPage() {
node_ip: "",
expired_at_start: "",
expired_at_end: "",
expired: "all",
},
})
@@ -100,6 +105,13 @@ export default function ChannelPage() {
result.expired_at_start = new Date(filters.expired_at_start)
if (filters.expired_at_end)
result.expired_at_end = new Date(filters.expired_at_end)
if (filters.expired) {
if (filters.expired === "expired") {
result.expired = true
} else if (filters.expired === "not_expired") {
result.expired = false
}
}
return getPageChannel({ page, size, ...result })
})
@@ -110,7 +122,7 @@ export default function ChannelPage() {
return (
<Page>
<form onSubmit={onFilter} className="bg-card p-4 rounded-lg">
<div className="flex flex-wrap items-end gap-4">
<div className="flex items-end flex-wrap gap-4">
<Controller
name="batch_no"
control={control}
@@ -201,10 +213,10 @@ export default function ChannelPage() {
render={({ field, fieldState }) => (
<Field
data-invalid={fieldState.invalid}
className="w-40 flex-none"
className="w-48 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="datetime-local" step="1" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
@@ -215,17 +227,37 @@ export default function ChannelPage() {
render={({ field, fieldState }) => (
<Field
data-invalid={fieldState.invalid}
className="w-40 flex-none"
className="w-48 flex-none"
>
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="datetime-local" step="1" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
/>
<Controller
name="expired"
control={control}
render={({ field, fieldState }) => (
<Field
data-invalid={fieldState.invalid}
className="w-32 flex-none"
>
<FieldLabel></FieldLabel>
<Select value={field.value} onValueChange={field.onChange}>
<SelectTrigger>
<SelectValue placeholder="请选择" />
</SelectTrigger>
<SelectContent>
<SelectItem value="all"></SelectItem>
<SelectItem value="not_expired"></SelectItem>
<SelectItem value="expired"></SelectItem>
</SelectContent>
</Select>
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
/>
</div>
<FieldGroup className="flex-row justify-start mt-4 gap-2">
<Button type="submit"></Button>
<Button
type="button"
@@ -247,7 +279,7 @@ export default function ChannelPage() {
>
</Button>
</FieldGroup>
</div>
</form>
<Suspense>
@@ -296,7 +328,6 @@ export default function ChannelPage() {
header: "节点",
accessorFn: row => row.ip || row.edge_ref || row.edge_id,
},
{
header: "自动配置",
cell: ({ row }) => {
@@ -361,6 +392,15 @@ export default function ChannelPage() {
)
},
},
{
header: "提取时间",
accessorKey: "created_at",
cell: ({ row }) =>
format(
new Date(row.original.created_at),
"yyyy-MM-dd HH:mm:ss",
),
},
{
header: "过期时间",
accessorKey: "expired_at",

View File

@@ -206,7 +206,7 @@ export default function CustPage() {
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid} className="w-40 flex">
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
@@ -218,7 +218,7 @@ export default function CustPage() {
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid} className="w-40 flex">
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
@@ -262,7 +262,6 @@ export default function CustPage() {
"yyyy-MM-dd HH:mm:ss",
),
},
// { header: "邮箱", accessorKey: "email" },
{
header: "客户来源",
accessorKey: "source",

View File

@@ -208,7 +208,7 @@ export default function TradePage() {
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid} className="w-40 flex">
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}
@@ -220,7 +220,7 @@ export default function TradePage() {
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid} className="w-40 flex">
<FieldLabel></FieldLabel>
<Input type="date" {...field} clearable />
<Input type="date" {...field} />
<FieldError>{fieldState.error?.message}</FieldError>
</Field>
)}

View File

@@ -20,4 +20,5 @@ export type Channel = {
ip: string
user?: User
resource?: Resource
time?: Date
}