feat(*): 代码仓库初始化
This commit is contained in:
14
Server/1/aa.js
Normal file
14
Server/1/aa.js
Normal file
@@ -0,0 +1,14 @@
|
||||
const fs = require("fs");
|
||||
|
||||
fs.readFile(__dirname + "/aa.txt", "utf8", (err, data) => {
|
||||
if (err) return;
|
||||
|
||||
const content = data
|
||||
.replace(/(\d+)[、.](?=\s*)/g, "$1、 ")
|
||||
.replace(/([A-D])[.、](?=\s*)/g, "$1. ")
|
||||
.replace(/\r?\n([B-D]\.)/g, "\t$1");
|
||||
|
||||
fs.writeFile(__dirname + "/new.txt", content, "utf8", (err) => {
|
||||
if (err) return;
|
||||
});
|
||||
});
|
||||
10
Server/1/aa.txt
Normal file
10
Server/1/aa.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
1、四大名著有哪些?
|
||||
A.西游记
|
||||
B.水浒传
|
||||
C.三国演义
|
||||
D.红楼梦
|
||||
2.我们的口号
|
||||
A、键盘敲烂、月薪过万
|
||||
B、键盘生灰、垃圾一堆
|
||||
C、键盘打烂
|
||||
D、键盘放烂
|
||||
4
Server/1/new.txt
Normal file
4
Server/1/new.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
1、 四大名著有哪些?
|
||||
A. 西游记 B. 水浒传 C. 三国演义 D. 红楼梦
|
||||
2、 我们的口号
|
||||
A. 键盘敲烂、月薪过万 B. 键盘生灰、垃圾一堆 C. 键盘打烂 D. 键盘放烂
|
||||
1
Server/2/.gitignore
vendored
Normal file
1
Server/2/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
text.txt
|
||||
20
Server/2/README.md
Normal file
20
Server/2/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
<!--
|
||||
Copyright (c) 2025 zhilv
|
||||
|
||||
This software is released under the MIT License.
|
||||
https://opensource.org/licenses/MIT
|
||||
-->
|
||||
|
||||
## `Python` 网络爬虫基础教程
|
||||
|
||||
### 文件介绍
|
||||
|
||||
```sh
|
||||
.
|
||||
├── 1 # 课堂作业1
|
||||
├── 2 # 课堂作业2
|
||||
└── tests # 实验文件夹
|
||||
├── test1 # 实验一
|
||||
├── test2 # 实验二
|
||||
└── test3 # 实验三
|
||||
```
|
||||
6
Server/2/main.js
Normal file
6
Server/2/main.js
Normal file
@@ -0,0 +1,6 @@
|
||||
const utils = require("./utils");
|
||||
const fs = require("fs");
|
||||
|
||||
const text = fs.readFileSync(__dirname + "/text.txt", "utf8");
|
||||
|
||||
console.log(utils.word_count(text));
|
||||
12
Server/2/utils.js
Normal file
12
Server/2/utils.js
Normal file
@@ -0,0 +1,12 @@
|
||||
const word_count = function (text) {
|
||||
const text_list = text.replace(/[、\r?\n,,\s]+/g, " ").split(" ");
|
||||
let word_obj = {};
|
||||
for (const word of text_list) {
|
||||
word_obj[word] = (word_obj[word] || 0) + 1;
|
||||
}
|
||||
return word_obj;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
word_count,
|
||||
};
|
||||
18
Server/README.md
Normal file
18
Server/README.md
Normal file
@@ -0,0 +1,18 @@
|
||||
<!--
|
||||
Copyright (c) 2025 zhilv
|
||||
|
||||
This software is released under the MIT License.
|
||||
https://opensource.org/licenses/MIT
|
||||
-->
|
||||
|
||||
## `Node.js` 从基础到项目实践
|
||||
|
||||
### 文件介绍
|
||||
|
||||
```sh
|
||||
.
|
||||
├── images # 图片资源
|
||||
├── test1 # 实验一
|
||||
├── test2 # 实验二
|
||||
└── test3 # 实验三
|
||||
```
|
||||
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");
|
||||
});
|
||||
14
Server/tests/test2/index.js
Normal file
14
Server/tests/test2/index.js
Normal 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);
|
||||
15
Server/tests/test2/myModule.js
Normal file
15
Server/tests/test2/myModule.js
Normal 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
2
Server/tests/test3/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
node_modules
|
||||
pnpm-lock.yaml
|
||||
16
Server/tests/test3/index.js
Normal file
16
Server/tests/test3/index.js
Normal 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");
|
||||
})
|
||||
18
Server/tests/test3/package.json
Normal file
18
Server/tests/test3/package.json
Normal 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"
|
||||
}
|
||||
}
|
||||
100
Server/tests/test3/routes/useRoute.js
Normal file
100
Server/tests/test3/routes/useRoute.js
Normal 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user