LoginRegist.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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 { message } from "@/utils/message";
  6. import { updateRules } from "../utils/rule";
  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. import Lock from "~icons/ri/lock-fill";
  13. import Iphone from "~icons/ep/iphone";
  14. import User from "~icons/ri/user-3-fill";
  15. import Keyhole from "~icons/ri/shield-keyhole-line";
  16. const { t } = useI18n();
  17. const checked = ref(false);
  18. const loading = ref(false);
  19. const ruleForm = reactive({
  20. username: "",
  21. phone: "",
  22. verifyCode: "",
  23. password: "",
  24. repeatPassword: ""
  25. });
  26. const ruleFormRef = ref<FormInstance>();
  27. const { isDisabled, text } = useVerifyCode();
  28. const repeatPasswordRule = [
  29. {
  30. validator: (rule, value, callback) => {
  31. if (value === "") {
  32. callback(new Error(transformI18n($t("login.purePassWordSureReg"))));
  33. } else if (ruleForm.password !== value) {
  34. callback(
  35. new Error(transformI18n($t("login.purePassWordDifferentReg")))
  36. );
  37. } else {
  38. callback();
  39. }
  40. },
  41. trigger: "blur"
  42. }
  43. ];
  44. const onUpdate = async (formEl: FormInstance | undefined) => {
  45. loading.value = true;
  46. if (!formEl) return;
  47. await formEl.validate(valid => {
  48. if (valid) {
  49. if (checked.value) {
  50. // 模拟请求,需根据实际开发进行修改
  51. setTimeout(() => {
  52. message(transformI18n($t("login.pureRegisterSuccess")), {
  53. type: "success"
  54. });
  55. loading.value = false;
  56. }, 2000);
  57. } else {
  58. loading.value = false;
  59. message(transformI18n($t("login.pureTickPrivacy")), {
  60. type: "warning"
  61. });
  62. }
  63. } else {
  64. loading.value = false;
  65. }
  66. });
  67. };
  68. function onBack() {
  69. useVerifyCode().end();
  70. useUserStoreHook().SET_CURRENTPAGE(0);
  71. }
  72. </script>
  73. <template>
  74. <el-form
  75. ref="ruleFormRef"
  76. :model="ruleForm"
  77. :rules="updateRules"
  78. size="large"
  79. >
  80. <Motion>
  81. <el-form-item
  82. :rules="[
  83. {
  84. required: true,
  85. message: transformI18n($t('login.pureUsernameReg')),
  86. trigger: 'blur'
  87. }
  88. ]"
  89. prop="username"
  90. >
  91. <el-input
  92. v-model="ruleForm.username"
  93. clearable
  94. :placeholder="t('login.pureUsername')"
  95. :prefix-icon="useRenderIcon(User)"
  96. />
  97. </el-form-item>
  98. </Motion>
  99. <Motion :delay="100">
  100. <el-form-item prop="phone">
  101. <el-input
  102. v-model="ruleForm.phone"
  103. clearable
  104. :placeholder="t('login.purePhone')"
  105. :prefix-icon="useRenderIcon(Iphone)"
  106. />
  107. </el-form-item>
  108. </Motion>
  109. <Motion :delay="150">
  110. <el-form-item prop="verifyCode">
  111. <div class="w-full flex justify-between">
  112. <el-input
  113. v-model="ruleForm.verifyCode"
  114. clearable
  115. :placeholder="t('login.pureSmsVerifyCode')"
  116. :prefix-icon="useRenderIcon(Keyhole)"
  117. />
  118. <el-button
  119. :disabled="isDisabled"
  120. class="ml-2!"
  121. @click="useVerifyCode().start(ruleFormRef, 'phone')"
  122. >
  123. {{
  124. text.length > 0
  125. ? text + t("login.pureInfo")
  126. : t("login.pureGetVerifyCode")
  127. }}
  128. </el-button>
  129. </div>
  130. </el-form-item>
  131. </Motion>
  132. <Motion :delay="200">
  133. <el-form-item prop="password">
  134. <el-input
  135. v-model="ruleForm.password"
  136. clearable
  137. show-password
  138. :placeholder="t('login.purePassword')"
  139. :prefix-icon="useRenderIcon(Lock)"
  140. />
  141. </el-form-item>
  142. </Motion>
  143. <Motion :delay="250">
  144. <el-form-item :rules="repeatPasswordRule" prop="repeatPassword">
  145. <el-input
  146. v-model="ruleForm.repeatPassword"
  147. clearable
  148. show-password
  149. :placeholder="t('login.pureSure')"
  150. :prefix-icon="useRenderIcon(Lock)"
  151. />
  152. </el-form-item>
  153. </Motion>
  154. <Motion :delay="300">
  155. <el-form-item>
  156. <el-checkbox v-model="checked">
  157. {{ t("login.pureReadAccept") }}
  158. </el-checkbox>
  159. <el-button link type="primary">
  160. {{ t("login.purePrivacyPolicy") }}
  161. </el-button>
  162. </el-form-item>
  163. </Motion>
  164. <Motion :delay="350">
  165. <el-form-item>
  166. <el-button
  167. class="w-full"
  168. size="default"
  169. type="primary"
  170. :loading="loading"
  171. @click="onUpdate(ruleFormRef)"
  172. >
  173. {{ t("login.pureDefinite") }}
  174. </el-button>
  175. </el-form-item>
  176. </Motion>
  177. <Motion :delay="400">
  178. <el-form-item>
  179. <el-button class="w-full" size="default" @click="onBack">
  180. {{ t("login.pureBack") }}
  181. </el-button>
  182. </el-form-item>
  183. </Motion>
  184. </el-form>
  185. </template>