Merge branch 'master' of github.com:naiba/nezha

This commit is contained in:
naiba 2021-01-30 19:06:17 +08:00
commit 061a9992ff
7 changed files with 277 additions and 266 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
function callAllJsFiles(t){var e=document.createElement("script");e.setAttribute("type","text/javascript"),e.setAttribute("src",t),document.getElementsByTagName("head")[0].appendChild(e)}callAllJsFiles("/static/theme-daynight/js/mode.js?v202101290086"),callAllJsFiles("/static/theme-daynight/js/navtop.js?v202101290086"); function callAllJsFiles(t){var e=document.createElement("script");e.setAttribute("type","text/javascript"),e.setAttribute("src",t),document.getElementsByTagName("head")[0].appendChild(e)}callAllJsFiles("/static/theme-daynight/js/mode.js?v202101301768"),callAllJsFiles("/static/theme-daynight/js/navtop.js?v202101301768");

View File

@ -1 +1 @@
$(document).ready((function(){$(".hamburger").click((function(){$(this).toggleClass("is-active"),$(".nav-menu").toggleClass("active"),$(".nav-bar").toggleClass("active")}))}));var btn=$("#back-to-top");$(window).scroll((function(){$(window).scrollTop()>300?btn.addClass("show"):btn.removeClass("show")})),btn.on("click",(function(o){o.preventDefault(),$(".service-mobile-toggle").hasClass("smt-active")&&($(".service-mobile-toggle ").removeClass("smt-active"),$("html, body").animate({scrollTop:0},"300")),$("html, body").animate({scrollTop:0},"300")})); $(document).ready((function(){$(".hamburger").click((function(){$(this).toggleClass("is-active"),$(".nav-menu ul").slideToggle("500","linear")}))}));var btn=$("#back-to-top");$(window).scroll((function(){$(window).scrollTop()>300?btn.addClass("show"):btn.removeClass("show")})),$(document).ready((function(){btn.on("click",(function(o){o.preventDefault(),$(".service-mobile-toggle").hasClass("smt-active")&&($(".service-mobile-toggle ").removeClass("smt-active"),$("html, body").animate({scrollTop:0},"300")),$("html, body").animate({scrollTop:0},"300")}))}));

View File

@ -1 +1 @@
function callAllJsFiles(e){var t=document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src",e),document.getElementsByTagName("head")[0].appendChild(t)}callAllJsFiles("/static/theme-daynight/js/navtop.js?v202101290086"),callAllJsFiles("/static/theme-daynight/js/mode.js?v202101290086"),callAllJsFiles("/static/theme-daynight/js/tooltip.js?v202101290086"),$(".corner").hover((function(){$(this).attr("aria-expanded","true"===$(this).attr("aria-expanded")?"false":"true")}));const hour=new Date(Date.now()).getHours();(hour>17||hour<4)&&(document.querySelector("input[name=service-theme]").checked=!0,document.getElementsByTagName("BODY")[0].setAttribute("data-theme","dark")),$(document).ready((function(){$(".fa-plus").click((function(){$(".service-mobile-toggle").toggleClass("smt-active")}))})); function callAllJsFiles(e){var t=document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src",e),document.getElementsByTagName("head")[0].appendChild(t)}callAllJsFiles("/static/theme-daynight/js/navtop.js?v202101301768"),callAllJsFiles("/static/theme-daynight/js/mode.js?v202101301768"),callAllJsFiles("/static/theme-daynight/js/tooltip.js?v202101301768"),$(".corner").hover((function(){$(this).attr("aria-expanded","true"===$(this).attr("aria-expanded")?"false":"true")}));const hour=new Date(Date.now()).getHours();(hour>17||hour<4)&&(document.querySelector("input[name=service-theme]").checked=!0,document.getElementsByTagName("BODY")[0].setAttribute("data-theme","dark")),$(document).ready((function(){$(".service-mobile-toggle ul li:first-of-type").click((function(){$(".service-mobile-toggle").toggleClass("smt-active")}))})),$(document).on("click",(function(e){0==$(e.target).closest(".service-mobile-toggle").length&&$(".service-mobile-toggle").hasClass("smt-active")&&$(".service-mobile-toggle").toggleClass("smt-active")}));

View File

@ -1,107 +1,122 @@
{{define "theme-daynight/home"}} {{define "theme-daynight/home"}}
<!DOCTYPE html> <!doctype html>
<html lang="zh-Hans"> <html lang="zh-Hans">
<head>
<meta charset="utf-8" /> <head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>{{.Title}}</title> <title>{{.Title}}</title>
<link rel="shortcut icon" type="image/png" href="/static/logo.png" /> <link rel="shortcut icon" type="image/png" href="/static/logo.png" />
<link rel="stylesheet" href="/static/theme-daynight/css/main.css?v202101290086" /> <link rel="stylesheet" href="/static/theme-daynight/css/main.css?v202101301768">
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet" /> <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
{{if ts .CustomCode}} {{.CustomCode|safe}} {{end}} {{if ts .CustomCode}}
</head> {{.CustomCode|safe}}
{{end}}
</head>
<body data-theme="light" data-gridlist="grid"> <body data-theme="light" data-gridlist="grid">
<header class="nav-bar clearfix"> <header>
<figure class="logo"><a href="/">{{.Conf.Site.Brand}}</a></figure> <section class="nav-bar clearfix">
<div class="icon-container"> <figure class="logo"><a href="/">{{.Conf.Site.Brand}}</a></figure>
<div class="row cf"> <div class="icon-container">
<div class="three col"> <div class="row cf">
<div class="hamburger" id="hamburger-icon"><span class="line"></span><span class="line"></span><span class="line"></span></div> <div class="three col">
</div> <div class="hamburger" id="hamburger-icon"><span class="line"></span><span class="line"></span><span
</div> class="line"></span></div>
</div> </div>
<nav class="nav-menu"> </div>
<ul> </div>
<li><a href="/">首页</a></li> <nav class="nav-menu">
<li><a href="/service">服务状态</a></li> <ul>
{{if .Admin}} <li><a href="/">首页</a></li>
<li><a href="/server" style="padding: 0.8em; text-align: center">管理后台</a></li> <li><a href="/service">服务状态</a></li>
{{else}} {{if .Admin}}
<li><a href="/login">登录</a></li> <li><a href="/server" style="padding:.8em;text-align:center;">管理后台</a></li>
{{end}} {{else}}
</ul> <li><a href="/login">登录</a></li>
</nav> {{end}}
</ul>
</nav>
</section>
</header> </header>
<main> <main>
<div id="app"> <div id="app">
<div class="server-info-container" v-for="server in servers" :id="server.ID"> <div class="server-info-container" v-for='server in servers' :id="server.ID">
<div class="info-body"> <div class="info-body">
<ul class="server-info-body-container"> <ul class="server-info-body-container">
<li> <li>
<div :class="'state-'+ (server.live?'online':'offline')"> <div :class="'state-'+ (server.live?'online':'offline')">
<p>@#server.live?'Running':'Down'#@</p> <p>@#server.live?'Running':'Down'#@</p>
</div> </div>
</li> </li>
<li> <li>
<h3>@#server.Name#@</h3> <h3>@#server.Name#@</h3>
</li> </li>
<li><img :src="'/static/theme-daynight/img/flag/'+(server.Host&&server.Host.CountryCode?server.Host.CountryCode.toUpperCase():'CN')+'.png'" :title="server.Host.CountryCode.toUpperCase()" /></li> <li><img :src="'/static/theme-daynight/img/flag/'+(server.Host&&server.Host.CountryCode?server.Host.CountryCode.toUpperCase():'CN')+'.png'"
<li>@#server.Host.Platform#@</li> :title="server.Host.CountryCode.toUpperCase()" /></li>
<li>@#server.Host.CountryCode.toUpperCase()#@</li> <li>@#server.Host.Platform#@</li>
<li>@#formatByteSize(server.State.MemUsed)#@ / @#formatByteSize(server.Host.MemTotal)#@</li> <li>@#server.Host.CountryCode.toUpperCase()#@</li>
<li>@#server.State?secondToDate(server.State.Uptime):'-'#@</li> <li>@#formatByteSize(server.State.MemUsed)#@ / @#formatByteSize(server.Host.MemTotal)#@</li>
<li>@#formatByteSize(server.State.SwapUsed)#@ / @#formatByteSize(server.Host.SwapTotal)#@</li> <li>@#server.State?secondToDate(server.State.Uptime):'-'#@</li>
<li>@#formatByteSize(server.State.DiskUsed)#@ / @#formatByteSize(server.Host.DiskTotal)#@</li> <li>@#formatByteSize(server.State.SwapUsed)#@ / @#formatByteSize(server.Host.SwapTotal)#@</li>
<li>@#formatByteSize(server.State.NetInTransfer)#@ (@#formatByteSize(server.State.NetInSpeed)#@/s)</li> <li>@#formatByteSize(server.State.DiskUsed)#@ / @#formatByteSize(server.Host.DiskTotal)#@</li>
<li>@#formatByteSize(server.State.NetOutTransfer)#@ (@#formatByteSize(server.State.NetOutSpeed)#@/s)</li> <li>@#formatByteSize(server.State.NetInTransfer)#@ (@#formatByteSize(server.State.NetInSpeed)#@/s)</li>
<li> <li>@#formatByteSize(server.State.NetOutTransfer)#@ (@#formatByteSize(server.State.NetOutSpeed)#@/s)</li>
<div class="cpu-bar"> <li>
<div> <div class="cpu-bar">
<h4>CPU</h4> <div>
</div> <h4>CPU</h4>
<div v-if="server.State" :class="formatPercent(server.live,server.State.CPU, 100).class" :title="formatPercent(server.live,server.State.CPU,100).percent+'%'"> </div>
<div class="progress-bar" role="progressbar" :aria-valuenow="formatPercent(server.live,server.State.CPU,100).percent" aria-valuemin="0" aria-valuemax="100" :style="formatPercent(server.live,server.State.CPU, 100).style"> <div v-if="server.State" :class="formatPercent(server.live,server.State.CPU, 100).class"
<p>@#formatPercent(server.live,server.State.CPU,100).percent#@%</p> :title="formatPercent(server.live,server.State.CPU,100).percent+'%'">
</div> <div class="progress-bar" role="progressbar" :aria-valuenow="formatPercent(server.live,server.State.CPU,100).percent" aria-valuemin="0" aria-valuemax="100"
</div> :style="formatPercent(server.live,server.State.CPU, 100).style">
</div> <p>@#formatPercent(server.live,server.State.CPU,100).percent#@%</p>
</li> </div>
<li> </div>
<div class="ram-bar"> </div>
<div> </li>
<h4>RAM</h4> <li>
</div> <div class="ram-bar">
<div v-if="server.State" :class="formatPercent(server.live,server.State.MemUsed, server.Host.MemTotal).class" :title="parseInt(server.State?server.State.MemUsed/server.Host.MemTotal*100:0)+'%'"> <div>
<div class="progress-bar" role="progressbar" :aria-valuenow="parseInt(server.State?server.State.MemUsed/server.Host.MemTotal*100:0)" aria-valuemin="0" aria-valuemax="100" :style="formatPercent(server.live,server.State.MemUsed, server.Host.MemTotal).style"> <h4>RAM</h4>
<p>@#parseInt(server.State?server.State.MemUsed/server.Host.MemTotal*100:0)#@%</p> </div>
</div> <div v-if="server.State"
</div> :class="formatPercent(server.live,server.State.MemUsed, server.Host.MemTotal).class"
</div> :title="parseInt(server.State?server.State.MemUsed/server.Host.MemTotal*100:0)+'%'">
</li> <div class="progress-bar" role="progressbar" :aria-valuenow="parseInt(server.State?server.State.MemUsed/server.Host.MemTotal*100:0)" aria-valuemin="0" aria-valuemax="100"
<li> :style="formatPercent(server.live,server.State.MemUsed, server.Host.MemTotal).style">
<div class="disk-bar"> <p>@#parseInt(server.State?server.State.MemUsed/server.Host.MemTotal*100:0)#@%</p>
<div> </div>
<h4>硬盘</h4> </div>
</div> </div>
<div v-if="server.State" :class="formatPercent(server.live,server.State.DiskUsed, server.Host.DiskTotal).class" :title="parseInt(server.State?server.State.DiskUsed/server.Host.DiskTotal*100:0)+'%'"> </li>
<div class="progress-bar" role="progressbar" :aria-valuenow="parseInt(server.State?server.State.DiskUsed/server.Host.DiskTotal*100:0)" aria-valuemin="0" aria-valuemax="100" :style="formatPercent(server.live,server.State.DiskUsed, server.Host.DiskTotal).style"> <li>
<p>@#parseInt(server.State?server.State.DiskUsed/server.Host.DiskTotal*100:0)#@%</p> <div class="disk-bar">
</div> <div>
</div> <h4>硬盘</h4>
</div> </div>
</li> <div v-if="server.State"
</ul> :class="formatPercent(server.live,server.State.DiskUsed, server.Host.DiskTotal).class"
</div> :title="parseInt(server.State?server.State.DiskUsed/server.Host.DiskTotal*100:0)+'%'">
<div class="progress-bar" role="progressbar" :aria-valuenow="parseInt(server.State?server.State.DiskUsed/server.Host.DiskTotal*100:0)" aria-valuemin="0" aria-valuemax="100"
:style="formatPercent(server.live,server.State.DiskUsed, server.Host.DiskTotal).style">
<p>@#parseInt(server.State?server.State.DiskUsed/server.Host.DiskTotal*100:0)#@%</p>
</div>
</div>
</div>
</li>
</ul>
</div>
</div> </div>
</div> </div>
<div class="sidebar-container"> <div class="sidebar-container">
<ul> <ul>
<li><i class="fas fa-sun" title="白昼模式"></i><span>白昼模式</span></li> <li><i class="fas fa-sun" title="白昼模式"></i><span>白昼模式</span></li>
<li><i class="fas fa-moon" title="暗黑模式"></i><span>暗黑模式</span></li> <li><i class="fas fa-moon" title="暗黑模式"></i><span>暗黑模式</span></li>
@ -109,7 +124,7 @@
<li><i class="fas fa-list-ul" title="列表视图"></i><span>列表视图</span></li> <li><i class="fas fa-list-ul" title="列表视图"></i><span>列表视图</span></li>
</ul> </ul>
</div> </div>
</main> </main>
<section class="dark-light-toggle"> <section class="dark-light-toggle">
<label class="switcher"> <label class="switcher">
@ -119,155 +134,150 @@
</div> </div>
</label> </label>
</section> </section>
<!-- Back to top button --> <!-- Back to top button -->
<a id="back-to-top"></a> <a id="back-to-top"></a>
<footer> <footer>
<div class="footer-container"> <div class="footer-container">
<div> <div><a href="https://github.com/naiba/nezha" target="_blank">Powered by 哪吒面板 · {{.Version}}</a>
<a href="https://github.com/naiba/nezha" target="_blank">Powered by 哪吒面板 · {{.Version}}</a> <p>&copy; <span id="copyright-date">
<p> <script>document.getElementById('copyright-date').appendChild(document.createTextNode(new Date().getFullYear()))</script>
&copy; </span> · <a href="https://blog.jackiesung.com" target="_blank">Theme designed by Jackie Sung</a>
<span id="copyright-date"> </p>
<script> </div>
document.getElementById("copyright-date").appendChild(document.createTextNode(new Date().getFullYear()));
</script>
</span>
· <a href="https://blog.jackiesung.com" target="_blank">Theme designed by Jackie Sung</a>
</p>
</div> </div>
</div>
</footer> </footer>
<script src="/static/theme-daynight/js/main.js?v202101290086"></script> <script src="/static/theme-daynight/js/main.js?v202101301768" ></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script>
<script> <script>
const initData = {{.Servers }}; const initData = {{.Servers }};
var statusCards = new Vue({ var statusCards = new Vue({
el: '#app', el: '#app',
delimiters: ['@#', '#@'], delimiters: ['@#', '#@'],
data: { data: {
servers: initData, servers: initData,
cache: [], cache: [],
}, },
mounted() { mounted() {
this.DarkMode(); this.DarkMode();
}, },
methods: { methods: {
mergeUsage(state, host) { mergeUsage(state, host) {
if (!state) { if (!state) {
return 0 return 0
} }
if (!host) { if (!host) {
return state.CPU return state.CPU
} }
return (state.CPU + (state.MemUsed / host.MemTotal * 100) + (state.DiskUsed / host.DiskTotal * 100)) / 3 return (state.CPU + (state.MemUsed / host.MemTotal * 100) + (state.DiskUsed / host.DiskTotal * 100)) / 3
}, },
formatPercent(live, used, total) { formatPercent(live, used, total) {
const percent = live ? (parseInt(used / total * 100) || 0) : -1 const percent = live ? (parseInt(used / total * 100) || 0) : -1
if (!this.cache[percent]) { if (!this.cache[percent]) {
this.cache[percent] = { this.cache[percent] = {
class: { class: {
ui: true, ui: true,
progress: true, progress: true,
}, },
style: { style: {
'transition-duration': '300ms', 'transition-duration': '300ms',
'min-width': 'unset', 'min-width': 'unset',
width: percent + '% !important', width: percent + '% !important',
}, },
percent, percent,
} }
if (percent < 0) { if (percent < 0) {
this.cache[percent].style['background-color'] = 'slategray' this.cache[percent].style['background-color'] = 'slategray'
this.cache[percent].class.offline = true this.cache[percent].class.offline = true
} else if (percent < 51) { } else if (percent < 51) {
this.cache[percent].style['background-color'] = '#53B449' this.cache[percent].style['background-color'] = '#53B449'
this.cache[percent].class.fine = true this.cache[percent].class.fine = true
} else if (percent < 81) { } else if (percent < 81) {
this.cache[percent].style['background-color'] = '#FBB142' this.cache[percent].style['background-color'] = '#FBB142'
this.cache[percent].class.warning = true this.cache[percent].class.warning = true
} else { } else {
this.cache[percent].style['background-color'] = '#F23D34' this.cache[percent].style['background-color'] = '#F23D34'
this.cache[percent].class.error = true this.cache[percent].class.error = true
} }
} }
return this.cache[percent] return this.cache[percent]
}, },
readableBytes(bytes) { readableBytes(bytes) {
var i = Math.floor(Math.log(bytes) / Math.log(1024)), var i = Math.floor(Math.log(bytes) / Math.log(1024)),
sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
return (bytes / Math.pow(1024, i)).toFixed(0) + ' ' + sizes[i]; return (bytes / Math.pow(1024, i)).toFixed(0) + ' ' + sizes[i];
}, },
DarkMode() { DarkMode() {
const hour = new Date(Date.now()).getHours() const hour = new Date(Date.now()).getHours()
if (hour > 17 || hour < 4) { if (hour > 17 || hour < 4) {
document.querySelector("input[name=theme]").checked = true; document.querySelector("input[name=theme]").checked = true;
document.getElementsByTagName("BODY")[0].setAttribute('data-theme', 'dark'); document.getElementsByTagName("BODY")[0].setAttribute('data-theme', 'dark');
} }
}, },
secondToDate(s) { secondToDate(s) {
var d = Math.floor(s / 3600 / 24); var d = Math.floor(s / 3600 / 24);
if (d > 0) { if (d > 0) {
return d + "天" return d + "天"
} }
var h = Math.floor(s / 3600 % 24); var h = Math.floor(s / 3600 % 24);
var m = Math.floor(s / 60 % 60); var m = Math.floor(s / 60 % 60);
var s = Math.floor(s % 60); var s = Math.floor(s % 60);
return h + ":" + ("0" + m).slice(-2) + ":" + ("0" + s).slice(-2); return h + ":" + ("0" + m).slice(-2) + ":" + ("0" + s).slice(-2);
}, },
formatTimestamp(t) { formatTimestamp(t) {
return new Date(t * 1000).toLocaleString() return new Date(t * 1000).toLocaleString()
}, },
formatByteSize(bs) { formatByteSize(bs) {
const x = this.readableBytes(bs) const x = this.readableBytes(bs)
return x != "NaN undefined" ? x : '0 KB' return x != "NaN undefined" ? x : '0 KB'
} }
} }
}) })
const wsProtocol = window.location.protocol == "https:" ? "wss" : "ws" const wsProtocol = window.location.protocol == "https:" ? "wss" : "ws"
const ws = new WebSocket(wsProtocol + '://' + window.location.host + '/ws'); const ws = new WebSocket(wsProtocol + '://' + window.location.host + '/ws');
ws.onopen = function (evt) { ws.onopen = function (evt) {
Swal.fire({ Swal.fire({
position: 'top', position: 'top',
icon: 'success', icon: 'success',
title: '实时通道建立', title: '实时通道建立',
text: '可以实时获取最新监控数据啦', text: '可以实时获取最新监控数据啦',
showConfirmButton: false, showConfirmButton: false,
timer: 2000 timer: 2000
}); });
} }
ws.onmessage = function (evt) { ws.onmessage = function (evt) {
statusCards.servers = JSON.parse(evt.data) statusCards.servers = JSON.parse(evt.data)
const keys = Object.keys(statusCards.servers) const keys = Object.keys(statusCards.servers)
for (let i = 0; i < keys.length; i++) { for (let i = 0; i < keys.length; i++) {
const ns = statusCards.servers[keys[i]]; const ns = statusCards.servers[keys[i]];
if (!ns.Host) ns.live = false if (!ns.Host) ns.live = false
else { else {
const lastActive = new Date(ns.LastActive).getTime() const lastActive = new Date(ns.LastActive).getTime()
if (Date.now() - lastActive > 20 * 1000) { if (Date.now() - lastActive > 20 * 1000) {
ns.live = false ns.live = false
} else { } else {
ns.live = true ns.live = true
} }
} }
} }
} }
ws.onclose = function () { ws.onclose = function () {
Swal.fire({ Swal.fire({
position: 'top', position: 'top',
icon: 'error', icon: 'error',
title: '实时通道断开', title: '实时通道断开',
text: '无法实时获取最新监控数据咯', text: '无法实时获取最新监控数据咯',
showConfirmButton: false, showConfirmButton: false,
timer: 2000 timer: 2000
}); });
} }
</script> </script>
</body> </body>
</html> </html>
{{end}} {{end}}

View File

@ -7,36 +7,40 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{{.Title}}</title> <title>{{.Title}}</title>
<link rel="shortcut icon" type="image/png" href="/static/logo.png" /> <link rel="shortcut icon" type="image/png" href="/static/logo.png" />
<link rel="stylesheet" href="/static/theme-daynight/css/service.css?v202101290086" /> <link rel="stylesheet" href="/static/theme-daynight/css/service.css?v202101301768" />
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet" /> <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet" />
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
{{if ts .CustomCode}} {{.CustomCode|safe}} {{end}} {{if ts .CustomCode}}
{{.CustomCode|safe}}
{{end}}
</head> </head>
<body data-theme="light" data-gridlist="list"> <body data-theme="light" data-gridlist="list">
<article> <article>
<header class="nav-bar clearfix"> <header>
<figure class="logo"><a href="/">{{.Conf.Site.Brand}}</a></figure> <section class="nav-bar clearfix">
<div class="icon-container"> <figure class="logo"><a href="/">{{.Conf.Site.Brand}}</a></figure>
<div class="row cf"> <div class="icon-container">
<div class="three col"> <div class="row cf">
<div class="hamburger" id="hamburger-icon"><span class="line"></span><span class="line"></span><span class="line"></span></div> <div class="three col">
<div class="hamburger" id="hamburger-icon"><span class="line"></span><span class="line"></span><span class="line"></span></div>
</div>
</div>
</div> </div>
</div> <nav class="nav-menu">
</div> <ul>
<nav class="nav-menu"> <li><a href="/">首页</a></li>
<ul> <li><a href="/service">服务状态</a></li>
<li><a href="/">首页</a></li> {{if .Admin}}
<li><a href="/service">服务状态</a></li> <li><a href="/server" style="padding:.8em;text-align:center;">管理后台</a></li>
{{if .Admin}} {{else}}
<li><a href="/server" style="padding: 0.8em; text-align: center">管理后台</a></li> <li><a href="/login">登录</a></li>
{{else}} {{end}}
<li><a href="/login">登录</a></li> </ul>
{{end}} </nav>
</ul> </section>
</nav>
</header> </header>
<main> <main>
@ -69,7 +73,7 @@
{{end}} {{end}}
</section> </section>
</main> </main>
<div class="sidebar-container"> <div class="sidebar-container">
<ul> <ul>
<li><i class="fas fa-sun" title="白昼模式"></i><span>白昼模式</span></li> <li><i class="fas fa-sun" title="白昼模式"></i><span>白昼模式</span></li>
@ -92,7 +96,7 @@
</li> </li>
<li> <li>
<label class="switcher"> <label class="switcher">
<input type="checkbox" name="service-grid" id="grid-list" checked /> <input type="checkbox" name="service-grid" id="grid-list" checked/>
<div> <div>
<i class="fas fa-grip-horizontal"></i> <i class="fas fa-grip-horizontal"></i>
</div> </div>
@ -117,12 +121,13 @@
</div> </div>
</div> </div>
</footer> </footer>
<!-- Back to top button --> <!-- Back to top button -->
<a id="back-to-top"></a> <a id="back-to-top"></a>
</article> </article>
<script src="/static/theme-daynight/js/service.js?v202101290086"></script> <script src="/static/theme-daynight/js/service.js?v202101301768"></script>
</body> </body>
</html> </html>
{{end}} {{end}}