(已解决)vueQQ邮箱注册发送验证码前端设计,如何发送验证码设计倒计时

我们之前已经通过前端测试成功完成qq邮箱动态验证码发送(未使用redis,我准备自己了解完后,后期有时间补上)

衔接文章:

1:

spingboot 后端发送QQ邮箱验证码

2:


这段代码建设图形化界面

复制代码
 <div class="container">
              <button
                @click="toggleCaptchaButton"
                :class="{ 'disabled': isSending || isCounting }"
                :style="{ display: displayStyle }"
                class="itemcode-seconde"
              >
                <span
                  v-if="isSending"
                  class="f-size"
                >发送中..</span>
                <span
                  v-else-if="isCounting"
                  class="f-size"
                >{{ countdown }}s</span>
                <span
                  v-else
                  class="f-size"
                >发送</span>
              </button>
            </div>

(效果如图)


js代码:

复制代码
import router from "../../router";
import axios from "axios";
export default {
  data() {
    return {
      // 邮箱
      email: [],
      //输入的验证码
      Captcha: [],
      // 用户登录
      user: {
        userName: "",
        userPwd: "",
      },
      //接收到的验证码
      EmailCode: {
        EmailCode: "",
      },
      // token验证数据
      token: "", // 将token存储为一个字符串或数字
      // 动态隐藏登录框
      isHidden: false,
      amHidden: false,
      //验证码变换
      isSending: false, // 是否正在发送验证码
      isCounting: false, // 是否正在倒计时
      countdown: 0, // 倒计时时间(秒),初始化为0,只在倒计时开始时设置为60
      countdownInterval: null, // 用于存储定时器的ID
    };
  },
  computed: {
    // 动态隐藏登录框赋值
    displayStyle() {
      return this.isHidden ? "none" : "block";
    },
    displaystyles() {
      return this.amHidden ? "block" : "none";
    },
  },
  created() {
    // 设置默认值,当组件初始化时,isHidden为false,displayStyle为'block'
    this.isHidden = true;
    this.amHidden = true;
  },
  methods: {
    handleSubmit(event) {
      event.preventDefault(); // 阻止表单提交的默认行为
      this.toggleCaptchaButton(); // 调用发送验证码的方法
    },
    // 动态隐藏登录框
    toggleDisplay() {
      this.isHidden = !this.isHidden;
      this.amHidden = !this.amHidden;
    },
    // 发送注册请求
    enrollData() {
      if ((this.Captcha = this.EmailCode.EmailCode)) {
        axios
          .post("http://localhost:8080/enroll", JSON.stringify(this.email), {
            headers: {
              "Content-Type": "application/json",
            },
          })
          .then((response) => {
            this.Captcha = response.data.data;
            this.$message({
              message: "验证成功!",
              type: "success",
            });
          });
      } else {
        this.$message({
          message: "验证失败,",
          type: "error",
        });
      }
    },
    // 验证码变换+发送验证码请求
    toggleCaptchaButton() {
      // 发送验证码请求
      // 检查是否正在发送请求或倒计时中
      if (this.isSending || this.isCounting) {
        console.log("验证码请求或倒计时中,请稍后再试");
        return; // 提前返回,避免重复执行
      }
      axios
        .post("http://localhost:8080/mail", JSON.stringify(this.email), {
          headers: {
            "Content-Type": "application/json",
          },
        })
        .then((response) => {
          //   成功
          const EmailCode = response.data.data;
          this.EmailCode.EmailCode = EmailCode;
          console.log("请求mail已经成功接受到验证码" + EmailCode);
        })
        .catch((error) => {
          // 网络请求错误或后端返回非2xx的响应
          console.error(error);
        });
      // 验证码变换
      if (!this.isSending && !this.isCounting) {
        this.isSending = true; // 开始发送验证码,设置为不可点击状态
        // 模拟发送验证码的过程
        setTimeout(() => {
          this.isSending = false; // 发送完成
          this.startCountdown(); // 调用倒计时
        }, 2500);
      }
    },
    startCountdown() {
      this.isCounting = true; // 开始倒计时
      this.countdown = 60; // 设置倒计时时间为60秒
      this.countdownInterval = setInterval(() => {
        this.countdown--; // 倒计时减1秒
        if (this.countdown <= 0) {
          this.stopCountdown(); // 倒计时结束,调用停止倒计时的方法
        }
      }, 1000); // 每秒更新一次倒计时时间
    },
    stopCountdown() {
      clearInterval(this.countdownInterval); // 清除定时器
      this.isCounting = false; // 倒计时结束
      this.countdown = 0; // 重置倒计时时间为0
    },

    //登录请求(点击)
    submitData() {
      axios
        .post("http://localhost:8080/login", JSON.stringify(this.user), {
          headers: {
            "Content-Type": "application/json",
            Authorization: "Bearer " + this.token,
          },
        })
        .then((response) => {
          const token = response.data.data;
          // 将token存储到组件的data属性中
          this.token = token;
          if (
            response.data &&
            response.data.code === 0 &&
            response.data.msg === "错误!"
          ) {
            this.$message({
              message: "登录失败," + response.data.msg,
              type: "error",
            });
          } else {
            this.$message({
              message: "登录成功!",
              type: "success",
            });
            router.push({
              path: "/index",
              query: { token: { token } },
            });
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
  },
  beforeDestroy() {
    if (this.countdownInterval) {
      clearInterval(this.countdownInterval); // 组件销毁前清除定时器
    }
  },
};
</script>
相关推荐
To_OC3 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic4 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy4 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志4 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble5 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯6 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜7 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司7 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
kaiking_g8 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js
江华森8 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http