添加VPN服务器配置管理, 未完善路由等配置

This commit is contained in:
lijun 2025-12-16 21:35:27 +08:00
parent 8092709950
commit 1051d0e7e8
1 changed files with 65 additions and 32 deletions

View File

@ -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 {