forgetPassword.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. <van-field v-model="username" name="username" :placeholder="$t('forgetPassword.usernamePlaceholder')"
  8. :rules="[{ required: true, message: $t('forgetPassword.usernameRequired') }]" />
  9. <span class="word1">{{ $t('forgetPassword.selectForgetPassword') }}</span>
  10. <div class="van-cell van-field">
  11. <div class="van-cell__value van-field__value radioBox">
  12. <van-radio-group v-model="ifForeign" direction="horizontal">
  13. <van-radio name="0" icon-size="18px">{{ $t('forgetPassword.phone') }}</van-radio>
  14. <van-radio name="2" icon-size="18px">{{ $t('forgetPassword.emailChina') }}</van-radio>
  15. <van-radio name="1" icon-size="18px">{{ $t('forgetPassword.emailAbroad') }}</van-radio>
  16. </van-radio-group>
  17. </div>
  18. </div>
  19. <div v-if="ifForeign === '0'">
  20. <span class="word2">{{ $t('forgetPassword.phoneWordSpan') }}</span>
  21. <van-field v-model="phone" name="phone" type="tel" :placeholder="$t('forgetPassword.phonePlaceholder')"
  22. :rules="[{ required: true, message: $t('forgetPassword.phoneRequired') }]" />
  23. </div>
  24. <div v-if="ifForeign === '2'">
  25. <span class="word2">{{ $t('forgetPassword.emailWordSpanChina') }}</span>
  26. <van-field v-model="email" name="email" :placeholder="$t('forgetPassword.emailPlaceholder')"
  27. :rules="[{ required: true, message: $t('forgetPassword.emailRequired') }]" />
  28. </div>
  29. <div v-if="ifForeign === '1'">
  30. <span class="word2">{{ $t('forgetPassword.emailWordSpan') }}</span>
  31. <van-field v-model="email" name="email" :placeholder="$t('forgetPassword.emailPlaceholder')"
  32. :rules="[{ required: true, message: $t('forgetPassword.emailRequired') }]" />
  33. </div>
  34. <van-field v-model="code" name="code" :placeholder="$t('forgetPassword.codePlaceholder')"
  35. :rules="[{ required: true, message: $t('forgetPassword.codeRequired') }]">
  36. <template #button>
  37. <van-button size="small" type="primary" @click="seedVerCode()" :disabled="time !== 0">{{ time === 0 ?
  38. $t('forgetPassword.seedVerCode') : time + '秒后可重发' }}</van-button>
  39. </template>
  40. </van-field>
  41. <van-button round type="primary" class="register" native-type="submit">{{ $t('forgetPassword.registerButton')
  42. }}</van-button>
  43. </van-form>
  44. </div>
  45. </div>
  46. </template>
  47. <script>
  48. import { ref, reactive, toRefs, onMounted } from 'vue';
  49. import { showToast, showFailToast } from 'vant';
  50. import { setLocal, getLocal, styleUrl } from '@/common/js/utils';
  51. import sHeader from "@/components/SimpleHeader";
  52. import { useRouter } from "vue-router";
  53. import { sentForgetCode, checkForgetCode } from '@/service/forgetPassword';
  54. export default {
  55. setup() {
  56. const username = ref(''); // 用户名
  57. const ifForeign = ref('0'); // 手机号&邮箱状态
  58. const email = ref(''); // 邮箱
  59. const phone = ref(''); // 手机号
  60. const code = ref(''); // 验证码
  61. const verCodeTime = reactive({
  62. time: 0
  63. }); // 验证码间隔时间及状态
  64. const router = useRouter();
  65. // 发送验证码
  66. const seedVerCode = async () => {
  67. const { data } = await sentForgetCode({
  68. username: username.value,
  69. ifForeign: ifForeign.value,
  70. phoneOrEmail: ifForeign.value === '0' ? phone.value : email.value,
  71. hostName: 'Sunzee'
  72. });
  73. if (data.code === '00000') {
  74. showToast('验证码发送成功');
  75. verCodeTime.time = 3 * 60;
  76. verCodeTimeInterval();
  77. } else { showFailToast(data.message); }
  78. }
  79. // 验证码发送成功开始3分钟倒计时
  80. const verCodeTimeInterval = () => {
  81. verCodeTime.time--;
  82. setLocal('forgetVerCodeTime', verCodeTime.time)
  83. if (verCodeTime.time !== 0) { setTimeout(() => { verCodeTimeInterval(); }, 1000); }
  84. }
  85. // 验证-表单
  86. const forgetPasswordSubmit = async () => {
  87. const { data } = await checkForgetCode({
  88. ifForeign: ifForeign.value,
  89. phoneOrEmail: ifForeign.value === '0' ? phone.value : email.value,
  90. code: code.value
  91. });
  92. if (data.code === '00000') {
  93. showToast('校验成功');
  94. router.push({ path: '/changepassword', query: { name: username.value } });
  95. } else {
  96. showFailToast(data.message);
  97. }
  98. };
  99. // 初始化页面获取验证码倒计时
  100. onMounted(async () => {
  101. styleUrl('forgetPassword');
  102. verCodeTime.time = getLocal('forgetVerCodeTime');
  103. if (verCodeTime.time && verCodeTime.time !== '') {
  104. verCodeTime.time = parseInt(verCodeTime.time);
  105. if (verCodeTime.time > 0) { verCodeTimeInterval(); }
  106. } else { verCodeTime.time = 0; }
  107. });
  108. return {
  109. ...toRefs(verCodeTime),
  110. username,
  111. ifForeign,
  112. phone,
  113. email,
  114. code,
  115. seedVerCode,
  116. forgetPasswordSubmit
  117. };
  118. },
  119. components: { sHeader },
  120. };
  121. </script>
  122. <style lang="less" scoped>
  123. @import "../common/style/mixin";
  124. </style>