BeginFaceReco.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 { student_num, name, captcha, id } = req.body
  36. if ([student_num, name, captcha, id].some(value => value === '' || value === null || value === undefined))
  37. return res.json({
  38. ...BaseStdResponse.MISSING_PARAMETER
  39. })
  40. try {
  41. const code = await Redis.get(`captcha:${id}`)
  42. if (!code || code != captcha.toLowerCase())
  43. return res.json({
  44. ...BaseStdResponse.ERR,
  45. msg: '验证码错误或已过期!'
  46. })
  47. Redis.del(`captcha:${id}`);
  48. } catch (err) {
  49. this.logger.error(`验证图片验证码失败!${err.stack}`)
  50. return res.json({
  51. ...BaseStdResponse.DATABASE_ERR,
  52. msg: '验证失败!'
  53. })
  54. }
  55. try {
  56. let sql = 'SELECT student_num, name, user_avatar, academy_name FROM lepao_account WHERE student_num = ? AND name = ?'
  57. let rows = await db.query(sql, [student_num, name])
  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: '该用户尚未在RunForge系统中添加,请先添加账号'
  67. })
  68. const face_img = await this.getImageBase64('https://lepao-cloud.xxoo365.top/view.php/d0b85269c3683ed48da1fc5e468108c7.jpg')
  69. // 此时应该从乐跑获取人脸照片
  70. const key = uuidv4()
  71. await Redis.set(`faceReco:${rows[0].student_num}`, key, {
  72. EX: 1800
  73. })
  74. let resData = {
  75. ...rows[0],
  76. key,
  77. face_img
  78. }
  79. res.json({
  80. ...BaseStdResponse.OK,
  81. data: resData
  82. })
  83. } catch (error) {
  84. this.logger.error(`获取用户人脸信息失败。${error.stack}`)
  85. return res.json({
  86. ...BaseStdResponse.ERR,
  87. msg: '获取用户人脸信息失败,请重试'
  88. })
  89. }
  90. }
  91. }
  92. module.exports.BeginFaceReco = BeginFaceReco