register.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <mx-submit-layout title="新用户注册" button-text="现在注册" :loading="loading" @submit="handleRegister">
  3. <uv-form ref="form" :model="model" :rules="rules">
  4. <mobile-code-fields/>
  5. <pwd-repeat-fields/>
  6. <name-gender-fields/>
  7. <province-field/>
  8. <type-major-fields/>
  9. </uv-form>
  10. <template #append>
  11. <agreement-view v-model="isAgree" class="my-20"/>
  12. </template>
  13. </mx-submit-layout>
  14. </template>
  15. <script setup>
  16. import {onMounted, ref} from 'vue'
  17. import mxConst from "@/common/mxConst";
  18. import {toast} from "@/uni_modules/uv-ui-tools/libs/function";
  19. import {register, sendSms} from "@/api/login";
  20. import {useUserStore} from "@/hooks/useUserStore";
  21. import {useTransfer} from "@/hooks/useTransfer";
  22. import {createRegisterModelRules} from "@/pages/login/components/hooks/defineFormModels";
  23. import {useProvideFormData} from "@/pages/login/components/hooks/useFormDataInjection";
  24. import MobileCodeFields from "@/pages/login/components/register-fields/mobile-code-fields.vue";
  25. import PwdRepeatFields from "@/pages/login/components/register-fields/pwd-repeat-fields.vue";
  26. import NameGenderFields from "@/pages/login/components/register-fields/name-gender-fields.vue";
  27. import ProvinceField from "@/pages/login/components/register-fields/province-field.vue";
  28. import TypeMajorFields from "@/pages/login/components/register-fields/type-major-fields.vue";
  29. import AgreementView from "@/pages/login/components/agreement-view.vue";
  30. import {useProvideFormRef} from "@/pages/login/components/hooks/useFormRefInjection";
  31. import {useProvideSendSmsFn} from "@/pages/login/components/hooks/useSmsInjection";
  32. import {useProvideProvince} from "@/pages/login/components/hooks/useProvinceInjection";
  33. import {getLocationsList} from "@/api/webApi/resources";
  34. const loading = ref(false)
  35. const isAgree = ref(false)
  36. const {SyncToken} = useUserStore()
  37. const {transferTo} = useTransfer()
  38. // form related.
  39. const [m, r, modelToCommit] = createRegisterModelRules()
  40. const [model, rules] = useProvideFormData(m, r)
  41. const form = ref(null)
  42. useProvideFormRef(form)
  43. // service related.
  44. useProvideSendSmsFn((args) => handleSendSms(args))
  45. const provinceOptions = ref([])
  46. useProvideProvince(provinceOptions)
  47. // hooks
  48. onMounted(async () => {
  49. // 获取系统支持的省份(无限制)
  50. const res = await getLocationsList({level: 1})
  51. provinceOptions.value = res.data.map(p => p.sname) || []
  52. })
  53. // functions
  54. const handleSendSms = (events) => {
  55. return sendSms({mobile: model.value.mobile, smsType: 1, ...events})
  56. }
  57. const handleRegister = async () => {
  58. await form.value.validate()
  59. if (!isAgree.value) return toast('请先勾选同意条款')
  60. if (loading.value) return
  61. loading.value = false
  62. try {
  63. const commit = modelToCommit()
  64. const res = await register(commit)
  65. toast('注册成功')
  66. await SyncToken(res.token)
  67. transferTo(mxConst.routes.bindProfile)
  68. } finally {
  69. loading.value = false
  70. }
  71. }
  72. </script>
  73. <style lang="scss">
  74. </style>