Browse Source

✨ feat: 更新人脸上传功能

Pchen. 7 months ago
parent
commit
161a4db282
2 changed files with 61 additions and 11 deletions
  1. 28 2
      apis/Lepao/Face/BeginFaceReco.js
  2. 33 9
      apis/Upload/UploadFaceVideo.js

+ 28 - 2
apis/Lepao/Face/BeginFaceReco.js

@@ -1,6 +1,8 @@
 const API = require("../../../lib/API.js")
 const db = require("../../../plugin/DataBase/db.js")
 const axios = require('axios')
+const { v4: uuidv4 } = require('uuid')
+const Redis = require('../../../plugin/DataBase/Redis')
 const config = require('../../../config.json')
 const { BaseStdResponse } = require("../../../BaseStdResponse.js")
 
@@ -36,13 +38,29 @@ class BeginFaceReco extends API {
     }
 
     async onRequest(req, res) {
-        let { student_num, name } = req.body
+        let { student_num, name, captcha, id } = req.body
 
-        if ([student_num, name].some(value => value === '' || value === null || value === undefined))
+        if ([student_num, name, captcha, id].some(value => value === '' || value === null || value === undefined))
             return res.json({
                 ...BaseStdResponse.MISSING_PARAMETER
             })
 
+        try {
+            const code = await Redis.get(`captcha:${id}`)
+            if (!code || code != captcha.toLowerCase())
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '验证码错误或已过期!'
+                })
+            Redis.del(`captcha:${id}`);
+        } catch (err) {
+            this.logger.error(`验证图片验证码失败!${err.stack}`)
+            return res.json({
+                ...BaseStdResponse.DATABASE_ERR,
+                msg: '验证失败!'
+            })
+        }
+
         try {
             let sql = 'SELECT student_num, name, user_avatar, academy_name FROM lepao_account WHERE student_num = ? AND name = ?'
             let rows = await db.query(sql, [student_num, name])
@@ -59,8 +77,16 @@ class BeginFaceReco extends API {
 
             const face_img = await this.getImageBase64('https://lepao-cloud.xxoo365.top/view.php/d0b85269c3683ed48da1fc5e468108c7.jpg')
             // 此时应该从乐跑获取人脸照片
+            
+             const key = uuidv4()
+
+            await Redis.set(`faceReco:${rows[0].student_num}`, key, {
+                EX: 1800
+            })
+
             let resData = {
                 ...rows[0],
+                key,
                 face_img
             }
 

+ 33 - 9
apis/Upload/UploadFaceVideo.js

@@ -1,5 +1,7 @@
 const API = require("../../lib/API")
 const { v4: uuidv4 } = require('uuid')
+const Redis = require('../../plugin/DataBase/Redis')
+const db = require("../../plugin/DataBase/db.js")
 const { BaseStdResponse } = require("../../BaseStdResponse")
 const multer = require('multer')
 const path = require('path')
@@ -11,7 +13,7 @@ const storage = multer.diskStorage({
     destination: (req, file, cb) => {
         const { student_num } = req.body
         if (!student_num) {
-            return cb(new Error('缺少 student_num'))
+            return cb(new Error('缺少参数'))
         }
         const destPath = path.join('uploads', 'faces', student_num)
         fs.mkdirSync(destPath, { recursive: true }) // 确保目录存在
@@ -56,13 +58,13 @@ class UploadFaceVideo extends API {
                 this.logger.error(`视频上传失败!${err.stack || ''}`)
                 return res.json({
                     ...BaseStdResponse.ERR,
-                    msg: '视频上传失败!'
+                    msg: err.message ?? '视频上传失败!'
                 })
             }
 
-            const { student_num } = req.body
+            const { student_num, key } = req.body
 
-            if ([student_num].some(value => value === '' || value === null || value === undefined)) {
+            if ([student_num, key].some(value => value === '' || value === null || value === undefined)) {
                 return res.json({
                     ...BaseStdResponse.MISSING_PARAMETER
                 })
@@ -75,13 +77,35 @@ class UploadFaceVideo extends API {
                 })
             }
 
-            const videoPath = `${url}/uploads/faces/${student_num}/${req.file.filename}`
+            try {
+                const code = await Redis.get(`faceReco:${student_num}`)
+                if (!code || code !== key)
+                    return res.json({
+                        ...BaseStdResponse.ERR,
+                        msg: '令牌已过期!请刷新页面重试'
+                    })
+
+                await Redis.del(`faceReco:${student_num}`)
+            } catch (err) {
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '令牌验证失败!请刷新页面重试'
+                })
+            }
+
+            const videoPath = `/uploads/faces/${student_num}/${req.file.filename}`
+            const time = new Date().getTime()
+
+            let sql = 'INSERT INTO lepao_face (student_num, video_path, create_time, state) VALUES (?, ?, ?, ?)'
+            let rows = await db.query(sql, [student_num, videoPath, time, 1])
+            if (!rows || rows.affectedRows !== 1)
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '上传失败,请稍后再试'
+                })
 
             res.json({
-                ...BaseStdResponse.OK,
-                data: {
-                    videoPath
-                }
+                ...BaseStdResponse.OK
             })
         })
     }