diff --git a/server/cmd/main.go b/server/cmd/main.go index ef11340..61ea72a 100644 --- a/server/cmd/main.go +++ b/server/cmd/main.go @@ -66,6 +66,7 @@ func main() { admin.POST("/config/add", configHandler.Add) admin.POST("/config/update", configHandler.Update) admin.POST("/config/delete/:id", configHandler.Delete) + admin.POST("/config/restore/:id", configHandler.Restore) admin.GET("/config/configHistories/:id", configHandler.GetHistory) admin.POST("/config/history/delete/:id", configHandler.DeleteHistory) admin.POST("/config/rollback/:id", configHandler.Rollback) diff --git a/server/internal/handler/config.go b/server/internal/handler/config.go index 8a97bf9..b3e449a 100644 --- a/server/internal/handler/config.go +++ b/server/internal/handler/config.go @@ -28,6 +28,7 @@ type ConfigListRequest struct { PageSize int `form:"pageSize" binding:"required"` Env string `form:"env"` AppId *int `form:"appId"` + Deleted bool `form:"deleted"` } func (h *ConfigHandler) List(c *gin.Context) { @@ -48,7 +49,11 @@ func (h *ConfigHandler) List(c *gin.Context) { } // 构建查询条件 - conditions := []string{"enabled = 1"} + enabledCond := "enabled = 1" + if req.Deleted { + enabledCond = "enabled = 0" + } + conditions := []string{enabledCond} args := make([]interface{}, 0, 4) if req.Env != "" { conditions = append(conditions, "env = ?") @@ -320,6 +325,37 @@ func (h *ConfigHandler) Delete(c *gin.Context) { c.JSON(http.StatusOK, model.WrapperResponse{Code: 0}) } +// Restore 从回收站还原配置 +func (h *ConfigHandler) Restore(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + var config model.AppConfig + has, _ := dao.Engine.ID(id).Get(&config) + if !has { + c.JSON(http.StatusOK, model.WrapperResponse{Code: 404, Msg: "配置不存在"}) + return + } + + userInfo := middleware.GetUserInfo(c) + if err := h.permService.RequirePermission(userInfo, config.GroupId, config.AppId); err != nil { + c.JSON(http.StatusForbidden, model.WrapperResponse{Code: 403, Msg: err.Error()}) + return + } + if config.Enabled { + c.JSON(http.StatusOK, model.WrapperResponse{Code: 400, Msg: "配置未被删除"}) + return + } + + now := time.Now() + h.saveHistory(&config, userInfo.Name, "restore", now) + + config.Enabled = true + config.UpdatedBy = userInfo.Name + config.UpdatedAt = &now + dao.Engine.ID(config.Id).Cols("enabled", "updated_by", "updated_at").Update(&config) + + c.JSON(http.StatusOK, model.WrapperResponse{Code: 0, Data: true}) +} + func (h *ConfigHandler) GetHistory(c *gin.Context) { id, _ := strconv.Atoi(c.Param("id")) diff --git a/web/src/api/config.js b/web/src/api/config.js index 6882ae8..7549fe6 100644 --- a/web/src/api/config.js +++ b/web/src/api/config.js @@ -38,6 +38,13 @@ export function deleteConfig(id) { }) } +export function restoreConfig(id) { + return request({ + url: `/admin/config/restore/${id}`, + method: 'post' + }) +} + export function getConfigHistory(id, params) { return request({ url: `/admin/config/configHistories/${id}`, diff --git a/web/src/router/index.js b/web/src/router/index.js index da44dc2..05cf537 100644 --- a/web/src/router/index.js +++ b/web/src/router/index.js @@ -35,6 +35,11 @@ const routes = [ name: 'ConfigEdit', component: () => import('../views/config/ConfigEdit.vue') }, + { + path: '/config/recycle', + name: 'RecycleBin', + component: () => import('../views/config/RecycleBin.vue') + }, { path: '/app/list', name: 'AppList', diff --git a/web/src/views/config/AllConfigList.vue b/web/src/views/config/AllConfigList.vue index 965a905..da3d4ef 100644 --- a/web/src/views/config/AllConfigList.vue +++ b/web/src/views/config/AllConfigList.vue @@ -22,6 +22,7 @@
新建配置 + 回收站
@@ -70,6 +71,7 @@ 删除 回滚 更新 + 还原 - diff --git a/web/src/views/config/ConfigList.vue b/web/src/views/config/ConfigList.vue index 60ee422..15aca04 100644 --- a/web/src/views/config/ConfigList.vue +++ b/web/src/views/config/ConfigList.vue @@ -17,6 +17,7 @@
新建配置 + 回收站
@@ -65,6 +66,7 @@ 删除 回滚 更新 + 还原 - diff --git a/web/src/views/config/RecycleBin.vue b/web/src/views/config/RecycleBin.vue new file mode 100644 index 0000000..bd9969d --- /dev/null +++ b/web/src/views/config/RecycleBin.vue @@ -0,0 +1,136 @@ + + +