当前位置: 首页 > news >正文

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件,做了一简单的uniapp二维码组件,二维码实现依赖davidshimjs/qrcodejs。

组件特点

跨浏览器支持:利用Canvas元素实现二维码的跨浏览器兼容性,兼容微信小程序、h5、app。
无依赖性:QRCode.js完全独立工作,不需要依赖其他外部JavaScript库,确保了其轻量级和易集成的特点。
高度可配置:提供了丰富的配置选项,如设置二维码的尺寸、颜色(暗色和亮色区域)、纠错级别等,让开发者可以根据实际需求进行灵活配置。
动态更改:通过API方法,可以在运行时清除或重新生成二维码内容,满足动态变化的需求。

组件库实现

<template>
    <view class="qrcode" :style="{width:width+ 'px', height:width+ 'px'}">
        <canvas :style="{width:width+ 'px', height:width+ 'px', background:bgc}" :canvas-id="elid"></canvas>
    </view>
</template>

<script>
    import qrCode from "./weapp-qrcode.js"
    export default {
        data() {
            return {
                elid: this.$u.guid(),
                bgc: 'rgba(200, 200, 200, 0.1)', //测试画布是否与内容相同大小
                canvasQrPath: this.qrPath, //
                level: ''
            }
        },
        props: {
            text: {
                type: String,
                default: 'hello'
            },
            width: {
                type: Number,
                default: 200
            },
            quality: {
                type: String,
                default: 'L' //二维码质量L/M/Q/H
            },
            colorDark: {
                type: String,
                default: '#000000'
            },
            colorLight: {
                type: String,
                default: '#ffffff'
            },
            qrPath: {
                type: String,
                default: ''
            }
        },
        // 在实例挂载完成后被立即调用
        mounted() { //兼容非动态取值(二维码为固定内容)
            this.couponQrCode()
        },
        watch: {
            text(newVal, oldVal) { //监测到text值发生改变时重新绘制
                console.log('最新值是:' + newVal, "原来的值是:" + oldVal);
                this.couponQrCode()
            }
        },
        methods: {
            // 二维码生成工具
            couponQrCode() {
                var that = this;
                if (this.quality == 'L') {
                    this.level = qrCode.CorrectLevel.L
                } else if (this.quality == 'M') {
                    this.level = qrCode.CorrectLevel.M
                } else if (this.quality == 'Q') {
                    this.level = qrCode.CorrectLevel.Q
                } else if (this.quality == 'H') {
                    this.level = qrCode.CorrectLevel.H
                } else {
                    this.level = qrCode.CorrectLevel.L
                }
                new qrCode(this.elid, {
                    text: this.text,
                    width: this.width,
                    height: this.width,
                    showLoading: true, // 是否显示loading
                    loadingText: '二维码生成中', // loading文字
                    colorDark: this.colorDark, //二维码暗部颜色
                    colorLight: this.colorLight, //二维码亮部颜色
                    correctLevel: this.level, //二维码质量L/M/Q/H
                    usingIn: this //在自定义组件下,第二个参数传入组件实例this
                })
                // 把当前画布指定区域的内容导出生成图片,并返回文件路径。
                // uni.canvasToTempFilePath({
                //     canvasId: this.elid,
                //     success: (res) => {
                //         // 在H5平台下,tempFilePath 为 base64
                //         // console.log('yz-qr图片路径:', res.tempFilePath)
                //         this.canvasQrPath = res.tempFilePath
                //         this.$emit('update:qrPath', this.canvasQrPath)
                //     }
                // }, this);

                console.log('绘制完成');
            }
        }
    }
</script>

<style>
    .qrcode {
        display: flex;
        align-items: center;
        justify-content: center;
    }
</style>

组件库依赖类

//Core code comes from https://github.com/davidshimjs/qrcodejsvar QRCode;(function() {/*** Get the type by string length* * @private* @param {String} sText* @param {Number} nCorrectLevel* @return {Number} type*/function _getTypeNumber(sText, nCorrectLevel) {var nType = 1;var length = _getUTF8Length(sText);for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {var nLimit = 0;switch (nCorrectLevel) {case QRErrorCorrectLevel.L:nLimit = QRCodeLimitLength[i][0];break;case QRErrorCorrectLevel.M:nLimit = QRCodeLimitLength[i][1];break;case QRErrorCorrectLevel.Q:nLimit = QRCodeLimitLength[i][2];break;case QRErrorCorrectLevel.H:nLimit = QRCodeLimitLength[i][3];break;}if (length <= nLimit) {break;} else {nType++;}}if (nType > QRCodeLimitLength.length) {throw new Error("Too long data");}return nType;}function _getUTF8Length(sText) {var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');return replacedText.length + (replacedText.length != sText ? 3 : 0);}function QR8bitByte(data) {this.mode = QRMode.MODE_8BIT_BYTE;this.data = data;this.parsedData = [];// Added to support UTF-8 Charactersfor (var i = 0, l = this.data.length; i < l; i++) {var byteArray = [];var code = this.data.charCodeAt(i);if (code > 0x10000) {byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);byteArray[3] = 0x80 | (code & 0x3F);} else if (code > 0x800) {byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);byteArray[2] = 0x80 | (code & 0x3F);} else if (code > 0x80) {byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);byteArray[1] = 0x80 | (code & 0x3F);} else {byteArray[0] = code;}this.parsedData.push(byteArray);}this.parsedData = Array.prototype.concat.apply([], this.parsedData);if (this.parsedData.length != this.data.length) {this.parsedData.unshift(191);this.parsedData.unshift(187);this.parsedData.unshift(239);}}QR8bitByte.prototype = {getLength: function(buffer) {return this.parsedData.length;},write: function(buffer) {for (var i = 0, l = this.parsedData.length; i < l; i++) {buffer.put(this.parsedData[i], 8);}}};// QRCodeModelfunction QRCodeModel(typeNumber, errorCorrectLevel) {this.typeNumber = typeNumber;this.errorCorrectLevel = errorCorrectLevel;this.modules = null;this.moduleCount = 0;this.dataCache = null;this.dataList = [];}QRCodeModel.prototype = {addData: function(data) {var newData = new QR8bitByte(data);this.dataList.push(newData);this.dataCache = null;},isDark: function(row, col) {if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {throw new Error(row + "," + col);}return this.modules[row][col];},getModuleCount: function() {return this.moduleCount;},make: function() {this.makeImpl(false, this.getBestMaskPattern());},makeImpl: function(test, maskPattern) {this.moduleCount = this.typeNumber * 4 + 17;this.modules = new Array(this.moduleCount);for (var row = 0; row < this.moduleCount; row++) {this.modules[row] = new Array(this.moduleCount);for (var col = 0; col < this.moduleCount; col++) {this.modules[row][col] = null;}}this.setupPositionProbePattern(0, 0);this.setupPositionProbePattern(this.moduleCount - 7, 0);this.setupPositionProbePattern(0, this.moduleCount - 7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test, maskPattern);if (this.typeNumber >= 7) {this.setupTypeNumber(test);}if (this.dataCache == null) {this.dataCache = QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);}this.mapData(this.dataCache, maskPattern);},setupPositionProbePattern: function(row, col) {for (var r = -1; r <= 7; r++) {if (row + r <= -1 || this.moduleCount <= row + r) continue;for (var c = -1; c <= 7; c++) {if (col + c <= -1 || this.moduleCount <= col + c) continue;if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r ==6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {this.modules[row + r][col + c] = true;} else {this.modules[row + r][col + c] = false;}}}},getBestMaskPattern: function() {var minLostPoint = 0;var pattern = 0;for (var i = 0; i < 8; i++) {this.makeImpl(true, i);var lostPoint = QRUtil.getLostPoint(this);if (i == 0 || minLostPoint > lostPoint) {minLostPoint = lostPoint;pattern = i;}}return pattern;},createMovieClip: function(target_mc, instance_name, depth) {var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);var cs = 1;this.make();for (var row = 0; row < this.modules.length; row++) {var y = row * cs;for (var col = 0; col < this.modules[row].length; col++) {var x = col * cs;var dark = this.modules[row][col];if (dark) {qr_mc.beginFill(0, 100);qr_mc.moveTo(x, y);qr_mc.lineTo(x + cs, y);qr_mc.lineTo(x + cs, y + cs);qr_mc.lineTo(x, y + cs);qr_mc.endFill();}}}return qr_mc;},setupTimingPattern: function() {for (var r = 8; r < this.moduleCount - 8; r++) {if (this.modules[r][6] != null) {continue;}this.modules[r][6] = (r % 2 == 0);}for (var c = 8; c < this.moduleCount - 8; c++) {if (this.modules[6][c] != null) {continue;}this.modules[6][c] = (c % 2 == 0);}},setupPositionAdjustPattern: function() {var pos = QRUtil.getPatternPosition(this.typeNumber);for (var i = 0; i < pos.length; i++) {for (var j = 0; j < pos.length; j++) {var row = pos[i];var col = pos[j];if (this.modules[row][col] != null) {continue;}for (var r = -2; r <= 2; r++) {for (var c = -2; c <= 2; c++) {if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {this.modules[row + r][col + c] = true;} else {this.modules[row + r][col + c] = false;}}}}}},setupTypeNumber: function(test) {var bits = QRUtil.getBCHTypeNumber(this.typeNumber);for (var i = 0; i < 18; i++) {var mod = (!test && ((bits >> i) & 1) == 1);this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;}for (var i = 0; i < 18; i++) {var mod = (!test && ((bits >> i) & 1) == 1);this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;}},setupTypeInfo: function(test, maskPattern) {var data = (this.errorCorrectLevel << 3) | maskPattern;var bits = QRUtil.getBCHTypeInfo(data);for (var i = 0; i < 15; i++) {var mod = (!test && ((bits >> i) & 1) == 1);if (i < 6) {this.modules[i][8] = mod;} else if (i < 8) {this.modules[i + 1][8] = mod;} else {this.modules[this.moduleCount - 15 + i][8] = mod;}}for (var i = 0; i < 15; i++) {var mod = (!test && ((bits >> i) & 1) == 1);if (i < 8) {this.modules[8][this.moduleCount - i - 1] = mod;} else if (i < 9) {this.modules[8][15 - i - 1 + 1] = mod;} else {this.modules[8][15 - i - 1] = mod;}}this.modules[this.moduleCount - 8][8] = (!test);},mapData: function(data, maskPattern) {var inc = -1;var row = this.moduleCount - 1;var bitIndex = 7;var byteIndex = 0;for (var col = this.moduleCount - 1; col > 0; col -= 2) {if (col == 6) col--;while (true) {for (var c = 0; c < 2; c++) {if (this.modules[row][col - c] == null) {var dark = false;if (byteIndex < data.length) {dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);}var mask = QRUtil.getMask(maskPattern, row, col - c);if (mask) {dark = !dark;}this.modules[row][col - c] = dark;bitIndex--;if (bitIndex == -1) {byteIndex++;bitIndex = 7;}}}row += inc;if (row < 0 || this.moduleCount <= row) {row -= inc;inc = -inc;break;}}}}};QRCodeModel.PAD0 = 0xEC;QRCodeModel.PAD1 = 0x11;QRCodeModel.createData = function(typeNumber, errorCorrectLevel, dataList) {var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);var buffer = new QRBitBuffer();for (var i = 0; i < dataList.length; i++) {var data = dataList[i];buffer.put(data.mode, 4);buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));data.write(buffer);}var totalDataCount = 0;for (var i = 0; i < rsBlocks.length; i++) {totalDataCount += rsBlocks[i].dataCount;}if (buffer.getLengthInBits() > totalDataCount * 8) {throw new Error("code length overflow. (" +buffer.getLengthInBits() +">" +totalDataCount * 8 +")");}if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {buffer.put(0, 4);}while (buffer.getLengthInBits() % 8 != 0) {buffer.putBit(false);}while (true) {if (buffer.getLengthInBits() >= totalDataCount * 8) {break;}buffer.put(QRCodeModel.PAD0, 8);if (buffer.getLengthInBits() >= totalDataCount * 8) {break;}buffer.put(QRCodeModel.PAD1, 8);}return QRCodeModel.createBytes(buffer, rsBlocks);};QRCodeModel.createBytes = function(buffer, rsBlocks) {var offset = 0;var maxDcCount = 0;var maxEcCount = 0;var dcdata = new Array(rsBlocks.length);var ecdata = new Array(rsBlocks.length);for (var r = 0; r < rsBlocks.length; r++) {var dcCount = rsBlocks[r].dataCount;var ecCount = rsBlocks[r].totalCount - dcCount;maxDcCount = Math.max(maxDcCount, dcCount);maxEcCount = Math.max(maxEcCount, ecCount);dcdata[r] = new Array(dcCount);for (var i = 0; i < dcdata[r].length; i++) {dcdata[r][i] = 0xff & buffer.buffer[i + offset];}offset += dcCount;var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);var modPoly = rawPoly.mod(rsPoly);ecdata[r] = new Array(rsPoly.getLength() - 1);for (var i = 0; i < ecdata[r].length; i++) {var modIndex = i + modPoly.getLength() - ecdata[r].length;ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;}}var totalCodeCount = 0;for (var i = 0; i < rsBlocks.length; i++) {totalCodeCount += rsBlocks[i].totalCount;}var data = new Array(totalCodeCount);var index = 0;for (var i = 0; i < maxDcCount; i++) {for (var r = 0; r < rsBlocks.length; r++) {if (i < dcdata[r].length) {data[index++] = dcdata[r][i];}}}for (var i = 0; i < maxEcCount; i++) {for (var r = 0; r < rsBlocks.length; r++) {if (i < ecdata[r].length) {data[index++] = ecdata[r][i];}}}return data;};var QRMode = {MODE_NUMBER: 1 << 0,MODE_ALPHA_NUM: 1 << 1,MODE_8BIT_BYTE: 1 << 2,MODE_KANJI: 1 << 3};var QRErrorCorrectLevel = {L: 1,M: 0,Q: 3,H: 2};var QRMaskPattern = {PATTERN000: 0,PATTERN001: 1,PATTERN010: 2,PATTERN011: 3,PATTERN100: 4,PATTERN101: 5,PATTERN110: 6,PATTERN111: 7};var QRUtil = {PATTERN_POSITION_TABLE: [[],[6, 18],[6, 22],[6, 26],[6, 30],[6, 34],[6, 22, 38],[6, 24, 42],[6, 26, 46],[6, 28, 50],[6, 30, 54],[6, 32, 58],[6, 34, 62],[6, 26, 46, 66],[6, 26, 48, 70],[6, 26, 50, 74],[6, 30, 54, 78],[6, 30, 56, 82],[6, 30, 58, 86],[6, 34, 62, 90],[6, 28, 50, 72, 94],[6, 26, 50, 74, 98],[6, 30, 54, 78, 102],[6, 28, 54, 80, 106],[6, 32, 58, 84, 110],[6, 30, 58, 86, 114],[6, 34, 62, 90, 118],[6, 26, 50, 74, 98, 122],[6, 30, 54, 78, 102, 126],[6, 26, 52, 78, 104, 130],[6, 30, 56, 82, 108, 134],[6, 34, 60, 86, 112, 138],[6, 30, 58, 86, 114, 142],[6, 34, 62, 90, 118, 146],[6, 30, 54, 78, 102, 126, 150],[6, 24, 50, 76, 102, 128, 154],[6, 28, 54, 80, 106, 132, 158],[6, 32, 58, 84, 110, 136, 162],[6, 26, 54, 82, 110, 138, 166],[6, 30, 58, 86, 114, 142, 170]],G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),getBCHTypeInfo: function(data) {var d = data << 10;while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));}return ((data << 10) | d) ^ QRUtil.G15_MASK;},getBCHTypeNumber: function(data) {var d = data << 12;while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));}return (data << 12) | d;},getBCHDigit: function(data) {var digit = 0;while (data != 0) {digit++;data >>>= 1;}return digit;},getPatternPosition: function(typeNumber) {return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];},getMask: function(maskPattern, i, j) {switch (maskPattern) {case QRMaskPattern.PATTERN000:return (i + j) % 2 == 0;case QRMaskPattern.PATTERN001:return i % 2 == 0;case QRMaskPattern.PATTERN010:return j % 3 == 0;case QRMaskPattern.PATTERN011:return (i + j) % 3 == 0;case QRMaskPattern.PATTERN100:return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;case QRMaskPattern.PATTERN101:return (i * j) % 2 + (i * j) % 3 == 0;case QRMaskPattern.PATTERN110:return ((i * j) % 2 + (i * j) % 3) % 2 == 0;case QRMaskPattern.PATTERN111:return ((i * j) % 3 + (i + j) % 2) % 2 == 0;default:throw new Error("bad maskPattern:" + maskPattern);}},getErrorCorrectPolynomial: function(errorCorrectLength) {var a = new QRPolynomial([1], 0);for (var i = 0; i < errorCorrectLength; i++) {a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));}return a;},getLengthInBits: function(mode, type) {if (1 <= type && type < 10) {switch (mode) {case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:" + mode);}} else if (type < 27) {switch (mode) {case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:" + mode);}} else if (type < 41) {switch (mode) {case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:" + mode);}} else {throw new Error("type:" + type);}},getLostPoint: function(qrCode) {var moduleCount = qrCode.getModuleCount();var lostPoint = 0;for (var row = 0; row < moduleCount; row++) {for (var col = 0; col < moduleCount; col++) {var sameCount = 0;var dark = qrCode.isDark(row, col);for (var r = -1; r <= 1; r++) {if (row + r < 0 || moduleCount <= row + r) {continue;}for (var c = -1; c <= 1; c++) {if (col + c < 0 || moduleCount <= col + c) {continue;}if (r == 0 && c == 0) {continue;}if (dark == qrCode.isDark(row + r, col + c)) {sameCount++;}}}if (sameCount > 5) {lostPoint += (3 + sameCount - 5);}}}for (var row = 0; row < moduleCount - 1; row++) {for (var col = 0; col < moduleCount - 1; col++) {var count = 0;if (qrCode.isDark(row, col)) count++;if (qrCode.isDark(row + 1, col)) count++;if (qrCode.isDark(row, col + 1)) count++;if (qrCode.isDark(row + 1, col + 1)) count++;if (count == 0 || count == 4) {lostPoint += 3;}}}for (var row = 0; row < moduleCount; row++) {for (var col = 0; col < moduleCount - 6; col++) {if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col +2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) {lostPoint += 40;}}}for (var col = 0; col < moduleCount; col++) {for (var row = 0; row < moduleCount - 6; row++) {if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2,col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) {lostPoint += 40;}}}var darkCount = 0;for (var col = 0; col < moduleCount; col++) {for (var row = 0; row < moduleCount; row++) {if (qrCode.isDark(row, col)) {darkCount++;}}}var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;lostPoint += ratio * 10;return lostPoint;}};var QRMath = {glog: function(n) {if (n < 1) {throw new Error("glog(" + n + ")");}return QRMath.LOG_TABLE[n];},gexp: function(n) {while (n < 0) {n += 255;}while (n >= 256) {n -= 255;}return QRMath.EXP_TABLE[n];},EXP_TABLE: new Array(256),LOG_TABLE: new Array(256)};for (var i = 0; i < 8; i++) {QRMath.EXP_TABLE[i] = 1 << i;}for (var i = 8; i < 256; i++) {QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];}for (var i = 0; i < 255; i++) {QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;}function QRPolynomial(num, shift) {if (num.length == undefined) {throw new Error(num.length + "/" + shift);}var offset = 0;while (offset < num.length && num[offset] == 0) {offset++;}this.num = new Array(num.length - offset + shift);for (var i = 0; i < num.length - offset; i++) {this.num[i] = num[i + offset];}}QRPolynomial.prototype = {get: function(index) {return this.num[index];},getLength: function() {return this.num.length;},multiply: function(e) {var num = new Array(this.getLength() + e.getLength() - 1);for (var i = 0; i < this.getLength(); i++) {for (var j = 0; j < e.getLength(); j++) {num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));}}return new QRPolynomial(num, 0);},mod: function(e) {if (this.getLength() - e.getLength() < 0) {return this;}var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0));var num = new Array(this.getLength());for (var i = 0; i < this.getLength(); i++) {num[i] = this.get(i);}for (var i = 0; i < e.getLength(); i++) {num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);}return new QRPolynomial(num, 0).mod(e);}};function QRRSBlock(totalCount, dataCount) {this.totalCount = totalCount;this.dataCount = dataCount;}QRRSBlock.RS_BLOCK_TABLE = [[1, 26, 19],[1, 26, 16],[1, 26, 13],[1, 26, 9],[1, 44, 34],[1, 44, 28],[1, 44, 22],[1, 44, 16],[1, 70, 55],[1, 70, 44],[2, 35, 17],[2, 35, 13],[1, 100, 80],[2, 50, 32],[2, 50, 24],[4, 25, 9],[1, 134, 108],[2, 67, 43],[2, 33, 15, 2, 34, 16],[2, 33, 11, 2, 34, 12],[2, 86, 68],[4, 43, 27],[4, 43, 19],[4, 43, 15],[2, 98, 78],[4, 49, 31],[2, 32, 14, 4, 33, 15],[4, 39, 13, 1, 40, 14],[2, 121, 97],[2, 60, 38, 2, 61, 39],[4, 40, 18, 2, 41, 19],[4, 40, 14, 2, 41, 15],[2, 146, 116],[3, 58, 36, 2, 59, 37],[4, 36, 16, 4, 37, 17],[4, 36, 12, 4, 37, 13],[2, 86, 68, 2, 87, 69],[4, 69, 43, 1, 70, 44],[6, 43, 19, 2, 44, 20],[6, 43, 15, 2, 44, 16],[4, 101, 81],[1, 80, 50, 4, 81, 51],[4, 50, 22, 4, 51, 23],[3, 36, 12, 8, 37, 13],[2, 116, 92, 2, 117, 93],[6, 58, 36, 2, 59, 37],[4, 46, 20, 6, 47, 21],[7, 42, 14, 4, 43, 15],[4, 133, 107],[8, 59, 37, 1, 60, 38],[8, 44, 20, 4, 45, 21],[12, 33, 11, 4, 34, 12],[3, 145, 115, 1, 146, 116],[4, 64, 40, 5, 65, 41],[11, 36, 16, 5, 37, 17],[11, 36, 12, 5, 37, 13],[5, 109, 87, 1, 110, 88],[5, 65, 41, 5, 66, 42],[5, 54, 24, 7, 55, 25],[11, 36, 12],[5, 122, 98, 1, 123, 99],[7, 73, 45, 3, 74, 46],[15, 43, 19, 2, 44, 20],[3, 45, 15, 13, 46, 16],[1, 135, 107, 5, 136, 108],[10, 74, 46, 1, 75, 47],[1, 50, 22, 15, 51, 23],[2, 42, 14, 17, 43, 15],[5, 150, 120, 1, 151, 121],[9, 69, 43, 4, 70, 44],[17, 50, 22, 1, 51, 23],[2, 42, 14, 19, 43, 15],[3, 141, 113, 4, 142, 114],[3, 70, 44, 11, 71, 45],[17, 47, 21, 4, 48, 22],[9, 39, 13, 16, 40, 14],[3, 135, 107, 5, 136, 108],[3, 67, 41, 13, 68, 42],[15, 54, 24, 5, 55, 25],[15, 43, 15, 10, 44, 16],[4, 144, 116, 4, 145, 117],[17, 68, 42],[17, 50, 22, 6, 51, 23],[19, 46, 16, 6, 47, 17],[2, 139, 111, 7, 140, 112],[17, 74, 46],[7, 54, 24, 16, 55, 25],[34, 37, 13],[4, 151, 121, 5, 152, 122],[4, 75, 47, 14, 76, 48],[11, 54, 24, 14, 55, 25],[16, 45, 15, 14, 46, 16],[6, 147, 117, 4, 148, 118],[6, 73, 45, 14, 74, 46],[11, 54, 24, 16, 55, 25],[30, 46, 16, 2, 47, 17],[8, 132, 106, 4, 133, 107],[8, 75, 47, 13, 76, 48],[7, 54, 24, 22, 55, 25],[22, 45, 15, 13, 46, 16],[10, 142, 114, 2, 143, 115],[19, 74, 46, 4, 75, 47],[28, 50, 22, 6, 51, 23],[33, 46, 16, 4, 47, 17],[8, 152, 122, 4, 153, 123],[22, 73, 45, 3, 74, 46],[8, 53, 23, 26, 54, 24],[12, 45, 15, 28, 46, 16],[3, 147, 117, 10, 148, 118],[3, 73, 45, 23, 74, 46],[4, 54, 24, 31, 55, 25],[11, 45, 15, 31, 46, 16],[7, 146, 116, 7, 147, 117],[21, 73, 45, 7, 74, 46],[1, 53, 23, 37, 54, 24],[19, 45, 15, 26, 46, 16],[5, 145, 115, 10, 146, 116],[19, 75, 47, 10, 76, 48],[15, 54, 24, 25, 55, 25],[23, 45, 15, 25, 46, 16],[13, 145, 115, 3, 146, 116],[2, 74, 46, 29, 75, 47],[42, 54, 24, 1, 55, 25],[23, 45, 15, 28, 46, 16],[17, 145, 115],[10, 74, 46, 23, 75, 47],[10, 54, 24, 35, 55, 25],[19, 45, 15, 35, 46, 16],[17, 145, 115, 1, 146, 116],[14, 74, 46, 21, 75, 47],[29, 54, 24, 19, 55, 25],[11, 45, 15, 46, 46, 16],[13, 145, 115, 6, 146, 116],[14, 74, 46, 23, 75, 47],[44, 54, 24, 7, 55, 25],[59, 46, 16, 1, 47, 17],[12, 151, 121, 7, 152, 122],[12, 75, 47, 26, 76, 48],[39, 54, 24, 14, 55, 25],[22, 45, 15, 41, 46, 16],[6, 151, 121, 14, 152, 122],[6, 75, 47, 34, 76, 48],[46, 54, 24, 10, 55, 25],[2, 45, 15, 64, 46, 16],[17, 152, 122, 4, 153, 123],[29, 74, 46, 14, 75, 47],[49, 54, 24, 10, 55, 25],[24, 45, 15, 46, 46, 16],[4, 152, 122, 18, 153, 123],[13, 74, 46, 32, 75, 47],[48, 54, 24, 14, 55, 25],[42, 45, 15, 32, 46, 16],[20, 147, 117, 4, 148, 118],[40, 75, 47, 7, 76, 48],[43, 54, 24, 22, 55, 25],[10, 45, 15, 67, 46, 16],[19, 148, 118, 6, 149, 119],[18, 75, 47, 31, 76, 48],[34, 54, 24, 34, 55, 25],[20, 45, 15, 61, 46, 16]];QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) {var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);if (rsBlock == undefined) {throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" +errorCorrectLevel);}var length = rsBlock.length / 3;var list = [];for (var i = 0; i < length; i++) {var count = rsBlock[i * 3 + 0];var totalCount = rsBlock[i * 3 + 1];var dataCount = rsBlock[i * 3 + 2];for (var j = 0; j < count; j++) {list.push(new QRRSBlock(totalCount, dataCount));}}return list;};QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) {switch (errorCorrectLevel) {case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];default:return undefined;}};function QRBitBuffer() {this.buffer = [];this.length = 0;}QRBitBuffer.prototype = {get: function(index) {var bufIndex = Math.floor(index / 8);return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;},put: function(num, length) {for (var i = 0; i < length; i++) {this.putBit(((num >>> (length - i - 1)) & 1) == 1);}},getLengthInBits: function() {return this.length;},putBit: function(bit) {var bufIndex = Math.floor(this.length / 8);if (this.buffer.length <= bufIndex) {this.buffer.push(0);}if (bit) {this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));}this.length++;}};var QRCodeLimitLength = [[17, 14, 11, 7],[32, 26, 20, 14],[53, 42, 32, 24],[78, 62, 46, 34],[106, 84, 60, 44],[134, 106, 74, 58],[154, 122, 86, 64],[192, 152, 108, 84],[230, 180, 130, 98],[271, 213, 151, 119],[321, 251, 177, 137],[367, 287, 203, 155],[425, 331, 241, 177],[458, 362, 258, 194],[520, 412, 292, 220],[586, 450, 322, 250],[644, 504, 364, 280],[718, 560, 394, 310],[792, 624, 442, 338],[858, 666, 482, 382],[929, 711, 509, 403],[1003, 779, 565, 439],[1091, 857, 611, 461],[1171, 911, 661, 511],[1273, 997, 715, 535],[1367, 1059, 751, 593],[1465, 1125, 805, 625],[1528, 1190, 868, 658],[1628, 1264, 908, 698],[1732, 1370, 982, 742],[1840, 1452, 1030, 790],[1952, 1538, 1112, 842],[2068, 1628, 1168, 898],[2188, 1722, 1228, 958],[2303, 1809, 1283, 983],[2431, 1911, 1351, 1051],[2563, 1989, 1423, 1093],[2699, 2099, 1499, 1139],[2809, 2213, 1579, 1219],[2953, 2331, 1663, 1273]];// QRCode objectQRCode = function(canvasId, vOption) {this._htOption = {width: 256,height: 256,typeNumber: 4,colorDark: "#000000",colorLight: "#ffffff",correctLevel: QRErrorCorrectLevel.H};if (typeof vOption === 'string') {vOption = {text: vOption};}// Overwrites optionsif (vOption) {for (var i in vOption) {this._htOption[i] = vOption[i];}}this._oQRCode = null;this.canvasId = canvasIdif (this._htOption.text && this.canvasId) {this.makeCode(this._htOption.text);}};QRCode.prototype.makeCode = function(sText) {this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);this._oQRCode.addData(sText);this._oQRCode.make();this.makeImage();};QRCode.prototype.makeImage = function() {var _oContextif (this._htOption.usingIn) {_oContext = wx.createCanvasContext(this.canvasId, this._htOption.usingIn)} else {_oContext = wx.createCanvasContext(this.canvasId)}var _htOption = this._htOption;var oQRCode = this._oQRCodevar nCount = oQRCode.getModuleCount();var nWidth = _htOption.width / nCount;var nHeight = _htOption.height / nCount;var nRoundedWidth = Math.round(nWidth);var nRoundedHeight = Math.round(nHeight);if (_htOption.image && _htOption.image != '') {_oContext.drawImage(_htOption.image, 0, 0, _htOption.width, _htOption.height)}for (var row = 0; row < nCount; row++) {for (var col = 0; col < nCount; col++) {var bIsDark = oQRCode.isDark(row, col);var nLeft = col * nWidth;var nTop = row * nHeight;_oContext.setStrokeStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)// _oContext.setStrokeStyle('yellow')_oContext.setLineWidth(1)_oContext.setFillStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)// _oContext.setFillStyle('red')// if (bIsDark) {_oContext.fillRect(nLeft, nTop, nWidth, nHeight);// }// 안티 앨리어싱 방지 처리// if (bIsDark) {_oContext.strokeRect(Math.floor(nLeft) + 0.5,Math.floor(nTop) + 0.5,nRoundedWidth,nRoundedHeight);_oContext.strokeRect(Math.ceil(nLeft) - 0.5,Math.ceil(nTop) - 0.5,nRoundedWidth,nRoundedHeight);// }// _oContext.fillRect(//     Math.floor(nLeft) + 0.5,//     Math.floor(nTop) + 0.5,//     nRoundedWidth,//     nRoundedHeight// );// _oContext.fillRect(//     Math.ceil(nLeft) - 0.5,//     Math.ceil(nTop) - 0.5,//     nRoundedWidth,//     nRoundedHeight// );// _oContext.clearRect(//     Math.floor(nLeft) + 0.5,//     Math.floor(nTop) + 0.5,//     nRoundedWidth,//     nRoundedHeight// );// _oContext.clearRect(//     Math.ceil(nLeft) - 0.5,//     Math.ceil(nTop) - 0.5,//     nRoundedWidth,//     nRoundedHeight// );}}_oContext.draw()};// 保存为图片,将临时路径传给回调QRCode.prototype.exportImage = function(callback) {if (!callback) {return}wx.canvasToTempFilePath({x: 0,y: 0,width: this._htOption.width,height: this._htOption.height,destWidth: this._htOption.width,destHeight: this._htOption.height,canvasId: this.canvasId,success: function(res) {console.log(res.tempFilePath)callback(res.tempFilePath)}})}QRCode.CorrectLevel = QRErrorCorrectLevel;
})();export default QRCode

组件库使用 

<template><view class="container container329152"><view class="flex flex-wrap diygw-col-24 flex-direction-column items-center"><view class="diygw-col-0"><diy-qrcode :width="100" :text="qrcode"></diy-qrcode></view></view><view class="clearfix"></view></view>
</template><script>export default {data() {return {//用户全局信息userInfo: {},//页面传参globalOption: {},//自定义全局变量globalData: {},qrcode: `https://www.diygw.com`};},onShareAppMessage(e) {},onShow() {this.setCurrentPage(this);},onLoad(option) {this.setCurrentPage(this);if (option) {this.setData({globalOption: this.getOption(option)});}this.init();},methods: {async init() {await this.clickFunction();},// 调用方法 自定义方法async clickFunction(param) {let thiz = this;this.sct = '2';},// 新增方法 自定义方法async cFunction(param) {let thiz = this;console.log(this.sct);}}};
</script><style lang="scss" scoped>.container329152 {}
</style>

uniapp二维码组件库已经测试兼容了微信小程序、h5、app等平台。

相关文章:

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件&#xff0c;做了一简单的uniapp二维码组件&#xff0c;二维码实现依赖davidshimjs/qrcodejs。 组件特点 跨浏览器支持&#xff1a;利用Canvas元素实现二维码的跨浏览器兼容性&#xff0c;兼容微信小程序、h5、app。 无依赖性&#xff1a;QR…...

Electron 使用 Nodemon 配置自动重启

在Electron项目中&#xff0c;每次修改了代码都需要手动关闭应用&#xff0c;再执行npm start重启应用。 Nodemon 是一个非常实用的工具&#xff0c;主要用于在开发 Node.js 应用时自动监测文件的变化并重新启动服务器。 安装nodemon 开发环境安装nodemon&#xff1a; npm …...

JVM和GC监控技术

一、监控技术简介 JVM是什么&#xff1f;项目里面有JVM吗&#xff1f;JVM跟Tomcat有什么关系&#xff1f;为什么需要去分析JVM&#xff1f; 1. JVM(全称&#xff1a;Java Virtual Machine)&#xff0c;Java虚拟机 是Java程序运行的环境&#xff0c;它是一个虚构的计算机&…...

Android中级控件

文章目录 图形定制1.图形Drawable2.形状图像3.九宫格图片4.状态列表图形 选择按钮1.复选框CheckBox2.开关按钮Switch3.单选按钮 文本输入1.编辑框EditText2.焦点变更监听器3.文本变化监听器 对话框1.提醒对话框2.日期对话框DatePickerDialog3.时间对话框TimePickerDialog 图形定…...

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法 在现代即时通讯&#xff08;IM&#xff09;系统和实时通信应用中&#xff0c;WebSocket作为一种高效的双向通信协议&#xff0c;得到了广泛应用。然而&#xff0c;在实际使用中&#xff0c;如何确保消息的可靠传输…...

生信初学者教程(二十二):Boruta+RF筛选候选标记物

文章目录 介绍加载R包导入数据准备数据机器学习特征筛选数据分割基础模型Boruta特征筛选调参最终分类模型测试集验证标记基因输出结果总结介绍 采用了Boruta结合 RF(Random Forest) 的方法,对差异基因(参考 @sec-different-limma) 进行了特征筛选。通过这种方法,能够从大…...

JVM Class类文件结构

国庆节快乐 2024年10月2日17:49:22 目录 前言 magic 数 文件版本 使用JClassLib观察class文件 一般信息 接口 常量池 字段 方法 常量池计数器 常量池 类型 CONSTANT_Methodref_info CONSTANT_Class_info 类型结构总表 访问标志 类索引, …...

解决 GitHub 文件大小限制的问题

要解决 GitHub 文件大小限制的问题&#xff0c;可以使用 Git Large File Storage (Git LFS)。以下是设置步骤&#xff1a; 安装 Git LFS&#xff1a; 对于 macOS&#xff1a;brew install git-lfs对于 Windows&#xff1a;从 Git LFS官网 下载并安装。 初始化 Git LFS&#xff…...

wordpress源码资源站整站打包32GB数据,含6.7W条资源数据

源码太大了&#xff0c;足足32gb&#xff0c;先分享给大家。新手建立资源站&#xff0c;直接用这个代码部署一下&#xff0c;数据就够用了。辅助简单做下seo&#xff0c;一个新站就OK了。 温馨提示&#xff1a;必须按照顺序安装 代码下载...

金融领域的人工智能——Palmyra-Fin 如何重新定义市场分析

引言 DigiOps与人工智能 正在改变全球各行各业&#xff0c;并带来新的创新和效率水平。人工智能已成为金融领域的强大工具&#xff0c;为市场分析、风险管理和决策带来了新方法。金融市场以复杂性和快速变化而闻名&#xff0c;人工智能处理大量数据并提供清晰、可操作的见解的…...

STL--string类

我们从这篇文章之后就正式开始学习STL的string&#xff0c;字面看起来是不是像C语言里面的字符串之类的处理方法&#xff0c;是的&#xff0c;C里面也是对字符串的一些处理函数&#xff0c;但是C有很多这样的函数&#xff0c;给大家推荐一个网站 &#xff0c;这个网站是C的官网…...

iptables 的NDAT报错bash: 9000: command not forward

外网主机设置&#xff1a; iptables -t nat -A PREROUTING -d 192.168.3.51 -p tcp --dport 9000 -j DNAT --to-destination 192.168.3.61:22 本地shell连接&#xff1a; PS C:> ssh root192.168.3.51 9000 显示如下操作&#xff1a; PS C:> ssh root192.168.3.51 9000…...

快速了解:MySQL InnoDB和MyISAM的区别

目录 一、序言二、InnoDB和MyISAM对比1、InnoDB特性支持如下2、MyISAM特性支持如下 三、两者核心区别1、事务支持2、锁机制3、索引结构4、缓存机制5、故障恢复6、使用场景 一、序言 在MySQL 8.0中&#xff0c;InnoDB是默认的存储引擎。除了InnoDB&#xff0c;MySQL还支持其它的…...

TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用

TMS320F280025 模数转换器ADC原理分析与应用 ` 文章目录 TMS320F280025 模数转换器ADC原理分析与应用逐次比较型ADC和双积分型ADC工作原理逐次比较型 ADC双积分型 ADC280025ADCADC原理分析ADC时钟SOCSOC内部原理ADC触发方式ADC采集(采样和保持)窗口通道寄生电容基准电压发生器模…...

【C++前缀和】2845. 统计趣味子数组的数目|2073

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 2845. 统计趣味子数组的数目 难度分&#xff1a;2073 给你一个下标从 0 开始的整数数组 nums &#xff0c;以及整数 modulo 和整数 k 。 请你找出并统计数组…...

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …...

docker零基础入门教程

注意 本系列文章已升级、转移至我的自建站点中&#xff0c;本章原文为&#xff1a;Docker入门 目录 注意1.前言2.docker安装3.docker基本使用4.打包docker镜像5.docker进阶 1.前言 如果你长期写C/C代码&#xff0c;那你应该很容易发现C/C开源项目存在的一个严重问题&#xff…...

【Java SE 题库】移除元素(暴力解法)--力扣

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素。元素的顺…...

linux文件编程_进程

1. 进程相关概念 面试中关于进程&#xff0c;应该会问的的几个问题&#xff1a; 1.1. 什么是程序&#xff0c;什么是进程&#xff0c;有什么区别&#xff1f; 程序是静态的概念&#xff0c;比如&#xff1a; 磁盘中生成的a.out文件&#xff0c;就叫做&#xff1a;程序进程是…...

java NIO实现UDP通讯

NIO Udp通讯工具类 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.util.Iterator;impo…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...