BeginFaceReco.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. const API = require("../../../lib/API.js")
  2. const db = require("../../../plugin/DataBase/db.js")
  3. const axios = require('axios')
  4. const { v4: uuidv4 } = require('uuid')
  5. const Redis = require('../../../plugin/DataBase/Redis')
  6. const config = require('../../../config.json')
  7. const { BaseStdResponse } = require("../../../BaseStdResponse.js")
  8. class BeginFaceReco extends API {
  9. constructor() {
  10. super()
  11. this.runpy = config.runpy
  12. this.setPath('/Face/BeginFaceReco')
  13. this.setMethod('POST')
  14. }
  15. /**
  16. * 获取图片并转换为Base64
  17. * @param {string} url - 图片链接
  18. * @returns {Promise<string>} - Base64字符串
  19. */
  20. async getImageBase64(url) {
  21. try {
  22. const response = await axios.get(url, {
  23. proxy: false,
  24. responseType: "arraybuffer"
  25. })
  26. const base64 = Buffer.from(response.data, "binary").toString("base64")
  27. // 获取图片MIME类型
  28. const contentType = response.headers["content-type"]
  29. return `data:${contentType};base64,${base64}`
  30. } catch (error) {
  31. throw new Error(`获取图片失败: ${error.message}`)
  32. }
  33. }
  34. async onRequest(req, res) {
  35. let { face_code } = req.body
  36. if ([face_code].some(value => value === '' || value === null || value === undefined))
  37. return res.json({
  38. ...BaseStdResponse.MISSING_PARAMETER
  39. })
  40. try {
  41. let sql = `
  42. SELECT
  43. f.student_num,
  44. l.name,
  45. l.user_avatar,
  46. l.academy_name,
  47. l.state
  48. FROM
  49. lepao_face f
  50. JOIN
  51. lepao_account l
  52. ON
  53. f.student_num = l.student_num
  54. WHERE
  55. f.face_code = ?
  56. `
  57. let rows = await db.query(sql, [face_code])
  58. if (!rows)
  59. return res.json({
  60. ...BaseStdResponse.DATABASE_ERR,
  61. msg: '获取用户人脸信息失败,请重试'
  62. })
  63. if (rows.length !== 1)
  64. return res.json({
  65. ...BaseStdResponse.ERR,
  66. msg: '采集码输入错误'
  67. })
  68. if(rows[0].state !== 1)
  69. return res.json({
  70. ...BaseStdResponse.ERR,
  71. msg: '账号状态为未登录,请用乐跑登录器更新账号状态后再进行人脸识别'
  72. })
  73. const face_img = await this.getImageBase64('https://lepao-cloud.xxoo365.top/view.php/a517e6d3b4cf9834c99ff819b473d58d.jpg')
  74. // 此时应该从乐跑获取人脸照片
  75. const key = uuidv4()
  76. await Redis.set(`faceReco:${rows[0].student_num}`, key, {
  77. EX: 1800
  78. })
  79. let resData = {
  80. ...rows[0],
  81. key,
  82. face_img
  83. }
  84. res.json({
  85. ...BaseStdResponse.OK,
  86. data: resData
  87. })
  88. } catch (error) {
  89. this.logger.error(`获取用户人脸信息失败。${error.stack}`)
  90. return res.json({
  91. ...BaseStdResponse.ERR,
  92. msg: '获取用户人脸信息失败,请重试'
  93. })
  94. }
  95. }
  96. }
  97. module.exports.BeginFaceReco = BeginFaceReco