From 57243ff0106cf721bdcf850e69686b45c4b4b774 Mon Sep 17 00:00:00 2001 From: RockYang Date: Thu, 21 Dec 2023 15:00:46 +0800 Subject: [PATCH] opt: optimize image compress alg, add cache control for image --- api/core/app_server.go | 4 ++- api/main.go | 5 +++ api/service/mj/pool.go | 42 ++++++++++++++++++++++--- api/service/mj/service.go | 18 +---------- web/src/assets/iconfont/iconfont.css | 10 ++++-- web/src/assets/iconfont/iconfont.js | 2 +- web/src/assets/iconfont/iconfont.json | 7 +++++ web/src/assets/iconfont/iconfont.ttf | Bin 14900 -> 15212 bytes web/src/assets/iconfont/iconfont.woff | Bin 10244 -> 10436 bytes web/src/assets/iconfont/iconfont.woff2 | Bin 9040 -> 9188 bytes web/src/views/ImageMj.vue | 26 +++++++++++++-- web/src/views/ImageSd.vue | 18 ++++++++++- web/src/views/ImagesWall.vue | 32 +++++++++++++++++-- 13 files changed, 130 insertions(+), 34 deletions(-) diff --git a/api/core/app_server.go b/api/core/app_server.go index 3dd27bfb..a29c32d9 100644 --- a/api/core/app_server.go +++ b/api/core/app_server.go @@ -336,9 +336,11 @@ func staticResourceMiddleware() gin.HandlerFunc { log.Fatal(err) } + // 设置图片缓存有效期为一年 (365天) + c.Header("Cache-Control", "max-age=31536000, public") // 直接输出图像数据流 c.Data(http.StatusOK, "image/jpeg", buffer.Bytes()) - return + c.Abort() // 中断请求 } c.Next() } diff --git a/api/main.go b/api/main.go index c6e5b6bf..9d76db9c 100644 --- a/api/main.go +++ b/api/main.go @@ -165,6 +165,11 @@ func main() { // MidJourney service pool fx.Provide(mj.NewServicePool), + fx.Invoke(func(pool *mj.ServicePool) { + if pool.HasAvailableService() { + pool.DownloadImages() + } + }), // Stable Diffusion 机器人 fx.Provide(sd.NewServicePool), diff --git a/api/service/mj/pool.go b/api/service/mj/pool.go index 38289760..6fd5fd48 100644 --- a/api/service/mj/pool.go +++ b/api/service/mj/pool.go @@ -4,7 +4,9 @@ import ( "chatplus/core/types" "chatplus/service/oss" "chatplus/store" + "chatplus/store/model" "fmt" + "time" "github.com/go-redis/redis/v8" "gorm.io/gorm" @@ -12,8 +14,10 @@ import ( // ServicePool Mj service pool type ServicePool struct { - services []*Service - taskQueue *store.RedisQueue + services []*Service + taskQueue *store.RedisQueue + db *gorm.DB + uploaderManager *oss.UploaderManager } func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig) *ServicePool { @@ -29,7 +33,7 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa name := fmt.Sprintf("MjService-%d", k) // create mj service - service := NewService(name, queue, 4, 600, db, client, manager, appConfig.ProxyURL) + service := NewService(name, queue, 4, 600, db, client) botName := fmt.Sprintf("MjBot-%d", k) bot, err := NewBot(botName, appConfig.ProxyURL, &config, service) if err != nil { @@ -50,11 +54,39 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa } return &ServicePool{ - taskQueue: queue, - services: services, + taskQueue: queue, + services: services, + uploaderManager: manager, + db: db, } } +func (p *ServicePool) DownloadImages() { + go func() { + var items []model.MidJourneyJob + for { + res := p.db.Where("img_url = ? AND progress = ?", "", 100).Find(&items) + if res.Error != nil { + continue + } + + // download images + for _, item := range items { + imgURL, err := p.uploaderManager.GetUploadHandler().PutImg(item.OrgURL, true) + if err != nil { + logger.Error("error with download image: ", err) + continue + } + + item.ImgURL = imgURL + p.db.Updates(&item) + } + + time.Sleep(time.Second * 5) + } + }() +} + // PushTask push a new mj task in to task queue func (p *ServicePool) PushTask(task types.MjTask) { logger.Debugf("add a new MidJourney task to the task list: %+v", task) diff --git a/api/service/mj/service.go b/api/service/mj/service.go index 49d94edc..3b3d6e7c 100644 --- a/api/service/mj/service.go +++ b/api/service/mj/service.go @@ -2,7 +2,6 @@ package mj import ( "chatplus/core/types" - "chatplus/service/oss" "chatplus/store" "chatplus/store/model" "gorm.io/gorm" @@ -17,24 +16,20 @@ type Service struct { client *Client // MJ client taskQueue *store.RedisQueue db *gorm.DB - uploadManager *oss.UploaderManager - proxyURL string maxHandleTaskNum int32 // max task number current service can handle handledTaskNum int32 // already handled task number taskStartTimes map[int]time.Time // task start time, to check if the task is timeout taskTimeout int64 } -func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout int64, db *gorm.DB, client *Client, manager *oss.UploaderManager, proxy string) *Service { +func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout int64, db *gorm.DB, client *Client) *Service { return &Service{ name: name, db: db, taskQueue: queue, client: client, - uploadManager: manager, taskTimeout: timeout, maxHandleTaskNum: maxTaskNum, - proxyURL: proxy, taskStartTimes: make(map[int]time.Time, 0), } } @@ -146,17 +141,6 @@ func (s *Service) Notify(data CBReq) { return } - // upload image - if data.Status == Finished { - imgURL, err := s.uploadManager.GetUploadHandler().PutImg(data.Image.URL, true) - if err != nil { - logger.Error("error with download img: ", err.Error()) - return - } - job.ImgURL = imgURL - s.db.Updates(&job) - } - if data.Status == Finished { // release lock task atomic.AddInt32(&s.handledTaskNum, -1) diff --git a/web/src/assets/iconfont/iconfont.css b/web/src/assets/iconfont/iconfont.css index f9fb659a..a16a9c4e 100644 --- a/web/src/assets/iconfont/iconfont.css +++ b/web/src/assets/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4125778 */ - src: url('iconfont.woff2?t=1702024026523') format('woff2'), - url('iconfont.woff?t=1702024026523') format('woff'), - url('iconfont.ttf?t=1702024026523') format('truetype'); + src: url('iconfont.woff2?t=1703124384910') format('woff2'), + url('iconfont.woff?t=1703124384910') format('woff'), + url('iconfont.ttf?t=1703124384910') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-loading:before { + content: "\e627"; +} + .icon-alipay:before { content: "\e634"; } diff --git a/web/src/assets/iconfont/iconfont.js b/web/src/assets/iconfont/iconfont.js index ab90b064..6521c8f0 100644 --- a/web/src/assets/iconfont/iconfont.js +++ b/web/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4125778='',function(a){var l=(l=document.getElementsByTagName("script"))[l.length-1],c=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var t,o,i,h,e,s=function(l,c){c.parentNode.insertBefore(l,c)};if(c&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}t=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?s(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,h=a.document,e=!1,z(),h.onreadystatechange=function(){"complete"==h.readyState&&(h.onreadystatechange=null,m())})}function m(){e||(e=!0,i())}function z(){try{h.documentElement.doScroll("left")}catch(l){return void setTimeout(z,50)}m()}}(window); \ No newline at end of file +window._iconfont_svg_string_4125778='',function(a){var l=(l=document.getElementsByTagName("script"))[l.length-1],c=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var t,o,i,h,e,s=function(l,c){c.parentNode.insertBefore(l,c)};if(c&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}t=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?s(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,h=a.document,e=!1,z(),h.onreadystatechange=function(){"complete"==h.readyState&&(h.onreadystatechange=null,m())})}function m(){e||(e=!0,i())}function z(){try{h.documentElement.doScroll("left")}catch(l){return void setTimeout(z,50)}m()}}(window); \ No newline at end of file diff --git a/web/src/assets/iconfont/iconfont.json b/web/src/assets/iconfont/iconfont.json index 6e99ab74..ea413f94 100644 --- a/web/src/assets/iconfont/iconfont.json +++ b/web/src/assets/iconfont/iconfont.json @@ -5,6 +5,13 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "1278349", + "name": "loading", + "font_class": "loading", + "unicode": "e627", + "unicode_decimal": 58919 + }, { "icon_id": "1486848", "name": "支付宝支付", diff --git a/web/src/assets/iconfont/iconfont.ttf b/web/src/assets/iconfont/iconfont.ttf index df9a3753dd711555a4f1400aaee4bc39b7077217..70c1c35072148410061383d3afa8fdd56941aec8 100644 GIT binary patch delta 1367 zcmZ{iUuauZ9LK-s-ZV**-lWaHt~Jflq-ko>MsJMW%0jH5owzxM_-Dev1v^t+|Dk28 zZkQ)g=F3J9e9%28j83JLZ44$wecF&cOk|TWQ8tv5Jd{x%^sSBGlhdLv-pl8ld(Q9N zbAIRh{as#IJAUTT>g1nSz5|R;0LPWe^gFLV7W~KsxR!uNR;G@YC)4}xl>po$qf?x4 zUv<3C?^QA|HM6j|e7pHOAl5kkdV21)af8juUyKny8 zJmL7mJk7BihMMK0{>#>4;#Tc}xcc~VYYedjv-LI1-osOu;Si^|asuOMgHyIikL-{E z8I=i{uH7~EigYb*p7g8zCU9{3t$l0mtiFW*djX4?48nyW?wW!ZNyLzVgS({R!^7xj zo}Ji%cK8uyE*S*jL;xZ5p%+o+7Qs#opaVUKqYK@5h$%SL#kQZ?bB?vzyy>lWs2Rh( zHJLcKGN++9khX?0K^8R1Sjpm1P&&vl4XUgr$*NRP zPsni%m4$p-LyaN#X{a{joQAqXp3u+%$PYF20`fBrU4cBOp+Au4HFOG+#adMjO@q9l zp?#2dHLA$!XEn4G_1hYni~1c6ZASe!4Gl;Afri$jaYTbS`-+C;fW|Qm3!{q02OJPp zBdzDO@QK4>-8g5go73ixj*#O^=dAOZ>pl1L?(^;YJ@Bl08yyF%H?421TfTy?;s4yf z-uZ6lPhF?FE(bh;rC=tw89E+59C;@4X=J5)fA<|#Kh2NLU(E_r4Abl^cH>DriC=JCkiEzj|ns33`O#zg~3!}urQjBgq*2DP9%IH6chQ92*!lZ$QdOgBDU5gg3hg# zBF9*au|eal-r>Su?ywCxGo7RP#$$$T=ok^MLHO2D$JDLbFCtW@3>H^Z4?CQ}^u z4Mn3v(T)4T?Fi$hv$wV1NKenmMoeuuVQ;Ga^2wr(sIXZ4?>`$C!h5pWJz4RCzc1a_ tm);x*whmIq*?A?k(QIBi>BLGWePY)Ly&&*Md=SW3QUu^in;`$fB zSmpd)Z~vLdpV1#YZ{N-NslLeYfYD^^<$i$k;Q2^jm-kNNLta(QnB4>Y7u~UVMROCd zZ=8p2Pt27c48h=8VsGrl zwe2Rvr{E|7_&3h8p;oPY!ZX9Ka?NArtv1 zK{=cVU<D1tQw{Qp_U3J1+i(E9)!{; zm?%WuMU-6P(=d5Rahf<-2c%TPiXdu}ur^3Y!zv*=G^`g=t6}AkdJTf?`BD_hBjHO? zP!~vph6+IrXs8t=%=i-Kp=|btH53riqEXL5`ZZ~VhBzja7jjKQp&_?4lpHdpq42$od)qD4)_ukGzrNG4edg5QA6X9{Gg$QNPg1LOeDW*Xe&~uH8dEhZVjzQ z>YRqABXw1SLdF9|+pu6nEqRuxW!ZYfI%WoKD;bR$KkaWE#g6&R!K|Im4(BV^lDp1* z!u=q-!xQjCJ>R^?yx(&|IU~Lj-*j#)cQtPz|E1sOuk_Csw9Yv@T>t<8 diff --git a/web/src/assets/iconfont/iconfont.woff b/web/src/assets/iconfont/iconfont.woff index abfc99eba83ef23669ae2904c186348f926d2c4a..bba70a0d33afbb402f623ecf2574f7f781268297 100644 GIT binary patch delta 9977 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

~}@HnmB-20%9fQ%zdsCV`MsXC9O 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 D3YH7y delta 9784 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±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 S>cR0!x_Zci;1>$NZPEZ#*_dJg diff --git a/web/src/assets/iconfont/iconfont.woff2 b/web/src/assets/iconfont/iconfont.woff2 index 3f951f4dfa5447b15ca0f339e3089386c6966d6b..5264eadc4bd65a0ab11fc8db033403614e5e1277 100644 GIT binary patch literal 9188 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 literal 9040 zcmV-WBd^?dPew8T0RR9103%QU3jhEB06H`P03!bY0RR9100000000000000000000 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

@@ -370,7 +370,11 @@