From 5132d52a44ddf21cd772306c48c4fb5d28b92356 Mon Sep 17 00:00:00 2001 From: RockYang Date: Mon, 29 Jul 2024 11:00:53 +0800 Subject: [PATCH] add back-to-top component for all list page --- api/handler/mj_handler.go | 37 +++++++++++++-- api/service/mj/pool.go | 23 ---------- web/src/assets/css/image-mj.styl | 7 +-- web/src/components/BackTop.vue | 77 ++++++++++++++++++++++++++++++++ web/src/views/ChatPlus.vue | 28 +++++------- web/src/views/Dalle.vue | 3 +- web/src/views/ImageMj.vue | 4 +- web/src/views/ImageSd.vue | 5 ++- web/src/views/ImagesWall.vue | 6 ++- 9 files changed, 137 insertions(+), 53 deletions(-) create mode 100644 web/src/components/BackTop.vue diff --git a/api/handler/mj_handler.go b/api/handler/mj_handler.go index 88221f3b..5b49f51a 100644 --- a/api/handler/mj_handler.go +++ b/api/handler/mj_handler.go @@ -456,15 +456,44 @@ func (h *MidJourneyHandler) Remove(c *gin.Context) { resp.ERROR(c, "记录不存在") return } + // remove job recode - res := h.DB.Delete(&job) - if res.Error != nil { - resp.ERROR(c, res.Error.Error()) + tx := h.DB.Begin() + if err := tx.Delete(&job).Error; err != nil { + tx.Rollback() + resp.ERROR(c, err.Error()) return } + // refund power + err := tx.Model(&model.User{}).Where("id = ?", job.UserId).UpdateColumn("power", gorm.Expr("power + ?", job.Power)).Error + if err != nil { + tx.Rollback() + resp.ERROR(c, err.Error()) + return + } + var user model.User + h.DB.Where("id = ?", job.UserId).First(&user) + err = tx.Create(&model.PowerLog{ + UserId: user.Id, + Username: user.Username, + Type: types.PowerConsume, + Amount: job.Power, + Balance: user.Power + job.Power, + Mark: types.PowerAdd, + Model: "mid-journey", + Remark: fmt.Sprintf("绘画任务失败,退回算力。任务ID:%s", job.TaskId), + CreatedAt: time.Now(), + }).Error + if err != nil { + tx.Rollback() + resp.ERROR(c, err.Error()) + return + } + tx.Commit() + // remove image - err := h.uploader.GetUploadHandler().Delete(job.ImgURL) + err = h.uploader.GetUploadHandler().Delete(job.ImgURL) if err != nil { logger.Error("remove image failed: ", err) } diff --git a/api/service/mj/pool.go b/api/service/mj/pool.go index dca71a76..80ed6067 100644 --- a/api/service/mj/pool.go +++ b/api/service/mj/pool.go @@ -8,7 +8,6 @@ package mj // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ import ( - "fmt" "geekai/core/types" logger2 "geekai/logger" "geekai/service" @@ -188,28 +187,6 @@ func (p *ServicePool) SyncTaskProgress() { } for _, job := range jobs { - // 失败或者 30 分钟还没完成的任务删除并退回算力 - if time.Now().Sub(job.CreatedAt) > time.Minute*30 { - p.db.Delete(&job) - // 退回算力 - tx := p.db.Model(&model.User{}).Where("id = ?", job.UserId).UpdateColumn("power", gorm.Expr("power + ?", job.Power)) - if tx.Error == nil && tx.RowsAffected > 0 { - var user model.User - p.db.Where("id = ?", job.UserId).First(&user) - p.db.Create(&model.PowerLog{ - UserId: user.Id, - Username: user.Username, - Type: types.PowerConsume, - Amount: job.Power, - Balance: user.Power + job.Power, - Mark: types.PowerAdd, - Model: "mid-journey", - Remark: fmt.Sprintf("绘画任务失败,退回算力。任务ID:%s", job.TaskId), - CreatedAt: time.Now(), - }) - } - continue - } if servicePlus := p.getService(job.ChannelId); servicePlus != nil { _ = servicePlus.Notify(job) } diff --git a/web/src/assets/css/image-mj.styl b/web/src/assets/css/image-mj.styl index afb7671d..61845709 100644 --- a/web/src/assets/css/image-mj.styl +++ b/web/src/assets/css/image-mj.styl @@ -79,7 +79,7 @@ background-color #383838 border 1px solid #454545 border-radius 5px - padding 10px + padding 5px margin-bottom 10px display flex flex-flow column @@ -91,12 +91,13 @@ } .el-image { - height 60px + height 30px width 100% } .text { - margin-top 6px + margin-top 4px + font-size 12px } } diff --git a/web/src/components/BackTop.vue b/web/src/components/BackTop.vue new file mode 100644 index 00000000..3fbab35a --- /dev/null +++ b/web/src/components/BackTop.vue @@ -0,0 +1,77 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index 8db312c8..80769552 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -118,6 +118,8 @@ v-if="item.type==='prompt'" :data="item" :list-style="listStyle"/> + +
@@ -220,6 +222,8 @@ import FileSelect from "@/components/FileSelect.vue"; import FileList from "@/components/FileList.vue"; import ChatSetting from "@/components/ChatSetting.vue"; import axios from "axios"; +import BackTop from "@/components/BackTop.vue"; +import {showMessageError} from "@/utils/dialog"; const title = ref('ChatGPT-智能助手'); const models = ref([]) @@ -603,18 +607,6 @@ const connect = function (chat_id, role_id) { } } - // 心跳函数 - const sendHeartbeat = () => { - clearTimeout(heartbeatHandle.value) - new Promise((resolve, reject) => { - if (socket.value !== null) { - socket.value.send(JSON.stringify({type: "heartbeat", content: "ping"})) - } - resolve("success") - }).then(() => { - heartbeatHandle.value = setTimeout(() => sendHeartbeat(), 5000) - }); - } const _socket = new WebSocket(host + `/api/chat/new?session_id=${sessionId.value}&role_id=${role_id}&chat_id=${chat_id}&model_id=${modelID.value}&token=${getUserToken()}`); _socket.addEventListener('open', () => { chatData.value = []; // 初始化聊天数据 @@ -636,8 +628,6 @@ const connect = function (chat_id, role_id) { } else { // 加载聊天记录 loadChatHistory(chat_id); } - // 发送心跳消息 - sendHeartbeat() }); _socket.addEventListener('message', event => { @@ -648,7 +638,7 @@ const connect = function (chat_id, role_id) { reader.onload = () => { const data = JSON.parse(String(reader.result)); if (data.type === 'start') { - const prePrompt = chatData.value[chatData.value.length-1].content + const prePrompt = chatData.value[chatData.value.length-1]?.content chatData.value.push({ type: "reply", id: randString(32), @@ -689,8 +679,10 @@ const connect = function (chat_id, role_id) { } else { lineBuffer.value += data.content; const reply = chatData.value[chatData.value.length - 1] - reply['orgContent'] = lineBuffer.value; - reply['content'] = md.render(processContent(lineBuffer.value)); + if (reply) { + reply['orgContent'] = lineBuffer.value; + reply['content'] = md.render(processContent(lineBuffer.value)); + } } // 将聊天框的滚动条滑动到最底部 nextTick(() => { @@ -716,7 +708,7 @@ const connect = function (chat_id, role_id) { connect(chat_id, role_id) }).catch(() => { loading.value = true - setTimeout(() => connect(chat_id, role_id), 3000) + showMessageError("会话已断开,刷新页面...") }); }); diff --git a/web/src/views/Dalle.vue b/web/src/views/Dalle.vue index 2e69ca60..fb243a3d 100644 --- a/web/src/views/Dalle.vue +++ b/web/src/views/Dalle.vue @@ -174,7 +174,7 @@
- + @@ -193,6 +193,7 @@ import Clipboard from "clipboard"; import {checkSession} from "@/action/session"; import {useSharedStore} from "@/store/sharedata"; import TaskList from "@/components/TaskList.vue"; +import BackTop from "@/components/BackTop.vue"; const listBoxHeight = ref(0) // const paramBoxHeight = ref(0) diff --git a/web/src/views/ImageMj.vue b/web/src/views/ImageMj.vue index ff26575e..ca1a3759 100644 --- a/web/src/views/ImageMj.vue +++ b/web/src/views/ImageMj.vue @@ -593,6 +593,7 @@ + @@ -613,6 +614,7 @@ import {getSessionId} from "@/store/session"; import {copyObj, removeArrayItem} from "@/utils/libs"; import {useSharedStore} from "@/store/sharedata"; import TaskList from "@/components/TaskList.vue"; +import BackTop from "@/components/BackTop.vue"; const listBoxHeight = ref(0) const paramBoxHeight = ref(0) @@ -1014,7 +1016,7 @@ const publishImage = (item, action) => { item.publish = action page.value = 0 isOver.value = false - fetchFinishJobs() + item.publish = action }).catch(e => { ElMessage.error(text + "失败:" + e.message) }) diff --git a/web/src/views/ImageSd.vue b/web/src/views/ImageSd.vue index 7c686fe7..01771cbe 100644 --- a/web/src/views/ImageSd.vue +++ b/web/src/views/ImageSd.vue @@ -345,7 +345,7 @@ - + @@ -476,6 +476,7 @@ import {useRouter} from "vue-router"; import {getSessionId} from "@/store/session"; import {useSharedStore} from "@/store/sharedata"; import TaskList from "@/components/TaskList.vue"; +import BackTop from "@/components/BackTop.vue"; const listBoxHeight = ref(0) // const paramBoxHeight = ref(0) @@ -755,7 +756,7 @@ const publishImage = (event, item, action) => { item.publish = action page.value = 0 isOver.value = false - fetchFinishJobs() + item.publish = action }).catch(e => { ElMessage.error(text + "失败:" + e.message) }) diff --git a/web/src/views/ImagesWall.vue b/web/src/views/ImagesWall.vue index 4a136b3f..fa8c4d83 100644 --- a/web/src/views/ImagesWall.vue +++ b/web/src/views/ImagesWall.vue @@ -163,7 +163,10 @@ - + + + + @@ -301,6 +304,7 @@ import {httpGet} from "@/utils/http"; import {ElMessage} from "element-plus"; import Clipboard from "clipboard"; import {useRouter} from "vue-router"; +import BackTop from "@/components/BackTop.vue"; const data = ref({ "mj": [],