diff --git a/admin/admin.go b/admin/admin.go index cf9026e..94a878f 100644 --- a/admin/admin.go +++ b/admin/admin.go @@ -5,6 +5,7 @@ import ( "net/http" "runtime" + "git.kingecg.top/kingecg/gohttpd/handler" "git.kingecg.top/kingecg/gohttpd/model" "git.kingecg.top/kingecg/gohttpd/server" "github.com/gin-gonic/gin" // 添加Gin框架导入 @@ -131,6 +132,166 @@ func start(c *gin.Context) { } } +func restart(c *gin.Context) { + name := c.Param("name") + if name != "" { + serverConf := model.GetServerConfig(name) + if serverConf == nil { + c.Writer.WriteHeader(http.StatusNotFound) + c.Writer.Write(server.NewErrorResult(errors.New("server not found"))) + return + } + // 先停止再启动 + server.StopServer(name, serverConf.Port) + server.StartServer(name, serverConf.Port) + c.Writer.WriteHeader(http.StatusOK) + data := "restarted" + c.Writer.Write(server.NewSuccessResult(data)) + return + } +} + +func deleteServer(c *gin.Context) { + name := c.Param("name") + if name != "" { + serverConf := model.GetServerConfig(name) + if serverConf == nil { + c.Writer.WriteHeader(http.StatusNotFound) + c.Writer.Write(server.NewErrorResult(errors.New("server not found"))) + return + } + // 先停止服务器 + server.StopServer(name, serverConf.Port) + // 从配置中删除 + err := model.DeleteServerConfig(name) + if err != nil { + c.Writer.WriteHeader(http.StatusInternalServerError) + c.Writer.Write(server.NewErrorResult(err)) + return + } + c.Writer.WriteHeader(http.StatusOK) + c.Writer.Write(server.NewSuccessResult("deleted")) + return + } +} + +// TCP代理相关API + +func listTcpProxy(c *gin.Context) { + data := model.GetConfig().TcpProxys + c.JSON(http.StatusOK, server.NewResultObj(data)) +} + +func setTcpProxy(c *gin.Context) { + ctx := c.Request.Context() + ctxData := ctx.Value(server.RequestCtxKey("data")).(map[string]interface{}) + data, ok := ctxData["data"] + if !ok { + c.Writer.WriteHeader(http.StatusBadRequest) + return + } + tcpProxy, ok := data.(model.TcpProxyConfig) + if !ok { + c.Writer.WriteHeader(http.StatusBadRequest) + c.Writer.Write(server.NewErrorResult(errors.New("invalid tcp proxy config"))) + return + } + er := model.SetTcpProxyConfig(&tcpProxy) + if er != nil { + c.Writer.WriteHeader(http.StatusBadRequest) + c.Writer.Write(server.NewErrorResult(er)) + return + } + c.Writer.WriteHeader(http.StatusOK) + c.Writer.Write(server.NewSuccessResult(tcpProxy)) +} + +func getTcpProxy(c *gin.Context) { + name := c.Param("name") + if name != "" { + data := model.GetTcpProxyConfig(name) + if data == nil { + c.Writer.WriteHeader(http.StatusNotFound) + c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found"))) + return + } + c.Writer.WriteHeader(http.StatusOK) + c.Writer.Write(server.NewSuccessResult(data)) + return + } + http.NotFound(c.Writer, c.Request) +} + +func deleteTcpProxy(c *gin.Context) { + name := c.Param("name") + if name != "" { + tcpProxy := model.GetTcpProxyConfig(name) + if tcpProxy == nil { + c.Writer.WriteHeader(http.StatusNotFound) + c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found"))) + return + } + // 如果正在运行,先停止 + if proxy, ok := server.TcpProxyManager[name]; ok { + proxy.Stop() + delete(server.TcpProxyManager, name) + } + // 从配置中删除 + err := model.DeleteTcpProxyConfig(name) + if err != nil { + c.Writer.WriteHeader(http.StatusInternalServerError) + c.Writer.Write(server.NewErrorResult(err)) + return + } + c.Writer.WriteHeader(http.StatusOK) + c.Writer.Write(server.NewSuccessResult("deleted")) + return + } + http.NotFound(c.Writer, c.Request) +} + +func startTcpProxy(c *gin.Context) { + name := c.Param("name") + if name != "" { + tcpProxy := model.GetTcpProxyConfig(name) + if tcpProxy == nil { + c.Writer.WriteHeader(http.StatusNotFound) + c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found"))) + return + } + if _, ok := server.TcpProxyManager[name]; ok { + c.Writer.WriteHeader(http.StatusOK) + c.Writer.Write(server.NewSuccessResult("already started")) + return + } + proxy := handler.NewTcpProxyHandler(tcpProxy.Name, tcpProxy.Listen, tcpProxy.Target) + server.AddTcpProxy(name, proxy) + proxy.Start() + c.Writer.WriteHeader(http.StatusOK) + c.Writer.Write(server.NewSuccessResult("started")) + return + } + http.NotFound(c.Writer, c.Request) +} + +func stopTcpProxy(c *gin.Context) { + name := c.Param("name") + if name != "" { + proxy, ok := server.TcpProxyManager[name] + if !ok { + c.Writer.WriteHeader(http.StatusNotFound) + c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found or not running"))) + return + } + proxy.Stop() + delete(server.TcpProxyManager, name) + c.Writer.WriteHeader(http.StatusOK) + c.Writer.Write(server.NewSuccessResult("stopped")) + return + } + http.NotFound(c.Writer, c.Request) +} + var AdminServerMux *gin.Engine // InitAdminApi 初始化管理API路由 @@ -170,6 +331,19 @@ func InitAdminApi(conf *model.HttpServerConfig) { { serverGroup.POST("stop/:name", stop) serverGroup.POST("start/:name", start) + serverGroup.POST("restart/:name", restart) + serverGroup.DELETE(":name", deleteServer) + } + + // TCP代理路由 + tcpGroup := api.Group("tcp") + { + tcpGroup.GET("", listTcpProxy) + tcpGroup.POST("", setTcpProxy) + tcpGroup.GET(":name", getTcpProxy) + tcpGroup.DELETE(":name", deleteTcpProxy) + tcpGroup.POST("start/:name", startTcpProxy) + tcpGroup.POST("stop/:name", stopTcpProxy) } api.POST("login", login) diff --git a/adminui/css/style.css b/adminui/css/style.css index d65284b..e72285b 100644 --- a/adminui/css/style.css +++ b/adminui/css/style.css @@ -152,20 +152,30 @@ body { /* 表格样式 */ .el-table { - background-color: transparent; + background-color: rgba(0, 0, 0, 0.3); color: var(--light); } .el-table th { - background-color: rgba(0, 0, 0, 0.2); + background-color: rgba(0, 0, 0, 0.4); color: var(--light); + border-bottom: 1px solid var(--glass-border); } .el-table tr { - background-color: rgba(0, 0, 0, 0.1); + background-color: transparent; +} + +.el-table td { + background-color: rgba(0, 0, 0, 0.2); + border-bottom: 1px solid var(--glass-border); } .el-table--enable-row-hover .el-table__body tr:hover>td { + background-color: rgba(64, 158, 255, 0.15); +} + +.el-table__empty-block { background-color: rgba(0, 0, 0, 0.3); } @@ -297,3 +307,12 @@ body { box-shadow: 0 10px 40px 0 rgba(31, 38, 135, 0.37); transform: translateY(-3px); } + +.el-table th.el-table__cell, .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell { + background-color: transparent; + +} + +.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell { + background-color: #02270c; +} \ No newline at end of file diff --git a/adminui/index.html b/adminui/index.html index a067850..05efad8 100644 --- a/adminui/index.html +++ b/adminui/index.html @@ -1,353 +1,264 @@ - -
-{{ site.domain }}:{{ site.port }}
-性能监控功能正在开发中
-