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

微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】

文章目录

  • 一、准备工作
    • 1. 硬件准备
    • 2. 开发环境
  • 二、小程序配置
    • 1. 修改app.json
  • 三、完整代码实现
    • 1. pages/index/index.wxml
    • 2. pages/index/index.wxss
    • 3. pages/index/index.js
  • 四、ESC/POS指令说明
  • 五、测试流程
  • 六、常见问题解决
  • 七、进一步优化建议


在这里插入图片描述

下面我将提供一个完整的微信小程序通过蓝牙连接热敏打印机(支持ESC/POS指令)打印订单小票的详细实现方案。本教程假设您使用的是常见的蓝牙热敏打印机(如佳博、芯烨等品牌)。

一、准备工作

1. 硬件准备

  • 蓝牙热敏小票打印机(支持 ESC/POS 指令)
  • 确保打印机已充电/通电
  • 知道打印机的蓝牙名称(如"GBTP-XXXX")

2. 开发环境

  • 微信开发者工具
  • 已注册微信小程序账号
  • 小程序已开通蓝牙权限(在 app.json 中配置)

二、小程序配置

1. 修改app.json

{"pages": ["pages/index/index"],"permission": {"scope.userLocation": {"desc": "你的位置信息将用于蓝牙设备搜索"}},"requiredPrivateInfos": ["getLocation", "chooseAddress", "startBluetoothDevicesDiscovery"]
}

三、完整代码实现

1. pages/index/index.wxml

<view class="container"><button bindtap="searchPrinter">搜索蓝牙打印机</button><view wx:for="{{devices}}" wx:key="deviceId"><view class="device-item" bindtap="connectPrinter" data-device="{{item}}">{{item.name}} ({{item.deviceId}})</view></view><button bindtap="printTest" disabled="{{!connected}}">打印测试小票</button><button bindtap="printOrder" disabled="{{!connected}}">打印订单</button><view class="status">状态: {{status}}</view>
</view>

2. pages/index/index.wxss

.container {padding: 20px;
}.device-item {padding: 15px;border-bottom: 1px solid #eee;
}button {margin-top: 15px;
}.status {margin-top: 20px;color: #666;font-size: 14px;
}

3. pages/index/index.js

Page({data: {devices: [],         // 搜索到的设备列表connected: false,    // 是否已连接deviceId: '',        // 当前连接的设备IDserviceId: '',       // 蓝牙服务UUIDcharacteristicId: '', // 蓝牙特征值UUIDstatus: '未连接',     // 状态提示orderInfo: {         // 示例订单数据orderNo: '20231115001',date: '2023-11-15 14:30',items: [{name: '有机青菜', price: 12.5, quantity: 2},{name: '新鲜番茄', price: 8.0, quantity: 3},{name: '优质土豆', price: 5.5, quantity: 1}],total: 47.5,address: '北京市朝阳区科技园A座1001室',phone: '138****1234'}},// 搜索蓝牙设备searchPrinter() {this.setData({status: '正在搜索蓝牙设备...'});// 初始化蓝牙模块wx.openBluetoothAdapter({success: (res) => {console.log('蓝牙适配器初始化成功', res);this.startDiscovery();},fail: (err) => {console.error('蓝牙适配器初始化失败', err);this.setData({status: '蓝牙初始化失败,请检查手机蓝牙是否开启'});}});},// 开始搜索设备startDiscovery() {wx.startBluetoothDevicesDiscovery({allowDuplicatesKey: false,success: (res) => {console.log('开始搜索设备', res);this.setData({status: '正在搜索设备...'});// 监听找到新设备事件wx.onBluetoothDeviceFound((res) => {const devices = res.devices.filter(device => device.name && device.name.indexOf('GBTP') !== -1);if (devices.length > 0) {this.setData({devices: devices,status: `找到${devices.length}个打印机设备`});wx.stopBluetoothDevicesDiscovery(); // 找到设备后停止搜索}});},fail: (err) => {console.error('搜索设备失败', err);this.setData({status: '搜索设备失败'});}});},// 连接打印机connectPrinter(e) {const device = e.currentTarget.dataset.device;this.setData({status: `正在连接${device.name}...`});// 连接设备wx.createBLEConnection({deviceId: device.deviceId,success: (res) => {console.log('设备连接成功', res);this.setData({deviceId: device.deviceId,status: `已连接${device.name}`});this.getBLEDeviceServices(device.deviceId);},fail: (err) => {console.error('设备连接失败', err);this.setData({status: '连接失败'});}});},// 获取蓝牙服务getBLEDeviceServices(deviceId) {wx.getBLEDeviceServices({deviceId: deviceId,success: (res) => {console.log('获取服务成功', res.services);for (const service of res.services) {// 通常蓝牙打印机的服务UUID是FF00或FFE0if (service.uuid.startsWith('FFE0') || service.uuid.startsWith('FF00')) {this.setData({serviceId: service.uuid});this.getBLEDeviceCharacteristics(deviceId, service.uuid);break;}}},fail: (err) => {console.error('获取服务失败', err);}});},// 获取蓝牙特征值getBLEDeviceCharacteristics(deviceId, serviceId) {wx.getBLEDeviceCharacteristics({deviceId: deviceId,serviceId: serviceId,success: (res) => {console.log('获取特征值成功', res.characteristics);for (const characteristic of res.characteristics) {// 寻找可写的特征值if (characteristic.properties.write) {this.setData({characteristicId: characteristic.uuid,connected: true});console.log('打印机已准备好');break;}}},fail: (err) => {console.error('获取特征值失败', err);}});},// 打印测试小票printTest() {this.setData({status: '正在打印测试小票...'});// ESC/POS指令const buffer = new ArrayBuffer(100);const dataView = new Uint8Array(buffer);// 初始化打印机dataView[0] = 0x1B;dataView[1] = 0x40;// 设置居中dataView[2] = 0x1B;dataView[3] = 0x61;dataView[4] = 0x01;// 设置字体大小dataView[5] = 0x1D;dataView[6] = 0x21;dataView[7] = 0x11;// 打印文本const text = "测试小票\n";for (let i = 0; i < text.length; i++) {dataView[8 + i] = text.charCodeAt(i);}// 换行const lineBreak = "\n\n\n\n";for (let i = 0; i < lineBreak.length; i++) {dataView[8 + text.length + i] = lineBreak.charCodeAt(i);}// 切纸dataView[8 + text.length + lineBreak.length] = 0x1D;dataView[9 + text.length + lineBreak.length] = 0x56;dataView[10 + text.length + lineBreak.length] = 0x42;dataView[11 + text.length + lineBreak.length] = 0x00;// 发送数据this.writeBLECharacteristicValue(buffer);},// 打印订单printOrder() {this.setData({status: '正在打印订单...'});// 创建缓冲区const commands = [];// 初始化打印机commands.push(0x1B, 0x40);// 设置居中commands.push(0x1B, 0x61, 0x01);// 设置大字体commands.push(0x1D, 0x21, 0x11);// 打印标题this.addTextToCommand(commands, "蔬菜配送订单\n");// 恢复默认字体commands.push(0x1D, 0x21, 0x00);// 订单信息this.addTextToCommand(commands, `订单号: ${this.data.orderInfo.orderNo}\n`);this.addTextToCommand(commands, `日期: ${this.data.orderInfo.date}\n\n`);// 商品列表this.addTextToCommand(commands, "----------------------------\n");this.addTextToCommand(commands, "商品名称   单价  数量  小计\n");this.addTextToCommand(commands, "----------------------------\n");this.data.orderInfo.items.forEach(item => {const line = `${item.name}    ${item.price}   ${item.quantity}   ${(item.price * item.quantity).toFixed(2)}\n`;this.addTextToCommand(commands, line);});this.addTextToCommand(commands, "----------------------------\n");this.addTextToCommand(commands, `总计: ¥${this.data.orderInfo.total}\n\n`);// 配送信息this.addTextToCommand(commands, `配送地址: ${this.data.orderInfo.address}\n`);this.addTextToCommand(commands, `联系电话: ${this.data.orderInfo.phone}\n\n`);// 感谢语commands.push(0x1B, 0x61, 0x01); // 居中this.addTextToCommand(commands, "感谢您的惠顾!\n");this.addTextToCommand(commands, "期待再次为您服务\n\n\n");// 切纸commands.push(0x1D, 0x56, 0x42, 0x00);// 转换为ArrayBufferconst buffer = new ArrayBuffer(commands.length);const dataView = new Uint8Array(buffer);commands.forEach((value, index) => {dataView[index] = value;});// 发送数据this.writeBLECharacteristicValue(buffer);},// 辅助方法:添加文本到命令数组addTextToCommand(commands, text) {for (let i = 0; i < text.length; i++) {commands.push(text.charCodeAt(i));}},// 写入蓝牙特征值writeBLECharacteristicValue(buffer) {wx.writeBLECharacteristicValue({deviceId: this.data.deviceId,serviceId: this.data.serviceId,characteristicId: this.data.characteristicId,value: buffer,success: (res) => {console.log('写入成功', res);this.setData({status: '打印指令已发送'});},fail: (err) => {console.error('写入失败', err);this.setData({status: '打印失败'});}});}
});

四、ESC/POS指令说明

  1. 打印机初始化:0x1B 0x40

  2. 设置对齐方式

    • 左对齐:0x1B 0x61 0x00
    • 居中:0x1B 0x61 0x01
    • 右对齐:0x1B 0x61 0x02
  3. 设置字体大小

    • 0x1D 0x21 0x00 - 正常大小
    • 0x1D 0x21 0x11 - 双倍宽高
  4. 换行0x0A

  5. 切纸0x1D 0x56 0x42 0x00

五、测试流程

  1. 打开微信开发者工具,导入本项目
  2. 点击"搜索蓝牙打印机"按钮
  3. 在设备列表中找到您的打印机并点击连接
  4. 连接成功后,点击"打印测试小票"测试基本功能
  5. 点击"打印订单"打印完整的订单信息

六、常见问题解决

  1. 找不到设备:

    • 确保打印机蓝牙已开启并可被发现
    • 检查打印机是否支持 BLE (蓝牙4.0及以上)
    • 修改代码中的设备名称过滤条件(如GBTP)
  2. 连接失败:

    • 确保打印机未被其他设备连接
    • 尝试重启打印机蓝牙
  3. 打印乱码:

    • 检查 ESC/POS 指令是否正确
    • 确保打印机支持接收的指令集
  4. 权限问题:

    • 确保小程序已获取蓝牙相关权限
    • 在手机上授权小程序使用蓝牙

七、进一步优化建议

  1. 添加打印机断开重连机制
  2. 实现打印任务队列,防止并发打印冲突
  3. 根据打印机型号调整指令集
  4. 添加打印状态回调,提供更好的用户反馈
  5. 实现打印内容模板化,便于维护

这个 Demo 提供了完整的蓝牙连接和打印功能实现,您可以根据实际需求进行调整和扩展。实际开发中,建议参考您使用的打印机型号的特定指令集文档进行微调。

相关文章:

微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】

文章目录 一、准备工作1. 硬件准备2. 开发环境 二、小程序配置1. 修改app.json 三、完整代码实现1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令说明五、测试流程六、常见问题解决七、进一步优化建议 下面我将提供一个完整的微信…...

阿里云基于本地知识库构建RAG应用 | 架构与场景

RAG&#xff08;检索增强生成&#xff0c;Retrieval-Augmented Generation&#xff09;是一种结合了检索和生成技术的框架&#xff0c;旨在通过外部知识库的检索来增强大语言模型&#xff08;LLM&#xff09;的生成能力。 其核心架构包括两个主要部分&#xff1a; 检索模块&a…...

Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)

一、引言 深度学习的重要性 深度学习是一种通过模拟人脑神经元结构来进行数据学习和模式识别的技术&#xff0c;在分类任务中展现出强大的能力。 分类任务的多样性 分类任务涵盖了各种场景&#xff0c;例如簇分类、圆环分类和月牙分类&#xff0c;每种任务都有不同的…...

Python图像处理——基于Retinex算法的低光照图像增强系统

1.项目内容 &#xff08;1&#xff09;算法介绍 ①MSRCR (Multi-Scale Retinex with Color Restoration) MSRCR 是多尺度 Retinex 算法&#xff08;MSR&#xff09;的扩展版&#xff0c;引入了色彩恢复机制以进一步提升图像增强质量。MSR 能有效地压缩图像动态范围&#xff…...

【网络】MQTT协议

MQTT协议全称是&#xff08;Message Queuing Telemetry Transport&#xff09;&#xff0c;即消息队列遥测传输协议 是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协议上 MQTT通信模型 特点&#xff1a; 1、客户端使用它连…...

python基础-requests结合AI实现自动化数据抓取

Python Requests高级指南&#xff1a;从入门到精通 概述 Requests 是一个基于 urllib3 封装的 Python HTTP 客户端库&#xff0c;提供了极其简洁且人性化的接口&#xff0c;使得发送 HTTP 请求和处理响应变得轻而易举。它支持常见的 HTTP 方法&#xff08;GET、POST、PUT、DE…...

边界凸台建模与实例

文章目录 边界凸台特征耳机案例瓶子 边界凸台特征 两侧对称拉伸最上面的圆柱 同过两点一基准面画草图&#xff0c;在基准面上画椭圆 隐藏无关的实体和草图&#xff0c;以便椭圆的端点能与线给穿透约束&#xff0c;下面的点与下面的线也给穿透&#xff0c;短轴长给35&#xff08…...

Kafka和Spark-Streaming

Kafka和Spark-Streaming 一、Kafka 1、Kafka和Flume的整合 ① 需求1&#xff1a;利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台&#xff1a; 在flume/conf下添加.conf文件&#xff0c; vi flume…...

5.2 AutoGen:支持多Agent对话的开源框架,适合自动化任务

AutoGen作为由Microsoft开发的开源框架&#xff0c;已成为构建多Agent对话系统和自动化任务的领先工具。其核心在于通过自然语言和代码驱动的多Agent对话&#xff0c;支持复杂任务的自治执行或结合人类反馈优化&#xff0c;广泛应用于客服自动化、金融分析、供应链优化和医疗诊…...

探索亚马逊云科技:开启您的云计算之旅

前言 在当今数字化时代&#xff0c;云计算已成为企业和个人不可或缺的技术基础设施。作为全球领先的云服务提供商&#xff0c;亚马逊云科技&#xff08;Amazon Web Services&#xff09;为您提供强大、可靠且安全的云计算解决方案。 想要立即体验亚马逊云科技的强大功能&#x…...

2023年第十四届蓝桥杯Scratch02月stema选拔赛真题——算式题

完整题目可点击下方地址查看&#xff0c;支持在线编程&#xff0c;支持源码和素材获取&#xff1a; 算式题_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/scratch/show-4267.html?_shareid3 程序演示可点击下方地址查看&#xff0c;支持源码和素材获取&…...

霍格软件测试-JMeter高级性能测试一期

课程大小&#xff1a;32.2G 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/90631395 更多资源下载&#xff1a;关注我 当下BAT、TMD等互联网一线企业已几乎不再招募传统测试工程师&#xff0c;而只招测试开发工程师&#xff01;在软件测试技术栈迭代…...

django.db.utils.OperationalError: (1050, “Table ‘你的表名‘ already exists“)

这个错误意味着 Django 尝试执行迁移时&#xff0c;发现数据库中已经有一张叫 你的表名的表了&#xff0c;但这张表不是通过 Django 当前的迁移系统管理的&#xff0c;或者迁移状态和数据库实际状态不一致。 &#x1f9e0; 可能出现这个问题的几种情况&#xff1a; 1.你手动创…...

分布式ID生成方案详解

分布式ID生成方案详解 一、问题背景 分库分表场景下&#xff0c;传统自增ID会导致不同库/表的ID重复&#xff0c;需要分布式ID生成方案解决以下核心需求&#xff1a; •全局唯一性&#xff1a;跨数据库/表的ID不重复 •有序性&#xff1a;利于索引优化和范围查询 •高性能&…...

短视频矩阵系统可视化剪辑功能开发,支持OEM

在短视频营销与内容创作竞争日益激烈的当下&#xff0c;矩阵系统中的可视化剪辑功能成为提升内容产出效率与质量的关键模块。它以直观的操作界面和强大的编辑能力&#xff0c;帮助创作者快速将创意转化为优质视频。本文将结合实际开发经验&#xff0c;从需求分析、技术选型到核…...

使用开源免费雷池WAF防火墙,接入保护你的网站

使用开源免费雷池WAF防火墙&#xff0c;接入保护你的网站 大家好&#xff0c;我是星哥&#xff0c;昨天介绍了《开源免费WEB防火墙&#xff0c;不让黑客越雷池一步&#xff01;》链接&#xff1a;https://mp.weixin.qq.com/s/9TOXth3128N6PtXhaWI5aw 今天讲一下如何把网站接入…...

Python-Agent调用多个Server-FastAPI版本

Python-Agent调用多个Server-FastAPI版本 Agent调用多个McpServer进行工具调用 1-核心知识点 fastAPI的快速使用agent调用多个server 2-思路整理 1&#xff09;先把每个子服务搭建起来2&#xff09;再暴露一个Agent 3-参考网址 VSCode配置Python开发环境&#xff1a;https:/…...

spark-standalone模式

Spark Standalone模式是Spark集群的一种部署方式&#xff0c;即在没有使用其他资源管理器&#xff08;如YARN或Mesos&#xff09;的情况下&#xff0c;在Spark自身提供的集群管理器中部署和运行Spark应用程序。 在Spark Standalone模式下&#xff0c;有一个主节点&#xff08;…...

3、LangChain基础:LangChain Chat Model

Prompt templates: Few shot、Example selector Few shot(少量示例) 创建少量示例的格式化程序 创建一个简单的提示模板,用于在生成时向模型提供示例输入和输出。向LLM提供少量这样的示例被称为少量示例,这是一种简单但强大的指导生成的方式,在某些情况下可以显著提高模型…...

信创时代开发工具选择指南:国产替代背景下的技术生态与实践路径

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

Coze高阶玩法 | 使用Coze制作思维认知提升视频,效率提升300%!(附保姆级教程)

目录 一、工作流整体设计 二、制作工作流 2.1 开始节点 2.2 大模型 2.3 文本处理 2.4 代码 2.5 批处理 2.6 选择器 2.7 画板_视频模板 2.8 合成音频 2.9 图片与音频合并视频 2.10 视频合并 2.11 结束节点 三、智能体应用体验 中午吃饭的时候,刷到了一个思维认知…...

数据湖DataLake和传统数据仓库Datawarehouse的主要区别是什么?优缺点是什么?

数据湖和传统数据仓库的主要区别 以下是数据湖和传统数据仓库的主要区别&#xff0c;以表格形式展示&#xff1a; 特性数据湖传统数据仓库数据类型支持结构化、半结构化及非结构化数据主要处理结构化数据架构设计扁平化架构&#xff0c;所有数据存储在一个大的“池”中多层架…...

GStreamer 简明教程(十一):插件开发,以一个音频生成(Audio Source)插件为例

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…...

chrome://inspect/#devices 调试 HTTP/1.1 404 Not Found 如何解决

使用chrome是需要翻墙的&#xff0c;可以换个浏览器进行使用 可以使用edge浏览器&#xff0c;下载地址如下 微软官方edge浏览器|Mac版&#xff1a;浏览更智能&#xff0c;工作更高效 下载Edge浏览器 edge://inspect/#devices 点击inspect即可 qq浏览器 1. 下载qq浏览器 2. …...

RFID使用指南

## 什么是RFID&#xff1f; RFID&#xff08;Radio Frequency Identification&#xff09;即射频识别技术&#xff0c;是一种通过无线电波进行非接触式数据交换的技术。 ## RFID系统的主要组成部分 1. **RFID标签&#xff08;Tag&#xff09;** - 包含芯片和天线 - 分为有源标…...

初识Redis · 哨兵机制

目录 前言&#xff1a; 引入哨兵 模拟哨兵机制 配置docker环境 基于docker环境搭建哨兵环境 对比三种配置文件 编排主从节点和sentinel 主从节点 sentinel 模拟哨兵 前言&#xff1a; 在前文我们介绍了Redis的主从复制有一个最大的缺点就是&#xff0c;主节点挂了之…...

JAVA设计模式——(七)代理模式

JAVA设计模式——&#xff08;七&#xff09;代理模式 介绍理解实现抽象主题角色具体主题角色代理类测试 应用 介绍 代理模式和装饰模式还是挺像的。装饰模式是抽象类对装饰对象的实现&#xff0c;在继承装饰对象。代理模式则是直接对代理对象的实现。 理解 代理模式可以看成…...

Redis 原子操作

文章目录 前言✅ 一、什么是「原子操作」&#xff1f;&#x1f50d; 二、怎么判断一个操作是否原子&#xff1f;&#x1f9ea; 三、项目中的原子 vs 非原子案例&#xff08;秒杀系统&#xff09;✅ 原子性&#xff08;OK&#xff09;❌ 非原子性&#xff08;高风险&#xff09;…...

待办事项日历组件实现

待办事项日历组件实现 今天积累一个简易的待办事项日历组件的实现方法。 需求&#xff1a; 修改样式&#xff0c;变成符合项目要求的日历样式日历上展示待办事项提示&#xff08;有未完成待办&#xff1a;展示黄点&#xff0c;有已完成待办&#xff1a;展示绿点&#xff09;…...

Flask 请求数据获取方法详解

一、工作原理 在 Flask 中&#xff0c;所有客户端请求的数据都通过全局的 request 对象访问。该对象是 请求上下文 的一部分&#xff0c;仅在请求处理期间存在。Flask 在收到请求时自动创建 request 对象&#xff0c;并根据请求类型&#xff08;如 GET、POST&#xff09;和内容…...

PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题

PicoVR眼镜开启XR融合现实显示模式下&#xff0c;Unity3D粒子效果无法显示问题&#xff0c;其原因是XR融合显示模式下&#xff0c;Unity3D应用显示层在最终合成到眼镜显示器时&#xff0c;驱动层先渲染摄像机画面&#xff0c;再以Alpha透明方式渲染应用层画面&#xff0c;问题就…...

vue-lottie的使用和配置

一、vue-lottie 简介 vue-lottie 是一个 Vue 组件&#xff0c;用于在 Vue 项目中集成 Airbnb 的 Lottie 动画库。它通过 JSON 文件渲染 After Effects 动画&#xff0c;适用于复杂矢量动画的高效展示。 二、安装与基础使用 1. 安装 npm install vue-lottielatest # 或 yarn…...

PyTorch 实现食物图像分类实战:从数据处理到模型训练

一、简介 在计算机视觉领域&#xff0c;图像分类是一项基础且重要的任务&#xff0c;广泛应用于智能安防、医疗诊断、电商推荐等场景。本文将以食物图像分类为例&#xff0c;基于 PyTorch 框架&#xff0c;详细介绍从数据准备、模型构建到训练测试的全流程&#xff0c;帮助读者…...

传统中台的重生——云原生如何重塑政务系统后端架构

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:传统后端架构的“痛”与“变” 在过去十年中,无数企业和机构纷纷构建中台系统,尤其是政务、金融、交通、教育等领域。这些中台系统一般基于 Java EE 单体架构,集中部署于虚拟机上,靠人…...

jQuery AJAX、Axios与Fetch

jQuery AJAX、Axios与Fetch对比 #mermaid-svg-FRNqb7d4i2fmbavm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FRNqb7d4i2fmbavm .error-icon{fill:#552222;}#mermaid-svg-FRNqb7d4i2fmbavm .error-text{fill:#552…...

【Hive入门】Hive数据导出完全指南:从HDFS到本地文件系统的专业实践

目录 引言 1 Hive数据导出概述 1.1 数据导出的核心概念 1.2 典型导出场景 2 Hive到HDFS导出详解 2.1 INSERT OVERWRITE DIRECTORY方法 2.2 多目录导出技术 2.3 动态分区导出 3 HDFS到本地文件系统转移 3.1 hadoop fs命令操作 3.2 分布式拷贝工具DistCp 4 直接导出到…...

stack __ queue(栈和队列)

1. stack的介绍和使用 栈和队列里面都叫容器适配器 存储数据就要交给别的容器 通过封装别的容器&#xff0c;可以进行相应的操作&#xff0c;来达到目的 适配的本质就是复用 这就没有迭代器了&#xff0c;不支持随便遍历 2. queue的介绍和使用 下面用一些题来深入理解 栈…...

UML 类图基础和类关系辨析

UML 类图 目录 1 概述 2 类图MerMaid基本表示法 3 类关系详解 3.1 实现和继承 3.1.1 实现&#xff08;Realization&#xff09;3.1.2 继承/泛化&#xff08;Inheritance/Generalization&#xff09; 3.2 聚合和组合 3.2.1 组合&#xff08;Composition&#xff09;3.2.2 聚…...

STM32F103C8T6信息

STM32F103C8T6 完整参数列表 一、核心参数 内核架构‌ ARM Cortex-M3 32位RISC处理器 最大主频&#xff1a;72 MHz&#xff08;基于APB总线时钟&#xff09; 运算性能&#xff1a;1.25 DMIPS/MHz&#xff08;Dhrystone 2.1基准&#xff09; 总线与存储‌ 总线宽度&#xff…...

unity 读取csv

1.读取代码 string filePath Application.streamingAssetsPath "\\data.csv"; public List<MovieData> movieData new List<MovieData>(); private void ReadCSV(string filePath) { List<List<string>> data new List<…...

那些年踩过的坑之Arrays.asList

一、前言 熟悉开发的兄弟都知道&#xff0c;在写新增和删除功能的时候&#xff0c;大多数时候会写成批量的&#xff0c;原因也很简单&#xff0c;批量既支持单个也支持多个对象的操作&#xff0c;事情也是发生在这个批量方法的调用上&#xff0c;下面我简单说一下这个事情。 二…...

ASP.NET Core 自动识别 appsettings.json的机制解析

ASP.NET Core 自动识别 appsettings.json 的机制解析 在 ASP.NET Core 中&#xff0c;IConfiguration 能自动识别 appsettings.json 并直接读取值的机制&#xff0c;是通过框架的 “约定优于配置” 设计和 依赖注入系统 共同实现的。以下是详细原理&#xff1a; 默认配置源的自…...

深入解析Mlivus Cloud核心架构:rootcoord组件的最佳实践与调优指南

作为大禹智库的向量数据库高级研究员,同时也是《向量数据库指南》的作者,我在过去30年的向量数据库和AI应用实战中见证了这项技术的演进与革新。今天,我将以专业视角为您深入剖析Mlivus Cloud的核心组件之一——rootcoord,这个组件在系统架构中扮演着至关重要的角色。如果您…...

ApplicationEventPublisher用法-笔记

1.ApplicationEventPublisher简介 org.springframework.context.ApplicationEventPublisher 是 Spring 框架中用于发布自定义事件的核心接口。它允许你在 Spring 应用上下文中触发事件&#xff0c;并由其他组件&#xff08;监听器&#xff09;进行响应。 ApplicationEventPub…...

数字孪生:从概念到实践,重构未来产业的“虚拟镜像”

一、开篇&#xff1a;为什么数字孪生是下一个技术风口&#xff1f; 现象级案例引入&#xff1a; “特斯拉用数字孪生技术将电池故障预测准确率提升40%&#xff1b;西门子通过虚拟工厂模型缩短30%产品研发周期&#xff1b;波音777X飞机设计全程零实物原型……” 数据支撑&#…...

Python笔记:VS2013编译Python-3.5.10

注&#xff1a;本文是编译老版本&#xff0c;有点麻烦&#xff0c;测试了编译新版&#xff0c;基本上是傻瓜是操作即可 1. python官网下载源码 https://www.python.org/ftp/python/3.5.10/Python-3.5.10.tgz 2. 编译前查看目录中相关文档 源码目录结构 看README文档 经过查…...

STM32八股【6】-----CortexM3的双堆栈(MSP、PSP)设计

STM32的线程模式&#xff08;Thread Mode&#xff09;和内核模式&#xff08;Handler Mode&#xff09;以及其对应的权级和堆栈指针 线程模式&#xff1a; 正常代码执行时的模式&#xff08;如 main 函数、FreeRTOS任务&#xff09; 可以是特权级&#xff08;使用MSP&#xff…...

MySQL触法器

1. 什么是触发器及其特点 MySQL数据库中触发器是一个特殊的存储过程&#xff0c;不同的是执行存储过程要使用 CALL 语句来调用&#xff0c;而触发器的执行不需要使用 CALL 语句来调用&#xff0c;也不需要手工启动&#xff0c;只要一个预定义的事件发生就会被 MySQL自动调用。…...

金仓数据库征文-政务领域国产化数据库更替:金仓 KingbaseES 应用实践

目录 一.金仓数据库介绍 二.政务领域数据库替换的时代需求​ 三.金仓数据库 KingbaseES 在政务领域的替换优势​ 1.强大的兼容性与迁移能力​ 2.高安全性与稳定性保障​ 3.良好的国产化适配性​ 四.金仓数据库 KingbaseES 在政务领域的典型应用实践​ 1.电子政务办公系…...

微服务架构在云原生后端的深度融合与实践路径

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:后端架构的演变,走向云原生与微服务融合 过去十余年,后端架构经历了从单体应用(Monolithic)、垂直切分(Modularization)、到微服务(Microservices)的演进,每一次变化都是为了解决…...