feat: 添加接口管理功能(后端OpenAPI解析入库+前端列表/详情/测试)

- 新增 ApiEndpoint/ApiParam 实体和 Mapper
- 新增 DTO 层(分页查询请求、列表项、详情项、参数项、代理测试请求/响应)
- 新增 ApiEndpointService 含 OpenAPI JSON 解析、\ 展开(最大10层)、分页查询
- 新增 ApiEndpointSyncRunner 启动时异步同步
- 新增 ApiEndpointController 分页/详情/手动同步接口
- 新增 ApiTestProxyController 代理测试接口(SSRF 防护)
- 前端新增接口列表页、详情弹窗(含测试面板、Token 来源选择)
- 前端新增菜单和路由
This commit is contained in:
2026-05-23 18:21:07 +08:00
parent bdb4fd8c8e
commit 89fbc6437a
20 changed files with 1403 additions and 0 deletions
+92
View File
@@ -0,0 +1,92 @@
import request from '@/utils/request'
export interface ApiEndpointItem {
id: string
path: string
method: string
summary: string
tags: string
deprecated: number
createTime: string
operationId: string
}
export interface ApiParamItem {
paramType: string
name: string
required: number
paramTypeDef: string
description: string
defaultValue: string
enumValues: string
example: string
}
export interface ApiEndpointDetail {
id: string
path: string
method: string
operationId: string
summary: string
description: string
tags: string
deprecated: number
requestSchema: string
responseSchema: string
createTime: string
params: ApiParamItem[]
}
export interface ApiEndpointListRequest {
current: number
size: number
keyword?: string
method?: string
tags?: string
deprecated?: number
}
export interface ApiTestProxyRequest {
method: string
path: string
body?: string
headers?: Record<string, string>
params?: Record<string, string>
timeoutSeconds?: number
}
export interface ApiTestProxyResponse {
status: number
body?: any
headers?: Record<string, string>
duration: number
rawBody?: string
}
/**
* 分页查询接口列表
*/
export function getEndpointList(data: ApiEndpointListRequest) {
return request.post('/admin/endpoint/list', data)
}
/**
* 查询接口详情
*/
export function getEndpointDetail(operationId: string) {
return request.get('/admin/endpoint/detail', { params: { operationId } })
}
/**
* 手动触发同步
*/
export function syncEndpoints() {
return request.post('/admin/endpoint/sync')
}
/**
* 代理测试请求
*/
export function testEndpoint(data: ApiTestProxyRequest) {
return request.post('/admin/endpoint/test', data)
}