ForgetPassword.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <template>
  2. <!-- 找回密码 -->
  3. <div class="forgetPassword flex-col">
  4. <s-header :name="$t('forgetPassword.header')" :noback="false"></s-header>
  5. <div class="forgetPasswordFormBox">
  6. <van-form @submit="forgetPasswordSubmit">
  7. <div>
  8. <span class="word2">{{ $t('forgetPassword.phoneWordSpan') }}</span>
  9. <van-field v-model="phone" name="phone" type="tel" :placeholder="$t('forgetPassword.phonePlaceholder')"
  10. :rules="[{ required: true, pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号' }]" />
  11. </div>
  12. <van-field v-model="code" name="code" :placeholder="$t('forgetPassword.codePlaceholder')"
  13. :rules="[{ required: true, message: $t('forgetPassword.codeRequired') }]">
  14. <template #button>
  15. <van-button size="small" type="primary" @click="seedVerCode()"
  16. :disabled="time !== 0 || phone.length === 0"
  17. :loading-text="$t('register.sending')">
  18. {{ time === 0 ?
  19. $t('forgetPassword.seedVerCode') : time + '秒后可重发' }}
  20. </van-button>
  21. </template>
  22. </van-field>
  23. <van-field v-model="password" name="password" type="password" placeholder="输入新密码"
  24. :rules="[{ required: true, message: $t('changePassword.passwordRequired') }]" />
  25. <van-field v-model="passwordCheck" name="passwordCheck" type="password" placeholder="确认新密码"
  26. :rules="[{ required: true, message: $t('changePassword.passwordCheckRequired') }]" />
  27. <van-button round type="primary" class="register" native-type="submit">{{ $t('forgetPassword.registerButton')
  28. }}</van-button>
  29. </van-form>
  30. </div>
  31. </div>
  32. </template>
  33. <script>
  34. import { ref, reactive, toRefs, onMounted } from 'vue';
  35. import { showToast, showFailToast } from 'vant';
  36. import { setLocal, getLocal, styleUrl } from '@/common/js/utils';
  37. import sHeader from "@/components/SimpleHeader";
  38. import { useRouter } from "vue-router";
  39. import { sentForgetCode, checkForgetCode } from '@/service/login/forget-password';
  40. import md5 from 'js-md5';
  41. export default {
  42. setup() {
  43. const phone = ref(''); // 手机号
  44. const code = ref(''); // 验证码
  45. const verCodeTime = reactive({
  46. time: 0
  47. }); // 验证码间隔时间及状态
  48. const password = ref('');
  49. const passwordCheck = ref('');
  50. const router = useRouter();
  51. // 发送验证码
  52. const seedVerCode = async () => {
  53. const { data } = await sentForgetCode({
  54. phone: phone.value,
  55. });
  56. if (data.code === '00000') {
  57. showToast('验证码发送成功');
  58. verCodeTime.time = 3 * 60;
  59. verCodeTimeInterval();
  60. } else { showFailToast(data.message); }
  61. }
  62. // 验证码发送成功开始3分钟倒计时
  63. const verCodeTimeInterval = () => {
  64. verCodeTime.time--;
  65. setLocal('forgetVerCodeTime', verCodeTime.time)
  66. if (verCodeTime.time !== 0) { setTimeout(() => { verCodeTimeInterval(); }, 1000); }
  67. }
  68. // 验证-表单
  69. const forgetPasswordSubmit = async () => {
  70. if (password.value !== passwordCheck.value) {
  71. showFailToast('两次密码不一致,请确认密码正确');
  72. return false;
  73. }
  74. const { data } = await checkForgetCode({
  75. phone: phone.value,
  76. code: code.value,
  77. password: md5(password.value)
  78. });
  79. if (data.code === '00000') {
  80. showToast('修改成功');
  81. setTimeout(() => {
  82. // router.push({ path: '/changepassword', query: { name: username.value } });
  83. router.push({ path: '/login' });
  84. }, 1500);
  85. } else {
  86. showFailToast(data.message);
  87. }
  88. };
  89. // 初始化页面获取验证码倒计时
  90. onMounted(async () => {
  91. styleUrl('forgetPassword');
  92. verCodeTime.time = getLocal('forgetVerCodeTime');
  93. if (verCodeTime.time && verCodeTime.time !== '') {
  94. verCodeTime.time = parseInt(verCodeTime.time);
  95. if (verCodeTime.time > 0) {
  96. verCodeTimeInterval();
  97. }
  98. } else {
  99. verCodeTime.time = 0;
  100. }
  101. });
  102. return {
  103. ...toRefs(verCodeTime),
  104. phone,
  105. password,
  106. passwordCheck,
  107. code,
  108. seedVerCode,
  109. forgetPasswordSubmit
  110. };
  111. },
  112. components: { sHeader },
  113. };
  114. </script>
  115. <style lang="less" scoped>
  116. @import "@/common/style/mixin";
  117. </style>