IP管理时间筛选精确到秒添加过期筛选和显示提取时间字段
This commit is contained in:
@@ -13,6 +13,7 @@ export async function getPageChannel(params: {
|
|||||||
node_ip?: string
|
node_ip?: string
|
||||||
expired_at_start?: Date
|
expired_at_start?: Date
|
||||||
expired_at_end?: Date
|
expired_at_end?: Date
|
||||||
|
expired?: boolean
|
||||||
}) {
|
}) {
|
||||||
return callByUser<PageRecord<Channel>>("/api/admin/channel/page", params)
|
return callByUser<PageRecord<Channel>>("/api/admin/channel/page", params)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ export default function BalancePage() {
|
|||||||
className="w-40 flex-none"
|
className="w-40 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>开始时间</FieldLabel>
|
<FieldLabel>开始时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
@@ -138,7 +138,7 @@ export default function BalancePage() {
|
|||||||
className="w-40 flex-none"
|
className="w-40 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>结束时间</FieldLabel>
|
<FieldLabel>结束时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ export default function BatchPage() {
|
|||||||
className="w-40 flex-none"
|
className="w-40 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>开始时间</FieldLabel>
|
<FieldLabel>开始时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
@@ -230,7 +230,7 @@ export default function BatchPage() {
|
|||||||
className="w-40 flex-none"
|
className="w-40 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>结束时间</FieldLabel>
|
<FieldLabel>结束时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ export default function BillingPage() {
|
|||||||
className="w-40 flex-none"
|
className="w-40 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>开始时间</FieldLabel>
|
<FieldLabel>开始时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
@@ -330,7 +330,7 @@ export default function BillingPage() {
|
|||||||
className="w-40 flex-none"
|
className="w-40 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>结束时间</FieldLabel>
|
<FieldLabel>结束时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -11,13 +11,15 @@ import { DataTable, useDataTable } from "@/components/data-table"
|
|||||||
import { Page } from "@/components/page"
|
import { Page } from "@/components/page"
|
||||||
import { Badge } from "@/components/ui/badge"
|
import { Badge } from "@/components/ui/badge"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import {
|
import { Field, FieldError, FieldLabel } from "@/components/ui/field"
|
||||||
Field,
|
|
||||||
FieldError,
|
|
||||||
FieldGroup,
|
|
||||||
FieldLabel,
|
|
||||||
} from "@/components/ui/field"
|
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
|
import {
|
||||||
|
Select,
|
||||||
|
SelectContent,
|
||||||
|
SelectItem,
|
||||||
|
SelectTrigger,
|
||||||
|
SelectValue,
|
||||||
|
} from "@/components/ui/select"
|
||||||
import type { Channel } from "@/models/channel"
|
import type { Channel } from "@/models/channel"
|
||||||
|
|
||||||
type FilterValues = {
|
type FilterValues = {
|
||||||
@@ -29,6 +31,7 @@ type FilterValues = {
|
|||||||
node_ip?: string
|
node_ip?: string
|
||||||
expired_at_start?: Date
|
expired_at_start?: Date
|
||||||
expired_at_end?: Date
|
expired_at_end?: Date
|
||||||
|
expired?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
const filterSchema = z
|
const filterSchema = z
|
||||||
@@ -41,6 +44,7 @@ const filterSchema = z
|
|||||||
node_ip: z.string().optional(),
|
node_ip: z.string().optional(),
|
||||||
expired_at_start: z.string().optional(),
|
expired_at_start: z.string().optional(),
|
||||||
expired_at_end: z.string().optional(),
|
expired_at_end: z.string().optional(),
|
||||||
|
expired: z.enum(["all", "expired", "not_expired"]).optional(),
|
||||||
})
|
})
|
||||||
.superRefine((data, ctx) => {
|
.superRefine((data, ctx) => {
|
||||||
if (data.expired_at_start && data.expired_at_end) {
|
if (data.expired_at_start && data.expired_at_end) {
|
||||||
@@ -81,6 +85,7 @@ export default function ChannelPage() {
|
|||||||
node_ip: "",
|
node_ip: "",
|
||||||
expired_at_start: "",
|
expired_at_start: "",
|
||||||
expired_at_end: "",
|
expired_at_end: "",
|
||||||
|
expired: "all",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -100,6 +105,13 @@ export default function ChannelPage() {
|
|||||||
result.expired_at_start = new Date(filters.expired_at_start)
|
result.expired_at_start = new Date(filters.expired_at_start)
|
||||||
if (filters.expired_at_end)
|
if (filters.expired_at_end)
|
||||||
result.expired_at_end = new Date(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 })
|
return getPageChannel({ page, size, ...result })
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -110,7 +122,7 @@ export default function ChannelPage() {
|
|||||||
return (
|
return (
|
||||||
<Page>
|
<Page>
|
||||||
<form onSubmit={onFilter} className="bg-card p-4 rounded-lg">
|
<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
|
<Controller
|
||||||
name="batch_no"
|
name="batch_no"
|
||||||
control={control}
|
control={control}
|
||||||
@@ -201,10 +213,10 @@ export default function ChannelPage() {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<Field
|
<Field
|
||||||
data-invalid={fieldState.invalid}
|
data-invalid={fieldState.invalid}
|
||||||
className="w-40 flex-none"
|
className="w-48 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>开始时间</FieldLabel>
|
<FieldLabel>开始时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="datetime-local" step="1" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
@@ -215,17 +227,37 @@ export default function ChannelPage() {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<Field
|
<Field
|
||||||
data-invalid={fieldState.invalid}
|
data-invalid={fieldState.invalid}
|
||||||
className="w-40 flex-none"
|
className="w-48 flex-none"
|
||||||
>
|
>
|
||||||
<FieldLabel>结束时间</FieldLabel>
|
<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>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
|
|
||||||
<FieldGroup className="flex-row justify-start mt-4 gap-2">
|
|
||||||
<Button type="submit">搜索</Button>
|
<Button type="submit">搜索</Button>
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -247,7 +279,7 @@ export default function ChannelPage() {
|
|||||||
>
|
>
|
||||||
重置
|
重置
|
||||||
</Button>
|
</Button>
|
||||||
</FieldGroup>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<Suspense>
|
<Suspense>
|
||||||
@@ -296,7 +328,6 @@ export default function ChannelPage() {
|
|||||||
header: "节点",
|
header: "节点",
|
||||||
accessorFn: row => row.ip || row.edge_ref || row.edge_id,
|
accessorFn: row => row.ip || row.edge_ref || row.edge_id,
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
header: "自动配置",
|
header: "自动配置",
|
||||||
cell: ({ row }) => {
|
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: "过期时间",
|
header: "过期时间",
|
||||||
accessorKey: "expired_at",
|
accessorKey: "expired_at",
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ export default function CustPage() {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||||
<FieldLabel>开始时间</FieldLabel>
|
<FieldLabel>开始时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
@@ -218,7 +218,7 @@ export default function CustPage() {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||||
<FieldLabel>结束时间</FieldLabel>
|
<FieldLabel>结束时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
@@ -262,7 +262,6 @@ export default function CustPage() {
|
|||||||
"yyyy-MM-dd HH:mm:ss",
|
"yyyy-MM-dd HH:mm:ss",
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
// { header: "邮箱", accessorKey: "email" },
|
|
||||||
{
|
{
|
||||||
header: "客户来源",
|
header: "客户来源",
|
||||||
accessorKey: "source",
|
accessorKey: "source",
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ export default function TradePage() {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||||
<FieldLabel>开始时间</FieldLabel>
|
<FieldLabel>开始时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
@@ -220,7 +220,7 @@ export default function TradePage() {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
<Field data-invalid={fieldState.invalid} className="w-40 flex">
|
||||||
<FieldLabel>结束时间</FieldLabel>
|
<FieldLabel>结束时间</FieldLabel>
|
||||||
<Input type="date" {...field} clearable />
|
<Input type="date" {...field} />
|
||||||
<FieldError>{fieldState.error?.message}</FieldError>
|
<FieldError>{fieldState.error?.message}</FieldError>
|
||||||
</Field>
|
</Field>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -20,4 +20,5 @@ export type Channel = {
|
|||||||
ip: string
|
ip: string
|
||||||
user?: User
|
user?: User
|
||||||
resource?: Resource
|
resource?: Resource
|
||||||
|
time?: Date
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user