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.

141 lines
3.4 KiB

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