当前位置: 首页 > news >正文

JavaScript学习教程,从入门到精通,Ajax数据交换格式与跨域处理(26)

Ajax数据交换格式与跨域处理

一、Ajax数据交换格式

1. XML (eXtensible Markup Language)

XML是一种标记语言,类似于HTML但更加灵活,允许用户自定义标签。

特点:

  • 可扩展性强
  • 结构清晰
  • 数据与表现分离
  • 文件体积相对较大

示例代码:XML数据格式

<students><student><id>1</id><name>张三</name><age>20</age><major>计算机科学</major></student><student><id>2</id><name>李四</name><age>22</age><major>软件工程</major></student>
</students>

使用Ajax获取XML数据:

// 创建XMLHttpRequest对象
let xhr = new XMLHttpRequest();// 配置请求
xhr.open('GET', 'students.xml', true);// 设置响应类型
xhr.responseType = 'document';// 发送请求
xhr.send();// 处理响应
xhr.onload = function() {if (xhr.status === 200) {// 获取XML文档对象let xmlDoc = xhr.responseXML;// 获取所有student节点let students = xmlDoc.getElementsByTagName('student');// 遍历处理数据for (let i = 0; i < students.length; i++) {let id = students[i].getElementsByTagName('id')[0].textContent;let name = students[i].getElementsByTagName('name')[0].textContent;let age = students[i].getElementsByTagName('age')[0].textContent;let major = students[i].getElementsByTagName('major')[0].textContent;console.log(`ID: ${id}, 姓名: ${name}, 年龄: ${age}, 专业: ${major}`);}}
};

2. JSON (JavaScript Object Notation)

JSON是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。

特点:

  • 轻量级,文件体积小
  • 易于解析
  • 与JavaScript原生兼容
  • 支持多种数据类型(字符串、数字、布尔值、数组、对象、null)

示例代码:JSON数据格式

{"students": [{"id": 1,"name": "张三","age": 20,"major": "计算机科学"},{"id": 2,"name": "李四","age": 22,"major": "软件工程"}]
}

使用Ajax获取JSON数据:

// 创建XMLHttpRequest对象
let xhr = new XMLHttpRequest();// 配置请求
xhr.open('GET', 'students.json', true);// 发送请求
xhr.send();// 处理响应
xhr.onload = function() {if (xhr.status === 200) {// 解析JSON数据let data = JSON.parse(xhr.responseText);// 遍历处理数据data.students.forEach(student => {console.log(`ID: ${student.id}, 姓名: ${student.name}, 年龄: ${student.age}, 专业: ${student.major}`);});}
};

使用fetch API获取JSON数据(现代方法):

fetch('students.json').then(response => {if (!response.ok) {throw new Error('网络响应不正常');}return response.json();}).then(data => {data.students.forEach(student => {console.log(`ID: ${student.id}, 姓名: ${student.name}, 年龄: ${student.age}, 专业: ${student.major}`);});}).catch(error => {console.error('获取数据时出错:', error);});

二、无刷新列表分页

无刷新分页通过Ajax技术实现,只更新页面中需要变化的部分,而不是整个页面刷新。

实现步骤:

  1. 监听分页按钮点击事件
  2. 阻止默认行为(页面跳转)
  3. 发送Ajax请求获取分页数据
  4. 使用JavaScript动态更新页面内容

示例代码:无刷新分页实现

HTML部分:

<div id="product-list"><!-- 产品列表将在这里动态加载 -->
</div><div class="pagination"><a href="#" class="page-link" data-page="1">1</a><a href="#" class="page-link" data-page="2">2</a><a href="#" class="page-link" data-page="3">3</a><!-- 更多分页链接 -->
</div>

JavaScript部分:

// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', function() {// 默认加载第一页loadPage(1);// 为所有分页链接添加点击事件document.querySelectorAll('.page-link').forEach(link => {link.addEventListener('click', function(e) {e.preventDefault(); // 阻止默认跳转行为let page = this.getAttribute('data-page');loadPage(page);});});
});// 加载分页数据的函数
function loadPage(page) {// 显示加载状态document.getElementById('product-list').innerHTML = '<p>加载中...</p>';// 使用fetch API获取数据fetch(`api/products.php?page=${page}`).then(response => {if (!response.ok) {throw new Error('网络响应不正常');}return response.json();}).then(data => {// 清空当前内容let productList = document.getElementById('product-list');productList.innerHTML = '';// 检查是否有数据if (data.length === 0) {productList.innerHTML = '<p>没有找到产品</p>';return;}// 创建产品列表HTMLlet html = '<ul class="products">';data.forEach(product => {html += `<li class="product-item"><h3>${product.name}</h3><p>价格: ¥${product.price}</p><p>${product.description}</p></li>`;});html += '</ul>';// 更新DOMproductList.innerHTML = html;// 更新活动分页链接样式document.querySelectorAll('.page-link').forEach(link => {link.classList.remove('active');if (link.getAttribute('data-page') == page) {link.classList.add('active');}});}).catch(error => {console.error('获取数据时出错:', error);document.getElementById('product-list').innerHTML = '<p>加载数据时出错,请稍后再试</p>';});
}

三、跨域处理

1. 什么是跨域

跨域是指浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的。

同源策略限制以下行为:

  • Cookie、LocalStorage和IndexDB无法读取
  • DOM无法获得
  • AJAX请求不能发送

同源的定义:

  • 协议相同(http/https)
  • 域名相同
  • 端口相同

2. JSONP (JSON with Padding)

JSONP是一种跨域解决方案,利用<script>标签没有跨域限制的特性来实现。

实现原理:

  1. 前端定义一个回调函数
  2. 动态创建<script>标签,src指向跨域API并在URL中指定回调函数名
  3. 服务器返回的数据作为回调函数的参数
  4. 浏览器执行回调函数,处理返回的数据

示例代码:JSONP实现

前端代码:

// 定义回调函数
function handleResponse(data) {console.log('接收到数据:', data);// 在这里处理返回的数据
}// 创建script标签
let script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';// 添加到文档中
document.body.appendChild(script);// 请求完成后移除script标签
script.onload = function() {document.body.removeChild(script);
};

服务器端响应(PHP示例):

<?php
$data = array('name' => '张三','age' => 25,'city' => '北京'
);$callback = $_GET['callback'];
echo $callback . '(' . json_encode($data) . ')';
?>

jQuery中的JSONP:

$.ajax({url: 'https://api.example.com/data',dataType: 'jsonp',jsonpCallback: 'handleResponse', // 可选,自定义回调函数名success: function(data) {console.log('接收到数据:', data);},error: function(xhr, status, error) {console.error('请求失败:', status, error);}
});

3. CORS (Cross-Origin Resource Sharing)

CORS是一种官方推荐的跨域解决方案,需要服务器端支持。

简单请求与非简单请求:

  • 简单请求:GET、HEAD、POST,且Content-Type为text/plain、multipart/form-data、application/x-www-form-urlencoded
  • 非简单请求:PUT、DELETE等,或自定义头部的请求

服务器端设置响应头:

<?php
header("Access-Control-Allow-Origin: *"); // 允许所有域名
// 或
header("Access-Control-Allow-Origin: http://example.com"); // 允许特定域名// 对于需要携带凭证的请求
header("Access-Control-Allow-Credentials: true");// 允许的HTTP方法
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");// 允许的头部
header("Access-Control-Allow-Headers: Content-Type, Authorization");
?>

前端使用CORS:

// 简单GET请求
fetch('https://api.example.com/data').then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));// 带凭证的请求
fetch('https://api.example.com/data', {credentials: 'include' // 包含cookie等凭证
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));// 非简单请求(PUT请求)
fetch('https://api.example.com/data/123', {method: 'PUT',headers: {'Content-Type': 'application/json','Authorization': 'Bearer token123'},body: JSON.stringify({name: '新名称',value: '新值'})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

预检请求(Preflight Request):
对于非简单请求,浏览器会先发送一个OPTIONS请求进行预检,服务器需要正确处理。

四、综合案例:多图上传功能

实现一个支持多图上传、预览、删除和进度显示的功能。

HTML部分:

<div class="upload-container"><h2>多图上传</h2><!-- 文件选择区域 --><div class="upload-area"><input type="file" id="file-input" multiple accept="image/*" style="display: none;"><button id="select-btn">选择图片</button><span id="file-info">未选择文件</span></div><!-- 图片预览区域 --><div id="preview-area" class="preview-area"></div><!-- 上传按钮和进度条 --><button id="upload-btn" disabled>开始上传</button><div class="progress-container"><div id="progress-bar" class="progress-bar"></div><span id="progress-text">0%</span></div><!-- 上传结果 --><div id="result-area"></div>
</div>

CSS部分:

.upload-container {max-width: 800px;margin: 0 auto;padding: 20px;font-family: Arial, sans-serif;
}.upload-area {margin-bottom: 20px;padding: 15px;border: 2px dashed #ccc;border-radius: 5px;text-align: center;
}#select-btn {padding: 10px 15px;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 16px;
}#select-btn:hover {background-color: #45a049;
}.preview-area {display: flex;flex-wrap: wrap;gap: 10px;margin-bottom: 20px;
}.preview-item {position: relative;width: 120px;height: 120px;
}.preview-img {width: 100%;height: 100%;object-fit: cover;border-radius: 4px;
}.remove-btn {position: absolute;top: 5px;right: 5px;background-color: #f44336;color: white;border: none;border-radius: 50%;width: 20px;height: 20px;font-size: 12px;cursor: pointer;
}#upload-btn {padding: 10px 20px;background-color: #2196F3;color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 16px;
}#upload-btn:disabled {background-color: #cccccc;cursor: not-allowed;
}#upload-btn:hover:not(:disabled) {background-color: #0b7dda;
}.progress-container {margin-top: 10px;display: none;
}.progress-bar {height: 20px;background-color: #f1f1f1;border-radius: 4px;overflow: hidden;
}.progress-bar::after {content: '';display: block;height: 100%;width: 0%;background-color: #4CAF50;transition: width 0.3s;
}#result-area {margin-top: 20px;padding: 10px;border-radius: 4px;
}.success {background-color: #ddffdd;border-left: 6px solid #4CAF50;
}.error {background-color: #ffdddd;border-left: 6px solid #f44336;
}

JavaScript部分:

document.addEventListener('DOMContentLoaded', function() {const fileInput = document.getElementById('file-input');const selectBtn = document.getElementById('select-btn');const fileInfo = document.getElementById('file-info');const previewArea = document.getElementById('preview-area');const uploadBtn = document.getElementById('upload-btn');const progressContainer = document.querySelector('.progress-container');const progressBar = document.getElementById('progress-bar');const progressText = document.getElementById('progress-text');const resultArea = document.getElementById('result-area');let selectedFiles = [];// 点击选择按钮触发文件输入selectBtn.addEventListener('click', function() {fileInput.click();});// 文件选择变化事件fileInput.addEventListener('change', function(e) {selectedFiles = Array.from(e.target.files);if (selectedFiles.length > 0) {fileInfo.textContent = `已选择 ${selectedFiles.length} 个文件`;uploadBtn.disabled = false;// 清空预览区域previewArea.innerHTML = '';// 显示预览图selectedFiles.forEach((file, index) => {if (!file.type.match('image.*')) {return;}const reader = new FileReader();reader.onload = function(e) {const previewItem = document.createElement('div');previewItem.className = 'preview-item';const img = document.createElement('img');img.className = 'preview-img';img.src = e.target.result;img.alt = file.name;const removeBtn = document.createElement('button');removeBtn.className = 'remove-btn';removeBtn.innerHTML = '×';removeBtn.addEventListener('click', function() {// 从数组中移除文件selectedFiles.splice(index, 1);// 从DOM中移除预览项previewItem.remove();// 更新文件信息fileInfo.textContent = selectedFiles.length > 0 ? `已选择 ${selectedFiles.length} 个文件` : '未选择文件';// 如果没有文件了,禁用上传按钮uploadBtn.disabled = selectedFiles.length === 0;});previewItem.appendChild(img);previewItem.appendChild(removeBtn);previewArea.appendChild(previewItem);};reader.readAsDataURL(file);});} else {fileInfo.textContent = '未选择文件';uploadBtn.disabled = true;}});// 上传按钮点击事件uploadBtn.addEventListener('click', function() {if (selectedFiles.length === 0) {alert('请先选择文件');return;}// 显示进度条progressContainer.style.display = 'block';progressBar.style.width = '0%';progressText.textContent = '0%';// 清空结果区域resultArea.innerHTML = '';resultArea.className = '';// 创建FormData对象const formData = new FormData();// 添加文件到FormDataselectedFiles.forEach(file => {formData.append('images[]', file);});// 添加其他数据(如果需要)formData.append('userId', '123');// 创建XMLHttpRequest对象const xhr = new XMLHttpRequest();// 配置请求xhr.open('POST', 'upload.php', true);// 进度事件xhr.upload.onprogress = function(e) {if (e.lengthComputable) {const percent = Math.round((e.loaded / e.total) * 100);progressBar.style.width = percent + '%';progressText.textContent = percent + '%';}};// 加载完成事件xhr.onload = function() {if (xhr.status === 200) {try {const response = JSON.parse(xhr.responseText);if (response.success) {resultArea.className = 'success';resultArea.innerHTML = `<p>上传成功!</p><p>共上传 ${response.data.uploaded_count} 张图片</p><ul>${response.data.images.map(img => `<li><strong>${img.original_name}</strong> - 大小: ${(img.size / 1024).toFixed(2)} KB, <a href="${img.url}" target="_blank">查看</a></li>`).join('')}</ul>`;} else {resultArea.className = 'error';resultArea.innerHTML = `<p>上传失败</p><p>${response.message}</p>${response.errors ? `<ul>${response.errors.map(err => `<li>${err}</li>`).join('')}</ul>` : ''}`;}} catch (e) {resultArea.className = 'error';resultArea.innerHTML = '<p>解析服务器响应时出错</p>';}} else {resultArea.className = 'error';resultArea.innerHTML = `<p>上传失败,服务器返回状态码: ${xhr.status}</p>`;}// 重置上传按钮和文件选择uploadBtn.disabled = true;fileInput.value = '';selectedFiles = [];fileInfo.textContent = '未选择文件';};// 错误事件xhr.onerror = function() {resultArea.className = 'error';resultArea.innerHTML = '<p>上传过程中发生网络错误</p>';};// 发送请求xhr.send(formData);});
});

服务器端PHP代码(upload.php):

<?php
header('Content-Type: application/json');// 设置跨域头(如果需要)
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Content-Type");// 响应数据结构
$response = ['success' => false,'message' => '','errors' => [],'data' => []
];// 检查是否有文件上传
if (empty($_FILES['images'])) {$response['message'] = '没有接收到任何文件';echo json_encode($response);exit;
}// 创建上传目录(如果不存在)
$uploadDir = 'uploads/' . date('Y/m/d');
if (!file_exists($uploadDir)) {mkdir($uploadDir, 0777, true);
}// 处理每个上传的文件
$uploadedFiles = [];
$errors = [];foreach ($_FILES['images']['tmp_name'] as $key => $tmpName) {// 检查上传错误if ($_FILES['images']['error'][$key] !== UPLOAD_ERR_OK) {$errors[] = '文件 ' . $_FILES['images']['name'][$key] . ' 上传失败: ' . getUploadError($_FILES['images']['error'][$key]);continue;}// 验证文件类型$fileType = mime_content_type($tmpName);if (!in_array($fileType, ['image/jpeg', 'image/png', 'image/gif'])) {$errors[] = '文件 ' . $_FILES['images']['name'][$key] . ' 不是有效的图片格式 (JPEG, PNG, GIF)';continue;}// 验证文件大小(限制为5MB)if ($_FILES['images']['size'][$key] > 5 * 1024 * 1024) {$errors[] = '文件 ' . $_FILES['images']['name'][$key] . ' 大小超过5MB限制';continue;}// 生成唯一文件名$extension = pathinfo($_FILES['images']['name'][$key], PATHINFO_EXTENSION);$filename = uniqid() . '.' . $extension;$destination = $uploadDir . '/' . $filename;// 移动文件到目标位置if (move_uploaded_file($tmpName, $destination)) {$uploadedFiles[] = ['original_name' => $_FILES['images']['name'][$key],'saved_name' => $filename,'size' => $_FILES['images']['size'][$key],'type' => $fileType,'url' => 'http://' . $_SERVER['HTTP_HOST'] . '/' . $destination];} else {$errors[] = '无法保存文件 ' . $_FILES['images']['name'][$key];}
}// 设置响应
if (!empty($uploadedFiles)) {$response['success'] = true;$response['message'] = '部分文件上传成功';$response['data'] = ['uploaded_count' => count($uploadedFiles),'images' => $uploadedFiles];if (!empty($errors)) {$response['errors'] = $errors;}
} else {$response['message'] = '没有文件上传成功';$response['errors'] = $errors;
}// 返回JSON响应
echo json_encode($response);// 辅助函数:获取上传错误信息
function getUploadError($errorCode) {switch ($errorCode) {case UPLOAD_ERR_INI_SIZE:return '文件大小超过服务器限制';case UPLOAD_ERR_FORM_SIZE:return '文件大小超过表单限制';case UPLOAD_ERR_PARTIAL:return '文件只有部分被上传';case UPLOAD_ERR_NO_FILE:return '没有文件被上传';case UPLOAD_ERR_NO_TMP_DIR:return '缺少临时文件夹';case UPLOAD_ERR_CANT_WRITE:return '写入磁盘失败';case UPLOAD_ERR_EXTENSION:return '文件上传被PHP扩展阻止';default:return '未知上传错误';}
}
?>

五、总结

  1. 数据交换格式

    • XML:结构严谨,适合复杂数据结构,但体积较大
    • JSON:轻量级,与JavaScript无缝集成,是现代Web应用的首选
  2. 无刷新分页

    • 提升用户体验
    • 减少服务器负载
    • 通过Ajax动态加载数据
  3. 跨域解决方案

    • JSONP:简单易用,但只支持GET请求
    • CORS:功能强大,安全性好,需要服务器支持
    • 代理服务器:另一种解决方案(未在本文中详述)
  4. 文件上传

    • 使用FormData对象处理多文件上传
    • 提供上传进度反馈
    • 客户端预览和服务器端验证

通过掌握这些技术,可以构建更加现代化、用户友好的Web应用程序。

相关文章:

JavaScript学习教程,从入门到精通,Ajax数据交换格式与跨域处理(26)

Ajax数据交换格式与跨域处理 一、Ajax数据交换格式 1. XML (eXtensible Markup Language) XML是一种标记语言&#xff0c;类似于HTML但更加灵活&#xff0c;允许用户自定义标签。 特点&#xff1a; 可扩展性强结构清晰数据与表现分离文件体积相对较大 示例代码&#xff1…...

抖音IP属地跟无线网有关系吗?一文解析

在抖音等社交平台上&#xff0c;IP属地显示功能让许多用户感到好奇——为什么自己的位置信息有时准确&#xff0c;有时却显示在其他城市&#xff1f;这时&#xff0c;用户会疑惑&#xff1a;抖音IP属地跟无线网有关系吗&#xff1f;本文将详细解析‌IP属地‌和‌无线网‌的概念…...

RDK X3新玩法:超沉浸下棋机器人开发日记

一、项目介绍 产品中文名&#xff1a;超沉浸式智能移动下棋机器人 产品英文名&#xff1a;Hackathon-TTT 产品概念&#xff1a;本项目研发的下棋机器人&#xff0c;是一款能自主移动、具备语音交互并能和玩家在真实的棋盘上进行“人机博弈”的移动下棋平台&#xff0c;能够带给…...

Trae 实测:AI 助力前端开发,替代工具还远吗?

Trae 实测&#xff1a;AI 助力前端开发&#xff0c;替代工具还远吗&#xff1f; 字节上线了一款 AI 新产品&#xff0c;名叫 Trae 。这是一款 IDE 工具&#xff0c;中文意思是「集成开发环境」&#xff0c;做技术的读者对此应该很熟悉。简单理解&#xff0c;就是程序员用来写代…...

SpringCloud基于Eureka和Feign实现一个微服务系统

Spring Cloud 是基于 Spring Boot 的 ‌微服务开发全栈解决方案‌,通过集成多种开源组件,提供分布式系统构建所需的服务治理、配置管理、容错机制‌等核心能力,简化微服务架构的复杂性。其核心目标是实现服务间的高效协同与弹性伸缩,支撑企业级云原生应用开发。Spring Clou…...

nacos设置权重进行负载均衡不生效

nacos设置权重进行负载均衡不生效&#xff0c;必须在启动类下加上这个bean Beanpublic IRule nacosRule(){return new NacosRule();}如下图所示...

Flowable7.x学习笔记(十四)查看部署流程Bpmn2.0-xml

前言 Flowable 在其前端 Modeler 中&#xff0c;采用 BPMN 2.0 标准将流程中的任务、网关、事件等元素以 XML 形式存储&#xff0c;并附带图形互换&#xff08;Diagram Interchange&#xff0c;DI&#xff09;数据&#xff0c;以保证在前端与后端都能精准重建可视化流程图。 生…...

大模型应用中Agent2Agent(A2A)的应用场景,以及A2A与MCP的区别和适用场景

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型应用中Agent2Agent&#xff08;A2A&#xff09;的应用场景&#xff0c;以及A2A与MCP的区别和适用场景。 文章目录 一、引言二、Agent2Agent&#xff08;A2A&#xff09;协议原理2.1 核心架构2.2 基础框架与依…...

Windows server:

企鹅裙&#xff1a;429603659 域搭建 (细节上的问题) 1.将IP地址修改为静态IP&#xff0c;搭建完后设置DNS为本身(在搭建完域服务器后设置DNS) 2.配置之前需将计算机名更改为后面题目中所要求的. 3&#xff0e;一些版本之中比如Windows Server2012之中搭建域之后重启会显示…...

Python 3.14:探索新版本的魅力与革新

在Python编程语言的不断演进中&#xff0c;Python 3.14作为又一重要里程碑&#xff0c;承载着开发者们的期待与热情&#xff0c;悄然走进了我们的视野。尽管在撰写本文时&#xff0c;Python 3.14可能尚未正式成为主流版本&#xff08;注&#xff1a;实际发布情况需根据最新信息…...

LabVIEW基于VI Server的控件引用操作

本 VI 通过展示控件引用&#xff08;Control References&#xff09;的使用&#xff0c;借助 VI Server 实现对前面板对象的编程操作。 ​ 详细说明 隐式属性节点&#xff08;Implicitly Linked Property Node&#xff09;&#xff1a;通过右键单击控件&#xff08;或其控件终…...

【不同名字的yolo的yaml文件名是什么意思】

以下是这些 YOLO 系列配置文件的详细解析&#xff0c;按版本和功能分类说明&#xff1a; 一、YOLOv3 系列 文件名核心特性适用场景yolov3.yaml原始 YOLOv3 结构&#xff0c;3 尺度预测&#xff08;13x13,26x26,52x52&#xff09;通用目标检测yolov3-spp.yaml增加 SPP&#xff…...

《100天精通Python——基础篇 2025 第3天:变量与数据类型全面解析,掌握Python核心语法》

目录 一、Python变量的定义和使用二、Python整数类型&#xff08;int&#xff09;详解三、Python小数/浮点数&#xff08;float&#xff09;类型详解四、Python复数类型(complex)详解---了解五、Python字符串详解(包含长字符串和原始字符串)5.1 处理字符串中的引号5.2 字符串的…...

精益数据分析(24/126):聚焦第一关键指标,驱动创业成功

精益数据分析&#xff08;24/126&#xff09;&#xff1a;聚焦第一关键指标&#xff0c;驱动创业成功 在创业和数据分析的探索之旅中&#xff0c;我们都在不断寻找能够助力成功的关键因素。今天&#xff0c;我依旧带着与大家共同进步的初心&#xff0c;深入解读《精益数据分析…...

【刷题Day26】Linux命令、分段分页和中断(浅)

说下你常用的 Linux 命令&#xff1f; 文件与目录操作&#xff1a; ls&#xff1a;列出当前目录的文件和子目录&#xff0c;常用参数如-l&#xff08;详细信息&#xff09;、-a&#xff08;包括隐藏文件&#xff09;cd&#xff1a;切换目录&#xff0c;用于在文件系统中导航m…...

互联网实验室的质量管控痛点 质检LIMS系统在互联网企业的应用

在互联网行业流量红利消退与用户体验至上的时代背景下&#xff0c;产品迭代速度与质量稳定性成为企业核心竞争力的分水岭。传统测试实验室依赖人工操作、碎片化工具与线下沟通的管理模式&#xff0c;已难以应对敏捷开发、多端适配、数据安全等复合型挑战。 一、互联网实验室的…...

VScode远程连接服务器(免密登录)

一、本机生成密钥对 本地终端输入ssh-keygen&#xff0c;生成公钥&#xff08;id_rsa.pub&#xff09;和私钥&#xff08;id_rsa&#xff09; 二、在远程服务器根目录的.ssh文件夹的authorized_keys中输入id_rsa的内容 三、修改vscode的config文件.ssh/config&#xff0c;加…...

【Go语言】RPC 使用指南(初学者版)

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;允许程序调用另一台计算机上的子程序&#xff0c;就像调用本地程序一样。Go 语言内置了 RPC 支持&#xff0c;下面我会详细介绍如何使用。 一、基本概念 在 Go 中&…...

安卓四大组件之ContentProvider

目录 实现步骤 代码分析 onCreate insert query ContextHolder Cursor 作用与用法 基本步骤&#xff1a; 可能的面试题&#xff1a;为什么使用Cursor&#xff1f; 为什么使用Cursor 使用Cursor的好处 静态内部类实现单例模式 AnndroidManifest.xml配置信息 注释的…...

C#中实现XML解析器

XML&#xff08;可扩展标记语言&#xff09;是一种广泛用于存储和传输数据的格式&#xff0c;因其具有良好的可读性和可扩展性&#xff0c;在许多领域都有应用。 实现思路&#xff1a; 词法分析 词法分析的目的是将输入的 XML 字符串分解为一个个的词法单元&#xff0c;例如…...

神经符号混合与跨模态对齐:Manus AI如何重构多语言手写识别的技术边界

在全球化数字浪潮下,手写识别技术长期面临"巴别塔困境"——人类书写系统的多样性(从中文象形文字到阿拉伯语连写体)与个体书写风格的随机性,构成了人工智能难以逾越的双重壁垒。传统OCR技术在处理多语言手写场景时,准确率往往不足70%,特别是在医疗处方、古代文…...

TestBrain开源程序是一款集使用AI(如deepseek)大模型自动生成测试用例、和测试用例评审、RAG知识库管理的web平台系统

一、软件介绍 文末提供程序和源码下载 TestBrain开源程序是一款集使用AI(如deepseek)大模型自动生成测试用例、和测试用例评审、RAG知识库管理的web平台系统一个基于LLM的智能测试用例生成平台(功能慢慢丰富中&#xff0c;未来可能将测试相关的所有活动集成到一起)&#xff0c…...

软件工程效率优化:一个分层解耦与熵减驱动的系统框架

软件工程效率优化&#xff1a;一个分层解耦与熵减驱动的系统框架** 摘要 (Abstract) 本报告构建了一个全面、深入、分层的软件工程效率优化框架&#xff0c;旨在超越简单的技术罗列&#xff0c;从根本的价值驱动和熵减原理出发&#xff0c;系统性地探讨提升效率的策略与实践。…...

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度

目录 引言 一、性能优化&#xff1a;突破数据处理极限&#xff0c;提升运行效率 1.1 智能查询优化器&#xff1a;精准优化数据检索路径 1.2 并行处理技术&#xff1a;充分释放多核计算潜力 1.3 智能缓存机制&#xff1a;加速数据访问速度 二、稳定性提升&#xff1a;筑牢…...

前端面试常见部分问题,及高阶部分问题

面试中也极有可能让你徒手写代码,无聊的面试问题o( ̄︶ ̄)o 一、HTML/CSS 基础与进阶 常见问题 什么是语义化标签?有哪些常用语义化标签? 答案:语义化标签是指具有明确含义的 HTML 标签,如 <header>、<footer>、<article>、<section> 等。它们有…...

使用 AutoGen 与 Elasticsearch

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何使用 AutoGen 为你的 agent 创建一个 Elasticsearch 工具。 Elasticsearch 拥有与行业领先的生成式 AI 工具和提供商的原生集成。查看我们的网络研讨会&#xff0c;了解如何超越 RAG 基础&#xff0c;或使用 Elastic 向量…...

kafka与flume的整合、spark-streaming

kafka与flume的整合 前期配置完毕&#xff0c;开启集群 需求1&#xff1a; 利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台&#xff08;三个node01中运行&#xff09; 1.在kafka中建立topic kafka…...

高级电影感户外街拍人像摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 高级电影感户外街拍人像摄影后期 Lr 调色&#xff0c;是运用 Adobe Lightroom 软件&#xff0c;对户外街拍的人像照片进行后期处理&#xff0c;以塑造出具有电影质感的独特视觉效果。此调色过程借助 Lr 丰富的工具与功能&#xff0c;从色彩、光影、对比度等多维度着手…...

react 常用钩子 hooks 总结

文章目录 React钩子概念图状态管理钩子 state management副作用钩子 effect hooks引用钩子 Ref hooks上下文钩子其他钩子过渡钩子 处理过渡效果性能优化钩子 performance hooksReact 19 新钩子 React钩子概念图 状态管理钩子 state management useState useReducer useSyncEx…...

2025 年导游证报考条件新政策解读与应对策略

2025 年导游证报考政策有了不少新变化&#xff0c;这些变化会对报考者产生哪些影响&#xff1f;我们又该如何应对&#xff1f;下面就为大家详细解读新政策&#xff0c;并提供实用的应对策略。 最引人注目的变化当属中职旅游类专业学生的报考政策。以往&#xff0c;中专学历报考…...

重置 Git 项目并清除提交历史

在某些情况下&#xff0c;你可能需要完全重置一个 Git 项目&#xff0c;清除所有提交历史&#xff0c;然后将当前代码作为全新的初始提交。本文将详细介绍这个过程的操作步骤和注意事项。 重要警告 ⚠️ 注意&#xff1a;以下操作将永久删除项目的所有提交历史、分支和标签。…...

GitHub Copilot (Gen-AI) 很有用,但不是很好

摘要&#xff1a;以下是我在过去三个月中在实际 、 开发中使用 GitHub Copilot Pro 后的想法。由于技术发展迅速&#xff0c;值得注意的是&#xff0c;这些印象是基于我截至 2025 年 3 月的经验。 1 免费试用促使我订阅 GitHub Copilot Pro 我以前读过有关 AI 代码生成器的文…...

K8S Service 原理、案例

一、理论介绍 1.1、3W 法则 1、是什么&#xff1f; Service 是一种为一组功能相同的 pod 提供单一不变的接入点的资源。当 Service 存在时&#xff0c;它的IP地址和端口不会改变。客户端通过IP地址和端口号与 Service 建立连接&#xff0c;这些连接会被路由到提供该 Service 的…...

Base64编码原理:二进制数据与文本的转换技术

&#x1f504; Base64编码原理&#xff1a;二进制数据与文本的转换技术 开发者的数据编码困境 作为开发者&#xff0c;你是否曾遇到这些与Base64相关的挑战&#xff1a; &#x1f4ca; 需要在JSON中传输二进制数据&#xff0c;但不确定如何正确编码&#x1f5bc;️ 想要在HT…...

系统设计(1)—前端—CDN—Nginx—服务集群

简介&#xff1a; 本指南旨涵盖前端、CDN、Nginx 负载均衡、服务集群、Redis 缓存、消息队列、数据库设计、熔断限流降级以及系统优化等模块的核心要点。我们将介绍各模块常见的设计方案与优化策略&#xff0c;并结合电商秒杀、SaaS CRM 系统、支付系统等高并发场景讨论实践技巧…...

Easysearch 基础运维扫盲指南:从 HTTP 到 HTTPS、认证与安全访问全解析

Easysearch 基础运维扫盲指南&#xff1a;从 HTTP 到 HTTPS、认证与安全访问全解析 众所周知&#xff0c;原生 Elasticsearch 默认开启的是 HTTP 明文接口&#xff0c;并且不开启任何身份认证或传输加密。若想启用 TLS/SSL 加密及账号密码验证&#xff0c;通常需要配置繁琐的安…...

在Android中如何使用Protobuf上传协议

在 Android 中使用 Protobuf&#xff08;Protocol Buffers&#xff09;主要分为以下几个步骤&#xff1a; ✅ 1. 添加 Protobuf 插件和依赖 在项目的 build.gradle&#xff08;Project 级&#xff09;文件中添加 Google 的 Maven 仓库&#xff08;通常默认已有&#xff09;&am…...

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中&#xff0c;地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生&#xff0c;成为破解这一难题的核心工具。…...

2025年的营销趋势-矩阵IP

从 2025 年的营销生态来看&#xff0c;创始人 IP 与智能矩阵的结合确实呈现出颠覆性趋势&#xff0c;这一现象背后隐藏着三个值得深度解析的商业逻辑&#xff1a; 一、创始人 IP 的本质是 "信任货币" 的数字化迁徙 当新能源汽车市场陷入参数混战&#xff0c;雷军将个…...

对接金蝶获取接口授权代码

接口服务信息 using RestSharp; using System.Configuration; using System.Threading.Tasks; public class KingdeeAccessTokenService { private readonly RestClient _client; private readonly KingdeeApiConfig _config; public KingdeeAccessTokenService() …...

探秘 3D 展厅之卓越优势,解锁沉浸式体验新境界

&#xff08;一&#xff09;打破时空枷锁&#xff0c;全球触达​ 3D 展厅的首要优势便是打破了时空限制。在传统展厅中&#xff0c;观众需要亲临现场&#xff0c;且必须在展厅开放的特定时间内参观。而 3D 展厅依托互联网&#xff0c;让观众无论身处世界哪个角落&#xff0c;只…...

prometheus通过Endpoints自定义grafana的dashboard模块

1、prometheus自定义的dashboard模块 文件路径/etc/prometheus/config_out/prometheus-env.yaml - job_name: serviceMonitor/monitoring/pfil/0honor_labels: falsekubernetes_sd_configs:- role: endpointsnamespaces:names:- monitoringrelabel_configs:- source_labels:- …...

java排序算法-计数排序

计数排序的思路 计数排序的基本思路&#xff1a; 确定取值范围&#xff1a; 遍历整个待排序的数组&#xff0c;确定数组中元素的取值范围&#xff0c;找到最小值和最大值。创建计数数组&#xff1a; 创建一个计数数组&#xff0c;其长度为取值范围的大小&#xff0c;用于统计…...

力扣-hot100(滑动窗口最大值)

239. 滑动窗口最大值 困难 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums […...

每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)

洛谷P1049 装箱问题题解&#xff1a;动态规划在背包问题中的经典应用 题目描述 P1049 装箱问题是一道典型的0-1背包问题变种。题目要求在给定箱子容量V和n个物品体积的情况下&#xff0c;选择若干物品装入箱子&#xff0c;使得箱子的剩余空间最小。最终输出这个最小剩余空间的…...

【尚硅谷Redis6】自用学习笔记

Redis介绍 Redis是单线程 多路IO复用技术&#xff08;类似黄牛买票&#xff09; 默认有16个库&#xff0c;用select进行切换 默认端口号为6379 Memcached&#xff1a;多线程 锁&#xff08;数据类型单一&#xff0c;不支持持久化&#xff09; 五大常用数据类型 Redis key …...

产品更新丨谷云科技ETLCloud V3.9.2版本发布

谷云科技 ETLCloud 集成平台迎来了每月一次的功能迭代&#xff0c;本月发布版本号为 3.9.2 版本&#xff0c;为用户带来了新的功能、优化改进以及问题修复&#xff0c;以下是详细介绍&#xff1a; 新增组件 本次更新新增了众多实用组件&#xff0c;涵盖了京东和 Shopify 相关…...

Promise并发控制与HTTP请求优化

Promise并发方法对比 #mermaid-svg-tnmGzOkgNUCrbvfI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tnmGzOkgNUCrbvfI .error-icon{fill:#552222;}#mermaid-svg-tnmGzOkgNUCrbvfI .error-text{fill:#552222;stroke…...

G1垃圾回收器中YoungGC和MixedGC的区别

在 G1 垃圾回收器中&#xff0c;Mixed GC 和 Young GC 的区别主要体现在以下几个方面&#xff1a; 作用范围 Young GC&#xff1a;仅针对年轻代中的Region进行回收&#xff0c;包括 Eden 区和 Survivor 区的 Region。Mixed GC&#xff1a;会回收所有年轻代的 Region 以及部分…...

Web4.0身份革命:去中心化身份系统的全栈实现路径

去中心化身份&#xff08;DID&#xff09;技术栈正在重构数字世界的信任根基&#xff0c;本文从密码学协议、存储网络、验证框架三个维度&#xff0c;解析符合W3C标准的身份系统构建方案。通过Hyperledger Aries架构实践&#xff0c;揭示如何实现跨链身份互通、数据主权控制、零…...