RegisterForm.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <div v-if="getShow">
  3. <LoginFormTitle class="enter-x" />
  4. <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef">
  5. <FormItem name="account" class="enter-x">
  6. <Input
  7. class="fix-auto-fill"
  8. size="large"
  9. v-model:value="formData.account"
  10. :placeholder="t('sys.login.userName')"
  11. />
  12. </FormItem>
  13. <FormItem name="mobile" class="enter-x">
  14. <Input
  15. size="large"
  16. v-model:value="formData.mobile"
  17. :placeholder="t('sys.login.mobile')"
  18. class="fix-auto-fill"
  19. />
  20. </FormItem>
  21. <FormItem name="sms" class="enter-x">
  22. <CountdownInput
  23. size="large"
  24. class="fix-auto-fill"
  25. v-model:value="formData.sms"
  26. :placeholder="t('sys.login.smsCode')"
  27. />
  28. </FormItem>
  29. <FormItem name="password" class="enter-x">
  30. <StrengthMeter
  31. size="large"
  32. v-model:value="formData.password"
  33. :placeholder="t('sys.login.password')"
  34. />
  35. </FormItem>
  36. <FormItem name="confirmPassword" class="enter-x">
  37. <InputPassword
  38. size="large"
  39. visibilityToggle
  40. v-model:value="formData.confirmPassword"
  41. :placeholder="t('sys.login.confirmPassword')"
  42. />
  43. </FormItem>
  44. <FormItem class="enter-x" name="policy">
  45. <!-- No logic, you need to deal with it yourself -->
  46. <Checkbox v-model:checked="formData.policy" size="small">
  47. {{ t('sys.login.policy') }}
  48. </Checkbox>
  49. </FormItem>
  50. <Button
  51. type="primary"
  52. class="enter-x"
  53. size="large"
  54. block
  55. @click="handleRegister"
  56. :loading="loading"
  57. >
  58. {{ t('sys.login.registerButton') }}
  59. </Button>
  60. <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
  61. {{ t('sys.login.backSignIn') }}
  62. </Button>
  63. </Form>
  64. </div>
  65. </template>
  66. <script lang="ts" setup>
  67. import { reactive, ref, unref, computed } from 'vue';
  68. import LoginFormTitle from './LoginFormTitle.vue';
  69. import { Form, Input, Button, Checkbox } from 'ant-design-vue';
  70. import { StrengthMeter } from '@/components/StrengthMeter';
  71. import { CountdownInput } from '@/components/CountDown';
  72. import { useI18n } from '@/hooks/web/useI18n';
  73. import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin';
  74. const FormItem = Form.Item;
  75. const InputPassword = Input.Password;
  76. const { t } = useI18n();
  77. const { handleBackLogin, getLoginState } = useLoginState();
  78. const formRef = ref();
  79. const loading = ref(false);
  80. const formData = reactive({
  81. account: '',
  82. password: '',
  83. confirmPassword: '',
  84. mobile: '',
  85. sms: '',
  86. policy: false,
  87. });
  88. const { getFormRules } = useFormRules(formData);
  89. const { validForm } = useFormValid(formRef);
  90. const getShow = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER);
  91. async function handleRegister() {
  92. const data = await validForm();
  93. if (!data) return;
  94. console.log(data);
  95. }
  96. </script>