2 Commits

Author SHA1 Message Date
Eamon
01f4f5343d 修整IP管理页面的表格 2026-06-12 16:40:19 +08:00
Eamon
7b7ba7d01d 网关列表添加操作重建端口池 & 重建代理链 2026-06-11 16:10:05 +08:00
3 changed files with 100 additions and 35 deletions

View File

@@ -27,3 +27,9 @@ export async function updateGateway(data: { id: number; status: number }) {
export async function clear(data: { proxy_id: number }) {
return callByUser<PageRecord>("/api/admin/channel/sync/clear-expired", data)
}
export async function createProxyPort(data: { id: number }) {
return callByUser<PageRecord>("/api/admin/proxy/sync/ports", data)
}
export async function createProxyChains(data: { id: number }) {
return callByUser<PageRecord>("/api/admin/proxy/sync/chains", data)
}

View File

@@ -118,6 +118,7 @@ export default function ChannelPage() {
const onFilter = handleSubmit(() => {
table.pagination.onPageChange(1)
})
console.log(table, "table")
return (
<Page>
@@ -291,12 +292,16 @@ export default function ChannelPage() {
accessorFn: row => row.user?.phone || "-",
},
{
header: "套餐号",
header: "套餐号/提取编号",
accessorKey: "resource.resource_no",
cell: ({ row }) => {
const resource_no = row.original.resource?.resource_no
const batchNo = row.original.batch_no
const type = row.original.resource?.type
return (
<div className="flex flex-col font-mono text-xs">
<span>
&ensp;&ensp;
<Link
href={`./resources?resource_no=${resource_no}&type=${type}`}
target="_blank"
@@ -305,15 +310,9 @@ export default function ChannelPage() {
>
{resource_no}
</Link>
)
},
},
{
header: "提取编号",
accessorKey: "batch_no",
cell: ({ row }) => {
const batchNo = row.original.batch_no
return (
</span>
<span>
<Link
href={`./batch?batch_no=${batchNo}`}
target="_blank"
@@ -322,25 +321,34 @@ export default function ChannelPage() {
>
{batchNo}
</Link>
</span>
</div>
)
},
},
{
header: "网关",
accessorKey: "host",
cell: ({ row }) => {
return (
<span>
{row.original.host}:{row.original.port}
</span>
)
},
},
{
header: "节点",
accessorFn: row => row.ip || row.edge_ref || row.edge_id,
accessorFn: row => row.edge_ref || row.ip || row.edge_id,
},
{
header: "自动配置",
header: "地区",
cell: ({ row }) => {
const prov = row.original.filter_prov
const city = row.original.filter_city
const isp = row.original.filter_isp
const parts = []
if (prov && prov !== "all") parts.push(prov)
if (city && city !== "all") parts.push(city)
if (isp && isp !== "all") {
parts.push(ispMap[Number(isp)] || isp)
}
return (
<div className="text-sm">
{parts.length > 0 ? parts.join(" / ") : "不限"}
@@ -349,14 +357,11 @@ export default function ChannelPage() {
},
},
{
header: "网关地址",
accessorKey: "host",
header: "运营商",
// accessorFn: row => row.filter_isp || "",
cell: ({ row }) => {
return (
<span>
{row.original.host}:{row.original.port}
</span>
)
const isp = row.original.filter_isp
return ispMap[Number(isp)] || isp
},
},
{

View File

@@ -3,7 +3,13 @@
import { format } from "date-fns"
import { Suspense, useCallback, useState } from "react"
import { toast } from "sonner"
import { clear, getGatewayPage, updateGateway } from "@/actions/gateway"
import {
clear,
createProxyChains,
createProxyPort,
getGatewayPage,
updateGateway,
} from "@/actions/gateway"
import { Auth } from "@/components/auth"
import { DataTable, useDataTable } from "@/components/data-table"
import { Page } from "@/components/page"
@@ -64,6 +70,46 @@ export default function GatewayPage() {
}
}
const createPort = async (val: Gateway) => {
setLoading(true)
try {
const result = await createProxyPort({
id: val.id,
})
if (result.success) {
toast.success(`重建端口池成功!`)
} else {
toast.error(result.message || "请稍后重试一下~")
}
} catch (error) {
const message = error instanceof Error ? error.message : error
toast.error(`清理过期连接失败: ${message}`)
} finally {
setLoading(false)
}
}
const createChains = async (val: Gateway) => {
setLoading(true)
try {
const result = await createProxyChains({
id: val.id,
})
if (result.success) {
toast.success(`重建代理链成功!!!`)
} else {
toast.error(result.message || "请稍后重试一下~")
}
} catch (error) {
const message = error instanceof Error ? error.message : error
toast.error(`清理过期连接失败: ${message}`)
} finally {
setLoading(false)
}
}
return (
<Page>
<div className="flex justify-between items-stretch">
@@ -140,6 +186,14 @@ export default function GatewayPage() {
</Button>
</Auth>
<Auth scope={ScopeProxyWrite}>
<Button onClick={() => createPort(row.original)}>
</Button>
<Button onClick={() => createChains(row.original)}>
</Button>
</Auth>
</div>
),
},