Compare commits

..

2 Commits

Author SHA1 Message Date
fatedier
becee40715 docs: update API v2 release notes (#5400) 2026-07-08 15:54:16 +08:00
fatedier
17e788d43b refactor: clean up frps v2 frontend models (#5399) 2026-07-08 13:10:55 +08:00
5 changed files with 3 additions and 41 deletions

View File

@@ -1,7 +1,6 @@
## Features ## Features
* Added dashboard API v2 pagination endpoints for users, clients, and proxies. * Expanded the frps dashboard API v2 migration across Clients, Proxies, Server Overview, Client Detail, and Proxy Detail, covering paginated users/clients/proxies, detail data, proxy traffic history, server system info, offline proxy statistics pruning, server-side pagination, search, and proxy type filtering.
* The frps dashboard Clients and Proxies pages now use API v2 pagination and server-side search, including proxy type filtering and searchable proxy spec fields such as remote ports, custom domains, and subdomains.
## Fixes ## Fixes

View File

@@ -49,7 +49,7 @@ export const toLegacyProxyStats = (proxy: ProxyV2Info): ProxyStatsInfo => ({
curConns: proxy.status.curConns, curConns: proxy.status.curConns,
lastStartTime: proxy.status.lastStartTime, lastStartTime: proxy.status.lastStartTime,
lastCloseTime: proxy.status.lastCloseTime, lastCloseTime: proxy.status.lastCloseTime,
status: proxy.status.state || proxy.status.phase || '', status: proxy.status.phase,
}) })
export const getProxy = (type: string, name: string) => { export const getProxy = (type: string, name: string) => {

View File

@@ -7,7 +7,6 @@ export interface ClientInfoData {
wireProtocol?: string wireProtocol?: string
hostname: string hostname: string
clientIP?: string clientIP?: string
metas?: Record<string, string>
firstConnectedAt: number firstConnectedAt: number
lastConnectedAt: number lastConnectedAt: number
disconnectedAt?: number disconnectedAt?: number

View File

@@ -36,8 +36,7 @@ export interface ProxyV2Info {
} }
export interface ProxyV2Status { export interface ProxyV2Status {
state?: string phase: 'online' | 'offline'
phase?: string
todayTrafficIn: number todayTrafficIn: number
todayTrafficOut: number todayTrafficOut: number
curConns: number curConns: number

View File

@@ -10,7 +10,6 @@ export class Client {
wireProtocol: string wireProtocol: string
hostname: string hostname: string
ip: string ip: string
metas: Map<string, string>
firstConnectedAt: Date firstConnectedAt: Date
lastConnectedAt: Date lastConnectedAt: Date
disconnectedAt?: Date disconnectedAt?: Date
@@ -26,12 +25,6 @@ export class Client {
this.wireProtocol = data.wireProtocol || '' this.wireProtocol = data.wireProtocol || ''
this.hostname = data.hostname this.hostname = data.hostname
this.ip = data.clientIP || '' this.ip = data.clientIP || ''
this.metas = new Map<string, string>()
if (data.metas) {
for (const [key, value] of Object.entries(data.metas)) {
this.metas.set(key, value)
}
}
this.firstConnectedAt = new Date(data.firstConnectedAt * 1000) this.firstConnectedAt = new Date(data.firstConnectedAt * 1000)
this.lastConnectedAt = new Date(data.lastConnectedAt * 1000) this.lastConnectedAt = new Date(data.lastConnectedAt * 1000)
if (data.disconnectedAt && data.disconnectedAt > 0) { if (data.disconnectedAt && data.disconnectedAt > 0) {
@@ -52,10 +45,6 @@ export class Client {
return this.runID return this.runID
} }
get shortRunId(): string {
return this.runID.substring(0, 8)
}
get wireProtocolLabel(): string { get wireProtocolLabel(): string {
if (!this.wireProtocol) return '' if (!this.wireProtocol) return ''
return `Protocol ${this.wireProtocol}` return `Protocol ${this.wireProtocol}`
@@ -73,28 +62,4 @@ export class Client {
if (!this.disconnectedAt) return '' if (!this.disconnectedAt) return ''
return formatDistanceToNow(this.disconnectedAt) return formatDistanceToNow(this.disconnectedAt)
} }
get statusColor(): string {
return this.online ? 'success' : 'danger'
}
get metasArray(): Array<{ key: string; value: string }> {
const arr: Array<{ key: string; value: string }> = []
this.metas.forEach((value, key) => {
arr.push({ key, value })
})
return arr
}
matchesFilter(searchText: string): boolean {
const search = searchText.toLowerCase()
return (
this.key.toLowerCase().includes(search) ||
this.user.toLowerCase().includes(search) ||
this.clientID.toLowerCase().includes(search) ||
this.runID.toLowerCase().includes(search) ||
this.wireProtocol.toLowerCase().includes(search) ||
this.hostname.toLowerCase().includes(search)
)
}
} }