After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>${title?default("管理系统")}</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||||
|
<script src="${context}/static/dist/lib.min.js" type="text/javascript"></script>
|
||||||
|
<script src="${context}/static/dist/index.min.js" type="text/javascript"></script>
|
||||||
|
<link href="${context}/static/dist/index.min.css" rel="stylesheet"/>
|
||||||
|
<link href="${context}/static/css/base.css" rel="stylesheet"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<#include controlHolder("nav")/>
|
||||||
|
<#include screenHolder()/>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,232 @@
|
|||||||
|
<div id="app" v-cloak>
|
||||||
|
<el-card class="box-card control">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="3">
|
||||||
|
<a>Nginx 控制中心</a>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="5">
|
||||||
|
<a @click="nginxStart">
|
||||||
|
<el-image v-if="run" :src="'${UrlUtil.getUrl('/static/img/start_.png')}'"
|
||||||
|
style="width: 50px; height: 50px"
|
||||||
|
fit="fill"></el-image>
|
||||||
|
<el-image v-if="!run" :src="'${UrlUtil.getUrl('/static/img/start.png')}'"
|
||||||
|
style="width: 50px; height: 50px"
|
||||||
|
fit="fill"></el-image>
|
||||||
|
</a>
|
||||||
|
<a @click="nginxStop">
|
||||||
|
<el-image v-if="run" :src="'${UrlUtil.getUrl('/static/img/stop.png')}'"
|
||||||
|
style="width: 50px; height: 50px"
|
||||||
|
fit="fill"></el-image>
|
||||||
|
<el-image v-if="!run" :src="'${UrlUtil.getUrl('/static/img/stop_.png')}'"
|
||||||
|
style="width: 50px; height: 50px"
|
||||||
|
fit="fill"></el-image>
|
||||||
|
</a>
|
||||||
|
<a @click="nginxReload">
|
||||||
|
<el-image v-if="run" :src="'${UrlUtil.getUrl('/static/img/reload.png')}'"
|
||||||
|
style="width: 50px; height: 50px"
|
||||||
|
fit="fill"></el-image>
|
||||||
|
<el-image v-if="!run" :src="'${UrlUtil.getUrl('/static/img/reload_.png')}'"
|
||||||
|
style="width: 50px; height: 50px"
|
||||||
|
fit="fill"></el-image>
|
||||||
|
</a>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<el-card class="box-card pane-list" style="width: 260px;height: 140px" v-for="item in services">
|
||||||
|
<div class="pane">
|
||||||
|
<div class="img">
|
||||||
|
<el-image style="width: 60px;height:60px" src="/static/img/http.png"></el-image>
|
||||||
|
|
||||||
|
<a>{{item.title}}</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="info">
|
||||||
|
<el-switch
|
||||||
|
v-model="item.valid"
|
||||||
|
active-color="#13ce66"
|
||||||
|
active-text="启用"
|
||||||
|
inactive-text="暂停">
|
||||||
|
inactive-color="#ff4949">
|
||||||
|
</el-switch>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="more" @click="toSet(item)">
|
||||||
|
<el-button type="text" size="mini"><i class="el-icon-s-operation"></i></el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
#app {
|
||||||
|
padding: 10px;
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 1080px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-card {
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control a:first-child {
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control a {
|
||||||
|
display: inline-block;
|
||||||
|
line-height: 50px;
|
||||||
|
height: 50px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control a:hover {
|
||||||
|
background: #e7e7e7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control a:first-child:hover {
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane-list {
|
||||||
|
box-shadow: 0 0 0 0 inset !important;
|
||||||
|
-webkit-box-shadow: 0 0 0 0 inset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane-list:hover {
|
||||||
|
box-shadow: 0 0 70px -40px inset !important;
|
||||||
|
-webkit-box-shadow: 0 0 70px -40px inset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane {
|
||||||
|
width: 240px;
|
||||||
|
height: 120px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 0 15px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane .img {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane a {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 28px;
|
||||||
|
font-family: "微软雅黑";
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane .info {
|
||||||
|
flex-grow: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane .more {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
var app = new Vue({
|
||||||
|
mixins: [mixinBase, mixinForMgr],
|
||||||
|
el: "#app",
|
||||||
|
data: {
|
||||||
|
services: [],
|
||||||
|
run: ${run?default('false')}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onLoadService: function () {
|
||||||
|
var param = {
|
||||||
|
pageSize: 0
|
||||||
|
};
|
||||||
|
new Ajax("admin", "services", "find").post(param, function (response) {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
nav.e(response.errors[0].message);
|
||||||
|
} else {
|
||||||
|
this.services = response.result;
|
||||||
|
}
|
||||||
|
}.bind(this))
|
||||||
|
},
|
||||||
|
toSet: function (item) {
|
||||||
|
nav.openTab({
|
||||||
|
title: '映射配置',
|
||||||
|
name: 'mapping' + item.id,
|
||||||
|
url: '/admin/locations.htm?servicesId=' + item.id
|
||||||
|
})
|
||||||
|
},
|
||||||
|
startMonitor: function () {
|
||||||
|
if (window.EventSource) {
|
||||||
|
window.evtSource = new EventSource('${UrlUtil.getUrl("/sse/1")}');
|
||||||
|
window.evtSource.addEventListener('message', function (e) {
|
||||||
|
|
||||||
|
var msg = JSON.parse(e.data);
|
||||||
|
if (msg.type == 'NGINX_STATE') {//状态推送
|
||||||
|
if (this.run != msg.object.run) {
|
||||||
|
|
||||||
|
this.$notify.info({
|
||||||
|
title: '提示',
|
||||||
|
message: "Nginx 运行状态发生变化。",
|
||||||
|
duration: 5000
|
||||||
|
});
|
||||||
|
this.run = msg.object.run;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.bind(this))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
nginxStart: function () {
|
||||||
|
new Ajax("conf", "nginx", "start").post(function (response) {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
nav.e(response.errors[0].message);
|
||||||
|
} else {
|
||||||
|
this.onFind();
|
||||||
|
this.form.dialog = false;
|
||||||
|
}
|
||||||
|
}.bind(this))
|
||||||
|
},
|
||||||
|
nginxStop: function () {
|
||||||
|
new Ajax("conf", "nginx", "stop").post(function (response) {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
nav.e(response.errors[0].message);
|
||||||
|
} else {
|
||||||
|
this.onFind();
|
||||||
|
this.form.dialog = false;
|
||||||
|
}
|
||||||
|
}.bind(this))
|
||||||
|
},
|
||||||
|
configFlush: function () {
|
||||||
|
ajax.configFlush();
|
||||||
|
},
|
||||||
|
onRefresh: function () {
|
||||||
|
this.configFlush();
|
||||||
|
this.onFind();
|
||||||
|
},
|
||||||
|
nginxReload: function () {
|
||||||
|
new Ajax("conf", "nginx", "reload").post(function (response) {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
nav.e(response.errors[0].message);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
}.bind(this))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted: function () {
|
||||||
|
this.onLoadService();
|
||||||
|
this.startMonitor();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|