# uQRCode
**点击群号加入群聊【uQRCode交流群】:[695070434](https://jq.qq.com/?_wv=1027&k=JRjzDqiw)**
uQRCode 生成方式简单,可扩展性高,适用所有前端应用和Node.js服务端,可运行到所有支持canvas的平台。支持NVUE(NVUE中使用GCanvas)。
支持自定义二维码渲染规则,可通过uQRCode API得到矩阵信息后,自行实现canvas或view+css渲染二维码,如随机颜色、圆点、方块、块与块之间的间距等,详情参考示例项目。
### 插件市场
[https://ext.dcloud.net.cn/plugin?id=1287](https://ext.dcloud.net.cn/plugin?id=1287)
### github
[https://github.com/Sansnn/uQRCode](https://github.com/Sansnn/uQRCode)
### npm
[https://www.npmjs.com/package/u-qrcode](https://www.npmjs.com/package/u-qrcode)
### 示例预览
[https://static-c15f4b57-ef97-4d2b-b939-f580f910d7e2.bspapp.com](https://static-c15f4b57-ef97-4d2b-b939-f580f910d7e2.bspapp.com)
### 二维码
**什么是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)
### 组件使用
导入`u-qrcode`组件后,在 `template` 中创建 `` 组件
```html
```
### 属性说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|canvasId |String |- |- |是 |组件标识/canvasId |
|value |String |- |- |是 |二维码内容 |
|size |Number |- |354 |否 |二维码大小,默认单位px,rpx需要使用uni.upx2px()转换|
|options |Object |- |- |否 |参数可选项,详见下方options说明 |
### 事件说明
|事件名 |参数 |返回值 |说明 |
|--- |--- |--- |:--- |
|click |- |void |点击事件 |
|complete |- |Object |生成完成事件,返回值success: true表示生成成功,false生成失败 |
### 方法说明
|方法名 |参数 |返回值 |说明 |
|--- |--- |--- |:--- |
|remake |- |void |重新生成 |
|toTempFilePath |Object:callback|void |导出临时路径 |
|save |Object:callback|void |保存 |
#### options说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|typeNumber |Number |- |-1 |否 |二维码版本 |
|errorCorrectLevel |String/Number|L/M/Q/H/1/0/3/2|H |否 |纠错等级L/M/Q/H分别对应1/0/3/2 |
|useDynamicSize |Boolean |- |false |否 |是否使用动态尺寸,可以去除二维码小块白色细线 |
|margin |Number |- |0 |否 |填充边距,默认单位px |
|background |Object |- |- |否 |背景设置,详见下方options.background说明 |
|foreground |Object |- |- |否 |前景设置,详见下方options.foreground说明 |
|positionDetection |Object |- |- |否 |定位角设置,详见下方options.positionDetection说明 |
|separator |Object |- |- |否 |分割图案设置,详见下方options.separator说明 |
|alignment |Object |- |- |否 |对齐图案设置,详见下方options.alignment说明 |
|timing |Object |- |- |否 |时序图案设置,详见下方options.timing说明 |
|darkBlock |Object |- |- |否 |暗块设置,详见下方options.darkBlock说明 |
|versionInformation |Object |- |- |否 |版本信息设置,详见下方options.versionInformation说明 |
#### options.background说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|color |String |- |#FFFFFF|否 |背景色,若需要透明背景可设置为rgba(0,0,0,0)|
|image |Object |- |- |否 |背景图片设置,详见下方options.background.image说明|
#### options.background.image说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|src |String |- |- |否 |背景图片路径 |
|width |Number |- |1 |否 |指定背景图片宽度,1为二维码size的100% |
|height |Number |- |1 |否 |指定背景图片高度,1为二维码size的100% |
|align |Array|['left'/'center'/'right', 'top'/'center'/'bottom'] |['center', 'center'] |否 |指定背景图片对齐方式,[0]为水平方位,[1]为垂直方位 |
|anchor |Array|- |[0, 0] |否 |指定背景图片锚点,[0]为X轴偏移量,[1]为Y轴偏移量 |
|alpha |Number |0-1 |1 |否 |指定背景图片透明度 |
#### options.foreground说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|color |String |- |#FFFFFF|否 |前景色 |
|image |Object |- |- |否 |前景图片设置,详见下方options.foreground.image说明 |
#### options.foreground.image说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|src |String |- |- |否 |前景图片路径 |
|width |Number |- |1/4 |否 |指定前景图片宽度,1为二维码size的100% |
|height |Number |- |1/4 |否 |指定前景图片高度,1为二维码size的100% |
|align |Array|['left'/'center'/'right', 'top'/'center'/'bottom'] |['center', 'center'] |否 |指定前景图片对齐方式,[0]为水平方位,[1]为垂直方位 |
|anchor |Array|- |[0, 0] |否 |指定前景图片锚点,[0]为X轴偏移量,[1]为Y轴偏移量 |
#### options.positionDetection说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|backgroundColor|String |- |options.background.color |否 |定位角区域背景色,默认值跟随背景色 |
|foregroundColor|String |- |options.foreground.color |否 |定位角小块颜色,默认值跟随前景色 |
#### options.separator说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|color |String |- |options.background.color |否 |分割区域颜色,默认值跟随背景色 |
#### options.alignment说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|backgroundColor|String |- |options.background.color |否 |对齐区域背景色,默认值跟随背景色 |
|foregroundColor|String |- |options.foreground.color |否 |对齐小块颜色,默认值跟随前景色 |
#### options.timing说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|backgroundColor|String |- |options.background.color |否 |时序区域背景色,默认值跟随背景色 |
|foregroundColor|String |- |options.foreground.color |否 |时序小块颜色,默认值跟随前景色 |
#### options.darkBlock说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|color |String |- |options.foreground.color |否 |暗块颜色,默认值跟随前景色 |
#### options.versionInformation说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|backgroundColor|String |- |options.background.color |否 |版本信息区域背景色,默认值跟随背景色 |
|foregroundColor|String |- |options.foreground.color |否 |版本信息小块颜色,默认值跟随前景色 |
### u-qrcode.js使用
引入u-qrcode.js
``` javascript
import uQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode';
```
或者使用npm安装
> npm i u-qrcode
``` javascript
import uQRCode from 'u-qrcode';
```
nodejs引入
``` javascript
import uQRCode from 'u-qrcode/module';
```
在 `template` 中创建 `` 组件并设置 `id`,画布宽高
```html
```
在 `script` 中调用生成方法
```javascript
import uQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode';
export default {
data() {
return {
text: 'uQRCode',
size: 256
}
},
onReady() {
const ctx = uni.createCanvasContext('qrcode');
const uqrcode = new uQRCode(
{
text: this.text,
size: this.size
},
ctx
);
uqrcode.make();
uqrcode.draw();
}
}
```
### new uQRCode(options, canvasContext, loadImage)说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|options |Object |- |- |是 |包含组件属性中的options的所有属性,详见下方options说明 |
|canvasContext|Object |- |- |是 |canvas绘画上下文 |
|loadImage |Promise|- |- |否 |绘制图片时,某些平台必传,例如微信小程序2d绘图需要创建Image对象,不能直接使用路径,这时就需要传入canvas.createImage给loadImage方法,否则无法绘制图片 |
#### options说明,包含组件属性中的options的所有属性,下方仅列举未包含的属性,其余属性请移步到组件属性options说明查看
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|text |String |- |- |是 |二维码内容 |
|size |Number |- |354 |否 |二维码大小 |
### uQRCode实例属性
|属性名 |类型 |说明 |
|--- |--- |:--- |
|options |Object |实例化传入的选项值 |
|canvasContext|Object |画布实例 |
|makeData |Object |制作二维码全部数据 |
|modules |Array |制作二维码主要模块数据 |
|moduleCount |Number |模块数量 |
### uQRCode实例方法
|方法名 |参数 |返回值 |说明 |
|--- |--- |--- |:--- |
|make |- |void |制作二维码方法 |
|draw |options|Promise|绘制二维码方法,绘制层级关系,最底层背景 -> 背景图片 -> 前景 -> 最顶层前景图片,options见下方说明 |
#### draw(options)说明
|属性名 |类型 |可选值 |默认值 |是否必填 |说明 |
|--- |--- |--- |--- |--- |:--- |
|drawBackground |Object: {before, after}|- |- |否 |绘制背景前后可执行自定义方法before,after |
|drawBackgroundImage|Object: {before, after}|- |- |否 |绘制背景图前后可执行自定义方法before,after|
|drawForeground |Object: {before, after}|- |- |否 |绘制前景前后可执行自定义方法before,after |
|drawForegroundImage|Object: {before, after}|- |- |否 |绘制前景图前后可执行自定义方法before,after|
### uQRCode静态属性
|属性名 |类型 |说明 |
|--- |--- |:--- |
|errorCorrectLevel|Object |纠错等级 |
|defaults |Object |预设默认值 |
### uQRCode静态方法
|方法名 |参数 |返回值 |说明 |
|--- |--- |--- |:--- |
|deepReplace|o, r |替换后的新对象 |对象属性深度替换 |
### 常见问题
**如何扫码跳转指定网页**
二维码内容直接放入完整的网页地址即可,例如:`https://ext.dcloud.net.cn/plugin?id=1287`。微信客户端不能是ip地址。
**nvue打包后生成失败**
Canvas是作为独立的模块,打包时需要选择使用Canvas模块才能正常使用相关的功能。 需要在manifest.json的代码视图中配置如下(暂时还不支持可视化界面操作):
```javascript
"app-plus" : {
/* 模块配置 */
"modules" : {
"Canvas" : "nvue canvas" //使用Canvas模块
},
//...
},
//...
```
保存好提交云端打包。