优化server-status主题服务页 (#382)

This commit is contained in:
nap0o 2024-07-02 10:11:20 -04:00 committed by GitHub
parent 740d15bf79
commit 0613b0022d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 122 additions and 100 deletions

View File

@ -27,6 +27,9 @@ const mixinsVue = {
toggleView() { toggleView() {
this.showGroup = !this.showGroup; this.showGroup = !this.showGroup;
localStorage.setItem("showGroup", JSON.stringify(this.showGroup)); localStorage.setItem("showGroup", JSON.stringify(this.showGroup));
if(this.$root.page == 'service') {
this.$root.initTooltip();
}
return this.showGroup; return this.showGroup;
}, },
storedShowGroup() { storedShowGroup() {

View File

@ -21,7 +21,7 @@
<script src="https://unpkg.com/vue@2.6.14/dist/vue.min.js"></script> <script src="https://unpkg.com/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://unpkg.com/echarts@5.5.0/dist/echarts.min.js"></script> <script src="https://unpkg.com/echarts@5.5.0/dist/echarts.min.js"></script>
<script src="https://unpkg.com/echarts@4.9.0/map/js/world.js"></script> <script src="https://unpkg.com/echarts@4.9.0/map/js/world.js"></script>
<script src="/static/theme-server-status/js/mixin.js?v20240302"></script> <script src="/static/theme-server-status/js/mixin.js?v20240630"></script>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="/static/theme-server-status/js/html5shiv.js"></script> <script src="/static/theme-server-status/js/html5shiv.js"></script>

View File

@ -4,18 +4,24 @@
{{template "theme-server-status/content-nav" .}} {{template "theme-server-status/content-nav" .}}
<!-- showGroup true --> <!-- showGroup true -->
<template v-if="showGroup"> <template v-if="showGroup">
<section class="container content" style="max-width: 95vw; min-height: .01%;overflow-x: auto;" v-for="group in servicesTag"> <section v-if="servicesTag.length === 0" class="container content" style="max-width: 95vw; min-height: .01%;overflow-x: auto;">
<p>No Valid Service Monitor Configuration Entries Found. Please Verify in the <a href="/monitor">Admin Panel</a>.</p>
</section>
<section v-else class="container content" style="max-width: 95vw; min-height: .01%;overflow-x: auto;" v-for="group in servicesTag">
{{template "theme-server-status/service-group-true" .}} {{template "theme-server-status/service-group-true" .}}
</section> </section>
</template> </template>
<!-- showGroup false --> <!-- showGroup false -->
<template v-else> <template v-else>
<section class="container content" style="max-width: 95vw; min-height: .01%;overflow-x: auto;"> <section v-if="servicesNoTag.length === 0" class="container content" style="max-width: 95vw; min-height: .01%;overflow-x: auto;">
<p>No Valid Service Monitor Configuration Entries Found. Please Verify in the <a href="/monitor">Admin Panel</a>.</p>
</section>
<section v-else class="container content" style="max-width: 95vw; min-height: .01%;overflow-x: auto;">
{{template "theme-server-status/service-group-false" .}} {{template "theme-server-status/service-group-false" .}}
</section> </section>
</template> </template>
<section class="container content table-responsive" style="max-width: 95vw">
{{if .CycleTransferStats}} {{if .CycleTransferStats}}
<section class="container content table-responsive" style="max-width: 95vw">
<table class="table table-striped table-condensed table-hover"> <table class="table table-striped table-condensed table-hover">
<thead> <thead>
<tr class="node-group-tag"> <tr class="node-group-tag">
@ -62,16 +68,10 @@
{{end}} {{end}}
</tbody> </tbody>
</table> </table>
{{end}}
</section> </section>
{{end}}
{{template "theme-server-status/content-footer" .}} {{template "theme-server-status/content-footer" .}}
</div> </div>
<script>
// 初始化 Tooltip
$(document).ready(function(){
$('[data-toggle="tooltip"]').tooltip();
});
</script>
<script> <script>
new Vue({ new Vue({
el: '#app', el: '#app',
@ -80,13 +80,16 @@
page: 'service', page: 'service',
defaultTemplate: {{.Conf.Site.Theme}}, defaultTemplate: {{.Conf.Site.Theme}},
templates: {{.Themes}}, templates: {{.Themes}},
services: {{.Services}},
servicesTag: [], servicesTag: [],
servicesNoTag: [], servicesNoTag: []
}, },
created() { created() {
this.initData(); this.servicesTag = this.groupingData(this.initData(this.services),"type");
this.servicesNoTag = this.initData(this.services);
}, },
mounted() { mounted() {
this.initTooltip();
}, },
mixins: [mixinsVue], mixins: [mixinsVue],
methods: { methods: {
@ -103,32 +106,36 @@
} }
return n return n
}, },
initData() { initData(services) {
// @formatter:off let nodes = [];
const services = [] for (let key in services) {
{{range $service := .Services}} const service = services[key];
services.push({ let node = {
type: '{{$service.Monitor.Type}}', type: service.Monitor.Type,
name: '{{$service.Monitor.Name}}', name: service.Monitor.Name,
currentUp: parseInt('{{$service.CurrentUp}}'), currentUp: parseInt(service.CurrentUp),
currentDown: parseInt('{{$service.CurrentDown}}'), currentDown: parseInt(service.CurrentDown),
totalUp: parseInt('{{$service.TotalUp}}'), totalUp: parseInt(service.TotalUp),
totalDown: parseInt('{{$service.TotalDown}}'), totalDown: parseInt(service.TotalDown),
delay: '{{$service.Delay}}'.replaceAll("[","").replaceAll("]","").split(" "), up: service.Up,
up: '{{$service.Up}}'.replaceAll("[","").replaceAll("]","").split(" "), down: service.Down,
down: '{{$service.Down}}'.replaceAll("[","").replaceAll("]","").split(" "), delay: service.Delay,
}) avgDelay: parseInt(this.getAvgDelay(service.Delay)) + "ms",
{{end}} health: this.getStateInfo(this.getPercent(service.CurrentUp, service.CurrentDown)),
// @formatter:on totalUpTime: this.getProgressInfo(this.getPercent(service.TotalUp, service.TotalDown))
for (let i = 0; i < services.length; i++) { };
const service = services[i]; nodes.push(node);
service.avgDelay = parseInt(service.delay[service.delay.length - 1]) + "ms" };
service.health = this.getStateInfo(this.getPercent(service.currentUp, service.currentDown)) for (let i = 0; i < nodes.length; i++) {
service.dayDetail = this.getDayTails(service) const node = nodes[i];
service.totalUpTime = this.getProgressInfo(this.getPercent(service.totalUp, service.totalDown)) node.dayDetail = this.getDayTails(node)
} }
this.servicesTag = this.groupingData(services,"type"); return nodes
this.servicesNoTag = services; },
initTooltip() {
$(document).ready(function(){
$('[data-toggle="tooltip"]').tooltip();
});
}, },
getPercent(up, down) { getPercent(up, down) {
if (!up) { if (!up) {
@ -151,24 +158,24 @@
return this.toFixed2(currentUp / total * 100) return this.toFixed2(currentUp / total * 100)
}, },
getDayTails(service) { getDayTails(service) {
const result = [] const result = [];
for (let i = 0; i < service.up.length; i++) { for (let i = 0; i < service.up.length; i++) {
const up = service.up[i] const up = service.up[i];
const down = service.down[i] const down = service.down[i];
const delay = service.delay[i] let delay = Number(service.delay[i]);
let percent = this.getPercent(up, down) let percent = this.getPercent(up, down);
if (percent <= 0) { if (percent <= 0) {
percent = 0; percent = 0;
} }
let className = this.getStateInfo(percent).className let className = this.getStateInfo(percent).className;
let available = '{{tr "Availability"}}' let available = '{{tr "Availability"}}';
let averageLatency = '{{tr "AverageLatency"}}' let averageLatency = '{{tr "AverageLatency"}}';
const text = `${this.beforeDay(service.up.length - i - 1)}${available}${percent}%${averageLatency}${delay}ms` const text = `${this.beforeDay(service.up.length - i - 1)}${available}${Number(percent).toFixed(3)}%${averageLatency}${Number(delay).toFixed(3)}ms`;
result.push({ result.push({
text, className text, className
}) });
} }
return result return result;
}, },
beforeDay(days) { beforeDay(days) {
const today = new Date(); const today = new Date();
@ -203,8 +210,9 @@
return result; return result;
}, },
getProgressInfo(percent) { getProgressInfo(percent) {
const result = this.getStateInfo(percent) const result = this.getStateInfo(percent);
result.style = `width: ${parseInt(percent)}%`; result.style = `width: ${parseInt(percent)}%`;
result.percent = Number(percent).toFixed(2);
const className = result.className; const className = result.className;
if (className === "good") { if (className === "good") {
result.className = 'progress-bar progress-bar-success' result.className = 'progress-bar progress-bar-success'
@ -218,6 +226,17 @@
} }
return result return result
}, },
getAvgDelay(array) {
const { sum, count } = array.reduce((acc, value) => {
if (value !== 0) {
acc.sum += value;
acc.count += 1;
}
return acc;
}, { sum: 0, count: 0 });
return count > 0 ? sum / count : 0;
}
} }
}) })
</script> </script>