This commit is contained in:
@@ -473,7 +473,7 @@ import type {
|
|||||||
CertificateRecord, FrpAgentRouteDetail, FrpAgentRouteHealth, FrpAgentStatus, FrpProxy, FrpProxyTraffic,
|
CertificateRecord, FrpAgentRouteDetail, FrpAgentRouteHealth, FrpAgentStatus, FrpProxy, FrpProxyTraffic,
|
||||||
FrpRouteDriftReport, FrpRouteUptime, FrpServer, NginxConfigVersionEntry,
|
FrpRouteDriftReport, FrpRouteUptime, FrpServer, NginxConfigVersionEntry,
|
||||||
} from '../api/types'
|
} from '../api/types'
|
||||||
import { formatBytes, formatDate, formatRate, formatRelativeTime } from '../utils/format'
|
import { formatBytes, formatDate, formatRelativeTime } from '../utils/format'
|
||||||
import { copyText } from '../utils/clipboard'
|
import { copyText } from '../utils/clipboard'
|
||||||
|
|
||||||
type Action =
|
type Action =
|
||||||
@@ -511,7 +511,6 @@ const candidates = ref<FrpProxy[]>([])
|
|||||||
const routeDetails = ref<FrpAgentRouteDetail[]>([])
|
const routeDetails = ref<FrpAgentRouteDetail[]>([])
|
||||||
const routeHealth = ref<FrpAgentRouteHealth[]>([])
|
const routeHealth = ref<FrpAgentRouteHealth[]>([])
|
||||||
const proxyTraffic = ref<Record<string, FrpProxyTraffic>>({})
|
const proxyTraffic = ref<Record<string, FrpProxyTraffic>>({})
|
||||||
const trafficErrors = ref<Record<string, string>>({})
|
|
||||||
const agentStatus = ref<FrpAgentStatus | null>(null)
|
const agentStatus = ref<FrpAgentStatus | null>(null)
|
||||||
const statusLoaded = ref(false)
|
const statusLoaded = ref(false)
|
||||||
const routeDrift = ref<FrpRouteDriftReport | null>(null)
|
const routeDrift = ref<FrpRouteDriftReport | null>(null)
|
||||||
@@ -663,7 +662,6 @@ async function refreshAll(options: { silent?: boolean } = { silent: true }) {
|
|||||||
track('证书列表', () => api.listCertificates(), (value) => { certificates.value = value }),
|
track('证书列表', () => api.listCertificates(), (value) => { certificates.value = value }),
|
||||||
track('流量采集', () => api.listFrpProxiesTraffic(), (value) => {
|
track('流量采集', () => api.listFrpProxiesTraffic(), (value) => {
|
||||||
proxyTraffic.value = value.items ?? {}
|
proxyTraffic.value = value.items ?? {}
|
||||||
trafficErrors.value = value.errors ?? {}
|
|
||||||
}),
|
}),
|
||||||
track('Agent 状态', () => api.getFrpAgentStatus(current.id), (value) => {
|
track('Agent 状态', () => api.getFrpAgentStatus(current.id), (value) => {
|
||||||
agentStatus.value = value
|
agentStatus.value = value
|
||||||
@@ -909,10 +907,8 @@ function protocolOf(candidate: FrpProxy) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 采集失败时把原因挂到四个流量单元格的 title 上,不再单占一列
|
// 采集失败时不再单占一列,也不挂在单元格 title 上:
|
||||||
function trafficErrorOf(candidate: FrpProxy) {
|
// 流量明细已统一在内网穿透页展示,本页只保留「可用率」这类公网路由独有的指标。
|
||||||
return trafficErrors.value[String(candidate.id)] || undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
// 视口宽度:操作列固定到右侧后必须随屏幕收窄,否则窄屏上固定列会吃掉大半个可视区
|
// 视口宽度:操作列固定到右侧后必须随屏幕收窄,否则窄屏上固定列会吃掉大半个可视区
|
||||||
const viewportWidth = ref(window.innerWidth)
|
const viewportWidth = ref(window.innerWidth)
|
||||||
@@ -975,26 +971,6 @@ const columns = computed<DataTableColumns<FrpProxy>>(() => [
|
|||||||
[h(StatusBadge, { kind, text: `${stat.uptime_pct.toFixed(1)}%` })])
|
[h(StatusBadge, { kind, text: `${stat.uptime_pct.toFixed(1)}%` })])
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: '连接', key: 'conns', width: 80, align: 'right',
|
|
||||||
render: (row) => h('span', { class: 'mono' }, String(trafficOf(row).cur_conns)),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '当前上传', key: 'in_rate', width: 100, align: 'right',
|
|
||||||
render: (row) => h('span', { class: 'mono', title: trafficErrorOf(row) }, formatRate(trafficOf(row).traffic_in_rate)),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '当前下载', key: 'out_rate', width: 100, align: 'right',
|
|
||||||
render: (row) => h('span', { class: 'mono', title: trafficErrorOf(row) }, formatRate(trafficOf(row).traffic_out_rate)),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '总上传', key: 'in_total', width: 95, align: 'right',
|
|
||||||
render: (row) => h('span', { class: 'mono', title: trafficErrorOf(row) }, formatBytes(trafficOf(row).traffic_in)),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '总下载', key: 'out_total', width: 95, align: 'right',
|
|
||||||
render: (row) => h('span', { class: 'mono', title: trafficErrorOf(row) }, formatBytes(trafficOf(row).traffic_out)),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: '更新时间', key: 'updated_at', width: 155,
|
title: '更新时间', key: 'updated_at', width: 155,
|
||||||
render: (row) => h('div', { class: 'cell-time' }, [
|
render: (row) => h('div', { class: 'cell-time' }, [
|
||||||
@@ -1224,7 +1200,6 @@ watch(selectedId, () => {
|
|||||||
routeDetails.value = []
|
routeDetails.value = []
|
||||||
routeHealth.value = []
|
routeHealth.value = []
|
||||||
proxyTraffic.value = {}
|
proxyTraffic.value = {}
|
||||||
trafficErrors.value = {}
|
|
||||||
agentStatus.value = null
|
agentStatus.value = null
|
||||||
statusLoaded.value = false
|
statusLoaded.value = false
|
||||||
loadErrorMsg.value = ''
|
loadErrorMsg.value = ''
|
||||||
|
|||||||
Reference in New Issue
Block a user