Clean up analytic code, update Simplified Chinese translations.

This commit is contained in:
0xJacky 2022-02-23 21:40:43 +08:00
parent 46e86d2a3d
commit 42417e806d
17 changed files with 638 additions and 286 deletions

View file

@ -8,6 +8,9 @@ import Vue from 'vue'
Vue.use(VueApexCharts) Vue.use(VueApexCharts)
Vue.component('apexchart', VueApexCharts) Vue.component('apexchart', VueApexCharts)
const fontColor = () => {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? '#b4b4b4' : undefined
}
export default { export default {
name: 'CPUChart', name: 'CPUChart',
props: { props: {
@ -21,6 +24,47 @@ export default {
} }
} }
}, },
mounted() {
let media = window.matchMedia('(prefers-color-scheme: dark)')
let callback = () => {
this.chartOptions.xaxis = {
type: 'datetime',
labels: {
datetimeUTC: false,
style: {
colors: fontColor()
}
}
}
this.chartOptions.yaxis = {
max: 100,
tickAmount: 4,
min: 0,
labels: {
style: {
colors: fontColor()
}
}
}
this.chartOptions.legend = {
labels: {
colors: fontColor()
},
onItemClick: {
toggleDataSeries: false
},
onItemHover: {
highlightDataSeries: false
},
}
this.$refs.chart.updateOptions(this.chartOptions)
}
if (typeof media.addEventListener === 'function') {
media.addEventListener('change', callback)
} else if (typeof media.addListener === 'function') {
media.addListener(callback)
}
},
data() { data() {
return { return {
chartOptions: { chartOptions: {
@ -54,7 +98,12 @@ export default {
}, },
xaxis: { xaxis: {
type: 'datetime', type: 'datetime',
labels: {datetimeUTC: false}, labels: {
datetimeUTC: false,
style: {
colors: fontColor()
}
}
}, },
tooltip: { tooltip: {
enabled: false enabled: false
@ -63,8 +112,16 @@ export default {
max: 100, max: 100,
tickAmount: 4, tickAmount: 4,
min: 0, min: 0,
labels: {
style: {
colors: fontColor()
}
}
}, },
legend: { legend: {
labels: {
colors: fontColor()
},
onItemClick: { onItemClick: {
toggleDataSeries: false toggleDataSeries: false
}, },

View file

@ -8,6 +8,10 @@ import Vue from 'vue'
Vue.use(VueApexCharts) Vue.use(VueApexCharts)
Vue.component('apexchart', VueApexCharts) Vue.component('apexchart', VueApexCharts)
const fontColor = () => {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? '#b4b4b4' : null
}
export default { export default {
name: 'DiskChart', name: 'DiskChart',
props: { props: {
@ -19,6 +23,46 @@ export default {
handler() { handler() {
this.$refs.chart.updateSeries(this.series) this.$refs.chart.updateSeries(this.series)
} }
},
},
mounted() {
let media = window.matchMedia('(prefers-color-scheme: dark)')
let callback = () => {
this.chartOptions.xaxis = {
type: 'datetime',
labels: {
datetimeUTC: false,
style: {
colors: fontColor()
}
}
}
this.chartOptions.yaxis = {
tickAmount: 3,
min: 0,
labels: {
style: {
colors: fontColor()
}
}
}
this.chartOptions.legend = {
labels: {
colors: fontColor()
},
onItemClick: {
toggleDataSeries: false
},
onItemHover: {
highlightDataSeries: false
},
}
this.$refs.chart.updateOptions(this.chartOptions)
}
if (typeof media.addEventListener === 'function') {
media.addEventListener('change', callback)
} else if (typeof media.addListener === 'function') {
media.addListener(callback)
} }
}, },
data() { data() {
@ -54,7 +98,12 @@ export default {
}, },
xaxis: { xaxis: {
type: 'datetime', type: 'datetime',
labels: {datetimeUTC: false}, labels: {
datetimeUTC: false,
style: {
colors: fontColor()
}
}
}, },
tooltip: { tooltip: {
enabled: false enabled: false
@ -62,8 +111,16 @@ export default {
yaxis: { yaxis: {
tickAmount: 3, tickAmount: 3,
min: 0, min: 0,
labels: {
style: {
colors: fontColor()
}
}
}, },
legend: { legend: {
labels: {
colors: fontColor()
},
onItemClick: { onItemClick: {
toggleDataSeries: false toggleDataSeries: false
}, },

View file

@ -8,6 +8,9 @@ import Vue from 'vue'
Vue.use(VueApexCharts) Vue.use(VueApexCharts)
Vue.component('apexchart', VueApexCharts) Vue.component('apexchart', VueApexCharts)
const fontColor = () => {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? '#b4b4b4' : undefined
}
export default { export default {
name: 'NetChart', name: 'NetChart',
props: { props: {
@ -21,6 +24,49 @@ export default {
} }
} }
}, },
mounted() {
let media = window.matchMedia('(prefers-color-scheme: dark)')
let callback = () => {
this.chartOptions.xaxis = {
type: 'datetime',
labels: {
datetimeUTC: false,
style: {
colors: fontColor()
}
}
}
this.chartOptions.yaxis = {
tickAmount: 3,
min: 0,
labels: {
style: {
colors: fontColor()
},
formatter: (bytes) => {
return this.bytesToSize(bytes) + '/s'
}
}
}
this.chartOptions.legend = {
labels: {
colors: fontColor()
},
onItemClick: {
toggleDataSeries: false
},
onItemHover: {
highlightDataSeries: false
},
}
this.$refs.chart.updateOptions(this.chartOptions)
}
if (typeof media.addEventListener === 'function') {
media.addEventListener('change', callback)
} else if (typeof media.addListener === 'function') {
media.addListener(callback)
}
},
data() { data() {
return { return {
chartOptions: { chartOptions: {
@ -54,7 +100,12 @@ export default {
}, },
xaxis: { xaxis: {
type: 'datetime', type: 'datetime',
labels: {datetimeUTC: false}, labels: {
datetimeUTC: false,
style: {
colors: fontColor()
}
}
}, },
tooltip: { tooltip: {
enabled: false enabled: false
@ -63,12 +114,18 @@ export default {
tickAmount: 3, tickAmount: 3,
min: 0, min: 0,
labels: { labels: {
style: {
colors: fontColor()
},
formatter: (bytes) => { formatter: (bytes) => {
return this.bytesToSize(bytes) + '/s' return this.bytesToSize(bytes) + '/s'
} }
} }
}, },
legend: { legend: {
labels: {
colors: fontColor()
},
onItemClick: { onItemClick: {
toggleDataSeries: false toggleDataSeries: false
}, },

View file

@ -1,6 +1,7 @@
<template> <template>
<div class="container"> <div class="container">
<p class="text">{{ centerText }}</p> <p class="text">{{ centerText }}</p>
<p class="bottom_text">{{ bottomText }}</p>
<apexchart type="radialBar" height="205" :options="chartOptions" :series="series" ref="chart"/> <apexchart type="radialBar" height="205" :options="chartOptions" :series="series" ref="chart"/>
</div> </div>
</template> </template>
@ -18,6 +19,7 @@ export default {
centerText: String, centerText: String,
colors: String, colors: String,
name: String, name: String,
bottomText: String,
}, },
watch: { watch: {
series: { series: {
@ -49,9 +51,7 @@ export default {
offsetY: 60, offsetY: 60,
fontSize: '14px', fontSize: '14px',
color: undefined, color: undefined,
formatter: function (val) { formatter: () => {return ''}
return val + "%";
}
} }
} }
} }
@ -87,7 +87,13 @@ export default {
top: calc(72px); top: calc(72px);
width: 100%; width: 100%;
text-align: center; text-align: center;
}
.bottom_text {
position: absolute;
top: calc(142px);
font-weight: 600;
width: 100%;
text-align: center;
} }
} }
</style> </style>

View file

@ -10,11 +10,15 @@ msgstr ""
"Generated-By: easygettext\n" "Generated-By: easygettext\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/router/index.js:100 #: src/views/other/Install.vue:50
msgid "<translate>Install</translate>"
msgstr ""
#: src/router/index.js:99
msgid "404 Not Found" msgid "404 Not Found"
msgstr "" msgstr ""
#: src/router/index.js:78 #: src/router/index.js:77
msgid "About" msgid "About"
msgstr "" msgstr ""
@ -24,7 +28,7 @@ msgid "Action"
msgstr "" msgstr ""
#: src/router/index.js:47 src/views/domain/DomainAdd.vue:18 #: src/router/index.js:47 src/views/domain/DomainAdd.vue:18
#: src/views/domain/DomainEdit.vue:45 #: src/views/domain/DomainEdit.vue:46
msgid "Add Site" msgid "Add Site"
msgstr "" msgstr ""
@ -77,6 +81,14 @@ msgstr ""
msgid "Configurations" msgid "Configurations"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:204
msgid "CPU Status"
msgstr ""
#: src/views/dashboard/DashBoard.vue:22
msgid "CPU:"
msgstr ""
#: src/views/user/User.vue:23 #: src/views/user/User.vue:23
msgid "Created at" msgid "Created at"
msgstr "" msgstr ""
@ -85,11 +97,11 @@ msgstr ""
msgid "Dashboard" msgid "Dashboard"
msgstr "" msgstr ""
#: src/views/other/Install.vue:105 #: src/views/other/Install.vue:106
msgid "Database (Optional, default: database)" msgid "Database (Optional, default: database)"
msgstr "" msgstr ""
#: src/router/index.js:126 #: src/router/index.js:125
msgid "Detected version update, this page will refresh." msgid "Detected version update, this page will refresh."
msgstr "" msgstr ""
@ -110,19 +122,23 @@ msgstr ""
msgid "Disabled successfully" msgid "Disabled successfully"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:282
msgid "Disk IO"
msgstr ""
#: src/views/domain/DomainEdit.vue:133 #: src/views/domain/DomainEdit.vue:133
msgid "Do you want to change the template to support the TLS?" msgid "Do you want to change the template to support the TLS?"
msgstr "" msgstr ""
#: src/views/domain/DomainEdit.vue:45 #: src/views/domain/DomainEdit.vue:46
msgid "Edit %{n}" msgid "Edit %{n}"
msgstr "" msgstr ""
#: src/router/index.js:68 src/views/config/ConfigEdit.vue:15 #: src/router/index.js:69 src/views/config/ConfigEdit.vue:15
msgid "Edit Configuration" msgid "Edit Configuration"
msgstr "" msgstr ""
#: src/views/domain/DomainEdit.vue:91 #: src/views/domain/DomainEdit.vue:92
msgid "Edit Configuration File" msgid "Edit Configuration File"
msgstr "" msgstr ""
@ -130,7 +146,7 @@ msgstr ""
msgid "Edit Site" msgid "Edit Site"
msgstr "" msgstr ""
#: src/views/other/Install.vue:31 #: src/views/other/Install.vue:32
msgid "Email (*)" msgid "Email (*)"
msgstr "" msgstr ""
@ -195,7 +211,7 @@ msgstr ""
msgid "Index (index)" msgid "Index (index)"
msgstr "" msgstr ""
#: src/router/index.js:88 src/views/other/Install.vue:50 #: src/router/index.js:87 src/views/other/Install.vue:51
msgid "Install" msgid "Install"
msgstr "" msgstr ""
@ -203,7 +219,7 @@ msgstr ""
msgid "Intermediate Certification Authorities: %{issuer}" msgid "Intermediate Certification Authorities: %{issuer}"
msgstr "" msgstr ""
#: src/views/other/Install.vue:46 #: src/views/other/Install.vue:47
msgid "Invalid E-mail!" msgid "Invalid E-mail!"
msgstr "" msgstr ""
@ -216,11 +232,11 @@ msgctxt "Project"
msgid "License" msgid "License"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:13 #: src/views/dashboard/DashBoard.vue:10
msgid "Load Averages:" msgid "Load Averages:"
msgstr "" msgstr ""
#: src/router/index.js:94 src/views/other/Login.vue:24 #: src/router/index.js:93 src/views/other/Login.vue:24
msgid "Login" msgid "Login"
msgstr "" msgstr ""
@ -251,7 +267,7 @@ msgstr ""
msgid "Manage Users" msgid "Manage Users"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:24 #: src/views/dashboard/DashBoard.vue:100
msgid "Memory" msgid "Memory"
msgstr "" msgstr ""
@ -259,7 +275,19 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: src/router/index.js:106 #: src/views/dashboard/DashBoard.vue:231
msgid "Network"
msgstr ""
#: src/views/dashboard/DashBoard.vue:165
msgid "Network Total Receive"
msgstr ""
#: src/views/dashboard/DashBoard.vue:174
msgid "Network Total Send"
msgstr ""
#: src/router/index.js:105
msgid "Not Found" msgid "Not Found"
msgstr "" msgstr ""
@ -273,27 +301,31 @@ msgid ""
"you need to get the certificate." "you need to get the certificate."
msgstr "" msgstr ""
#: src/router/index.js:130 #: src/router/index.js:129
msgid "OK" msgid "OK"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:16
msgid "OS:"
msgstr ""
#: src/views/other/Login.vue:56 src/views/user/User.vue:13 #: src/views/other/Login.vue:56 src/views/user/User.vue:13
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: src/views/other/Install.vue:83 #: src/views/other/Install.vue:84
msgid "Password (*)" msgid "Password (*)"
msgstr "" msgstr ""
#: src/views/other/Install.vue:50 #: src/views/other/Install.vue:51
msgid "Please input your E-mail!" msgid "Please input your E-mail!"
msgstr "" msgstr ""
#: src/views/other/Install.vue:96 src/views/other/Login.vue:69 #: src/views/other/Install.vue:97 src/views/other/Login.vue:69
msgid "Please input your password!" msgid "Please input your password!"
msgstr "" msgstr ""
#: src/views/other/Install.vue:73 src/views/other/Login.vue:46 #: src/views/other/Install.vue:74 src/views/other/Login.vue:46
msgid "Please input your username!" msgid "Please input your username!"
msgstr "" msgstr ""
@ -305,6 +337,14 @@ msgstr ""
msgid "Project Team" msgid "Project Team"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:61 src/views/dashboard/DashBoard.vue:305
msgid "Reads"
msgstr ""
#: src/views/dashboard/DashBoard.vue:51 src/views/dashboard/DashBoard.vue:240
msgid "Receive"
msgstr ""
#: src/views/domain/columns.js:16 #: src/views/domain/columns.js:16
msgid "Root Directory (root)" msgid "Root Directory (root)"
msgstr "" msgstr ""
@ -324,17 +364,21 @@ msgstr ""
msgid "Saved successfully" msgid "Saved successfully"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:54 src/views/dashboard/DashBoard.vue:254
msgid "Send"
msgstr ""
#: src/views/config/ConfigEdit.vue:35 src/views/domain/DomainEdit.vue:71 #: src/views/config/ConfigEdit.vue:35 src/views/domain/DomainEdit.vue:71
#: src/views/other/Login.vue:35 #: src/views/other/Login.vue:35
msgid "Server error" msgid "Server error"
msgstr "" msgstr ""
#: src/views/domain/columns.js:10 #: src/views/dashboard/DashBoard.vue:37
msgid "Server Names (server_name)" msgid "Server Info"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:38 #: src/views/domain/columns.js:10
msgid "Server Status" msgid "Server Names (server_name)"
msgstr "" msgstr ""
#: src/router/index.js:43 #: src/router/index.js:43
@ -345,7 +389,7 @@ msgstr ""
msgid "Status" msgid "Status"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:33 #: src/views/dashboard/DashBoard.vue:132
msgid "Storage" msgid "Storage"
msgstr "" msgstr ""
@ -353,7 +397,11 @@ msgstr ""
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "" msgstr ""
#: src/router/index.js:125 #: src/views/dashboard/DashBoard.vue:116
msgid "Swap"
msgstr ""
#: src/router/index.js:124
msgid "System message" msgid "System message"
msgstr "" msgstr ""
@ -365,7 +413,7 @@ msgid ""
"from Let's Encrypt\" first." "from Let's Encrypt\" first."
msgstr "" msgstr ""
#: src/views/other/Install.vue:120 #: src/views/other/Install.vue:121
msgid "The filename cannot contain the following characters: %{c}" msgid "The filename cannot contain the following characters: %{c}"
msgstr "" msgstr ""
@ -385,22 +433,18 @@ msgstr ""
msgid "Updated at" msgid "Updated at"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:12 #: src/views/dashboard/DashBoard.vue:6
msgid "Uptime" msgid "Uptime:"
msgstr ""
#: src/views/dashboard/DashBoard.vue:95
msgid "Used: %{u}, Cached: %{c}, Free: %{f}, Physical Memory: %{p}"
msgstr ""
#: src/views/dashboard/DashBoard.vue:123
msgid "Used: %{used} / Total: %{total}"
msgstr "" msgstr ""
#: src/views/other/Login.vue:33 src/views/user/User.vue:5 #: src/views/other/Login.vue:33 src/views/user/User.vue:5
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: src/views/other/Install.vue:60 #: src/views/other/Install.vue:61
msgid "Username (*)" msgid "Username (*)"
msgstr "" msgstr ""
#: src/views/dashboard/DashBoard.vue:58 src/views/dashboard/DashBoard.vue:291
msgid "Writes"
msgstr ""

Binary file not shown.

View file

@ -10,13 +10,17 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: easygettext\n" "Generated-By: easygettext\n"
"X-Generator: Poedit 2.2\n" "X-Generator: Poedit 3.0.1\n"
#: src/router/index.js:100 #: src/views/other/Install.vue:50
msgid "<translate>Install</translate>"
msgstr ""
#: src/router/index.js:99
msgid "404 Not Found" msgid "404 Not Found"
msgstr "404 未找到页面" msgstr "404 未找到页面"
#: src/router/index.js:78 #: src/router/index.js:77
msgid "About" msgid "About"
msgstr "关于" msgstr "关于"
@ -26,7 +30,7 @@ msgid "Action"
msgstr "操作" msgstr "操作"
#: src/router/index.js:47 src/views/domain/DomainAdd.vue:18 #: src/router/index.js:47 src/views/domain/DomainAdd.vue:18
#: src/views/domain/DomainEdit.vue:45 #: src/views/domain/DomainEdit.vue:46
msgid "Add Site" msgid "Add Site"
msgstr "添加站点" msgstr "添加站点"
@ -79,6 +83,14 @@ msgstr "配置名称"
msgid "Configurations" msgid "Configurations"
msgstr "配置" msgstr "配置"
#: src/views/dashboard/DashBoard.vue:204
msgid "CPU Status"
msgstr "CPU 状态"
#: src/views/dashboard/DashBoard.vue:22
msgid "CPU:"
msgstr ""
#: src/views/user/User.vue:23 #: src/views/user/User.vue:23
msgid "Created at" msgid "Created at"
msgstr "创建时间" msgstr "创建时间"
@ -87,11 +99,11 @@ msgstr "创建时间"
msgid "Dashboard" msgid "Dashboard"
msgstr "仪表盘" msgstr "仪表盘"
#: src/views/other/Install.vue:105 #: src/views/other/Install.vue:106
msgid "Database (Optional, default: database)" msgid "Database (Optional, default: database)"
msgstr "数据库 (可选,默认: database)" msgstr "数据库 (可选,默认: database)"
#: src/router/index.js:126 #: src/router/index.js:125
msgid "Detected version update, this page will refresh." msgid "Detected version update, this page will refresh."
msgstr "检测到版本更新,页面将会刷新。" msgstr "检测到版本更新,页面将会刷新。"
@ -112,19 +124,23 @@ msgstr "禁用"
msgid "Disabled successfully" msgid "Disabled successfully"
msgstr "禁用成功" msgstr "禁用成功"
#: src/views/dashboard/DashBoard.vue:282
msgid "Disk IO"
msgstr "磁盘 IO"
#: src/views/domain/DomainEdit.vue:133 #: src/views/domain/DomainEdit.vue:133
msgid "Do you want to change the template to support the TLS?" msgid "Do you want to change the template to support the TLS?"
msgstr "你想要改变模板以支持 TLS 吗?" msgstr "你想要改变模板以支持 TLS 吗?"
#: src/views/domain/DomainEdit.vue:45 #: src/views/domain/DomainEdit.vue:46
msgid "Edit %{n}" msgid "Edit %{n}"
msgstr "编辑 %{n}" msgstr "编辑 %{n}"
#: src/router/index.js:68 src/views/config/ConfigEdit.vue:15 #: src/router/index.js:69 src/views/config/ConfigEdit.vue:15
msgid "Edit Configuration" msgid "Edit Configuration"
msgstr "编辑配置" msgstr "编辑配置"
#: src/views/domain/DomainEdit.vue:91 #: src/views/domain/DomainEdit.vue:92
msgid "Edit Configuration File" msgid "Edit Configuration File"
msgstr "编辑配置文件" msgstr "编辑配置文件"
@ -132,7 +148,7 @@ msgstr "编辑配置文件"
msgid "Edit Site" msgid "Edit Site"
msgstr "编辑站点" msgstr "编辑站点"
#: src/views/other/Install.vue:31 #: src/views/other/Install.vue:32
msgid "Email (*)" msgid "Email (*)"
msgstr "邮箱 (*)" msgstr "邮箱 (*)"
@ -197,7 +213,7 @@ msgstr "HTTPS 监听端口"
msgid "Index (index)" msgid "Index (index)"
msgstr "网站首页 (index)" msgstr "网站首页 (index)"
#: src/router/index.js:88 src/views/other/Install.vue:50 #: src/router/index.js:87 src/views/other/Install.vue:51
msgid "Install" msgid "Install"
msgstr "安装" msgstr "安装"
@ -205,7 +221,7 @@ msgstr "安装"
msgid "Intermediate Certification Authorities: %{issuer}" msgid "Intermediate Certification Authorities: %{issuer}"
msgstr "中级证书颁发机构: %{issuer}" msgstr "中级证书颁发机构: %{issuer}"
#: src/views/other/Install.vue:46 #: src/views/other/Install.vue:47
msgid "Invalid E-mail!" msgid "Invalid E-mail!"
msgstr "无效的邮箱!" msgstr "无效的邮箱!"
@ -218,11 +234,11 @@ msgctxt "Project"
msgid "License" msgid "License"
msgstr "开源许可" msgstr "开源许可"
#: src/views/dashboard/DashBoard.vue:13 #: src/views/dashboard/DashBoard.vue:10
msgid "Load Averages:" msgid "Load Averages:"
msgstr "系统负载:" msgstr "系统负载:"
#: src/router/index.js:94 src/views/other/Login.vue:24 #: src/router/index.js:93 src/views/other/Login.vue:24
msgid "Login" msgid "Login"
msgstr "登录" msgstr "登录"
@ -240,8 +256,8 @@ msgid ""
"directory to <code>HTTPChallengePort</code> (default: 9180) before getting " "directory to <code>HTTPChallengePort</code> (default: 9180) before getting "
"the certificate." "the certificate."
msgstr "" msgstr ""
"在获取签发证书前,请确保配置文件中已将 <code>.well-known</code> 目录反向代" "在获取签发证书前,请确保配置文件中已将 <code>.well-known</code> 目录反向代"
"到<code>HTTPChallengePort</code> (默认: 9180)" "到<code>HTTPChallengePort</code> (默认: 9180)"
#: src/router/index.js:60 #: src/router/index.js:60
msgid "Manage Configs" msgid "Manage Configs"
@ -255,7 +271,7 @@ msgstr "网站管理"
msgid "Manage Users" msgid "Manage Users"
msgstr "用户管理" msgstr "用户管理"
#: src/views/dashboard/DashBoard.vue:24 #: src/views/dashboard/DashBoard.vue:100
msgid "Memory" msgid "Memory"
msgstr "内存" msgstr "内存"
@ -263,7 +279,19 @@ msgstr "内存"
msgid "Name" msgid "Name"
msgstr "名称" msgstr "名称"
#: src/router/index.js:106 #: src/views/dashboard/DashBoard.vue:231
msgid "Network"
msgstr ""
#: src/views/dashboard/DashBoard.vue:165
msgid "Network Total Receive"
msgstr "下载流量"
#: src/views/dashboard/DashBoard.vue:174
msgid "Network Total Send"
msgstr "上传流量"
#: src/router/index.js:105
msgid "Not Found" msgid "Not Found"
msgstr "找不到页面" msgstr "找不到页面"
@ -277,27 +305,31 @@ msgid ""
"you need to get the certificate." "you need to get the certificate."
msgstr "注意:当前配置中的 server_name 必须为需要申请证书的域名。" msgstr "注意:当前配置中的 server_name 必须为需要申请证书的域名。"
#: src/router/index.js:130 #: src/router/index.js:129
msgid "OK" msgid "OK"
msgstr "确定" msgstr "确定"
#: src/views/dashboard/DashBoard.vue:16
msgid "OS:"
msgstr ""
#: src/views/other/Login.vue:56 src/views/user/User.vue:13 #: src/views/other/Login.vue:56 src/views/user/User.vue:13
msgid "Password" msgid "Password"
msgstr "密码" msgstr "密码"
#: src/views/other/Install.vue:83 #: src/views/other/Install.vue:84
msgid "Password (*)" msgid "Password (*)"
msgstr "密码 (*)" msgstr "密码 (*)"
#: src/views/other/Install.vue:50 #: src/views/other/Install.vue:51
msgid "Please input your E-mail!" msgid "Please input your E-mail!"
msgstr "请输入您的邮箱!" msgstr "请输入您的邮箱!"
#: src/views/other/Install.vue:96 src/views/other/Login.vue:69 #: src/views/other/Install.vue:97 src/views/other/Login.vue:69
msgid "Please input your password!" msgid "Please input your password!"
msgstr "请输入您的密码!" msgstr "请输入您的密码!"
#: src/views/other/Install.vue:73 src/views/other/Login.vue:46 #: src/views/other/Install.vue:74 src/views/other/Login.vue:46
msgid "Please input your username!" msgid "Please input your username!"
msgstr "请输入您的用户名!" msgstr "请输入您的用户名!"
@ -309,6 +341,14 @@ msgstr "私钥路径 (ssl_certificate_key)"
msgid "Project Team" msgid "Project Team"
msgstr "项目团队" msgstr "项目团队"
#: src/views/dashboard/DashBoard.vue:61 src/views/dashboard/DashBoard.vue:305
msgid "Reads"
msgstr "读"
#: src/views/dashboard/DashBoard.vue:51 src/views/dashboard/DashBoard.vue:240
msgid "Receive"
msgstr "下载"
#: src/views/domain/columns.js:16 #: src/views/domain/columns.js:16
msgid "Root Directory (root)" msgid "Root Directory (root)"
msgstr "网站根目录 (root)" msgstr "网站根目录 (root)"
@ -328,19 +368,23 @@ msgstr "保存错误 %{msg}"
msgid "Saved successfully" msgid "Saved successfully"
msgstr "保存成功" msgstr "保存成功"
#: src/views/dashboard/DashBoard.vue:54 src/views/dashboard/DashBoard.vue:254
msgid "Send"
msgstr "上传"
#: src/views/config/ConfigEdit.vue:35 src/views/domain/DomainEdit.vue:71 #: src/views/config/ConfigEdit.vue:35 src/views/domain/DomainEdit.vue:71
#: src/views/other/Login.vue:35 #: src/views/other/Login.vue:35
msgid "Server error" msgid "Server error"
msgstr "服务器错误" msgstr "服务器错误"
#: src/views/dashboard/DashBoard.vue:37
msgid "Server Info"
msgstr "服务器信息"
#: src/views/domain/columns.js:10 #: src/views/domain/columns.js:10
msgid "Server Names (server_name)" msgid "Server Names (server_name)"
msgstr "网站域名 (server_name)" msgstr "网站域名 (server_name)"
#: src/views/dashboard/DashBoard.vue:38
msgid "Server Status"
msgstr "服务器状态"
#: src/router/index.js:43 #: src/router/index.js:43
msgid "Sites List" msgid "Sites List"
msgstr "站点列表" msgstr "站点列表"
@ -349,7 +393,7 @@ msgstr "站点列表"
msgid "Status" msgid "Status"
msgstr "状态" msgstr "状态"
#: src/views/dashboard/DashBoard.vue:33 #: src/views/dashboard/DashBoard.vue:132
msgid "Storage" msgid "Storage"
msgstr "存储" msgstr "存储"
@ -357,7 +401,11 @@ msgstr "存储"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "主体名称: %{name}" msgstr "主体名称: %{name}"
#: src/router/index.js:125 #: src/views/dashboard/DashBoard.vue:116
msgid "Swap"
msgstr ""
#: src/router/index.js:124
msgid "System message" msgid "System message"
msgstr "系统消息" msgstr "系统消息"
@ -371,7 +419,7 @@ msgstr ""
"系统将会每小时检测一次该域名证书若距离上次签发已超过1个月则将自动续签。" "系统将会每小时检测一次该域名证书若距离上次签发已超过1个月则将自动续签。"
"<br/>如果您之前没有证书,请先点击 \"从 Let's Encrypt 获取证书\"。" "<br/>如果您之前没有证书,请先点击 \"从 Let's Encrypt 获取证书\"。"
#: src/views/other/Install.vue:120 #: src/views/other/Install.vue:121
msgid "The filename cannot contain the following characters: %{c}" msgid "The filename cannot contain the following characters: %{c}"
msgstr "文件名不能包含以下字符: %{c}" msgstr "文件名不能包含以下字符: %{c}"
@ -381,8 +429,8 @@ msgid ""
"fields in your configuration file. The configuration filename cannot be " "fields in your configuration file. The configuration filename cannot be "
"changed after it has been created." "changed after it has been created."
msgstr "" msgstr ""
"只有在您的配置文件中有相应字段时,下列的配置才能生效。配置文件名称创建后不" "只有在您的配置文件中有相应字段时,下列的配置才能生效。配置文件名称创建后不"
"修改。" "修改。"
#: src/views/domain/DomainEdit.vue:134 #: src/views/domain/DomainEdit.vue:134
msgid "This operation will lose the custom configuration." msgid "This operation will lose the custom configuration."
@ -393,25 +441,30 @@ msgstr "该操作将会丢失自定义配置。"
msgid "Updated at" msgid "Updated at"
msgstr "修改时间" msgstr "修改时间"
#: src/views/dashboard/DashBoard.vue:12 #: src/views/dashboard/DashBoard.vue:6
msgid "Uptime" msgid "Uptime:"
msgstr "运行时间" msgstr "运行时间:"
#: src/views/dashboard/DashBoard.vue:95
msgid "Used: %{u}, Cached: %{c}, Free: %{f}, Physical Memory: %{p}"
msgstr "已使用: %{u}, 缓存: %{c}, 空闲: %{f}, 物理内存: %{p}"
#: src/views/dashboard/DashBoard.vue:123
msgid "Used: %{used} / Total: %{total}"
msgstr "已使用: %{used} / 总共: %{total}"
#: src/views/other/Login.vue:33 src/views/user/User.vue:5 #: src/views/other/Login.vue:33 src/views/user/User.vue:5
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"
#: src/views/other/Install.vue:60 #: src/views/other/Install.vue:61
msgid "Username (*)" msgid "Username (*)"
msgstr "用户名 (*)" msgstr "用户名 (*)"
#: src/views/dashboard/DashBoard.vue:58 src/views/dashboard/DashBoard.vue:291
msgid "Writes"
msgstr "写"
#~ msgid "Server Status"
#~ msgstr "服务器状态"
#~ msgid "Used: %{u}, Cached: %{c}, Free: %{f}, Physical Memory: %{p}"
#~ msgstr "已使用: %{u}, 缓存: %{c}, 空闲: %{f}, 物理内存: %{p}"
#~ msgid "Used: %{used} / Total: %{total}"
#~ msgstr "已使用: %{used} / 总共: %{total}"
#~ msgid "CPU" #~ msgid "CPU"
#~ msgstr "CPU" #~ msgstr "CPU"

View file

@ -13,11 +13,15 @@ msgstr ""
"Generated-By: easygettext\n" "Generated-By: easygettext\n"
"X-Generator: Poedit 2.2\n" "X-Generator: Poedit 2.2\n"
#: src/router/index.js:100 #: src/views/other/Install.vue:50
msgid "<translate>Install</translate>"
msgstr ""
#: src/router/index.js:99
msgid "404 Not Found" msgid "404 Not Found"
msgstr "404 未找到頁面" msgstr "404 未找到頁面"
#: src/router/index.js:78 #: src/router/index.js:77
msgid "About" msgid "About"
msgstr "關於" msgstr "關於"
@ -27,7 +31,7 @@ msgid "Action"
msgstr "操作" msgstr "操作"
#: src/router/index.js:47 src/views/domain/DomainAdd.vue:18 #: src/router/index.js:47 src/views/domain/DomainAdd.vue:18
#: src/views/domain/DomainEdit.vue:45 #: src/views/domain/DomainEdit.vue:46
msgid "Add Site" msgid "Add Site"
msgstr "新增站點" msgstr "新增站點"
@ -80,6 +84,15 @@ msgstr "配置名稱"
msgid "Configurations" msgid "Configurations"
msgstr "配置" msgstr "配置"
#: src/views/dashboard/DashBoard.vue:204
#, fuzzy
msgid "CPU Status"
msgstr "狀態"
#: src/views/dashboard/DashBoard.vue:22
msgid "CPU:"
msgstr ""
#: src/views/user/User.vue:23 #: src/views/user/User.vue:23
msgid "Created at" msgid "Created at"
msgstr "建立時間" msgstr "建立時間"
@ -88,11 +101,11 @@ msgstr "建立時間"
msgid "Dashboard" msgid "Dashboard"
msgstr "儀表盤" msgstr "儀表盤"
#: src/views/other/Install.vue:105 #: src/views/other/Install.vue:106
msgid "Database (Optional, default: database)" msgid "Database (Optional, default: database)"
msgstr "資料庫 (可選,預設: database)" msgstr "資料庫 (可選,預設: database)"
#: src/router/index.js:126 #: src/router/index.js:125
msgid "Detected version update, this page will refresh." msgid "Detected version update, this page will refresh."
msgstr "檢測到版本更新,頁面將會重新整理。" msgstr "檢測到版本更新,頁面將會重新整理。"
@ -113,19 +126,23 @@ msgstr "禁用"
msgid "Disabled successfully" msgid "Disabled successfully"
msgstr "禁用成功" msgstr "禁用成功"
#: src/views/dashboard/DashBoard.vue:282
msgid "Disk IO"
msgstr ""
#: src/views/domain/DomainEdit.vue:133 #: src/views/domain/DomainEdit.vue:133
msgid "Do you want to change the template to support the TLS?" msgid "Do you want to change the template to support the TLS?"
msgstr "你想要改變模板以支援 TLS 嗎?" msgstr "你想要改變模板以支援 TLS 嗎?"
#: src/views/domain/DomainEdit.vue:45 #: src/views/domain/DomainEdit.vue:46
msgid "Edit %{n}" msgid "Edit %{n}"
msgstr "編輯 %{n}" msgstr "編輯 %{n}"
#: src/router/index.js:68 src/views/config/ConfigEdit.vue:15 #: src/router/index.js:69 src/views/config/ConfigEdit.vue:15
msgid "Edit Configuration" msgid "Edit Configuration"
msgstr "編輯配置" msgstr "編輯配置"
#: src/views/domain/DomainEdit.vue:91 #: src/views/domain/DomainEdit.vue:92
msgid "Edit Configuration File" msgid "Edit Configuration File"
msgstr "編輯配置檔案" msgstr "編輯配置檔案"
@ -133,7 +150,7 @@ msgstr "編輯配置檔案"
msgid "Edit Site" msgid "Edit Site"
msgstr "編輯站點" msgstr "編輯站點"
#: src/views/other/Install.vue:31 #: src/views/other/Install.vue:32
msgid "Email (*)" msgid "Email (*)"
msgstr "郵箱 (*)" msgstr "郵箱 (*)"
@ -198,7 +215,7 @@ msgstr "HTTPS 監聽埠"
msgid "Index (index)" msgid "Index (index)"
msgstr "網站首頁 (index)" msgstr "網站首頁 (index)"
#: src/router/index.js:88 src/views/other/Install.vue:50 #: src/router/index.js:87 src/views/other/Install.vue:51
msgid "Install" msgid "Install"
msgstr "安裝" msgstr "安裝"
@ -206,7 +223,7 @@ msgstr "安裝"
msgid "Intermediate Certification Authorities: %{issuer}" msgid "Intermediate Certification Authorities: %{issuer}"
msgstr "中級證書頒發機構: %{issuer}" msgstr "中級證書頒發機構: %{issuer}"
#: src/views/other/Install.vue:46 #: src/views/other/Install.vue:47
msgid "Invalid E-mail!" msgid "Invalid E-mail!"
msgstr "無效的郵箱!" msgstr "無效的郵箱!"
@ -219,11 +236,11 @@ msgctxt "Project"
msgid "License" msgid "License"
msgstr "開源許可" msgstr "開源許可"
#: src/views/dashboard/DashBoard.vue:13 #: src/views/dashboard/DashBoard.vue:10
msgid "Load Averages:" msgid "Load Averages:"
msgstr "系統負載:" msgstr "系統負載:"
#: src/router/index.js:94 src/views/other/Login.vue:24 #: src/router/index.js:93 src/views/other/Login.vue:24
msgid "Login" msgid "Login"
msgstr "登入" msgstr "登入"
@ -256,7 +273,7 @@ msgstr "網站管理"
msgid "Manage Users" msgid "Manage Users"
msgstr "使用者管理" msgstr "使用者管理"
#: src/views/dashboard/DashBoard.vue:24 #: src/views/dashboard/DashBoard.vue:100
msgid "Memory" msgid "Memory"
msgstr "記憶體" msgstr "記憶體"
@ -264,7 +281,19 @@ msgstr "記憶體"
msgid "Name" msgid "Name"
msgstr "名稱" msgstr "名稱"
#: src/router/index.js:106 #: src/views/dashboard/DashBoard.vue:231
msgid "Network"
msgstr ""
#: src/views/dashboard/DashBoard.vue:165
msgid "Network Total Receive"
msgstr ""
#: src/views/dashboard/DashBoard.vue:174
msgid "Network Total Send"
msgstr ""
#: src/router/index.js:105
msgid "Not Found" msgid "Not Found"
msgstr "找不到頁面" msgstr "找不到頁面"
@ -278,27 +307,31 @@ msgid ""
"you need to get the certificate." "you need to get the certificate."
msgstr "注意:當前配置中的 server_name 必須為需要申請證書的域名。" msgstr "注意:當前配置中的 server_name 必須為需要申請證書的域名。"
#: src/router/index.js:130 #: src/router/index.js:129
msgid "OK" msgid "OK"
msgstr "確定" msgstr "確定"
#: src/views/dashboard/DashBoard.vue:16
msgid "OS:"
msgstr ""
#: src/views/other/Login.vue:56 src/views/user/User.vue:13 #: src/views/other/Login.vue:56 src/views/user/User.vue:13
msgid "Password" msgid "Password"
msgstr "密碼" msgstr "密碼"
#: src/views/other/Install.vue:83 #: src/views/other/Install.vue:84
msgid "Password (*)" msgid "Password (*)"
msgstr "密碼 (*)" msgstr "密碼 (*)"
#: src/views/other/Install.vue:50 #: src/views/other/Install.vue:51
msgid "Please input your E-mail!" msgid "Please input your E-mail!"
msgstr "請輸入您的郵箱!" msgstr "請輸入您的郵箱!"
#: src/views/other/Install.vue:96 src/views/other/Login.vue:69 #: src/views/other/Install.vue:97 src/views/other/Login.vue:69
msgid "Please input your password!" msgid "Please input your password!"
msgstr "請輸入您的密碼!" msgstr "請輸入您的密碼!"
#: src/views/other/Install.vue:73 src/views/other/Login.vue:46 #: src/views/other/Install.vue:74 src/views/other/Login.vue:46
msgid "Please input your username!" msgid "Please input your username!"
msgstr "請輸入您的使用者名稱!" msgstr "請輸入您的使用者名稱!"
@ -310,6 +343,14 @@ msgstr "私鑰路徑 (ssl_certificate_key)"
msgid "Project Team" msgid "Project Team"
msgstr "專案團隊" msgstr "專案團隊"
#: src/views/dashboard/DashBoard.vue:61 src/views/dashboard/DashBoard.vue:305
msgid "Reads"
msgstr ""
#: src/views/dashboard/DashBoard.vue:51 src/views/dashboard/DashBoard.vue:240
msgid "Receive"
msgstr ""
#: src/views/domain/columns.js:16 #: src/views/domain/columns.js:16
msgid "Root Directory (root)" msgid "Root Directory (root)"
msgstr "網站根目錄 (root)" msgstr "網站根目錄 (root)"
@ -329,19 +370,24 @@ msgstr "儲存錯誤 %{msg}"
msgid "Saved successfully" msgid "Saved successfully"
msgstr "儲存成功" msgstr "儲存成功"
#: src/views/dashboard/DashBoard.vue:54 src/views/dashboard/DashBoard.vue:254
msgid "Send"
msgstr ""
#: src/views/config/ConfigEdit.vue:35 src/views/domain/DomainEdit.vue:71 #: src/views/config/ConfigEdit.vue:35 src/views/domain/DomainEdit.vue:71
#: src/views/other/Login.vue:35 #: src/views/other/Login.vue:35
msgid "Server error" msgid "Server error"
msgstr "伺服器錯誤" msgstr "伺服器錯誤"
#: src/views/dashboard/DashBoard.vue:37
#, fuzzy
msgid "Server Info"
msgstr "伺服器錯誤"
#: src/views/domain/columns.js:10 #: src/views/domain/columns.js:10
msgid "Server Names (server_name)" msgid "Server Names (server_name)"
msgstr "網站域名 (server_name)" msgstr "網站域名 (server_name)"
#: src/views/dashboard/DashBoard.vue:38
msgid "Server Status"
msgstr "伺服器狀態"
#: src/router/index.js:43 #: src/router/index.js:43
msgid "Sites List" msgid "Sites List"
msgstr "站點列表" msgstr "站點列表"
@ -350,7 +396,7 @@ msgstr "站點列表"
msgid "Status" msgid "Status"
msgstr "狀態" msgstr "狀態"
#: src/views/dashboard/DashBoard.vue:33 #: src/views/dashboard/DashBoard.vue:132
msgid "Storage" msgid "Storage"
msgstr "儲存" msgstr "儲存"
@ -358,7 +404,11 @@ msgstr "儲存"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "主體名稱: %{name}" msgstr "主體名稱: %{name}"
#: src/router/index.js:125 #: src/views/dashboard/DashBoard.vue:116
msgid "Swap"
msgstr ""
#: src/router/index.js:124
msgid "System message" msgid "System message"
msgstr "系統訊息" msgstr "系統訊息"
@ -372,7 +422,7 @@ msgstr ""
"系統將會每小時檢測一次該域名證書若距離上次簽發已超過1個月則將自動續簽。" "系統將會每小時檢測一次該域名證書若距離上次簽發已超過1個月則將自動續簽。"
"<br/>如果您之前沒有證書,請先點選「從 Let's Encrypt 獲取證書」。" "<br/>如果您之前沒有證書,請先點選「從 Let's Encrypt 獲取證書」。"
#: src/views/other/Install.vue:120 #: src/views/other/Install.vue:121
msgid "The filename cannot contain the following characters: %{c}" msgid "The filename cannot contain the following characters: %{c}"
msgstr "檔名不能包含以下字元: %{c}" msgstr "檔名不能包含以下字元: %{c}"
@ -394,25 +444,31 @@ msgstr "該操作將會丟失自定義配置。"
msgid "Updated at" msgid "Updated at"
msgstr "修改時間" msgstr "修改時間"
#: src/views/dashboard/DashBoard.vue:12 #: src/views/dashboard/DashBoard.vue:6
msgid "Uptime" #, fuzzy
msgid "Uptime:"
msgstr "執行時間" msgstr "執行時間"
#: src/views/dashboard/DashBoard.vue:95
msgid "Used: %{u}, Cached: %{c}, Free: %{f}, Physical Memory: %{p}"
msgstr "已使用: %{u}, 快取: %{c}, 空閒: %{f}, 物理記憶體: %{p}"
#: src/views/dashboard/DashBoard.vue:123
msgid "Used: %{used} / Total: %{total}"
msgstr "已使用: %{used} / 總共: %{total}"
#: src/views/other/Login.vue:33 src/views/user/User.vue:5 #: src/views/other/Login.vue:33 src/views/user/User.vue:5
msgid "Username" msgid "Username"
msgstr "使用者名稱" msgstr "使用者名稱"
#: src/views/other/Install.vue:60 #: src/views/other/Install.vue:61
msgid "Username (*)" msgid "Username (*)"
msgstr "使用者名稱 (*)" msgstr "使用者名稱 (*)"
#: src/views/dashboard/DashBoard.vue:58 src/views/dashboard/DashBoard.vue:291
msgid "Writes"
msgstr ""
#~ msgid "Server Status"
#~ msgstr "伺服器狀態"
#~ msgid "Used: %{u}, Cached: %{c}, Free: %{f}, Physical Memory: %{p}"
#~ msgstr "已使用: %{u}, 快取: %{c}, 空閒: %{f}, 物理記憶體: %{p}"
#~ msgid "Used: %{used} / Total: %{total}"
#~ msgstr "已使用: %{used} / 總共: %{total}"
#~ msgid "CPU" #~ msgid "CPU"
#~ msgstr "CPU" #~ msgstr "CPU"

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<a-row :gutter="[16,16]" class="first-row"> <a-row :gutter="[16,16]" class="first-row">
<a-col :lg="7" :md="24"> <a-col :xl="6" :lg="24" :md="24">
<a-card :title="$gettext('Server Info')"> <a-card :title="$gettext('Server Info')">
<p> <p>
<translate>Uptime:</translate> <translate>Uptime:</translate>
@ -23,37 +23,28 @@
<translate>CPU:</translate> <translate>CPU:</translate>
{{ cpu_info[0]?.modelName }} * {{ cpu_info.length }} {{ cpu_info[0]?.modelName }} * {{ cpu_info.length }}
</p> </p>
<!-- <p><translate>Memory</translate>: {{-->
<!-- $gettextInterpolate(-->
<!-- $gettext('Used: %{u}, Cached: %{c}, Free: %{f}, Physical Memory: %{p}'),-->
<!-- {u: memory_used, c: memory_cached, f: memory_free, p: memory_total})-->
<!-- }}</p>-->
<!-- <p><translate>Storage</translate>: {{-->
<!-- $gettextInterpolate($gettext('Used: %{used} / Total: %{total}'),-->
<!-- {used: disk_used, total: disk_total})-->
<!-- }}-->
<!-- </p>-->
</a-card> </a-card>
</a-col> </a-col>
<a-col :lg="12" :md="24" class="chart_dashboard"> <a-col :xl="12" :lg="18" :md="24" class="chart_dashboard">
<a-card> <a-card>
<a-row> <a-row>
<a-col :xs="24" :sm="24" :md="8"> <a-col :xs="24" :sm="24" :md="8">
<radial-bar-chart :name="$gettext('Memory')" :series="[memory_pressure]" <radial-bar-chart :name="$gettext('Memory')" :series="[memory_pressure]"
:centerText="memory_used" colors="#36a3eb"/> :centerText="memory_used" :bottom-text="memory_total" colors="#36a3eb"/>
</a-col> </a-col>
<a-col :xs="24" :sm="12" :md="8"> <a-col :xs="24" :sm="12" :md="8">
<radial-bar-chart :name="$gettext('Swap')" :series="[memory_swap_percent]" <radial-bar-chart :name="$gettext('Swap')" :series="[memory_swap_percent]"
:centerText="memory_swap_used" colors="#ff6385"/> :centerText="memory_swap_used"
:bottom-text="memory_swap_total" colors="#ff6385"/>
</a-col> </a-col>
<a-col :xs="24" :sm="12" :md="8"> <a-col :xs="24" :sm="12" :md="8">
<radial-bar-chart :name="$gettext('Storage')" :series="[disk_percentage]" <radial-bar-chart :name="$gettext('Storage')" :series="[disk_percentage]"
:centerText="disk_used" colors="#87d068"/> :centerText="disk_used" :bottom-text="disk_total" colors="#87d068"/>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
</a-col> </a-col>
<a-col :lg="5" :sm="24" class="chart_dashboard"> <a-col :xl="6" :lg="6" :sm="24" class="chart_dashboard">
<a-card> <a-card>
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :span="24"> <a-col :span="24">
@ -62,14 +53,14 @@
</a-col> </a-col>
<a-col :span="24"> <a-col :span="24">
<a-statistic :value="bytesToSize(net.last_sent)" <a-statistic :value="bytesToSize(net.last_sent)"
:title="$gettext('Network Total Send')" /> :title="$gettext('Network Total Send')"/>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
</a-col> </a-col>
</a-row> </a-row>
<a-row class="row-two" :gutter="[16,32]"> <a-row class="row-two" :gutter="[16,32]">
<a-col :lg="8" :md="24" :sm="24"> <a-col :xl="7" :lg="24" :md="24" :sm="24">
<a-card :title="$gettext('CPU Status')"> <a-card :title="$gettext('CPU Status')">
<a-statistic :value="cpu" title="CPU"> <a-statistic :value="cpu" title="CPU">
<template v-slot:suffix> <template v-slot:suffix>
@ -79,7 +70,7 @@
<c-p-u-chart :series="cpu_analytic_series"/> <c-p-u-chart :series="cpu_analytic_series"/>
</a-card> </a-card>
</a-col> </a-col>
<a-col :lg="8" :md="24" :sm="24"> <a-col :xl="10" :lg="12" :md="24" :sm="24">
<a-card :title="$gettext('Network')"> <a-card :title="$gettext('Network')">
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
@ -101,7 +92,7 @@
<net-chart :series="net_analytic"/> <net-chart :series="net_analytic"/>
</a-card> </a-card>
</a-col> </a-col>
<a-col :lg="8" :md="24" :sm="24"> <a-col :xl="7" :lg="12" :md="24" :sm="24">
<a-card :title="$gettext('Disk IO')"> <a-card :title="$gettext('Disk IO')">
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
@ -163,6 +154,7 @@ export default {
}], }],
cpu: 0, cpu: 0,
memory_swap_used: '', memory_swap_used: '',
memory_swap_total: '',
memory_swap_percent: 0, memory_swap_percent: 0,
disk_percentage: 0, disk_percentage: 0,
disk_total: '', disk_total: '',
@ -253,6 +245,7 @@ export default {
this.memory_total = r.memory_total this.memory_total = r.memory_total
this.memory_swap_percent = r.memory_swap_percent this.memory_swap_percent = r.memory_swap_percent
this.memory_swap_used = r.memory_swap_used this.memory_swap_used = r.memory_swap_used
this.memory_swap_total = r.memory_swap_total
// disk // disk
this.disk_percentage = r.disk_percentage this.disk_percentage = r.disk_percentage
@ -277,8 +270,8 @@ export default {
this.net_analytic[1].data.push([time, this.net.sent]) this.net_analytic[1].data.push([time, this.net.sent])
if (this.net_analytic[0].data.length > 100) { if (this.net_analytic[0].data.length > 100) {
this.net_analytic[1].data.shift()
this.net_analytic[0].data.shift() this.net_analytic[0].data.shift()
this.net_analytic[1].data.shift()
} }
// diskIO // diskIO

View file

@ -15,7 +15,7 @@
<p>Vue</p> <p>Vue</p>
<p>Websocket</p> <p>Websocket</p>
<h3 v-translate translate-context="Project">License</h3> <h3 v-translate translate-context="Project">License</h3>
<p>GNU General Public License v2.0</p> <p>GNU General Public License v3.0</p>
<p>Copyright © 2020 - {{ this_year }} Nginx UI </p> <p>Copyright © 2020 - {{ this_year }} Nginx UI </p>
</a-card> </a-card>
</template> </template>

View file

@ -3,6 +3,7 @@ package main
import ( import (
"context" "context"
"flag" "flag"
"github.com/0xJacky/Nginx-UI/server/analytic"
"github.com/0xJacky/Nginx-UI/server/model" "github.com/0xJacky/Nginx-UI/server/model"
"github.com/0xJacky/Nginx-UI/server/router" "github.com/0xJacky/Nginx-UI/server/router"
"github.com/0xJacky/Nginx-UI/server/settings" "github.com/0xJacky/Nginx-UI/server/settings"
@ -36,7 +37,7 @@ func main() {
if "" != settings.ServerSettings.JwtSecret { if "" != settings.ServerSettings.JwtSecret {
model.Init() model.Init()
go tool.AutoCert() go tool.AutoCert()
go tool.RecordServerAnalytic() go analytic.RecordServerAnalytic()
} }
srv := &http.Server{ srv := &http.Server{

View file

@ -0,0 +1,58 @@
package analytic
import (
"github.com/shirou/gopsutil/v3/net"
"log"
"time"
)
type usage struct {
Time time.Time `json:"x"`
Usage interface{} `json:"y"`
}
var (
CpuUserRecord []usage
CpuTotalRecord []usage
NetRecvRecord []usage
NetSentRecord []usage
DiskWriteRecord []usage
DiskReadRecord []usage
LastDiskWrites uint64
LastDiskReads uint64
LastNetSent uint64
LastNetRecv uint64
)
func init() {
network, _ := net.IOCounters(false)
if len(network) > 0 {
LastNetRecv = network[0].BytesRecv
LastNetSent = network[0].BytesSent
}
LastDiskReads, LastDiskWrites = getTotalDiskIO()
now := time.Now()
// init record slices
for i := 100; i > 0; i-- {
u := usage{Time: now.Add(time.Duration(-i) * time.Second), Usage: 0}
CpuUserRecord = append(CpuUserRecord, u)
CpuTotalRecord = append(CpuTotalRecord, u)
NetRecvRecord = append(NetRecvRecord, u)
NetSentRecord = append(NetSentRecord, u)
DiskWriteRecord = append(DiskWriteRecord, u)
DiskReadRecord = append(DiskReadRecord, u)
}
}
func RecordServerAnalytic() {
log.Println("[Nginx UI] RecordServerAnalytic Started")
for {
now := time.Now()
recordCpu(now) // this func will spend more than 1 second.
recordNetwork(now)
recordDiskIO(now)
}
}

96
server/analytic/record.go Normal file
View file

@ -0,0 +1,96 @@
package analytic
import (
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/net"
"runtime"
"time"
)
func getTotalDiskIO() (read, write uint64) {
diskIOCounters, _ := disk.IOCounters()
for _, v := range diskIOCounters {
write += v.WriteCount
read += v.ReadCount
}
return
}
func recordCpu(now time.Time) {
cpuTimesBefore, _ := cpu.Times(false)
time.Sleep(1000 * time.Millisecond)
cpuTimesAfter, _ := cpu.Times(false)
threadNum := runtime.GOMAXPROCS(0)
cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000)
cpuUserUsage *= 100
cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000)
cpuSystemUsage *= 100
u := usage{
Time: now,
Usage: cpuUserUsage,
}
CpuUserRecord = append(CpuUserRecord, u)
s := usage{
Time: now,
Usage: cpuUserUsage + cpuSystemUsage,
}
CpuTotalRecord = append(CpuTotalRecord, s)
if len(CpuUserRecord) > 100 {
CpuUserRecord = CpuUserRecord[1:]
}
if len(CpuTotalRecord) > 100 {
CpuTotalRecord = CpuTotalRecord[1:]
}
}
func recordNetwork(now time.Time) {
network, _ := net.IOCounters(false)
if len(network) == 0 {
return
}
NetRecvRecord = append(NetRecvRecord, usage{
Time: now,
Usage: network[0].BytesRecv - LastNetRecv,
})
NetSentRecord = append(NetSentRecord, usage{
Time: now,
Usage: network[0].BytesSent - LastNetSent,
})
LastNetRecv = network[0].BytesRecv
LastNetSent = network[0].BytesSent
if len(NetRecvRecord) > 100 {
NetRecvRecord = NetRecvRecord[1:]
}
if len(NetSentRecord) > 100 {
NetSentRecord = NetSentRecord[1:]
}
}
func recordDiskIO(now time.Time) {
readCount, writeCount := getTotalDiskIO()
DiskReadRecord = append(DiskReadRecord, usage{
Time: now,
Usage: readCount - LastDiskReads,
})
DiskWriteRecord = append(DiskWriteRecord, usage{
Time: now,
Usage: writeCount - LastDiskWrites,
})
if len(DiskReadRecord) > 100 {
DiskReadRecord = DiskReadRecord[1:]
}
if len(DiskWriteRecord) > 100 {
DiskWriteRecord = DiskWriteRecord[1:]
}
LastDiskWrites = writeCount
LastDiskReads = readCount
}

View file

@ -3,7 +3,7 @@ package api
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/0xJacky/Nginx-UI/server/tool" "github.com/0xJacky/Nginx-UI/server/analytic"
"github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/host" "github.com/shirou/gopsutil/v3/host"
@ -89,8 +89,8 @@ func Analytic(c *gin.Context) {
response["disk_percentage"], _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskUsage.UsedPercent), 64) response["disk_percentage"], _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskUsage.UsedPercent), 64)
response["diskIO"] = gin.H{ response["diskIO"] = gin.H{
"writes": tool.DiskWriteBuffer[len(tool.DiskWriteBuffer)-1], "writes": analytic.DiskWriteRecord[len(analytic.DiskWriteRecord)-1],
"reads": tool.DiskReadBuffer[len(tool.DiskReadBuffer)-1], "reads": analytic.DiskReadRecord[len(analytic.DiskReadRecord)-1],
} }
network, _ := net.IOCounters(false) network, _ := net.IOCounters(false)
@ -125,17 +125,17 @@ func GetAnalyticInit(c *gin.Context) {
"host": hostInfo, "host": hostInfo,
"cpu": gin.H{ "cpu": gin.H{
"info": cpuInfo, "info": cpuInfo,
"user": tool.CpuUserBuffer, "user": analytic.CpuUserRecord,
"total": tool.CpuTotalBuffer, "total": analytic.CpuTotalRecord,
}, },
"network": gin.H{ "network": gin.H{
"init": _net, "init": _net,
"bytesRecv": tool.NetRecvBuffer, "bytesRecv": analytic.NetRecvRecord,
"bytesSent": tool.NetSentBuffer, "bytesSent": analytic.NetSentRecord,
}, },
"diskIO": gin.H{ "diskIO": gin.H{
"writes": tool.DiskWriteBuffer, "writes": analytic.DiskWriteRecord,
"reads": tool.DiskReadBuffer, "reads": analytic.DiskReadRecord,
}, },
}) })
} }

View file

@ -15,7 +15,6 @@ type Server struct {
HTTPChallengePort string HTTPChallengePort string
Email string Email string
Database string Database string
DiskName string
} }
var ServerSettings = &Server{ var ServerSettings = &Server{
@ -23,7 +22,6 @@ var ServerSettings = &Server{
RunMode: "debug", RunMode: "debug",
HTTPChallengePort: "9180", HTTPChallengePort: "9180",
Database: "database", Database: "database",
DiskName: "vda",
} }
var ConfPath string var ConfPath string

View file

@ -1,124 +0,0 @@
package tool
import (
"github.com/0xJacky/Nginx-UI/server/settings"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/net"
"runtime"
"time"
)
type usage struct {
Time time.Time `json:"x"`
Usage float64 `json:"y"`
}
var CpuUserBuffer []usage
var CpuTotalBuffer []usage
var NetRecvBuffer []usage
var NetSentBuffer []usage
var DiskWriteBuffer []usage
var DiskReadBuffer []usage
var LastDiskWrites uint64
var LastDiskReads uint64
var LastNetRecv uint64
var LastNetSent uint64
func RecordServerAnalytic() {
network, _ := net.IOCounters(false)
diskIOCounters, _ := disk.IOCounters(settings.ServerSettings.DiskName)
diskIO, ok := diskIOCounters[settings.ServerSettings.DiskName]
if ok {
LastDiskWrites = diskIO.WriteCount
LastDiskReads = diskIO.ReadCount
}
if len(network) > 0 {
LastNetRecv = network[0].BytesRecv
LastNetSent = network[0].BytesSent
}
now := time.Now()
// 初始化记录数组
for i := 100; i > 0; i-- {
u := usage{Time: now.Add(time.Duration(-i) * time.Second)}
CpuUserBuffer = append(CpuUserBuffer, u)
CpuTotalBuffer = append(CpuTotalBuffer, u)
NetRecvBuffer = append(NetRecvBuffer, u)
NetSentBuffer = append(NetSentBuffer, u)
DiskWriteBuffer = append(DiskWriteBuffer, u)
DiskReadBuffer = append(DiskReadBuffer, u)
}
for {
cpuTimesBefore, _ := cpu.Times(false)
time.Sleep(1000 * time.Millisecond)
cpuTimesAfter, _ := cpu.Times(false)
threadNum := runtime.GOMAXPROCS(0)
cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000)
cpuUserUsage *= 100
cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000)
cpuSystemUsage *= 100
now := time.Now()
u := usage{
Time: now,
Usage: cpuUserUsage,
}
CpuUserBuffer = append(CpuUserBuffer, u)
s := usage{
Time: now,
Usage: cpuUserUsage + cpuSystemUsage,
}
CpuTotalBuffer = append(CpuTotalBuffer, s)
if len(CpuUserBuffer) > 100 {
CpuUserBuffer = CpuUserBuffer[1:]
}
if len(CpuTotalBuffer) > 100 {
CpuTotalBuffer = CpuTotalBuffer[1:]
}
network, _ = net.IOCounters(false)
if len(network) == 0 {
continue
}
NetRecvBuffer = append(NetRecvBuffer, usage{
Time: now,
Usage: float64(network[0].BytesRecv - LastNetRecv),
})
NetSentBuffer = append(NetRecvBuffer, usage{
Time: now,
Usage: float64(network[0].BytesSent - LastNetSent),
})
LastNetRecv = network[0].BytesRecv
LastNetSent = network[0].BytesSent
if len(NetRecvBuffer) > 100 {
NetRecvBuffer = NetRecvBuffer[1:]
}
if len(NetSentBuffer) > 100 {
NetSentBuffer = NetSentBuffer[1:]
}
diskIOCounters, _ = disk.IOCounters(settings.ServerSettings.DiskName)
diskIO, ok = diskIOCounters[settings.ServerSettings.DiskName]
if ok {
DiskReadBuffer = append(DiskReadBuffer, usage{
Time: now,
Usage: float64(diskIO.ReadCount - LastDiskReads),
})
DiskWriteBuffer = append(DiskWriteBuffer, usage{
Time: now,
Usage: float64(diskIO.WriteCount - LastDiskWrites),
})
if len(DiskReadBuffer) > 100 {
DiskReadBuffer = DiskReadBuffer[1:]
}
if len(DiskWriteBuffer) > 100 {
DiskWriteBuffer = DiskWriteBuffer[1:]
}
LastDiskWrites = diskIO.WriteCount
LastDiskReads = diskIO.ReadCount
}
}
}