更新记录

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.vuebuildLabel() 方法里,用链式 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 坐标 20bold、字号
.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 向下;当前为 200dpi1mm ≈ 8 点
  • V = 315(buildLabel 内局部常量):贯穿竖线 x 坐标,右侧内容(第二字段 / 二维码)都相对它定位(V + 15),改竖线位置要同步改所有 V + 15 引用。
  • 行高规律:当前每行约 48 点(如第一行 84→132、第二行 132→180…),文字 y ≈ 行顶 + 14 垂直居中;增删行时同步调整各 .line() 分隔线和各 .text() 的 y。
  • text() 属性font(CPCL 字号,数字越小越小,正文用 3、标题默认 4)、boldunderlinex/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,线宽) 线宽 12
移动竖线位置 V = 315 及所有 V + 15 引用 V = 300
改二维码内容 .qrcode('https://github.com', ...) 的数据 改为资产查询链接
改二维码大小/纠错 .qrcode(..., { size: 9, errorCorrection: 3 }) size: 8errorCorrection: 4
二维码挪位置 .qrcode(..., 330, 190, ...) 的 x/y 左移到竖线附近
标题改对齐方式 .align('center')'left'/'right'(用完切回 'left'

5. 修改注意事项

  1. 改完先小批量打样:坐标、字号改动后务必先用一张标签纸试打,重点看文字是否裁切/错位、底边是否完整。
  2. LABEL_HEIGHT 别乱改:不匹配会跳纸、漏打底边,是最常见的坑。
  3. 保持 .align() 对称:用了 CENTER/RIGHT 后必须切回 LEFT,否则后续文本 x 坐标失效。
  4. 中文依赖 GBK 编码utils/cpcl.js):仅在 App-Android 真机 100% 准确,H5/小程序会回退 UTF-8 可能乱码——验证请在真机 App 上进行
  5. 坐标是写死的:改一处通常要连带重排后续行,建议按"行高=48、文字 y=行顶+14"的规律统一推算。
  6. 组件与页面分工别混淆:搜索/打印参数(DEVICE_PREFIXSCAN_TIMEOUT)在组件里;标签内容/尺寸(LABEL_WIDTH/HEIGHTbuildLabel)在页面里。

五、文件结构参考

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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>", "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>", "<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"/>", "<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\"/>", "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>"

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。