feat: 发布管理全栈完善——环境值修复+驳回API+toast反馈+详情弹窗+确认框

后端:
- pipeline.go: 新增 RejectRelease handler(仅pending可驳回,状态置rejected)
- routes.go: 注册 POST /releases/:id/reject 路由

前端:
- ReleaseManager.tsx 重写(553→581行):
  - 修复环境值不匹配: development/production → dev/prod(与后端binding一致)
  - 移除硬编码mock applications数组,改自由输入应用名
  - 修复字段名: release.deployer → release.author
  - 新增toast反馈(create/approve/reject/deploy/rollback均有success/error)
  - 新增确认框(deploy/rollback操作前确认)
  - 新增发布详情弹窗(原缺失,Eye按钮无响应)
  - 新增空状态展示
  - 新增rejected状态徽章
  - 主题感知: bg-slate-800 → var(--dg-bg-secondary)
  - Select替换原生select下拉框
- api.ts: 新增 rejectRelease 方法

// Logan.Li
This commit is contained in:
attacker committed 2026-06-15 04:06:18 +08:00
1 parent 618da69576
commit a5970315be
4 files changed
+411 -342

No files matched your search

+37
View File
@@ -463,6 +463,43 @@ func (h *PipelineHandler) DeployRelease(c *gin.Context) {
})
}
// RejectRelease 驳回发布申请 // Logan.Li
func (h *PipelineHandler) RejectRelease(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
var release models.AppRelease
if err := h.db.First(&release, id).Error; err != nil {
c.JSON(http.StatusNotFound, models.Response{
Code: 404,
Message: "发布不存在",
})
return
}
if release.Status != "pending" {
c.JSON(http.StatusBadRequest, models.Response{
Code: 400,
Message: "仅待审批状态可驳回",
})
return
}
release.Status = "rejected"
if err := h.db.Save(&release).Error; err != nil {
c.JSON(http.StatusInternalServerError, models.Response{
Code: 500,
Message: "驳回失败",
})
return
}
c.JSON(http.StatusOK, models.Response{
Code: 200,
Message: "已驳回",
Data: release,
})
}
// RollbackRelease 回滚发布
// @Summary 回滚发布
// @Description 回滚应用发布
+1
View File
@@ -236,6 +236,7 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config) {
releases.GET("", pipelineHandler.ListReleases)
releases.POST("", pipelineHandler.CreateRelease)
releases.POST("/:id/approve", pipelineHandler.ApproveRelease)
releases.POST("/:id/reject", pipelineHandler.RejectRelease) // 驳回发布 // Logan.Li
releases.POST("/:id/deploy", pipelineHandler.DeployRelease)
releases.POST("/:id/rollback", pipelineHandler.RollbackRelease)
}