# 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` 中创建 `<u-qrcode/>` 组件

```html
<u-qrcode ref="qrcode" canvas-id="qrcode" value="uQRCode"></u-qrcode>
```

### 属性说明
|属性名		|类型		|可选值	|默认值	|是否必填	|说明																								|
|---			|---		|---		|---		|---			|:---																								|
|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<String>|['left'/'center'/'right', 'top'/'center'/'bottom']	|['center', 'center']	|否				|指定背景图片对齐方式，[0]为水平方位，[1]为垂直方位	|
|anchor	|Array<Number>|-																									|[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<String>|['left'/'center'/'right', 'top'/'center'/'bottom']	|['center', 'center']	|否				|指定前景图片对齐方式，[0]为水平方位，[1]为垂直方位	|
|anchor	|Array<Number>|-																									|[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` 中创建 `<canvas/>` 组件并设置 `id`，画布宽高

```html
<canvas id="qrcode" canvas-id="qrcode" :style="{ width: `${size}px`, height: `${size}px` }"></canvas>
```

在 `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模块
  },
  //...
},
//...
```
保存好提交云端打包。
