From 1687b995264cb93c2a01d56f75f63af43b3e4862 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 11 Apr 2024 14:16:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20GPU=20=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=20(#4468)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/dto/dashboard.go | 17 +++++ backend/app/service/dashboard.go | 21 ++++++ backend/init/migration/migrate.go | 1 + backend/init/migration/migrations/v_1_10.go | 10 +++ backend/utils/xpack/xpack.go | 5 +- cmd/server/docs/docs.go | 51 ++++++++++++++- cmd/server/docs/swagger.json | 51 ++++++++++++++- cmd/server/docs/swagger.yaml | 34 +++++++++- frontend/src/api/interface/dashboard.ts | 12 ++++ frontend/src/assets/iconfont/iconfont.css | 18 ++++-- frontend/src/assets/iconfont/iconfont.js | 2 +- frontend/src/assets/iconfont/iconfont.json | 22 +++++-- frontend/src/assets/iconfont/iconfont.svg | 6 +- frontend/src/assets/iconfont/iconfont.ttf | Bin 19504 -> 20264 bytes frontend/src/assets/iconfont/iconfont.woff | Bin 12336 -> 12812 bytes frontend/src/assets/iconfont/iconfont.woff2 | Bin 10508 -> 10868 bytes frontend/src/lang/modules/en.ts | 14 +++- frontend/src/lang/modules/tw.ts | 14 +++- frontend/src/lang/modules/zh.ts | 14 +++- frontend/src/views/home/index.vue | 1 + frontend/src/views/home/status/index.vue | 67 +++++++++++++++++++- 21 files changed, 335 insertions(+), 25 deletions(-) diff --git a/backend/app/dto/dashboard.go b/backend/app/dto/dashboard.go index 85fd9a8f7..94c07f3b7 100644 --- a/backend/app/dto/dashboard.go +++ b/backend/app/dto/dashboard.go @@ -69,6 +69,8 @@ type DashboardCurrent struct { NetBytesSent uint64 `json:"netBytesSent"` NetBytesRecv uint64 `json:"netBytesRecv"` + GPUData []GPUInfo `json:"gpuData"` + ShotTime time.Time `json:"shotTime"` } @@ -86,3 +88,18 @@ type DiskInfo struct { InodesFree uint64 `json:"inodesFree"` InodesUsedPercent float64 `json:"inodesUsedPercent"` } + +type GPUInfo struct { + Index uint `json:"index"` + ProductName string `json:"productName"` + GPUUtil string `json:"gpuUtil"` + Temperature string `json:"temperature"` + PerformanceState string `json:"performanceState"` + PowerUsage string `json:"powerUsage"` + PowerDraw string `json:"powerDraw"` + MaxPowerLimit string `json:"maxPowerLimit"` + MemoryUsage string `json:"memoryUsage"` + MemUsed string `json:"memUsed"` + MemTotal string `json:"memTotal"` + FanSpeed string `json:"fanSpeed"` +} diff --git a/backend/app/service/dashboard.go b/backend/app/service/dashboard.go index 5504b95a9..27e256f5b 100644 --- a/backend/app/service/dashboard.go +++ b/backend/app/service/dashboard.go @@ -11,6 +11,8 @@ import ( "github.com/1Panel-dev/1Panel/backend/app/dto" "github.com/1Panel-dev/1Panel/backend/global" "github.com/1Panel-dev/1Panel/backend/utils/cmd" + "github.com/1Panel-dev/1Panel/backend/utils/copier" + "github.com/1Panel-dev/1Panel/backend/utils/xpack" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/host" @@ -154,6 +156,7 @@ func (u *DashboardService) LoadCurrentInfo(ioOption string, netOption string) *d currentInfo.SwapMemoryUsedPercent = swapInfo.UsedPercent currentInfo.DiskData = loadDiskInfo() + currentInfo.GPUData = loadGPUInfo() if ioOption == "all" { diskInfo, _ := disk.IOCounters() @@ -289,3 +292,21 @@ func loadDiskInfo() []dto.DiskInfo { }) return datas } + +func loadGPUInfo() []dto.GPUInfo { + list := xpack.LoadGpuInfo() + if len(list) == 0 { + return nil + } + var data []dto.GPUInfo + for _, gpu := range list { + var dataItem dto.GPUInfo + if err := copier.Copy(&dataItem, &gpu); err != nil { + continue + } + dataItem.PowerUsage = dataItem.PowerDraw + " / " + dataItem.MaxPowerLimit + dataItem.MemoryUsage = dataItem.MemUsed + " / " + dataItem.MemTotal + data = append(data, dataItem) + } + return data +} diff --git a/backend/init/migration/migrate.go b/backend/init/migration/migrate.go index c0a6a532d..0850ec7e8 100644 --- a/backend/init/migration/migrate.go +++ b/backend/init/migration/migrate.go @@ -79,6 +79,7 @@ func Init() { migrations.AddCronjobCommand, migrations.NewMonitorDB, migrations.AddNoAuthSetting, + migrations.UpdateXpackHideMenu, }) if err := m.Migrate(); err != nil { global.LOG.Error(err) diff --git a/backend/init/migration/migrations/v_1_10.go b/backend/init/migration/migrations/v_1_10.go index 4ce0ca200..d7ae96cf9 100644 --- a/backend/init/migration/migrations/v_1_10.go +++ b/backend/init/migration/migrations/v_1_10.go @@ -118,3 +118,13 @@ var AddNoAuthSetting = &gormigrate.Migration{ return nil }, } + +var UpdateXpackHideMenu = &gormigrate.Migration{ + ID: "20240411-update-xpack-hide-menu", + Migrate: func(tx *gorm.DB) error { + if err := tx.Model(&model.Setting{}).Where("key", "XpackHideMenu").Updates(map[string]interface{}{"value": "{\"id\":\"1\",\"label\":\"/xpack\",\"isCheck\":true,\"title\":\"xpack.menu\",\"children\":[{\"id\":\"2\",\"title\":\"xpack.waf.name\",\"path\":\"/xpack/waf/dashboard\",\"label\":\"Dashboard\",\"isCheck\":true},{\"id\":\"3\",\"title\":\"xpack.tamper.tamper\",\"path\":\"/xpack/tamper\",\"label\":\"Tamper\",\"isCheck\":true},{\"id\":\"4\",\"title\":\"xpack.gpu.gpu\",\"path\":\"/xpack/gpu\",\"label\":\"GPU\",\"isCheck\":true},{\"id\":\"5\",\"title\":\"xpack.setting.setting\",\"path\":\"/xpack/setting\",\"label\":\"XSetting\",\"isCheck\":true}]}"}).Error; err != nil { + return err + } + return nil + }, +} diff --git a/backend/utils/xpack/xpack.go b/backend/utils/xpack/xpack.go index 9c5ba63b1..31a3b18fe 100644 --- a/backend/utils/xpack/xpack.go +++ b/backend/utils/xpack/xpack.go @@ -2,5 +2,8 @@ package xpack -func RemoveTamper(website string) { +func RemoveTamper(website string) {} + +func LoadGpuInfo() []interface{} { + return nil } diff --git a/cmd/server/docs/docs.go b/cmd/server/docs/docs.go index b2456f1d0..952d50d16 100644 --- a/cmd/server/docs/docs.go +++ b/cmd/server/docs/docs.go @@ -15194,6 +15194,12 @@ const docTemplate = `{ "$ref": "#/definitions/dto.DiskInfo" } }, + "gpuData": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.GPUInfo" + } + }, "ioCount": { "type": "integer" }, @@ -15777,6 +15783,47 @@ const docTemplate = `{ } } }, + "dto.GPUInfo": { + "type": "object", + "properties": { + "fanSpeed": { + "type": "string" + }, + "gpuUtil": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "maxPowerLimit": { + "type": "string" + }, + "memTotal": { + "type": "string" + }, + "memUsed": { + "type": "string" + }, + "memoryUsage": { + "type": "string" + }, + "performanceState": { + "type": "string" + }, + "powerDraw": { + "type": "string" + }, + "powerUsage": { + "type": "string" + }, + "productName": { + "type": "string" + }, + "temperature": { + "type": "string" + } + } + }, "dto.GenerateLoad": { "type": "object", "required": [ @@ -17788,6 +17835,9 @@ const docTemplate = `{ "monitorStoreDays": { "type": "string" }, + "noAuthSetting": { + "type": "string" + }, "ntpSite": { "type": "string" }, @@ -18915,7 +18965,6 @@ const docTemplate = `{ "request.FileCreate": { "type": "object", "required": [ - "mode", "path" ], "properties": { diff --git a/cmd/server/docs/swagger.json b/cmd/server/docs/swagger.json index 646c17d02..6116f4a93 100644 --- a/cmd/server/docs/swagger.json +++ b/cmd/server/docs/swagger.json @@ -15187,6 +15187,12 @@ "$ref": "#/definitions/dto.DiskInfo" } }, + "gpuData": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.GPUInfo" + } + }, "ioCount": { "type": "integer" }, @@ -15770,6 +15776,47 @@ } } }, + "dto.GPUInfo": { + "type": "object", + "properties": { + "fanSpeed": { + "type": "string" + }, + "gpuUtil": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "maxPowerLimit": { + "type": "string" + }, + "memTotal": { + "type": "string" + }, + "memUsed": { + "type": "string" + }, + "memoryUsage": { + "type": "string" + }, + "performanceState": { + "type": "string" + }, + "powerDraw": { + "type": "string" + }, + "powerUsage": { + "type": "string" + }, + "productName": { + "type": "string" + }, + "temperature": { + "type": "string" + } + } + }, "dto.GenerateLoad": { "type": "object", "required": [ @@ -17781,6 +17828,9 @@ "monitorStoreDays": { "type": "string" }, + "noAuthSetting": { + "type": "string" + }, "ntpSite": { "type": "string" }, @@ -18908,7 +18958,6 @@ "request.FileCreate": { "type": "object", "required": [ - "mode", "path" ], "properties": { diff --git a/cmd/server/docs/swagger.yaml b/cmd/server/docs/swagger.yaml index 9092b3491..6200df8f4 100644 --- a/cmd/server/docs/swagger.yaml +++ b/cmd/server/docs/swagger.yaml @@ -795,6 +795,10 @@ definitions: items: $ref: '#/definitions/dto.DiskInfo' type: array + gpuData: + items: + $ref: '#/definitions/dto.GPUInfo' + type: array ioCount: type: integer ioReadBytes: @@ -1190,6 +1194,33 @@ definitions: - type - vars type: object + dto.GPUInfo: + properties: + fanSpeed: + type: string + gpuUtil: + type: string + index: + type: integer + maxPowerLimit: + type: string + memTotal: + type: string + memUsed: + type: string + memoryUsage: + type: string + performanceState: + type: string + powerDraw: + type: string + powerUsage: + type: string + productName: + type: string + temperature: + type: string + type: object dto.GenerateLoad: properties: encryptionMode: @@ -2550,6 +2581,8 @@ definitions: type: string monitorStoreDays: type: string + noAuthSetting: + type: string ntpSite: type: string panelName: @@ -3311,7 +3344,6 @@ definitions: sub: type: boolean required: - - mode - path type: object request.FileDeCompress: diff --git a/frontend/src/api/interface/dashboard.ts b/frontend/src/api/interface/dashboard.ts index 930addb71..30730631c 100644 --- a/frontend/src/api/interface/dashboard.ts +++ b/frontend/src/api/interface/dashboard.ts @@ -59,6 +59,8 @@ export namespace Dashboard { diskData: Array; + gpuData: Array; + netBytesSent: number; netBytesRecv: number; @@ -78,4 +80,14 @@ export namespace Dashboard { inodesFree: number; inodesUsedPercent: number; } + export interface GPUInfo { + index: number; + productName: string; + gpuUtil: string; + temperature: string; + performanceState: string; + powerUsage: string; + memoryUsage: string; + fanSpeed: string; + } } diff --git a/frontend/src/assets/iconfont/iconfont.css b/frontend/src/assets/iconfont/iconfont.css index 3402a8aa3..af01b2750 100644 --- a/frontend/src/assets/iconfont/iconfont.css +++ b/frontend/src/assets/iconfont/iconfont.css @@ -1,9 +1,9 @@ @font-face { font-family: "panel"; /* Project id 3575356 */ - src: url('iconfont.woff2?t=1712045188451') format('woff2'), - url('iconfont.woff?t=1712045188451') format('woff'), - url('iconfont.ttf?t=1712045188451') format('truetype'), - url('iconfont.svg?t=1712045188451#panel') format('svg'); + src: url('iconfont.woff2?t=1712805038256') format('woff2'), + url('iconfont.woff?t=1712805038256') format('woff'), + url('iconfont.ttf?t=1712805038256') format('truetype'), + url('iconfont.svg?t=1712805038256#panel') format('svg'); } .panel { @@ -15,7 +15,15 @@ } .p-xpack:before { - content: "\eb70"; + content: "\e604"; +} + +.p-gpu-2:before { + content: "\e6d8"; +} + +.p-gpu-1:before { + content: "\e623"; } .p-waf-4:before { diff --git a/frontend/src/assets/iconfont/iconfont.js b/frontend/src/assets/iconfont/iconfont.js index 763ee230f..f1c2d4f08 100644 --- a/frontend/src/assets/iconfont/iconfont.js +++ b/frontend/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_3575356='',function(c){var l=(l=document.getElementsByTagName("script"))[l.length-1],h=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,t,v,p,z,i=function(l,h){h.parentNode.insertBefore(l,h)};if(h&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}a=function(){var l,h=document.createElement("div");h.innerHTML=c._iconfont_svg_string_3575356,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(l=document.body).firstChild?i(h,l.firstChild):l.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(v=a,p=c.document,z=!1,d(),p.onreadystatechange=function(){"complete"==p.readyState&&(p.onreadystatechange=null,m())})}function m(){z||(z=!0,v())}function d(){try{p.documentElement.doScroll("left")}catch(l){return void setTimeout(d,50)}m()}}(window); \ No newline at end of file +window._iconfont_svg_string_3575356='',function(c){var l=(l=document.getElementsByTagName("script"))[l.length-1],h=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,t,v,p,z,i=function(l,h){h.parentNode.insertBefore(l,h)};if(h&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}a=function(){var l,h=document.createElement("div");h.innerHTML=c._iconfont_svg_string_3575356,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(l=document.body).firstChild?i(h,l.firstChild):l.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(v=a,p=c.document,z=!1,d(),p.onreadystatechange=function(){"complete"==p.readyState&&(p.onreadystatechange=null,m())})}function m(){z||(z=!0,v())}function d(){try{p.documentElement.doScroll("left")}catch(l){return void setTimeout(d,50)}m()}}(window); \ No newline at end of file diff --git a/frontend/src/assets/iconfont/iconfont.json b/frontend/src/assets/iconfont/iconfont.json index 14cdccf1d..b270e0992 100644 --- a/frontend/src/assets/iconfont/iconfont.json +++ b/frontend/src/assets/iconfont/iconfont.json @@ -6,11 +6,25 @@ "description": "", "glyphs": [ { - "icon_id": "5387846", - "name": "钻石_o", + "icon_id": "4657672", + "name": "会员", "font_class": "xpack", - "unicode": "eb70", - "unicode_decimal": 60272 + "unicode": "e604", + "unicode_decimal": 58884 + }, + { + "icon_id": "640495", + "name": "详细信息", + "font_class": "gpu-2", + "unicode": "e6d8", + "unicode_decimal": 59096 + }, + { + "icon_id": "6176565", + "name": "监控", + "font_class": "gpu-1", + "unicode": "e623", + "unicode_decimal": 58915 }, { "icon_id": "8229531", diff --git a/frontend/src/assets/iconfont/iconfont.svg b/frontend/src/assets/iconfont/iconfont.svg index c063f5457..ae67d6d1e 100644 --- a/frontend/src/assets/iconfont/iconfont.svg +++ b/frontend/src/assets/iconfont/iconfont.svg @@ -14,7 +14,11 @@ /> - + + + + + diff --git a/frontend/src/assets/iconfont/iconfont.ttf b/frontend/src/assets/iconfont/iconfont.ttf index fe17259badf859097c9abbd7ef8270ff217b1c61..1ecd756911cb8a2c32affdc3efec9af42492db70 100644 GIT binary patch delta 2419 zcmZ{lZEPGz9mb#8x4YZB+}ghLoqZQOw$Hmx94AeDXFDN@lQynh3aLT}l?f=p*l`R^ zTr0T2pooQtv?hwG!d29jsx}f56jW89gno)DD6}-q7m7+0q=JGQ%^frXL|a};yvMVd z8eCL%_BXrpwlnj8p1J$sf_VB#@yI6s7gshu4rn(4>+F%EUz&Wb@7QU;P6IptF?D!s zqI>H-qX4dv{wY@2zIB}M7fI*TvDvwXAJ^Un#0^q+^#1X&{%5=l5SwTFnPX#fGvW~5 zVOtZ+ZPR1N4v);I4B+kr=iEJW{})!x&YZg034C-fD}MdWi-ny-5bR6LhM&K9$l3l5 z;vB$hafi8K`C0pC&9}a%pJF)*Ev)4gjvFesir30lw5Ic#W{Pd2w<@9SgMRC+hff>O zM`36lyH8*jOmt!rvs&@hg4ASG*2%1Fk%jUddO=(*Pv~nKZtSVm*m=1Vq)|SnuV>>c z`dTAwEdSITFMrBN`ZG9=S*8;onC9^QbP^B#PnyREC18;2+=*s%paBK$WIJ}F3kKSe z;OcFpP{*A`Kg-Qz5W^0vg^NaP!8U9~1oiM>A&K?qVYHfX2Xe?`HCoV$HE2T`8?X_# zVG}l^7e$nCJF@6Q9R28qgAZXH2C#}Dwz$=)@Ir#RL1iH)0YA(rGUOK(lpFG- zg2F?dQqTgB4=HE{$e$@_3&@uhGzjEXMR>5}qJpM@d_zI|KwekSNIs-wfzVTs6$RY| zSyj+ykbh9nagcvh(0hF3ke8V4KCWs;c#*{P-jO}}bB*!*(N&Yj8|`R@GQ{E7VQtKV%|+j6~if9tcY zudlhug+yw#+9gBi19W|cy0%b~&d{Jj_X=i5M7J_oktuHO9T0=UOvOaX%!{~i{ehT> z=tXltkLdrZM3YOkWOUKeBBB~iB%eZYJ7WAdBjZ7S zV(6-POKgejiQvU(IugX9Q4vJaUBRQ`KC!I^O^D!?U|Kw)X~Dzd`z-1r2*fQxYA@*1 z`XJ&yRV&Z|!}tgeVw%6eU%?r`Ep%Av%r?>6U-BX=-n&-3XO}yy7af-Cbury0+B>Yq z`gEq)-aF9WS1(cpuTP|{LVJhTS6}Kcw%4b#Yz#l&BEs>0Z~qPv&e2yCE55yQPVtR{ zw&U3UFB@^}H^O#i;>(?%AKhhGT5zGcdtFXDkW1AEFZ|_(A?%30^j#wnH-(pUvce7? zI30JK_-WgBoX&mw#O=$U`0vM@Yfi@DJ?At!ycgA@nZsCqV$;c~yG%{@a!aw?x=gxR zoEL6TwIV^$vJ-~(cij#yWmB1II0qNU*-q~Z7T)*8@He#PzonnkQ*?j$PtwElx|Qx9 z#t1%+{rC)p_)p||GYqWNRbTQL&E+8Xn~XFg$ts3Xr(i5l4;HdCTiCKWEDW%~;Ve*w zl`VcrA6`1)mP)R6hI!UBmW~>xX=slc=F(+P%z0ig?|E&BHr|hUuIoMKdY=1jkJs6f zD_(Q^`rM$$Eqy}#RyR#OC~)+XuJAnJia)Qp+}3t^&2ev!>+bQMcZ0WGS0vm8@3_aC srzU~(hwSd1VyJxP!(Y#eA#o?nxtX!?`^+OV4{YeYm2W=Zcz0g=H(qoRBme*a delta 1643 zcmZ{kUr1zC9LK-sUgwW9j*iaczfo5mSIc$F%~q{+beC|2-o_p@S zzwh^Z=JH4Ci;L>L*7SGtA0G#dJAga+%EW8q>DHEUAb$tw?o5ouMw{zv+yH(i?FnA+ zrQJ!6*GWTSawg^bGPesT-mkn9Q}LL0cQ4EJqnv+hGL}lJm*LEp^St(4Y;tU1DU=5c zH1M5IB&W^?W?~n2P5{p&c;UwKdbFnxiuaPc-7j1_UDUM;KNs+K>)7PM!0B^$b7}V_ zbAgw=Fb<{<)}YU-Q9oGiMsUq%xK#DGdVX@$|hTLR~h#Pt8R8T_-Qu<)<8 zi2rUt7fzrXWvE3Eb$ARXahRnZf-ix3R$YujxLHmZ9z2dlL=i$e9z_RSC_)4BP=E)} zj8gQX92KZU1XZX;4N7nXEjWq?@eo>Z3=g9R_n{5>cm($&fKD{wIOXzNL#_$cWqt07 zST|j>Rxr<-E^xFqtNv2_Ue4!&r3y6EXcJfhHlqTIf#xj^EDM@0JFq}#y6C`C zsk*?Tp_x7hmJjVoI|rT|X73do`*o2(b)cPx5yxj;Do`+J=jDXbL01bD5!#s}loPs9 zps>)*0wsoS5s(gZ&?-=O=uUwSKvMw+dI3Ek&=u(C1^NU1l0c`R;{rW{9uw#u^teDD zp=Sj;3Oxs;odeBu--5zx#2SAh|M)&j!0$VSy-)t&00>baT^`4Ju< zmoqOJt4y$)yCJ}|haGQKT~pK(Q5{XuLn>;jwvMPrnIY9tSEiO#e!PEVe*VT>D*ox} z>)EAu&YWLXjk7D+vuo<>H5J)f-O7HYo@`!SZO(3}Gd$Z+o!J-F)&2do{=m^5)n`pV Rx9EW@m5jyDt_21o#-D!|e6;`o diff --git a/frontend/src/assets/iconfont/iconfont.woff b/frontend/src/assets/iconfont/iconfont.woff index 6101c65d6a8084132ada5f66f5d0343fc56ebf99..c526804ec46249440987ceab6f5494543f4b03bf 100644 GIT binary patch delta 12365 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�BWMo#~_4idzJH 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 diff --git a/frontend/src/assets/iconfont/iconfont.woff2 b/frontend/src/assets/iconfont/iconfont.woff2 index 716cc5a47447260739bc4b6604533ba2814e5464..8eed41e8904b2308d3d996c7ff5c6d77c7b3c06c 100644 GIT binary patch literal 10868 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 OBo5%$PR=tnyR-m36f7D5 diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 6747bdaf6..40c76c3d9 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -892,6 +892,13 @@ const message = { up: 'Up', down: 'Down', interval: 'Interval(min)', + + gpuUtil: 'GPU Utilization', + temperature: 'Temperature', + performanceState: 'Performance State', + powerUsage: 'Power Usage', + memoryUsage: 'Memory Usage', + fanSpeed: 'Fan Speed', }, terminal: { conn: 'connection', @@ -1505,10 +1512,11 @@ const message = { knowMorePro: 'Learn More', closeAlert: 'The current page can be closed in the panel settings', introduce: 'Feature Introduction', - waf: 'Upgrade to the professional version to get interception maps, logs, blocking records, geographical location blocking, custom rules, custom blocking pages and other functions', - tamper: '1Panel tamper-proof function is a security measure used to protect a website from unauthorized modifications or tampering.', + waf: 'Upgrading to the professional version can provide features such as interception map, logs, block records, geographical location blocking, custom rules, custom interception pages, etc.', + tamper: 'Upgrading to the professional version can protect websites from unauthorized modifications or tampering.', + gpu: 'Upgrading to the professional version can help users visually monitor important parameters of GPU such as workload, temperature, memory usage in real time.', setting: - '1Panel interface settings function allow you to customize panel logos, welcome messages, and other information.', + 'Upgrading to the professional version allows customization of panel logo, welcome message, and other information.', }, clean: { scan: 'Start Scanning', diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts index 2a39d3288..d39023162 100644 --- a/frontend/src/lang/modules/tw.ts +++ b/frontend/src/lang/modules/tw.ts @@ -852,6 +852,13 @@ const message = { up: '上行', down: '下行', interval: '采集間隔(分鐘)', + + gpuUtil: 'GPU 使用率', + temperature: '溫度', + performanceState: '性能狀態', + powerUsage: '功耗', + memoryUsage: '顯存使用率', + fanSpeed: '風扇轉速', }, terminal: { conn: '連接', @@ -1404,9 +1411,10 @@ const message = { knowMorePro: '了解更多', closeAlert: '當前頁面可在面板設置中關閉顯示', introduce: '功能介紹', - waf: '升級專業版可以獲得攔截地圖、日誌、封鎖記錄、地理位置封鎖、自訂規則、自訂攔截頁面等功能', - tamper: '1Panel 防篡改功能是一種用於保護網站免受未經授權的修改或篡改的安全措施。', - setting: '1Panel 介面設置功能可自定義面板 Logo、歡迎簡介等信息。', + waf: '升級專業版可以獲得攔截地圖、日誌、封鎖記錄、地理位置封禁、自定義規則、自定義攔截頁面等功能。', + tamper: '升級專業版可以保護網站免受未經授權的修改或篡改。', + gpu: '升級專業版可以幫助用戶實時直觀查看到 GPU 的工作負載、溫度、顯存等重要參數。', + setting: '升級專業版可以自定義面板 Logo、歡迎簡介等信息。', }, clean: { scan: '開始掃描', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 2b1ce36d2..57b3ddfbf 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -853,6 +853,13 @@ const message = { up: '上行', down: '下行', interval: '采集间隔(分钟)', + + gpuUtil: 'GPU 使用率', + temperature: '温度', + performanceState: '性能状态', + powerUsage: '功耗', + memoryUsage: '显存使用率', + fanSpeed: '风扇转速', }, terminal: { conn: '连接', @@ -1405,9 +1412,10 @@ const message = { knowMorePro: '了解更多', closeAlert: '当前页面可在面板设置中关闭显示', introduce: '功能介绍', - waf: '升级专业版可以获得拦截地图、日志、封锁记录、地理位置封禁、自定义规则、自定义拦截页面等功能', - tamper: '1Panel 防篡改功能是一种用于保护网站免受未经授权的修改或篡改的安全措施。', - setting: '1Panel 界面设置功能可自定义面板 Logo、欢迎简介等信息。', + waf: '升级专业版可以获得拦截地图、日志、封锁记录、地理位置封禁、自定义规则、自定义拦截页面等功能。', + tamper: '升级专业版可以保护网站免受未经授权的修改或篡改。', + gpu: '升级专业版可以帮助用户实时直观查看到 GPU 的工作负载、温度、显存等重要参数。', + setting: '升级专业版可以自定义面板 Logo、欢迎简介等信息。', }, clean: { scan: '开始扫描', diff --git a/frontend/src/views/home/index.vue b/frontend/src/views/home/index.vue index 39127b1c3..489dc2e28 100644 --- a/frontend/src/views/home/index.vue +++ b/frontend/src/views/home/index.vue @@ -336,6 +336,7 @@ const currentInfo = ref({ ioWriteTime: 0, diskData: [], + gpuData: [], netBytesSent: 0, netBytesRecv: 0, diff --git a/frontend/src/views/home/status/index.vue b/frontend/src/views/home/status/index.vue index 288279a54..d3c2e198e 100644 --- a/frontend/src/views/home/status/index.vue +++ b/frontend/src/views/home/status/index.vue @@ -161,6 +161,59 @@ {{ computeSize(item.used) }} / {{ computeSize(item.total) }} + {{ $t('tabs.more') }} @@ -183,6 +236,7 @@