commit 896b54128dddc5a040adaa169a30e6a2cc4afa5f
Author: ИЭΛЭS 7ΙΛЭ <6292673+evil7@users.noreply.github.com>
Date: Fri Mar 7 11:46:02 2025 +0800
init
diff --git a/default.json b/default.json
new file mode 100644
index 0000000..08d7c52
--- /dev/null
+++ b/default.json
@@ -0,0 +1,22 @@
+{
+ "baseUrl": "https://wx-mobile.xykqyy.com/mp/app/sign",
+ "type": "searchParams",
+ "title": "扫码签到",
+ "list": [
+ { "deptCode": "30800", "deptName": "VIP" },
+ { "deptCode": "30900", "deptName": "口腔预防科" },
+ { "deptCode": "32100", "deptName": "科研实验室" },
+ { "deptCode": "32200", "deptName": "教学实验室" },
+ { "deptCode": "32300", "deptName": "口腔全科" },
+ { "deptCode": "30200", "deptName": "牙体牙髓科" },
+ { "deptCode": "30300", "deptName": "儿童口腔科" },
+ { "deptCode": "30400", "deptName": "正畸科" },
+ { "deptCode": "30500", "deptName": "修复科" },
+ { "deptCode": "30600", "deptName": "种植中心" },
+ { "deptCode": "30700", "deptName": "颌面外科门诊" },
+ { "deptCode": "30100", "deptName": "牙周科" },
+ { "deptCode": "31000", "deptName": "黏膜科" },
+ { "deptCode": "10700", "deptName": "院感科" },
+ { "deptCode": "32400", "deptName": "急诊科" }
+ ]
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..da25a44
--- /dev/null
+++ b/index.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+ 二维码生成器
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/qrcode.js b/qrcode.js
new file mode 100644
index 0000000..ce166f4
--- /dev/null
+++ b/qrcode.js
@@ -0,0 +1,856 @@
+var QRCode;
+!(function () {
+ function a(a) {
+ (this.mode = c.MODE_8BIT_BYTE), (this.data = a), (this.parsedData = []);
+ for (var b = [], d = 0, e = this.data.length; e > d; d++) {
+ var f = this.data.charCodeAt(d);
+ f > 65536
+ ? ((b[0] = 240 | ((1835008 & f) >>> 18)), (b[1] = 128 | ((258048 & f) >>> 12)), (b[2] = 128 | ((4032 & f) >>> 6)), (b[3] = 128 | (63 & f)))
+ : f > 2048
+ ? ((b[0] = 224 | ((61440 & f) >>> 12)), (b[1] = 128 | ((4032 & f) >>> 6)), (b[2] = 128 | (63 & f)))
+ : f > 128
+ ? ((b[0] = 192 | ((1984 & f) >>> 6)), (b[1] = 128 | (63 & f)))
+ : (b[0] = f),
+ (this.parsedData = this.parsedData.concat(b));
+ }
+ this.parsedData.length != this.data.length && (this.parsedData.unshift(191), this.parsedData.unshift(187), this.parsedData.unshift(239));
+ }
+ function b(a, b) {
+ (this.typeNumber = a), (this.errorCorrectLevel = b), (this.modules = null), (this.moduleCount = 0), (this.dataCache = null), (this.dataList = []);
+ }
+ function i(a, b) {
+ if (void 0 == a.length) throw new Error(a.length + "/" + b);
+ for (var c = 0; c < a.length && 0 == a[c]; ) c++;
+ this.num = new Array(a.length - c + b);
+ for (var d = 0; d < a.length - c; d++) this.num[d] = a[d + c];
+ }
+ function j(a, b) {
+ (this.totalCount = a), (this.dataCount = b);
+ }
+ function k() {
+ (this.buffer = []), (this.length = 0);
+ }
+ function m() {
+ return "undefined" != typeof CanvasRenderingContext2D;
+ }
+ function n() {
+ var a = !1,
+ b = navigator.userAgent;
+ return /android/i.test(b) && ((a = !0), (aMat = b.toString().match(/android ([0-9]\.[0-9])/i)), aMat && aMat[1] && (a = parseFloat(aMat[1]))), a;
+ }
+ function r(a, b) {
+ for (var c = 1, e = s(a), f = 0, g = l.length; g >= f; f++) {
+ var h = 0;
+ switch (b) {
+ case d.L:
+ h = l[f][0];
+ break;
+ case d.M:
+ h = l[f][1];
+ break;
+ case d.Q:
+ h = l[f][2];
+ break;
+ case d.H:
+ h = l[f][3];
+ }
+ if (h >= e) break;
+ c++;
+ }
+ if (c > l.length) throw new Error("Too long data");
+ return c;
+ }
+ function s(a) {
+ var b = encodeURI(a)
+ .toString()
+ .replace(/\%[0-9a-fA-F]{2}/g, "a");
+ return b.length + (b.length != a ? 3 : 0);
+ }
+ (a.prototype = {
+ getLength: function () {
+ return this.parsedData.length;
+ },
+ write: function (a) {
+ for (var b = 0, c = this.parsedData.length; c > b; b++) a.put(this.parsedData[b], 8);
+ },
+ }),
+ (b.prototype = {
+ addData: function (b) {
+ var c = new a(b);
+ this.dataList.push(c), (this.dataCache = null);
+ },
+ isDark: function (a, b) {
+ if (0 > a || this.moduleCount <= a || 0 > b || this.moduleCount <= b) throw new Error(a + "," + b);
+ return this.modules[a][b];
+ },
+ getModuleCount: function () {
+ return this.moduleCount;
+ },
+ make: function () {
+ this.makeImpl(!1, this.getBestMaskPattern());
+ },
+ makeImpl: function (a, c) {
+ (this.moduleCount = 4 * this.typeNumber + 17), (this.modules = new Array(this.moduleCount));
+ for (var d = 0; d < this.moduleCount; d++) {
+ this.modules[d] = new Array(this.moduleCount);
+ for (var e = 0; e < this.moduleCount; e++) this.modules[d][e] = null;
+ }
+ this.setupPositionProbePattern(0, 0),
+ this.setupPositionProbePattern(this.moduleCount - 7, 0),
+ this.setupPositionProbePattern(0, this.moduleCount - 7),
+ this.setupPositionAdjustPattern(),
+ this.setupTimingPattern(),
+ this.setupTypeInfo(a, c),
+ this.typeNumber >= 7 && this.setupTypeNumber(a),
+ null == this.dataCache && (this.dataCache = b.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)),
+ this.mapData(this.dataCache, c);
+ },
+ setupPositionProbePattern: function (a, b) {
+ for (var c = -1; 7 >= c; c++)
+ if (!(-1 >= a + c || this.moduleCount <= a + c))
+ for (var d = -1; 7 >= d; d++)
+ -1 >= b + d ||
+ this.moduleCount <= b + d ||
+ (this.modules[a + c][b + d] =
+ (c >= 0 && 6 >= c && (0 == d || 6 == d)) || (d >= 0 && 6 >= d && (0 == c || 6 == c)) || (c >= 2 && 4 >= c && d >= 2 && 4 >= d) ? !0 : !1);
+ },
+ getBestMaskPattern: function () {
+ for (var a = 0, b = 0, c = 0; 8 > c; c++) {
+ this.makeImpl(!0, c);
+ var d = f.getLostPoint(this);
+ (0 == c || a > d) && ((a = d), (b = c));
+ }
+ return b;
+ },
+ createMovieClip: function (a, b, c) {
+ var d = a.createEmptyMovieClip(b, c),
+ e = 1;
+ this.make();
+ for (var f = 0; f < this.modules.length; f++)
+ for (var g = f * e, h = 0; h < this.modules[f].length; h++) {
+ var i = h * e,
+ j = this.modules[f][h];
+ j && (d.beginFill(0, 100), d.moveTo(i, g), d.lineTo(i + e, g), d.lineTo(i + e, g + e), d.lineTo(i, g + e), d.endFill());
+ }
+ return d;
+ },
+ setupTimingPattern: function () {
+ for (var a = 8; a < this.moduleCount - 8; a++) null == this.modules[a][6] && (this.modules[a][6] = 0 == a % 2);
+ for (var b = 8; b < this.moduleCount - 8; b++) null == this.modules[6][b] && (this.modules[6][b] = 0 == b % 2);
+ },
+ setupPositionAdjustPattern: function () {
+ for (var a = f.getPatternPosition(this.typeNumber), b = 0; b < a.length; b++)
+ for (var c = 0; c < a.length; c++) {
+ var d = a[b],
+ e = a[c];
+ if (null == this.modules[d][e])
+ for (var g = -2; 2 >= g; g++) for (var h = -2; 2 >= h; h++) this.modules[d + g][e + h] = -2 == g || 2 == g || -2 == h || 2 == h || (0 == g && 0 == h) ? !0 : !1;
+ }
+ },
+ setupTypeNumber: function (a) {
+ for (var b = f.getBCHTypeNumber(this.typeNumber), c = 0; 18 > c; c++) {
+ var d = !a && 1 == (1 & (b >> c));
+ this.modules[Math.floor(c / 3)][(c % 3) + this.moduleCount - 8 - 3] = d;
+ }
+ for (var c = 0; 18 > c; c++) {
+ var d = !a && 1 == (1 & (b >> c));
+ this.modules[(c % 3) + this.moduleCount - 8 - 3][Math.floor(c / 3)] = d;
+ }
+ },
+ setupTypeInfo: function (a, b) {
+ for (var c = (this.errorCorrectLevel << 3) | b, d = f.getBCHTypeInfo(c), e = 0; 15 > e; e++) {
+ var g = !a && 1 == (1 & (d >> e));
+ 6 > e ? (this.modules[e][8] = g) : 8 > e ? (this.modules[e + 1][8] = g) : (this.modules[this.moduleCount - 15 + e][8] = g);
+ }
+ for (var e = 0; 15 > e; e++) {
+ var g = !a && 1 == (1 & (d >> e));
+ 8 > e ? (this.modules[8][this.moduleCount - e - 1] = g) : 9 > e ? (this.modules[8][15 - e - 1 + 1] = g) : (this.modules[8][15 - e - 1] = g);
+ }
+ this.modules[this.moduleCount - 8][8] = !a;
+ },
+ mapData: function (a, b) {
+ for (var c = -1, d = this.moduleCount - 1, e = 7, g = 0, h = this.moduleCount - 1; h > 0; h -= 2)
+ for (6 == h && h--; ; ) {
+ for (var i = 0; 2 > i; i++)
+ if (null == this.modules[d][h - i]) {
+ var j = !1;
+ g < a.length && (j = 1 == (1 & (a[g] >>> e)));
+ var k = f.getMask(b, d, h - i);
+ k && (j = !j), (this.modules[d][h - i] = j), e--, -1 == e && (g++, (e = 7));
+ }
+ if (((d += c), 0 > d || this.moduleCount <= d)) {
+ (d -= c), (c = -c);
+ break;
+ }
+ }
+ },
+ }),
+ (b.PAD0 = 236),
+ (b.PAD1 = 17),
+ (b.createData = function (a, c, d) {
+ for (var e = j.getRSBlocks(a, c), g = new k(), h = 0; h < d.length; h++) {
+ var i = d[h];
+ g.put(i.mode, 4), g.put(i.getLength(), f.getLengthInBits(i.mode, a)), i.write(g);
+ }
+ for (var l = 0, h = 0; h < e.length; h++) l += e[h].dataCount;
+ if (g.getLengthInBits() > 8 * l) throw new Error("code length overflow. (" + g.getLengthInBits() + ">" + 8 * l + ")");
+ for (g.getLengthInBits() + 4 <= 8 * l && g.put(0, 4); 0 != g.getLengthInBits() % 8; ) g.putBit(!1);
+ for (;;) {
+ if (g.getLengthInBits() >= 8 * l) break;
+ if ((g.put(b.PAD0, 8), g.getLengthInBits() >= 8 * l)) break;
+ g.put(b.PAD1, 8);
+ }
+ return b.createBytes(g, e);
+ }),
+ (b.createBytes = function (a, b) {
+ for (var c = 0, d = 0, e = 0, g = new Array(b.length), h = new Array(b.length), j = 0; j < b.length; j++) {
+ var k = b[j].dataCount,
+ l = b[j].totalCount - k;
+ (d = Math.max(d, k)), (e = Math.max(e, l)), (g[j] = new Array(k));
+ for (var m = 0; m < g[j].length; m++) g[j][m] = 255 & a.buffer[m + c];
+ c += k;
+ var n = f.getErrorCorrectPolynomial(l),
+ o = new i(g[j], n.getLength() - 1),
+ p = o.mod(n);
+ h[j] = new Array(n.getLength() - 1);
+ for (var m = 0; m < h[j].length; m++) {
+ var q = m + p.getLength() - h[j].length;
+ h[j][m] = q >= 0 ? p.get(q) : 0;
+ }
+ }
+ for (var r = 0, m = 0; m < b.length; m++) r += b[m].totalCount;
+ for (var s = new Array(r), t = 0, m = 0; d > m; m++) for (var j = 0; j < b.length; j++) m < g[j].length && (s[t++] = g[j][m]);
+ for (var m = 0; e > m; m++) for (var j = 0; j < b.length; j++) m < h[j].length && (s[t++] = h[j][m]);
+ return s;
+ });
+ for (
+ var c = { MODE_NUMBER: 1, MODE_ALPHA_NUM: 2, MODE_8BIT_BYTE: 4, MODE_KANJI: 8 },
+ d = { L: 1, M: 0, Q: 3, H: 2 },
+ e = { PATTERN000: 0, PATTERN001: 1, PATTERN010: 2, PATTERN011: 3, PATTERN100: 4, PATTERN101: 5, PATTERN110: 6, PATTERN111: 7 },
+ f = {
+ 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: 1335,
+ G18: 7973,
+ G15_MASK: 21522,
+ getBCHTypeInfo: function (a) {
+ for (var b = a << 10; f.getBCHDigit(b) - f.getBCHDigit(f.G15) >= 0; ) b ^= f.G15 << (f.getBCHDigit(b) - f.getBCHDigit(f.G15));
+ return ((a << 10) | b) ^ f.G15_MASK;
+ },
+ getBCHTypeNumber: function (a) {
+ for (var b = a << 12; f.getBCHDigit(b) - f.getBCHDigit(f.G18) >= 0; ) b ^= f.G18 << (f.getBCHDigit(b) - f.getBCHDigit(f.G18));
+ return (a << 12) | b;
+ },
+ getBCHDigit: function (a) {
+ for (var b = 0; 0 != a; ) b++, (a >>>= 1);
+ return b;
+ },
+ getPatternPosition: function (a) {
+ return f.PATTERN_POSITION_TABLE[a - 1];
+ },
+ getMask: function (a, b, c) {
+ switch (a) {
+ case e.PATTERN000:
+ return 0 == (b + c) % 2;
+ case e.PATTERN001:
+ return 0 == b % 2;
+ case e.PATTERN010:
+ return 0 == c % 3;
+ case e.PATTERN011:
+ return 0 == (b + c) % 3;
+ case e.PATTERN100:
+ return 0 == (Math.floor(b / 2) + Math.floor(c / 3)) % 2;
+ case e.PATTERN101:
+ return 0 == ((b * c) % 2) + ((b * c) % 3);
+ case e.PATTERN110:
+ return 0 == (((b * c) % 2) + ((b * c) % 3)) % 2;
+ case e.PATTERN111:
+ return 0 == (((b * c) % 3) + ((b + c) % 2)) % 2;
+ default:
+ throw new Error("bad maskPattern:" + a);
+ }
+ },
+ getErrorCorrectPolynomial: function (a) {
+ for (var b = new i([1], 0), c = 0; a > c; c++) b = b.multiply(new i([1, g.gexp(c)], 0));
+ return b;
+ },
+ getLengthInBits: function (a, b) {
+ if (b >= 1 && 10 > b)
+ switch (a) {
+ case c.MODE_NUMBER:
+ return 10;
+ case c.MODE_ALPHA_NUM:
+ return 9;
+ case c.MODE_8BIT_BYTE:
+ return 8;
+ case c.MODE_KANJI:
+ return 8;
+ default:
+ throw new Error("mode:" + a);
+ }
+ else if (27 > b)
+ switch (a) {
+ case c.MODE_NUMBER:
+ return 12;
+ case c.MODE_ALPHA_NUM:
+ return 11;
+ case c.MODE_8BIT_BYTE:
+ return 16;
+ case c.MODE_KANJI:
+ return 10;
+ default:
+ throw new Error("mode:" + a);
+ }
+ else {
+ if (!(41 > b)) throw new Error("type:" + b);
+ switch (a) {
+ case c.MODE_NUMBER:
+ return 14;
+ case c.MODE_ALPHA_NUM:
+ return 13;
+ case c.MODE_8BIT_BYTE:
+ return 16;
+ case c.MODE_KANJI:
+ return 12;
+ default:
+ throw new Error("mode:" + a);
+ }
+ }
+ },
+ getLostPoint: function (a) {
+ for (var b = a.getModuleCount(), c = 0, d = 0; b > d; d++)
+ for (var e = 0; b > e; e++) {
+ for (var f = 0, g = a.isDark(d, e), h = -1; 1 >= h; h++)
+ if (!(0 > d + h || d + h >= b)) for (var i = -1; 1 >= i; i++) 0 > e + i || e + i >= b || ((0 != h || 0 != i) && g == a.isDark(d + h, e + i) && f++);
+ f > 5 && (c += 3 + f - 5);
+ }
+ for (var d = 0; b - 1 > d; d++)
+ for (var e = 0; b - 1 > e; e++) {
+ var j = 0;
+ a.isDark(d, e) && j++, a.isDark(d + 1, e) && j++, a.isDark(d, e + 1) && j++, a.isDark(d + 1, e + 1) && j++, (0 == j || 4 == j) && (c += 3);
+ }
+ for (var d = 0; b > d; d++)
+ for (var e = 0; b - 6 > e; e++)
+ a.isDark(d, e) && !a.isDark(d, e + 1) && a.isDark(d, e + 2) && a.isDark(d, e + 3) && a.isDark(d, e + 4) && !a.isDark(d, e + 5) && a.isDark(d, e + 6) && (c += 40);
+ for (var e = 0; b > e; e++)
+ for (var d = 0; b - 6 > d; d++)
+ a.isDark(d, e) && !a.isDark(d + 1, e) && a.isDark(d + 2, e) && a.isDark(d + 3, e) && a.isDark(d + 4, e) && !a.isDark(d + 5, e) && a.isDark(d + 6, e) && (c += 40);
+ for (var k = 0, e = 0; b > e; e++) for (var d = 0; b > d; d++) a.isDark(d, e) && k++;
+ var l = Math.abs((100 * k) / b / b - 50) / 5;
+ return (c += 10 * l);
+ },
+ },
+ g = {
+ glog: function (a) {
+ if (1 > a) throw new Error("glog(" + a + ")");
+ return g.LOG_TABLE[a];
+ },
+ gexp: function (a) {
+ for (; 0 > a; ) a += 255;
+ for (; a >= 256; ) a -= 255;
+ return g.EXP_TABLE[a];
+ },
+ EXP_TABLE: new Array(256),
+ LOG_TABLE: new Array(256),
+ },
+ h = 0;
+ 8 > h;
+ h++
+ )
+ g.EXP_TABLE[h] = 1 << h;
+ for (var h = 8; 256 > h; h++) g.EXP_TABLE[h] = g.EXP_TABLE[h - 4] ^ g.EXP_TABLE[h - 5] ^ g.EXP_TABLE[h - 6] ^ g.EXP_TABLE[h - 8];
+ for (var h = 0; 255 > h; h++) g.LOG_TABLE[g.EXP_TABLE[h]] = h;
+ (i.prototype = {
+ get: function (a) {
+ return this.num[a];
+ },
+ getLength: function () {
+ return this.num.length;
+ },
+ multiply: function (a) {
+ for (var b = new Array(this.getLength() + a.getLength() - 1), c = 0; c < this.getLength(); c++)
+ for (var d = 0; d < a.getLength(); d++) b[c + d] ^= g.gexp(g.glog(this.get(c)) + g.glog(a.get(d)));
+ return new i(b, 0);
+ },
+ mod: function (a) {
+ if (this.getLength() - a.getLength() < 0) return this;
+ for (var b = g.glog(this.get(0)) - g.glog(a.get(0)), c = new Array(this.getLength()), d = 0; d < this.getLength(); d++) c[d] = this.get(d);
+ for (var d = 0; d < a.getLength(); d++) c[d] ^= g.gexp(g.glog(a.get(d)) + b);
+ return new i(c, 0).mod(a);
+ },
+ }),
+ (j.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],
+ ]),
+ (j.getRSBlocks = function (a, b) {
+ var c = j.getRsBlockTable(a, b);
+ if (void 0 == c) throw new Error("bad rs block @ typeNumber:" + a + "/errorCorrectLevel:" + b);
+ for (var d = c.length / 3, e = [], f = 0; d > f; f++) for (var g = c[3 * f + 0], h = c[3 * f + 1], i = c[3 * f + 2], k = 0; g > k; k++) e.push(new j(h, i));
+ return e;
+ }),
+ (j.getRsBlockTable = function (a, b) {
+ switch (b) {
+ case d.L:
+ return j.RS_BLOCK_TABLE[4 * (a - 1) + 0];
+ case d.M:
+ return j.RS_BLOCK_TABLE[4 * (a - 1) + 1];
+ case d.Q:
+ return j.RS_BLOCK_TABLE[4 * (a - 1) + 2];
+ case d.H:
+ return j.RS_BLOCK_TABLE[4 * (a - 1) + 3];
+ default:
+ return void 0;
+ }
+ }),
+ (k.prototype = {
+ get: function (a) {
+ var b = Math.floor(a / 8);
+ return 1 == (1 & (this.buffer[b] >>> (7 - (a % 8))));
+ },
+ put: function (a, b) {
+ for (var c = 0; b > c; c++) this.putBit(1 == (1 & (a >>> (b - c - 1))));
+ },
+ getLengthInBits: function () {
+ return this.length;
+ },
+ putBit: function (a) {
+ var b = Math.floor(this.length / 8);
+ this.buffer.length <= b && this.buffer.push(0), a && (this.buffer[b] |= 128 >>> this.length % 8), this.length++;
+ },
+ });
+ var l = [
+ [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],
+ ],
+ o = (function () {
+ var a = function (a, b) {
+ (this._el = a), (this._htOption = b);
+ };
+ return (
+ (a.prototype.draw = function (a) {
+ function g(a, b) {
+ var c = document.createElementNS("http://www.w3.org/2000/svg", a);
+ for (var d in b) b.hasOwnProperty(d) && c.setAttribute(d, b[d]);
+ return c;
+ }
+ var b = this._htOption,
+ c = this._el,
+ d = a.getModuleCount();
+ Math.floor(b.width / d), Math.floor(b.height / d), this.clear();
+ var h = g("svg", { viewBox: "0 0 " + String(d) + " " + String(d), width: "100%", height: "100%", fill: b.colorLight });
+ h.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"),
+ c.appendChild(h),
+ h.appendChild(g("rect", { fill: b.colorDark, width: "1", height: "1", id: "template" }));
+ for (var i = 0; d > i; i++)
+ for (var j = 0; d > j; j++)
+ if (a.isDark(i, j)) {
+ var k = g("use", { x: String(i), y: String(j) });
+ k.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template"), h.appendChild(k);
+ }
+ }),
+ (a.prototype.clear = function () {
+ for (; this._el.hasChildNodes(); ) this._el.removeChild(this._el.lastChild);
+ }),
+ a
+ );
+ })(),
+ p = "svg" === document.documentElement.tagName.toLowerCase(),
+ q = p
+ ? o
+ : m()
+ ? (function () {
+ function a() {
+ (this._elImage.src = this._elCanvas.toDataURL("image/png")), (this._elImage.style.display = "block"), (this._elCanvas.style.display = "none");
+ }
+ function d(a, b) {
+ var c = this;
+ if (((c._fFail = b), (c._fSuccess = a), null === c._bSupportDataURI)) {
+ var d = document.createElement("img"),
+ e = function () {
+ (c._bSupportDataURI = !1), c._fFail && _fFail.call(c);
+ },
+ f = function () {
+ (c._bSupportDataURI = !0), c._fSuccess && c._fSuccess.call(c);
+ };
+ return (
+ (d.onabort = e),
+ (d.onerror = e),
+ (d.onload = f),
+ (d.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="),
+ void 0
+ );
+ }
+ c._bSupportDataURI === !0 && c._fSuccess ? c._fSuccess.call(c) : c._bSupportDataURI === !1 && c._fFail && c._fFail.call(c);
+ }
+ if (this._android && this._android <= 2.1) {
+ var b = 1 / window.devicePixelRatio,
+ c = CanvasRenderingContext2D.prototype.drawImage;
+ CanvasRenderingContext2D.prototype.drawImage = function (a, d, e, f, g, h, i, j) {
+ if ("nodeName" in a && /img/i.test(a.nodeName)) for (var l = arguments.length - 1; l >= 1; l--) arguments[l] = arguments[l] * b;
+ else "undefined" == typeof j && ((arguments[1] *= b), (arguments[2] *= b), (arguments[3] *= b), (arguments[4] *= b));
+ c.apply(this, arguments);
+ };
+ }
+ var e = function (a, b) {
+ (this._bIsPainted = !1),
+ (this._android = n()),
+ (this._htOption = b),
+ (this._elCanvas = document.createElement("canvas")),
+ (this._elCanvas.width = b.width),
+ (this._elCanvas.height = b.height),
+ a.appendChild(this._elCanvas),
+ (this._el = a),
+ (this._oContext = this._elCanvas.getContext("2d")),
+ (this._bIsPainted = !1),
+ (this._elImage = document.createElement("img")),
+ (this._elImage.style.display = "none"),
+ this._el.appendChild(this._elImage),
+ (this._bSupportDataURI = null);
+ };
+ return (
+ (e.prototype.draw = function (a) {
+ var b = this._elImage,
+ c = this._oContext,
+ d = this._htOption,
+ e = a.getModuleCount(),
+ f = d.width / e,
+ g = d.height / e,
+ h = Math.round(f),
+ i = Math.round(g);
+ (b.style.display = "none"), this.clear();
+ for (var j = 0; e > j; j++)
+ for (var k = 0; e > k; k++) {
+ var l = a.isDark(j, k),
+ m = k * f,
+ n = j * g;
+ (c.strokeStyle = l ? d.colorDark : d.colorLight),
+ (c.lineWidth = 1),
+ (c.fillStyle = l ? d.colorDark : d.colorLight),
+ c.fillRect(m, n, f, g),
+ c.strokeRect(Math.floor(m) + 0.5, Math.floor(n) + 0.5, h, i),
+ c.strokeRect(Math.ceil(m) - 0.5, Math.ceil(n) - 0.5, h, i);
+ }
+ this._bIsPainted = !0;
+ }),
+ (e.prototype.makeImage = function () {
+ this._bIsPainted && d.call(this, a);
+ }),
+ (e.prototype.isPainted = function () {
+ return this._bIsPainted;
+ }),
+ (e.prototype.clear = function () {
+ this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height), (this._bIsPainted = !1);
+ }),
+ (e.prototype.round = function (a) {
+ return a ? Math.floor(1e3 * a) / 1e3 : a;
+ }),
+ e
+ );
+ })()
+ : (function () {
+ var a = function (a, b) {
+ (this._el = a), (this._htOption = b);
+ };
+ return (
+ (a.prototype.draw = function (a) {
+ for (
+ var b = this._htOption,
+ c = this._el,
+ d = a.getModuleCount(),
+ e = Math.floor(b.width / d),
+ f = Math.floor(b.height / d),
+ g = [''],
+ h = 0;
+ d > h;
+ h++
+ ) {
+ g.push("");
+ for (var i = 0; d > i; i++)
+ g.push(
+ ' | '
+ );
+ g.push("
");
+ }
+ g.push("
"), (c.innerHTML = g.join(""));
+ var j = c.childNodes[0],
+ k = (b.width - j.offsetWidth) / 2,
+ l = (b.height - j.offsetHeight) / 2;
+ k > 0 && l > 0 && (j.style.margin = l + "px " + k + "px");
+ }),
+ (a.prototype.clear = function () {
+ this._el.innerHTML = "";
+ }),
+ a
+ );
+ })();
+ (QRCode = function (a, b) {
+ if (
+ ((this._htOption = { width: 256, height: 256, typeNumber: 4, colorDark: "#000000", colorLight: "#ffffff", correctLevel: d.H }), "string" == typeof b && (b = { text: b }), b)
+ )
+ for (var c in b) this._htOption[c] = b[c];
+ "string" == typeof a && (a = document.getElementById(a)),
+ (this._android = n()),
+ (this._el = a),
+ (this._oQRCode = null),
+ (this._oDrawing = new q(this._el, this._htOption)),
+ this._htOption.text && this.makeCode(this._htOption.text);
+ }),
+ (QRCode.prototype.makeCode = function (a) {
+ (this._oQRCode = new b(r(a, this._htOption.correctLevel), this._htOption.correctLevel)),
+ this._oQRCode.addData(a),
+ this._oQRCode.make(),
+ (this._el.title = a),
+ this._oDrawing.draw(this._oQRCode),
+ this.makeImage();
+ }),
+ (QRCode.prototype.makeImage = function () {
+ "function" == typeof this._oDrawing.makeImage && (!this._android || this._android >= 3) && this._oDrawing.makeImage();
+ }),
+ (QRCode.prototype.clear = function () {
+ this._oDrawing.clear();
+ }),
+ (QRCode.CorrectLevel = d);
+})();
diff --git a/script.js b/script.js
new file mode 100644
index 0000000..2a4f615
--- /dev/null
+++ b/script.js
@@ -0,0 +1,237 @@
+document.addEventListener("DOMContentLoaded", function () {
+ const qrContent = document.getElementById("qrContent");
+ const qrTitle = document.getElementById("qrTitle");
+ const centerText = document.getElementById("centerText");
+ const generateBtn = document.getElementById("generateBtn");
+ const printBtn = document.getElementById("printBtn");
+ const qrcodeDiv = document.getElementById("qrcode");
+
+ // 初始化表单验证
+ $('.ui.form').form({
+ fields: {
+ qrContent: 'empty'
+ }
+ });
+
+ // 生成按钮点击事件
+ generateBtn.addEventListener("click", function() {
+ if (!qrContent.value.trim()) {
+ alert('请输入要生成二维码的内容');
+ return;
+ }
+ generateQRCode();
+ });
+
+ // 打印按钮点击事件
+ printBtn.addEventListener("click", function() {
+ if (!qrContent.value.trim()) {
+ alert('请先输入内容并生成二维码再打印');
+ return;
+ }
+
+ // 确保二维码已经生成
+ if (!qrcodeDiv.querySelector('canvas')) {
+ generateQRCode();
+ setTimeout(() => {
+ preparePrintAndPrint();
+ }, 300);
+ } else {
+ preparePrintAndPrint();
+ }
+ });
+
+ // 准备打印并执行打印
+ function preparePrintAndPrint() {
+ const canvas = qrcodeDiv.querySelector('canvas');
+ if (!canvas) {
+ alert('生成二维码失败,请重试');
+ return;
+ }
+
+ // 准备打印内容
+ const printContainer = document.getElementById('print-container');
+ printContainer.innerHTML = '';
+
+ // 创建打印专用的大尺寸二维码
+ const printCanvas = document.createElement('canvas');
+ printCanvas.width = 750; // A4纸宽度的大约90%
+
+ const title = qrTitle.value.trim();
+ const text = centerText.value.trim();
+
+ // 计算尺寸
+ const titleSize = 32;
+ const qrSize = 600;
+ const textSize = 24;
+ const padding = 40;
+
+ // 计算文字行数
+ const textLines = text ? text.split('\n').length : 0;
+ const textHeight = textLines * textSize * 1.5;
+
+ // 设置画布高度
+ printCanvas.height = (title ? titleSize * 2 : 0) + qrSize + (text ? textHeight + padding : 0) + padding * 2;
+
+ // 获取上下文并填充背景
+ const ctx = printCanvas.getContext('2d');
+ ctx.fillStyle = '#ffffff';
+ ctx.fillRect(0, 0, printCanvas.width, printCanvas.height);
+
+ // 绘制标题
+ let yPos = padding;
+ if (title) {
+ ctx.font = `bold ${titleSize}px "Microsoft YaHei", sans-serif`;
+ ctx.fillStyle = '#333333';
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'top';
+ ctx.fillText(title, printCanvas.width / 2, yPos);
+ yPos += titleSize * 2;
+ }
+
+ // 重新生成高质量二维码
+ const tempQR = document.createElement('div');
+ new QRCode(tempQR, {
+ text: qrContent.value,
+ width: qrSize,
+ height: qrSize,
+ colorDark: '#000000',
+ colorLight: '#ffffff',
+ correctLevel: QRCode.CorrectLevel.H
+ });
+
+ // 等待二维码生成
+ setTimeout(() => {
+ try {
+ const qrImage = tempQR.querySelector('canvas');
+ const xPos = (printCanvas.width - qrSize) / 2;
+
+ // 绘制二维码
+ ctx.drawImage(qrImage, xPos, yPos);
+ yPos += qrSize + padding;
+
+ // 绘制底部文字
+ if (text) {
+ ctx.font = `${textSize}px "Microsoft YaHei", sans-serif`;
+ ctx.fillStyle = '#333333';
+ ctx.textAlign = 'center';
+
+ text.split('\n').forEach((line, i) => {
+ ctx.fillText(line, printCanvas.width / 2, yPos + (textSize * 1.5 * i));
+ });
+ }
+
+ // 添加到打印容器
+ printContainer.appendChild(printCanvas);
+
+ // 开始打印
+ window.print();
+
+ } catch (err) {
+ console.error('打印准备失败:', err);
+ alert('打印准备失败,请重试');
+ }
+ }, 200);
+ }
+
+ function generateQRCode() {
+ qrcodeDiv.innerHTML = "";
+
+ // 获取预览容器的尺寸
+ const previewContainer = document.querySelector('.preview-content');
+ const containerWidth = previewContainer.offsetWidth;
+ const containerHeight = previewContainer.offsetHeight;
+
+ // 计算二维码大小
+ const qrWidth = Math.min(containerWidth * 0.9, containerHeight * 0.7);
+
+ // 文字大小
+ const titleSize = Math.max(24, Math.floor(qrWidth * 0.06));
+ const textSize = Math.max(18, Math.floor(qrWidth * 0.05));
+ const padding = Math.floor(qrWidth * 0.08);
+
+ const title = qrTitle.value.trim();
+ const text = centerText.value.trim();
+
+ // 计算二维码实际大小
+ const qrImageSize = Math.min(qrWidth * 0.8, containerHeight * 0.6);
+
+ // 计算高度
+ const titleHeight = title ? titleSize + padding : 0;
+ const textLines = text ? text.split('\n').length : 0;
+ const textHeight = text ? (textSize * textLines * 1.5 + padding) : padding;
+ const totalHeight = titleHeight + qrImageSize + textHeight;
+
+ // 创建画布
+ const canvas = document.createElement('canvas');
+ canvas.width = qrWidth;
+ canvas.height = totalHeight;
+
+ const ctx = canvas.getContext('2d');
+ ctx.fillStyle = '#ffffff';
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+
+ // 绘制标题
+ let yPos = padding/2;
+ if (title) {
+ ctx.font = `bold ${titleSize}px "Microsoft YaHei", sans-serif`;
+ ctx.fillStyle = '#333333';
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'top';
+ ctx.fillText(title, qrWidth/2, yPos);
+ yPos += titleSize + padding/2;
+ }
+
+ // 生成二维码
+ const tempDiv = document.createElement('div');
+ new QRCode(tempDiv, {
+ text: qrContent.value,
+ width: qrImageSize,
+ height: qrImageSize,
+ colorDark: "#000000",
+ colorLight: "#ffffff",
+ correctLevel: QRCode.CorrectLevel.H
+ });
+
+ // 绘制二维码和文字
+ setTimeout(() => {
+ const qrImage = tempDiv.querySelector('canvas');
+ if (!qrImage) return;
+
+ // 绘制二维码
+ const xOffset = (qrWidth - qrImageSize) / 2;
+ ctx.drawImage(qrImage, xOffset, yPos);
+ yPos += qrImageSize + padding/2;
+
+ // 绘制底部文字
+ if (text) {
+ const lines = text.split('\n');
+ ctx.font = `${textSize}px "Microsoft YaHei", sans-serif`;
+ ctx.fillStyle = '#333333';
+ ctx.textAlign = 'center';
+
+ lines.forEach((line, i) => {
+ ctx.fillText(line, qrWidth/2, yPos + (textSize * 1.5 * i));
+ });
+ }
+
+ // 添加到DOM
+ qrcodeDiv.appendChild(canvas);
+ }, 100);
+ }
+
+ // 窗口调整时重新生成二维码
+ window.addEventListener('resize', debounce(() => {
+ if (qrContent.value.trim() && qrcodeDiv.childElementCount > 0) {
+ generateQRCode();
+ }
+ }, 300));
+
+ // 防抖函数
+ function debounce(func, wait) {
+ let timeout;
+ return function() {
+ clearTimeout(timeout);
+ timeout = setTimeout(func, wait);
+ };
+ }
+});
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..b34323a
--- /dev/null
+++ b/style.css
@@ -0,0 +1,191 @@
+body {
+ background: #f5f5f5;
+ padding: 2em 0;
+}
+
+/* 模拟 A4 纸比例 (1:1.414, 即 210mm:297mm) */
+.preview-paper {
+ background-color: white;
+ width: 100%;
+ height: 0;
+ padding-bottom: 141.4%; /* A4 比例 */
+ position: relative;
+ box-shadow: 0 0 10px rgba(0,0,0,0.1);
+ overflow: hidden;
+}
+
+.preview-content {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 5%;
+}
+
+#qrcode {
+ max-width: 100%;
+ max-height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: visible; /* 允许内容溢出 */
+}
+
+#qrcode canvas {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+}
+
+/* 确保左右卡片内容区域高度一致 */
+.ui.card .content {
+ min-height: 400px;
+ display: flex;
+ padding: 1em !important;
+}
+
+/* 确保左右卡片高度一致 */
+.ui.two.column.grid > .column {
+ display: flex;
+}
+
+.ui.fluid.card {
+ width: 100%;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+.ui.card > .content {
+ flex-grow: 1;
+}
+
+/* 右侧卡片内容区适应 A4 比例 */
+.preview-card .content {
+ padding: 1em !important;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+/* 输入区样式优化 */
+.form-content {
+ display: flex;
+ flex-direction: column;
+ padding-bottom: 1em !important;
+}
+
+.ui.form {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.ui.form .field {
+ margin-bottom: 1em;
+}
+
+.ui.form textarea {
+ min-height: 80px;
+ resize: vertical;
+}
+
+/* 自动拉伸中间区域 */
+.ui.form .field:nth-child(2) textarea {
+ flex-grow: 2;
+}
+
+/* 优化按钮间距与布局 */
+.button-fields {
+ margin-top: auto !important;
+ margin-bottom: 0 !important;
+}
+
+.button-fields .field {
+ padding: 0 !important;
+ margin-bottom: 0.75em !important; /* 增加了按钮间间距 */
+}
+
+.button-fields .field:last-child {
+ margin-bottom: 0 !important;
+}
+
+/* 优化按钮容器 */
+.button-container {
+ margin-top: auto !important;
+ padding: 0 !important;
+}
+
+/* 按钮间距调整 */
+.ui.two.buttons {
+ gap: 10px; /* 增加按钮之间的间距 */
+ display: flex;
+}
+
+/* 确保按钮宽度相等 */
+.ui.two.buttons .button {
+ margin: 0 !important;
+ flex: 1;
+}
+
+/* 为打印按钮添加一点视觉区分 */
+#printBtn {
+ box-shadow: none !important;
+ border: 1px solid #e0e1e2 !important;
+ background-color: #f8f9fa !important;
+}
+
+#printBtn:hover {
+ background-color: #e9ecef !important;
+}
+
+/* 打印样式 */
+@media print {
+ @page {
+ size: A4 portrait;
+ margin: 0;
+ }
+
+ html, body {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: #fff;
+ }
+
+ .ui.container, .ui.grid, .ui.basic.segment {
+ display: none !important;
+ }
+
+ /* 显示打印容器 */
+ #print-container {
+ display: block !important;
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 9999;
+ background: white;
+ }
+
+ #print-container canvas {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ max-width: 90%;
+ max-height: 90%;
+ height: auto !important;
+ }
+}
+
+/* 打印专用容器(正常不显示) */
+#print-container {
+ display: none;
+}