From 68cda968a1ebe2365f74cbd722415d0552434da9 Mon Sep 17 00:00:00 2001 From: RockYang Date: Thu, 15 Feb 2024 11:39:04 +0800 Subject: [PATCH] feat: add mj image list component for mobile page. fixed bug for html tag escape --- api/handler/chatimpl/chat_handler.go | 2 +- api/handler/mj_handler.go | 1 + api/handler/payment_handler.go | 6 + api/service/mj/pool.go | 2 +- api/service/wanx/types.go | 1 - api/store/mysql.go | 2 +- web/src/assets/css/mobile/image-mj.css | 92 +++++++++- web/src/assets/css/mobile/image-mj.styl | 123 ++++++++++++- web/src/main.js | 14 ++ web/src/utils/libs.js | 6 + web/src/views/ChatPlus.vue | 15 +- web/src/views/mobile/Home.vue | 3 +- web/src/views/mobile/ImageMj.vue | 233 +++++++++++++++++++++++- 13 files changed, 479 insertions(+), 21 deletions(-) delete mode 100644 api/service/wanx/types.go diff --git a/api/handler/chatimpl/chat_handler.go b/api/handler/chatimpl/chat_handler.go index 02fb79b9..529120c4 100644 --- a/api/handler/chatimpl/chat_handler.go +++ b/api/handler/chatimpl/chat_handler.go @@ -97,7 +97,7 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) { // use old chat data override the chat model and role ID var chat model.ChatItem - res = h.db.Where("chat_id=?", chatId).First(&chat) + res = h.db.Where("chat_id = ?", chatId).First(&chat) if res.Error == nil { chatModel.Id = chat.ModelId roleId = int(chat.RoleId) diff --git a/api/handler/mj_handler.go b/api/handler/mj_handler.go index 11756b43..2764a9ea 100644 --- a/api/handler/mj_handler.go +++ b/api/handler/mj_handler.go @@ -342,6 +342,7 @@ func (h *MidJourneyHandler) JobList(c *gin.Context) { if job.Progress == -1 { h.db.Delete(&model.MidJourneyJob{Id: job.Id}) + continue } if item.Progress < 100 && item.ImgURL == "" && item.OrgURL != "" { diff --git a/api/handler/payment_handler.go b/api/handler/payment_handler.go index 6ac10f78..797527b8 100644 --- a/api/handler/payment_handler.go +++ b/api/handler/payment_handler.go @@ -76,6 +76,12 @@ func (h *PaymentHandler) DoPay(c *gin.Context) { return } + // fix: 这里先检查一下订单状态,如果已经支付了,就直接返回 + if order.Status == types.OrderPaidSuccess { + resp.ERROR(c, "This order had been paid, please do not pay twice") + return + } + // 更新扫码状态 h.db.Model(&order).UpdateColumn("status", types.OrderScanned) if payWay == "alipay" { // 支付宝 diff --git a/api/service/mj/pool.go b/api/service/mj/pool.go index 4c676589..c791ef9f 100644 --- a/api/service/mj/pool.go +++ b/api/service/mj/pool.go @@ -201,7 +201,7 @@ func (p *ServicePool) SyncTaskProgress() { for _, v := range items { // 30 分钟还没完成的任务直接删除 if time.Now().Sub(v.CreatedAt) > time.Minute*30 { - p.db.Delete(&v) + //p.db.Delete(&v) // 非放大任务,退回绘图次数 if v.Type != types.TaskUpscale.String() { p.db.Model(&model.User{}).Where("id = ?", v.UserId).UpdateColumn("img_calls", gorm.Expr("img_calls + ?", 1)) diff --git a/api/service/wanx/types.go b/api/service/wanx/types.go deleted file mode 100644 index 23a6e31c..00000000 --- a/api/service/wanx/types.go +++ /dev/null @@ -1 +0,0 @@ -package wanx diff --git a/api/store/mysql.go b/api/store/mysql.go index d860a5f5..5e8e6550 100644 --- a/api/store/mysql.go +++ b/api/store/mysql.go @@ -11,7 +11,7 @@ import ( func NewGormConfig() *gorm.Config { return &gorm.Config{ - Logger: logger.Default.LogMode(logger.Warn), + Logger: logger.Default.LogMode(logger.Silent), NamingStrategy: schema.NamingStrategy{ TablePrefix: "chatgpt_", // 设置表前缀 SingularTable: false, // 使用单数表名形式 diff --git a/web/src/assets/css/mobile/image-mj.css b/web/src/assets/css/mobile/image-mj.css index abaf1ece..18700837 100644 --- a/web/src/assets/css/mobile/image-mj.css +++ b/web/src/assets/css/mobile/image-mj.css @@ -1,7 +1,3 @@ -.mobile-mj .content .van-field__label { - width: 100px; - text-align: right; -} .mobile-mj .content .text-line { padding: 6px; font-size: 14px; @@ -48,3 +44,91 @@ .mobile-mj .content .text-line .van-row .van-col .active { background-color: #e5e5e5; } +.mobile-mj .content .text-line .van-button { + position: relative; +} +.mobile-mj .content .text-line .van-button .van-tag { + position: absolute; + right: 20px; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content { + padding: 0; + position: relative; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content .van-image { + min-height: 100px; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content .progress { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + background: rgba(50,50,50,0.5); + position: absolute; + left: 0; + top: 0; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content .progress .van-circle__text { + color: #fff; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content .task-in-queue { + display: flex; + flex-flow: column; + justify-content: center; + color: #c1c1c1; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content .task-in-queue .icon { + text-align: center; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content .task-in-queue .icon .iconfont { + font-size: 24px; +} +.mobile-mj .content .running-job-list .van-grid .van-grid-item .van-grid-item__content .task-in-queue .text { + font-size: 14px; + margin-top: 5px; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content { + padding: 0; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item { + overflow: hidden; + border-radius: 6px; + position: relative; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item .opt .opt-line { + margin: 6px 0; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item .opt .opt-line ul { + display: flex; + flex-flow: row; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item .opt .opt-line ul li { + margin-right: 6px; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item .opt .opt-line ul li a { + padding: 3px 0; + width: 40px; + text-align: center; + border-radius: 5px; + display: block; + cursor: pointer; + background-color: #4e5058; + color: #fff; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item .opt .opt-line ul li a:hover { + background-color: #6d6f78; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item .opt .opt-line ul .show-prompt { + font-size: 20px; + cursor: pointer; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item .remove { + display: none; + position: absolute; + right: 10px; + top: 10px; +} +.mobile-mj .content .finish-job-list .van-grid .van-grid-item .van-grid-item__content .job-item:hover .remove { + display: block; +} diff --git a/web/src/assets/css/mobile/image-mj.styl b/web/src/assets/css/mobile/image-mj.styl index 2a1c7f04..8bb6003e 100644 --- a/web/src/assets/css/mobile/image-mj.styl +++ b/web/src/assets/css/mobile/image-mj.styl @@ -1,7 +1,5 @@ .mobile-mj { .content { - padding-bottom 60px - .text-line { padding 6px font-size 14px @@ -70,5 +68,126 @@ } } } + + .running-job-list { + .van-grid { + .van-grid-item { + .van-grid-item__content { + padding 0 + position relative + + .van-image { + min-height 100px + } + + .progress { + display flex + justify-content center + align-items center + width 100% + height 100% + background rgba(50, 50, 50, 0.5) + position absolute + left 0 + top 0 + + .van-circle__text { + color #ffffff + } + } + + // end progress + + .task-in-queue { + display flex + flex-flow column + justify-content center + color #c1c1c1 + + .icon { + text-align center + + .iconfont { + font-size 24px + } + } + + .text { + font-size 14px + margin-top 5px + } + } + } + } + } + } + + //end running jobs + + .finish-job-list { + .van-grid { + .van-grid-item { + .van-grid-item__content { + padding 0 + + .job-item { + overflow hidden + border-radius 6px + position relative + + .opt { + .opt-line { + margin 6px 0 + + ul { + display flex + flex-flow row + + li { + margin-right 6px + + a { + padding 3px 0 + width 40px + text-align center + border-radius 5px + display block + cursor pointer + background-color #4E5058 + color #ffffff + + &:hover { + background-color #6D6F78 + } + } + } + + .show-prompt { + font-size 20px + cursor pointer + } + } + } + } + + .remove { + display none + position absolute + right 10px + top 10px + } + + &:hover { + .remove { + display block + } + } + } + + + } + } + } + } } } \ No newline at end of file diff --git a/web/src/main.js b/web/src/main.js index b63fb295..94a3b572 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -9,6 +9,7 @@ import { Button, Cell, CellGroup, + Circle, Col, Collapse, CollapseItem, @@ -16,11 +17,17 @@ import { Dialog, DropdownItem, DropdownMenu, + Empty, Field, Form, + Grid, + GridItem, Icon, Image, + ImagePreview, + Lazyload, List, + Loading, NavBar, Notify, Overlay, @@ -79,6 +86,13 @@ app.use(Slider) app.use(Badge) app.use(Collapse); app.use(CollapseItem); +app.use(Grid); +app.use(GridItem); +app.use(Empty); +app.use(Circle); +app.use(Loading); +app.use(Lazyload); +app.use(ImagePreview); app.use(router).use(ElementPlus).mount('#app') diff --git a/web/src/utils/libs.js b/web/src/utils/libs.js index 8b03bdf2..1d053055 100644 --- a/web/src/utils/libs.js +++ b/web/src/utils/libs.js @@ -197,3 +197,9 @@ export function processContent(content) { return lines.join("\n") } +export function escapeHTML(html) { + return html.replace(/&/g, "&") + .replace(//g, ">"); +} + diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index b6ccf9f8..fc7723da 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -259,7 +259,16 @@ import { VideoPause } from '@element-plus/icons-vue' import 'highlight.js/styles/a11y-dark.css' -import {dateFormat, isImage, isMobile, processContent, randString, removeArrayItem, UUID} from "@/utils/libs"; +import { + dateFormat, + escapeHTML, + isImage, + isMobile, + processContent, + randString, + removeArrayItem, + UUID +} from "@/utils/libs"; import {ElMessage, ElMessageBox} from "element-plus"; import hl from "highlight.js"; import {getSessionId, getUserToken, removeUserToken} from "@/store/session"; @@ -717,7 +726,7 @@ const sendMessage = function () { type: "prompt", id: randString(32), icon: loginUser.value.avatar, - content: md.render(processContent(prompt.value)), + content: md.render(escapeHTML(processContent(prompt.value))), created_at: new Date().getTime(), }); @@ -815,7 +824,7 @@ const reGenerate = function () { icon: loginUser.value.avatar, content: md.render(text) }); - socket.value.send(text); + socket.value.send(previousText); } const chatName = ref('') diff --git a/web/src/views/mobile/Home.vue b/web/src/views/mobile/Home.vue index de5bfc14..d7ea04a4 100644 --- a/web/src/views/mobile/Home.vue +++ b/web/src/views/mobile/Home.vue @@ -39,6 +39,7 @@ const onChange = (index) => { \ No newline at end of file