You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
3.9 KiB

  1. <script setup lang="ts">
  2. import { useI18n } from "vue-i18n";
  3. import { ref, reactive } from "vue";
  4. import Motion from "../utils/motion";
  5. import { updateRules } from "../utils/rule";
  6. import { message } from "@pureadmin/components";
  7. import type { FormInstance } from "element-plus";
  8. import { useVerifyCode } from "../utils/verifyCode";
  9. import { $t, transformI18n } from "/@/plugins/i18n";
  10. import { useUserStoreHook } from "/@/store/modules/user";
  11. import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
  12. const { t } = useI18n();
  13. const loading = ref(false);
  14. const ruleForm = reactive({
  15. phone: "",
  16. verifyCode: "",
  17. password: "",
  18. repeatPassword: ""
  19. });
  20. const ruleFormRef = ref<FormInstance>();
  21. const { isDisabled, text } = useVerifyCode();
  22. const repeatPasswordRule = [
  23. {
  24. validator: (rule, value, callback) => {
  25. if (value === "") {
  26. callback(new Error(transformI18n($t("login.passwordSureReg"))));
  27. } else if (ruleForm.password !== value) {
  28. callback(new Error(transformI18n($t("login.passwordDifferentReg"))));
  29. } else {
  30. callback();
  31. }
  32. },
  33. trigger: "blur"
  34. }
  35. ];
  36. const onUpdate = async (formEl: FormInstance | undefined) => {
  37. loading.value = true;
  38. if (!formEl) return;
  39. await formEl.validate((valid, fields) => {
  40. if (valid) {
  41. // 模拟请求,需根据实际开发进行修改
  42. setTimeout(() => {
  43. message.success(transformI18n($t("login.passwordUpdateReg")));
  44. loading.value = false;
  45. }, 2000);
  46. } else {
  47. loading.value = false;
  48. return fields;
  49. }
  50. });
  51. };
  52. function onBack() {
  53. useVerifyCode().end();
  54. useUserStoreHook().SET_CURRENTPAGE(0);
  55. }
  56. </script>
  57. <template>
  58. <el-form
  59. ref="ruleFormRef"
  60. :model="ruleForm"
  61. :rules="updateRules"
  62. size="large"
  63. >
  64. <Motion>
  65. <el-form-item prop="phone">
  66. <el-input
  67. clearable
  68. v-model="ruleForm.phone"
  69. :placeholder="t('login.phone')"
  70. :prefix-icon="useRenderIcon('iphone')"
  71. />
  72. </el-form-item>
  73. </Motion>
  74. <Motion :delay="100">
  75. <el-form-item prop="verifyCode">
  76. <div class="w-full flex justify-between">
  77. <el-input
  78. clearable
  79. v-model="ruleForm.verifyCode"
  80. :placeholder="t('login.smsVerifyCode')"
  81. :prefix-icon="
  82. useRenderIcon('ri:shield-keyhole-line', { online: true })
  83. "
  84. />
  85. <el-button
  86. :disabled="isDisabled"
  87. class="ml-2"
  88. @click="useVerifyCode().start(ruleFormRef, 'phone')"
  89. >
  90. {{
  91. text.length > 0
  92. ? text + t("login.info")
  93. : t("login.getVerifyCode")
  94. }}
  95. </el-button>
  96. </div>
  97. </el-form-item>
  98. </Motion>
  99. <Motion :delay="150">
  100. <el-form-item prop="password">
  101. <el-input
  102. clearable
  103. show-password
  104. v-model="ruleForm.password"
  105. :placeholder="t('login.password')"
  106. :prefix-icon="useRenderIcon('lock')"
  107. />
  108. </el-form-item>
  109. </Motion>
  110. <Motion :delay="200">
  111. <el-form-item :rules="repeatPasswordRule" prop="repeatPassword">
  112. <el-input
  113. clearable
  114. show-password
  115. v-model="ruleForm.repeatPassword"
  116. :placeholder="t('login.sure')"
  117. :prefix-icon="useRenderIcon('lock')"
  118. />
  119. </el-form-item>
  120. </Motion>
  121. <Motion :delay="250">
  122. <el-form-item>
  123. <el-button
  124. class="w-full"
  125. size="default"
  126. type="primary"
  127. :loading="loading"
  128. @click="onUpdate(ruleFormRef)"
  129. >
  130. {{ t("login.definite") }}
  131. </el-button>
  132. </el-form-item>
  133. </Motion>
  134. <Motion :delay="300">
  135. <el-form-item>
  136. <el-button class="w-full" size="default" @click="onBack">
  137. {{ t("login.back") }}
  138. </el-button>
  139. </el-form-item>
  140. </Motion>
  141. </el-form>
  142. </template>