2024-08-19

以下是一个使用Node.js, Express, 和 AJAX 创建简单的上班签到系统的核心代码示例。

服务器端代码 (Node.js + Express):




const express = require('express');
const app = express();
const port = 3000;
 
// 模拟数据库
const signInRecords = {};
 
app.use(express.static('public')); // 设置静态文件目录
 
// 签到接口
app.get('/signin', (req, res) => {
  const id = req.query.id;
  const timestamp = new Date().toLocaleString();
  signInRecords[id] = timestamp;
  res.send(`${id} 已签到,时间:${timestamp}`);
});
 
// 查询签到记录接口
app.get('/signin-records', (req, res) => {
  res.send(signInRecords);
});
 
app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
});

客户端代码 (HTML + AJAX):




<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>上班签到系统</title>
  <script>
    function signIn() {
      const id = document.getElementById('idInput').value;
      fetch('/signin?id=' + id)
        .then(response => response.text())
        .then(data => {
          alert(data);
        });
    }
 
    function viewSignInRecords() {
      fetch('/signin-records')
        .then(response => response.json())
        .then(data => {
          let records = '';
          for (let id in data) {
            records += `<p>${id}: ${data[id]}</p>`;
          }
          document.getElementById('records').innerHTML = records;
        });
    }
  </script>
</head>
<body>
  <h1>上班签到</h1>
  <input type="text" id="idInput" placeholder="请输入员工ID">
  <button onclick="signIn()">签到</button>
  <button onclick="viewSignInRecords()">查看签到记录</button>
  <div id="records"></div>
</body>
</html>

在这个例子中,我们创建了一个简单的上班签到系统。员工通过输入ID并点击签到按钮来签到。签到信息将通过AJAX请求发送到服务器,服务器端记录签到时间并响应客户端。查看签到记录按钮会通过AJAX请求从服务器获取并显示所有签到记录。

注意:这个示例仅用于教学目的,不包含完整的错误处理和生产环境要求的安全措施。在实际环境中,你需要考虑更多的安全性问题,例如参数验证、数据库操作、HTTPS 支持等。

2024-08-19

AJAX 是 Asynchronous JavaScript and XML 的缩写,它是一种创建交互式网页的技术。AJAX 可以让你在不重新加载整个网页的情况下更新网页的部分内容。

以下是一个简单的 AJAX 请求示例,使用 JavaScript 的 XMLHttpRequest 对象:




// 创建一个新的 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
 
// 配置请求类型、URL 以及是否异步处理
xhr.open('GET', 'your-api-endpoint', true);
 
// 设置请求完成的回调函数
xhr.onreadystatechange = function () {
  // 请求完成并且响应状态码为 200
  if (xhr.readyState === XMLHttpRequest.DONE) {
    if (xhr.status === 200) {
      // 处理请求成功的响应数据
      console.log(xhr.responseText);
    } else {
      // 处理请求失败
      console.error('AJAX Request was unsuccessful');
    }
  }
};
 
// 发送请求
xhr.send();

这段代码创建了一个 AJAX 请求,通过 GET 方法从 'your-api-endpoint' 获取数据。当请求完成时,它会检查响应状态,如果成功,它会在控制台中输出响应文本。

现代浏览器中,你也可以使用 fetch API 来执行 AJAX 请求,这是一个更现代、更简洁的 API:




fetch('your-api-endpoint')
  .then(response => {
    if (response.ok) {
      return response.text();
    }
    throw new Error('Network response was not ok.');
  })
  .then(text => {
    console.log(text);
  })
  .catch(error => {
    console.error('Fetch error:', error);
  });

fetch API 使用了 Promise,提供了一种更简洁的方式来处理异步请求和响应。

2024-08-19

AJAX请求可以是同步的或者异步的。在JavaScript中,AJAX通常使用XMLHttpRequest对象来实现。

异步AJAX请求




var xhr = new XMLHttpRequest();
xhr.open('GET', 'your-api-endpoint', true); // 第三个参数为true表示异步
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
    // 请求成功
    var response = xhr.responseText;
    // 处理响应数据
  }
};
xhr.send();

同步AJAX请求




var xhr = new XMLHttpRequest();
xhr.open('GET', 'your-api-endpoint', false); // 第三个参数为false表示同步
xhr.send();
if (xhr.status === 200) {
  // 请求成功
  var response = xhr.responseText;
  // 处理响应数据
}

在异步AJAX请求中,open方法的第三个参数为true,表示请求是非阻塞的。控制权在发送请求后立即返回给浏览器,用户可以继续与页面交互而不需要等待响应。当响应就绪时,onreadystatechange事件处理函数会被调用。

在同步AJAX请求中,open方法的第三个参数为false,表示请求是阻塞的。在发送请求到收到响应这段时间内,浏览器会挂起并不会执行其他任何的行为。这意味着在同步模式下,AJAX请求期间,用户不能进行任何操作,页面会出现冻结状态。

在现代的开发实践中,通常推荐使用异步AJAX请求,因为它不会阻塞用户界面,提供了更好的用户体验。

2024-08-19

假设我们有一个.Net Core Web API的控制器,它处理来自Ajax请求的HTTP GET请求,以下是一个简单的例子:

首先,在.Net Core Web API中创建一个控制器:




using Microsoft.AspNetCore.Mvc;
 
namespace ExampleWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values/
        [HttpGet]
        public ActionResult Get(int id)
        {
            // 逻辑处理...
            return Ok(new { Message = $"Value received: {id}" });
        }
    }
}

然后,在客户端使用Ajax发送请求:




<!DOCTYPE html>
<html>
<head>
    <title>Ajax Request Example</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        $(document).ready(function(){
            $("#btnSendRequest").click(function(){
                $.ajax({
                    type: "GET",
                    url: "/api/values/",
                    data: { id: 5 },
                    success: function(data){
                        alert(data.Message);
                    },
                    error: function(jqXHR, textStatus, errorThrown){
                        console.log('Error: ' + textStatus);
                    }
                });
            });
        });
    </script>
</head>
<body>
    <button id="btnSendRequest">Send Request</button>
</body>
</html>

在这个例子中,当用户点击按钮时,Ajax会向"/api/values/"发送一个GET请求,并带有一个名为"id"的参数,其值为5。服务器响应请求,并通过Ajax的success回调函数在浏览器中显示消息。如果请求失败,将通过error回调函数打印错误信息。

2024-08-19

HTTP (Hypertext Transfer Protocol) 是一个用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 请求和响应消息通过一个单个 TCP 连接发送,包括以下部分:

  1. 请求行 - 包含请求方法、请求 URL 和 HTTP 版本。
  2. 请求头 - 包含一系列键值对,说明服务器要使用的额外信息。
  3. 空行 - 请求头部结束的标志。
  4. 请求体 - 包含要发送给服务器的数据。

HTTP 响应包括以下部分:

  1. 状态行 - 包含 HTTP 版本、状态码和状态信息。
  2. 响应头 - 包含服务器返回的额外信息的键值对。
  3. 空行 - 响应头部结束的标志。
  4. 响应体 - 包含服务器返回的数据。

通过 form 表单构造 HTTP 请求的基本方法是使用 HTML 的 <form> 元素,并指定 methodaction 属性。method 属性指定 HTTP 方法(如 GET 或 POST),而 action 属性指定接收请求的服务器的 URL。

以下是一个简单的 HTML 表单示例,它使用 GET 方法向服务器发送请求:




<!DOCTYPE html>
<html>
<head>
    <title>Simple Form</title>
</head>
<body>
    <form action="https://example.com/submit" method="get">
        <label for="fname">First name:</label><br>
        <input type="text" id="fname" name="fname"><br>
        <label for="lname">Last name:</label><br>
        <input type="text" id="lname" name="lname"><br><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

在这个例子中,当用户填写表单并点击 "Submit" 按钮时,浏览器会构造一个 HTTP GET 请求,其 URL 可能类似于 https://example.com/submit?fname=John&lname=Doe

如果表单使用 POST 方法,则输入的数据会放在 HTTP 请求体中,而不是 URL 中,这是一种更适合发送大量数据的方式。

以下是一个使用 POST 方法的表单示例:




<form action="https://example.com/submit" method="post">
    <label for="fname">First name:</label><br>
    <input type="text" id="fname" name="fname"><br>
    <label for="lname">Last name:</label><br>
    <input type="text" id="lname" name="lname"><br><br>
    <input type="submit" value="Submit">
</form>

当用户提交表单时,浏览器会构造一个 HTTP POST 请求,其中请求体包含输入的数据。

2024-08-19

以下是使用Node.js作为后端发布API接口,并且前端使用AJAX访问的简单示例。

Node.js后端代码(server.js):




const express = require('express');
const app = express();
const port = 3000;
 
app.get('/api/data', (req, res) => {
  const response = {
    message: 'Success!',
    data: {
      id: 1,
      name: 'Sample Data'
    }
  };
  res.json(response); // 返回JSON响应
});
 
app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

确保你已经安装了Express:




npm install express

前端HTML和JavaScript代码:




<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>AJAX Example</title>
  <script>
    function fetchData() {
      const xhr = new XMLHttpRequest();
      xhr.open('GET', 'http://localhost:3000/api/data', true);
      xhr.onload = function() {
        if (this.status == 200) {
          const response = JSON.parse(xhr.responseText);
          document.getElementById('data').textContent = JSON.stringify(response, null, 2);
        }
      };
      xhr.send();
    }
  </script>
</head>
<body>
  <button onclick="fetchData()">Fetch Data</button>
  <pre id="data"></pre>
</body>
</html>

确保你的Node.js服务器正在运行,然后打开这个HTML文件,点击按钮 "Fetch Data" 来通过AJAX请求后端API。

2024-08-19

.d.ts 文件在 TypeScript 中是一种声明文件,它们用于为 JavaScript 代码添加类型支持。这使得 TypeScript 能够理解这些 JavaScript 代码的结构,从而提供类型检查和自动补全等功能,帮助开发者更快地识别错误并加强团队的合作。

例如,如果你正在使用一个第三方库,但这个库没有提供类型声明文件,你可以创建一个 .d.ts 文件来为这个库提供类型信息。

例子:




// example.d.ts
 
// 为全局变量 myGlobal 添加类型
declare const myGlobal: string;
 
// 为全局变量 myModule 添加类型
declare module 'myModule' {
  export function myFunction(): string;
}
 
// 为 Node.js 的 process 对象添加属性 typeScriptCompatMode,这是一个 TypeScript 兼容性特性
interface Process {
  typeScriptCompatMode(): boolean;
}

在这个例子中,我们为一个名为 myGlobal 的全局变量添加了一个 string 类型,为一个名为 myModule 的模块添加了一个 myFunction 函数,并为 Node.js 的 process 对象添加了一个兼容 TypeScript 的新属性。这样,当你在 TypeScript 项目中使用这些变量和函数时,IDE 和编译器就会提供更好的支持。

2024-08-19

在网页中使用JavaScript和网络摄像头实现人体肢体关键点捕获,可以使用pose-detection库,这是TensorFlow.js提供的一个模块,它可以帮助你识别图片或视频中人体的姿态。

以下是一个简单的例子,展示如何使用这个库捕获和识别网络摄像头中人体的关键点:

首先,你需要在你的HTML文件中引入必要的JavaScript库:




<!-- Load TensorFlow.js -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>
<!-- Load Pose Detection -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/pose-detection"></script>
 
<video id="video" width="500" height="500" autoplay></video>
<canvas id="canvas" width="500" height="500"></canvas>

然后,在你的JavaScript代码中,你可以使用以下方式来实现:




const video = document.getElementById('video');
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
 
// 启动网络摄像头
navigator.mediaDevices.getUserMedia({ video: true })
  .then(function(stream) {
    video.srcObject = stream;
  })
  .catch(function(err) {
    console.error("An error occurred: " + err);
  });
 
// 等待视频播放
video.onloadedmetadata = () => {
  video.width = video.videoWidth;
  video.height = video.videoHeight;
  video.play();
};
 
const runPoseDetection = async () => {
  const poses = await posenet.estimateSinglePose(video, 0.75, false, 16);
  console.log(poses);
 
  canvas.width = video.width;
  canvas.height = video.height;
  context.drawImage(video, 0, 0, video.width, video.height);
  posenet.drawSkeleton(canvas, poses);
  posenet.drawKeypoints(canvas, poses);
 
  requestAnimationFrame(runPoseDetection);
};
 
runPoseDetection();

在这个例子中,pose-detection库用于识别视频中的姿态,并在canvas上绘制关键点和骨架。estimateSinglePose函数用于估算图像中的单个人体姿态,并且drawSkeletondrawKeypoints函数用于在canvas上绘制关键点和骨架。

请注意,你需要在一个HTTPS服务器上运行这段代码,因为大多数现代浏览器都要求安全的上下文来访问用户的摄像头。此外,pose-detection库可能需要一些额外的配置步骤,如设置TensorFlow.js后端等,具体可以查看它的官方文档。

2024-08-19

在JavaScript中,您可以使用document对象来获取表单元素,并且可以使用.setAttribute().style属性来修改元素的属性和样式。

以下是一些示例代码:




// 获取表单元素
var form = document.getElementById('myForm');
 
// 修改表单元素的属性
form.setAttribute('action', 'newAction.php');
 
// 修改表单元素的样式属性
form.style.backgroundColor = 'blue';
form.style.color = 'white';

在这个例子中,我们首先通过document.getElementById获取了一个ID为myForm的表单元素。然后,我们使用.setAttribute方法修改了表单的action属性,将表单提交的目标改为newAction.php。最后,我们直接修改了form.style对象的属性,改变了表单的背景颜色和文字颜色。

2024-08-19

JavaScript中常见的三种for循环遍历方法:

  1. 传统for循环



for (let i = 0; i < array.length; i++) {
    console.log(array[i]);
}
  1. for...in循环(不建议用于数组遍历,常用于对象属性的遍历)



for (let key in array) {
    if (array.hasOwnProperty(key)) { // 检查属性是否是对象自身的
        console.log(array[key]);
    }
}
  1. forEach方法(需要数组上下文,无法使用break、continue、return语句控制循环)



array.forEach(function(value, index) {
    console.log(value);
});
  1. for...of循环(ES6新增,可用于遍历数组、字符串、Map、Set等可迭代的数据结构)



for (let value of array) {
    console.log(value);
}

每种方法都有其适用场景,选择合适的遍历方法取决于具体需求。