vue3--忘记密码组件

样式效果图

 

组件代码  

<template>
  <Dialog v-model="visible" title="忘记密码" width="500px">
    <div class="main">
      <div class="main-rule">至少8个字符,不能全是字母或数字</div>
      <el-form
        ref="loginForm"
        label-position="top"
        label-width="100px"
        :model="formdata"
      >
        <el-form-item
          label="登录账号"
          prop="userMobile"
          :rules="[
            { required: true, message: '账号不能为空', trigger: 'blur' },
            {
              pattern:
                /^(13[0-9]|14[5-9]|15[0-3,5-9]|166|17[0-8]|18[0-9]|19[1,8-9])\d{8}$/,
              message: '手机号格式不正确',
              trigger: 'blur',
            },
          ]"
        >
          <el-input v-model="formdata.userMobile" placeholder="请输入手机号" />
        </el-form-item>

        <el-form-item
          label="验证码"
          prop="code"
          :rules="[
            { required: true, message: '验证码不能为空', trigger: 'blur' },
          ]"
        >
          <div class="main-code">
            <el-input v-model="formdata.code" placeholder="请输入" />
            <el-button type="primary" :disabled="disabled" @click="getCode">
              {{ buttonText }}
            </el-button>
          </div>
          <div class="main-sms" v-if="formdata.userMobile.length === 11">
            将向{{ hideMiddleDigits(formdata.userMobile) }}发送短信验证码
          </div>
        </el-form-item>

        <el-form-item
          label="新密码"
          prop="newPassword"
          :rules="[ { required: true, message: '不能为空', trigger: 'blur' }, { pattern: /^(?![0-9]+$)(?![a-zA-Z]+$).{8,}$/, message: '格式错误', trigger: 'blur' } ]"
        >
          <el-input
            v-model="formdata.newPassword"
            placeholder="请输入新密码"
            show-password
          />
        </el-form-item>

        <el-form-item
          label="确认新密码"
          prop="confirmPassword"
          :rules="[ { pattern: /^(?![0-9]+$)(?![a-zA-Z]+$).{8,}$/, message: '格式错误', trigger: 'blur' }, { required: true, validator: passWordCheck, trigger: 'blur' } ]"
        >
          <el-input
            v-model="formdata.confirmPassword"
            placeholder="请再次输入新密码"
            show-password
          />
        </el-form-item>

        <!-- <div class="main-notmatch" v-if="passwordsNotMatch">
          输入的密码不一致,请检查后重试
        </div> -->
      </el-form>
    </div>
    <template #footer>
      <el-button type="primary" @click="suregologin" :loading="loginLoading"
        >确认并登录</el-button
      >
    </template>
  </Dialog>
</template>

<script setup>
import { ref } from "vue";
import { authcode, updPswAndLogin } from "@/api/login";
const router = useRouter();
const route = useRoute();

const formdata = ref({
  name: "",
  userMobile: "",
});
// 发送短信电话号码隐藏
function hideMiddleDigits(phoneNumber) {
  const trimmedPhoneNumber = phoneNumber.replace(/\D/g, ""); // 去除非数字字符
  if (trimmedPhoneNumber.length <= 7) {
    return trimmedPhoneNumber; // 如果长度不足,返回原始电话号码
  }
  const firstThreeDigits = trimmedPhoneNumber.slice(0, 3);
  const lastFourDigits = trimmedPhoneNumber.slice(-4);
  const middleDigits = "*".repeat(trimmedPhoneNumber.length - 7);
  const formattedPhoneNumber = firstThreeDigits + middleDigits + lastFourDigits;
  return formattedPhoneNumber;
}
// 获取验证码
const buttonText = ref("获取验证码");
const disabled = ref(false);
const remainingTime = ref(60);
// 校验密码
function passWordCheck(rule, value, callback) {
    if (!value) {
        callback(new Error("不能为空"))
    } else if (value && value !== formdata.value.newPassword) {
        callback(new Error("两次输入不一致"))
    } else {
        callback();
    }
}
function getCode() {
  console.log("获取验证码!");
  authcode({
    codeType: 0,
    reqType: 2,
    userMobile: formdata.value.userMobile,
  }).then((res) => {
    console.log(res, "=====");
    disabled.value = true;
    countdown();
  });
}
const passwordsNotMatch = computed(() => {
  return (
    formdata.value.confirmPassword &&
    formdata.value.newPassword !== formdata.value.confirmPassword
  );
});
watch(
  [formdata],
  () => {
    // 在输入完毕后比对
    if (formdata.value.newPassword && formdata.value.confirmPassword) {
      // 执行比对逻辑,例如显示提示信息
      console.log("Perform password comparison logic here");
    }
  },
  { deep: true }
);

const visible = ref(true);
const { proxy } = getCurrentInstance();

const query = route.query;

// 确认并登录
const loginLoading = ref(false);
function suregologin() {
  proxy.$refs.loginForm.validate((valid) => {
    if (valid) {
      loginLoading.value = true;

      updPswAndLogin({
        account: formdata.value.userMobile,
        code: formdata.value.code,
        newPassword: proxy.sha256(formdata.value.newPassword),
        source: 0,
      })
        .then((res) => {
          console.log(res, "=====");
          if (res.status === 1) {
            sessionStorage.setItem("token", res.token);
            const path = query && query.redirect ? query.redirect : "/";
            router.replace(path);
          }
        })
        .finally(() => {
          loginLoading.value = false;
        });
    }
  });
}

function countdown() {
  const timer = setInterval(() => {
    buttonText.value = `${remainingTime.value}s 后重新获取`;
    remainingTime.value--;

    if (remainingTime.value < 0) {
      clearInterval(timer);
      buttonText.value = "获取验证码";
      // this.request("authcode", { userMobile: this.formdata.userMobile }).then(
      //   (res) => {
      //     console.log(res, "验证码");
      //   }
      // );
      disabled.value = false;
      remainingTime.value = 60;
    }
  }, 1000);
}
</script>

<style lang="scss" scoped>
.main {
  max-width: 500px;

  &-rule {
    text-align: center;
  }

  &-code {
    display: flex;
    width: 440px;
  }

  &-sms {
    font-size: 12px;
    color: #999;

    span {
      margin-left: 20px;
      color: #135db3;
    }
  }

  &-notmatch {
    font-size: 12px;
    color: red;
  }
}
</style>

打开忘记密码组件弹窗

// 忘记密码
const forgetpswvisible = ref(false);
function forgetpsw() {
  forgetpswvisible.value = true;
}
    <Forgetpwd v-model="forgetpswvisible"></Forgetpwd>

Vue 前端项目中的登录组件是一个用于用户登录的界面,其中的登录框是用户输入用户名和密码的地方。 登录框界面通常包括以下几个元素: 1. 用户名输入框:用户可以在这里输入自己的用户名。 2. 密码输入框:用户可以在这里输入密码。为了保护用户的信息安全,密码通常会以密文形式显示。 3. 登录按钮:用户点击该按钮后,会触发登录操作。 在Vue的登录组件中,这些元素通常会被封装成一个表单,并且通过Vue的数据绑定功能与组件中的数据进行关联。例如,用户名输入框和密码输入框的输入值会与组件中的data对象中的对应属性进行双向绑定,以便于在登录操作中获取用户输入的内容。 在登录组件中,可能还会包括其他的功能,如记住密码、忘记密码、注册等。这些功能一般会以链接或按钮的形式呈现在登录框界面上,用户可以点击对应的链接或按钮来进行相关操作。 登录框界面的设计也是尤为重要的,合理的布局和样式可以增加用户的操作体验。一般来说,登录框应该具备较好的可视性,尽量避免颜色过于花哨、排版过于复杂等,同时要确保界面的整体美观和统一性,增加用户的易用性。 总之,登录组件中的登录框界面是一个用户输入用户名和密码以进行登录操作的地方,其中包括用户名输入框、密码输入框和登录按钮等元素。通过Vue的数据绑定功能,登录框中的用户输入内容能够与组件中的数据进行关联。合理的布局和设计能够提高用户的使用体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值