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

uniapp使用蓝牙,usb,局域网,打印机打印

使用流程(支持安卓和iOS)

引入SDK

引入原生插件包地址如下
https://github.com/oldfive20250214/UniPrinterDemo

连接设备

安卓支持经典蓝牙、ble蓝牙、usb、局域网(参考API)

iOS支持ble蓝牙、局域网(参考API)

拼接模版

声明对象

const printer = uni.requireNativePlugin(“Printer”)

tspl模版用例1(打印常用指令)

printer.addSize({"width":75,"height":135});
printer.addCls();
printer.addDirection({"n":0,"m":0});
printer.addGap({"m":2,"n":0});
printer.addText({"x":50,"y":50,"font":"TSS16.BF2","rotate":0,"xMultiple":1,"yMultiple":1,"alignment":0,"content":"16号字体"});
printer.addBox({"x":20,"y":20,"x_end":500,"y_end":800,"thickness":2,"radius":0});
printer.addText({"x":50,"y":100,"font":"TSS24.BF2","rotate":0,"xMultiple":1,"yMultiple":1,"alignment":0,"content":"24号字体"});
printer.addText({"x":250,"y":50,"font":"TSS16.BF2","rotate":0,"xMultiple":1,"yMultiple":1,"alignment":0,"content":"16号字体"});
printer.addReverse({"x":240,"y":40,"width":200,"height":40});
printer.addBar({"x":50,"y":200,"width":300,"height":3});
printer.addBarcode({"x":50,"y":210,"codeType":"128","height":100,"style":1,"rotation":0,"narrow":2,"wide":2,"alignment":0,"content":"test123456"});
printer.addQRCode({"x":50,"y":350,"eccLevel":"L","cellWidth":7,"mode":"M","rotate":0,"model":"M1","mask":"S3","content":"test123456"})
printer.addPrint({"m":1,"n":1});

tspl模版用例2(打印图片)

printer.addSize({"width":75,"height":135});
printer.addCls();
printer.addDirection({"n":0,"m":0});
printer.addGap({"m":2,"n":0});
printer.addBitmap({"x":0,"y":0,"mode":0,"base64":base64});
printer.addPrint({"m":1,"n":1});

cpcl模版用例1(打印常用指令)

printer.cpcl_addInit({"height":600,"copys":1});
printer.cpcl_addUnit("IN-DOTS");
printer.cpcl_addWidth(600);
printer.cpcl_setMag({"w":1,"h":1});
printer.cpcl_addText({"cmd":"T","font":"1","size":"0","x":50,"y":150,"data":"24*24字体"});
printer.cpcl_addText({"cmd":"T","font":"4","size":"0","x":50,"y":200,"data":"32*32字体"});
printer.cpcl_setMag({"w":2,"h":1});
printer.cpcl_addText({"cmd":"T","font":"4","size":"0","x":50,"y":250,"data":"48*24字体"});
printer.cpcl_setMag({"w":3,"h":3});
printer.cpcl_addText({"cmd":"T","font":"4","size":"0","x":50,"y":300,"data":"72*72字体"});
printer.cpcl_setMag({"w":1,"h":1});
printer.cpcl_addLine({"startx":50,"starty":380,"endx":250,"endy":380,"width":5});
printer.cpcl_addBarcode({"isvb":false,"codetype":"128","width":1,"radio":"1","height":50,"x":50,"y":390,"data":"test123456"});
printer.cpcl_addQrcode({"isVQ":false,"codetype":"QR","x":50,"y":450,"m":2,"n":6,"data1":"M","data2":"A","data3":"test123456"});
printer.cpcl_form();
printer.cpcl_print();

cpcl模版用例2(打印图片)

printer.cpcl_addInit({"height":600,"copys":1});
printer.cpcl_addUnit("IN-DOTS");
printer.cpcl_addWidth(600);
printer.cpcl_addBitmap({"x":0,"y":0,"mode":0,"base64":base64});
printer.cpcl_form();
printer.cpcl_print();

esc模版用例1(打印常用指令)

printer.esc_addInit();
printer.esc_addAlign(1);
printer.esc_setCharSize({"width":0,"height":0});
printer.esc_addText("打印机居中\r\n");
printer.esc_addAlign(0);
printer.esc_setCharSize({"width":1,"height":1});
printer.esc_addText("打印机放大1-1\r\n");
printer.esc_setCharSize({"width":2,"height":2});
printer.esc_addText("打印机放大2-2\r\n");
printer.esc_setCharSize({"width":0,"height":0});
printer.esc_addLocation(10);
printer.esc_addText("text1");
printer.esc_addLocation(257);
printer.esc_addText("text2\r\n\r\n");
printer.esc_addText("width2条码宽度36mm\r\n");
printer.esc_barCode({"width":2,"height":80,"font":1,"loc":2,"m":73,"data":"width2abcd"});
printer.esc_addText("\r\n");
printer.esc_addText("width3条码宽度54mm\r\n");
printer.esc_barCode({"width":3,"height":80,"font":1,"loc":2,"m":73,"data":"width3abcd"});
printer.esc_addText("\r\n");
printer.esc_print();
printer.esc_addText("SIZE-1二维码宽度3mm\r\n");
printer.esc_qrCode({"size":1,"data":"test123456"});
printer.esc_addText("\r\nSIZE-2-二维码宽度4mm\r\n");
printer.esc_qrCode({"size":2,"data":"test123456"});
printer.esc_addText("\r\nSIZE-3-二维码宽度7mm\r\n");
printer.esc_qrCode({"size":3,"data":"test123456"});
printer.esc_addText("\r\nSIZE-4-二维码宽度10mm\r\n");
printer.esc_qrCode({"size":4,"data":"test123456"});
printer.esc_addText("\r\nSIZE-5-二维码宽度13mm\r\n");
printer.esc_qrCode({"size":5,"data":"test123456"});
printer.esc_addText("\r\nSIZE-6-二维码宽度16mm\r\n");
printer.esc_qrCode({"size":6,"data":"test123456"});
printer.esc_addText("\r\nSIZE-7-二维码宽度18mm\r\n");
printer.esc_qrCode({"size":7,"data":"test123456"});
printer.esc_addText("\r\nSIZE-8-二维码宽度21mm\r\n");
printer.esc_qrCode({"size":8,"data":"test123456"});
printer.esc_print();
printer.esc_feed(5);

esc模版用例2(打印图片)

printer.esc_addInit();
printer.esc_addBitmap({"mode":0,"base64":base64});
printer.esc_feed(5);

开始打印

安卓支持经典蓝牙、ble蓝牙、usb、局域网(参考API)

iOS支持ble蓝牙、局域网(参考API)

安卓经典蓝牙API

打开蓝牙

printer.spp_openBluetoothAdapter(result => {console.log(result);});

扫描蓝牙

printer.spp_startBluetoothDevicesDiscovery(result => {console.log(result);});

连接蓝牙

printer.spp_getConnectDevice({"address":adress},result => {
console.log(result);
});

蓝牙写入

拿到数据后再写入拿到的数据

//获取sdk生成的模版数据
printer.get_printData({},result => {var obj = JSON.parse(result);console.log(obj.data);console.log(obj.data.base64);
});
//将写入模版数据的base64
printer.spp_writeData({"base64":base64},result => {console.log(result);
});

拼接好模版后直接写入

printer.spp_writeKmPrinterData(result => {console.log(result);});

停止蓝牙扫描

printer.spp_stopBluetoothDevicesDiscovery(result => {console.log(result);});

关闭蓝牙

printer.spp_closeBluetoothAdapter(result => {console.log(result);});

蓝牙连接状态

printer.spp_isConnectClassicBT({"address":address},result => {console.log(result);});

低功耗蓝牙API(支持安卓和iOS)

打开蓝牙


printer.ble_openBluetoothAdapter(result => {console.log(result);});

扫描蓝牙

printer.ble_startBluetoothDevicesDiscovery(result => {console.log(result);});

连接蓝牙


printer.ble_getConnectDevice({"address":address},result => {console.log(result);});

蓝牙写入数据

拿到数据后再写入拿到的数据

//获取sdk生成的模版数据
printer.get_printData({},result => {var obj = JSON.parse(result);console.log(obj.data);console.log(obj.data.base64);
});
//将写入模版数据的base64
printer.ble_writeData({"base64":base64},result => {console.log(result);
});

停止蓝牙扫描

printer.ble_stopBluetoothDevicesDiscovery(result => {console.log(result);});

关闭蓝牙

printer.ble_closeBluetoothAdapter(result => {console.log(result);});

蓝牙连接状态

/** 状态对应以下数字* int STATE_CONNECTED = 2;* int STATE_CONNECTING = 1;* int STATE_DISCONNECTED = 0;* int STATE_DISCONNECTING = 3;*/
printer.ble_connectState(result => {console.log(result);});

安卓usb打印API

打开usb

printer.usb_openUsb(result => {console.log(result);});

扫描usb


printer.usb_starUsbDevicesDiscovery(result => {console.log(result);});

连接usb


printer.usb_usbConnect({"pid":pid,"vid":vid},result => {console.log(result);});

usb写入数据

拿到数据后再写入拿到的数据

//获取sdk生成的模版数据
printer.get_printData({},result => {var obj = JSON.parse(result);console.log(obj.data);console.log(obj.data.base64);
});
//将写入模版数据的base64
printer.usb_writeData({"base64":base64},result => {console.log(result);
});

usb读取数据


printer.usb_read(result => {console.log(result);});

关闭usb连接

printer.usb_close(result => {console.log(result);});

局域网打印API(支持安卓和iOS)

连接打印机

局域网打印需要手机和打印机在同一个局域网内,手机去连接打印机的ip地址和端口

printer.net_connectScoket({"host":host,"port":port},result => {console.log(result);
});

发送数据

拿到数据后再写入拿到的数据

//获取sdk生成的模版数据
printer.get_printData({},result => {var obj = JSON.parse(result);console.log(obj.data);console.log(obj.data.base64);
});
//将写入模版数据的base64
printer.net_writeData({"base64":base64},result => {console.log(result);
});

断开连接

printer.net_closeScoket(result => {console.log(result);});

TSPL指令API(支持安卓和iOS)

指定画板版宽高

/*** 设置打印模版宽高* @param width 打印宽度单位 mm int* @param height 打印高度 mm int* @return*/
addSize({"width":width,"height":height})

清空打印机画板缓存

/*** 清空打印机画板缓存* @return*/
addCls()

指定打印浓度

/*** 指定打印浓度* @param n  范围1-15 String* @return*/
addDensity(n)

指定打印速度

/*** 指定打印速度* @param n  范围1-8 String* @return*/
addSpeed(n)

生成文本指令

/*** 生成TEXT指令* @param x 起始x坐标 int* @param y 起始y坐标 int* @param font 字体名称 String* @param rotate 旋转角度 int* @param xMultiple x倍数 int* @param yMultiple y倍数 int* @param alignment 对齐方式 默认0 int* @param content 打印内容 String* @return*/addText({"x":x,"y":y,"font":font,"rotate":rotate,"xMultiple": xMultiple,"yMultiple":yMultiple,"alignment":alignment,"content":content})

生成文本块

/*** TEXT模块 支持换行* @param x 起始x坐标 int* @param y 起始y坐标 int* @param width  宽度,单位是点 int* @param height 高度,单位是点 int* @param font 字体名称 int* @param rotate 旋转角度 int* @param xMultiple x倍数 int* @param yMultiple y倍数 int* @param lineSpace 行间距 int* @param alignment 对齐 int* @param content 内容 String* @return*/
public KmPrinter crtiBlock({"x":x,"y":y,"width":width,"height":height,"font":font,"rotate":rotate,"xMultiple":xMultiple,"yMultiple":yMultiple,"lineSpace":lineSpace,"alignment":alignment,"content":content})

设置黑反打印区域

/*** 设置黑反打印区域* @param x 起点x* @param y 地点y* @param width 宽* @param height 高* @return*/
addReverse({int x, int y, int width, int height}) 

生成边框指令

/*** 生成边框指令* @param x x坐标起点* @param y y坐标起点* @param x_end x坐标结束点* @param y_end y坐标结束点* @param thickness 线条厚度* @param radius 边框弧度* @return*/
addBox({int x, int y, int x_end, int y_end, int thickness, int radius}) 

生成线条指令

/*** 生成线条指令* @param x 起始x坐标* @param y 起始y坐标* @param width 宽度* @param height 高度* @return*/
addBar({int x, int y, int width, int height})

生成条码指令

/*** 生成条码指令* @param x x坐标* @param y y坐标* @param codeType 条码类型* @param height 条码高度* @param style 文字样式*                  0:不可见*                  1:可见居左*                  2:可见居中*                  3:可见居右* @param rotation 旋转角度* @param narrow 窄条宽度* @param wide 宽条长度* @param alignment 对齐方式* @param content 条码内容* @return*/
addBarcode({int x, int y, String codeType, int height, int style, int rotation, int narrow, int wide, int alignment, String content})

生成二维码指令

/*** 生成二维码指令* @param x 起始x坐标* @param y 起始y坐标* @param eccLevel  纠错等级 {7,15,25,30}* @param cellWidth 码元宽度[1-10]* @param mode  A:自动 M:手动* @param rotate 旋转角度* @param model  条码版本* M1:(默认),原始版本* M2:增强版* @param mask 掩膜版的种类,控制二维码的样式 S[0-8] 默认为S7* @param content 二维码内容* @return*/
addQRCode({int x, int y, String eccLevel, int cellWidth, String mode, int rotate, String model, String mask, String content})

生成图片指令

/*** 生成图片指令* @param x 图片x坐标* @param y 图片y坐标* @param mode 图片打印类型 0默认,正常打印  3,zlib压缩  4,zlib反白压缩* @param base64 图片的base64* @return*/
addBitmap({int x, int y, int mode, String base64})

打印模版指令

/*** 打印模版* @param m 指定要打印多少套标签。* @param n 指定每个特定标签集应该打印多少份副本* @return*/
addPrint({int m, int n})

CPCL指令API(支持安卓和iOS)

新建打印模版

/*** 新建打印模版* @param height 打印模版高度* @param copys  打印份数* @return*/
cpcl_addInit({int height, int copys})

设置单位

/*** 设置单位* @param unit IN-INCHES 度量单位英寸*  IN-CENTIMETERS 度量单位厘米*  IN-MILLIMETERS 度量单位毫米*  IN-DOTS 度量单位为点* @return*/
cpcl_addUnit(String unit)

设置模版宽度

/*** 设置打印模版宽度* @param width* @return*/
cpcl_addWidth(int width)

设置字体宽高倍数

/*** 设置字体宽高倍数* @param w 宽度 1-3 1到3倍* @param h 高度 1-3 1到3倍* @return*/
cpcl_setMag({int w, int h})

文本指令

/*** 文本指令* @param cmd 指令类型 (逆时针旋转角度) 默认不旋转* TEXT(或T)* TEXT90(或 T90)* TEXT180(或 T180)* TEXT270(或 T270)* @param font 0-6(根据打印机文档设置)* @param size 0-6(根据打印机文档设置)* @param x x坐标* @param y y坐标* @param data 打印数据* @return*/
cpcl_addText({String cmd, String font, String size, int x, int y, String data})

线条指令

/*** 线条指令* @param startx 起点x坐标* @param starty 起点y坐标* @param endx  终点x坐标* @param endy 终点y坐标* @param width 线条宽度* @return*/
cpcl_addLine({int startx, int starty, int endx, int endy, int width})

黑反打印区域

/*** 黑反打印区域* @param startx 起点x坐标* @param starty 起点y坐标* @param endx 终点x坐标* @param endy 终点y坐标* @param width 黑反区域宽度* @return*/
cpcl_addReverse({int startx, int starty, int endx, int endy, int width})

条码指令

/*** 条码指令* @param isvb 0,1 默认0* BARCODE(B):横向打印条形码。* VBARCODE(VB) :纵向打印条形码* @param codetype 条码类型 默认 128* UPC-A: UPCA、UPCA2、UPCA5* UPC-E: UPCE、UPCE2、UPCE5* EAN/JAN-13: EAN13、EAN132、EAN135* EAN/JAN-8: EAN8、EAN82、EAN 85* Code 39: 39、39C、F39、F39C* Code 93/Ext.93: 93* Interleaved 2 of 5: I2OF5* Interleaved 2 of 5(带checksum):I2OF5C* German Post Code: I2OF5G* Code 128(自动): 128* UCC EAN 128: UCCEAN128* Codabar: CODABAR、CODABAR16* MSI/Plessy: MSI、MSI10、MSI1010、MSI1110* Postnet: POSTNET* FIM: FIM* @param width 窄条单位宽度 默认1* @param radio 宽条与窄条单位比例 默认1* @param height 条码单位高度* @param x x坐标* @param y y坐标* @param data 条码数据* @return*/
cpcl_addBarcode({boolean isvb, String codetype, int width, String radio, int height, int x, int y, String data})

二维码指令

/***  二维码指令* @param isVQ isVQ 是否纵向* @param codetype 默认QR* @param x x坐标* @param y y坐标* @param m  选项是 1 或 2。QR Code Model 1 是原始ྟ规范,2增强版 默认1* @param n 模块单位宽度 1-32 默认6* @param data1 纠错等级 H/极高可高级别 Q/高可靠级别 M/标准级别 L/高密度级别 默认M* @param data2 字符模式 N数字 A字母数字 默认 A* @param data3 二维码内容 二维码内容* @return*/
cpcl_addQrcode({boolean isVQ, String codetype, int x, int y, int m, int n, String data1, String data2, String data3})

图片指令

/*** 图片指令* @param x* @param y* @param mode 0:CG指令模式 1:EG指令模式 3:CG指令压缩模式* @param base64 图片的base64 * @return*/
cpcl_addBitmap({int x, int y,int mode, String base64})

打印机在一页打印结束后切换至下一页顶部

/*** 打印机在一页打印结束后切换至下一页顶部* @return*/
cpcl_form()

打印模版

/*** 打印模版* @return*/
cpcl_print()

反向出纸打印模版

/*** 反向出纸打印模版* @return*/
cpcl_poprint()

ESC指令API(支持安卓和iOS)

打印机初始化

/*** 打印机初始化* @return*/
esc_addInit()

设置绝对位置

/*** 设置绝对位置* @param n 单位dot* @return*/
esc_addLocation(int n)

文本指令

/*** 文本指令* @param text* @return*/
esc_addText(String text)

对齐方式

/*** 对齐方式* @param align 0左对齐 1居中 2右对齐* @return*/
esc_addAlign(int align)

设置字符倍宽倍高

/*** 设置字符倍宽倍高* @param width 0-7 分别是1-8倍 默认0正常* @param height 0-7 分别是1-8倍 默认0正常* @return*/
esc_setCharSize({int width, int height})

打印条码

/*** 打印条码* @param width 条码宽度 2 ≤ n ≤ 6* @param height 条码高度 1 ≤ height ≤ 255* @param font 条码字体 0,48:标准 ASCII 码字符 (12 × 24) 1,49:压缩 ASCII 码字符 (9 × 17)* @param loc 条码位置显示0, 48:不打印 1, 49:条码上方 2, 50:条码下方 3, 51:条码上、下方都打印* @param m 条码类型 0 ≤ m ≤ 6 65 ≤ m ≤ 73 具体用法参考文档* @param data 条码数据* @return*/
esc_barCode({int width, int height, int font, int loc, int m, String data})

打印二维码

/*** 打印二维码* @param size 二维码大小 1-15* @param data 二维码数据* @return*/
esc_qrCode({int size, String data})

打印图片

/*** 打印图片* @param mode 默认0* @param base64 图片的base64* @return*/
esc_addBitmap({int mode, String base64})

打印并走纸多行

/*** 打印并走纸多行* @param lines 1-255 走纸的行数* @return*/
esc_feed(int lines)

打印并走纸一行

/*** 打印并走纸一行* @return*/
esc_print()

相关文章:

uniapp使用蓝牙,usb,局域网,打印机打印

使用流程(支持安卓和iOS) 引入SDK 引入原生插件包地址如下 https://github.com/oldfive20250214/UniPrinterDemo 连接设备 安卓支持经典蓝牙、ble蓝牙、usb、局域网(参考API) iOS支持ble蓝牙、局域网(参考API&…...

MyBatis 与 JDBC 的关系?

MyBatis 与 JDBC 存在密切的关系,可以理解为:MyBatis 是对 JDBC 的封装和增强,但并没有完全取代 JDBC。 1. JDBC (Java Database Connectivity): 底层 API: JDBC 是 Java 访问数据库的底层 API,它提供了一套标准的接口和类&…...

QILSTE灯珠:尺寸光电全解析

QILSTE灯珠:尺寸光电全解析 🌟 型号H4-115BGRYA/5M,由QILSTE(HongKong)Technology Co., Ltd精心打造,以其1.6x1.5x0.4mm的紧凑外观尺寸,展现高亮红光、翠绿、蓝的缤纷色彩。 📏 尺寸…...

golang从入门到做牛马:第一篇-我与golang的缘分,go语言简介

还记得2018年的夏天,刚毕业的我不知道该做些什么,于是自学了一周的go语言,想要找一份go语言工作的代码,当时的go还没有go mod来管理依赖包,在北京找了一个月的工作,找到了一个小公司做了后端开发,当然使用go语言开发,带着兴奋劲,年轻身体也好,边努力学习,边工作。 时…...

用IdleHandler来性能优化及原理源码分析

背景: 经常在做一些app冷启动速度优化等性能优化工作时候,经常可能会发现有时候需要引入一些第三方sdk,或者库,这些库一般会要求我们在onCreate中进行初始化等,但是onCreate属于生命周期的回调方法,如果on…...

如何在WPS中接入DeepSeek并使用OfficeAI助手(超细!成功版本)

目录 第一步:下载并安装OfficeAI助手 第二步:申请API Key 第三步:两种方式导入WPS 第一种:本地大模型Ollama 第二种APIKey接入 第四步:探索OfficeAI的创作功能 工作进展汇报 PPT大纲设计 第五步:我的使用体验(体验建议) …...

长短期记忆网络(LSTM)学习指南

长短期记忆网络(LSTM)学习指南 1. 定义和背景 长短期记忆网络(Long Short-Term Memory, LSTM)是一种递归神经网络(RNN)的变体,旨在解决传统RNN在处理长期依赖关系时遇到的梯度消失或爆炸问题。…...

Swagger-01.介绍和使用方式

一.Swagger介绍 有了接口文档,我们就可以根据接口文档来开发后端的代码了。如果我们开发完了某个功能,后端如何验证我们开发的是否正确呢?我们就需要测试,使用Swagger就可以帮助后端生成接口文档,并且可以进行后端的接…...

Unity 使用NGUI制作无限滑动列表

原理: 复用几个子物体,通过子物体的循环移动实现,如下图 在第一个子物体滑动到超出一定数值时,使其放到最下方 --------------------------------------------------------------》 然后不停的循环往复,向下滑动也是这…...

【并发编程】聊聊定时任务ScheduledThreadPool的实现原理和源码解析

ScheduledThreadPoolExecutor 是在线程池的基础上 拓展的定时功能的线程池,主要有四种方式,具体可以看代码, 这里主要描述下 scheduleAtFixedRate : 除了第一次执行的时间,后面任务执行的时间 为 time MAX(任务执行时…...

HarmonyOS Next元服务网络请求封装实践

【HarmonyOS Next实战】元服务网络通信涅槃:深度封装如何实现80%性能跃升与零异常突破 ————从架构设计到工程落地的全链路优化指南 一、架构设计全景 1.1 分层架构模型 #mermaid-svg-VOia4RMx7iqmLnu7 {font-family:"trebuchet ms",verdana,arial,…...

如何在语言模型的参数中封装知识?——以T5模型为例

【摘要】 这篇论文探讨了大型语言模型在无需外部知识的情况下,能否通过预训练来存储和检索知识以回答开放领域的问题。作者通过微调预训练模型来回答问题,而这些模型在训练时并未提供任何额外的知识或上下文。这种方法随着模型规模的增加而表现出良好的…...

微服务的认识与拆分

微服务架构通过将应用分解为一组小的、独立的服务来实现,每个服务围绕特定业务功能构建,并能独立部署与扩展。这种架构增强了开发灵活性、提高了系统的可维护性和扩展性,使得团队可以更快地响应变化和市场需求。 目录 认识微服务 单体架构 …...

Java-servlet(三)Java-servlet-Web环境搭建(下)详细讲解利用maven和tomcat搭建Java-servlet环境

Java-servlet(三)Java-servlet-Web环境搭建(下)利用maven和tomcat搭建Java-servlet环境 前言一、配置maven阿里镜像二、利用IDEA创建maven文件创建maven文件删除src文件创建新的src模版删除example以及org文件 三、在第二个xml文件…...

Spring 构造器注入和setter注入的比较

一、比较说明 在 Spring 框架中,构造器注入(Constructor Injection)和 Setter 注入(Setter Injection)是实现依赖注入(DI)的两种主要方式。它们的核心区别在于依赖注入的时机、代码设计理念以及…...

如何选择DevOps平台?GitHub、GitLab、BitBucket、Jenkins对比与常见问题解答

本文内容来源github.com,由GitHub中国授权合作伙伴-创实信息进行翻译整理。 欢迎通过021-61210910、customershcsinfo.com联系我们,免费试用GitHub企业版。 软件是当今领先企业的核心,而开发者则是软件的核心。GitHub作为一个完整的开发者平台…...

react中的fiber和初次渲染

源码中定义了不同类型节点的枚举值 组件类型 文本节点HTML标签节点函数组件类组件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…...

闭包+求解候选码+最小函数依赖集

一、闭包 直接上例题 简单明了 A的闭包ABC ABC的闭包ABCD ABCD的闭包ABCDE ABCDE的闭包ABCDEG 等于集合R的全集 所以A的闭包为ABCDEG AB的闭包为ABC 二、候选码 答案: 三、最小函数依赖集 求F的最小函数依赖集 去掉多余的 然后! 化为最简...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之功能优化,添加表格空状态提示,带插图的空状态,Table7空状态2

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

Unity Shader 学习15:可交互式雪地流程

本质是 利用顶点变换实现的: 通过一个俯视整个场地的正交摄像机,根据绑定在移动物体身上的粒子系统,来获取物体移动过的位置,记录到一张RenderTexture上作为轨迹图,再通过这张图来对雪地做顶点变换。 1. 由于顶点变换需…...

工具介绍《netcat》

nc(netcat)是一款功能强大的网络工具,被称为“网络瑞士军刀”,支持TCP/UDP协议,广泛用于调试、数据传输、端口扫描、网络连接测试等场景。以下是其详细介绍: 一、核心功能 端口扫描 检测目标主机的端口开放…...

嵌入式开发之串行数据处理

前题 前面几篇文章写了关于嵌入式软件开发时,关于串行数据处理的一些相关内容,有兴趣的可以看看《嵌入式开发:软件架构、驱动开发与串行数据处理》、《嵌入式软件开发之生产关系模型》和《嵌入式开发之Modbus-RTU协议解析》相关的内容。从业十…...

Centos的ElasticSearch安装教程

由于我们是用于校园学习,所以最好是关闭防火墙 systemctl stop firewalld systemctl disable firewalld 个人喜欢安装在opt临时目录,大家可以随意 在opt目录下创建一个es-standonely-docker目录 mkdir es-standonely-docker 进入目录编辑yml文件 se…...

SyntaxError: Unexpected token ‘xxx‘

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...

Unity自定义区域UI滑动事件

自定义区域UI滑动事件 介绍制作1.创建一个Image2.创建脚本 总结 介绍 一提到滑动事件联想到有太多的插件了比如EastTouchBundle,今天想单纯通过UI去做一个滑动事件而不是基于Box2d或者Box去做滑动事件。 制作 1.创建一个Image 2.创建脚本 using UnityEngine; us…...

单链表封装 - 使用JavaScript封装

痛苦就是在蜕变吗 目录 链表:链表的特点:单链表:单链表的封装- JS封装: 单链表的应用:解决回文:解决击鼓传花:十进制进制转换其他进制: 链表: 链表就是一种物理存储单元…...

GET3D:从图像中学习的高质量3D纹理形状的生成模型

【摘要】 本文提出了GET3D,这是一种新的生成模型,能够生成具有任意拓扑结构的高质量3D纹理网格,可以直接被3D渲染引擎使用并在下游应用中立即使用。现有的3D生成模型要么缺乏几何细节,要么生成的网格拓扑受限,通常不支持纹理,或者在生成过程中使用神经渲染器,使得它们在…...

TypeError: Cannot convert object to primitive value

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...

【uniapp】图片添加canvas水印

目录 需求&背景实现地理位置添加水印 ios补充 需求&背景 需求:拍照后给图片添加水印, 水印包含经纬度、用户信息、公司logo等信息。 效果图: 方案:使用canvas添加水印。 具体实现:上传图片组件是项目里现有的&#xff…...

Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程

MethodChannel(方法通道) 用途:实现 双向通信,用于调用原生平台提供的 API 并获取返回结果。 场景:适合一次性操作,如调用相机、获取设备信息等。 使用步骤: Flutter 端:通过 Meth…...