step1.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template>
  2. <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef">
  3. <FormItem name="mobile" class="enter-x">
  4. <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" />
  5. </FormItem>
  6. <FormItem name="sms" class="enter-x">
  7. <CountdownInput size="large" v-model:value="formData.sms" :placeholder="t('sys.login.smsCode')" :sendCodeApi="sendCodeApi" />
  8. </FormItem>
  9. <FormItem class="enter-x">
  10. <Button type="primary" size="large" block @click="handleNext" :loading="loading"> 下一步 </Button>
  11. <Button size="large" block class="mt-4" @click="handleBackLogin">
  12. {{ t('sys.login.backSignIn') }}
  13. </Button>
  14. </FormItem>
  15. </Form>
  16. </template>
  17. <script lang="ts">
  18. import { defineComponent, reactive, ref, computed, unref, toRaw } from 'vue';
  19. import { Form, Input, Button, steps } from 'ant-design-vue';
  20. import { CountdownInput } from '/@/components/CountDown';
  21. import { useI18n } from '/@/hooks/web/useI18n';
  22. import { useMessage } from '/@/hooks/web/useMessage';
  23. import { useLoginState, useFormRules, useFormValid, LoginStateEnum, SmsEnum } from '../login/useLogin';
  24. import { phoneVerify, getCaptcha } from '/@/api/sys/user';
  25. export default defineComponent({
  26. name: 'step1',
  27. components: {
  28. Button,
  29. Form,
  30. FormItem: Form.Item,
  31. Input,
  32. CountdownInput,
  33. },
  34. emits: ['nextStep'],
  35. setup(_, { emit }) {
  36. const { t } = useI18n();
  37. const { handleBackLogin } = useLoginState();
  38. const { notification } = useMessage();
  39. const formRef = ref();
  40. const { validForm } = useFormValid(formRef);
  41. const { getFormRules } = useFormRules();
  42. const loading = ref(false);
  43. const formData = reactive({
  44. mobile: '',
  45. sms: '',
  46. });
  47. /**
  48. * 下一步
  49. */
  50. async function handleNext() {
  51. const data = await validForm();
  52. if (!data) return;
  53. const resultInfo = await phoneVerify(
  54. toRaw({
  55. phone: data.mobile,
  56. smscode: data.sms,
  57. })
  58. );
  59. if (resultInfo.success) {
  60. let accountInfo = {
  61. username: resultInfo.result.username,
  62. phone: data.mobile,
  63. smscode: resultInfo.result.smscode,
  64. };
  65. emit('nextStep', accountInfo);
  66. } else {
  67. notification.error({
  68. message: t('sys.api.errorTip'),
  69. description: resultInfo.message || t('sys.api.networkExceptionMsg'),
  70. duration: 3,
  71. });
  72. }
  73. }
  74. //倒计时执行前的函数
  75. function sendCodeApi() {
  76. return getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.FORGET_PASSWORD });
  77. }
  78. return {
  79. t,
  80. formRef,
  81. formData,
  82. getFormRules,
  83. handleNext,
  84. loading,
  85. handleBackLogin,
  86. sendCodeApi,
  87. };
  88. },
  89. });
  90. </script>