PortIO/resources/js/views/Tunnels/Show.vue
2023-07-30 23:52:39 +08:00

259 lines
5.8 KiB
Vue

<template>
<div>
<h2>隧道: {{ tunnel.name }}</h2>
</div>
<div>
<div id="chart" style="height: 400px"></div>
</div>
<div>
<h2>配置文件</h2>
<pre
>{{ tunnel.config.server }}
{{ tunnel.config.client }}
</pre>
</div>
<!-- <div v-if="tunnel.tunnel">
</div> -->
<div v-if="tunnel.run_id" class="mb-3">
<h2>强制下线</h2>
<button class="btn btn-primary" @click="kickTunnel()">强制下线</button>
</div>
<div>
<h2>删除</h2>
<button class="btn btn-primary" @click="deleteTunnel()">
删除隧道
</button>
</div>
</template>
<script setup>
import {onMounted, onUnmounted, ref} from "vue";
import http from "../../plugins/http";
import router from "../../plugins/router";
import * as echarts from "echarts";
import Humanize from 'humanize-plus'
const showChart = ref(false);
let chart = undefined;
let tunnel_id = router.currentRoute.value.params.id;
const tunnel = ref({
name: "",
protocol: "",
local_address: "",
remote_port: "",
config: {
server: "",
client: "",
},
run_id: "",
});
function getTunnel() {
http.get(`/tunnels/${tunnel_id}`).then((res) => {
tunnel.value = res.data;
});
}
function updateTunnel() {
http.put(`/tunnels/${tunnel_id}`, tunnel.value).then((res) => {
tunnel.value = res.data;
});
}
let chartOptions = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
formatter: function (data) {
let html = "";
if (data.length > 0) {
html += data[0].name + "<br/>";
}
for (let v of data) {
let colorEl =
'<span style="display:inline-block;margin-right:5px;' +
"border-radius:10px;width:9px;height:9px;background-color:" +
v.color +
'"></span>';
html += `${colorEl + v.seriesName}: ${Humanize.fileSize(
v.value
)}<br/>`;
}
return html;
},
},
legend: {
data: ["入站流量", "出站流量"],
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true,
},
xAxis: [
{
type: "category",
data: [],
},
],
yAxis: [
{
type: "value",
axisLabel: {
formatter: function (value) {
return Humanize.fileSize(value);
},
},
},
],
series: [
{
name: "入站流量",
type: "bar",
data: [],
},
{
name: "出站流量",
type: "bar",
data: [],
},
],
};
function initChart() {
let chartDom = document.getElementById("chart");
chart = echarts.init(chartDom, {
backgroundColor: "transparent",
renderer: "svg",
});
chartOptions && chart.setOption(chartOptions);
}
function deleteTunnel() {
if (confirm("确定删除隧道吗?")) {
http.delete(`/tunnels/${tunnel_id}`).then(() => {
alert("删除成功");
router.push({name: "tunnels"});
});
}
}
function kickTunnel() {
http.post(`/tunnels/${tunnel_id}/close`).then(() => {
refresh();
});
}
function refresh() {
http.get("/tunnels/" + tunnel_id).then((res) => {
tunnel.value = res.data;
// console.log(res.data)
// tunnel.value.tunnel = res.data.tunnel
// console.log(tunnel.value.tunnel.conf)
// console.log(tunnel,tunnel.value,res.data);
// console.log(res.data);
if (res.data.traffic) {
console.log(res.data.traffic)
console.log(showChart.value)
if (!showChart.value) {
initChart()
showChart.value = true;
}
let now = new Date();
now = new Date(
now.getFullYear(),
now.getMonth(),
now.getDate() - 6
);
let dates = [];
for (let i = 0; i < 7; i++) {
dates.push(
now.getFullYear() +
"-" +
(now.getMonth() + 1) +
"-" +
now.getDate()
);
now = new Date(
now.getFullYear(),
now.getMonth(),
now.getDate() + 1
);
}
chartOptions.xAxis[0].data = dates;
let trafficInArr = res.data.traffic.traffic_in;
let trafficOutArr = res.data.traffic.traffic_out;
if (!trafficInArr || !trafficOutArr) {
return;
}
trafficInArr = trafficInArr.reverse();
trafficOutArr = trafficOutArr.reverse();
if (chart) {
chartOptions.series[0].data = trafficInArr;
chartOptions.series[1].data = trafficOutArr;
chart.setOption(chartOptions);
}
}
});
}
refresh();
let resizeInterval = setInterval(() => {
chart && chart.resize();
});
onMounted(() => {
getTunnel();
window.addEventListener("resize", () => {
chart && chart.resize();
});
});
const timer = setInterval(refresh, 10000);
onUnmounted(() => {
clearInterval(timer);
if (resizeInterval) {
clearInterval(resizeInterval);
}
// remove listener
window.removeEventListener("resize", () => {
resizeInterval = setInterval(() => {
chart && chart.resize();
}, 1000);
initChart();
chart && chart.resize();
});
});
</script>