t.width-t.padding[1]-t.padding[3]?(a.push(g),p.push(n-t.legend.itemGap),n=l,g=[i]):(n+=l,g.push(i))}if(g.length){a.push(g),p.push(n-t.legend.itemGap),l.widthArr=p;let e=o.apply(null,p);switch(t.legend.float){case"left":l.area.start.x=t.padding[3],l.area.end.x=t.padding[3]+2*r;break;case"right":l.area.start.x=t.width-t.padding[1]-e-2*r,l.area.end.x=t.width-t.padding[1];break;default:l.area.start.x=(t.width-e)/2-r,l.area.end.x=(t.width+e)/2+r;}l.area.width=e+2*r,l.area.wholeWidth=e+2*r,l.area.height=a.length*c+2*r,l.area.wholeHeight=a.length*c+2*r+2*s,l.points=a}}else{let i=e.length,a=t.height-t.padding[0]-t.padding[2]-2*s-2*r,o=Math.min(n(a/c),i);switch(l.area.height=o*c+2*r,l.area.wholeHeight=o*c+2*r,t.legend.float){case"top":l.area.start.y=t.padding[0]+s,l.area.end.y=t.padding[0]+s+l.area.height;break;case"bottom":l.area.start.y=t.height-t.padding[2]-s-l.area.height,l.area.end.y=t.height-t.padding[2]-s;break;default:l.area.start.y=(t.height-l.area.height)/2,l.area.end.y=(t.height+l.area.height)/2;}let p=0==i%o?i/o:n(i/o+1),g=[];for(let t,a=0;aa&&(a=e);l.widthArr.push(a),l.heightArr.push(i.length*c+2*r)}let e=0;for(let t=0;ta&&(o.angle=45*Math.PI/180,o.xAxisHeight=2*i.xAxisTextPadding+l*Math.sin(o.angle)),o}function getRadarDataPoints(e,t,i,a,o){var n=Math.max,l=5=a.oldData?(n._endAngle_-n._oldAngle_)*o+a.oldAngle:n._oldAngle_-(n._oldAngle_-n._endAngle_)*o,2<=n._proportion_&&(n._proportion_%=2)}return e}function getPieTextMaxLength(e){e=getPieDataPoints(e);let t=0;for(let a=0;a=e.width&&(e.width=1),e.x+=(a+.5-i/2)*e.width,e)})}function fixColumeMeterData(e,t,i,a,o,n,l){return e.map(function(e){return null===e?null:(e.width=Math.ceil((t-2*o.columePadding)/2),n.extra.column&&n.extra.column.width&&0<+n.extra.column.width&&(e.width=Math.min(e.width,+n.extra.column.width)),0s.x&&(h-=measureText(a.categories[r]||"")),n.beginPath(),n.setFontSize(o.fontSize),n.setFillStyle(l.labelColor||"#666666"),n.fillText(a.categories[r]||"",h,x+o.fontSize/2),n.closePath(),n.stroke()})}function drawPieText(e,t,a,o,i,n){var l=Math.cos,r=Math.sin,s=Math.min,d=Math.max,h=Math.PI,x=a.pieChartLinePadding,c=[],p=null,g=e.map(function(e){var t=e.format?e.format(+e._proportion_.toFixed(2)):util.toFixed(100*e._proportion_.toFixed(4))+"%";e._rose_proportion_&&(e._proportion_=e._rose_proportion_);var i=2*h-(e._start_+2*h*e._proportion_/2),a=e.color,o=e._radius_;return{arc:i,text:t,color:a,radius:o,textColor:e.textColor,textSize:e.textSize}});for(let h=0;ht?m=d(f,p.start.y):0y&&(y-=u);let S={lineStart:{x:o,y:n},lineEnd:{x:t,y:i},start:{x:y,y:m},width:u,height:a.fontSize,text:e.text,color:e.color,textColor:e.textColor,textSize:e.textSize};p=avoidCollision(S,p),c.push(p)}for(let l=0;le.start.x?s.x+e.width:s.x,x=0>e.start.x?s.x-5:s.x+5;o.quadraticCurveTo(r.x,r.y,d,s.y),o.moveTo(i.x,i.y),o.stroke(),o.closePath(),o.beginPath(),o.moveTo(s.x+e.width,s.y),o.arc(d,s.y,2,0,2*h),o.closePath(),o.fill(),o.beginPath(),o.setFontSize(e.textSize||a.fontSize),o.setFillStyle(e.textColor||"#666666"),o.fillText(e.text,x,s.y+3),o.closePath(),o.stroke(),o.closePath()}}function drawToolTipSplitLine(e,t,i,a){var o=t.extra.tooltip||{};o.gridType=null==o.gridType?"solid":o.gridType,o.dashLength=null==o.dashLength?4:o.dashLength;var n=t.area[0],l=t.height-t.area[2];if("dash"==o.gridType&&a.setLineDash([o.dashLength,o.dashLength]),a.setStrokeStyle(o.gridColor||"#cccccc"),a.setLineWidth(1*t.pixelRatio),a.beginPath(),a.moveTo(e,n),a.lineTo(e,l),a.stroke(),a.setLineDash([]),o.xAxisLabel){let n=t.categories[t.tooltip.index];a.setFontSize(i.fontSize);let r=measureText(n,i.fontSize),s=e-.5*r,d=l;a.beginPath(),a.setFillStyle(hexToRgb(o.labelBgColor||i.toolTipBackground,o.labelBgOpacity||i.toolTipOpacity)),a.setStrokeStyle(o.labelBgColor||i.toolTipBackground),a.setLineWidth(1*t.pixelRatio),a.rect(s-i.toolTipPadding,d,r+2*i.toolTipPadding,i.fontSize+2*i.toolTipPadding),a.closePath(),a.stroke(),a.fill(),a.beginPath(),a.setFontSize(i.fontSize),a.setFillStyle(o.labelFontColor||i.fontColor),a.fillText(n+"",s,d+i.toolTipPadding+i.fontSize),a.closePath(),a.stroke()}}function drawMarkLine(e,t,a){let o=assign({},{type:"solid",dashLength:4,data:[]},e.extra.markLine),n=e.area[3],l=e.width-e.padding[1],r=calMarkLineData(o.data,e);for(let s,d=0;di.width&&(h=!0),p+t.y>i.height&&(t.y=i.height-p),o.beginPath(),o.setFillStyle(hexToRgb(l.bgColor||a.toolTipBackground,l.bgOpacity||a.toolTipOpacity)),h?(o.moveTo(t.x,t.y+10*i.pixelRatio),o.lineTo(t.x-d,t.y+10*i.pixelRatio-5*i.pixelRatio),o.lineTo(t.x-d,t.y),o.lineTo(t.x-d-n(c),t.y),o.lineTo(t.x-d-n(c),t.y+p),o.lineTo(t.x-d,t.y+p),o.lineTo(t.x-d,t.y+10*i.pixelRatio+5*i.pixelRatio),o.lineTo(t.x,t.y+10*i.pixelRatio)):(o.moveTo(t.x,t.y+10*i.pixelRatio),o.lineTo(t.x+d,t.y+10*i.pixelRatio-5*i.pixelRatio),o.lineTo(t.x+d,t.y),o.lineTo(t.x+d+n(c),t.y),o.lineTo(t.x+d+n(c),t.y+p),o.lineTo(t.x+d,t.y+p),o.lineTo(t.x+d,t.y+10*i.pixelRatio+5*i.pixelRatio),o.lineTo(t.x,t.y+10*i.pixelRatio)),o.closePath(),o.fill(),e.forEach(function(e,i){if(null!==e.color){o.beginPath(),o.setFillStyle(e.color);var n=t.x+d+2*a.toolTipPadding,l=t.y+(a.toolTipLineHeight-a.fontSize)/2+a.toolTipLineHeight*i+a.toolTipPadding+1;h&&(n=t.x-c-d+2*a.toolTipPadding),o.fillRect(n,l,r,a.fontSize),o.closePath()}}),e.forEach(function(e,i){var n=t.x+d+2*a.toolTipPadding+r+s;h&&(n=t.x-c-d+2*a.toolTipPadding+ +r+s);var x=t.y+(a.toolTipLineHeight-a.fontSize)/2+a.toolTipLineHeight*i+a.toolTipPadding;o.beginPath(),o.setFontSize(a.fontSize),o.setFillStyle(l.fontColor),o.fillText(e.text,n,x+a.fontSize),o.closePath(),o.stroke()}))}function drawYAxisTitle(e,t,i,a){var o=i.xAxisHeight+(t.height-i.xAxisHeight-measureText(e))/2;a.save(),a.beginPath(),a.setFontSize(i.fontSize),a.setFillStyle(t.yAxis.titleFontColor||"#333333"),a.translate(0,t.height),a.rotate(-90*Math.PI/180),a.fillText(e,o,t.padding[3]+.5*i.fontSize),a.closePath(),a.stroke(),a.restore()}function drawColumnDataPoints(e,t,i,a){let o=4t._scrollDistance_&&o.fillRect(0,0,l,d),!0==t.enableScroll&&o.fillRect(r,0,t.width,d),o.closePath(),o.stroke();var h=[];for(let l=0;l<=a.yAxisSplit;l++)h.push(t.area[0]+n*l);let x=t.area[3],c=t.width-t.area[1];for(let n,l=0;le/f?o.setStrokeStyle(hexToRgb(t[0].color,1)):o.setStrokeStyle(hexToRgb(t[0].color,.3)),o.setLineWidth(3*a.pixelRatio),o.moveTo(g,0),o.lineTo(y,0),o.stroke(),o.rotate(p*n);o.restore(),t=getArcbarDataPoints(t,r,l),o.setLineWidth(r.width);let m=o.createLinearGradient(s.x-h,s.y,s.x+h,s.y);m.addColorStop("0",hexToRgb(t[0].color,.2)),m.addColorStop("1.0",hexToRgb(t[0].color,1)),o.setStrokeStyle(m),o.setLineCap("round"),o.beginPath(),o.arc(s.x,s.y,h,r.startAngle*n,t[0]._proportion_*n,!1),o.stroke();let S=d-2.5*r.width;o.save(),o.translate(s.x,s.y),o.rotate((t[0]._proportion_-1)*n),o.beginPath(),o.setLineWidth(r.width/3);let T=o.createLinearGradient(0,.6*-S,0,.6*S);T.addColorStop("0",hexToRgb("#FFFFFF",0)),T.addColorStop("0.5",hexToRgb(t[0].color,1)),T.addColorStop("1.0",hexToRgb("#FFFFFF",0)),o.setStrokeStyle(T),o.arc(0,0,S,.85*n,1.15*n,!1),o.stroke(),o.beginPath(),o.setLineWidth(1),o.setStrokeStyle(t[0].color),o.setFillStyle(t[0].color),o.moveTo(-S-r.width/3/2,-4),o.lineTo(-S-r.width/3/2-4,0),o.lineTo(-S-r.width/3/2,4),o.lineTo(-S-r.width/3/2,-4),o.stroke(),o.fill(),o.restore()}else{o.setLineWidth(r.width),o.setLineCap("butt");for(let t,a=0;at[l].area[2]||e[1]>t[l].area[3]||e[2]e[0]||0>e[1]||e[2]>a||e[3]>o){n=!0;break}else n=!1;return n}function getBoundingBox(e){var t,a={};a.xMin=180,a.xMax=0,a.yMin=90,a.yMax=0;for(var o,n=0;nh.x?a.xMax:h.x,a.yMin=a.yMinh.y?a.yMax:h.y}}}return a}function coordinateToPoint(e,t,i,a,o,n){return{x:(t-i.xMin)*a+o,y:(i.yMax-e)*a+n}}function pointToCoordinate(e,t,i,a,o,n){return{x:(t-o)/a+i.xMin,y:i.yMax-(e-n)/a}}function isRayIntersectsSegment(e,t,i){if(t[1]==i[1])return!1;if(t[1]>e[1]&&i[1]>e[1])return!1;if(t[1]e[1])return!1;if(i[1]==e[1]&&t[1]>e[1])return!1;if(t[0](e/=.5)?.5*t(e,3):.5*(t(e-2,3)+2)},linear:function(e){return e}};function Animation(e){this.isStop=!1,e.duration="undefined"==typeof e.duration?1e3:e.duration,e.timing=e.timing||"linear";var t=function(){return"undefined"==typeof setTimeout?"undefined"==typeof requestAnimationFrame?function(e){e(null)}:requestAnimationFrame:function(e,t){setTimeout(function(){var t=+new Date;e(t)},t)}}(),i=null,a=function(o){if(null===o||!0===this.isStop)return e.onProcess&&e.onProcess(1),void(e.onAnimationFinish&&e.onAnimationFinish());if(null===i&&(i=o),o-io;o++)t.area[o]=t.padding[o];var d=calLegendData(s,t,a,t.chartData),h=d.area.wholeHeight,x=d.area.wholeWidth;switch(t.legend.position){case"top":t.area[0]+=h;break;case"bottom":t.area[2]+=h;break;case"left":t.area[3]+=x;break;case"right":t.area[1]+=x;}let c={},p=0;if("line"===t.type||"column"===t.type||"area"===t.type||"mix"===t.type||"candle"===t.type){if(c=calYAxisData(n,t,a),p=c.yAxisWidth,t.yAxis.showTitle){let e=0;for(let o=0;ot;t++)e.padding[t]*=e.pixelRatio;t.yAxisWidth=config.yAxisWidth*e.pixelRatio,t.xAxisHeight=config.xAxisHeight*e.pixelRatio,e.enableScroll&&e.xAxis.scrollShow&&(t.xAxisHeight+=6*e.pixelRatio),t.xAxisLineHeight=config.xAxisLineHeight*e.pixelRatio,t.fontSize=e.fontSize,t.titleFontSize=config.titleFontSize*e.pixelRatio,t.subtitleFontSize=config.subtitleFontSize*e.pixelRatio,t.toolTipPadding=config.toolTipPadding*e.pixelRatio,t.toolTipLineHeight=config.toolTipLineHeight*e.pixelRatio,t.columePadding=config.columePadding*e.pixelRatio,e.$this=e.$this?e.$this:this,this.context=uni.createCanvasContext(e.canvasId,e.$this),e.chartData={},this.event=new Event,this.scrollOption={currentOffset:0,startTouchX:0,distance:0,lastMoveTime:0},this.opts=e,this.config=t,drawCharts.call(this,e.type,e,t,this.context)};Charts.prototype.updateData=function(){let e=0 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 Characters
+ for (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);
+ }
+ }
+ };
+
+
+ // QRCodeModel
+ function 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 object
+ QRCode = 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 options
+ if (vOption) {
+ for (var i in vOption) {
+ this._htOption[i] = vOption[i];
+ }
+ }
+
+ this._oQRCode = null;
+ this.canvasId = canvasId
+
+ if (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 _oContext
+ if (this._htOption.usingIn) {
+ _oContext = wx.createCanvasContext(this.canvasId, this._htOption.usingIn)
+ }
+ else {
+ _oContext = wx.createCanvasContext(this.canvasId)
+ }
+ var _htOption = this._htOption;
+ var oQRCode = this._oQRCode
+
+ var nCount = oQRCode.getModuleCount();
+ var nWidth = _htOption.padding ? (_htOption.width - 2 * _htOption.padding) / nCount : _htOption.width / nCount;
+ var nHeight = _htOption.padding ? (_htOption.height - 2 * _htOption.padding) / nCount : _htOption.height / nCount;
+ var nRoundedHeight = Math.round(nHeight);
+ var nRoundedWidth = Math.round(nWidth);
+
+ if (_htOption.image && _htOption.image != '') {
+ _oContext.drawImage(_htOption.image, 0, 0, _htOption.width, _htOption.height)
+ }
+ _oContext.setFillStyle('#fff')
+ _oContext.fillRect(0, 0, _htOption.width, _htOption.height)
+ _oContext.save()
+ for (var row = 0; row < nCount; row++) {
+ for (var col = 0; col < nCount; col++) {
+ var bIsDark = oQRCode.isDark(row, col);
+ var nLeft = _htOption.padding ? col * nWidth + _htOption.padding : col * nWidth;
+ var nTop = _htOption.padding ? row * nHeight + _htOption.padding : row * nHeight;
+ _oContext.setStrokeStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)
+ // _oContext.setStrokeStyle('red')
+ _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,
+ 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(false, () => {
+ setTimeout(() => {
+ this.exportImage()
+ }, 800)
+ })
+ };
+
+ // 保存为图片,将临时路径传给回调
+ QRCode.prototype.exportImage = function (callback) {
+ if (this._htOption.callback && typeof this._htOption.callback === 'function') {
+ 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: (res) => {
+ this._htOption.callback({path: res.tempFilePath})
+ }
+ })
+ }
+ }
+
+ QRCode.CorrectLevel = QRErrorCorrectLevel;
+})();
+
+module.exports = QRCode
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..6f5b983
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 数据概览
+
+
+
+
+
+ 工作台
+
+
+
+
+
+ 我的
+
+
+
+
+
+
+
+
diff --git a/pages/main/inventory.vue b/pages/main/inventory.vue
new file mode 100644
index 0000000..c7a04d6
--- /dev/null
+++ b/pages/main/inventory.vue
@@ -0,0 +1,335 @@
+
+
+
+ 返回科室汇总
+
+
+
+
+ 🔍
+
+ ✕
+
+
+
+
+
+ 📭
+ {{searchKeyword ? '未找到匹配的科室' : '本日医废数据为空'}}
+
+
+
+
+
+
+
+ 🏥
+ {{value.department}}
+
+
+ {{value.departmentCount}}
+ 袋
+
+
+ {{value.departmentWeight}}
+ kg
+
+
+
+
+
+
+
+
+
+ {{val.type}}
+
+ {{val.totalCount}}袋
+ {{val.totalWeight}}kg
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/main/inventory_month.vue b/pages/main/inventory_month.vue
new file mode 100644
index 0000000..98c4d8a
--- /dev/null
+++ b/pages/main/inventory_month.vue
@@ -0,0 +1,128 @@
+
+
+
+ 返回科室汇总
+
+
+
+
+ 本月医废明细数据
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/main/inventory_week.vue b/pages/main/inventory_week.vue
new file mode 100644
index 0000000..711c3a4
--- /dev/null
+++ b/pages/main/inventory_week.vue
@@ -0,0 +1,128 @@
+
+
+
+ 返回科室汇总
+
+
+
+
+ 本周医废明细数据
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/main/warning.vue b/pages/main/warning.vue
new file mode 100644
index 0000000..a494e41
--- /dev/null
+++ b/pages/main/warning.vue
@@ -0,0 +1,116 @@
+
+
+
+ 返回异常预警
+
+
+
+ 异常预警
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/about.vue b/pages/plugin/about.vue
new file mode 100644
index 0000000..f852706
--- /dev/null
+++ b/pages/plugin/about.vue
@@ -0,0 +1,59 @@
+
+
+
+ 返回关于我们
+
+ 关于智感云医废物联
+
+ Hi!欢迎使用智感云医废物联!
+ OpMonitor(智感云),全称为Operation Monitor,利用成熟的物联网、信息化、人工智能技术,实现医疗场景内各类流程的严格、高标准管理。以便捷的安装、部署方式实现原有业务系统升级,全程可控,最终实现智能化精细管理。
+ 医废物联致力于让每一次操作都生成一条数据、让每一个流程都由智慧平台支撑、让每一条规范与先进经验都落到日常操作中。
+ 更多功能敬请期待!
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/boxOut.vue b/pages/plugin/boxOut.vue
new file mode 100644
index 0000000..6cdd4ca
--- /dev/null
+++ b/pages/plugin/boxOut.vue
@@ -0,0 +1,809 @@
+
+
+
+
+ 返回
+ 周转箱出库
+
+
+
+
+
+
+
+
+
+
+
+ 请扫描周转箱二维码添加
+
+
+
+ {{item.code}}
+
+ {{item.bagCount}}袋
+ {{item.totalWeight}}kg
+
+
+
+
+
+
+
+
+
+
+
+ 汇总统计
+
+
+ 箱子数量:
+ {{boxList.length}}个
+
+
+ 医废总袋数:
+ {{totalBagCount}}袋
+
+
+ 医废总重量:
+ {{totalWeight}}kg
+
+
+
+ 分类明细
+
+ {{type}}
+ {{stat.count}}袋 / {{stat.weight}}kg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 周转箱数量
+ {{boxList.length}}个
+
+
+ 医废总袋数
+ {{totalBagCount}}袋
+
+
+ 医废总重量
+ {{totalWeight}}kg
+
+
+ 分类医废明细
+
+
+ {{type}}
+ {{stat.count}}袋 / {{stat.weight}}kg
+
+
+ 暂无分类数据
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/boxbagIn.vue b/pages/plugin/boxbagIn.vue
new file mode 100644
index 0000000..9f30bef
--- /dev/null
+++ b/pages/plugin/boxbagIn.vue
@@ -0,0 +1,902 @@
+
+
+
+
+ 返回
+ 箱袋入库
+
+
+
+
+
+ 箱子编码
+
+
+ {{boxCode}}
+ 请先扫描箱子二维码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 请扫描医废袋二维码添加
+
+
+
+ {{item.code}}
+
+ {{item.type}}
+ {{item.weight}}kg
+
+
+
+
+
+
+
+
+
+
+
+ 统计信息
+
+
+ 袋数:
+ {{bagList.length}}个
+
+
+ 总重:
+ {{totalWeight}}kg
+
+
+
+
+ {{type}}:
+ {{stat.count}}袋
+ {{stat.weight}}kg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 箱子编码
+ {{boxCode}}
+
+
+ 医废袋数量
+ {{bagList.length}}个
+
+
+ 总重量
+ {{totalWeight}}kg
+
+
+ 类型明细
+
+
+ {{type}}
+ {{stat.count}}袋 / {{stat.weight}}kg
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/collectionMwims.vue b/pages/plugin/collectionMwims.vue
new file mode 100644
index 0000000..d349fae
--- /dev/null
+++ b/pages/plugin/collectionMwims.vue
@@ -0,0 +1,1019 @@
+
+
+
+ 返回医废收集
+
+
+
+
+ 医院
+ {{hospital}}
+
+
+
+
+ 分院
+ {{sortHospital || '本院'}}
+
+
+
+
+ 科室
+
+
+ {{selectedDepartment}}
+ 请选择科室
+ ›
+
+
+
+
+
+
+
+ 🔍
+ ✕
+
+
+
+ {{item}}
+
+ 未找到匹配的科室
+
+
+
+
+
+
+
+
+ 医废编码
+ {{medicalCode}}
+
+
+
+
+ 类型
+
+
+ {{selectedType}}
+ 请选择类型
+ ›
+
+
+
+
+
+
+
+ 🔍
+ ✕
+
+
+
+ {{item}}
+
+ 未找到匹配的类型
+
+
+
+
+
+
+
+
+ 重量(kg)
+
+
+
+
+
+ 收集人员
+
+
+ {{selectedCollector}}
+ 请选择收集人员
+ ›
+
+
+
+
+
+
+
+ 🔍
+ ✕
+
+
+
+ {{item}}
+
+ 未找到匹配的收集人员
+
+
+
+
+
+
+
+
+ 交接人员
+
+
+ {{selectedHandover}}
+ 请选择交接人员
+ ›
+
+
+
+
+
+
+
+ 🔍
+ ✕
+
+
+
+ {{item}}
+
+ 未找到匹配的交接人员
+
+
+
+
+
+
+
+
+ 收集时间
+
+
+
+ {{collectionDate || '选择日期'}}
+ ›
+
+
+ ·
+
+
+ {{collectionTime}}
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/handCard.vue b/pages/plugin/handCard.vue
new file mode 100644
index 0000000..7d09e72
--- /dev/null
+++ b/pages/plugin/handCard.vue
@@ -0,0 +1,98 @@
+
+
+
+ 返回交接卡绑定
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/handCardCode.vue b/pages/plugin/handCardCode.vue
new file mode 100644
index 0000000..de4be4f
--- /dev/null
+++ b/pages/plugin/handCardCode.vue
@@ -0,0 +1,92 @@
+
+
+
+ 返回交接卡
+
+
+
+
+ 北京智感云医废交接码
+ 使用二维码和收集人员进行交接
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/handList.vue b/pages/plugin/handList.vue
new file mode 100644
index 0000000..b7e80f6
--- /dev/null
+++ b/pages/plugin/handList.vue
@@ -0,0 +1,450 @@
+
+
+
+ 返回交接列表
+
+
+
+
+ 🔍
+ ✕
+
+
+
+
+ 📭
+ 本日医废数据为空
+
+
+
+
+ 📭
+ 未找到匹配的科室
+
+
+
+
+
+
+
+ 🏥
+ {{deptData.department}}
+
+
+ {{deptData.totalCount}}
+ 袋
+
+
+ {{deptData.totalWeight}}
+ kg
+
+
+
+
+
+
+
+
+
+ {{item.type}}
+
+ {{item.totalCount}}
+ {{item.totalWeight}}
+ {{item.reclName}}
+ {{item.handName}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/home.vue b/pages/plugin/home.vue
new file mode 100644
index 0000000..1bc5e04
--- /dev/null
+++ b/pages/plugin/home.vue
@@ -0,0 +1,311 @@
+
+
+
+
+
+
+ ☣
+
+
+ {{name}}
+
+
+
+
+
+
+
+
+
+
+ 个人信息
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/inDetails.vue b/pages/plugin/inDetails.vue
new file mode 100644
index 0000000..9d5e2c9
--- /dev/null
+++ b/pages/plugin/inDetails.vue
@@ -0,0 +1,339 @@
+
+
+
+ 返回入库详情
+
+
+
+ 入库批次:{{batch}}
+
+ 🏥 {{organ_name}}
+ 👤 入库人:{{in_ware_name}}
+
+
+ 📊 总重量:{{totalWeight}} kg
+ 📦 总袋数:{{totalCount}} 袋
+
+
+
+
+
+ 📋
+ 暂无详情数据
+
+
+
+
+
+
+
+
+
+ {{item.waste_type}}
+
+ {{item.dept_name}}
+ {{item.weight}}
+ {{item.recl_name}}
+ {{formatTime(item.recl_time)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/inList.vue b/pages/plugin/inList.vue
new file mode 100644
index 0000000..9d64715
--- /dev/null
+++ b/pages/plugin/inList.vue
@@ -0,0 +1,362 @@
+
+
+
+ 返回入库列表
+
+
+
+
+ 🔍
+ ✕
+
+
+
+
+ 📦
+ {{searchKeyword ? '未找到匹配的入库批次' : '暂无入库数据'}}
+
+
+
+
+
+
+
+ {{item.in_ware_batch}}
+ {{item.totalCount}}
+ {{item.totalWeight}}
+ {{formatTime(item.in_ware_time)}}
+ {{item.in_ware_name}}
+
+ 详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/manage.vue b/pages/plugin/manage.vue
new file mode 100644
index 0000000..193dfe2
--- /dev/null
+++ b/pages/plugin/manage.vue
@@ -0,0 +1,311 @@
+
+
+
+ 工作台
+
+
+
+
+
+
+
+
+ {{menuList[0].name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/my.vue b/pages/plugin/my.vue
new file mode 100644
index 0000000..806dd6e
--- /dev/null
+++ b/pages/plugin/my.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+ 张家辉
+
+
+ 科室主任
+
+
+
+
+
+ {{visitTotal}}
+ 今日重量
+
+
+ {{starCount}}
+ 今日数量
+
+
+ {{forksCount}}
+ 今日异常
+
+
+
+
+
+
+ 个人信息维护
+
+
+
+
+
+ 交接卡绑定
+
+
+
+
+
+ 交接列表
+
+
+
+
+
+ 关于我们
+
+
+
+
+
+
+
+
+
+
+ 概览
+
+
+
+
+
+ 追溯
+
+
+
+
+
+
+ 我的
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/onekeyIn.vue b/pages/plugin/onekeyIn.vue
new file mode 100644
index 0000000..a79c309
--- /dev/null
+++ b/pages/plugin/onekeyIn.vue
@@ -0,0 +1,941 @@
+
+
+
+
+ 返回
+ 一键入库
+
+
+
+
+
+ 车辆信息
+
+ 选择车辆
+
+ {{selectedVehicle ? selectedVehicle.vehicleCode : '请选择车辆'}}
+
+
+
+
+
+
+
+
+
+
+
+
+ 入库数据统计
+
+
+
+ 收集人员:
+ {{queryResult.collectorName}}
+
+
+
+
+
+ {{queryResult.totalBagCount}}
+ 总袋数
+
+
+
+ {{queryResult.totalWeight}}
+ 总重量(kg)
+
+
+
+
+
+
+
+
+ {{item.typeName}}
+
+
+ {{item.bagCount}}袋
+ {{item.weight}}kg
+
+
+
+
+
+
+
+
+ 请选择车辆后查询入库数据
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 车辆编码
+ {{selectedVehicle ? selectedVehicle.vehicleCode : '-'}}
+
+
+ 医废袋数量
+ {{queryResult.totalBagCount}}个
+
+
+ 总重量
+ {{queryResult.totalWeight}}kg
+
+
+ 类型明细
+
+
+ {{item.typeName}}
+ {{item.bagCount}}袋 / {{item.weight}}kg
+
+
+
+
+
+
+
+
+
+
+
+
+ {{isSubmitting ? '提交中...' : '加载中...'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未找到匹配的车辆
+
+
+ {{item.vehicleCode}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/onekeyOut.vue b/pages/plugin/onekeyOut.vue
new file mode 100644
index 0000000..a819167
--- /dev/null
+++ b/pages/plugin/onekeyOut.vue
@@ -0,0 +1,867 @@
+
+
+
+
+ 返回
+ 一键出库
+
+
+
+
+
+
+
+
+
+
+ 出库数据统计
+
+
+
+
+ {{queryResult.totalBagCount}}
+ 总袋数
+
+
+
+ {{queryResult.totalWeight}}
+ 总重量(kg)
+
+
+
+
+
+
+ 出库人员
+ {{queryResult.outUserName || '王琦'}}
+
+
+
+ 转运人员
+
+ {{selectedTransporter.name || '请选择'}}
+
+
+
+
+
+
+
+
+
+
+ {{item.typeName}}
+
+
+ {{item.bagCount}}袋
+ {{item.weight}}kg
+
+
+
+
+
+
+
+
+ 点击上方按钮查询出库数据
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 出库人员
+ {{queryResult.outUserName || '王琦'}}
+
+
+ 转运人员
+ {{selectedTransporter.name || '请选择'}}
+
+
+ 医废袋数量
+ {{queryResult.totalBagCount}}个
+
+
+ 总重量
+ {{queryResult.totalWeight}}kg
+
+
+ 类型明细
+
+
+ {{item.typeName}}
+ {{item.bagCount}}袋 / {{item.weight}}kg
+
+
+
+
+
+
+
+
+
+
+
+
+ {{isSubmitting ? '提交中...' : '加载中...'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未找到匹配的人员
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/outDetails.vue b/pages/plugin/outDetails.vue
new file mode 100644
index 0000000..cc3509d
--- /dev/null
+++ b/pages/plugin/outDetails.vue
@@ -0,0 +1,338 @@
+
+
+
+ 返回出库详情
+
+
+
+ 出库批次:{{batch}}
+
+ 🏥 {{organ_name}}
+ 👤 出库人:{{comp_recl_name}}
+
+
+ 📊 总重量:{{totalWeight}} kg
+ 📦 总袋数:{{totalCount}} 袋
+
+
+
+
+
+ 📋
+ 暂无详情数据
+
+
+
+
+
+
+
+
+
+ {{item.waste_type}}
+
+ {{item.dept_name}}
+ {{item.weight}}
+ {{item.recl_name}}
+ {{formatTime(item.recl_time)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/outList.vue b/pages/plugin/outList.vue
new file mode 100644
index 0000000..f690d0b
--- /dev/null
+++ b/pages/plugin/outList.vue
@@ -0,0 +1,362 @@
+
+
+
+ 返回出库列表
+
+
+
+
+ 🔍
+ ✕
+
+
+
+
+ 📤
+ {{searchKeyword ? '未找到匹配的出库批次' : '暂无出库数据'}}
+
+
+
+
+
+
+
+ {{item.comp_batch}}
+ {{item.totalCount}}
+ {{item.totalWeight}}
+ {{formatTime(item.comp_recl_time)}}
+ {{item.comp_recl_name}}
+
+ 详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/personalInformation.vue b/pages/plugin/personalInformation.vue
new file mode 100644
index 0000000..3214414
--- /dev/null
+++ b/pages/plugin/personalInformation.vue
@@ -0,0 +1,127 @@
+
+
+
+ 返回个人信息
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/sign.vue b/pages/plugin/sign.vue
new file mode 100644
index 0000000..e642baa
--- /dev/null
+++ b/pages/plugin/sign.vue
@@ -0,0 +1,318 @@
+
+
+ 返回签名确认
+
+
+
+ 交接人:
+ {{handName}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/taipan.vue b/pages/plugin/taipan.vue
new file mode 100644
index 0000000..ffd0a21
--- /dev/null
+++ b/pages/plugin/taipan.vue
@@ -0,0 +1,342 @@
+
+
+
+
+ 胎盘录入
+
+
+
+
+
+ 医院
+ {{ hospital }}
+
+
+ 科室
+ {{ department }}
+
+
+ 医废类型
+ 胎盘
+
+
+ 医废编码
+ {{ wasteCode }}
+
+
+
+
+
+
+
+ *收集人员
+
+
+
+ {{ collector ? collector.name : '请选择收集人员' }}
+
+
+
+
+
+
+
+ *交接人员
+
+
+
+ {{ handover ? handover.name : '请选择交接人员' }}
+
+
+
+
+
+
+
+ *住院号
+
+
+
+
+
+
+ *患者姓名
+
+
+
+
+
+
+ *处置方式
+
+
+
+ {{ disposal || '请选择处置方式' }}
+
+
+
+
+
+
+ 处置时间
+
+
+ {{ disposalDateTime || '请选择日期时间' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugin/warnRecord.vue b/pages/plugin/warnRecord.vue
new file mode 100644
index 0000000..3189b17
--- /dev/null
+++ b/pages/plugin/warnRecord.vue
@@ -0,0 +1,421 @@
+
+
+
+ 返回预警列表
+
+
+
+
+ 🔍
+ ✕
+
+
+
+
+ 🔔
+ {{searchKeyword ? '未找到匹配的预警记录' : '暂无预警数据'}}
+
+
+
+
+
+
+
+ {{item.hospital || '-'}}
+ {{item.department || '-'}}
+
+ {{item.type || '-'}}
+
+ {{formatTime(item.create_time)}}
+
+ {{getStatusText(item.status)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/register/login.vue b/pages/register/login.vue
new file mode 100644
index 0000000..99fc2a6
--- /dev/null
+++ b/pages/register/login.vue
@@ -0,0 +1,223 @@
+
+
+
+ 医疗废物追溯系统
+
+
+ ☣
+
+ 欢迎使用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/register/qidong.vue b/pages/register/qidong.vue
new file mode 100644
index 0000000..24518fe
--- /dev/null
+++ b/pages/register/qidong.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/register/registerHandUser.vue b/pages/register/registerHandUser.vue
new file mode 100644
index 0000000..88b931f
--- /dev/null
+++ b/pages/register/registerHandUser.vue
@@ -0,0 +1,184 @@
+
+
+
+ 返回注册
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/register/registerOutClinic.vue b/pages/register/registerOutClinic.vue
new file mode 100644
index 0000000..fe0e78e
--- /dev/null
+++ b/pages/register/registerOutClinic.vue
@@ -0,0 +1,153 @@
+
+
+
+ 登录检测
+
+
+
+
+
+
+ 正在检测登录用户人员身份,请稍等...
+
+
+
+
+
+
+
+
diff --git a/pages/register/registerRegulatory.vue b/pages/register/registerRegulatory.vue
new file mode 100644
index 0000000..8be7f4f
--- /dev/null
+++ b/pages/register/registerRegulatory.vue
@@ -0,0 +1,320 @@
+
+
+
+ 注册
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/medical.jpg b/static/medical.jpg
new file mode 100644
index 0000000..bc90cd5
Binary files /dev/null and b/static/medical.jpg differ
diff --git a/static/qidong2.png b/static/qidong2.png
new file mode 100644
index 0000000..828abe7
Binary files /dev/null and b/static/qidong2.png differ
diff --git a/static/tabbar/about.png b/static/tabbar/about.png
new file mode 100644
index 0000000..cda8efe
Binary files /dev/null and b/static/tabbar/about.png differ
diff --git a/static/tabbar/about1.png b/static/tabbar/about1.png
new file mode 100644
index 0000000..a2e5acc
Binary files /dev/null and b/static/tabbar/about1.png differ
diff --git a/static/tabbar/about1_cur.png b/static/tabbar/about1_cur.png
new file mode 100644
index 0000000..3cab110
Binary files /dev/null and b/static/tabbar/about1_cur.png differ
diff --git a/static/tabbar/about_cur.png b/static/tabbar/about_cur.png
new file mode 100644
index 0000000..57797d0
Binary files /dev/null and b/static/tabbar/about_cur.png differ
diff --git a/static/tabbar/basics.png b/static/tabbar/basics.png
new file mode 100644
index 0000000..9aa56d8
Binary files /dev/null and b/static/tabbar/basics.png differ
diff --git a/static/tabbar/basics1.png b/static/tabbar/basics1.png
new file mode 100644
index 0000000..8a5ce76
Binary files /dev/null and b/static/tabbar/basics1.png differ
diff --git a/static/tabbar/basics1_cur.png b/static/tabbar/basics1_cur.png
new file mode 100644
index 0000000..0335bc6
Binary files /dev/null and b/static/tabbar/basics1_cur.png differ
diff --git a/static/tabbar/basics_cur.png b/static/tabbar/basics_cur.png
new file mode 100644
index 0000000..574cfb8
Binary files /dev/null and b/static/tabbar/basics_cur.png differ
diff --git a/static/tabbar/component.png b/static/tabbar/component.png
new file mode 100644
index 0000000..f84af1f
Binary files /dev/null and b/static/tabbar/component.png differ
diff --git a/static/tabbar/component1.png b/static/tabbar/component1.png
new file mode 100644
index 0000000..0a87a81
Binary files /dev/null and b/static/tabbar/component1.png differ
diff --git a/static/tabbar/component1_cur.png b/static/tabbar/component1_cur.png
new file mode 100644
index 0000000..2250208
Binary files /dev/null and b/static/tabbar/component1_cur.png differ
diff --git a/static/tabbar/component_cur.png b/static/tabbar/component_cur.png
new file mode 100644
index 0000000..9becf29
Binary files /dev/null and b/static/tabbar/component_cur.png differ
diff --git a/static/tabbar/plugin.png b/static/tabbar/plugin.png
new file mode 100644
index 0000000..a9b92cc
Binary files /dev/null and b/static/tabbar/plugin.png differ
diff --git a/static/tabbar/plugin1.png b/static/tabbar/plugin1.png
new file mode 100644
index 0000000..a7b540b
Binary files /dev/null and b/static/tabbar/plugin1.png differ
diff --git a/static/tabbar/plugin1_cur.png b/static/tabbar/plugin1_cur.png
new file mode 100644
index 0000000..f541bd8
Binary files /dev/null and b/static/tabbar/plugin1_cur.png differ
diff --git a/static/tabbar/plugin_cur.png b/static/tabbar/plugin_cur.png
new file mode 100644
index 0000000..cf6a0e4
Binary files /dev/null and b/static/tabbar/plugin_cur.png differ