feat: adjust openapi endpoint
This commit is contained in:
@@ -58,7 +58,7 @@ func (ec *EnvController) CreateEnvVar(c *gin.Context) {
|
||||
// @Tags 环境变量
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param name query string false "按名称模糊查询"
|
||||
// @Param page query int false "页码"
|
||||
// @Param page_size query int false "每页数量"
|
||||
@@ -78,7 +78,7 @@ func (ec *EnvController) GetEnvVars(c *gin.Context) {
|
||||
// @Tags 环境变量
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Success 200 {object} utils.Response{data=[]vo.EnvVO}
|
||||
// @Router /env/all [get]
|
||||
func (ec *EnvController) GetAllEnvVars(c *gin.Context) {
|
||||
@@ -93,7 +93,7 @@ func (ec *EnvController) GetAllEnvVars(c *gin.Context) {
|
||||
// @Tags 环境变量
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param id path string true "环境变量ID"
|
||||
// @Success 200 {object} utils.Response{data=vo.EnvVO}
|
||||
// @Failure 404 {object} utils.Response
|
||||
@@ -210,7 +210,7 @@ func (ec *EnvController) DeleteEnvVar(c *gin.Context) {
|
||||
// @Tags 环境变量
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param id path string true "环境变量ID"
|
||||
// @Success 200 {object} utils.Response{data=[]vo.TaskVO}
|
||||
// @Router /env/{id}/tasks [get]
|
||||
|
||||
@@ -21,10 +21,10 @@ func NewExecutorController(executorService *tasks.ExecutorService) *ExecutorCont
|
||||
// ExecuteTask 运行任务
|
||||
// @Summary 运行任务
|
||||
// @Description 立即执行指定的任务
|
||||
// @Tags 任务
|
||||
// @Tags 任务执行
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param id path string true "任务ID"
|
||||
// @Param body body object false "执行参数 (envs: 环境变量字典)"
|
||||
// @Success 200 {object} utils.Response{data=vo.ExecutionResultVO}
|
||||
@@ -85,7 +85,7 @@ func (ec *ExecutorController) ExecuteCommand(c *gin.Context) {
|
||||
// @Tags 任务执行
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param count query int false "数量 (默认 10)"
|
||||
// @Success 200 {object} utils.Response{data=[]vo.ExecutionResultVO}
|
||||
// @Router /execute/results [get]
|
||||
|
||||
@@ -19,10 +19,10 @@ func NewLogController() *LogController {
|
||||
// GetLogs 获取任务日志列表
|
||||
// @Summary 获取任务日志列表
|
||||
// @Description 分页获取任务日志列表,支持按任务 ID、任务名称、状态筛选
|
||||
// @Tags 日志
|
||||
// @Tags 日志管理
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param task_id query string false "任务 ID"
|
||||
// @Param task_name query string false "任务名称"
|
||||
// @Param status query string false "状态"
|
||||
@@ -102,10 +102,10 @@ func (lc *LogController) GetLogs(c *gin.Context) {
|
||||
// GetLogDetail 获取日志详情
|
||||
// @Summary 获取日志详情
|
||||
// @Description 根据 ID 获取任务日志详细内容(包含输出)
|
||||
// @Tags 日志
|
||||
// @Tags 日志管理
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param id path string true "日志ID"
|
||||
// @Success 200 {object} utils.Response{data=vo.TaskLogVO}
|
||||
// @Failure 404 {object} utils.Response
|
||||
|
||||
@@ -108,10 +108,10 @@ func (tc *TaskController) CreateTask(c *gin.Context) {
|
||||
// GetTasks 获取任务列表
|
||||
// @Summary 获取任务列表
|
||||
// @Description 分页获取任务列表,支持按名称、Agent ID、标签、类型筛选
|
||||
// @Tags 任务
|
||||
// @Tags 任务管理
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param name query string false "任务名称"
|
||||
// @Param agent_id query string false "Agent ID"
|
||||
// @Param tags query string false "标签"
|
||||
@@ -140,10 +140,10 @@ func (tc *TaskController) GetTasks(c *gin.Context) {
|
||||
// GetTask 获取任务详情
|
||||
// @Summary 获取任务详情
|
||||
// @Description 根据 ID 获取任务详情
|
||||
// @Tags 任务
|
||||
// @Tags 任务管理
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param id path string true "任务ID"
|
||||
// @Success 200 {object} utils.Response{data=vo.TaskVO}
|
||||
// @Failure 404 {object} utils.Response
|
||||
@@ -167,10 +167,10 @@ func (tc *TaskController) GetTask(c *gin.Context) {
|
||||
// UpdateTask 更新任务
|
||||
// @Summary 更新任务
|
||||
// @Description 根据 ID 更新任务信息
|
||||
// @Tags 任务
|
||||
// @Tags 任务管理
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param id path string true "任务ID"
|
||||
// @Param body body object true "任务更新信息"
|
||||
// @Success 200 {object} utils.Response{data=vo.TaskVO}
|
||||
@@ -262,10 +262,10 @@ func (tc *TaskController) UpdateTask(c *gin.Context) {
|
||||
// DeleteTask 删除任务
|
||||
// @Summary 删除任务
|
||||
// @Description 根据 ID 删除任务
|
||||
// @Tags 任务
|
||||
// @Tags 任务管理
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param id path string true "任务ID"
|
||||
// @Success 200 {object} utils.Response
|
||||
// @Failure 404 {object} utils.Response
|
||||
@@ -303,10 +303,10 @@ func (tc *TaskController) DeleteTask(c *gin.Context) {
|
||||
// StopTask 停止任务
|
||||
// @Summary 停止任务
|
||||
// @Description 根据运行日志 ID 停止正在执行的任务
|
||||
// @Tags 任务
|
||||
// @Tags 任务管理
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Security BearerAuth
|
||||
// @Param logID path string true "运行日志ID"
|
||||
// @Success 200 {object} utils.Response
|
||||
// @Failure 400 {object} utils.Response
|
||||
|
||||
@@ -24,11 +24,6 @@ func AuthRequired() gin.HandlerFunc {
|
||||
return
|
||||
}
|
||||
|
||||
// 校验 OpenAPI Token
|
||||
if checkOpenapiToken(c, settingsSvc) {
|
||||
return
|
||||
}
|
||||
|
||||
token, err := c.Cookie(constant.CookieName)
|
||||
if err != nil || token == "" {
|
||||
utils.Unauthorized(c, "请先登录")
|
||||
@@ -111,14 +106,40 @@ func checkApiToken(c *gin.Context, settingsSvc *services.SettingsService) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// OpenapiRequired OpenAPI 认证中间件
|
||||
func OpenapiRequired() gin.HandlerFunc {
|
||||
settingsSvc := services.NewSettingsService()
|
||||
return func(c *gin.Context) {
|
||||
if checkOpenapiToken(c, settingsSvc) {
|
||||
return
|
||||
}
|
||||
utils.Unauthorized(c, "无效的 OpenAPI 令牌")
|
||||
c.Abort()
|
||||
}
|
||||
}
|
||||
|
||||
// checkOpenapiToken 校验 OpenAPI Token
|
||||
// 返回 true 表示校验通过并已放行请求
|
||||
func checkOpenapiToken(c *gin.Context, settingsSvc *services.SettingsService) bool {
|
||||
authHeader := c.GetHeader("Authorization")
|
||||
if authHeader == "" || len(authHeader) < 8 || authHeader[:7] != "Bearer " {
|
||||
if authHeader == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
// 提取 token:支持 "Bearer <token>" 和直接 "<token>" 两种格式
|
||||
var openapiToken string
|
||||
if len(authHeader) > 7 && authHeader[:7] == "Bearer " {
|
||||
// 标准格式:Bearer <token>
|
||||
openapiToken = authHeader[7:]
|
||||
} else {
|
||||
// 直接使用 token
|
||||
openapiToken = authHeader
|
||||
}
|
||||
|
||||
// Token 不能为空
|
||||
if openapiToken == "" {
|
||||
return false
|
||||
}
|
||||
openapiToken := authHeader[7:]
|
||||
|
||||
siteConfig := settingsSvc.GetSection(constant.SectionSite)
|
||||
tokenJson, ok := siteConfig[constant.KeyOpenapiToken]
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"github.com/engigu/baihu-panel/internal/middleware"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// initOpenAPIV1Routes 初始化 OpenAPI v1 路由
|
||||
// 只注册有 @Tags OpenAPI 注释的接口
|
||||
func initOpenAPIV1Routes(root *gin.RouterGroup, c *Controllers) {
|
||||
// OpenAPI v1 路由组 (使用 Bearer Token)
|
||||
open := root.Group("/open2api/v1")
|
||||
open.Use(middleware.OpenapiRequired())
|
||||
{
|
||||
// 任务相关接口
|
||||
registerOpenAPITaskRoutes(open, c)
|
||||
// 环境变量相关接口
|
||||
registerOpenAPIEnvRoutes(open, c)
|
||||
// 日志相关接口
|
||||
registerOpenAPILogRoutes(open, c)
|
||||
// 任务执行相关接口
|
||||
registerOpenAPIExecutorRoutes(open, c)
|
||||
}
|
||||
}
|
||||
|
||||
// registerOpenAPITaskRoutes 注册 OpenAPI 任务路由(只包含有 @Tags OpenAPI 注释的接口)
|
||||
func registerOpenAPITaskRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
tasks := g.Group("/tasks")
|
||||
{
|
||||
tasks.GET("", c.Task.GetTasks)
|
||||
tasks.GET("/:id", c.Task.GetTask)
|
||||
tasks.PUT("/:id", c.Task.UpdateTask)
|
||||
tasks.DELETE("/:id", c.Task.DeleteTask)
|
||||
tasks.POST("/stop/:logID", c.Task.StopTask)
|
||||
}
|
||||
}
|
||||
|
||||
// registerOpenAPIEnvRoutes 注册 OpenAPI 环境变量路由(只包含有 @Tags OpenAPI 注释的接口)
|
||||
func registerOpenAPIEnvRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
env := g.Group("/env")
|
||||
{
|
||||
env.GET("", c.Env.GetEnvVars)
|
||||
env.GET("/all", c.Env.GetAllEnvVars)
|
||||
env.GET("/:id", c.Env.GetEnvVar)
|
||||
env.GET("/:id/tasks", c.Env.GetAssociatedTasks)
|
||||
}
|
||||
}
|
||||
|
||||
// registerOpenAPILogRoutes 注册 OpenAPI 日志路由(只包含有 @Tags OpenAPI 注释的接口)
|
||||
func registerOpenAPILogRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
logs := g.Group("/logs")
|
||||
{
|
||||
logs.GET("", c.Log.GetLogs)
|
||||
logs.GET("/:id", c.Log.GetLogDetail)
|
||||
}
|
||||
}
|
||||
|
||||
// registerOpenAPIExecutorRoutes 注册 OpenAPI 任务执行路由(只包含有 @Tags OpenAPI 注释的接口)
|
||||
func registerOpenAPIExecutorRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
execution := g.Group("/execute")
|
||||
{
|
||||
execution.POST("/task/:id", c.Executor.ExecuteTask)
|
||||
execution.GET("/results", c.Executor.GetLastResults)
|
||||
}
|
||||
}
|
||||
@@ -77,6 +77,7 @@ func Setup(c *Controllers) *gin.Engine {
|
||||
initPublicAPIRoutes(apiV1, c)
|
||||
initAuthorizedAPIRoutes(apiV1, c)
|
||||
initAgentAPIRoutes(root, c)
|
||||
initOpenAPIV1Routes(root, c)
|
||||
|
||||
// SPA 兜底路由 - 返回 index.html(HTML禁用缓存以保证实时同步)
|
||||
// 必须在最后注册,作为兜底路由
|
||||
@@ -332,7 +333,7 @@ func registerLogRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
|
||||
func registerTerminalRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
g.GET("/terminal/ws", c.Terminal.HandleWebSocket)
|
||||
g.POST("/terminal/exec", c.Terminal.ExecuteShellCommand)
|
||||
// g.POST("/terminal/exec", c.Terminal.ExecuteShellCommand) // 暂未使用,已注释
|
||||
g.GET("/terminal/cmds", c.Terminal.GetCommands)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user