Register.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. const EmailTemplate = require('../../plugin/Email/emailTemplate')
  8. // 用户注册
  9. class Register extends API {
  10. constructor() {
  11. super();
  12. this.setMethod("POST");
  13. this.setPath("/User/Register");
  14. }
  15. CheckPassword(password) {
  16. if (password.length < 8 || password.length > 16) {
  17. return false;
  18. }
  19. const hasLetter = /[a-zA-Z]/.test(password);
  20. const hasNumber = /\d/.test(password);
  21. return hasLetter && hasNumber;
  22. }
  23. checkUsername(username) {
  24. const regex = /^[\u4e00-\u9fa5A-Za-z0-9]{3,12}$/;
  25. return regex.test(username);
  26. }
  27. async onRequest(req, res) {
  28. let { username, password, captcha, id } = req.body
  29. if ([username, password, captcha, id].some(value => value === '' || value === null || value === undefined))
  30. return res.json({
  31. ...BaseStdResponse.MISSING_PARAMETER
  32. })
  33. if (!this.checkUsername(username))
  34. return res.json({
  35. ...BaseStdResponse.ERR,
  36. msg: '用户名需在3到12位之间,且不能含有特殊字符'
  37. })
  38. password = atob(password);
  39. if (!this.CheckPassword(password))
  40. return res.json({
  41. ...BaseStdResponse.ERR,
  42. msg: '密码需在8到16位之间,且包含字母和数字'
  43. })
  44. // try {
  45. // const VerifyCode = await Redis.get(`email:${email}`);
  46. // if (!VerifyCode || VerifyCode != code)
  47. // return res.json({
  48. // ...BaseStdResponse.SMS_CHECK_FAIL,
  49. // msg: '邮箱验证码输入错误或已过期'
  50. // })
  51. // } catch (err) {
  52. // this.logger.error(`验证邮箱验证码失败!${err.stack}`);
  53. // return res.json({
  54. // ...BaseStdResponse.DATABASE_ERR,
  55. // msg: '验证失败!'
  56. // })
  57. // }
  58. try {
  59. const code = await Redis.get(`captcha:${id}`)
  60. if (!code || code != captcha.toLowerCase())
  61. return res.json({
  62. ...BaseStdResponse.SMS_CHECK_FAIL,
  63. msg: '验证码输入错误或已过期'
  64. })
  65. await Redis.del(`captcha:${id}`)
  66. } catch (err) {
  67. this.logger.error(`验证图片验证码失败!${err.stack}`)
  68. return res.json({
  69. ...BaseStdResponse.DATABASE_ERR,
  70. msg: '验证失败!'
  71. })
  72. }
  73. let sql = 'SELECT username FROM users WHERE username = ?';
  74. let UsernameRows = await db.query(sql, [username]);
  75. if (UsernameRows.length > 0)
  76. return res.json({
  77. ...BaseStdResponse.USER_ALREADY_EXISTS,
  78. msg: '用户名已被占用!'
  79. })
  80. // sql = 'SELECT email FROM users WHERE email = ?';
  81. // let EmailRows = await db.query(sql, [email]);
  82. // if (EmailRows.length > 0)
  83. // return res.json({
  84. // ...BaseStdResponse.USER_ALREADY_EXISTS,
  85. // msg: '该邮箱已被注册!'
  86. // })
  87. const uuid = uuidv4()
  88. const hashPassword = bcryptjs.hashSync(password, 10);
  89. const time = new Date().getTime()
  90. sql = 'INSERT INTO users (uuid, username, email, password, registTime) VALUES (?, ?, ?, ?, ?)';
  91. let result = await db.query(sql, [uuid, username, '未设置', hashPassword, time]);
  92. if (result && result.affectedRows > 0) {
  93. // 注册成功后删除邮箱对应的验证码 避免注册失败后重复获取
  94. // await Redis.del(`email:${email}`);
  95. res.json({
  96. ...BaseStdResponse.OK
  97. })
  98. // await EmailTemplate.registerSuccess(email, username)
  99. } else {
  100. res.json({ ...BaseStdResponse.ERR, msg: '注册失败!' });
  101. }
  102. }
  103. }
  104. module.exports.Register = Register;