123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- import { defineComponent } from 'vue';
- import { AwesomeQR } from 'vue-qr/src/lib/awesome-qr';
- import { px2vw } from '@/utils/index'
- function toBoolean(val: any): boolean {
- if (val === '') return val;
- return val === 'true' || val == '1';
- }
- function readAsArrayBuffer(url: any) {
- return new Promise(resolve => {
- const xhr = new XMLHttpRequest();
- xhr.responseType = 'blob'; //设定返回数据类型为Blob
- xhr.onload = function () {
- const reader = new FileReader();
- reader.onloadend = function () {
- resolve(reader.result);
- };
- reader.readAsArrayBuffer(xhr.response); //xhr.response就是一个Blob,用FileReader读取
- };
- xhr.open('GET', url);
- xhr.send();
- });
- }
- export default defineComponent({
- name: 'TheQrCode',
- props: {
- text: {
- type: String,
- required: true
- },
- qid: {
- type: String
- },
- correctLevel: {
- type: Number,
- default: 0
- },
- size: {
- type: Number,
- default: 220
- },
- margin: {
- type: Number,
- default: 20
- },
- colorDark: {
- type: String,
- default: '#000000'
- },
- colorLight: {
- type: String,
- default: '#FFFFFF'
- },
- bgSrc: {
- type: String,
- default: undefined
- },
- background: {
- type: String,
- default: 'rgba(0,0,0,0)'
- },
- backgroundDimming: {
- type: String,
- default: 'rgba(0,0,0,0)'
- },
- logoSrc: {
- type: String,
- default: undefined
- },
- logoBackgroundColor: {
- type: String,
- default: 'rgba(255,255,255,1)'
- },
- gifBgSrc: {
- type: String,
- default: undefined
- },
- logoScale: {
- type: Number,
- default: 0.2
- },
- logoMargin: {
- type: Number,
- default: 0
- },
- logoCornerRadius: {
- type: Number,
- default: 8
- },
- whiteMargin: {
- type: [Boolean, String],
- default: true
- },
- dotScale: {
- type: Number,
- default: 1
- },
- autoColor: {
- type: [Boolean, String],
- default: true
- },
- binarize: {
- type: [Boolean, String],
- default: false
- },
- binarizeThreshold: {
- type: Number,
- default: 128
- },
- callback: {
- type: Function,
- default: function () {
- return undefined;
- }
- },
- bindElement: {
- type: Boolean,
- default: true
- },
- backgroundColor: {
- type: String,
- default: '#FFFFFF'
- },
- components: {
- default: function () {
- return {
- data: {
- scale: 1
- },
- timing: {
- scale: 1,
- protectors: false
- },
- alignment: {
- scale: 1,
- protectors: false
- },
- cornerAlignment: {
- scale: 1,
- protectors: true
- }
- };
- }
- }
- },
- data() {
- return {
- imgUrl: '' as any
- };
- },
- watch: {
- $props: {
- deep: true,
- handler() {
- this.main();
- }
- }
- },
- mounted() {
- this.main();
- },
- methods: {
- async main() {
- // const that = this;
- if (this.gifBgSrc) {
- const gifImg = await readAsArrayBuffer(this.gifBgSrc);
- const logoImg = this.logoSrc;
- this.render(undefined, logoImg, gifImg);
- return;
- }
- const bgImg = this.bgSrc;
- const logoImg = this.logoSrc;
- this.render(bgImg, logoImg);
- },
- async render(img: any, logoImg: any, gifBgSrc?: any) {
- console.log(img, logoImg, gifBgSrc);
- new AwesomeQR({
- gifBackground: gifBgSrc,
- text: this.text,
- size: this.size,
- margin: this.margin,
- colorDark: this.colorDark,
- colorLight: this.colorLight,
- backgroundColor: this.backgroundColor,
- backgroundImage: img,
- backgroundDimming: this.backgroundDimming,
- logoImage: logoImg + '?' + new Date().getTime(),
- logoScale: this.logoScale,
- logoBackgroundColor: this.logoBackgroundColor,
- correctLevel: this.correctLevel,
- logoMargin: this.logoMargin,
- logoCornerRadius: this.logoCornerRadius,
- whiteMargin: toBoolean(this.whiteMargin),
- dotScale: this.dotScale,
- autoColor: toBoolean(this.autoColor),
- components: this.components
- })
- .draw()
- .then((dataUri: any) => {
- console.log('🚀 ~ dataUri:', dataUri);
- this.imgUrl = dataUri;
- this.callback && this.callback(dataUri, this.qid);
- });
- }
- },
- render() {
- return (
- < >
- {this.bindElement && this.imgUrl && (
- <img style={{ width: px2vw(this.size), height: px2vw(this.size), display: 'inline-block', zIndex: 1000 }} src={this.imgUrl} />
- )}
- </>
- );
- }
- });
|