更新记录
1.0.1(2026-08-25)
初版
平台兼容性
uni-app(4.73)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | - | - | - | - | - | - | - | - | - | - | - |
jiakp-bleprint 组件使用说明 & 标签样式修改指南
适用范围:HM-A300 蓝牙标签打印(uni-app / Vue3 项目) 核心文件:
components/jiakp-bleprint/jiakp-bleprint.vue—— 打印功能组件(搜索/列表/连接/打印)pages/index/index.vue—— 页面壳,仅负责标签生成(buildLabel)utils/cpcl.js—— CPCL 指令生成器(text/qrcode/line/box 等)utils/ble.js/utils/printer.js—— 蓝牙封装与打印写入通道
一、组件设计说明
功能已被拆分为「打印功能组件 + 页面标签生成」两层,解耦后便于复用:
pages/index/index.vue components/jiakp-bleprint/jiakp-bleprint.vue
┌────────────────────────────┐ ┌──────────────────────────────────────┐
│ buildLabel() 标签生成 │ ────▶ │ props.buildLabel(打印时调用) │
│ LABEL_WIDTH/HEIGHT 尺寸 │ prop │ startScan / onPrint / 设备列表等 │
│ onShow 通过 ref 刷新 │ │ mounted / beforeUnmount 生命周期 │
└────────────────────────────┘ └──────────────────────────────────────┘
- 组件负责:蓝牙搜索、设备过滤、倒计时、自动/手动打印、上次使用记忆、连接流程、状态展示。这些与"标签长什么样"无关,任何页面都能直接复用。
- 页面负责:标签内容与样式(
buildLabel方法 + 标签纸尺寸常量)。每个页面可以用不同标签,互不影响。
二、组件使用方法
1. 引入组件
组件路径 components/jiakp-bleprint/jiakp-bleprint.vue 符合 uni-app easycom 约定,理论上可直接使用;为稳妥起见页面手动注册(如下)。
2. 在页面中使用(以 index.vue 为例)
<template>
<jiakp-bleprint ref="bleprint" :build-label="buildLabel"></jiakp-bleprint>
</template>
<script>
import Cpcl from '../../utils/cpcl.js'
import JiakpBleprint from '../../components/jiakp-bleprint/jiakp-bleprint.vue'
// ===== 标签尺寸配置(单位:点,200dpi 下 1mm ≈ 8 点)=====
const LABEL_WIDTH = 630 // 标签纸宽度(点),80mm ≈ 630 点
const LABEL_HEIGHT = 460 // 标签纸高度(点),必须接近实际标签,否则跳纸/底边打不出
export default {
components: { JiakpBleprint },
// 页面每次显示时刷新"上次使用"设备(组件 mounted 时已加载并触发首次搜索)
onShow() {
if (this.$refs.bleprint) {
this.$refs.bleprint.loadLastPrinter()
}
},
methods: {
buildLabel() {
// ...返回 CPCL 字节数组(见下文"标签样式修改")
return new Cpcl.Cpcl().start(LABEL_HEIGHT) /* ... */ .build()
}
}
}
</script>
3. Props
| Prop | 类型 | 必填 | 说明 |
|---|---|---|---|
buildLabel |
Function | 是 | 标签生成函数,组件 onPrint 连接成功后会调用它,必须返回 CPCL 字节数组(new Cpcl.Cpcl()...build() 的返回值) |
⚠️ 必传:组件在搜索到恰好 1 台设备时会自动触发
onPrint,此时会调用buildLabel;不传会报错。
4. 组件对外方法(页面可通过 ref 调用)
| 方法 | 说明 |
|---|---|
loadLastPrinter() |
从本地存储重新加载"上次使用"的打印机(页面 onShow 时调用,用于返回页面后刷新排序/角标) |
startScan() |
手动触发一次搜索(顶栏"重新搜索"按钮内部已调用,一般无需外部调用) |
5. 组件内部配置常量(改机型/搜索参数时用)
位于 jiakp-bleprint.vue 的 <script> 顶部:
| 常量 | 当前值 | 说明 |
|---|---|---|
DEVICE_PREFIX |
'HM-A300' |
蓝牙设备名称前缀过滤,换机型时改 |
SCAN_TIMEOUT |
3000 |
搜索时长(毫秒),超时后停止搜索;若仅发现 1 台设备会自动打印 |
三、生命周期说明(重要)
普通组件中 uni-app 的页面生命周期 onLoad/onShow/onUnload 不生效(官方文档明确),组件已做等价替换:
| 原页面生命周期 | 组件中实现 |
|---|---|
onLoad(加载上次设备 + 首次搜索) |
mounted |
onShow(刷新上次使用设备) |
由页面 onShow 通过 this.$refs.bleprint.loadLastPrinter() 调用 |
onUnload(停止搜索 + 清理定时器) |
beforeUnmount |
在页面中新增
<jiakp-bleprint>后,首次进入:页面 onLoad → 组件 mounted(开始搜索)→ 页面 onShow(刷新上次设备),与原页面行为一致。
四、标签样式修改指南(改的是页面里的 buildLabel)
1. 核心结论
- 标签上所有文字、位置、字号、表格线、二维码都在
pages/index/index.vue的buildLabel()方法里,用链式Cpcl指令拼装。 - 标签纸尺寸由页面顶部的
LABEL_WIDTH/LABEL_HEIGHT常量控制。 - 改样式基本不动组件,只改
buildLabel()里的参数 + 必要时调尺寸常量;utils/cpcl.js是底层指令封装,一般也不要动。
2. buildLabel() 指令块解析
| 指令 | 作用 | 修改样式时要改的参数 |
|---|---|---|
.start(LABEL_HEIGHT) |
标签头:声明标签高度 | 高度(一般直接用 LABEL_HEIGHT) |
.box(5, 5, LABEL_WIDTH-5, LABEL_HEIGHT-5, 2) |
最外框矩形 | 外框坐标、线宽 2 |
.align('center') .text('测试标签', 0, 20, { bold: true }) |
顶部标题(font 4 大字 + 加粗 + 居中) | 标题文字、y 坐标 20、bold、字号 |
.align('left') |
切回左对齐(重要,否则后面 x 失效) | — |
.line(5, 76, LABEL_WIDTH-5, 76, 1) |
标题下方横线 | 横线 y 坐标 76、线宽 1 |
.line(V, 76, V, LABEL_HEIGHT-5, 1) |
贯穿竖线(x=315,所有行对齐) | 竖线 x 坐标(局部常量 V=315) |
.text('字段名:值', x, y, { font: 3 }) × N |
各数据行文本 | 字段内容、x/y、font 字号 |
.line(5, 132, LABEL_WIDTH-5, 132, 1) 等 |
数据行间分隔横线 | 横线 y 坐标、线宽 |
.qrcode('https://github.com', 330, 190, { size: 9, errorCorrection: 3 }) |
右侧二维码 | 二维码内容、x/y、size 模块大小、errorCorrection 纠错 |
.form() .print() .build() |
结束页 + 打印 + 产出字节 | 一般不动 |
3. 坐标系与属性速查
- 坐标系:单位是点,原点在左上角,x 向右、y 向下;当前为 200dpi,1mm ≈ 8 点。
V = 315(buildLabel 内局部常量):贯穿竖线 x 坐标,右侧内容(第二字段 / 二维码)都相对它定位(V + 15),改竖线位置要同步改所有V + 15引用。- 行高规律:当前每行约 48 点(如第一行 84→132、第二行 132→180…),文字 y ≈ 行顶 + 14 垂直居中;增删行时同步调整各
.line()分隔线和各.text()的 y。 text()属性:font(CPCL 字号,数字越小越小,正文用 3、标题默认 4)、bold、underline、x/y。qrcode()属性:size(模块大小,当前 9,范围约 4~10)、errorCorrection(纠错 1~4,4 最高,当前 3)。line()/box()属性:起止坐标 + 线宽(最后一个数字)。
4. 常见修改场景速查
| 想改什么 | 改哪里 | 例子 |
|---|---|---|
| 换不同尺寸标签纸 | 页面顶部 LABEL_WIDTH / LABEL_HEIGHT |
60×40mm → 宽 480、高 320 |
| 改顶部标题文字 | buildLabel() 里 .text('测试标签', ...) |
改为"宇通客车" |
| 标题变大/变粗/变细 | 同上,调 font / bold |
{ font: 5, bold: true } |
| 改某行字段内容 | 对应那行 .text('字段名:值', ...) |
"设备名称:ZK6120" → "ZK6121" |
| 增删一行字段 | 复制/删除一个 .text(...) + 对应 .line(...),并重排后续 y |
末尾加"责任人:张三" |
| 调整行内字号 | 该行 .text(..., { font: 3 }) |
改 2 更小、4 更大 |
| 调整表格线位置/粗细 | 对应 .line(x1,y1,x2,y2,线宽) |
线宽 1 → 2 |
| 移动竖线位置 | V = 315 及所有 V + 15 引用 |
改 V = 300 |
| 改二维码内容 | .qrcode('https://github.com', ...) 的数据 |
改为资产查询链接 |
| 改二维码大小/纠错 | .qrcode(..., { size: 9, errorCorrection: 3 }) |
size: 8、errorCorrection: 4 |
| 二维码挪位置 | .qrcode(..., 330, 190, ...) 的 x/y |
左移到竖线附近 |
| 标题改对齐方式 | .align('center') 改 'left'/'right'(用完切回 'left') |
— |
5. 修改注意事项
- 改完先小批量打样:坐标、字号改动后务必先用一张标签纸试打,重点看文字是否裁切/错位、底边是否完整。
LABEL_HEIGHT别乱改:不匹配会跳纸、漏打底边,是最常见的坑。- 保持
.align()对称:用了CENTER/RIGHT后必须切回LEFT,否则后续文本 x 坐标失效。 - 中文依赖 GBK 编码(
utils/cpcl.js):仅在 App-Android 真机 100% 准确,H5/小程序会回退 UTF-8 可能乱码——验证请在真机 App 上进行。 - 坐标是写死的:改一处通常要连带重排后续行,建议按"行高=48、文字 y=行顶+14"的规律统一推算。
- 组件与页面分工别混淆:搜索/打印参数(
DEVICE_PREFIX、SCAN_TIMEOUT)在组件里;标签内容/尺寸(LABEL_WIDTH/HEIGHT、buildLabel)在页面里。
五、文件结构参考
hmprint/
├─ components/jiakp-bleprint/jiakp-bleprint.vue ← 打印功能组件(本说明对象)
├─ pages/index/index.vue ← 页面壳 + buildLabel 标签生成
├─ utils/cpcl.js ← CPCL 指令生成器
├─ utils/ble.js ← 蓝牙封装
├─ utils/printer.js ← 打印写入通道(ble 模式)
├─ pages.json ← 页面注册与导航栏标题
└─ App.vue / main.js / manifest.json / uni.scss

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 0
赞赏 0
下载 12535909
赞赏 1947
赞赏
京公网安备:11010802035340号