UNPKG

vpn_based_remote_access_system

Version:

毕设:基于OpenVPN的远程访问系统

131 lines (113 loc) 5.17 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>系统管理员界面</title> <style> .collapsible { background-color: #777; color: white; cursor: pointer; padding: 18px; width: 100%; border: none; text-align: left; outline: none; font-size: 15px; margin-top: 5px; } .active, .collapsible:hover { background-color: #555; } .content { padding: 0 18px; display: none; overflow: hidden; background-color: #f1f1f1; } </style> </head> <body> <h2>系统管理员界面</h2> <button type="button" class="collapsible">用户管理</button> <div class="content"> <p>系统内用户信息如下</p> <div id="userManagement"></div> </div> <button type="button" class="collapsible">日志管理</button> <div class="content"> <p>日志信息如下</p> <select id="logDates" onchange="loadLogs(this.value)"></select> <pre id="logContent"></pre> </div> <button type="button" class="collapsible">连接管理</button> <div class="content"> <p>代理服务器连接情况如下</p> <div id="linkManagement"></div> </div> <script> let lastLogTime = ''; const coll = document.getElementsByClassName("collapsible"); for (let i = 0; i < coll.length; i++) { coll[i].addEventListener("click", function () { this.classList.toggle("active"); const content = this.nextElementSibling; if (content.style.display === "block") { content.style.display = "none"; } else { content.style.display = "block"; } }); } async function loadUsers() { const response = await fetch('/adminUsers'); const data = await response.json(); const container = document.getElementById('userManagement'); let html = `<table border="1"><tr><th>用户名</th><th>邮箱</th><th>IP地址</th><th>分配端口</th><th>登录时间</th><th>注册时间</th></tr>`; data.data.forEach(user => { html += `<tr><td>${user.username}</td><td>${user.email}</td><td>${user.ip}</td><td>${user.port}</td><td>${user.last_login_at}</td><td>${user.registered_at}</td></tr>`; }); html += `</table>`; container.innerHTML = html; } async function loadLogs(date = '') { const url = `/adminLogs?date=${date}` + (lastLogTime ? `&lastLogTime=${encodeURIComponent(lastLogTime)}` : ''); const response = await fetch(url); const data = await response.json(); if (data.log) { const logContent = document.getElementById('logContent'); logContent.textContent += data.log + '\n'; // 追加新的日志内容 } if (data.newLastLogTime) { lastLogTime = data.newLastLogTime; // 更新 lastLogTime 为最新的日志时间戳 } } async function loadUserIps() { const response = await fetch('/adminUser_ips'); const data = await response.json(); const container = document.getElementById('linkManagement'); let htmlRunning = `<h3>正在运行的服务器</h3><table border="1"><tr><th>用户名</th><th>IP地址</th><th>分配端口</th><th>上次服务器运行时长</th><th>上次服务器启动时间<tr><th>`; data.data.running.forEach(userIp => { htmlRunning += `<tr><td>${userIp.username}</td><td>${userIp.ip}</td><td>${userIp.port}</td><td>${userIp.serverStartDuration}</td><td>${userIp.serverStartTime}</td></tr>`; }); htmlRunning += `</table>`; let htmlNotRunning = `<h3>未运行的服务器</h3><table border="1"><tr><th>用户名</th><th>IP地址</th><th>分配端口</th><th>上次服务器运行时长</th><th>上次服务器启动时间<tr><th>`; data.data.notRunning.forEach(userIp => { htmlNotRunning += `<tr><td>${userIp.username}</td><td>${userIp.ip}</td><td>${userIp.port}</td><td>${userIp.serverStartDuration}</td><td>${userIp.serverStartTime}</td></tr>`; }); htmlNotRunning += `</table>`; container.innerHTML = htmlRunning + htmlNotRunning; } setInterval(() => { const today = new Date().toISOString().slice(0, 10); loadLogs(today); loadUserIps() }, 3000); // 每 3 秒更新一次 document.addEventListener('DOMContentLoaded', function () { loadUsers(); loadUserIps(); }); </script> </body> </html>