Register.vue 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <script setup lang="ts">
  2. import {reactive, ref} from 'vue'
  3. import {debounce} from "@/utils/common.ts";
  4. import {register, sendCode} from "@/api/user.ts";
  5. import {AuthCodeType} from "@/enums/verification.ts";
  6. import {ElMessage, type FormInstance} from "element-plus";
  7. import {LoginType, userStore} from "@/stores/user.ts";
  8. import AccountFormItem from "@/components/common/login/component/AccountFormItem.vue";
  9. import CodeFormItem from "@/components/common/login/component/CodeFormItem.vue";
  10. import PasswordFormItem from "@/components/common/login/component/PasswordFormItem.vue";
  11. import SubmitFormBtn from "@/components/common/login/component/SubmitFormBtn.vue";
  12. const form = reactive({
  13. phone: '',
  14. code: '',
  15. password: '',
  16. confirmPassword: ''
  17. });
  18. const user = userStore();
  19. const ruleFormRef = ref<FormInstance>();
  20. const debouncedSendAuthCode = debounce(sendAuthCode, 500);
  21. async function sendAuthCode(sendAuthCodeCallBack: () => void) {
  22. if (!ruleFormRef.value?.validateField) return;
  23. await ruleFormRef.value.validateField('phone', async (valid) => {
  24. if (valid) {
  25. const {phone} = form;
  26. await sendCode({phone, type: AuthCodeType.REGISTER});
  27. if (sendAuthCodeCallBack) {
  28. sendAuthCodeCallBack()
  29. }
  30. } else {
  31. ElMessage.error('请输入正确的手机号码');
  32. }
  33. });
  34. }
  35. const debouncedSubmitForm = debounce(submitForm, 500);
  36. function submitForm(formEl: FormInstance | undefined, callBack: () => void) {
  37. if (!formEl) return;
  38. formEl.validate(async (valid, fields) => {
  39. if (valid) {
  40. try {
  41. const {phone, password, code} = form;
  42. await register({phone, password, code})
  43. ElMessage.success('注册成功')
  44. user.loginType = LoginType.ACCOUNT_LOGIN;
  45. } catch (e) {
  46. console.log(e);
  47. }
  48. callBack && callBack()
  49. } else {
  50. callBack && callBack()
  51. // ElMessage.error('注册失败,请稍后重试')
  52. console.log('error submit!', fields);
  53. }
  54. });
  55. }
  56. </script>
  57. <template>
  58. <div class="bf-login-dialog-box">
  59. <h1 class="title">注册</h1>
  60. <div class="bf-login-form">
  61. <el-form :model="form" ref="ruleFormRef">
  62. <AccountFormItem prop-name="phone" v-model:phone="form.phone"/>
  63. <CodeFormItem v-model:code="form.code" @sendAuthCode="debouncedSendAuthCode"/>
  64. <PasswordFormItem prop-name="password" v-model:password="form.password"></PasswordFormItem>
  65. <PasswordFormItem prop-name="confirmPassword" v-model:password="form.confirmPassword" v-model:confirm-password="form.password" placeholder="请确认登陆密码"></PasswordFormItem>
  66. <SubmitFormBtn @submit-click="debouncedSubmitForm(ruleFormRef, $event)">立即注册</SubmitFormBtn>
  67. </el-form>
  68. <div class="bf-register-account">
  69. <span>已有账户?</span>
  70. <a @click="user.loginType = LoginType.ACCOUNT_LOGIN">立即登录</a>
  71. </div>
  72. </div>
  73. </div>
  74. </template>
  75. <style scoped lang="scss">
  76. .bf-register-account {
  77. margin-top: -30px;
  78. a {
  79. color: #409EFF;
  80. }
  81. }
  82. </style>