pengjing 11 months ago
parent
commit
6d33b06a51

+ 134 - 1
h5app/package-lock.json

@@ -24,7 +24,9 @@
         "pinia": "~2.0.18",
         "vue": "^3.2.47",
         "vue-baidu-map-3x": "^1.0.31",
-        "vue-router": "^4.1.6"
+        "vue-qrcode-reader": "^5.5.3",
+        "vue-router": "^4.1.6",
+        "vue3-qr-reader": "^1.0.0"
       },
       "devDependencies": {
         "@types/jest": "^27.0.2",
@@ -2800,6 +2802,16 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/dom-webcodecs": {
+      "version": "0.1.11",
+      "resolved": "https://registry.npmmirror.com/@types/dom-webcodecs/-/dom-webcodecs-0.1.11.tgz",
+      "integrity": "sha512-yPEZ3z7EohrmOxbk/QTAa0yonMFkNkjnVXqbGb7D4rMr+F1dGQ8ZUFxXkyLLJuiICPejZ0AZE9Rrk9wUCczx4A=="
+    },
+    "node_modules/@types/emscripten": {
+      "version": "1.39.10",
+      "resolved": "https://registry.npmmirror.com/@types/emscripten/-/emscripten-1.39.10.tgz",
+      "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw=="
+    },
     "node_modules/@types/eslint": {
       "version": "8.21.0",
       "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==",
@@ -4857,6 +4869,15 @@
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
+    "node_modules/barcode-detector": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/barcode-detector/-/barcode-detector-2.2.2.tgz",
+      "integrity": "sha512-JcSekql+EV93evfzF9zBr+Y6aRfkR+QFvgyzbwQ0dbymZXoAI9+WgT7H1E429f+3RKNncHz2CW98VQtaaKpmfQ==",
+      "dependencies": {
+        "@types/dom-webcodecs": "^0.1.11",
+        "zxing-wasm": "1.1.3"
+      }
+    },
     "node_modules/base64-js": {
       "version": "1.5.1",
       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
@@ -11101,6 +11122,11 @@
         "verror": "1.10.0"
       }
     },
+    "node_modules/jsqr": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/jsqr/-/jsqr-1.4.0.tgz",
+      "integrity": "sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A=="
+    },
     "node_modules/kind-of": {
       "version": "3.2.2",
       "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
@@ -13767,6 +13793,11 @@
         "node": ">= 8.9.0"
       }
     },
+    "node_modules/sdp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/sdp/-/sdp-3.2.0.tgz",
+      "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw=="
+    },
     "node_modules/select-hose": {
       "version": "2.0.0",
       "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
@@ -15402,6 +15433,18 @@
         "node": ">=8"
       }
     },
+    "node_modules/vue-qrcode-reader": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmmirror.com/vue-qrcode-reader/-/vue-qrcode-reader-5.5.3.tgz",
+      "integrity": "sha512-ZR+3axFuW1rxrBZXhkmH+4x6c7JqYLkrYuBmwKLve2eEVZb3LiuYJdW7HZaWqvuuOo1uMjqFe3MqyFOf4/BGyA==",
+      "dependencies": {
+        "barcode-detector": "2.2.2",
+        "webrtc-adapter": "8.2.3"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
     "node_modules/vue-router": {
       "version": "4.1.6",
       "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==",
@@ -15431,6 +15474,14 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
     },
+    "node_modules/vue3-qr-reader": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/vue3-qr-reader/-/vue3-qr-reader-1.0.0.tgz",
+      "integrity": "sha512-BRgmR+lDPkNwgL6skSaEOGFg4Aup/FLYnOGFCV0knYHxfbAnliJN/+wr//iqD2G3EOBrXw4TPGNfj/5Wxl7wwQ==",
+      "dependencies": {
+        "jsqr": "^1.4.0"
+      }
+    },
     "node_modules/w3c-hr-time": {
       "version": "1.0.2",
       "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
@@ -15871,6 +15922,18 @@
         "node": ">=6"
       }
     },
+    "node_modules/webrtc-adapter": {
+      "version": "8.2.3",
+      "resolved": "https://registry.npmmirror.com/webrtc-adapter/-/webrtc-adapter-8.2.3.tgz",
+      "integrity": "sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==",
+      "dependencies": {
+        "sdp": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=6.0.0",
+        "npm": ">=3.10.0"
+      }
+    },
     "node_modules/websocket-driver": {
       "version": "0.7.4",
       "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
@@ -16219,6 +16282,14 @@
       "version": "2.1.2",
       "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
       "dev": true
+    },
+    "node_modules/zxing-wasm": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/zxing-wasm/-/zxing-wasm-1.1.3.tgz",
+      "integrity": "sha512-MYm9k/5YVs4ZOTIFwlRjfFKD0crhefgbnt1+6TEpmKUDFp3E2uwqGSKwQOd2hOIsta/7Usq4hnpNRYTLoljnfA==",
+      "dependencies": {
+        "@types/emscripten": "^1.39.10"
+      }
     }
   },
   "dependencies": {
@@ -18238,6 +18309,16 @@
         "@types/node": "*"
       }
     },
+    "@types/dom-webcodecs": {
+      "version": "0.1.11",
+      "resolved": "https://registry.npmmirror.com/@types/dom-webcodecs/-/dom-webcodecs-0.1.11.tgz",
+      "integrity": "sha512-yPEZ3z7EohrmOxbk/QTAa0yonMFkNkjnVXqbGb7D4rMr+F1dGQ8ZUFxXkyLLJuiICPejZ0AZE9Rrk9wUCczx4A=="
+    },
+    "@types/emscripten": {
+      "version": "1.39.10",
+      "resolved": "https://registry.npmmirror.com/@types/emscripten/-/emscripten-1.39.10.tgz",
+      "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw=="
+    },
     "@types/eslint": {
       "version": "8.21.0",
       "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==",
@@ -19860,6 +19941,15 @@
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
+    "barcode-detector": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/barcode-detector/-/barcode-detector-2.2.2.tgz",
+      "integrity": "sha512-JcSekql+EV93evfzF9zBr+Y6aRfkR+QFvgyzbwQ0dbymZXoAI9+WgT7H1E429f+3RKNncHz2CW98VQtaaKpmfQ==",
+      "requires": {
+        "@types/dom-webcodecs": "^0.1.11",
+        "zxing-wasm": "1.1.3"
+      }
+    },
     "base64-js": {
       "version": "1.5.1",
       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
@@ -24735,6 +24825,11 @@
         "verror": "1.10.0"
       }
     },
+    "jsqr": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/jsqr/-/jsqr-1.4.0.tgz",
+      "integrity": "sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A=="
+    },
     "kind-of": {
       "version": "3.2.2",
       "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
@@ -26731,6 +26826,11 @@
         "ajv-keywords": "^3.5.2"
       }
     },
+    "sdp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/sdp/-/sdp-3.2.0.tgz",
+      "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw=="
+    },
     "select-hose": {
       "version": "2.0.0",
       "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
@@ -27979,6 +28079,15 @@
         }
       }
     },
+    "vue-qrcode-reader": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmmirror.com/vue-qrcode-reader/-/vue-qrcode-reader-5.5.3.tgz",
+      "integrity": "sha512-ZR+3axFuW1rxrBZXhkmH+4x6c7JqYLkrYuBmwKLve2eEVZb3LiuYJdW7HZaWqvuuOo1uMjqFe3MqyFOf4/BGyA==",
+      "requires": {
+        "barcode-detector": "2.2.2",
+        "webrtc-adapter": "8.2.3"
+      }
+    },
     "vue-router": {
       "version": "4.1.6",
       "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==",
@@ -28007,6 +28116,14 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
     },
+    "vue3-qr-reader": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/vue3-qr-reader/-/vue3-qr-reader-1.0.0.tgz",
+      "integrity": "sha512-BRgmR+lDPkNwgL6skSaEOGFg4Aup/FLYnOGFCV0knYHxfbAnliJN/+wr//iqD2G3EOBrXw4TPGNfj/5Wxl7wwQ==",
+      "requires": {
+        "jsqr": "^1.4.0"
+      }
+    },
     "w3c-hr-time": {
       "version": "1.0.2",
       "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
@@ -28350,6 +28467,14 @@
       "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==",
       "dev": true
     },
+    "webrtc-adapter": {
+      "version": "8.2.3",
+      "resolved": "https://registry.npmmirror.com/webrtc-adapter/-/webrtc-adapter-8.2.3.tgz",
+      "integrity": "sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==",
+      "requires": {
+        "sdp": "^3.2.0"
+      }
+    },
     "websocket-driver": {
       "version": "0.7.4",
       "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
@@ -28618,6 +28743,14 @@
           "dev": true
         }
       }
+    },
+    "zxing-wasm": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/zxing-wasm/-/zxing-wasm-1.1.3.tgz",
+      "integrity": "sha512-MYm9k/5YVs4ZOTIFwlRjfFKD0crhefgbnt1+6TEpmKUDFp3E2uwqGSKwQOd2hOIsta/7Usq4hnpNRYTLoljnfA==",
+      "requires": {
+        "@types/emscripten": "^1.39.10"
+      }
     }
   }
 }

+ 3 - 1
h5app/package.json

@@ -27,7 +27,9 @@
     "pinia": "~2.0.18",
     "vue": "^3.2.47",
     "vue-baidu-map-3x": "^1.0.31",
-    "vue-router": "^4.1.6"
+    "vue-qrcode-reader": "^5.5.3",
+    "vue-router": "^4.1.6",
+    "vue3-qr-reader": "^1.0.0"
   },
   "devDependencies": {
     "@types/jest": "^27.0.2",

+ 257 - 0
h5app/src/components/bQrScan.vue

@@ -0,0 +1,257 @@
+<template>
+
+  <div class="content">
+    <div class="scan">
+      <qr-stream v-if="isScan" @decode="onDecode" class="mb"> //摄像头扫码识别
+        <!--      <div style="color: red;" class="frame"></div>-->
+        <div class="box">
+          <div class="line"></div>
+          <div class="angle"></div>
+        </div>
+      </qr-stream>
+
+    </div>
+    <button @click="onScan">开始扫描</button>
+
+    <span> 扫描结果:{{data}}</span>
+  </div>
+
+</template>
+<script>
+import { defineComponent, reactive, toRefs,ref } from 'vue'
+import { QrStream, QrCapture, QrDropzone } from 'vue3-qr-reader'
+
+export default defineComponent({
+  // eslint-disable-next-line vue/no-unused-components
+  components: { QrStream,QrCapture,QrDropzone },
+  name: 'b-qr-scan',
+  setup() {
+    const isScan = ref(false);
+    const state = reactive({
+      data: null
+    });
+
+    function onScan(){
+      isScan.value=true;
+    }
+
+    function onDecode(data) {
+      state.data = data;
+      isScan.value=false;
+    }
+    return {
+      ...toRefs(state),
+      onScan,
+      onDecode,
+      isScan
+    }
+  }
+})
+</script>
+
+<!--
+<template>
+  <div class="scan">
+    <qrcode-stream
+        :camera="camera"
+        @decode="onDecode"
+        @init="onInit"
+        style="height: 100vh;"
+    >
+      <div>
+        <div class="qr-scanner">
+          <div class="box">
+            <div class="line"></div>
+            <div class="angle"></div>
+          </div>
+        </div>
+      </div>
+    </qrcode-stream>
+  </div>
+</template>
+<script>
+import { QrcodeStream } from "vue-qrcode-reader";
+export default {
+  // 注册
+  components: { QrcodeStream },
+  name: 'b-qr-scan',
+  data() {
+    return {
+      camera: "auto",
+      result: "", // 扫码结果信息
+      error: "" // 错误信息
+    };
+  },
+  methods: {
+    //回调扫描结果
+    onDecode(result) {
+      if (result !== "") {
+        this.$emit("ok", result);
+      }
+    },
+    // 检查是否调用摄像头
+    async onInit(promise) {
+      try {
+        const { capabilities } = await promise;
+        console.log(
+            "🚀 ~ file: cameracomponent.vue:47 ~ onInit ~ capabilities",
+            capabilities
+        );
+      } catch (error) {
+        // console.log()
+        this.$toast(error.name);
+        if (error.name === "NotAllowedError") {
+          this.error = "ERROR: 您需要授予相机访问权限";
+        } else if (error.name === "NotFoundError") {
+          this.error = "ERROR: 这个设备上没有摄像头";
+        } else if (error.name === "NotSupportedError") {
+          this.error = "ERROR: 所需的安全上下文(HTTPS、本地主机)";
+        } else if (error.name === "NotReadableError") {
+          this.error = "ERROR: 相机被占用";
+        } else if (error.name === "OverconstrainedError") {
+          this.error = "ERROR: 安装摄像头不合适";
+        } else if (error.name === "StreamApiNotSupportedError") {
+          this.error = "ERROR: 此浏览器不支持流API";
+        } else if (error.name === "InsecureContextError") {
+          this.error =
+              "ERROR: 仅允许在安全上下文中访问摄像机。使用HTTPS或本地主机,而不是HTTP。";
+        } else {
+          this.error = "ERROR:摄像机错误";
+        }
+
+        this.$emit("err", this.error);
+      }
+    }
+  }
+};
+</script>
+<style scoped>
+.error {
+  font-weight: bold;
+  color: red;
+}
+</style>-->
+<style scoped>
+.scan {
+  width: 100vw;
+  border-color: #585858;
+  position: fixed;
+  top: 0;
+  left: 0;
+}
+.qrcode-stream-camera {
+  width: 100%;
+  height: 100%;
+  display: block;
+  -o-object-fit: cover;
+  object-fit: cover;
+  position: absolute;
+  top: 0%;
+  left: 0%;
+}
+
+.qr-scanner {
+  background-image: linear-gradient(
+      0deg,
+      transparent 24%,
+      rgba(32, 255, 77, 0.1) 25%,
+      rgba(32, 255, 77, 0.1) 26%,
+      transparent 27%,
+      transparent 74%,
+      rgba(32, 255, 77, 0.1) 75%,
+      rgba(32, 255, 77, 0.1) 76%,
+      transparent 77%,
+      transparent
+  ),
+  linear-gradient(
+      90deg,
+      transparent 24%,
+      rgba(32, 255, 77, 0.1) 25%,
+      rgba(32, 255, 77, 0.1) 26%,
+      transparent 27%,
+      transparent 74%,
+      rgba(32, 255, 77, 0.1) 75%,
+      rgba(32, 255, 77, 0.1) 76%,
+      transparent 77%,
+      transparent
+  );
+  background-size: 3rem 3rem;
+  background-position: -1rem -1rem;
+  width: 100%;
+  /* height: 100%; */
+  height: 100vh;
+  position: relative;
+  /* background-color: #1110;*/
+
+  /* background-color: #111; */
+}
+
+.qr-scanner .box {
+  width: 213px;
+  height: 213px;
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  transform: translate(-50%, -50%);
+  overflow: hidden;
+  border: 0.1rem solid rgba(0, 255, 51, 0.2);
+  /* background: url('http://resource.beige.world/imgs/gongconghao.png') no-repeat center center; */
+}
+
+.qr-scanner .line {
+  height: calc(100% - 2px);
+  width: 100%;
+  background: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%);
+  border-bottom: 3px solid #00ff33;
+  transform: translateY(-100%);
+  animation: radar-beam 2s infinite alternate;
+  animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99);
+  animation-delay: 1.4s;
+}
+
+.qr-scanner .box:after,
+.qr-scanner .box:before,
+.qr-scanner .angle:after,
+.qr-scanner .angle:before {
+  content: "";
+  display: block;
+  position: absolute;
+  width: 3vw;
+  height: 3vw;
+  border: 0.2rem solid transparent;
+}
+
+.qr-scanner .box:after,
+.qr-scanner .box:before {
+  top: 0;
+  border-top-color: #00ff33;
+}
+
+.qr-scanner .angle:after,
+.qr-scanner .angle:before {
+  bottom: 0;
+  border-bottom-color: #00ff33;
+}
+
+.qr-scanner .box:before,
+.qr-scanner .angle:before {
+  left: 0;
+  border-left-color: #00ff33;
+}
+
+.qr-scanner .box:after,
+.qr-scanner .angle:after {
+  right: 0;
+  border-right-color: #00ff33;
+}
+
+@keyframes radar-beam {
+  0% {
+    transform: translateY(-100%);
+  }
+
+  100% {
+    transform: translateY(0);
+  }
+}
+</style>

+ 6 - 0
h5app/src/views/pages/demo/edit.vue

@@ -88,15 +88,21 @@
            </ion-list>
          </div>
        </div>
+<!--       <div>
+         <b-qr-scan></b-qr-scan>
+       </div>-->
      </ion-content>
 
    </ion-page>
 </template>
 <script>
 import {defineComponent} from "vue";
+import BQrScan from "@/components/bQrScan.vue";
 
 export default defineComponent({
   name:"demo_edit",
+  // eslint-disable-next-line vue/no-unused-components
+  components:{BQrScan},
   setup(){
     return {}
   }

+ 12 - 0
pom.xml

@@ -152,6 +152,18 @@
             <artifactId>pinyin4j</artifactId>
             <version>2.5.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.4.0</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.4.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 0
src/main/java/com/hz/employmentsite/config/WebConfiguration.java

@@ -60,6 +60,7 @@ public class WebConfiguration implements WebMvcConfigurer {
         excludePath.add("/api/oauth/getToken");//单点登录
         excludePath.add("/api/oauth/oauthLogin");//单点登录
         excludePath.add("/api/system/file/downFileToUrl/**");  //下载附件
+        excludePath.add("/api/common/getQRCode");
         excludePath.add("/static/**");  //静态资源
         excludePath.add("/mobile/**");  //静态资源
         excludePath.add("/web/**");  //静态资源

+ 35 - 0
src/main/java/com/hz/employmentsite/controller/CommonController.java

@@ -1,15 +1,26 @@
 package com.hz.employmentsite.controller;
 
+import com.github.pagehelper.PageInfo;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.hz.employmentsite.filter.exception.BaseResponse;
+import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.util.JsonMapper;
+import com.hz.employmentsite.vo.baseSettings.SiteInfoVo;
 import lombok.Data;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/api/common")
@@ -61,5 +72,29 @@ public class CommonController {
         public List<HashMap<String, String>> dataList;
     }
 
+    @ResponseBody
+    @GetMapping("/getQRCode")
+    public BaseResponse<String> getQRCode(HttpServletResponse response, @RequestParam("code") String code) {
+        BaseResponse<String> res = new BaseResponse<>();
+        int width = 400, height = 400;
+        String format = "png", character_set = "UTF-8";
+
+        response.setContentType("image/" + format);
+
+        // 设置字符集编码
+        Map<EncodeHintType, Object> hints = new HashMap<>();
+        hints.put(EncodeHintType.CHARACTER_SET, character_set);
+        try {
+            // 生成二维码矩阵
+            BitMatrix bitMatrix = new MultiFormatWriter().encode(code, BarcodeFormat.QR_CODE, width, height, hints);
+            OutputStream os = response.getOutputStream();
+            MatrixToImageWriter.writeToStream(bitMatrix, format, os);
+            RespGenerstor.success(code);
+        } catch (Exception ex) {
+            RespGenerstor.fail("qrcode",ex.getMessage());
+        }
+        return res;
+    }
+
 
 }