Login.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const { v4: uuidv4 } = require('uuid')
  2. const API = require("../../lib/API")
  3. const bcryptjs = require('bcryptjs')
  4. const { BaseStdResponse } = require("../../BaseStdResponse")
  5. const db = require("../../plugin/DataBase/db")
  6. const Redis = require('../../plugin/DataBase/Redis')
  7. // 用户登录
  8. class Login extends API {
  9. constructor() {
  10. super();
  11. this.setMethod("POST");
  12. this.setPath("/User/Login");
  13. }
  14. async onRequest(req, res) {
  15. let { username, password, captcha, id } = req.body;
  16. if ([username, password, captcha, id].some(value => value === '' || value === null || value === undefined)) {
  17. res.json({
  18. ...BaseStdResponse.MISSING_PARAMETER,
  19. endpoint: 1513126
  20. });
  21. return;
  22. }
  23. password = atob(password);
  24. try {
  25. const code = await Redis.get(`captcha:${id}`);
  26. if (!code || code != captcha.toLowerCase())
  27. return res.json({
  28. ...BaseStdResponse.ERR,
  29. msg: '验证码错误或已过期!'
  30. })
  31. Redis.del(`captcha:${id}`);
  32. } catch (err) {
  33. this.logger.error(`验证图片验证码失败!${err.stack}`);
  34. return res.json({
  35. ...BaseStdResponse.DATABASE_ERR,
  36. msg: '验证失败!'
  37. })
  38. }
  39. let sql = 'SELECT * FROM users WHERE username = ?';
  40. let rows = await db.query(sql, [username]);
  41. if (!rows || rows.length !== 1 || !bcryptjs.compareSync(password, rows[0].password))
  42. return res.json({
  43. ...BaseStdResponse.ERR,
  44. msg: '用户名或密码错误'
  45. })
  46. const session = uuidv4()
  47. await Redis.set(`userSession:${rows[0].uuid}`, session, {
  48. exp: 2592000
  49. })
  50. res.json({
  51. ...BaseStdResponse.OK,
  52. data: {
  53. uuid: rows[0].uuid,
  54. username: rows[0].username,
  55. session,
  56. roles: rows[0].permission || [],
  57. vip: rows[0].vip,
  58. ic_count: rows[0].ic_count,
  59. lepao_count: rows[0].lepao_count,
  60. crouse_count: rows[0].crouse_count,
  61. avatar: rows[0].avatar,
  62. email: rows[0].email
  63. }
  64. })
  65. const time = new Date().getTime()
  66. sql = 'UPDATE users SET lastTime = ? WHERE id = ?';
  67. await db.query(sql, [time, rows[0].id]);
  68. }
  69. }
  70. module.exports.Login = Login;