Эх сурвалжийг харах

本地更新数据库中的faceSetToken

Michael Wang 6 жил өмнө
parent
commit
44953f16d8
8 өөрчлөгдсөн 141 нэмэгдсэн , 40 устгасан
  1. 6 1
      .env.local
  2. 6 1
      .env.production
  3. 7 1
      electronStart.js
  4. 59 0
      faceSetMySql.js
  5. 1 0
      package.json
  6. 27 23
      public/index.html
  7. 17 13
      src/views/index.vue
  8. 18 1
      yarn.lock

+ 6 - 1
.env.local

@@ -6,4 +6,9 @@ VUE_APP_UPYUN_OPERATOR=examcloud
 VUE_APP_UPYUN_PASSWORD=examcloud123456
 VUE_APP_UPYUN_SERVER=v0.api.upyun.com
 VUE_APP_UPYUN_BUCKET=exam-cloud-test
-VUE_APP_UPYUN_BUCKETURL=/exam-cloud-test/student_base_photo/
+VUE_APP_UPYUN_BUCKETURL=/exam-cloud-test/student_base_photo/
+
+VUE_APP_MYSQL_HOST=192.168.10.30
+VUE_APP_MYSQL_USER_NAME=root
+VUE_APP_MYSQL_PASSWORD=root
+VUE_APP_MYSQL_DATABASE=exam_cloud_test

+ 6 - 1
.env.production

@@ -6,4 +6,9 @@ VUE_APP_UPYUN_OPERATOR=examcloud
 VUE_APP_UPYUN_PASSWORD=examcloud123456
 VUE_APP_UPYUN_SERVER=v0.api.upyun.com
 VUE_APP_UPYUN_BUCKET=exam-cloud
-VUE_APP_UPYUN_BUCKETURL=/exam-cloud/student_base_photo/
+VUE_APP_UPYUN_BUCKETURL=/exam-cloud/student_base_photo/
+
+VUE_APP_MYSQL_HOST=rds7b2sll8un5kz99s0io.mysql.rds.aliyuncs.com
+VUE_APP_MYSQL_USER_NAME=exam_cloud
+VUE_APP_MYSQL_PASSWORD=examcloud123!@#
+VUE_APP_MYSQL_DATABASE=exam_cloud

+ 7 - 1
electronStart.js

@@ -6,7 +6,13 @@ let win;
 
 function createWindow() {
   // Create the browser window.
-  win = new BrowserWindow({ width: 800, height: 600 });
+  win = new BrowserWindow({
+    width: 800,
+    height: 600,
+    webPreferences: {
+      preload: require("path").join(__dirname, "faceSetMysql.js")
+    }
+  });
 
   // and load the index.html of the app.
   win.loadURL("http://localhost:8080");

+ 59 - 0
faceSetMySql.js

@@ -0,0 +1,59 @@
+const mysql = require("mysql");
+const connection = mysql.createConnection({
+  // host: process.env.VUE_APP_MYSQL_HOST,
+  // user: process.env.VUE_APP_MYSQL_USER_NAME,
+  // password: process.env.VUE_APP_MYSQL_PASSWORD,
+  // database: process.env.VUE_APP_MYSQL_DATABASE
+  host: "192.168.10.30",
+  user: "root",
+  password: "root",
+  database: "exam_cloud_test"
+});
+
+connection.connect(err => {
+  if (err) throw err;
+  console.log("Database Connected! " + process.env.VUE_APP_MYSQL_HOST);
+});
+
+function queryFaceSet() {
+  return new Promise((resolve, reject) => {
+    connection.query(
+      `SELECT faceset_token, face_count FROM ec_b_face_set order by face_count asc limit 1`,
+      (err, rows) => {
+        if (err) reject(err);
+        console.log(rows);
+
+        if (rows.length == 0) reject("无可用的faceset_token");
+        if (rows[0].face_count > 8000) {
+          reject("faceset_token最小的容量已经大于8000,无法继续。");
+        } else {
+          resolve(rows[0].faceset_token);
+        }
+      }
+    );
+  });
+}
+
+function updateFaceSet(faceset_token, face_count) {
+  return new Promise((resolve, reject) => {
+    connection.query(
+      `update ec_b_face_set set face_count = ? where faceset_token = ?`,
+      [face_count, faceset_token],
+      (err, result) => {
+        if (err) reject(err);
+
+        console.log(`AffectedRows ${result.affectedRows} row(s)`);
+        console.log(result);
+        console.log(`更新 ${faceset_token} 的face_count 为 ${face_count}`);
+        resolve(result);
+      }
+    );
+  });
+}
+
+// exports.queryFaceSet = queryFaceSet;
+// exports.updateFaceSet = updateFaceSet;
+window.DB = {
+  queryFaceSet,
+  updateFaceSet
+};

+ 1 - 0
package.json

@@ -17,6 +17,7 @@
     "electron": "^2.0.8",
     "js-base64": "^2.4.6",
     "js-md5": "^0.7.3",
+    "mysql": "^2.16.0",
     "vue": "^2.5.16",
     "vue-resource": "^1.5.1",
     "vue-router": "^3.0.1",

+ 27 - 23
public/index.html

@@ -1,25 +1,29 @@
 <!DOCTYPE html>
 <html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title>photo-upload</title>
-    <script type="text/javascript">
-    	if(typeof(require) != "undefined"){
-    		window.nodeRequire = require;
-				delete window.require;
-				delete window.exports;
-				delete window.module;
-    	}
-    </script>
-  </head>
-  <body>
-    <noscript>
-      <strong>We're sorry but examcloud-web-photo-upload doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
-    </noscript>
-    <div id="app"></div>
-    <!-- built files will be auto injected -->
-  </body>
-</html>
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+  <title>photo-upload</title>
+  <script type="text/javascript">
+    if (typeof (require) != "undefined") {
+      window.nodeRequire = require;
+      delete window.require;
+      delete window.exports;
+      delete window.module;
+    }
+  </script>
+</head>
+
+<body>
+  <noscript>
+    <strong>We're sorry but examcloud-web-photo-upload doesn't work properly without JavaScript enabled. Please enable it
+      to continue.</strong>
+  </noscript>
+  <div id="app"></div>
+  <!-- built files will be auto injected -->
+</body>
+
+</html>

+ 17 - 13
src/views/index.vue

@@ -63,13 +63,15 @@ function isImageFile(fileName) {
   );
 }
 
+// (async () => window.DB.updateFaceSet("fbd41e3e320f21c9f35467c268f86b4c", 22))();
+
 //读取文件,返回网站路径. 只扫描当前文件夹,不递归扫描
 function readImageFiles(folderPath) {
   const files = fs.readdirSync(folderPath);
   return files.filter(isImageFile).map(fileName => folderPath + "/" + fileName);
 }
 
-const CONCURRENCY = 2; //同时处理的照片数量
+const CONCURRENCY = 2; //同时处理的照片数量; 深夜增加并发
 
 export default {
   data() {
@@ -152,13 +154,9 @@ export default {
         );
         let faceToken = await this.detectFace(photoFile);
         if (this.faceSetToken == undefined) {
-          this.faceSetToken = (await this.getFaceSetToken()).data;
-        }
-        let result = await this.addFaceToSet(this.faceSetToken, faceToken);
-        if (result == 1) {
-          //当前faceset已满需要更换
-          this.faceSetToken = undefined;
+          this.faceSetToken = await this.getFaceSetToken();
         }
+        await this.addFaceToSet(this.faceSetToken, faceToken);
 
         const photoInfo = {
           studentId: studentFaceInfo.student.id,
@@ -222,7 +220,7 @@ export default {
     },
     //获取faceSetToken
     async getFaceSetToken() {
-      return this.$http.get("/api/ecs_core/faceSet/enableFaceSet");
+      return window.DB.queryFaceSet();
     },
     //faceToken加入faceSetToken
     async addFaceToSet(faceset_token, face_token) {
@@ -243,12 +241,18 @@ export default {
                 res.data.face_added
               }, res.data.face_count: ${res.data.face_count}`
             );
-            if (res.data.face_count < 8000) {
-              //faceset还有空余
-              resolve(2);
+            if (res.data.face_count > 8000) {
+              window.DB.updateFaceSet(faceset_token, res.data.face_count).then(
+                () => {
+                  this.faceSetToken = undefined;
+                  resolve();
+                },
+                err => {
+                  reject(err);
+                }
+              );
             } else {
-              //faceset已满
-              resolve(1);
+              resolve();
             }
           })
           .catch(err => {

+ 18 - 1
yarn.lock

@@ -1642,6 +1642,10 @@ big.js@^3.1.3:
   version "3.2.0"
   resolved "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
 
+bignumber.js@4.1.0:
+  version "4.1.0"
+  resolved "http://registry.npm.taobao.org/bignumber.js/download/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1"
+
 binary-extensions@^1.0.0:
   version "1.11.0"
   resolved "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
@@ -5671,6 +5675,15 @@ mute-stream@0.0.7:
   version "0.0.7"
   resolved "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
 
+mysql@^2.16.0:
+  version "2.16.0"
+  resolved "http://registry.npm.taobao.org/mysql/download/mysql-2.16.0.tgz#b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba"
+  dependencies:
+    bignumber.js "4.1.0"
+    readable-stream "2.3.6"
+    safe-buffer "5.1.2"
+    sqlstring "2.3.1"
+
 nan@^2.9.2:
   version "2.11.0"
   resolved "http://registry.npm.taobao.org/nan/download/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099"
@@ -6868,7 +6881,7 @@ read-pkg@^4.0.1:
     parse-json "^4.0.0"
     pify "^3.0.0"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6:
+"readable-stream@1 || 2", readable-stream@2.3.6, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6:
   version "2.3.6"
   resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
   dependencies:
@@ -7575,6 +7588,10 @@ sprintf-js@~1.0.2:
   version "1.0.3"
   resolved "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
 
+sqlstring@2.3.1:
+  version "2.3.1"
+  resolved "http://registry.npm.taobao.org/sqlstring/download/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40"
+
 sshpk@^1.7.0:
   version "1.14.2"
   resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"