Register.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. const md5 = require("md5");
  2. const API = require("../../../lib/API");
  3. const bcryptjs = require('bcryptjs');
  4. const db = require("../../../plugin/DataBase/db");
  5. const { BaseStdResponse } = require("../../../BaseStdResponse");
  6. const Redis = require('../../../plugin/DataBase/Redis');
  7. const sendEmail = require('../../../plugin/Email/Email');
  8. // 用户注册
  9. class Register extends API {
  10. constructor() {
  11. super();
  12. this.setMethod("POST");
  13. this.setPath("/User/Register");
  14. }
  15. createSession(uuid, salt) {
  16. return md5(`${uuid}${salt}${new Date().getTime()}`);
  17. }
  18. CheckPassword(password) {
  19. if (password.length < 8 || password.length > 16) {
  20. return false;
  21. }
  22. const hasLetter = /[a-zA-Z]/.test(password);
  23. const hasNumber = /\d/.test(password);
  24. return hasLetter && hasNumber;
  25. }
  26. checkUsername(username) {
  27. const regex = /^[\u4e00-\u9fa5A-Za-z0-9]{2,8}$/;
  28. return regex.test(username);
  29. }
  30. async onRequest(req, res) {
  31. let { username, email, code, password } = req.body;
  32. if ([username, email, code, password].some(value => value === '' || value === null || value === undefined)) {
  33. res.json({
  34. ...BaseStdResponse.MISSING_PARAMETER,
  35. endpoint: 1513126
  36. });
  37. return;
  38. }
  39. if(!this.checkUsername(username))
  40. return res.json({
  41. ...BaseStdResponse.ERR,
  42. msg: '用户名需在2到8位之间,且只能含有英文字母和汉字'
  43. })
  44. password = atob(password);
  45. if (!this.CheckPassword(password))
  46. return res.json({
  47. ...BaseStdResponse.ERR,
  48. msg: '密码需在8到16位之间,且包含字母和数字'
  49. })
  50. try {
  51. const VerifyCode = await Redis.get(`email:${email}`);
  52. if (!VerifyCode || VerifyCode != code)
  53. return res.json({
  54. ...BaseStdResponse.SMS_CHECK_FAIL,
  55. msg: '邮箱验证码输入错误或已过期'
  56. })
  57. } catch (err) {
  58. this.logger.error(`验证邮箱验证码失败!${err.stack}`);
  59. return res.json({
  60. ...BaseStdResponse.DATABASE_ERR,
  61. msg: '验证失败!'
  62. })
  63. }
  64. let sql = 'SELECT username FROM users WHERE username = ?';
  65. let UsernameRows = await db.query(sql, [username]);
  66. if (UsernameRows.length > 0)
  67. return res.json({
  68. ...BaseStdResponse.USER_ALREADY_EXISTS,
  69. msg: '用户名已被占用!'
  70. })
  71. sql = 'SELECT email FROM users WHERE email = ?';
  72. let EmailRows = await db.query(sql, [username]);
  73. if (EmailRows.length > 0)
  74. return res.json({
  75. ...BaseStdResponse.USER_ALREADY_EXISTS,
  76. msg: '该邮箱已被注册!'
  77. })
  78. // 查询users表中是否有用户
  79. const userCountQuery = 'SELECT COUNT(*) as count FROM users';
  80. const userCountResult = await db.query(userCountQuery);
  81. const userCount = userCountResult.count;
  82. // 如果是第一个注册的用户 授予admin权限
  83. const admin = userCount === 0 ? 1 : 0;
  84. const uuid = md5(Date.now() + email + code);
  85. const session = this.createSession(code, Math.random().toFixed(6).slice(-6));
  86. const hashPassword = bcryptjs.hashSync(password, 10);
  87. const avatar = '/avatar/avatar.png';
  88. sql = 'INSERT INTO users (uuid, username, avatar, session, admin, email, password) VALUES (?, ?, ?, ?, ?, ?, ?)';
  89. let result = await db.query(sql, [uuid, username, avatar, session, admin, email, hashPassword]);
  90. if (result && result.affectedRows > 0) {
  91. // 注册成功后删除邮箱对应的验证码 避免注册失败后重复获取
  92. await Redis.del(`email:${email}`);
  93. res.json({
  94. ...BaseStdResponse.OK
  95. });
  96. await sendEmail(email, '账号注册成功', `您已成功注册Double_X考勤账号,用户名${username},注册时间:${new Date().toLocaleString()}`);
  97. } else {
  98. res.json({ ...BaseStdResponse.ERR, endpoint: 7894378, msg: '注册失败!'});
  99. }
  100. }
  101. }
  102. module.exports.Register = Register;