forked from Mxmilu666/frp
Move the frps dashboard Clients and Proxies views to the paginated /api/v2/clients and /api/v2/proxies endpoints instead of fetching all data at once, and extend server-side proxy search so the search box keeps working under pagination. Frontend: - Add V2Envelope/V2Page types and getV2 HTTP helper to api/http.ts - Add v2 paginated fetch functions to api/client.ts and api/proxy.ts - Add ClientV2Info and ProxyV2Info types for v2 API responses - Rewrite Clients.vue with server-side pagination, status/user search filtering, and ElPagination component - Rewrite Proxies.vue with server-side pagination, type tabs, client dropdown filter, and a search box that passes q to the API - Default page size 10, selectable sizes [10, 20, 50, 100] Backend: - Extend /api/v2/proxies q matching to also cover online proxy spec fields: TCP/UDP remotePort and HTTP/HTTPS/TCPMux customDomains and subdomain, so dashboard search no longer needs to scan every page - Add controller_v2 tests for the new spec-field matching
64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import { buildQueryString, http } from './http'
|
|
import type { V2Page } from './http'
|
|
import type {
|
|
GetProxyResponse,
|
|
ProxyListV2Params,
|
|
ProxyStatsInfo,
|
|
ProxyV2Info,
|
|
TrafficResponse,
|
|
} from '../types/proxy'
|
|
|
|
export const getProxiesByType = (type: string) => {
|
|
return http.get<GetProxyResponse>(`../api/proxy/${type}`)
|
|
}
|
|
|
|
export const getProxiesV2 = async (params: ProxyListV2Params = {}) => {
|
|
const page = await http.getV2<V2Page<ProxyV2Info>>(
|
|
`../api/v2/proxies${buildQueryString({
|
|
page: params.page,
|
|
pageSize: params.pageSize,
|
|
status:
|
|
params.status && params.status !== 'all' ? params.status : undefined,
|
|
q: params.q || undefined,
|
|
type: params.type || undefined,
|
|
user: params.user,
|
|
clientID: params.clientID || undefined,
|
|
})}`,
|
|
)
|
|
|
|
return {
|
|
...page,
|
|
items: page.items.map(toLegacyProxyStats),
|
|
}
|
|
}
|
|
|
|
const toLegacyProxyStats = (proxy: ProxyV2Info): ProxyStatsInfo => ({
|
|
name: proxy.name,
|
|
type: proxy.type,
|
|
conf: proxy.spec,
|
|
user: proxy.user,
|
|
clientID: proxy.clientID,
|
|
todayTrafficIn: proxy.status.todayTrafficIn,
|
|
todayTrafficOut: proxy.status.todayTrafficOut,
|
|
curConns: proxy.status.curConns,
|
|
lastStartTime: proxy.status.lastStartTime,
|
|
lastCloseTime: proxy.status.lastCloseTime,
|
|
status: proxy.status.phase,
|
|
})
|
|
|
|
export const getProxy = (type: string, name: string) => {
|
|
return http.get<ProxyStatsInfo>(`../api/proxy/${type}/${name}`)
|
|
}
|
|
|
|
export const getProxyByName = (name: string) => {
|
|
return http.get<ProxyStatsInfo>(`../api/proxies/${name}`)
|
|
}
|
|
|
|
export const getProxyTraffic = (name: string) => {
|
|
return http.get<TrafficResponse>(`../api/traffic/${name}`)
|
|
}
|
|
|
|
export const clearOfflineProxies = () => {
|
|
return http.delete('../api/proxies?status=offline')
|
|
}
|