BeginFaceReco.js 3.4 KB

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