diff --git a/api/handler/mj_handler.go b/api/handler/mj_handler.go index 4c43c2fe..db4cb5e5 100644 --- a/api/handler/mj_handler.go +++ b/api/handler/mj_handler.go @@ -5,6 +5,7 @@ import ( "chatplus/core/types" "chatplus/service" "chatplus/service/mj" + "chatplus/service/oss" "chatplus/store/model" "chatplus/store/vo" "chatplus/utils" @@ -22,13 +23,15 @@ type MidJourneyHandler struct { db *gorm.DB pool *mj.ServicePool snowflake *service.Snowflake + uploader *oss.UploaderManager } -func NewMidJourneyHandler(app *core.AppServer, db *gorm.DB, snowflake *service.Snowflake, pool *mj.ServicePool) *MidJourneyHandler { +func NewMidJourneyHandler(app *core.AppServer, db *gorm.DB, snowflake *service.Snowflake, pool *mj.ServicePool, manager *oss.UploaderManager) *MidJourneyHandler { h := MidJourneyHandler{ db: db, snowflake: snowflake, pool: pool, + uploader: manager, } h.App = app return &h @@ -306,3 +309,30 @@ func (h *MidJourneyHandler) JobList(c *gin.Context) { } resp.SUCCESS(c, jobs) } + +// Remove remove task image +func (h *MidJourneyHandler) Remove(c *gin.Context) { + var data struct { + Id uint `json:"id"` + ImgURL string `json:"img_url"` + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + + // remove job recode + res := h.db.Delete(&model.MidJourneyJob{Id: data.Id}) + if res.Error != nil { + resp.ERROR(c, res.Error.Error()) + return + } + + // remove image + err := h.uploader.GetUploadHandler().Delete(data.ImgURL) + if err != nil { + logger.Error("remove image failed: ", err) + } + + resp.SUCCESS(c) +} diff --git a/api/handler/sd_handler.go b/api/handler/sd_handler.go index 3f73186e..553dba2b 100644 --- a/api/handler/sd_handler.go +++ b/api/handler/sd_handler.go @@ -3,6 +3,7 @@ package handler import ( "chatplus/core" "chatplus/core/types" + "chatplus/service/oss" "chatplus/service/sd" "chatplus/store/model" "chatplus/store/vo" @@ -19,15 +20,17 @@ import ( type SdJobHandler struct { BaseHandler - redis *redis.Client - db *gorm.DB - pool *sd.ServicePool + redis *redis.Client + db *gorm.DB + pool *sd.ServicePool + uploader *oss.UploaderManager } -func NewSdJobHandler(app *core.AppServer, db *gorm.DB, pool *sd.ServicePool) *SdJobHandler { +func NewSdJobHandler(app *core.AppServer, db *gorm.DB, pool *sd.ServicePool, manager *oss.UploaderManager) *SdJobHandler { h := SdJobHandler{ - db: db, - pool: pool, + db: db, + pool: pool, + uploader: manager, } h.App = app return &h @@ -189,3 +192,30 @@ func (h *SdJobHandler) JobList(c *gin.Context) { } resp.SUCCESS(c, jobs) } + +// Remove remove task image +func (h *SdJobHandler) Remove(c *gin.Context) { + var data struct { + Id uint `json:"id"` + ImgURL string `json:"img_url"` + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + + // remove job recode + res := h.db.Delete(&model.SdJob{Id: data.Id}) + if res.Error != nil { + resp.ERROR(c, res.Error.Error()) + return + } + + // remove image + err := h.uploader.GetUploadHandler().Delete(data.ImgURL) + if err != nil { + logger.Error("remove image failed: ", err) + } + + resp.SUCCESS(c) +} diff --git a/api/main.go b/api/main.go index 9f00da04..69ed1e83 100644 --- a/api/main.go +++ b/api/main.go @@ -233,11 +233,13 @@ func main() { group.POST("upscale", h.Upscale) group.POST("variation", h.Variation) group.GET("jobs", h.JobList) + group.POST("remove", h.Remove) }), fx.Invoke(func(s *core.AppServer, h *handler.SdJobHandler) { group := s.Engine.Group("/api/sd") group.POST("image", h.Image) group.GET("jobs", h.JobList) + group.POST("remove", h.Remove) }), // 管理后台控制器 diff --git a/web/src/assets/css/image-mj.css b/web/src/assets/css/image-mj.css index d421a77e..44f552bc 100644 --- a/web/src/assets/css/image-mj.css +++ b/web/src/assets/css/image-mj.css @@ -299,6 +299,7 @@ overflow: hidden; border-radius: 6px; transition: all 0.3s ease; /* 添加过渡效果 */ + position: relative; } .page-mj .inner .task-list-box .finish-job-list .job-item .opt .opt-line { margin: 6px 0; @@ -327,6 +328,15 @@ font-size: 20px; cursor: pointer; } +.page-mj .inner .task-list-box .finish-job-list .job-item .remove { + display: none; + position: absolute; + right: 10px; + top: 10px; +} +.page-mj .inner .task-list-box .finish-job-list .job-item:hover .remove { + display: block; +} .page-mj .inner .task-list-box .finish-job-list .animate:hover { box-shadow: 0 0 10px rgba(71,255,241,0.6); /* 添加阴影效果 */ transform: translateY(-10px); /* 向上移动10像素 */ diff --git a/web/src/assets/css/image-sd.css b/web/src/assets/css/image-sd.css index 9bd76f37..edb58873 100644 --- a/web/src/assets/css/image-sd.css +++ b/web/src/assets/css/image-sd.css @@ -184,6 +184,7 @@ overflow: hidden; border-radius: 6px; transition: all 0.3s ease; /* 添加过渡效果 */ + position: relative; } .page-sd .inner .task-list-box .finish-job-list .job-item .opt .opt-line { margin: 6px 0; @@ -212,6 +213,15 @@ font-size: 20px; cursor: pointer; } +.page-sd .inner .task-list-box .finish-job-list .job-item .remove { + display: none; + position: absolute; + right: 10px; + top: 10px; +} +.page-sd .inner .task-list-box .finish-job-list .job-item:hover .remove { + display: block; +} .page-sd .inner .task-list-box .finish-job-list .animate:hover { box-shadow: 0 0 10px rgba(71,255,241,0.6); /* 添加阴影效果 */ transform: translateY(-10px); /* 向上移动10像素 */ diff --git a/web/src/assets/css/task-list.styl b/web/src/assets/css/task-list.styl index 92000098..7b8204e6 100644 --- a/web/src/assets/css/task-list.styl +++ b/web/src/assets/css/task-list.styl @@ -148,6 +148,7 @@ overflow hidden border-radius 6px transition: all 0.3s ease; /* 添加过渡效果 */ + position relative .opt { .opt-line { @@ -183,6 +184,19 @@ } } } + + .remove { + display none + position absolute + right 10px + top 10px + } + + &:hover{ + .remove { + display block + } + } } .animate { diff --git a/web/src/views/ImageMj.vue b/web/src/views/ImageMj.vue index 64533adb..c6fa70df 100644 --- a/web/src/views/ImageMj.vue +++ b/web/src/views/ImageMj.vue @@ -417,6 +417,10 @@ + +
+ +
@@ -434,7 +438,7 @@