添加VPN服务器配置管理, 未完善路由等配置
This commit is contained in:
parent
8092709950
commit
1051d0e7e8
|
|
@ -4,6 +4,11 @@
|
||||||
<!-- 左侧服务器列表 -->
|
<!-- 左侧服务器列表 -->
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>服务器列表</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<div class="server-list">
|
<div class="server-list">
|
||||||
<div
|
<div
|
||||||
v-for="server in serverList"
|
v-for="server in serverList"
|
||||||
|
|
@ -13,7 +18,10 @@
|
||||||
@click="selectServer(server)"
|
@click="selectServer(server)"
|
||||||
>
|
>
|
||||||
<div class="server-info">
|
<div class="server-info">
|
||||||
<div class="server-name">{{ server.name }}</div>
|
<div class="server-name">
|
||||||
|
<span class="status-indicator" :class="{ 'online': onlineServers.includes(server.server_id) }"></span>
|
||||||
|
{{ server.name }}
|
||||||
|
</div>
|
||||||
<div class="server-ip">{{ server.server_ip }}</div>
|
<div class="server-ip">{{ server.server_ip }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="server-actions">
|
<div class="server-actions">
|
||||||
|
|
@ -219,10 +227,10 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, onMounted } from 'vue';
|
import { ref, reactive, onMounted, onUnmounted } from 'vue';
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||||
import {getAllDefaultUsers} from '@/api/user';
|
import {getAllDefaultUsers} from '@/api/user';
|
||||||
import { GetVPNServerConfigHandler, SetVPNServerConfigHandler, DeleteVPNServerHandler, GetVPNAddressPoolHandler, GetVPNTunnelConfigHandler } from '@/api/vpn';
|
import { GetVPNServerConfigHandler, SetVPNServerConfigHandler, DeleteVPNServerHandler, GetVPNAddressPoolHandler, GetVPNTunnelConfigHandler, GetVPNServerOnlineListHandler } from '@/api/vpn';
|
||||||
|
|
||||||
interface UserID {
|
interface UserID {
|
||||||
id: number;
|
id: number;
|
||||||
|
|
@ -305,6 +313,8 @@ const addressPools = ref<AddressPoolRequest[]>([]);
|
||||||
const tunnelConfigs = ref<TunnelRequestAndResponse[]>([]);
|
const tunnelConfigs = ref<TunnelRequestAndResponse[]>([]);
|
||||||
const user_select_opts = ref<Array<{value: number, label: string}>>([]);
|
const user_select_opts = ref<Array<{value: number, label: string}>>([]);
|
||||||
const user_select_ids = ref<number[]>([]);
|
const user_select_ids = ref<number[]>([]);
|
||||||
|
const onlineServers = ref<string[]>([]);
|
||||||
|
let timer: number | null = null;
|
||||||
// 获取服务器配置列表
|
// 获取服务器配置列表
|
||||||
const getServerConfigs = async () => {
|
const getServerConfigs = async () => {
|
||||||
try {
|
try {
|
||||||
|
|
@ -338,6 +348,36 @@ const getTunnelConfigs = async () => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 获取在线服务器列表
|
||||||
|
const getOnlineServers = async () => {
|
||||||
|
try {
|
||||||
|
const response = await GetVPNServerOnlineListHandler();
|
||||||
|
if (response.data && Array.isArray(response.data)) {
|
||||||
|
onlineServers.value = response.data.map((server: any) => server.server_id);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取在线服务器状态失败:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 启动定时查询
|
||||||
|
const startOnlineStatusTimer = () => {
|
||||||
|
// 立即查询一次
|
||||||
|
getOnlineServers();
|
||||||
|
// 设置定时器,每2秒查询一次
|
||||||
|
timer = window.setInterval(() => {
|
||||||
|
getOnlineServers();
|
||||||
|
}, 2000);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 停止定时查询
|
||||||
|
const stopOnlineStatusTimer = () => {
|
||||||
|
if (timer !== null) {
|
||||||
|
clearInterval(timer);
|
||||||
|
timer = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 选择服务器
|
// 选择服务器
|
||||||
const selectServer = (server: ServerConfig) => {
|
const selectServer = (server: ServerConfig) => {
|
||||||
selectedServer.value = { ...server };
|
selectedServer.value = { ...server };
|
||||||
|
|
@ -354,35 +394,6 @@ const selectServer = (server: ServerConfig) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 添加服务器
|
|
||||||
const addServer = () => {
|
|
||||||
const newServer: ServerConfig = {
|
|
||||||
name: "新服务器",
|
|
||||||
server_id: "",
|
|
||||||
server_ip: "",
|
|
||||||
server_info: "",
|
|
||||||
udp_port: 1194,
|
|
||||||
tcp_port: 443,
|
|
||||||
protocol: 2,
|
|
||||||
ip_type: 4,
|
|
||||||
ipv4_address_pool: "10.8.0.0/24",
|
|
||||||
ipv6_address_pool: "",
|
|
||||||
dns_server: "8.8.8.8",
|
|
||||||
tunnel: "tun",
|
|
||||||
allow_user_id: [],
|
|
||||||
encryption: "aes-256-gcm",
|
|
||||||
hash: "sha256",
|
|
||||||
user_max_device: 5,
|
|
||||||
duration_time: 300,
|
|
||||||
ipv4_router: [],
|
|
||||||
ipv6_router: []
|
|
||||||
};
|
|
||||||
|
|
||||||
serverList.value.push(newServer);
|
|
||||||
selectServer(newServer);
|
|
||||||
ElMessage.success('已添加新服务器');
|
|
||||||
};
|
|
||||||
|
|
||||||
// 删除服务器
|
// 删除服务器
|
||||||
const deleteServer = async (serverId: string) => {
|
const deleteServer = async (serverId: string) => {
|
||||||
try {
|
try {
|
||||||
|
|
@ -469,6 +480,12 @@ onMounted(() => {
|
||||||
getAddressPools();
|
getAddressPools();
|
||||||
getTunnelConfigs();
|
getTunnelConfigs();
|
||||||
GetAllDefaultUsers();
|
GetAllDefaultUsers();
|
||||||
|
startOnlineStatusTimer();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 组件卸载时清理定时器
|
||||||
|
onUnmounted(() => {
|
||||||
|
stopOnlineStatusTimer();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
@ -518,6 +535,22 @@ onMounted(() => {
|
||||||
.server-name {
|
.server-name {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-indicator {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: #909399;
|
||||||
|
margin-right: 8px;
|
||||||
|
transition: background-color 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-indicator.online {
|
||||||
|
background-color: #67c23a;
|
||||||
|
box-shadow: 0 0 4px rgba(103, 194, 58, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.server-ip {
|
.server-ip {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue