verificationCode.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * 验证码工具类
  3. * 用于生成和验证验证码
  4. */
  5. class VerificationCode {
  6. constructor() {
  7. // 存储验证码的Map,key为验证码,value为过期时间戳
  8. this.codeMap = new Map();
  9. // 验证码有效期(毫秒),默认5分钟
  10. this.expirationTime = 5 * 60 * 1000;
  11. }
  12. /**
  13. * 生成6位数字验证码
  14. * @returns {string} 6位数字验证码
  15. */
  16. generateCode() {
  17. // 生成6位随机数
  18. const code = Math.floor(100000 + Math.random() * 900000).toString();
  19. // 设置过期时间
  20. const expirationTime = Date.now() + this.expirationTime;
  21. // 存储验证码和过期时间
  22. this.codeMap.set(code, expirationTime);
  23. return code;
  24. }
  25. /**
  26. * 验证验证码是否有效
  27. * @param {string} code 要验证的验证码
  28. * @returns {boolean} 验证码是否有效
  29. */
  30. verifyCode(code) {
  31. if (!code || !this.codeMap.has(code)) {
  32. return false;
  33. }
  34. const expirationTime = this.codeMap.get(code);
  35. const now = Date.now();
  36. // 如果验证码已过期,从Map中删除
  37. if (now > expirationTime) {
  38. this.codeMap.delete(code);
  39. return false;
  40. }
  41. // 验证成功后删除验证码(一次性使用)
  42. this.codeMap.delete(code);
  43. return true;
  44. }
  45. /**
  46. * 设置验证码有效期
  47. * @param {number} minutes 有效期(分钟)
  48. */
  49. setExpirationTime(minutes) {
  50. this.expirationTime = minutes * 60 * 1000;
  51. }
  52. /**
  53. * 清理过期的验证码
  54. */
  55. clearExpiredCodes() {
  56. const now = Date.now();
  57. for (const [code, expirationTime] of this.codeMap.entries()) {
  58. if (now > expirationTime) {
  59. this.codeMap.delete(code);
  60. }
  61. }
  62. }
  63. }
  64. // 创建单例实例
  65. const verificationCode = new VerificationCode();
  66. export default verificationCode;