feat(*): 代码仓库初始化

This commit is contained in:
2025-11-07 18:39:29 +08:00
commit b1aeb6b39b
36 changed files with 1700 additions and 0 deletions

View 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,
};

View 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="指标名称">用户IDuid</td><td data-label="数值">${systemData.UserInfo.uid} (Windows系统默认值)</td></tr>
<tr><td data-label="指标名称">用户组IDgid</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>

View 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");
});

View File

@@ -0,0 +1,14 @@
const myModule = require("./myModule");
console.log("Auther: ", myModule.auther);
console.log(myModule.greet("Alice"));
console.log("Sum: ", myModule.add(3, 5));
const lodash = require("lodash");
const array = [1, 2, 3, 4, 5];
const result = lodash.reverse(array);
console.log("Reverse array: ", result);
const gt3 = array.filter((n) => lodash.gt(n, 3));
console.log("Greater than 3: ", gt3);

View File

@@ -0,0 +1,15 @@
const auther = "harry";
const greet = (name) => {
return `Hello, ${name}!`;
};
const add = (a, b) => {
return a + b;
};
module.exports = {
auther,
greet,
add
}

2
Server/tests/test3/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
node_modules
pnpm-lock.yaml

View File

@@ -0,0 +1,16 @@
const express = require("express")
const { router } = require("./routes/useRoute")
const app = express()
app.use(express.json())
app.use(router)
app.listen("3000", (err) => {
if (err) {
console.log(err);
return
}
console.log("server listen :3000");
})

View File

@@ -0,0 +1,18 @@
{
"name": "test3",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"packageManager": "pnpm@10.14.0",
"dependencies": {
"express": "^5.1.0",
"joi": "^18.0.1",
"lodash": "^4.17.21"
}
}

View File

@@ -0,0 +1,100 @@
const express = require("express")
const { number } = require("joi")
const joi = require("joi")
const lodash = require("lodash")
const router = express.Router()
router.get("/userId/:userId", (req, res) => {
const userId = req.params.userId;
const { err } = joi.number().validate(userId);
if (err) {
return res.status(400).send("Invaild UserID");
}
res.send(`user ID is ${userId}`);
})
router.get("/userName", (req, res) => {
const { name } = req.query;
const schema = joi.object({
name: joi.string().min(2).max(20).required()
})
const { error } = schema.validate({ name })
if (error) {
return res.status(400).send("Invaild UserName");
}
res.send(`User name is ${name}`)
})
router.get("/profile", (req, res) => {
res.send("This is the user profile page.")
})
router.get("/profile/setting", (req, res) => {
res.send("This is the user profile setting page.")
})
const data = [
{ name: 'zs', course: 'app', score: 90 },
{ name: 'zs', course: 'java', score: 80 },
{ name: 'ls', course: 'app', score: 89 },
{ name: 'ls', course: 'java', score: 99 },
{ name: 'ww', course: 'app', score: 78 },
{ name: 'ww', course: 'java', score: 88 },
]
router.get("/myScoure", (req, res) => {
const { name } = req.query;
const schema = joi.object({
name: joi.string().min(2).max(20).required()
})
const { error } = schema.validate({ name });
if (error) {
return res.status(400).send("Invaild Name.");
}
const dataGroup = lodash(data).groupBy("name").get(name)
res.send(dataGroup)
})
router.get("/showScoure", (req, res) => {
const dataOrder = lodash.orderBy(data, ["score"], orders = "desc");
// console.log(dataOrder);
const dataGroup = lodash(data).groupBy("name").map((a) => {
return {
name: a[0].name,
avg: lodash.mean(a.map(e => e.score)),
}
})
res.send(dataGroup);
})
router.get("/mny", (_req, res) => {
const mnyData = [
{ name: '张三', mny: '9k' },
{ name: '随便', mny: 6666 },
{ name: '王五', mny: '1w' },
{ name: '李四', mny: 15000 },
]
const fixData = mnyData.map((d) =>
typeof d.mny === "string"
? {
name: d.name,
mny: parseInt(d.mny = d.mny.replace("w", "0000").replace("k", "000"))
}
: {
name: d.name,
mny: parseInt(d.mny)
}
)
const finalData = fixData.filter(d => lodash.gte(d.mny, 9000));
res.send(finalData)
})
module.exports = {
router
}