Quellcode durchsuchen

修改二维码

zs vor 1 Jahr
Ursprung
Commit
29e6792454
6 geänderte Dateien mit 344 neuen und 25 gelöschten Zeilen
  1. 230 20
      package-lock.json
  2. 1 0
      package.json
  3. 28 1
      src/views/doctor/index.vue
  4. 29 2
      src/views/group/index.vue
  5. 28 1
      src/views/nurse/index.vue
  6. 28 1
      src/views/patient/index.vue

+ 230 - 20
package-lock.json

@@ -20,6 +20,7 @@
         "naf-core": "^0.1.2",
         "pinia": "^2.1.6",
         "vue": "^3.3.4",
+        "vue-qr": "^4.0.9",
         "vue-router": "^4.2.4",
         "vuex": "^4.1.0"
       },
@@ -1843,8 +1844,7 @@
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     },
     "node_modules/big-integer": {
       "version": "1.6.51",
@@ -2182,6 +2182,20 @@
         }
       }
     },
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/deep-is": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -3015,8 +3029,7 @@
     "node_modules/fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "node_modules/fsevents": {
       "version": "2.3.3",
@@ -3396,7 +3409,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "dev": true,
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -3405,8 +3417,7 @@
     "node_modules/inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "node_modules/internal-slot": {
       "version": "1.0.5",
@@ -3805,6 +3816,11 @@
         "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
+    "node_modules/js-binary-schema-parser": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz",
+      "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg=="
+    },
     "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -4075,6 +4091,17 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -4453,7 +4480,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dev": true,
       "dependencies": {
         "wrappy": "1"
       }
@@ -4550,6 +4576,11 @@
         "node": ">=6"
       }
     },
+    "node_modules/parenthesis": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz",
+      "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw=="
+    },
     "node_modules/parse-json": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
@@ -5293,6 +5324,49 @@
       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "dev": true
     },
+    "node_modules/simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
     "node_modules/slash": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -5397,6 +5471,14 @@
       "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
       "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
     },
+    "node_modules/string-split-by": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz",
+      "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==",
+      "dependencies": {
+        "parenthesis": "^3.1.5"
+      }
+    },
     "node_modules/string.prototype.padend": {
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz",
@@ -5973,6 +6055,54 @@
         "node": ">=4.0"
       }
     },
+    "node_modules/vue-qr": {
+      "version": "4.0.9",
+      "resolved": "https://registry.npmjs.org/vue-qr/-/vue-qr-4.0.9.tgz",
+      "integrity": "sha512-pAISV94T0MNEYA3NGjykUpsXRE2QfaNxlu9ZhEL6CERgqNc21hJYuP3hRVzAWfBQlgO18DPmZTbrFerJC3+Ikw==",
+      "dependencies": {
+        "glob": "^8.0.1",
+        "js-binary-schema-parser": "^2.0.2",
+        "simple-get": "^4.0.1",
+        "string-split-by": "^1.0.0"
+      }
+    },
+    "node_modules/vue-qr/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/vue-qr/node_modules/glob": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^5.0.1",
+        "once": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/vue-qr/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/vue-router": {
       "version": "4.2.4",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz",
@@ -6155,8 +6285,7 @@
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "node_modules/xml-name-validator": {
       "version": "4.0.0",
@@ -7447,8 +7576,7 @@
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     },
     "big-integer": {
       "version": "1.6.51",
@@ -7684,6 +7812,14 @@
         "ms": "2.1.2"
       }
     },
+    "decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "requires": {
+        "mimic-response": "^3.1.0"
+      }
+    },
     "deep-is": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -8327,8 +8463,7 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "fsevents": {
       "version": "2.3.3",
@@ -8591,7 +8726,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -8600,8 +8734,7 @@
     "inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "internal-slot": {
       "version": "1.0.5",
@@ -8869,6 +9002,11 @@
         }
       }
     },
+    "js-binary-schema-parser": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz",
+      "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg=="
+    },
     "js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -9090,6 +9228,11 @@
       "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
       "dev": true
     },
+    "mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+    },
     "minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -9379,7 +9522,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -9446,6 +9588,11 @@
         "callsites": "^3.0.0"
       }
     },
+    "parenthesis": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz",
+      "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw=="
+    },
     "parse-json": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
@@ -9898,6 +10045,21 @@
       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "dev": true
     },
+    "simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+    },
+    "simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "requires": {
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
     "slash": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -9987,6 +10149,14 @@
       "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
       "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
     },
+    "string-split-by": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz",
+      "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==",
+      "requires": {
+        "parenthesis": "^3.1.5"
+      }
+    },
     "string.prototype.padend": {
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz",
@@ -10350,6 +10520,47 @@
         }
       }
     },
+    "vue-qr": {
+      "version": "4.0.9",
+      "resolved": "https://registry.npmjs.org/vue-qr/-/vue-qr-4.0.9.tgz",
+      "integrity": "sha512-pAISV94T0MNEYA3NGjykUpsXRE2QfaNxlu9ZhEL6CERgqNc21hJYuP3hRVzAWfBQlgO18DPmZTbrFerJC3+Ikw==",
+      "requires": {
+        "glob": "^8.0.1",
+        "js-binary-schema-parser": "^2.0.2",
+        "simple-get": "^4.0.1",
+        "string-split-by": "^1.0.0"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "glob": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+          "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^5.0.1",
+            "once": "^1.3.0"
+          }
+        },
+        "minimatch": {
+          "version": "5.1.6",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+          "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
+      }
+    },
     "vue-router": {
       "version": "4.2.4",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz",
@@ -10481,8 +10692,7 @@
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "xml-name-validator": {
       "version": "4.0.0",

+ 1 - 0
package.json

@@ -24,6 +24,7 @@
     "naf-core": "^0.1.2",
     "pinia": "^2.1.6",
     "vue": "^3.3.4",
+    "vue-qr": "^4.0.9",
     "vue-router": "^4.2.4",
     "vuex": "^4.1.0"
   },

+ 28 - 1
src/views/doctor/index.vue

@@ -30,6 +30,12 @@
             </template>
           </cForm>
         </el-col>
+        <el-col :span="24" class="dialog_two" v-if="dialog.type == '2'">
+          <el-col :span="24">
+            <vue-qr ref="qrcode" :text="code" :size="200" :margin="10" />
+          </el-col>
+          <el-button type="primary" @click="downloadQR(form)">下载二维码</el-button>
+        </el-col>
       </template>
     </cDialog>
   </div>
@@ -37,10 +43,12 @@
 
 <script setup lang="ts">
 // 基础
+import moment from 'moment';
 import type { FormRules } from 'element-plus';
 import type { Ref } from 'vue';
 import { ref, onMounted, getCurrentInstance, reactive } from 'vue';
 import { ElMessage } from 'element-plus';
+import vueQr from 'vue-qr/src/packages/vue-qr.vue';
 // 接口
 import { DoctorStore } from '@/stores/users/doctor';
 import type { IQueryResult } from '@/util/types.util';
@@ -83,6 +91,9 @@ const rules = reactive<FormRules>({
   title: [{ required: true, message: '请输入职务', trigger: 'blur' }],
   post: [{ required: true, message: '请输入职称', trigger: 'blur' }]
 });
+// 二维码
+const code: Ref<any> = ref('');
+const qrcode = ref<HTMLElement>();
 // 请求
 onMounted(async () => {
   loading.value = true;
@@ -154,7 +165,20 @@ const toEdit = async (data: any) => {
 };
 // 绑定微信
 const toCode = async (data: any) => {
-  console.log(data);
+  code.value = `${import.meta.env.VITE_APP_HOST}/login?id=${data._id}&type=${'doctor'}`;
+  form.value = data;
+  dialog.value = { title: '绑定/更换绑定微信', show: true, type: '2' };
+};
+// 下载二维码
+const downloadQR = (data: any) => {
+  const downloadLink = document.createElement('a');
+  // 下载的文件名
+  downloadLink.download = data.name || moment().valueOf().toString();
+  // 将proxy对象转化为可取属性值的对象
+  let t = JSON.parse(JSON.stringify(qrcode.value));
+  // url
+  downloadLink.href = t.imgUrl;
+  downloadLink.click();
 };
 // 删除
 const toDel = async (data: any) => {
@@ -177,4 +201,7 @@ const toClose = () => {
     margin: 0 0 10px 0;
   }
 }
+.dialog_two {
+  text-align: center;
+}
 </style>

+ 29 - 2
src/views/group/index.vue

@@ -26,6 +26,12 @@
             </template>
           </cForm>
         </el-col>
+        <el-col :span="24" class="dialog_two" v-if="dialog.type == '2'">
+          <el-col :span="24">
+            <vue-qr ref="qrcode" :text="code" :size="200" :margin="10" />
+          </el-col>
+          <el-button type="primary" @click="downloadQR(form)">下载二维码</el-button>
+        </el-col>
       </template>
     </cDialog>
   </div>
@@ -33,11 +39,13 @@
 
 <script setup lang="ts">
 // 基础
+import moment from 'moment';
 import store from '@/stores/counter';
 import type { FormRules } from 'element-plus';
 import type { Ref } from 'vue';
 import { ref, onMounted, getCurrentInstance, reactive } from 'vue';
 import { ElMessage } from 'element-plus';
+import vueQr from 'vue-qr/src/packages/vue-qr.vue';
 // 接口
 import { GroupStore } from '@/stores/other/group';
 import { DoctorStore } from '@/stores/users/doctor';
@@ -78,6 +86,9 @@ const rules = reactive<FormRules>({
   name: [{ required: true, message: '请输入群组名称', trigger: 'blur' }],
   doctor: [{ required: true, message: '请选择管理医生', trigger: 'blur' }]
 });
+// 二维码
+const code: Ref<any> = ref('');
+const qrcode = ref<HTMLElement>();
 // 请求
 onMounted(async () => {
   loading.value = true;
@@ -129,9 +140,22 @@ const toEdit = async (data: any) => {
     dialog.value = { title: '信息管理', show: true, type: '1' };
   }
 };
-// 群二维码
+// 绑定微信
 const toCode = async (data: any) => {
-  console.log(data);
+  code.value = `${import.meta.env.VITE_APP_HOST}/login?id=${data._id}&type=${'group'}`;
+  form.value = data;
+  dialog.value = { title: '绑定/更换绑定微信', show: true, type: '2' };
+};
+// 下载二维码
+const downloadQR = (data: any) => {
+  const downloadLink = document.createElement('a');
+  // 下载的文件名
+  downloadLink.download = data.name || moment().valueOf().toString();
+  // 将proxy对象转化为可取属性值的对象
+  let t = JSON.parse(JSON.stringify(qrcode.value));
+  // url
+  downloadLink.href = t.imgUrl;
+  downloadLink.click();
 };
 // 群成员
 const toPerson = async (data: any) => {
@@ -171,4 +195,7 @@ const searchOther = async () => {
     margin: 0 0 10px 0;
   }
 }
+.dialog_two {
+  text-align: center;
+}
 </style>

+ 28 - 1
src/views/nurse/index.vue

@@ -37,6 +37,12 @@
             </template>
           </cForm>
         </el-col>
+        <el-col :span="24" class="dialog_two" v-if="dialog.type == '2'">
+          <el-col :span="24">
+            <vue-qr ref="qrcode" :text="code" :size="200" :margin="10" />
+          </el-col>
+          <el-button type="primary" @click="downloadQR(form)">下载二维码</el-button>
+        </el-col>
       </template>
     </cDialog>
   </div>
@@ -44,11 +50,13 @@
 
 <script setup lang="ts">
 // 基础
+import moment from 'moment';
 import store from '@/stores/counter';
 import type { FormRules } from 'element-plus';
 import type { Ref } from 'vue';
 import { ref, onMounted, getCurrentInstance, reactive } from 'vue';
 import { ElMessage } from 'element-plus';
+import vueQr from 'vue-qr/src/packages/vue-qr.vue';
 // 接口
 import { NurseStore } from '@/stores/users/nurse';
 import { DoctorStore } from '@/stores/users/doctor';
@@ -97,6 +105,9 @@ const rules = reactive<FormRules>({
   title: [{ required: true, message: '请输入职务', trigger: 'blur' }],
   post: [{ required: true, message: '请输入职称', trigger: 'blur' }]
 });
+// 二维码
+const code: Ref<any> = ref('');
+const qrcode = ref<HTMLElement>();
 // 请求
 onMounted(async () => {
   loading.value = true;
@@ -179,7 +190,20 @@ const toEdit = async (data: any) => {
 };
 // 绑定微信
 const toCode = async (data: any) => {
-  console.log(data);
+  code.value = `${import.meta.env.VITE_APP_HOST}/login?id=${data._id}&type=${'nurse'}`;
+  form.value = data;
+  dialog.value = { title: '绑定/更换绑定微信', show: true, type: '2' };
+};
+// 下载二维码
+const downloadQR = (data: any) => {
+  const downloadLink = document.createElement('a');
+  // 下载的文件名
+  downloadLink.download = data.name || moment().valueOf().toString();
+  // 将proxy对象转化为可取属性值的对象
+  let t = JSON.parse(JSON.stringify(qrcode.value));
+  // url
+  downloadLink.href = t.imgUrl;
+  downloadLink.click();
 };
 // 删除
 const toDel = async (data: any) => {
@@ -215,4 +239,7 @@ const searchOther = async () => {
     margin: 0 0 10px 0;
   }
 }
+.dialog_two {
+  text-align: center;
+}
 </style>

+ 28 - 1
src/views/patient/index.vue

@@ -33,6 +33,12 @@
             </template>
           </cForm>
         </el-col>
+        <el-col :span="24" class="dialog_two" v-if="dialog.type == '2'">
+          <el-col :span="24">
+            <vue-qr ref="qrcode" :text="code" :size="200" :margin="10" />
+          </el-col>
+          <el-button type="primary" @click="downloadQR(form)">下载二维码</el-button>
+        </el-col>
       </template>
     </cDialog>
   </div>
@@ -40,10 +46,12 @@
 
 <script setup lang="ts">
 // 基础
+import moment from 'moment';
 import type { FormRules } from 'element-plus';
 import type { Ref } from 'vue';
 import { ref, onMounted, getCurrentInstance, reactive } from 'vue';
 import { ElMessage } from 'element-plus';
+import vueQr from 'vue-qr/src/packages/vue-qr.vue';
 // 接口
 import { PatientStore } from '@/stores/users/patient';
 import type { IQueryResult } from '@/util/types.util';
@@ -102,6 +110,9 @@ const genderList: Ref<any> = ref([
   { label: '男', value: '男' },
   { label: '女', value: '女' }
 ]);
+// 二维码
+const code: Ref<any> = ref('');
+const qrcode = ref<HTMLElement>();
 // 请求
 onMounted(async () => {
   loading.value = true;
@@ -148,7 +159,20 @@ const toEdit = async (data: any) => {
 };
 // 绑定微信
 const toCode = async (data: any) => {
-  console.log(data);
+  code.value = `${import.meta.env.VITE_APP_HOST}/login?id=${data._id}&type=${'nurse'}`;
+  form.value = data;
+  dialog.value = { title: '绑定/更换绑定微信', show: true, type: '2' };
+};
+// 下载二维码
+const downloadQR = (data: any) => {
+  const downloadLink = document.createElement('a');
+  // 下载的文件名
+  downloadLink.download = data.name || moment().valueOf().toString();
+  // 将proxy对象转化为可取属性值的对象
+  let t = JSON.parse(JSON.stringify(qrcode.value));
+  // url
+  downloadLink.href = t.imgUrl;
+  downloadLink.click();
 };
 // 删除
 const toDel = async (data: any) => {
@@ -171,4 +195,7 @@ const toClose = () => {
     margin: 0 0 10px 0;
   }
 }
+.dialog_two {
+  text-align: center;
+}
 </style>