Files
ZhHealth/uni_modules/Sansnn-uQRCode/readme.md

211 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# uQRCode
uQRCode 生成方式简单可扩展性高如有复杂需求可通过自定义组件或修改源码完成需求。已测试H5、微信小程序、iPhoneXsMax真机、华为P20Pro真机。
支持自定义二维码渲染规则,可通过 `getModules` 方法得到矩阵信息后自行实现canvas或view+css渲染二维码如随机颜色、圆点、方块、块与块之间的间距等。
### 二维码
**什么是QR码**
QR码属于矩阵式二维码中的一个种类由DENSO(日本电装)公司开发由JIS和ISO将其标准化。
**QR码的特点**
一是高速读取(QR就是取自“Quick Response”的首字母),通过摄像头从拍摄到解码到显示内容也就三秒左右,对摄像的角度也没有什么要求;
二是高容量、高密度理论上内容经过压缩处理后可以存7089个数字4296个字母和数字混合字符2953个8位字节数据1817个汉字
三是支持纠错处理按照QR码的标准文档说明QR码的纠错分为4个级别分别是
- level L : 最大 7% 的错误能够被纠正;
- level M : 最大 15% 的错误能够被纠正;
- level Q : 最大 25% 的错误能够被纠正;
- level H : 最大 30% 的错误能够被纠正;
四是结构化,看似无规则的图形,其实对区域有严格的定义。
更多二维码介绍及原理:[https://blog.csdn.net/jason_ldh/article/details/11801355](https://blog.csdn.net/jason_ldh/article/details/11801355)
### 简单使用
`template` 中创建 `<uqrcode/>`,并指定生成内容 `text`
```html
<uqrcode ref="uQRCode" text="uQRCode 3.0" />
```
### 属性说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|id |String |- |随机生成 |否 |组件标识/canvasId |
|mode |String |canvas/view |canvas |否 |生成模式 |
|text |String |- |- |是 |二维码内容 |
|size |Number |- |256 |否 |二维码大小单位px |
|margin |Number |- |0 |否 |填充边距单位px |
|backgroundColor |String |- |#FFFFFF |否 |背景色 |
|foregroundColor |String |- |#000000 |否 |前景色 |
|errorCorrectLevel|String/Number|L/M/Q/H/1/0/3/2 |H |否 |纠错等级L/M/Q/H分别对应1/0/3/2 |
|typeNumber |Number |- |-1 |否 |版本 |
|fileType |String |png/jpg |png |否 |导出的文件类型 |
### 方法说明
|方法名|说明|
|---|:---|
|[toTempFilePath](#totempfilepathobject)|导出临时文件路径|
|[save](#saveobject)|保存二维码|
### toTempFilePath(OBJECT)
导出临时文件路径
**OBJECT参数说明**
|参数 |类型 |必填 |默认值 |说明 |
|--- |--- |--- |--- |:--- |
|success |Function |否 |- |方法调用成功的回调函数 |
|fail |Function |否 |- |方法调用失败的回调函数 |
|complete |Function |否 |- |方法调用结束的回调函数(调用成功、失败都会执行) |
#### 示例
```html
<template>
<view>
<uqrcode ref="uQRCode" text="uQRCode 3.0" />
<button @click="toTempFilePath">导出临时文件路径</button>
</view>
</template>
```
```javascript
export default {
methods: {
toTempFilePath() {
this.$refs.uQRCode.toTempFilePath({
success: res => {
console.log(res)
}
})
}
}
}
```
### save(OBJECT)
保存二维码
**OBJECT参数说明**
|参数 |类型 |必填 |默认值 |说明 |
|--- |--- |--- |--- |:--- |
|success |Function |否 |- |方法调用成功的回调函数 |
|fail |Function |否 |- |方法调用失败的回调函数 |
|complete |Function |否 |- |方法调用结束的回调函数(调用成功、失败都会执行) |
#### 示例
```html
<template>
<view>
<uqrcode ref="uQRCode" text="uQRCode 3.0" />
<button @click="save">保存二维码</button>
</view>
</template>
```
```javascript
export default {
methods: {
save() {
this.$refs.uQRCode.save({
success: res => {
console.log(res)
}
})
}
}
}
```
### 高级使用
`template` 中创建 `<canvas/>` 并设置 `id`,画布宽高
```html
<canvas id="qrcode" canvas-id="qrcode" :style="{'width': `${size}px`, 'height': `${size}px`}" />
```
`script` 中引用js文件并调用方法生成矩阵
```javascript
import uQRCode from '@/uni_modules/Sansnn-uQRCode/components/uqrcode/common/uqrcode.js'
export default {
data() {
return {
size: 256,
margin: 10,
backgroundColor: '#FFFFFF',
foregroundColor: '#000000'
}
},
onReady() {
let modules = uQRCode.getModules({
text: 'uQRCode 3.0',
errorCorrectLevel: uQRCode.errorCorrectLevel.H
})
let tileSize = (this.size - this.margin * 2) / modules.length
// 获取绘图所需的上下文
let ctx = uni.createCanvasContext('qrcode', this)
// 开始绘制
ctx.setFillStyle(this.backgroundColor)
ctx.fillRect(0, 0, this.size, this.size)
for (var row = 0; row < modules.length; row++) {
for (var col = 0; col < modules.length; col++) {
// 计算每一个小块的位置
var x = col * tileSize + this.margin
var y = row * tileSize + this.margin
var w = tileSize
var h = tileSize
var style = modules[row][col] ? this.foregroundColor : this.backgroundColor
ctx.setFillStyle(style)
ctx.fillRect(x, y, w, h)
}
}
ctx.draw()
}
}
```
### uqrcode.js 方法说明
|方法名|说明|
|---|:---|
|[getModules](#getmodulesoptions)|可以得到二维码矩阵信息,可根据返回的矩阵信息自行实现二维码生成|
### getModules(options)
根据内容得到二维码矩阵信息
|参数 |类型 |必填 |默认值 |说明 |
|--- |--- |--- |--- |:--- |
|text |String |是 |- |二维码内容 |
|errorCorrectLevel|Number |否 |2 |纠错等级1/0/3/2分别对应L/M/Q/H |
|typeNumber |Number |否 |-1 |版本 |
### 常见问题
**关于高级使用二维码生成不完整**
size的单位是px请尽量避免使用rpx如果canvas的单位是rpx那么不同设备屏幕分辨率不一样rpx转换成px后的画布尺寸不足以放下全部内容实际绘制图案超出就会出现不完整或者没有填充完整画布的情况。
**如何扫码跳转指定网页**
text参数直接放入完整的网页地址即可例如`https://ext.dcloud.net.cn/plugin?id=1287`。微信客户端不能是ip地址。
**H5长按识别**
canvas无法长按识别长按识别需要是图片才行所以需要先调用`toTempFilePath`方法得到临时路径再用image组件显示即可。