feat(*): 代码仓库初始化
This commit is contained in:
133
Server/tests/test1/common.js
Normal file
133
Server/tests/test1/common.js
Normal file
@@ -0,0 +1,133 @@
|
||||
const os = require("os");
|
||||
const path = require("path");
|
||||
|
||||
// 格式化字节数为人类可读的单位
|
||||
function formatBytes(bytes) {
|
||||
const size = {
|
||||
GB: 1024 * 1024 * 1024,
|
||||
MB: 1024 * 1024,
|
||||
KB: 1024,
|
||||
B: 1,
|
||||
};
|
||||
for (const key in size) {
|
||||
if (bytes >= size[key]) return `${bytes / size[key]} ${key}`;
|
||||
}
|
||||
}
|
||||
|
||||
// 工具函数:统一处理路径分隔符为正斜杠
|
||||
const formatPath = (pathStr) => {
|
||||
return pathStr.replace(/\\/g, "/"); // 单个反斜杠替换为正斜杠
|
||||
};
|
||||
|
||||
// 1. 操作系统基本信息
|
||||
const getSystemInfo = () => {
|
||||
return {
|
||||
osType: os.type(),
|
||||
osPlatform: os.platform(),
|
||||
osVersion: os.release(),
|
||||
osName: os.version(),
|
||||
arch: os.arch(),
|
||||
hostname: os.hostname(),
|
||||
systemStartTime: new Date(os.uptime() * 1000).toLocaleDateString(),
|
||||
systemRunningTime: `${Math.floor(os.uptime() / 3600)}小时 ${
|
||||
Math.floor(os.uptime() % 3600) / 60
|
||||
}分钟`,
|
||||
};
|
||||
};
|
||||
|
||||
// 2. CPU信息
|
||||
const getCPUInfo = () => {
|
||||
const cpus = os.cpus();
|
||||
return {
|
||||
number: cpus.length,
|
||||
model: cpus[0].model,
|
||||
speed: cpus[0].speed + "MHz",
|
||||
};
|
||||
};
|
||||
|
||||
// 3. 内存信息
|
||||
const getMemoryInfo = () => {
|
||||
return {
|
||||
total: formatBytes(os.totalmem()),
|
||||
freeMemory: formatBytes(os.freemem()),
|
||||
useMemory: formatBytes(os.totalmem() - os.freemem()),
|
||||
useRate: `${Math.round((1 - os.freemem() / os.totalmem()) * 100)}%`,
|
||||
};
|
||||
};
|
||||
|
||||
// 4. 用户信息
|
||||
const getUserInfo = () => {
|
||||
const userInfo = os.userInfo();
|
||||
return {
|
||||
userName: userInfo.username,
|
||||
uid: userInfo.uid,
|
||||
gid: userInfo.gid,
|
||||
homeDir: formatPath(userInfo.homedir),
|
||||
shell: userInfo.shell || "unknown",
|
||||
};
|
||||
};
|
||||
|
||||
// 5. 目录信息
|
||||
const getDirInfo = () => {
|
||||
return {
|
||||
homeDir: formatPath(os.homedir()),
|
||||
tmpDir: formatPath(os.tmpdir()),
|
||||
};
|
||||
};
|
||||
|
||||
// 6. 负载信息 (仅 Unix 系统有效)
|
||||
const getDutyInfo = () => {
|
||||
const loadavg = os.loadavg();
|
||||
return {
|
||||
min1: loadavg[0].toFixed(2),
|
||||
min5: loadavg[1].toFixed(2),
|
||||
min15: loadavg[2].toFixed(2),
|
||||
};
|
||||
};
|
||||
|
||||
// 7. 网络接口信息
|
||||
const getNetworkInterfaceInfo = () => {
|
||||
const networkInterfaces = os.networkInterfaces();
|
||||
const data = [];
|
||||
for (const [interfaceName, interfaceInfo] of Object.entries(
|
||||
networkInterfaces
|
||||
)) {
|
||||
let item;
|
||||
interfaceInfo.forEach((info) => {
|
||||
item = {
|
||||
name: interfaceName,
|
||||
family: info.family,
|
||||
ip: info.address,
|
||||
mac: info.mac,
|
||||
localAddress: info.internal ? true : false,
|
||||
netmask: info.netmask,
|
||||
gateway: info.gateway,
|
||||
};
|
||||
});
|
||||
data.push(item);
|
||||
}
|
||||
return data;
|
||||
};
|
||||
|
||||
const getAll = () => {
|
||||
return {
|
||||
SystemInfo: getSystemInfo(),
|
||||
CPUInfo: getCPUInfo(),
|
||||
MemoryInfo: getMemoryInfo(),
|
||||
UserInfo: getUserInfo(),
|
||||
DirInfo: getDirInfo(),
|
||||
DutyInfo: getDutyInfo(),
|
||||
NetworkInterfaceInfo: getNetworkInterfaceInfo(),
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
getSystemInfo,
|
||||
getCPUInfo,
|
||||
getMemoryInfo,
|
||||
getUserInfo,
|
||||
getDirInfo,
|
||||
getDutyInfo,
|
||||
getNetworkInterfaceInfo,
|
||||
getAll,
|
||||
};
|
||||
268
Server/tests/test1/index.html
Normal file
268
Server/tests/test1/index.html
Normal file
@@ -0,0 +1,268 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>系统指标详情</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
margin: 20px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
color: #2c3e50;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.section {
|
||||
margin-bottom: 40px;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: #34495e;
|
||||
border-left: 4px solid #3498db;
|
||||
padding-left: 10px;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
th,
|
||||
td {
|
||||
padding: 12px 15px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #ecf0f1;
|
||||
}
|
||||
|
||||
th {
|
||||
background-color: #f8f9fa;
|
||||
color: #2c3e50;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
tr:hover {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.network-item {
|
||||
margin-bottom: 15px;
|
||||
padding: 15px;
|
||||
border-radius: 6px;
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.update-time {
|
||||
text-align: right;
|
||||
color: #7f8c8d;
|
||||
font-size: 0.9em;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
|
||||
table,
|
||||
th,
|
||||
td {
|
||||
display: block;
|
||||
}
|
||||
|
||||
th {
|
||||
position: absolute;
|
||||
top: -9999px;
|
||||
left: -9999px;
|
||||
}
|
||||
|
||||
tr {
|
||||
margin-bottom: 15px;
|
||||
border: 1px solid #ecf0f1;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
td {
|
||||
position: relative;
|
||||
padding-left: 50%;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
td:before {
|
||||
position: absolute;
|
||||
left: 15px;
|
||||
content: attr(data-label);
|
||||
font-weight: 600;
|
||||
color: #2c3e50;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>系统指标详情</h1>
|
||||
<div class="update-time" id="updateTime"></div>
|
||||
<div id="content"></div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
<script>
|
||||
let data = `@@@`;
|
||||
|
||||
// 解析数据并渲染页面
|
||||
function renderData() {
|
||||
const systemData = JSON.parse(data);
|
||||
const content = document.getElementById('content');
|
||||
let html = '';
|
||||
|
||||
// 更新时间
|
||||
document.getElementById('updateTime').textContent = `最后更新: ${new Date().toLocaleString()}`;
|
||||
|
||||
// 1. 系统信息
|
||||
html += `
|
||||
<div class="section">
|
||||
<h2>1. 系统基础信息</h2>
|
||||
<table>
|
||||
<tr><th>指标名称</th><th>数值</th></tr>
|
||||
<tr><td data-label="指标名称">操作系统类型</td><td data-label="数值">${systemData.SystemInfo.osType}</td></tr>
|
||||
<tr><td data-label="指标名称">系统平台</td><td data-label="数值">${systemData.SystemInfo.osPlatform}</td></tr>
|
||||
<tr><td data-label="指标名称">系统版本</td><td data-label="数值">${systemData.SystemInfo.osVersion}</td></tr>
|
||||
<tr><td data-label="指标名称">系统名称</td><td data-label="数值">${systemData.SystemInfo.osName}</td></tr>
|
||||
<tr><td data-label="指标名称">系统架构</td><td data-label="数值">${systemData.SystemInfo.arch}</td></tr>
|
||||
<tr><td data-label="指标名称">主机名</td><td data-label="数值">${systemData.SystemInfo.hostname}</td></tr>
|
||||
<tr><td data-label="指标名称">系统启动时间</td><td data-label="数值">${systemData.SystemInfo.systemStartTime} ${systemData.SystemInfo.systemStartTime === '1970/1/1' ? '(可能为数据异常)' : ''}</td></tr>
|
||||
<tr><td data-label="指标名称">系统运行时长</td><td data-label="数值">${systemData.SystemInfo.systemRunningTime}</td></tr>
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
// 2. CPU信息
|
||||
html += `
|
||||
<div class="section">
|
||||
<h2>2. CPU信息</h2>
|
||||
<table>
|
||||
<tr><th>指标名称</th><th>数值</th></tr>
|
||||
<tr><td data-label="指标名称">CPU核心数</td><td data-label="数值">${systemData.CPUInfo.number}</td></tr>
|
||||
<tr><td data-label="指标名称">CPU型号</td><td data-label="数值">${systemData.CPUInfo.model}</td></tr>
|
||||
<tr><td data-label="指标名称">CPU基础频率</td><td data-label="数值">${systemData.CPUInfo.speed}</td></tr>
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
// 3. 内存信息
|
||||
html += `
|
||||
<div class="section">
|
||||
<h2>3. 内存信息</h2>
|
||||
<table>
|
||||
<tr><th>指标名称</th><th>数值</th></tr>
|
||||
<tr><td data-label="指标名称">总内存</td><td data-label="数值">${systemData.MemoryInfo.total}</td></tr>
|
||||
<tr><td data-label="指标名称">空闲内存</td><td data-label="数值">${systemData.MemoryInfo.freeMemory}</td></tr>
|
||||
<tr><td data-label="指标名称">已使用内存</td><td data-label="数值">${systemData.MemoryInfo.useMemory}</td></tr>
|
||||
<tr><td data-label="指标名称">内存使用率</td><td data-label="数值">${systemData.MemoryInfo.useRate}</td></tr>
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
// 4. 用户信息
|
||||
html += `
|
||||
<div class="section">
|
||||
<h2>4. 用户信息</h2>
|
||||
<table>
|
||||
<tr><th>指标名称</th><th>数值</th></tr>
|
||||
<tr><td data-label="指标名称">用户名</td><td data-label="数值">${systemData.UserInfo.userName}</td></tr>
|
||||
<tr><td data-label="指标名称">用户ID(uid)</td><td data-label="数值">${systemData.UserInfo.uid} (Windows系统默认值)</td></tr>
|
||||
<tr><td data-label="指标名称">用户组ID(gid)</td><td data-label="数值">${systemData.UserInfo.gid} (Windows系统默认值)</td></tr>
|
||||
<tr><td data-label="指标名称">用户主目录</td><td data-label="数值">${systemData.UserInfo.homeDir}</td></tr>
|
||||
<tr><td data-label="指标名称">默认shell</td><td data-label="数值">${systemData.UserInfo.shell}</td></tr>
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
// 5. 目录信息
|
||||
html += `
|
||||
<div class="section">
|
||||
<h2>5. 目录信息</h2>
|
||||
<table>
|
||||
<tr><th>指标名称</th><th>数值</th></tr>
|
||||
<tr><td data-label="指标名称">用户主目录</td><td data-label="数值">${systemData.DirInfo.homeDir}</td></tr>
|
||||
<tr><td data-label="指标名称">临时目录</td><td data-label="数值">${systemData.DirInfo.tmpDir}</td></tr>
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
// 6. 负载信息
|
||||
html += `
|
||||
<div class="section">
|
||||
<h2>6. 系统负载信息</h2>
|
||||
<table>
|
||||
<tr><th>指标名称</th><th>数值</th></tr>
|
||||
<tr><td data-label="指标名称">1分钟负载</td><td data-label="数值">${systemData.DutyInfo.min1}</td></tr>
|
||||
<tr><td data-label="指标名称">5分钟负载</td><td data-label="数值">${systemData.DutyInfo.min5}</td></tr>
|
||||
<tr><td data-label="指标名称">15分钟负载</td><td data-label="数值">${systemData.DutyInfo.min15}</td></tr>
|
||||
</table>
|
||||
</div>`;
|
||||
|
||||
// 7. 网络接口信息
|
||||
html += `<div class="section"><h2>7. 网络接口信息</h2><div id="networkList">`;
|
||||
systemData.NetworkInterfaceInfo.forEach(iface => {
|
||||
html += `
|
||||
<div class="network-item">
|
||||
<h3>网络接口:${iface.name} ${iface.localAddress ? '(本地回环)' : ''}</h3>
|
||||
<table>
|
||||
<tr><td data-label="指标名称">网络协议</td><td data-label="数值">${iface.family}</td></tr>
|
||||
<tr><td data-label="指标名称">IP地址</td><td data-label="数值">${iface.ip}</td></tr>
|
||||
<tr><td data-label="指标名称">MAC地址</td><td data-label="数值">${iface.mac}</td></tr>
|
||||
<tr><td data-label="指标名称">是否本地地址</td><td data-label="数值">${iface.localAddress ? '是' : '否'}</td></tr>
|
||||
<tr><td data-label="指标名称">子网掩码</td><td data-label="数值">${iface.netmask}</td></tr>
|
||||
</table>
|
||||
</div>`;
|
||||
});
|
||||
html += `</div></div>`;
|
||||
console.log(html);
|
||||
|
||||
content.innerHTML = html;
|
||||
}
|
||||
|
||||
// 初始渲染
|
||||
renderData();
|
||||
|
||||
// 模拟数据更新(每5秒更新一次运行时间)
|
||||
setInterval(() => {
|
||||
const systemData = JSON.parse(data);
|
||||
// 解析当前运行时间并增加1分钟
|
||||
const timeMatch = systemData.SystemInfo.systemRunningTime.match(/(\d+)小时 (\d+\.\d+)分钟/);
|
||||
if (timeMatch) {
|
||||
const hours = parseInt(timeMatch[1]);
|
||||
let minutes = parseFloat(timeMatch[2]) + 1;
|
||||
|
||||
// 处理分钟进位
|
||||
if (minutes >= 60) {
|
||||
minutes -= 60;
|
||||
systemData.SystemInfo.systemRunningTime = `${hours + 1}小时 ${minutes.toFixed(15)}分钟`;
|
||||
} else {
|
||||
systemData.SystemInfo.systemRunningTime = `${hours}小时 ${minutes.toFixed(15)}分钟`;
|
||||
}
|
||||
|
||||
// 更新内存使用率(随机波动1-2%)
|
||||
const currentRate = parseInt(systemData.MemoryInfo.useRate);
|
||||
const newRate = Math.max(10, Math.min(90, currentRate + (Math.random() > 0.5 ? 1 : -1)));
|
||||
systemData.MemoryInfo.useRate = `${newRate}%`;
|
||||
|
||||
// 重新序列化数据
|
||||
data = JSON.stringify(systemData);
|
||||
// 重新渲染页面
|
||||
renderData();
|
||||
}
|
||||
}, 5000); // 5秒更新一次
|
||||
</script>
|
||||
|
||||
</html>
|
||||
23
Server/tests/test1/server.js
Normal file
23
Server/tests/test1/server.js
Normal file
@@ -0,0 +1,23 @@
|
||||
const http = require("http");
|
||||
const fs = require("fs");
|
||||
const common = require(__dirname + "/common");
|
||||
|
||||
const server = http.createServer();
|
||||
|
||||
server.on("request", (req, res) => {
|
||||
fs.readFile("./index.html", { encoding: "utf8" }, (err, data) => {
|
||||
if (err) {
|
||||
res.writeHead(500);
|
||||
res.end("Error Loading File");
|
||||
} else {
|
||||
res.writeHead(200, {
|
||||
"content-type": "text/html",
|
||||
});
|
||||
res.end(data.replace("@@@", JSON.stringify(common.getAll())));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
server.listen(3000, () => {
|
||||
console.log("server is running at http://127.0.0.1:3000");
|
||||
});
|
||||
Reference in New Issue
Block a user